プログラム基礎 ~条件分岐について(C#)~

プログラム基礎

条件分岐についての重要な点は以下になります。

  • 関係演算子を使うと条件を作成できる
  • if 文を使って条件に応じた処理を行うことができる
  • if文、else文、else if文を使って、いろいろな条件に対応できる
  • switch 文を使って、複数の値に応じた処理ができる
  • 論理演算子を使って複雑な条件を作成できる
  • 条件演算子「? :」を使って簡単な条件を簡素で見やすくできる

入力された値や、式の評価値が一定条件を満たしている場合は、A の処理、そうではない場合は
B の処理というように条件に応じて処理を分けることを条件分岐と言います。

ここでは、条件分岐の基本と処理の流れについて解説していきます。

条件とは

C#では、条件は式として扱われ評価されます。

評価値は、条件を満たす場合に「true(真)」、満たさない場合は「false(偽)」となります。

例として、りゅうぐうスーパーで卵が特売だったら購入、特売でなかったら購入せずに帰宅するとしましょう。

この場合条件に応じての評価は以下の2点になります。

  • 卵が特売の場合(true) ⇒ 卵を購入
  • 卵が特売ではない場合(false) ⇒ 購入せずに帰宅

上記をプログラムっぽく書いてみるとこんな感じです。


if(卵が特売)
{
  卵を購入; //true(真)の場合の処理
}
else
{
  購入せずに帰宅; //false(偽)の場合の処理
}

関係演算子とは

条件を記述する際に、関係演算子を利用します。

関係演算子を利用することにより、左辺と右辺の値を比較することができます。

主な関係演算子

演算子意味使用例
==    左辺と右辺は等しいa == b
!=左辺と右辺は等しくないa != b
>左辺は右辺より大きいa > b
>=左辺は右辺より大きい、または等しい (以上)    a >= b
<左辺は右辺より小さいa < b
<=左辺は右辺より小さい、または等しい (以下)a <= b

関係演算子を使用した条件は評価値(条件を満たすかどうか)として「true」または「false」を返します。

bool 型の変数に、関係演算子の演算結果を代入することもできます。

例)
bool val1 = 10 < 11;    //val1に「true」が代入される。
bool val2 = 11 < 10;    //val2に「false」が代入される。

「左辺と右辺が等しいか」を判定する演算子は、数学の世界では「=」が使用されますが、C#では「==」が使用されます。

「=」は代入演算子として機能しますので、間違えないように注意しましょう。

if文

if 文とは、「もし○○だったら、▲▲する」というように、条件を満たした場合に処理を実行する文です。

C#では、条件の評価結果に応じて処理を実行させる文を条件判断文と言います。略して条件文ってよぶところもありますね。

if(条件) 
{
  処理1;
}

if 文は、「 () 」内の条件が true の場合のみ、「 {} 」で囲まれたブロック内の処理を実行します。

条件を満たさない場合は、ブロック内の処理は実行されず、「 } 」の次の処理から実行されます。

これを簡単なフローチャートで表現すると以下のようになります。

if文の記述例は以下になります。

if文記述例1

int num1 = 10;
int num2 = 11;
if(num1 < num2)
{
  Console.WriteLine("num1 は num2 より小さい");
}
Console.WriteLine("処理終了");

■出力内容
num1 は num2 より小さい
処理終了

これのnum1をnum2より大きい値にして、実行してみると以下のようになります。

if文記述例2

int num1 = 100;   //値を10⇒100に変更
int num2 = 11;
if(num1 < num2)  //この条件判断文ではfalseになるので「{}」処理は行われない
{
  Console.WriteLine("num1 は num2 より小さい");
}
Console.WriteLine("処理終了");

■出力内容
処理終了

記述例1のフローチャートにしてみると以下になります。

if文の注意点

if 文を記述する際は変数のスコープに注意しよう。

if文の「 {} 」で囲まれたブロック内で宣言した変数は、ブロック内の処理が終了すると利用できなくなります。

変数が利用可能な範囲(有効範囲)のことを「スコープ(scope)」と言います。

