今週の話題

販売本数ランキング 今回トップも「桃太郎電鉄ワールド ~地球は希望でまわってる!~(Switch)」GO!
「イケメンシリーズ」のアエリアが業績予想を下方修正―大規模な再編・改革が必要か?【ゲーム企業の決算を読む】GO!
「実写×Live2D」の映像作品がグランプリ受賞―「Live2D Creative Awards 2023」結果発表 GO!
「Live2D」は海外ユーザーの需要が急増中―AI研究も語られた「alive 2023」基調講演レポート GO!
『ブルーアーカイブ』の世界累計収益4億ドル突破―その75%を日本市場が占める GO!
ゲーム内に「自分の声」を実装できるかも? EAが“プレイヤーの声から生成したボイス”導入技術の特許を申請中 GO!
Epic Games Japan主催の勉強会「EOS / UE5 Deep Dive 2023」秋葉原で開催…一般枠の抽選申込み受付中 12/14・15 GO!

『Dave the Diver』はインディーゲームなのか?ジェフ・キーリー氏が自らの考えを明かす GO!
AI向けに改造されたGeForce RTX 4090の写真が中国で公開。米国による輸出禁止前の駆け込み需要か GO!
今年は乱入対策もばっちりか?2022年開催時不審者騒ぎのあった「The Game Awards」警備を強化予定 GO!

前回のコメント

・個人的にifで分岐を作るやり方が自分で理解しやすいと感じた

 わかりやすい方から理解することをお勧めします。
 なお、業務では他者が作成したプログラムを読み解く必要があり、条件演算子も多用される傾向があります。
 if文の各型式を理解してから、条件演算子の復習もしてみましょう。

・else if が何個でも記述することができるのは便利だなと思った

 ですね。
 else if構造と、switch-case文で多分岐構文ができますので、プログラムの表現力が向上します。
 是非、使いこなしてください。

講義メモ 第5章 制御文

p.102 if文

・条件分岐を行える構文でいくつかのパターンがある
・基本構文: if(条件文) { 条件文がtrueである時に実行する文 }
・条件文にはbool型の変数または式を記述できるので、主に、関係演算子(p.88)の文を用いることが多い
・例: if(a > 0) { Console.WriteLine("aは正の数です"); }
・条件文がtrueである時に実行する文が1文のみの場合、{}を省略できる
 ※ 省略することを禁止するチームルールの場合もある

p.102(if-else構文)

・if文に「そうでなければ」を加える構文
・基本構文: if(条件文) { 条件文がtrueである時に実行する文 } else { 条件文がfalseである時に実行する文 }
・例: if(a > 0) { Console.WriteLine("aは正の数"); } else { Console.WriteLine("aは負の数か0"); }
・条件文がtrue/falseである時に実行する文が1文のみの場合、{}を省略できる
 ※ 省略することを禁止するチームルールの場合もある。特に片方だけ省略は避けた方が良い
・elseはifの1個につき1個のみ記述でき、ifのないelseはエラーになる

p.102(if-else if構文)

・if文に「そうでなくてもしも」を加える構文
・基本構文: if(条件文①) { 条件文①がtrueである時に実行する文 } 
       else if(条件文②) { 条件文①がfalseで条件文②がtrueである時に実行する文 }
・例: if(a > 0) { Console.WriteLine("aは正の数"); } else if(a < 0) { Console.WriteLine("aは負の数"); }
・else ifはifの1個につきいくつでも記述でき、ifのないelse ifはエラーになる
・よって、多分岐構文が可能
・例: if(a == 0) { Console.WriteLine("aは0"); }
    else if(a == 1) { Console.WriteLine("aは1"); }
    else if(a == 2) { Console.WriteLine("aは2"); }
・最後のelse ifの後に、elseを書いて「上記のどれでもなければ」を加えることが出来る
・例: if(a == 0) { Console.WriteLine("aは0"); }
    else if(a == 1) { Console.WriteLine("aは1"); }
    else if(a == 2) { Console.WriteLine("aは2"); }
    else { Console.WriteLine("aは0でも1でも2でもない"); }

p.104 if01.cs

//p.104 if01.cs
using System;
class if01
{
    public static void Main()
    {
        int n;
        n = 10;
        if (n > 5) { //式「n > 5」がtrueであれば
            Console.WriteLine("nは5より大きい");
        }
        else { //式「n > 5」がtrueでなければ(=falseならば)
            Console.WriteLine("nは5より大きくはない");
        }
    }
}

アレンジ演習:p.104 if01.cs

・nの値をコンソールから入力するようにしよう
・これで、入力値により、2通りの結果がでるようになることを確認しよう

作成例

