if文の使い方その4
今回のC#プログラミング学習も、前回の続きで、分岐処理のif文を学んでいきます。
プログラム例
まずは今回学んでいくC#プログラム例を見てみましょう。
using System; namespace Sample { internal class Program { static void Main(string[] args) { Console.Write("1から6のサイコロの目を入力:"); int nDice = int.Parse( Console.ReadLine() ); // 入力された値の範囲を調べる if (nDice >= 1 && nDice <= 6) { if (nDice == 2 || nDice == 4 || nDice == 6) { Console.Write("偶数の目です"); } else { Console.Write("奇数の目です"); } } else // 1から6以外 { Console.Write("範囲外の値です"); } Console.ReadLine(); } } }
ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。
ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。
ビルドが成功したら、F5キーを押してプログラムを動かします。
今回はサイコロを振るというシチュエーションなので、1から6までの数値の入力を促されます。
まずは「3」を入力しEnterキーを押します。
すると「奇数の目です」と表示されるので、Enterキーを押すとプログラムが終了します。
今回は分岐処理なので、もう一度F5キーを押してプログラムを立ち上げます。
ちなみにこの時点で、何も入力しないでEnterキーを押した場合は、例外処理が発生してしまうので、必ず何らかの数値を入力します。
今度は「6」を入力してEnterキーを押します。
すると、今度は「偶数の目です」と表示されるので、Enterキーを押すとプログラムが終了します。
さらにもう一度F5キーを押してプログラムを立ち上げます。
最後は「7」を入力してEnterキーを押します。
すると、「範囲外の値です」と表示されるので、Enterキーを押してプログラムを終了させます。
プログラム解説
上記のプログラム例について解説していきます。
数値の入力
今回は、サイコロを振るというシチュエーションでプログラムを作っているので、ユーザーは、1から6までの数値の入力を促されます。
Console.Write("1から6のサイコロの目を入力:"); int nDice = int.Parse( Console.ReadLine() );
ユーザーからの入力は「Console.ReadLine」で行います。
さらに今回は、入力された文字を数値として扱っていきたいので、「int.Parse」のカッコに入れて使っています。
「int.Parse( Console.ReadLine() )」とすることで、int型の変数で数値を受け取ることができます。
入力値の判断
次に、入力された値をif文で判断し、その後の処理を分けます。
プログラム例では以下の部分です。
if (nDice >= 1 && nDice <= 6) { if (nDice == 2 || nDice == 4 || nDice == 6) { Console.Write("偶数の目です"); } else { Console.Write("奇数の目です"); } } else { Console.Write("範囲外の値です"); } Console.ReadLine();
今回は、if文が少し複雑なので、二つに分けて考えていきます。
外側のif文
まずは、外側部分は以下のような感じになっています。
if (nDice >= 1 && nDice <= 6) { …条件式が成立していたら実行される部分… } else { Console.Write("範囲外の値です"); }
このif文の構造なら、前々回やりましたね。
最初のif文の条件式が成立していたら、そこに続く「{」から「}」に囲まれている範囲の部分が実行されます。
そうでなければ、elseに続く「{」から「}」に囲まれた部分が実行されます。
そして問題の条件式ですが、「nDice >= 1 && nDice <= 6」となっています。
今回はif文も複雑ですが、条件式も複雑になっていますので、これも分けて考えます。
条件式をどのように分けて考えるのかというと、「nDice >= 1」、「&&」、「nDice <= 6」この三つに分けて考えます。
まず、一番左の「nDice >= 1」ですが、これは変数「nDice」が「1以上ならば成立」という意味です。
前回のように「>」だけなら「1より大きければ成立」という意味ですが、今回は「=」が付いているので「1以上ならば成立」という意味になります。
次に、一番右の「nDice <= 6」ですが、これも考え方は同じなので、変数「nDice」が「6以下ならば成立」という意味です。
そして最後に「&&」ですが、これは左の条件式と右の条件式が両法成立しているときに、if文全体の条件式が成立しているとみなすという意味があります。
このことから、「&&」のことを、AND演算子といいます。
if文全体の条件式としては、変数「nDice」が1以上6以下ならば成立という意味になります。
なので、変数「nDice」が、0や7だった場合には、else以降の「Console.Write("範囲外の値です")」が実行されます。
内側のif文
次は、内側のif文を見ていきましょう。
if (nDice == 2 || nDice == 4 || nDice == 6) { Console.Write("偶数の目です"); } else { Console.Write("奇数の目です"); }
これもif文の構造自体は、前々回やりましたね。
なので、if文が成立していたら、「Console.Write("偶数の目です")」が実行され、if文が成立しなかった場合は、「Console.Write("奇数の目です")」が実行されます。
このことから、条件式「nDice == 2 || nDice == 4 || nDice == 6」は、変数「nDice」が偶数であるときに成立する条件式であることがわかります。
考え方としては、先ほどの「&&」のように、「||」で条件式を分割します。
先ほどの「&&」が、左右の条件式の両方が成立したときに、if文全体が成立するとみなすことに対し…。
「||」は、左右のどちらか片方でも成立していれば、if文全体が成立するとみなすという意味があります。
このことから、「||」をOR演算子といいます。
そして、「==」はif文の最初に学習したように、「==」の左辺と右辺が等しいときに成立する演算子です。
なので、変数「nDice」が、2か4か6のときに成立するif文であることがわかります。
if文全体の構造
それでは、今回の条件分岐全体をまとめていきましょう。
まず、外側のif文で、変数「nDice」の数値を1から6までに絞ります。
それ以外の数値であれば、範囲外であることを表示して終了。
外側のif文が成立したときのみ、内側のif文に進みます。
内側のif文では、変数「nDice」が、2か4か6であれば、偶数であると表示して終了します。
それ以外のときは、奇数であることを表示して終了します。
まとめ
今回のように、if文の中にif文があるものを、if文のネストなどといいます。