講義メモ ・p.105「if02.cs」から再開します 提出フォロー:アレンジ演習:p.104 if01.cs・その3 ・比較対象の値も5固定ではなくて、コンソールから入力するようにしよう 作成例 //アレンジ演習: p.104 if01.cs その3 using System; class if01 { public static void Main() { int n; //n = 10; Console.Write("n : "); n = int.Parse(Console.ReadLine()); //【変更】nを入力 int a; //【追加】比較対象 Console.Write("比較対象 : "); a = int.Parse(Console.ReadLine()); //【追加】aを入力 if (n > a) { //【変更】式「n > a」の評価がtrueなら後続のブロック内を実行 Console.WriteLine("nは{0}より大きい", a); //【変更】 } else if (n < a) { //【変更】上記がfalseで式「n < a」の評価がtrueなら後続のブロック内を実行 Console.WriteLine("nは{0}より小さい", a); //【変更】 } else { //上記の両方がfalseなら後続のブロック内を実行 Console.WriteLine("nは{0}", a); //【変更】 } } } p.105 if02.cs 解説 ・「Int32.Parse」の「Int32」は.NET型(p.42)の「int」なので、「int.Parse」と同じ意味 ・変数nSogakuについて:021行目でこの変数の初期化を行っているのは、023行目と027行目で用いているのが理由。  こうすることで、掛け算が1度で済む。 アレンジ演習:p.105 if02.cs ・String型の変数「stShojikin」「stTanka」「stKosu」はなくても良いので削除しよう。 ・int型の変数に対して「Int32.Parse」は適切ではないので、「int.Parse」に統一しよう。 作成例 //アレンジ演習:p.105 if02.cs using System; class if02 { public static void Main() { Console.Write("所持金はいくらですか---"); int nShojikin = int.Parse(Console.ReadLine()); Console.Write("単価はいくらですか---"); int nTanka = Int32.Parse(Console.ReadLine()); Console.Write("何個買いますか---"); int nKosu = Int32.Parse(Console.ReadLine()); int nSogaku = nTanka * nKosu; if (nShojikin < nSogaku) { Console.WriteLine("所持金が足りません"); } else { int nOtsuri = nShojikin - nSogaku; Console.WriteLine("所持金は" + nOtsuri + "円残っています"); } } } p.106 bmi01.cs 解説 ・Convert.ToDouble()は、double.Parse()と同じ効果を持つ(p.47) ・Console.ForegroundColorは、コンソールの文字色を指すプロパティ(後述:値を設定/確認する仕掛) ・ConsoleColor.Redは、コンソールの色を提供する列挙型(p.66) ・ConsoleColor列挙型の列挙子として、Red、Black、Blue、DarkCyan(暗水色)、DarkYellow(暗黄色)、Mazenta(赤紫)、Whiteなどがある ・「##.#」は最低限でも整数部は2桁取り、小数点以下は1桁にするカスタム書式指定(p.32) ・なお、BMIは肥満度で、体重(kg)÷身長(m)の2乗で得る。 ・Math.Pow(p.49)は累乗値をdouble型で返す ・028行目でelseの後の{}を省略しているが、その前のifには{}があるので、中途半端な省略であり誤読の懸念があり、推奨されないことが多い。 アレンジ演習:p.106 bmi01.cs ・String型の変数「stBl」「stBw」「stKosu」はなくても良いので削除しよう。 ・誤読の懸念がある「{}の省略」を改善しよう ・文字色を黒にもどしているが、Visual Studio 2022のコンソールの文字色は黒ではない。灰色(Gray)にしよう。 作成例 //アレンジ演習:p.106 bmi01.cs using System; class bmi01 { public static void Main() { Console.Write("身長(cm)---"); double bl = Convert.ToDouble(Console.ReadLine()); //【変更】 Console.Write("体重(kg)---"); double bw = Convert.ToDouble(Console.ReadLine()); //【変更】 double bmi = bw / Math.Pow((bl / 100.0), 2.0); //BMI=体重÷身長の自乗 Console.WriteLine("BMI = {0:##.#}", bmi); //小数点以下1桁まで表示 if (bmi >= 25.0) { //Console.BackgroundColor = ConsoleColor.Green; //【参考】文字の背景色を緑にする Console.ForegroundColor = ConsoleColor.Red; //文字色をに赤する Console.WriteLine("BMIが25以上です!!"); Console.ForegroundColor = ConsoleColor.Gray; //【変更】文字色を灰色に } else { Console.WriteLine("BMIは25未満です"); } } } p.106 bmi02.cs 解説 ・009行目の変数「strShow」は023行目以降のConsole.WriteLineで用いる書式文字列 ・このように変数としてあらかじめ用意しておいて、複数のConsole.WriteLineで使いまわしすることも可能 ・つまり、変数「strShow」を用いない場合、023行目は下記のようになる  Console.WriteLine("BMIは{0:##.#}で{1}です", bmi, "やせすぎ"); ・この「"BMIは{0:##.#}で{1}です"」を変数「strShow」で与えるので下記のようになる  Console.WriteLine(strShow, bmi, "やせすぎ"); ・この工夫をするために、判定結果を別の文字列にしているところが、このプログラムの良さ。つまり本来は:  Console.WriteLine("BMIは{0:##.#}でやせすぎです", bmi); ・この工夫により可読性(読みやすさ)や保守性(変更しやすさ)を向上している アレンジ演習:p.107 bmi02.cs ・複数ある「●● && ■■」の構文の「●● &&」が不要であることを確認しよう ・文字色を白に戻しているが、Visual Studio 2022のコンソールの文字色は白ではない。灰色(Gray)にしよう。 作成例 //アレンジ演習:p.108 bmi02.cs using System; class bmi02 { public static void Main() { string strShow = "BMIは{0:##.#}で{1}です"; //形式指定文字列の使いまわし用 Console.Write("身長(cm)---"); double bl = Double.Parse(Console.ReadLine()); //【変更】 Console.Write("体重(kg)---"); double bw = Double.Parse(Console.ReadLine()); //【変更】 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) { //【変更】 Console.WriteLine(strShow, bmi, "適正体重"); } else if (bmi < 30.0) { //【変更】 Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine(strShow, bmi, "第1度肥満"); } else if (bmi < 35.0) { //【変更】 Console.ForegroundColor = ConsoleColor.DarkYellow; Console.WriteLine(strShow, bmi, "第2度肥満"); } else if (bmi < 40.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 5.3 switch文 ・整数値か文字列値による多分岐に特化した構文としてswitch文がある ・条件ではなく、値による分岐だが、可読性(読みやすさ)や保守性(変更しやすさ)を向上できる ・なお、実数値は利用できない  ※ switch文は各種のプログラム言語で実装されているが、文法ルールが異なるので注意 ・基本書式Ⅰ:  switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {   case 定数または定数を返す式①:    ①の時の実行文;    break;   case 定数または定数を返す式②:    ②の時の実行文;    break;   :  } p.109 5.3 switch文(続き) ・他の言語におけるswitch文とは異なり、caseの実行文の後にはbreak;が必須 ・「または」を意味する構文が必要な場合は、中身のないcaseを連続で記述できる ・基本書式Ⅱ:  switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {   case 定数または定数を返す式①:   case 定数または定数を返す式②:    ①または②の時の実行文;    break;   case 定数または定数を返す式③:    ③の時の実行文;    break;   :  } p.109 5.3 switch文(続き) ・if-else if-else構文の最後のelseと同様に「上記のどれでもなければ」を意味する「default:」を追記できる ・他の言語におけるswitch文とは異なり、default:の実行文の後にもbreak;が必須 ・基本書式Ⅲ:  switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {   case 定数または定数を返す式①:    ①の時の実行文;    break;   case 定数または定数を返す式②:    ②の時の実行文;    break;   :   default:    上記のどれでもない場合の実行文;    break;  } ・なお、case、defaultは文ではなくラベル扱いなので末尾は「:」(コロン)とする ・breakは(他の用途でも用いる)脱出文なので末尾は「;」(セミコロン)とする アレンジ演習:p.111 switch01.cs ・018行目の「Int16.」は「int」または「Int32.」にしないと無駄な型変換を行ってしまう ・変数「strAns」を除去しよう 作成例 //アレンジ演習: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("0:終了"); Console.WriteLine("********************"); Console.Write("\n選択---"); int ans = int.Parse(Console.ReadLine()); //【変更&修正】 switch (ans) { //入力値の整数変換結果により多分岐する case 1: Console.WriteLine("ファイルが選択されました"); break; case 2: Console.WriteLine("編集が選択されました"); break; case 3: Console.WriteLine("表示が選択されました"); break; case 0: Console.WriteLine("終了が選択されました"); break; default: //1,2,3,0以外の場合 Console.WriteLine("入力ミスです"); break; } } } アレンジ演習:p.113 switch02.cs 作成例 ・「4:印刷」を追加しよう ・「one」「two」「three」「four」「zero」でも対応する分岐をするようにしよう //アレンジ演習: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("4:印刷"); //【追加】 Console.WriteLine("0:終了"); Console.WriteLine("********************"); Console.Write("\n選択---"); string strAns = Console.ReadLine(); switch (strAns) { //文字列変数の値によって多分岐する case "1": case "one": //【追加】 Console.WriteLine("ファイルが選択されました"); break; case "2": case "two": //【追加】 Console.WriteLine("編集が選択されました"); break; case "3": case "three": //【追加】 Console.WriteLine("表示が選択されました"); break; case "4": //【以下追加】 case "four": Console.WriteLine("印刷が選択されました"); break; case "0": case "zero": //【追加】 Console.WriteLine("終了が選択されました"); break; default: Console.WriteLine("入力ミスです"); break; } } } p.115 for文 ・4つあるC#の繰り返し構文の1つで、主に「●回繰り返す」時に用いると便利な構文。 ・書式: for (繰り返し前の実行文; 継続条件; 毎回繰り返しの末尾の実行文) { 繰り返し内容 } ・例:  int i; //繰り返しのカウンタ用の変数を宣言  //①iに0を代入し、②iが5未満なら、③iの表示とインクリメントを繰り返す  for (i = 0; i < 5; i++) { //繰り返し開始   Console.WriteLine(i); //繰り返し内容  } //繰り返しここまで ・繰り返し内容が1行の場合「{}」は省略可能だが、省略が推奨されないことがある アレンジ演習:p.115 for01.cs ・省略されている{}を記述しよう ・継続条件を「5未満」から「4以下」にしよう 作成例 //アレンジ演習:p.115 for01.cs using System; class for01 { public static void Main() { int i; //繰り返しのカウンタとして用いる変数 //①iに0を代入し、②iが5未満なら、③iの表示とインクリメントを繰返す for (i = 0; i <= 4; i++) { //iを0から4まで1加算しながら繰返す Console.WriteLine("i = {0}", i); } } } p.116(デクリメントによるカウントダウンのfor文) ・for文の第3要素をデクリメントにすると、カウントダウンのfor文を記述できる アレンジ演習:p.116 for02.cs ・省略されている{}を記述しよう 作成例 //アレンジ演習:p.116 for02.cs using System; class for02 { public static void Main() { int i; //繰り返しのカウンタとして用いる変数 //①iに4を代入し、②iが0以上なら、③iの表示とデクリメントを繰返す for (i = 4; i >= 0; i--) { Console.WriteLine("i = {0}", i); } } } p.117 forループからの脱出 ・for文の3つの要素は全て省略可能(セミコロン2個は省略不可)  例: for(i = 0; i < 5;){…; i++;}  例: i = 0; for(; i < 5;){…; i++;} ・ただし、2つめの要素である継続条件を省略すると無限ループになる  例: for(;;){…} ・無限ループを終わらせたい場合や、継続条件以外の理由でループを終わらせたい場合、breakを実行すると良い ・よって、継続条件が複雑な場合や、コンソールからの入力によってループを終わらせたい場合などは、継続条件ではなく、breakをif文で囲って用いると良い  例:  i = 0; //カウンタに0を代入  for(;;){ //無限ループ開始   if(i >= 5) //カウンタが5以上になったら    break; //繰り返し終了   }   i++; //カウンタに1加算  } ・なお、繰返し構文の中のif文などでは、その対象が1行であっても{}の省略を推奨しないことがある。 アレンジ演習:p.117 for03.cs ・繰返し構文の中のif文の{}の省略をやめよう 作成例 //アレンジ演習:p.117 for03.cs using System; class for03 { public static void Main() { int i = 0; for ( ; ; ) { //無限ループ!! Console.WriteLine("i = {0}", i); i++; // WriteLineメソッドが実行されたらiを1増やす if (i >= 5) { // iが5以上になったらbreak文で脱出 break; } } } } 提出:アレンジ演習:p.117 for03.cs ・4,3,2,1,0 とカウントダウンするように書き換えよう 次回予告:p.118「for04.cs(条件式のみの省略)」から