//アレンジ演習:p.104 if01.cs
using System;
class if01
{
    public static void Main()
    {
        int n;
        Console.Write("整数n:"); n = int.Parse(Console.ReadLine()); //【変更】入力して整数変換
        if (n > 5) { //式「n > 5」がtrueであれば
            Console.WriteLine("nは5より大きい");
        }
        else { //式「n > 5」がtrueでなければ(=falseならば)
            Console.WriteLine("nは5より大きくはない");
        }
    }
}

アレンジ演習:p.104 if01.cs・追加

・結果が「nは5より大きい」「nは5より小さい」「nは5と等しい」の3パターンになるようにしよう
・ヒント:「if - else if - else」構文にすると良い

作成例

//アレンジ演習:p.104 if01.cs・続き
using System;
class if01
{
    public static void Main()
    {
        int n;
        Console.Write("整数n:"); n = int.Parse(Console.ReadLine()); //入力して整数変換
        if (n > 5) { //式「n > 5」がtrueであれば
            Console.WriteLine("nは5より大きい");
        }
        else if (n < 5) { //【追加】式「n > 5」がfalseで「n < 5」がtrueならば
            Console.WriteLine("nは5より小さい"); //【追加】
        }
        else { //式「n > 5」がfalseで「n < 5」もfalseならば
            Console.WriteLine("nは5と等しい"); //【変更】
        }
    }
}

p.105(整数への変換)

・数字列のように数値に変換できる文字列は、int.ParseやInt32.Parseメソッドで整数に変換できる
・Int32.Parseメソッドはint.Parseメソッドの.NET版で同じ意味になる
・int及びInt32以外の整数型や、実数型も同様に利用可能
・ただし、数値に変換できる文字列が与えられてしまうと、その時点で異常終了する

p.105 if02.cs

//p.105 if02.cs
using System;
class if02
{
    public static void Main()
    {
        Console.Write("所持金はいくらですか---");
        string stShojikin = Console.ReadLine(); //数字列を入力
        int nShojikin = Int32.Parse(stShojikin); //数字列をInt32型整数に変換
        Console.Write("単価はいくらですか---");
        string stTanka = Console.ReadLine(); //数字列を入力
        int nTanka = Int32.Parse(stTanka); //数字列をInt32型整数に変換
        Console.Write("何個買いますか---");
        string stKosu = Console.ReadLine(); //数字列を入力
        int nKosu = Int32.Parse(stKosu); //数字列をInt32型整数に変換
        int nSogaku = nTanka * nKosu;
        if (nShojikin < nSogaku) { //所持金が総額未満ならば
            Console.WriteLine("所持金が足りません");
        } 
        else { //でなければ
            int nOtsuri = nShojikin - nSogaku; //所持金ー総額で残金を得る
            Console.WriteLine("所持金は" + nOtsuri + "円残っています"); //残金を表示
        }
    }
}

p.105 if02.csアレンジ演習:

・変数stShojikin、stTanka、stKosu、nOtsuri を用いないようにしよう

作成例

//アレンジ演習:p.105 if02.cs
using System;
class if02
{
    public static void Main()
    {
        Console.Write("所持金はいくらですか---");
        int nShojikin = Int32.Parse(Console.ReadLine()); //【変更】数字列を入力しInt32型整数に変換
        Console.Write("単価はいくらですか---");
        int nTanka = Int32.Parse(Console.ReadLine()); //【変更】数字列を入力しInt32型整数に変換
        Console.Write("何個買いますか---");
        int nKosu = Int32.Parse(Console.ReadLine()); //【変更】数字列を入力しInt32型整数に変換
        int nSogaku = nTanka * nKosu;
        if (nShojikin < nSogaku) { //所持金が総額未満ならば
            Console.WriteLine("所持金が足りません");
        } 
        else { //でなければ
            Console.WriteLine("所持金は" + (nShojikin - nSogaku) + "円残っています"); //【変更】残金を表示
        }
    }
}

p.106(コンソールの文字色の変更)

・Console.ForegroundColorに、ConsoleColor列挙型にある「Color.色名」の列挙子を代入することで、コンソールの文字色の
 変更ができる
 https://learn.microsoft.com/ja-jp/dotnet/api/system.consolecolor
・なお、p.106 bmi01.csでは文字色を黒に戻しているが、通常、コンソールの文字色は白または灰色なので、実情に合わせて変更しよう

p.106 bmi01.cs

//p.106 bmi01.cs
using System;
class bmi01
{
    public static void Main()
    {
        Console.Write("身長(cm)---");
        string stBl = Console.ReadLine(); //身長を読み込む
        double bl = Convert.ToDouble(stBl); //実数に変換
        Console.Write("体重(kg)---"); 
        string stBw = Console.ReadLine(); //体重を読み込む
        double bw = Convert.ToDouble(stBw); //実数に変換
        double bmi = bw / Math.Pow((bl / 100.0), 2.0); //BMIを計算(Powはp.49)
        Console.WriteLine("BMI = {0:##.#}", bmi);
        if (bmi >= 25.0) { //25以上?
            Console.ForegroundColor = ConsoleColor.Red; //コンソール表示色を赤にする
            Console.WriteLine("BMIが25以上です!!");
            Console.ForegroundColor = ConsoleColor.Gray; //【変更】コンソール表示色を灰色にする
        }
        else { //25未満?
            Console.WriteLine("BMIは25未満です");
        }
    }
}

