前回のコメント

・ありがとうございました。
 今年もありがとうございました。
 よいお年をお迎えください。

 今年も宜しくお願い致します。

・今回もありがとうございました
 ここから三週間空いてしまうので忘れないように
 まとめなおしたり、自分なりに何か作ってみようと思います。
 よいお年をお迎えください。

 今年も宜しくお願い致します。
 作ってみて疑問点や解説が必要なことがありましたら、説明をリクエストしてください。

・だんだん表示できることが増えていって楽しいです。

 何よりです。

・次の授業は新年明けてからなので、復習をしっかりして、頭から抜けないようにします。

 是非。

講義は休みですが今週の話題

ゲームソフト販売本数ランキング:今週1位は「スーパー マリオパーティ ジャンボリー(Switch)」 GO!
ソニー、KADOKAWAの筆頭株主に―両社で戦略的な資本業務提携契約を締結 GO!
デジタルハーツは上期増益に転じるも株価軟調、スピンオフしたAGESTの収益改善が必要に【ゲーム企業の決算を読む】 GO!
【キャリアクエスト】好きなことだからこそ、仕事として続けられる。Aimingの若手エンジニアが語る、入社以降に変化した意識や作業の進め方とは GO!
集え!就活冒険者たち―ゲーム業界就活イベント「キャリアクエスト」第2回が12月22日に開催 GO!
コロプラが上場後初の通期赤字転落、力強いヒット作を生むことはできるか【ゲーム企業の決算を読む】GO!

オタク業界で相次ぐ「Visa」クレジットカードの使用規制……はたしてSteamは大丈夫? GO!

講義メモ 後半

p.122 while文

・if文を第2要素のみにした繰り返し構文がwhile文
・よって「回数指定の繰り返し」ならforを、回数が決まらない繰り返しならwhileを用いると良い
・書式: while(継続条件){…}
・なお、for文とwhile文は繰り返しの1回目の前に継続条件のチェックをするので、前判定繰り返しという。
・前判定繰り返しは1度も実行しない可能性のある繰り返しを表現できる。

p.124 while01.cs

//p.124 while01.cs
using System;
class while01
{
    public static void Main()
    {
        int i = 0;
        while (i < 100) { //変数iの値が100未満である間、以下を繰返す
            Console.WriteLine("i = {0,3}", i); //0から99までを3桁で表示
            i++; //インクリメントする
        }
    }
}

アレンジ演習:p.124 while01.cs ⇒ whilefor01.cs

・for文で書き直そう

作成例

//アレンジ演習:p.124 while01.cs ⇒ whilefor01.cs
using System;
class while01
{
    public static void Main()
    {
        for (int i = 0; i < 100; i++) { //変数iの値を0から100未満である間、+1しながら、以下を繰返す
            Console.WriteLine("i = {0,3}", i); //0から99までを3桁で表示
        }
    }
}

p.124 条件式は必ずbool型

・for文の第2要素(継続条件)および、while文、do-while文の継続条件には、bool型の変数または式のみ記述できる
・よって、bool型を返す演算子である関係演算子の式を用いることが多い。
・なお、C/C++では整数値でbool型を代用できるため「while(1)」などの表記が可能だが、C#では文法エラーになる

p.125 while文を使った無限ループ

・無限ループはfor文の第2要素の省略で可能だが、第1要素も第3要素も省略した「for(;;)」を用いる代わりに、
「while(true)」とする方が分かりやすい。
・なお、繰り返し文の中でbreakを実行することで、ループを抜けられるが、switch-case文のbreak文はswitch構造の一部なので、
 ループは抜けないので注意
・また、2重ループの内側のループの中でbreakを実行すると、内側のループのみを抜けるので、外側のループは続行になる

p.125 menu01.cs