スコープを意識せずにソースコードを作成すると、想定外の結果となる場合があります。

記述例は以下のコードになります。

変数 str2 は if 文のブロック内で宣言されているため、str2 のスコープは if 文のブロック内のみです。

str2 を if 文のブロック外(スコープ外)で使用しようとすると、エラーになってしまいます。

もし、str2 も if 文のブロック外で使用したいという場合は、変数 str1 と同じように、ブロックの外側で宣言するようにしてください。

エラーを修正したコードが以下になります。

if文のネスト

if 文の中にさらに if 文を記述することもできます。

このように、処理を入れ子の形にすることを「ネスト」と言います。

if(条件1)
{
  if(条件2)
  {
    処理;
  }
}

外側の if 文の条件(条件 1)が「true」の場合、外側のブロックの処理が実行され、内側の if 文の条件(条件 2)の判定が行われます。

そして、条件 2 も「true」だった場合、内側のブロックの処理が実行されます。

つまり、上記構文内「処理」は、条件 1 と条件 2 の両方の条件を満たしている場合に実行されます。

実際のコードは以下になります。


Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();  //ここでは入出力で学んだ入力と型変換も使います。
int num = int.Parse(input);

if (num > 5)
{
  Console.WriteLine($"{num}は4より大きい数字です。");
  
  if (num <= 10)
  {
    Console.WriteLine($"{num}は5より大きく10以下の数字です。");
  }
}

Console.WriteLine("処理終了");

文字を6~10の範囲で入力すると、出力結果は以下のようになります。

整数を入力してください。
6↲ 
6は5より大きい数字です。
6は5より大きく10以下の数字です。
処理終了

1を入力すると以下のようになります。

整数を入力してください。
2 ↲ 
処理終了

11を入力すると以下のようになります。

整数を入力してください。
11 ↲ 
11は5より大きい数字です。
処理終了

※最後に注意点として、ネスト深くなれば深くなるほどコードが複雑化してわかりにくいコードになっていきます。

if, else文

条件を満たす場合と条件を満たさない場合にそれぞれ別の処理を実行したい場合は、「if, else 文」を利用します。

if(条件)
{
  処理1;  //条件を満たす場合(true)
}
else
{
  処理2;  //条件を満たさない場合(false)
}

if, else 文では、条件を満たす場合は、if 文以下のブロックの処理を実行します。

また、条件を満たさない場合は、else以下の「 { } 」ブロック内の処理を実行します。

if, else 文をフローチャートで表現すると、以下になります。

実際のコードは以下になります。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

if (num <= 5)
{

  Console.WriteLine($"{num}は5以下の数字です。");
}
else
{
  Console.WriteLine($"{num}は5より大きい数字です。");
}

5以下の値を入力した場合の出力内容です。

整数を入力してください。
4 ↲ 
4は5以下の数字です。

5より上の値を入力した場合の出力内容です。

整数を入力してください。
10 ↲ 
10は5より大きい数字です。

if, else if, else文

複数の条件ごとに異なる処理を実行させたい場合は「if, else if, else 文」を使用します。

if, else if, else文を使うことで、3 つ以上の処理に分岐させることができます。

if(条件 1)
{
  処理 1;
}
else if(条件 2)
{
  処理 2;
}
else
{
  処理 3;
}

if 文と同様に、各ブロック内には複数行の処理を記述できます。

また、else if 文のブロックは続けて複数記述できるため、条件を 3 種類以上に増やすことも可能です。

だんだんとややこしくなってきましたね・・・

if, else if, else文をフローチャートで表現すると、以下になります。

実際のコードは以下になります。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

if (num == 1)
{
  Console.WriteLine("1が入力されました。");
}
else if (num == 2)
{
  Console.WriteLine("2が入力されました。");
}
else
{
  Console.WriteLine("1と2以外の数字が入力されました。");
}

1, 2, 1と2以外が入力された場合の出力内容です。

・1が入力された場合
整数を入力してください。
1 ↲ 
1が入力されました。