アレンジ演習:p.106 bmi01.cs

・変数stBl、stBwをを用いないようにしよう

作成例

//アレンジ演習: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を計算(Powはp.49)
        Console.WriteLine("BMI = {0:##.#}", bmi);
        if (bmi >= 25.0) { //25以上?
            Console.ForegroundColor = ConsoleColor.Red; //コンソール表示色を赤にする
            Console.WriteLine("BMIが25以上です!!");
            Console.ForegroundColor = ConsoleColor.Gray; //コンソール表示色を灰色にする
        }
        else { //25未満?
            Console.WriteLine("BMIは25未満です");
        }
    }
}

p.107 bmi02.cs

//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); //BMIを計算
        if (bmi < 18.5) { //18.5未満
            Console.ForegroundColor = ConsoleColor.Blue; //コンソール表示色を青にする
            Console.WriteLine(strShow, bmi, "やせすぎ");
        }
        else if (bmi >= 18.5 && bmi < 25.0) { //18.5以上、25.0未満
            Console.WriteLine(strShow, bmi, "適正体重");
        }
        else if (bmi >= 25.0 && bmi < 30.0) { //25.0以上、30.0未満
            Console.ForegroundColor = ConsoleColor.DarkCyan; //コンソール表示色を暗い水色にする
            Console.WriteLine(strShow, bmi, "第1度肥満");
        }
        else if (bmi >= 30.0 && bmi < 35.0) { //30.0以上、35.0未満
            Console.ForegroundColor = ConsoleColor.DarkYellow; //コンソール表示色を暗い黄色にする
            Console.WriteLine(strShow, bmi, "第2度肥満");
        }
        else if (bmi >= 35.0 && bmi < 40.0) { //35.0以上、40.0未満
            Console.ForegroundColor = ConsoleColor.Magenta; //コンソール表示色を赤紫色にする
            Console.WriteLine(strShow, bmi, "第3度肥満");
        }
        else { //上記以外(40.0以上)
            Console.ForegroundColor = ConsoleColor.Red; //コンソール表示色を赤色にする
            Console.WriteLine(strShow, bmi, "第4度肥満");
        }
        Console.ForegroundColor = ConsoleColor.Gray; //【変更】コンソール表示色を灰色にする
    }
}

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

・「&&」を使いたいために、else ifの条件式が冗長になっているので改良しよう
・ifや上位のelse ifに当てはまっている条件を削除してシンプルにできる
・ついでに、変数stBl、stBwを用いないようにしよう

作成例

//アレンジ演習:p.107 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); //BMIを計算
        if (bmi < 18.5) { //18.5未満
            Console.ForegroundColor = ConsoleColor.Blue; //コンソール表示色を青にする
            Console.WriteLine(strShow, bmi, "やせすぎ");
        }
        else if (bmi < 25.0) { //【変更】18.5以上、25.0未満
            Console.WriteLine(strShow, bmi, "適正体重");
        }
        else if (bmi < 30.0) { //【変更】25.0以上、30.0未満
            Console.ForegroundColor = ConsoleColor.DarkCyan; //コンソール表示色を暗い水色にする
            Console.WriteLine(strShow, bmi, "第1度肥満");
        }
        else if (bmi < 35.0) { //【変更】30.0以上、35.0未満
            Console.ForegroundColor = ConsoleColor.DarkYellow; //コンソール表示色を暗い黄色にする
            Console.WriteLine(strShow, bmi, "第2度肥満");
        }
        else if (bmi < 40.0) { //【変更】35.0以上、40.0未満
            Console.ForegroundColor = ConsoleColor.Magenta; //コンソール表示色を赤紫色にする
            Console.WriteLine(strShow, bmi, "第3度肥満");
        }
        else { //上記以外(40.0以上)
            Console.ForegroundColor = ConsoleColor.Red; //コンソール表示色を赤色にする
            Console.WriteLine(strShow, bmi, "第4度肥満");
        }
        Console.ForegroundColor = ConsoleColor.Gray; //コンソール表示色を灰色にする
    }
}

p.109 switch文

・多分岐構造専用の文で、式の値に応じて分岐させたい場合に便利
・構文: 
 switch(式) { 
  case 定数式①: 実行文①-1; 実行文①-2; …; break;
  case 定数式②: 実行文②-1; 実行文②-2; …; break;
  :
  default: 実行文③-1; 実行文②-2; …; break;
 }