//p.125 menu01.cs
using System;
class menu01
{
    public static void Main()
    {
        bool bEnd = false; //bool型の変数で表した終了フラグをオフにする
        while (true) { //無限ループ
            Console.WriteLine("***** Menu *****");
            Console.WriteLine("0:終了");
            Console.WriteLine("1:ファイル");
            Console.WriteLine("2:編集");
            Console.WriteLine("****************");
            Console.Write("選択---- ");
            string strAns = Console.ReadLine();
            switch (strAns) { //入力された文字列に応じて分岐
                case "0":  //0:終了
                    bEnd = true; //終了フラグをオンにする
                    break; //switch構造を抜ける(繰返しは抜けない)
                case "1":  //1:ファイル
                    Console.WriteLine("ファイルが選択されました");
                    break; //switch構造を抜ける(繰返しは抜けない)
                case "2":  //2:編集
                    Console.WriteLine("編集が選択されました");
                    break; //switch構造を抜ける(繰返しは抜けない)
                default:
                    Console.WriteLine("入力に間違いがあります");
                    break; //switch構造を抜ける(繰返しは抜けない)
            }
            Console.WriteLine(); //改行
            if (bEnd) { //「if (bEnd == true)」と同じ意味:終了フラグがオン?
                Console.WriteLine("それでは、このプログラムを終了します");
                break; //繰り返しを抜ける
            }
        }
    }
}

提出:アレンジ演習:p.125 menu01.cs

・終了フラグ「bool bEnd = false;」を用いずに同じ処理になるようにしよう

講義メモ

・p.118「for04.cs(条件式のみの省略)」から

提出フォロー:アレンジ演習:p.117 for03.cs

・・4,3,2,1,0 とカウントダウンするように書き換えよう

作成例

//アレンジ演習:p.117 for03.cs カウントダウン
using System;
class for03
{
    public static void Main()
    {
        int i = 4; //【変更】
        for ( ; ; ) { //無限ループ!!
            Console.WriteLine("i = {0}", i);
            i--; //【変更】WriteLineメソッドが実行されたらiを1減らす
            if (i < 0) { //【変更】iが0未満になったらbreak文で脱出
                break;
            }
        }
    }
}

p.118 forループからの脱出(for文における初期化)

・forの第1要素で用いることが多いカウンタ用の変数は、事前に宣言する必要は無い
・forの第1要素において初期化しても良いので、単純な回数指定繰り返しは下記の書式にできる。
 for (int カウンタ用変数 = 0; カウンタ用変数 < 回数; カウンタ用変数++) {…}
・なお、このカウンタ用変数は、forの内部でのみ有効になるので、繰り返しの外で誤って用いることを防止できる
 ※ 繰り返しの外で用いる場合は事前に宣言する必要がある
・for文における初期化にすると、カウンタ用の変数名の重複が可能なので「i」などにを統一することが多い

アレンジ演習:p.118 for04.cs

①現状では、forの繰り返しの終わった後で、カウンタ用の変数iにアクセスできることを確認しよう
②それから、カウンタ用の変数iを事前に宣言せず、for文において初期化し、動作が変わらないことを確認しよう
③forの繰り返しの終わった後で、カウンタ用の変数iにアクセスできないことを確認しよう

作成例

//アレンジ演習:p.118 for04.cs
using System;
class for04
{
    public static void Main()
    {
        //int i; //【削除】カウンタ用の変数iの宣言のみ
        for (int i = 0;;i++) { //【変更】変数iを0で初期化して、インクリメントしながら無限ループする
            if (i >= 5) { //変数iが5以上なら
                break; //ループを抜ける
            }
            Console.WriteLine("i = {0}", i); //iの値を表示
        } //繰り返しの最後でインクリメントをしている
        //Console.WriteLine("繰り返し終了後のi = {0}", i); //【追加】iの値を表示できる⇒【削除】できない
    }
}

p.119 forループのネスト

・ある構造の内側に同じ構造を持つことを「入れ子」「ネスト」という。
・forループはいくつでもネストができるので、例えば「1年生から3年生までの、1組から3組まで繰返す」というような処理を記述できる
・2つのネストのことを2重ループともいう
・forループのネストでは内側のネストを1通り終えてから外側のネストの続きが実行される
 例:「1年生から3年生までの、1組から3組まで繰返す」であれば
  {1年1組、1年2組、1年3組}、{2年1組、2年2組、2年3組}、{3年1組、3年2組、3年3組} の順になる
