講義メモ 第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に戻すと良い

アレンジ演習:p.107 bmi02.cs

・各「else if」にある直前の条件文の該当部分を取り除く表現を削除しよう
・各「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

Leave a Reply

Your email address will not be published. Required fields are marked *