・式の型は整数または文字列のみで、実数型や文字型は利用できない
※ switch文はC/C++、Javaなどでも利用可能だが、言語ごとに仕様が異なるので注意
・caseの後に定数式(定数または定数を返す式)を記述し、この値により分岐する
・よって、caseの後には通常、リテラルを記述する。変数は記述できない。
・case1つごとに複数の実行文が記述でき、最後に「break;」が必要
※ C/C++、Javaなどのswitch文では、breakを指定しないことによる特殊処理(フォールスルー)が可能だが、C#では禁止
・「if-else if-else」構文ののelseにあたる「上記のどれでもなければ」を記述できるのが「default:」
・default:の後は通常switchの終わりだが、default:にも最後に「break;」が必要

p.111 switch01.cs

//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選択---");
        string strAns = Console.ReadLine(); //数字を入力
        int ans = Int16.Parse(strAns); //整数に変換
        switch (ans) { //変換後の整数値に応じて分岐
            case 1: //変換後の整数値が1なら
                Console.WriteLine("ファイルが選択されました");
                break; //このcaseの終わりを示す
            case 2: //変換後の整数値が2なら
                Console.WriteLine("編集が選択されました");
                break; //このcaseの終わりを示す
            case 3: //変換後の整数値が3なら
                Console.WriteLine("表示が選択されました");
                break; //このcaseの終わりを示す
            case 0: //変換後の整数値が0なら
                Console.WriteLine("終了が選択されました");
                break; //このcaseの終わりを示す
            default: //変換後の整数値が1,2,3,0以外なら
                Console.WriteLine("入力ミスです");
                break; //defaultの終わりを示す
        }
    }
}

p.113 switch02.cs

//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(); //数字を入力(文字列として扱う)
        switch (strAns) { //変換後の整数値に応じて分岐
            case "1": //変換後の整数値が1なら
                Console.WriteLine("ファイルが選択されました");
                break; //このcaseの終わりを示す
            case "2": //変換後の整数値が2なら
                Console.WriteLine("編集が選択されました");
                break; //このcaseの終わりを示す
            case "3": //変換後の整数値が3なら
                Console.WriteLine("表示が選択されました");
                break; //このcaseの終わりを示す
            case "0": //変換後の整数値が0なら
                Console.WriteLine("終了が選択されました");
                break; //このcaseの終わりを示す
            default: //変換後の整数値が1,2,3,0以外なら
                Console.WriteLine("入力ミスです");
                break; //defaultの終わりを示す
        }
    }
}

【補足】if文等のネスト

・if文やswitch文の中にさらにif文やswitch文を記述できる。これをネスト(入れ子)という
例:正の数が入力されたら、もう1つの整数を入力させ、どちらも正の数のなら「どちらも正」と表示する。
 あてはまらない場合はなにも表示しない。
 if (正の数?) { もう1つ入力: if (正の数?) { 「どちらも正」と表示 } }
※ なお、switch文のネストはどうしても必要な場合を除いて避けた方が良い

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

講義メモ

・p.90「短絡評価」のプログラム例から

p.90(短絡評価)【再掲載】

・2項&&演算子と2項||演算子のもつ、途中で結果が確定したときは先に進むという特長のこと
・これにより、無駄な動作の除外が可能
・例:「多くの計算① && 多くの計算②」とすると、多くの計算①がfalseなら②は実行せずにfalse確定
・例:「多くの計算① || 多くの計算②」とすると、多くの計算①がtrueなら②は実行せずにtrue確定
・これにより、異常終了の回避が可能
・例:「a != 0 && 5 / a > 2」とすると、もしもaが0だと「5 / a」は異常終了するが、
 「a != 0」がfalseになるので「5 / a」は実行されない=異常終了の回避が可能

ミニ演習 mini090.cs

・int型の値を入力して「100 / 入力値」が50超かを表示するプログラムを作成しよう
・まず、短絡評価を用いないと0が入力されたときに、異常終了することを確認しよう
 例: if (100 / n > 50) {…}
・それから、短絡評価を用いて0が入力されたときに、異常終了しないことを確認しよう
 例: if (n != 0 && 100 / n > 50) {…}

作成例

//ミニ演習 mini090.cs
using System;
class mini090
{
    public static void Main()
    {
        Console.Write("整数n:"); int n = int.Parse(Console.ReadLine()); 
        if (n != 0 && 100 / n > 50) { //短絡評価でnが0ではない時のみ除算するから異常終了しない
            Console.WriteLine("100÷nは50超です");
        }
    }
}

p.90 bitwise01.cs