・2が入力された場合
整数を入力してください。
2 ↲ 
2が入力されました。

・1と2以外が入力された場合整数を入力してください。
3 ↲ 
1と2以外の数字が入力されました。

switch文

switch文は、if 文と同じく条件分岐の構文です。

switch文を使うことで、式の評価値に応じた個別の処理を実行できます。

switch 文を使って、if 文よりもシンプルに複数の分岐を記載することができるので、行いたい分岐処理によって使い分けるとよいでしょう。

switch (式) {    //式を記述、式には変数名を記述
  case 値 1:    //case 文で、値を指定
    処理 1;      //式の値とcase文に指定した値が一致していた場合に実行する処理
    break;
  case 値 2: 
    処理 2;
    break;
  default: 
    処理 3;
    break;
}

予約語「switch」の右側にある「()」内に式を記述して、続けて「{}」でブロックを記述します。

そして、ブロック内に「case 値:(case 文)」を記述します。

case 文は複数記述でき、それら 1 つずつが 1 つの条件として機能します。

各処理の最後には「break;(break 文)」と記述しておきましょう。

最後に「default:(default 文)」を記述します。

default 文は if…else if…else 文で言う「else 文」にあたる処理です。

if文とswitch文で比較するとwsitch分の流れがわかりやすいと思うので、以下に同じ出力結果がでるコードを記述します。

switch (曜日) {
  case 月:
    ランニング;
    break;
  case 火: 
    筋トレ;
    break;
  default: 
    休憩;
    break;
}
if(曜日 == 月)
{
  ランニング;
}
else if(曜日 == 火)
{
  筋トレ;
}
else
{
  休憩;
}

最後に実際のコードを確認していきましょう。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

switch (num) {
  case 1:
    Console.WriteLine("1が入力されました。");
    break;
  case 2: 
    Console.WriteLine("2が入力されました。");
    break;
  default: 
    休憩;
    break;
}

出力内容は「if, else if, else文」見出しのサンプルコードを同じです。

論理演算子

より複雑な条件を利用したい場合には「論理演算子」を使います。

そして、これまでに説明した条件を複数組み合わせて、より複雑な条件にすることができます。

演算子日本読み意味
&&かつ (論理積)左辺と右辺の条件がどちらも true の場
合、全体の評価は true
a >= 5 && a < 10
||または (論理和)左辺と右辺の条件のいずれかが true の場
合、全体の評価は true
a == 5 || a == 10
!でない (論理否定)条件が false の場合、全体の評価は true!(a == 5)

各論理演算子のイメージ図です。学校で見たことあるような図ですね・・・

実際のコードは以下になります。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

if (num < 5 && num <= 10)
{
  Console.WriteLine($"{num}は5より大きく10以下の数字です。");
}
else if (num <= 5)
{
  Console.WriteLine($"{num}は5以下の数字です。");
}
else
{
  Console.WriteLine($"{num}は10より大きい数字です。");
}

各条件に満たす値を入力された場合の出力内容です。

・6が入力された場合
整数を入力してください。
6 ↲ 
6は5より大きく10以下の数字です。

・5が入力された場合
整数を入力してください。
5 ↲ 
5は5以下の数字です。

・10より上の値が入力された場合整数を入力してください。
整数を入力してください。
11 ↲ 
11は10より大きい数字です。

条件演算子

「ある値と等しい場合に特定の値を、等しくない場合には別の値を変数に代入する」

といった簡単な条件分岐の場合は、以下のように条件演算子「?:」を使用して簡素に記述できます。

条件 ? trueの場合の式 : falseの場合の式 

つまりif,else文を簡素に書けるってことです。

実際のコードは以下になります。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

string str = (num == 5) "A" : "B";

Console.WriteLine(str);

これをif,else文に置き換えると以下になります。

Console.WriteLine("整数を入力してください。");

string input = Console.ReadLine();
int num = int.Parse(input);

string str = "";

if(num == 5)
{
  str = "A";
}
else
{
  str = "B";
}

Console.WriteLine(str);

コメント

タイトルとURLをコピーしました