講義メモ

・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 = int.Parse(Console.ReadLine());
        Console.Write("何個買いますか---");
        int nKosu = int.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;
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です