//p.90 bitwise01.cs
using System;
class bitwise01
{
    public static void Main()
    {
        byte a = 2, b = 3; //2進数4桁にすると 2⇒0010 3⇒0011
        Console.WriteLine(a & b); // 0010 & 0011 = 0010 となり10進数の2
        Console.WriteLine(a | b); // 0010 | 0011 = 0011 となり10進数の3
        Console.WriteLine(a ^ b); // 0010 ^ 0011 = 0001 となり10進数の1
        Console.WriteLine(); //改行
        bool x = true, y = false; //trueは2進数の1、falseは2進数の0
        Console.WriteLine(x & x); //1 & 1 = 1 ⇒ True
        Console.WriteLine(x & y); //1 & 0 = 0 ⇒ False
        Console.WriteLine(y & y); //0 & 0 = 0 ⇒ False
        Console.WriteLine(); //改行
        Console.WriteLine(x | x); //1 | 1 = 1 ⇒ True
        Console.WriteLine(x | y); //1 | 0 = 1 ⇒ True
        Console.WriteLine(y | y); //0 & 0 = 0 ⇒ False
        Console.WriteLine(); //改行
        Console.WriteLine(x ^ x); //1 ^ 1 = 0 ⇒ False
        Console.WriteLine(x ^ y); //1 ^ 0 = 1 ⇒ True
        Console.WriteLine(y ^ y); //0 ^ 0 = 0 ⇒ False
    }
}

p.94 代入演算子(及び複合代入演算子)

・代入の「=」記号は、実は2項=演算子で、優先度が低いが用途のバリエーションは多い
・主に四則演算と代入の組み合わせで「● = ● 演算子 式や値」となる場合に、簡略記述に用いられるのが複合代入演算子で、
 「● 演算子= 式や値」とできる。
・例: x = x + 10; ⇒ x += 10、y = y * 5; ⇒ y *= 5;

p.94 代入演算子(暗黙の型変換)

・同種だが型が異なる変数などへの代入では、左辺より、右辺の対象範囲が広い場合、暗黙の型変換を起こり、問題なく代入される
 例: short s = 5; int i; i = s; //暗黙の型変換が起こり、int型に拡大変換されたsがiに代入される
・拡大変換を丸暗記する必要はないが、実数型から整数型へは不可で、整数型から実数型へは基本的に可能。

p.97 演算子の優先順位

・演算子の優先順位は丸暗記の必要はなく、優先順位が特殊な式ではカッコで優先度を明示すると良い
・なお、代入演算子、複合代入演算子が優先順位最下位であることは意識しておくと良い

p.97 演算子の結合規則

・同じ優先度の演算子が複数並ぶ場合、基本的には左から評価する。これを「左から右への結合」という
 ※ C/C++では「左結合」という
・一部の演算子では「右から左への結合」があり、最も有名なのは代入演算子。
 例: a = b = 5; //5をbに代入し、その評価値である5をaに代入(結果的にaとbに5を代入したことになる)
  つまり「a = (b = 5);」と同じ意味。

※ p.100 練習問題は自由参加課題とします

今週の話題

販売本数ランキング 今回トップは「桃太郎電鉄ワールド ~地球は希望でまわってる!~(Switch)」GO!
「ハイカジ」へのピボットで業績好調のカヤック、eスポーツ事業は次のステージへ【ゲーム企業の決算を読む】GO!
『UNDERTALE』『ホットライン・マイアミ』のゲームエンジン「Game Maker」非商用利用に限り無償化―1回限りのライセンス購入も可能に GO!
『アクションゲームツクールMV』プレーヤーアプリをオープンソース化―カスタマイズしてゲーム制作の自由度向上へ GO!
マーベラスがインディーゲームクリエイターを支援する「iGi indie Game incubator」の第4期生募集を12月15日より開始―12月19日に説明会も開催 GO!
VR映画「機動戦士ガンダム: 銀灰の幻影」制作決定 フランスの制作会社と共同で GO!

スクエニインサイダー取引事件で有罪判決を受けた社員の知人が490万円の課徴金…社外の人物も不正に取引 GO!
バンダイナムコでまた内部不正 廃棄庫から商品持ち出し、8700万円の利益 8年間気付かず GO!

前回のコメント

・論理演算子の情報量がすごくて覚えるのが大変そう

 たしかに、いろいろとありますが、まずは、良く使う構文を理解してください。

・条件演算子の多分岐構文を理解するのが難しかった

 カッコだらけで複雑に見えますが、次の教程でif文を学習してから戻るとわかりやすくなります。
 粘り強く学習してみてください。

講義メモ 後半

p.88 関係演算子

・2項の大小関係を論理型(p.57)で返す演算子群で、trueまたはfalseを返す
・「==」「!=」「>=」「<=」は間にスペースが入るとエラーなので注意
・「!=」「>=」「<=」はイコールが前にくるとエラーなので注意

ミニ演習 mini088a.cs