・内側のネストでは外側のネストのカウンタ用変数とは別の変数を使う。一般に、外側はi、内側はjを使うことが多い

アレンジ演習:p.119 kuku01.cs

・カウンタ用の変数i、jを事前に宣言せず、for文において初期化しよう
・なお、外側や外側のループで宣言/初期化した変数は内側のループから利用できる
 ※逆は不可(内側のループで宣言/初期化した変数は外側のループやその外側からは利用できない)

作成例

//アレンジ演習:p.119 kuku01.cs
using System;
class kuku01
{
    public static void Main()
    {
        //int i, j; //【削除】
        for (int i = 1; i <= 9; i++) { //【変更】外側のループでiを1から9まで繰り返す(iの段)
            for (int j = 1; j <= 9; j++) { //【変更】内側のループでjを1から9まで繰り返す(×j)
                Console.WriteLine("{0} * {1} = {2}", i, j, i * j); //i、j、積を表示
            } //内側のループはここまで
            Console.WriteLine("------------"); //段の終わりの区切り線を表示
        } //外側のループはここまで
    }
}

アレンジ演習:p.119 kuku01.cs つづき

・内側のWriteLineをWriteにして、積だけを3桁で表示しよう(p.29参照)
・そして、外側のWriteLineを改行のみにしよう(引数を空にすれば良い)

作成例

//アレンジ演習:p.119 kuku01.cs つづき
using System;
class kuku01
{
    public static void Main()
    {
        for (int i = 1; i <= 9; i++) { //外側のループでiを1から9まで繰り返す(iの段)
            for (int j = 1; j <= 9; j++) { //内側のループでjを1から9まで繰り返す(×j)
                Console.Write("{0,3}", i * j); //【変更】積を3桁で表示
            } //内側のループはここまで
            Console.WriteLine(); //【変更】改行のみ
        } //外側のループはここまで
    }
}

アレンジ演習:p.119 kuku01.cs さらにつづき

・内側の繰り返しの回数を、外側のカウンタiで決めるようにしよう
・すると、下記のように、九九表の右上の重複部分を表示しないようにできる
※無限ループにより止まらなくなったら「Ctrlキーを押しながらC」で止めると良い(コンソールを閉じても良いが、状況がのこらない)

  1
  2  4 
  3  6  9 
  4  8 12 16 
  5 10 15 20 25 
  6 12 18 24 30 36 
  7 14 21 28 35 42 49 
  8 16 24 32 40 48 56 64 
  9 18 27 36 45 54 63 72 81

作成例

//アレンジ演習:p.119 kuku01.cs つづき
using System;
class kuku01
{
    public static void Main()
    {
        for (int i = 1; i <= 9; i++) { //外側のループでiを1から9まで繰り返す(iの段)
            for (int j = 1; j <= i; j++) { //【変更】内側のループでjを1からiまで繰り返す(×j)
                Console.Write("{0,3}", i * j); //積を3桁で表示
            } //内側のループはここまで
            Console.WriteLine(); //【変更】改行のみ
        } //外側のループはここまで
    }
}

p.121 forループのネスト(Mathクラスのメンバ)

・MathクラスはC#システムが提供する数学的なパーツ集。クラスを構成する要素をメンバという。
・クラスのメンバを用いるには「クラス名.メンバ名」とする場合と、後述するオブジェクトを使う場合がある。
・ここで用いる PI、Sin()、Round()は「クラス名.メンバ名」で利用できる(後述する静的メンバなので)
・Math.PI:円周率が格納されている定数
・Math.Sin(実数):指定した実数で得た三角関数のサインを返すメソッド。実数では角度のラジアン値を指定する。
 ※ ラジアン値:角度÷180×円周率
・Math.Round(実数):小数点以下を四捨五入する(最も近い整数を返す)

アレンジ演習:p.121 sin01.cs

・1行目の「0.0」が表示されず、小数点の位置がずれていることを改善しよう
・そのために、小数点以下を5桁固定で末尾の0を省略しないように指定すれば良い(p.32参照)

作成例

