講義メモ ・p.100「練習問題」から再開し、5章「制御文」に進みます。 提出フォロー:ミニ演習 mini098.cs ・double型の変数a、cと、int型の変数bがあるとき、下記の実行後の値に差が出るか確認しよう ① a = b = c = 3.14; ② a = c = b = 3.14; ※ 必要に応じてキャストを行うこと 作成例 //ミニ演習 mini098.cs using System; class mini088a { public static void Main() { double a, c; int b; a = b = (int)(c = 3.14); //①「a = b = c = 3.14」だとエラーなのでキャストする Console.WriteLine("a:{0} b:{1} c:{2} : ", a, b, c); //3、3、3.14となる a = c = b = (int)3.14; //②「a = c = b = 3.14」だとエラーなのでキャストする Console.WriteLine("a:{0} b:{1} c:{2} : ", a, b, c); //3、3、3となってしまう } } p.100 練習問題 ヒント ・10進数cat = 1, rat = 2, dog = 4は2進数にすると001,010,100 ・int pet = cat | dog;は、001と100の論理和なので 101になる(10進数5) ・あるビットが1かどうかは、そのビットのみが1である値との論理積で分かり、0でなければ該当する ・よって、  ① 変数petとcatの論理積が0でなければcatがいる  ② 変数petとratの論理積が0でなければratがいる  ③ 変数petとdogの論理積が0でなければdogがいる 作成例 //p.100 練習問題 ex04.cs using System; class ex04 { public static void Main() { int cat = 1, rat = 2, dog = 4; //猫、鼠、犬を表すビット列001,010,100 int pet = cat | dog; //猫と犬を表すビット列101(10進数5)を生成 Console.WriteLine("猫:{0}", (pet & cat) == cat); //true Console.WriteLine("鼠:{0}", (pet & rat) == rat); //false Console.WriteLine("犬:{0}", (pet & dog) == dog); //true } } 第5章 制御文 p.102 if文 ・条件演算子の構造を複数の文で柔軟に見やすく表現できる構文 ・基本的構文  if (bool型を返す式) {   式がtrueである場合のみ実行すること  } ・例:  if (a == 0) {   Console.WriteLine("ゼロだ"); //変数aが0であれば「ゼロだ」と表示  } ・bool型を返す式を条件式ともいい、これがtrueかfalseかによって実行可否が決まる ・条件演算子の3項目にある「falseの場合の式(=でなければ)」をif文で扱う構文がif-else構文 ・基本的構文  if (bool型を返す式) {   式がtrueである場合のみ実行すること  } else {   式がfalseである場合のみ実行すること  } ・よって、1つのifに対してelseを1つだけ記述できる ・例:  if (a % 2 == 0) {   Console.WriteLine("偶数"); //変数aが2で割り切れたら「偶数」と表示  } else {   Console.WriteLine("奇数"); //でなければ「奇数」と表示  } ・ifの条件に続く{…}をifブロック、elseに続く{…}をelseブロックという ・よって、ifブロックの内容と、elseブロックの内容はどちらかのみが実行される ・なお、ブロックの開始を示す「{」の位置については複数のルールがあり、チームルールを定めることがある ・ブロックの内容が1文の場合、{}は省略できる ・例: if (a == 0) Console.WriteLine("ゼロだ"); //変数aが0であれば「ゼロだ」と表示  ※ チームルールによっては推奨されないことがある ・例: if (a == 0) Console.WriteLine("ゼロだ"); a = 100; //最後の代入はifとは無関係なのに誤読しやすい p.103 if文:else if ・ifとelseの間に「ではなくて、もしも~なら」を意味する追加の条件文をelse if(…)で複数記述できる ・これにより多分岐構造を表現できる ・例:  if (a <= 0) { //0または負の数   Console.WriteLine("範囲外"); //変数aが0以下なら「範囲外」と表示  } else if (a % 2 == 0) { //ではなくて2の剰余が0   Console.WriteLine("偶数"); //変数aが0超で2で割り切れたら「偶数」と表示  } else { //どちらでもなければ   Console.WriteLine("奇数"); //変数aが0超で2で割り切れなければ「奇数」と表示  } ・なお、else if(…)の後にelseがなくてもOK ・また、elseの後にはelse ifを記述できない アレンジ演習:p.104 if01.cs ・nの値を10固定ではなく、コンソールから入力するようにしよう ・「nは5より大きくはない」を分割して「nは5より小さい」と「nは5と等しい」のどちらかを表示するようにしよう 作成例 // if01.cs using System; class if01 { public static void Main() { int n; Console.Write("整数値:"); n = int.Parse(Console.ReadLine()); if (n > 5) { //nは5超? Console.WriteLine("nは5より大きい"); } else if (n == 5) { //ではなくて5と等しい? Console.WriteLine("nは5と等しい"); } else { //どちらでもない?(nは5未満) Console.WriteLine("nは5より小さい"); } } } p.105 if02.cs に関して補足 ・「int nShojikin = Int32.Parse(stShojikin);」はintかInt32かに統一すると良い  ⇒「Int32 nShojikin = Int32.Parse(stShojikin);」  ⇒「int Shojikin = int.Parse(stShojikin);」  ※ 業務上、統一が義務化される場合もある アレンジ演習:p.105 if02.cs ・Parseの前後の型を「int」または「Int32」に統一しよう(どちらでもOK) 作成例 //アレンジ演習:p.105 if02.cs using System; class if02 { public static void Main() { Console.Write("所持金はいくらですか---"); string stShojikin = Console.ReadLine(); int nShojikin = int.Parse(stShojikin); //【変更】 Console.Write("単価はいくらですか---"); string stTanka = Console.ReadLine(); int nTanka = int.Parse(stTanka); //【変更】 Console.Write("何個買いますか---"); string stKosu = Console.ReadLine(); int nKosu = int.Parse(stKosu); //【変更】 int nSogaku = nTanka * nKosu; if (nShojikin < nSogaku) { Console.WriteLine("所持金が足りません"); } else { int nOtsuri = nShojikin - nSogaku; Console.WriteLine("所持金は" + nOtsuri + "円残っています"); } } } p.106 bmi01.cs に関して補足 ・Math.Pow()メソッドはp.49参照 ・Console.ForegroundColor は、Consoleクラスのプロパティ(p.207で後述)で、コンソールの文字色を指す。 ・ConsoleColor.Red は、C#が提供するConsoleColor列挙型(p.66)の列挙子の一つ。整数0~15で示される16色が用意されている ・なお「文字色を黒に戻す」とあるが、コンソールの文字色の既定値はBlackではなくGrayなので、Grayに戻すと良い ・最後のif文のelseの{}が略されているが、ifブロックの{}があるので、この省略は推奨されないことがある ・文字列の実数型への変換に「Convert.ToDouble」を用いているが、これは.NET型の表記なので左辺もSystem.Double型に統一するか、double.Parseにすると良い。 アレンジ演習:p.106 bmi01.cs ・「BMIは25未満です」を「BMIは20~25なので標準的です」に書き換えよう ・そして、BMIが20未満であれば「BMIが20未満です!!」と水色(Cyan)で表示しよう 作成例 //アレンジ演習:p.106 bmi01.cs using System; class bmi01 { public static void Main() { Console.Write("身長(cm)---"); string stBl = Console.ReadLine(); double bl = Convert.ToDouble(stBl); //文字列からdouble型の変換 Console.Write("体重(kg)---"); string stBw = Console.ReadLine(); double bw = Convert.ToDouble(stBw); //文字列からdouble型の変換 double bmi = bw / Math.Pow((bl / 100.0), 2.0); //体重÷身長(m)の2乗 Console.WriteLine("BMI = {0:##.#}", bmi); //BMIを小数点以下1桁まで表示 if (bmi >= 25.0) { Console.ForegroundColor = ConsoleColor.Red; //文字色を赤に Console.WriteLine("BMIが25以上です!!"); Console.ForegroundColor = ConsoleColor.Gray; //【変更】灰色 } else if (bmi < 20.0) { //【以下追加】 Console.ForegroundColor = ConsoleColor.Cyan; //文字色を水色に Console.WriteLine("BMIが20未満です!!"); Console.ForegroundColor = ConsoleColor.Gray; //灰色 } else { Console.WriteLine("BMIは20~25なので標準的です"); //【変更】 } } } p.107 bmi02.cs に関して補足 ・各「else if」において直前の条件文の該当部分を取り除く表現をしているが、まったく無意味 ・「else」には「ではなくて」の意味があるので不用 ・無駄な条件文を記述すると、保守性が低い(変更や改良の効率が悪い)プログラムになってしまう ・なお、最後に文字色を白に戻しているが、コンソールの文字色の既定値はBlackではなくGrayなので、Grayに戻すと良い ・文字列の実数型への変換に「Double.Parse」を用いているが、これは.NET型の表記なので左辺もSystem.Double型に統一するか、double.Parseにすると良い。 アレンジ演習:p.107 bmi02.cs ・各「else if」にある直前の条件文の該当部分を取り除く表現を削除しよう ・最後に文字色をGrayに戻そう ・文字列の実数型への変換にはdouble.Parseを用いよう 作成例 //アレンジ演習:p.107 bmi02.cs using System; class bmi02 { public static void Main() { string strShow = "BMIは{0:##.#}で{1}です"; //書式指定文字列の事前定義 Console.Write("身長(cm)---"); string strBl = Console.ReadLine(); double bl = double.Parse(strBl); //【変更】 Console.Write("体重(kg)---"); string strBw = Console.ReadLine(); double bw = double.Parse(strBw); //【変更】 double bmi = bw / Math.Pow((bl / 100.0), 2.0); if (bmi < 18.5) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(strShow, bmi, "やせすぎ"); } else if (bmi < 25.0) { //【変更】「bmi >= 18.5 && 」は不用 Console.WriteLine(strShow, bmi, "適正体重"); } else if (bmi < 30.0) { //【変更】「bmi >= 25.0 && 」は不用 Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine(strShow, bmi, "第1度肥満"); } else if (bmi < 35.0) { //【変更】「bmi >= 30.0 && 」は不用 Console.ForegroundColor = ConsoleColor.DarkYellow; Console.WriteLine(strShow, bmi, "第2度肥満"); } else if (bmi < 40.0) { //【変更】「bmi >= 35.0 && 」は不用 Console.ForegroundColor = ConsoleColor.Magenta; Console.WriteLine(strShow, bmi, "第3度肥満"); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(strShow, bmi, "第4度肥満"); } Console.ForegroundColor = ConsoleColor.Gray; //【変更】 } } p.109 switch文 ・if-else if-else構文のような多分岐構造の専用の構文で、各種の言語に実装されている ・ただし、C#のswitch文は文法ルールがC/C++等とは異なるの注意 ・書式:  switch (整数またはstring型の式) {  case 整数値か文字列① : ①と等しい場合の処理; …; break;  case 整数値か文字列② : ②と等しい場合の処理; …; break;  :  default : 上記のどれでもない場合の処理; …; break; //省略可  } ・整数またはstring型のみが可能で、実数は指定できない ・なお、char型は内部的に整数の文字コードになるので、指定可能 ・C/C++等では「default :」の「break;」は記述してもしなくても良いが、C#では必須。 ・また、C/C++等では「case ●:」の「break;」を記述しないことで特殊な動作をさせるフォールスルー(p.110)が可能だが、C#では不可。 ・「case ●:」の「整数値か文字列」は、定数または定数式(定数を返す式)である必要があり、変数や変数を含む式は記述できない p.111 switch01.cs に関して補足 ・文字列のint型への変換に「Int32.Parse」を用いているが、これは.NET型の表記なので左辺もSystem.Int32型に統一するか、int.Parseにすると良い。 アレンジ演習:p.111 switch01.cs ・Menuに「4:印刷」を追加し、switch文に反映しよう ・int型への変換はint.Parseにしよう 作成例 //アレンジ演習:p.111 switch01.cs using System; class switch01 { public static void Main() { Console.WriteLine("******* Menu *******"); Console.WriteLine("1:ファイル"); Console.WriteLine("2:編集"); Console.WriteLine("3:表示"); Console.WriteLine("4:印刷"); //【追加】 Console.WriteLine("0:終了"); Console.WriteLine("********************"); Console.Write("\n選択---"); string strAns = Console.ReadLine(); int ans = int.Parse(strAns); //【変更】 switch (ans) { case 1: Console.WriteLine("ファイルが選択されました"); break; case 2: Console.WriteLine("編集が選択されました"); break; case 3: Console.WriteLine("表示が選択されました"); break; case 4: //【追加】 Console.WriteLine("印刷が選択されました"); //【追加】 break; //【追加】 case 0: Console.WriteLine("終了が選択されました"); break; default: Console.WriteLine("入力ミスです"); break; } } } アレンジ演習:p.113 switch02.cs ・if-else if-else構造で書き換えよう 作成例 //アレンジ演習:p.113 switch02.cs using System; class switch02 { public static void Main() { Console.WriteLine("******* Menu *******"); Console.WriteLine("1:ファイル"); Console.WriteLine("2:編集"); Console.WriteLine("3:表示"); Console.WriteLine("0:終了"); Console.WriteLine("********************"); Console.Write("\n選択---"); string strAns = Console.ReadLine(); if (strAns == "1") { //【変更】 Console.WriteLine("ファイルが選択されました"); } else if (strAns == "2") { //【変更】 Console.WriteLine("編集が選択されました"); } else if (strAns == "3") { //【変更】 Console.WriteLine("表示が選択されました"); } else if (strAns == "0") { //【変更】 Console.WriteLine("終了が選択されました"); } else { //【変更】 Console.WriteLine("入力ミスです"); } } } 補足:caseの多重化 ・C#では「case ●:」の後に処理を記述した場合は「break;」が必須だが、「case ●:」のみを記述して分岐先をしてできる ・このことを利用して「または」構造を表現できる ・例:  switch (str) {  case "Y" : //strが"Y"であればここに分岐してそのまま次の「case "y"」に進む  case "y" : Console.WriteLine("はい"); break;  case "N" : //strが"N"であればここに分岐してそのまま次の「case "x"」に進む  case "n" : //strが"n"であればここに分岐してそのまま次の「case "x"」に進む  case "X" : //strが"X"であればここに分岐してそのまま次の「case "x"」に進む  case "x" : Console.WriteLine("いいえ"); break;  } アレンジ演習:p.113 switch02.cs つづき ・元のswitch文にもどしてから、"0"の代わりに、"Q"でも"q"でも"終了が選択されました"と表示するようにしよう 作成例 //アレンジ演習:p.113 switch02.cs つづき using System; class switch02 { public static void Main() { Console.WriteLine("******* Menu *******"); Console.WriteLine("1:ファイル"); Console.WriteLine("2:編集"); Console.WriteLine("3:表示"); Console.WriteLine("0:終了(Q/qでも可)"); //【変更】 Console.WriteLine("********************"); Console.Write("\n選択---"); string strAns = Console.ReadLine(); switch (strAns) { case "1": Console.WriteLine("ファイルが選択されました"); break; case "2": Console.WriteLine("編集が選択されました"); break; case "3": Console.WriteLine("表示が選択されました"); break; case "0": case "Q": //【追加】 case "q": //【追加】 Console.WriteLine("終了が選択されました"); break; default: Console.WriteLine("入力ミスです"); break; } } } p.115 for文 ・C#の繰返し構文は4種類あり、それぞれ特性があり、繰返しの内容に応じて使い分けると良い ・for文は「回数指定の繰返し」に向く構文 ・書式: for (①初期化子; ②条件式; ③反復子) { 繰返し内容 }  ①初期化子:繰返しの開始直前に1度だけ行うこと。主に、回数カウンタのクリアに利用  ②条件式:繰返しの継続条件となるbool型を返す式。主に、回数カウンタ < 回数 (カウンタが0からの場合)  ③反復子:繰返しの最後に毎回行うこと。主に、回数カウンタのカウントアップ(インクリメント) ・書式例: for (カウンタ変数 = 0; カウンタ変数 < 5; カウンタ変数++) { 5回繰返す処理 } ・実装例: for (int i = 0; i < 3; i++) { Console.Write("やらせはせん"); } //3回繰返す  この例では、iの値が0、1、2の順に変化し、3になったところで継続条件「i < 3」がfalseになってif文を抜ける ・if文と同様に、繰返し内容が1文の場合に{}を省略できるが、推奨されないことも多い アレンジ演習:p.115 for01.cs ・このプログラムではfor文の外でカウンタ用の変数iを宣言しているので、for文を抜けた後でも変数iの値を表示したり再利用することができる ・よって、for文を抜けた直後の変数iの値を表示して確認しよう 作成例 //アレンジ演習:p.115 for01.cs using System; class for01 { public static void Main() { int i; //カウンタ用変数 for (i = 0; i < 5; i++) { //カウンタ用変数を0から、5未満である間、+1しつつ繰返す Console.WriteLine("i = {0}", i); //カウンタ用変数の値を表示 } Console.WriteLine("繰返し終了時のi = {0}", i); //【追加】カウンタ用変数の値を表示(5) } } p.116 for文:つづき ・繰返しはインクリメントではなくデクリメントで行うことが可能 ・書式例: for (カウンタ変数 = 4; カウンタ変数 >= 0; カウンタ変数--) { 5回繰返す処理 }  こうすると、4,3,2,1,0とカウンタ変数が変化し、5回繰返しになる アレンジ演習:p.116 for02.cs ・このプログラムではfor文の外でカウンタ用の変数iを宣言しているので、for文を抜けた後でも変数iの値を表示したり再利用することができる ・よって、for文を抜けた直後の変数iの値を表示して確認しよう 提出:アレンジ演習:p.116 for02.cs 次回予告:「p.116 for文:つづき」についての補足説明の後、p.117「forループからの脱出」に進みます。