・int i = 3 と double d = 3.0 が2項==演算子で比較できるかどうか、出来る場合はその結果を表示しよう
・decimal m = 3M と double d = 3.0 が2項!=演算子で比較できるかどうか、出来る場合はその結果を表示しよう ⇒ できない
・decimal m = 3M と int i = 3 が2項<=演算子で比較できるかどうか、出来る場合はその結果を表示しよう
・bool t = true と bool f = false が2項!=演算子で比較できるかどうか、出来る場合はその結果を表示しよう
・bool t = true と bool f = false が2項<=演算子で比較できるかどうか、出来る場合はその結果を表示しよう ⇒ できない

作成例

//ミニ演習 mini088a.cs
using System;
class increment02
{
    public static void Main()
    {
        int i = 3;
        double d = 3.0;
        Console.WriteLine("i == d :{0}", i == d); //Trueになる
        decimal m = 3M;
        //Console.WriteLine("m != d :{0}", m != d); //doubleとdecimalの比較はできず、エラーになる
        Console.WriteLine("m <= i :{0}", m <= i); //Trueになる
        bool t = true, f = false;
        Console.WriteLine("t != f :{0}", t != f); //Trueになる
        //Console.WriteLine("t <= f :{0}", t <= f); //boolとboolの大小比較はできず、エラーになる
    }
}

p.88 条件演算子

・C#では唯一の3項演算子で、分岐構造を表現できる演算子
・構文は「● ? ■ : ▲」で●にはbool型の値または式を書き、これがTrueなら■を、Falseなら▲を返す
 例:「(a > b) ? a : b」とすると、aとbの大きい方の値が得られる(等しい場合はb)
 例:「(a < b) ? a : b」とすると、aとbの小さい方の値が得られる(等しい場合はb)

ミニ演習 mini088b.cs

・2つの実数値を入力して大きい方を表示しよう

作成例

//ミニ演習 mini088b.cs
using System;
class increment02
{
    public static void Main()
    {
        Console.Write("実数1:"); double a = double.Parse(Console.ReadLine()); 
        Console.Write("実数2:"); double b = double.Parse(Console.ReadLine()); 
        Console.WriteLine("大きい方は{0}", (a > b) ? a : b);
    }
}

ミニ演習 mini088c.cs

・2つの実数値を入力して差(大きい方-小さい方)を表示しよう

作成例

//ミニ演習 mini088c.cs
using System;
class increment02
{
    public static void Main()
    {
        Console.Write("実数1:"); double a = double.Parse(Console.ReadLine()); 
        Console.Write("実数2:"); double b = double.Parse(Console.ReadLine()); 
        Console.WriteLine("差は{0}", (a > b) ? a - b : b - a);
    }
}

p.88 条件演算子(つづき)

・条件演算子の第2、3項には式が書けるので、ここに条件演算子を記述することで多分岐構文を記述できる
・例: (a >= 80) ?  "優" : ((a >= 60) ? "可" : "不可"));
・例: (a == b) ? ((a == c) ? "abcは等しい" : "等しくない")) : "等しくない"); 
・例: (a != b) ?  "等しくない" : ((a == c) ? "abcは等しい" : "等しくない"));

ミニ演習 mini088d.cs

・3つの実数値を入力して最大値を表示しよう
ヒント
・a >  b ならば、aとcの大きい方が最大値
・a <= b ならば、bとcの大きい方が最大値
⇒a >  b ならば、aとcの大きい方が最大値、でなければ、bとcの大きい方が最大値

作成例

//ミニ演習 mini088d.cs
using System;
class increment02
{
    public static void Main()
    {
        Console.Write("実数1:"); double a = double.Parse(Console.ReadLine()); 
        Console.Write("実数2:"); double b = double.Parse(Console.ReadLine()); 
        Console.Write("実数3:"); double c = double.Parse(Console.ReadLine()); 
        Console.WriteLine("最大は{0}", (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c));
    }
}

p.89 論理関係演算子・否定演算子

・2つのbool値を返す式の間に置いて、bool値を返す演算
・2項&&演算子:両方がtrueならtrueを、でければfalseを返す。論理積、「かつ」「AND」ともいう
 例: (a > 0 && b > 0) ? "aもbも正の数" : "どちらかは正の数ではない"
・2項||演算子:両方がfalseならfalseを、でければtrueを返す。論理和、「または」「OR」ともいう
 例: (a > 0 || b > 0) ? "aとbのどちらかまたは両方が正の数" : "どちらも正の数ではない"
・単項!演算子:値や式がtrueならfalseを、でければtrueを返す。否定、「NOT」ともいう
 例: !(a > 0) ? "aは正の数じゃない" : "aは正の数"
・単項!演算子は複雑な条件式を反転したい場合に用いる
 例: !(a > 0 && b > 0) ? "「aもbも正の数」ではない" : "aもbも正の数"
・単項!演算子は単純にbool型の変数値を反転したい場合にも便利 bool a = true, b = !a;