//アレンジ演習:p.121 sin01.cs
using System;
class sin01
{
    public static void Main()
    {
        double s;
        //0度から180度(PI)までについて、180/45=4度ごとに繰り返す
        for (double a = 0.0; a <= Math.PI; a += Math.PI / 45.0) {
            s = Math.Sin(a); //現在の角度のサイン値を得る
            Console.Write("{0,7:#.00000}:", s); //【変更】7桁で小数点以下5桁固定で表示
            for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍(小数点以下切上げ)回繰返す
                Console.Write("*"); //「*」を表示して棒グラフにすること
            }
            Console.WriteLine(); //改行しておく
        }
    }
}

アレンジ演習:p.121 sin01.cs ⇒ cos01.cs

・サインではなく、コサインにしよう
・コサイン値はMath.Cos()メソッドで得られる
・ただし、0度から180度のサインは0.0~1.0だが、コサインは1.0から-1.0になる
・そこで、コサインの値が-1.0のときには「*」を0個、1.0の時には「*」を50個出すようにしよう
・つまり「Math.Round(s * 50)」を「Math.Round((s + 1) * 25)」とすれば良い

今週の話題

ゲームソフト販売本数ランキング:今週1位も「スーパー マリオパーティ ジャンボリー(Switch)」GO!
一つ一つのイベント出展が大きなチャンスに繋がっていく…インディー開発者、譽田潔氏の「ゲーム開発未経験からBitSummit Award大賞を獲得するまでの道のり」【Indie Developers Conference 2024】 GO!
【キャリアクエスト】食費を削ってCGに打ち込み『METAL GEAR SOLID Δ: SNAKE EATER』の3Dアニメーターに!KONAMIで働くT.K.さんに聞く、ゲーム業界に就職するために必要なこととは? GO!
感情パラメーターから3Dキャラクターの表情を自動生成する「DeepEmo」、デモエディタを提供開始 GO!

『原神』チートツール制作者に法の鉄槌、知的財産権侵害判決の結果は150万ドルの損害賠償…元々5万ドル以上を宣言も、膨れ上がる GO!

前回のコメント

・ありがとうございました。
・本日もありがとうございました。
・今回もありがとうございました。
・理解できた

 何よりです。

・楽しかったです。常に新しい言葉が出てきているので、ついていけるよう頑張ります。

 応援します。

・本日はありがとうございました。
 無条件で無限ループを開始する必要があるのはゲームの起動から終了などで必要なんですね。

 ゲームの起動から終了などに限らず、終了条件が複雑な場合などにも用います。

・ゲーム開発の現場やチーム制作において、どんな用途に用いられるという話も今後教えてもらえるとありがたいです。

 承知しました。

・休暇の間にまた戻ってしまいそうです。何かいいリハビリ方法などありますでしょうか。あれば教えてください。

 技術系資格の取得をお勧めします。その勉強時間にすると良いでしょう。
 例えば、ITパスポート、基本情報、情報セキュリティマネジメント、G検定(AI系)、LPIC/Linuc(Linux系)
 などでしたら、都内では年中いつでも受験可能ですし、ネットワーク系、データベース系の資格もあります。
 アピールできる複数の資格があれば未経験でも就活でスルーされることは少なくなります。

・for02.csをアレンジして、ループを使った文章を作ってみました。
 forとifを使った文章です。
 1000になるまで、カウントを続けて、100になったら100に達しましたという文章で
 コンソールメッセージが変わり、終了する文です。
 調べながらやったので、半分意味は分からないですが
 breakを入れないと、100で無限ループが終わらない理由があまりわかってません。
 でもこれを使えば、1000までが上限値で終了だけど、
 現時点で100になったらゲームの目標値1段階目はクリア!次に進めるよ!みたいな分岐表現を
 プログラムで表現できたという事ですよね?
 他に先生ならこのようなプログラムをどんなゲームの表現に使えると思いますか?

 考え方を整理しましょう。
 「1000になるまで、カウントを続けて」であれば、無限ループにする必要はなく、通常のfor文にすべきです。
 しかも「100になったら終了」するのであれば、「1000になるまで」の意味はありません。
 「どんなゲームの表現に使えるか」ではなく、仕様として適切かどうかを先に考えましょう。

講義メモ 後半

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が以下なら、③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.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;
        }
    }
}