p.89 ビット論理演算子

・値を2進数表現にして、ビットごとに計算した結果によるビット列を返す
・2項&演算子:両方が1なら1を、でければ0を返す。
・2項|演算子:両方が0なら0を、でければ1を返す。
・2項^演算子:同じなら0を、でければ1を返す。別名:排他的論理和
・単項~演算子:全ビットを反転した結果を返す。別名:(1の)補数

p.90(短絡評価)

・2項&&演算子と2項||演算子のもつ、途中で結果が確定したときは先に進むという特長のこと
・これにより、無駄な動作の除外が可能
・例:「多くの計算① && 多くの計算②」とすると、多くの計算①がfalseなら②は実行せずにfalse確定
・例:「多くの計算① || 多くの計算②」とすると、多くの計算①がtrueなら②は実行せずにtrue確定
・これにより、異常終了の回避が可能
・例:「a != 0 && 5 / a > 2」とすると、もしもaが0だと「5 / a」は異常終了するが、
 「a != 0」がfalseになるので「5 / a」は実行されない=異常終了の回避が可能

提出:ミニ演習 mini088d.cs

講義メモ

・p.81「add01.cs」から再開します。

p.81 算術演算子(再掲載)

・すでに学習した2項+演算子、2項-演算子、2項*演算子、2項/演算子で加減乗除算が可能
・加えて、2項%演算子(剰余算 p.84)、単項++演算子(インクリメント p.85)、単項--演算子(デクリメント p.85)がある
・2項+演算子は加算と結合の2つの演算が可能で、これを演算子のオーバーロード(多重定義)という
・2項+演算子は、2項の両方が加算可能であれば加算し、どちらかまたは両方が文字列ならば連結する

p.81 add01.cs

//p.81 add01.cs
using System;
class add01
{
    public static void Main()
    {
        Console.WriteLine(3 + 6); //加算になり9
        Console.WriteLine(3.0 + 6); //加算になり9.0だが表示は9
        Console.WriteLine("3.5" + 6); //連結になり"3.56"
        Console.WriteLine(3.5 + "6"); //連結になり"3.56"
        Console.WriteLine(); //改行
        Console.WriteLine("(3.0 + 6)の型は{0}", (3.0 + 6).GetType()); //9.0だからDouble型
        Console.WriteLine("文字列3.5 + intの6の型は{0}", ("3.5" + 6).GetType()); //"3.56"だからString型
        Console.WriteLine("doubleの3.5 + 文字列6の型は{0}", (3.5 + "6").GetType()); //同上
    }
}

p.82(型の異なる数値型の加算)

・基本的に範囲の大きい方の型に合わせてから加算する。
 例:double d = 3.14; int i = 5; d = i + d; とすると内部的には d = (double)i + d; となる
・ただし、decimal型は例外で、誤差が前提であるdouble/float型からの変換は不可

p.83(整数除算)

・2項/演算子による除算は整数型にも実数型にも対応しているが「整数 / 整数」は整数商(小数点以下切捨て)なので注意

p.83 division01.cs

//p.83 division01.cs
using System;
class division01
{
    public static void Main()
    {
        Console.WriteLine("10 / 3 = {0}", 10 / 3); //3.33なので小数点以下切捨てで3
        Console.WriteLine("(10 / 3)の型は{0}", (10 / 3).GetType()); //整数(int)なのでInt32
        Console.WriteLine("10 / 3.0 = {0}", 10 / 3.0); //3.33がそのまま表示
        Console.WriteLine("(10 / 3.0)の型は{0}", (10 / 3.0).GetType()); //実数(double)なのでDouble
    }
}

p.84 剰余演算子

・2項%演算子で、C#では実数除算にも対応している(C,C++,Java等では非対応)
・式「a / b = c … d」は「a = b * c + d」であることを示す
 例: 13.53÷2.5=5…1.03 なので 13.53 % 2.5 = 1.03 であり、13.53 = 2.5 * 5 + 1.03

p.84 mod01.cs

//p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.WriteLine("10 % 3 = {0}", 10 % 3); //10÷3=3…1 なので 1
        Console.WriteLine("13.53 % 2 = {0}", 13.53 % 2); //13.53÷2=6…1.53 なので 1.53
        Console.WriteLine("13.53 % 2.5 = {0}", 13.53 % 2.5); //13.53÷2.5=5…1.03 なので 1.03
    }
}

アレンジ演習:p.84 mod01.cs

・金種計算を行おう
・画面から金額を整数で受け取り(int.Parseで整数化)
・100円玉、50円玉、10円玉、5円玉、1円玉で各何枚かを表示したい。
・ただし、合計枚数が最小になること
ヒント
・①100円玉の枚数:入力金額÷100の整数商
・② 50円玉の枚数:(入力金額ー100×①)÷50の整数商
・③ 10円玉の枚数:(入力金額ー100×①ー50×②)÷10の整数商
・④  5円玉の枚数:(入力金額ー100×①ー50×②ー10×③)÷5の整数商
・⑤  1円玉の枚数:入力金額を5で割った余り

作成例 その1

//p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.Write("金額:"); int n = int.Parse(Console.ReadLine());
        int x100 = n / 100;
        int  x50 = (n - x100 * 100) / 50;
        int  x10 = (n - x100 * 100 - x50 * 50) / 10;
        int   x5 = (n - x100 * 100 - x50 * 50 - x10 * 10) / 5;
        Console.WriteLine("100円玉 = {0}枚", x100);
        Console.WriteLine(" 50円玉 = {0}枚", x50);
        Console.WriteLine(" 10円玉 = {0}枚", x10);
        Console.WriteLine("  5円玉 = {0}枚", x5);
        Console.WriteLine("  1円玉 = {0}枚", n % 5);
    }
}

作成例 その2

//p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.Write("金額:"); int n = int.Parse(Console.ReadLine());
        int sum = 0; //払い出し済みの金額
        int x100 =  n        / 100; sum =      x100 * 100;
        int  x50 = (n - sum) /  50; sum = sum + x50 *  50;
        int  x10 = (n - sum) /  10; sum = sum + x10 *  10;
        int   x5 = (n - sum) /   5; sum = sum +  x5 *   5;
        Console.WriteLine("100円玉 = {0}枚", x100);
        Console.WriteLine(" 50円玉 = {0}枚", x50);
        Console.WriteLine(" 10円玉 = {0}枚", x10);
        Console.WriteLine("  5円玉 = {0}枚", x5);
        Console.WriteLine("  1円玉 = {0}枚", n % 5);
    }
}

作成例 その3

//p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.Write("金額:"); int n = int.Parse(Console.ReadLine());
        Console.WriteLine("100円玉 = {0}枚", n       / 100);
        Console.WriteLine(" 50円玉 = {0}枚", n % 100 /  50);
        Console.WriteLine(" 10円玉 = {0}枚", n %  50 /  10);
        Console.WriteLine("  5円玉 = {0}枚", n %  10 /   5);
        Console.WriteLine("  1円玉 = {0}枚", n %   5);
    }
}

p.84 インクリメント、デクリメント演算子

・「変数の値に1を加える」ことが多いので「a = a + 1」を「a++」と記述できる
・この「++」をインクリメントという。
・同様に、「a = a - 1」を「a--」と記述でき、「--」をデクリメントという
・インクリメント、デクリメント演算子には前置と後置があり、単独で行うと同じ結果になる
 例: int a = 5; a++; // aは6になる
 例: int a = 5; ++a; // aは6になる
・しかし、評価と加算の順序は異なり、前置は先に加算してから評価、後置は評価してから加算する
 例: int a = 5; Console.Write(a++); // aは6になる、表示は加算前の5
 例: int a = 5; Console.Write(++a); // aは6になる、表示は加算後の6

アレンジ演習:p.86 increment01.cs

・aを2回後置でインクリメントすると、aの値はどうなるか確認しよう
・bを2回前置でインクリメントすると、bの値はどうなるか確認しよう

作成例

//アレンジ演習:p.86 increment01.cs
using System;
class increment01
{
    public static void Main()
    {
        int a = 10;
        Console.WriteLine("1回目で{0}, 2回目で{1}", a++, a++); //aは12になる。「1回目で10, 2回目で11」と表示
        Console.WriteLine(a);   //12
        int b = 10;
        Console.WriteLine("1回目で{0}, 2回目で{1}", ++b, ++b); //bは12になる。「1回目で11, 2回目で12」と表示
        Console.WriteLine(b);   //12
    }
}

p.87 increment02.cs

//p.87 increment02.cs
using System;
class increment02
{
    public static void Main()
    {
        double a = 1.25;
        decimal d = -12.3M;
        Console.WriteLine(++a); //2.25になる
        Console.WriteLine(--d); //-13.3Mになる(表示は-13.3)
    }
}

アレンジ演習:p.87 increment02.cs

・int m = int.MaxValue に対して、++m するとどうなるか確認しよう
・uint u = 0; に対して、--u するとどうなるか確認しよう

作成例

//アレンジ演習:p.87 increment02.cs
using System;
class increment02
{
    public static void Main()
    {
        double a = 1.25;
        decimal d = -12.3M;
        Console.WriteLine(++a); //2.25になる
        Console.WriteLine(--d); //-13.3Mになる(表示は-13.3)
        int m = int.MaxValue; //【以下追加】
        uint u = 0;
        Console.WriteLine(++m); //-2147483648(int.MinValue)になる
        Console.WriteLine(--u); //4294967295(uint.MaxValue)になる
    }
}