今週の話題

販売本数ランキング 今回トップは「スーパーマリオブラザーズ ワンダー(Switch)」GO!
インディーゲーム展示会“東京ゲームダンジョン4”の入場チケットが販売開始。出展する250団体の出展リストを公開 GO!
『スクフェス2』がまさかの大失速―ブシロードはゲーム事業の苦境が鮮明に【ゲーム企業の決算を読む】 GO!
テーマは「脱出」―Unreal Engine使用映像制作コンテスト「UE5ぷちコン 映像編5th」エントリー受付開始 GO!
AI活用でプレイヤーサポート強化を支援―PTW、ゲームパブリッシャー向けソリューション「REACT」を発表 GO!
個性を引き出すモデリングから内製バーチャル広報による社内活性化まで―『このファン』サムザップがLive2D活用事例を紹介【alive 2023】 GO!

『Marvel’s Spider-Man』等開発のInsomniac Gamesにサイバー攻撃―開発中新作の情報流出も? GO!
開発スタジオ閉鎖の『The Day Before』販売も即座に中止…わずか4日間しか買えなかったゲームに、ユーザーからの「売り逃げ」の声も GO!
GooglePlayストア「独占的な力あり」とEpic対Googleの米裁判で陪審判決!具体的な措置命令は1月第2週の公聴会以降に持ち越し GO!

講義メモ 第6章 配列

p.133 配列とは

・データの全てに変数名を付けるのではなく、同じ型のデータをグループにして名前を付け、何番目かを指定して用いる仕掛けが配列
・グループの名前を配列名、何番目かを指定する番号を添字、インデックスという
・また、配列を構成するデータ1つずつを要素という
・利用には変数と同様に、定義が必要だが、その前に配列名を宣言する必要があり、データ型も明示する
・宣言書式: 型[] 配列名;
・例: string[] monstername;
・配列の定義(生成)は変数の場合と同様に必要な領域の確保なので、要素何個分かも明示する
・定義(生成)書式: 配列名 = new 型[要素数];
・例: monstername = new string[100]; //モンスター100体分の配列を定義(生成)
・配列の宣言と定義(生成)はまとめて行うことも可能
・宣言と定義(生成)の書式: 型[] 配列名 = new 型[要素数];
・例: string[] monstername = new string[100];
・要素へのアクセスは、配列名[添字]で行う。添字は0から要素数-1までなので注意。
・例: monstername[0] = "ヴェルドラ"; monstername[1] = "リムル";
・変数の初期化と同様に、配列の宣言と初期値の設定を同時にすることが可能で、この時、初期値の数だけ要素が作られるので要素数は
 指定不要
・初期化の書式: 型[] 配列名 = {初期値①, 初期値②, …};
・例: string[] monstername = {"ヴェルドラ", "リムル"}; //要素数は2になる
・配列はオブジェクト(後述)として扱われるので、プロパティ(後述)の仕掛けを持っている。これにより、配列名.Length とすることで、
 要素数が得られる

p.136 average02.cs

//p.136 average02.cs
using System;
class average02 {
    public static void Main() {
        int[] point = {70, 80, 50}; //int型の配列pointを3要素で初期化
        int sum = 0, no; //合計、要素数
        no = point.Length; //プロパティで配列の要素数を得る
        for (int i = 0; i < no; i++) { //iを0から要素数未満まで=全要素について繰返す
            sum += point[i]; //i番の要素の値をsumに足し込む
        }
        double average = (double)sum / no; //合計を件数で割って平均値を得る
        Console.WriteLine("合計 = {0}, 平均 = {1:##.#}", sum, average); //合計値と平均値(小数点以下1桁)を表示
    }
}

提出:アレンジ演習:p.136 average02.cs

・配列の3要素の値をコンソールから入力するようにしよう
・ヒント① 配列の初期化ではなく宣言と生成にする 
 例:int[] point = new int[3];
・ヒント② コンソールからの入力は繰返しの中(sumに足し込む前)で行うと良い
・ヒント③ 配列の要素は変数と同様に扱えるので、コンソールからの入力を要素に代入する
 例:Console.Write("{0}番:", i); point[i] = int.Parse(Console.ReadLine());

講義メモ

・p.122「while文とdo while文」から

補足:p.121 sin01.csの実行方法・改

・現在のバージョンのVisual Studioでは1ページ分以上の表示を一気に行うと欠けが発生してしまうことがある
・そこで「ビルド」「ソリューションのビルド」を行ってから、「ツール」「コマンドライン」「開発者用コマンドプロンプト」を用いると良い
・ここで、プログラムのあるプロジェクトのフォルダの中のbin/debugフォルダにある.exeファイルを指定して
 「プロジェクト名\bin\Debug\プロジェクト.exe」と入力すると動作する
例:「E:\ha234_C#_akiba\chap4>」に対して「chap4\bin\Debug\chap4.exe」を入力しEnter
・なお、実行確認後「X」で閉じること

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

・サイン値の表示がすべて「.00000」から「.99999」の5桁になるようにしよう
・「{0,7:#.#####}:」を「{0,7:#.00000}:」とすれば良い

作成例

//アレンジ演習:p.121 sin01.cs
using System;
class sin01
{
    public static void Main()
    {
        double s; //カウンタとして用いる実数
        //0.0度から180度(Math.PI)まで4度(Math.PI / 45.0)ずつ増やしながら繰返す
        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桁で表示
            //サイン値0.2につき"*"を1個表示することでグラフを描く
            for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍(小数点以下四捨五入)だけ繰返す
                Console.Write("*"); //"*"を1個表示(改行しない)
            }
            Console.WriteLine(); //1行分終わったので改行
        }
    }
}

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

・SinをCos(コサイン)にしよう
・Sinは0度から180度まで全て正の数だが、Cosは90度から180度までは負の数(-1まで)になる
・そこで、Cos値に+1して正の数0から2までにしよう
・そして「サイン値0.2につき"*"を1個表示」を「コサイン値0.4につき"*"を1個表示」とすれば良い

作成例

//アレンジ演習:p.121 sin01.cs・続き
using System;
class sin01
{
    public static void Main()
    {
        double s; //カウンタとして用いる実数
        //0.0度から180度(Math.PI)まで4度(Math.PI / 45.0)ずつ増やしながら繰返す
        for (double a = 0.0; a <= Math.PI; a += Math.PI / 45.0) {
            s = Math.Cos(a); //コサイン値を得る
            Console.Write("{0,7:#.00000}:", s); //7桁の小数点以下5桁で表示
            //コサイン値0.4につき"*"を1個表示することでグラフを描く
            for (int i = 1; i <= Math.Round((s + 1) * 25); i++) { //コサイン値+1の25倍(小数点以下四捨五入)だけ繰返す
                Console.Write("*"); //"*"を1個表示(改行しない)
            }
            Console.WriteLine(); //1行分終わったので改行
        }
    }
}

p.122 while文

・for文を継続条件のみのシンプルな形式にしたものがwhile文
・よって、for文で書ける繰り返しは、全てwhile文に置き換え可能
・主に、回数指定の繰返しはfor文で、回数指定ではなく条件によっては1度も繰返さない可能性がある場合はwhile文で書くと良い
・例:活きているモンスターがいる間繰返す(いなければ繰り返しゼロ=なにもしない)
・書式: while(継続条件) { 繰り返し内容 }
・よって、for(初期処理①, 継続条件②, 毎回最後の処理③) {繰返し内容④} は、whileにすると、
 初期処理①; while(継続条件②) { 繰返し内容④; 毎回最後の処理③ } となる
・for文もwhile文も繰返し内容が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);
            i++;
        }
    }
}

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

・for文で書き直そう

作成例

//アレンジ演習:p.124 while01.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);
        }
    }
}

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

・for文を用いて「for(;;)」としても無限ループになるが「while(true)」としても良い
※ どちらを使うかチームルールで決めることが多い
・なお、C/C++では「while(1)」という文法でも無限ループに出来るがC#では禁止

p.125 menu01.cs

//p.125 menu01.cs
using System;
class menu01 {
    public static void Main() {
        bool bEnd = false; //終了フラグをオフにしておく
        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":
                    bEnd = true; //終了フラグをオンにする
                    break; //switch構造を抜ける(必須)
                case "1":
                    Console.WriteLine("ファイルが選択されました");
                    break; //switch構造を抜ける(必須)
                case "2":
                    Console.WriteLine("編集が選択されました");
                    break; //switch構造を抜ける(必須)
                default:
                    Console.WriteLine("入力に間違いがあります");
                    break; //switch構造を抜ける(必須)
            }
            Console.WriteLine(); //改行
            if (bEnd) { //終了フラグがオン?
                Console.WriteLine("それでは、このプログラムを終了します");
                break; //whileループから脱出する
            }
        }
    }
}

p.127 do-while文

・if文とwhile文はどちらも1回目の繰り返しの前に継続するか判断するので、1度も行わない場合がある処理では便利
・これらを前判定繰返しという
・対して1回目の繰り返しの後に継続するか判断するのが後判定繰り返しで、do-while文がある
・よって「やってみないと繰返すかどうか決まらない」場合に便利
・また「適切な値が入力されるまで繰返す」場合にも便利
・書式:
 do { //繰り返し開始
  繰り返し内容
 } while(継続条件); ←セミコロンが必須(while文と区別するためにも必要)

p.128 do_while01.cs

//p.128 do_while01.cs
using System;
class do_while01 {
    public static void Main() {
        int i = 10;
        do { //繰り返し開始
            Console.WriteLine("i = {0}", i);
        } while (i > 20); //継続条件(20超ならば繰返す)
    }
}

アレンジ演習:p.128 do_while01.cs

・コンソールから整数を入力することを正の数(0超)が得られるまで繰返すプログラムに書き換えよう

作成例

//アレンジ演習:p.128 do_while01.cs
using System;
class do_while01 {
    public static void Main() {
        int i;
        do { //繰り返し開始
            Console.Write("i = "); i = int.Parse(Console.ReadLine());
        } while (i <= 0); //継続条件(0以下ならば繰返す)
    }
}

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

・whileの代わりにdo whileにしてみよう

作成例

//アレンジ演習:p.125 menu01.cs
using System;
class menu01 {
    public static void Main() {
        string strAns; //do-whileの継続条件に用いるので外で定義
        do { //ループ開始
            Console.WriteLine("***** Menu *****");
            Console.WriteLine("0:終了");
            Console.WriteLine("1:ファイル");
            Console.WriteLine("2:編集");
            Console.WriteLine("****************");
            Console.Write("選択---- ");
            strAns = Console.ReadLine();
            switch (strAns) {
                case "0":
                    Console.WriteLine("それでは、このプログラムを終了します");
                    break; //switch構造を抜ける(必須)
                case "1":
                    Console.WriteLine("ファイルが選択されました");
                    break; //switch構造を抜ける(必須)
                case "2":
                    Console.WriteLine("編集が選択されました");
                    break; //switch構造を抜ける(必須)
                default:
                    Console.WriteLine("入力に間違いがあります");
                    break; //switch構造を抜ける(必須)
            }
            Console.WriteLine(); //改行
        } while(strAns != "0"); //終了が選ばれていない間、繰返す
    }
}

p.128 goto文

・通常、業務においては利用が禁止されているか、推奨されないので割愛

p.130 continue文

・break文を繰り返しの中(ただしcaseの中を除く)に記述すると、繰り返しを中止できる。
・対して、今回の繰り返しの残り部分をスキップし、次の繰り返しに進むのがcontinue(続行)文
・主に、繰り返しの中にif文などを用いた複雑な分岐がある場合に用いる
・単純な内容であれば、if文で書いた方がわかりやすいことが多い

p.130 continue01.cs

//p.130 continue01.cs --- 0から100未満の2の倍数の合計を求める
using System;
class continue01 {
    public static void Main() {
        int sum = 0; //合計用
        for (int i = 0; i < 100; i++) { //0から100未満について繰返す
            if (i % 2 == 0) { //iを2で割って余りが0かどうか(偶数かどうか)
                sum += i;
            } else { //iが奇数の場合
                continue; //後続の処理をスキップして次の繰返しへ
            }
            //iが奇数の場合はcontinueされるので次の行は実行されない
            Console.WriteLine("i = {0, 2}, sum = {1, 4}", i, sum);
        }
        Console.WriteLine("合計は {0}です", sum);
    }
}

アレンジ演習:p.130 continue01.cs

・「continue;」を用いずに同じ処理になるようにしよう

作成例

//アレンジ演習:p.130 continue01.cs --- 0から100未満の2の倍数の合計を求める
using System;
class continue01 {
    public static void Main() {
        int sum = 0; //合計用
        for (int i = 0; i < 100; i++) { //0から100未満について繰返す
            if (i % 2 == 0) { //iを2で割って余りが0かどうか(偶数かどうか)
                sum += i;
                Console.WriteLine("i = {0, 2}, sum = {1, 4}", i, sum);
            }
        }
        Console.WriteLine("合計は {0}です", sum);
    }
}

p.132 練習問題1 ヒント

・BMI=体重÷(身長×身長)なので、これが22となる体重は:
 22=体重÷(身長×身長) ⇒ 体重=22×身長×身長 で得られる
・ただし、この身長はメートル単位なので、センチメートル単位にする必要がある
・よって、体重=22×(身長cm÷100)×(身長cm÷100)
・この式に身長を160cmから180cmについてインクリメントしながら繰り返し、身長と体重を表示すれば良い
・for文にして、初期処理を「身長←160」、継続条件を「身長≦180」、繰返し後処理を「身長++」、
 処理内容を「身長と体重=22×(身長cm÷100)×(身長cm÷100)を表示」とすれば良い
・身長と体重はdouble型が適切

作成例

//p.132 練習問題1
using System;
class continue01 {
    public static void Main() {
        for (double height = 160; height <= 180; height++) { //身長160から180について繰返す
            double weight = 22 * (height / 100) * (height / 100); //この身長でBMI22な体重を得る
            Console.WriteLine("身長 = {0}, 体重 = {1}", height, weight);
        }
    }
}

p.132 練習問題2 ヒント

・コンソールから整数nを入力することを繰返し、1以上の値が入力されたら抜ける。(do-whileが良い)
・合計用の変数sumを0で初期化しておく
・カウント用の変数iの初期値を1にして、n以下である間、+1しながら、(forが良い)
 ・sumに変数iの初期値を足し込む
・繰り返しを終えたら、sumの値を表示しよう

作成例

//p.132 練習問題2
using System;
class ex0502 {
    public static void Main() {
        int n, sum = 0; //入力用と合計用の変数
        do {
            Console.Write("1以上の整数:"); n = int.Parse(Console.ReadLine());
        } while (n < 1); //1未満である間、繰返す(やりなおす)
        for (int i = 1; i <= n; i++) { //カウント用の変数iの初期値を1にして、n以下である間、+1しながら繰返す
            sum += i; //合計に足し込む
        }
        Console.WriteLine("合計 = {0}", sum);
    }
}

今週の話題

販売本数ランキング 今回トップは「ドラゴンクエストモンスターズ3 魔族の王子とエルフの旅(Switch)」GO!
“ゲームアワード 2023”受賞作まとめ。『バルダーズ・ゲート3』がGOTYを始め6冠に。『Alan Wake 2』は3部門で受賞【The Game Awards】GO!
1200作品から選ばれた14作品―「ゲームクリエイター甲子園 2023」総合大賞ファイナリスト14作品発表 GO!
任天堂/ハピネット等新たなスポンサー4社が参加―「Indie Developers Conference 2023」セッション/ライトニングトークのタイムテーブル発表 GO!
Best Esports Gameは『Valorant』が受賞!選手やコーチなどeスポーツ関連一斉発表【TGA2023】GO!

有料Modのサポートを開始した『スカイリム』完全新作のみを取り扱い、AI生成物の使用は禁止に GO!
「Nintendo Live 2024 TOKYO」が執拗な脅迫行為により中止に…『スプラ3』バンカライブや『ゼルダ』コンサートなどが予定されていた GO!
2年半に渡る『Destiny2』不正行為巡るBungieとチート販売業者の訴訟が来週陪審裁判へ―議論の焦点は「著作権」にあり GO!

講義メモ 後半

p.119 forループのネスト

・for文の中にfor文を記述できる。これもネスト(入れ子)という
・繰返し文の中に繰返し文を書くことで2重ループが実現する
・forループのネストはN回×M回の繰り返しに便利で、2次元の情報を扱う時に用いることが多い
・主に、外側の繰り返しの用のカウンタにはiを、内側の繰り返しの用のカウンタにはjを使うことが多い
・なお、カウンタを同じ変数にすると想定外の動作になる(通常、無限ループする)ので注意
・実行イメージ
 for(int i = 0①; i < 3②; i++⑦) {
  for(int j = 0③; j < 2④; j++⑥) {
   Console.Write("[{0},{1}]", i, j);⑤
  }
 }
 ①②③④⑤[0,0] ⑥④⑤[0,1] ⑥④⑦②③④⑤[1,0] ⑥④⑤[1,1] ⑥④⑦②③④⑤[2,0] ⑥④⑤[2,1] ⑥④⑦②

p.119 kuku01.cs

//p.119 kuku01.cs
using System;
class kuku01
{
    public static void Main()
    {
        int i, j; //外側用カウンタ、内側用カウンタ
        for (i = 1; i <= 9; i++) { //外側用カウンタで1,2,3,4,5,6,7,8,9について繰返す
            for (j = 1; j <= 9; j++) { //内側用カウンタで1,2,3,4,5,6,7,8,9について繰返す
                Console.WriteLine("{0} * {1} = {2}", i, j, i * j);
            }
            Console.WriteLine("------------"); //段の区切りを表示
        }
    }
}

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

・式を略して、積だけを段ごとに表示し、段の後ろで改行しよう(段の区切りの代わりに改行)
・積は3桁で表示すること
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  :(略)

作成例

//アレンジ演習:p.119 kuku01.cs
using System;
class kuku01
{
    public static void Main()
    {
        int i, j; //外側用カウンタ、内側用カウンタ
        for (i = 1; i <= 9; i++) { //外側用カウンタで1,2,3,4,5,6,7,8,9について繰返す
            for (j = 1; j <= 9; j++) { //内側用カウンタで1,2,3,4,5,6,7,8,9について繰返す
                Console.Write("{0, 3}", i * j); //積を3桁表示し改行しない
            }
            Console.WriteLine(); //段の区切りで改行
        }
    }
}

p.121(Mathクラス)

・C#が提供する算術系クラス(情報の構造体の一種で詳細は7章で)の一つがMathで、その中に算術計算に便利なメソッドや定数などが用意されて
 いる
・利用には「Math.」を前置する。
・定数Math.PI:円周率を提供する定数(double型)
・メソッドMath.Sin(ラジアン値):サインを返すメソッド(double型)。カッコ内に角度を表すラジアン値をdouble型で指定する
※ メソッドの呼び出しにおいてカッコ内に指定する値や式を引数という(後述)
・ラジアン値は180度を円周率とした値で、n度のラジアン値は n / 180 * Math.PI で得られる
※ sin01.csでは4度のラジアン値を 4÷180×円周率 ⇒ Math.Pi / 45.0 として扱っている
※ そして、0度から180度まで4度ずつ繰返すfor文になっている
・メソッドMath.Round(実数):小数点以下を四捨五入した結果を返すメソッド(double型)。
 例: Math.Round(3.8) ⇒ 4.0 となる

p.121 sin01.cs

//p.121 sin01.cs
using System;
class sin01
{
    public static void Main()
    {
        double s; //カウンタとして用いる実数
        //0.0度から180度(Math.PI)まで4度(Math.PI / 45.0)ずつ増やしながら繰返す
        for (double a = 0.0; a <= Math.PI; a += Math.PI / 45.0) {
            s = Math.Sin(a); //サイン値を得る
            Console.Write("{0,7:#.#####}:", s); //7桁の小数点以下5桁で表示
            //サイン値0.2につき"*"を1個表示することでグラフを描く
            for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍(小数点以下四捨五入)だけ繰返す
                Console.Write("*"); //"*"を1個表示(改行しない)
            }
            Console.WriteLine(); //1行分終わったので改行
        }
    }
}

補足:p.121 sin01.csの実行方法

・現在のバージョンのVisual Studioでは1ページ分以上の表示を一気に行うと欠けが発生してしまう
・そこで「ビルド」「ソリューションのビルド」までをVisual Studioで行い、実行はコマンドプロンプトで行うと良い
・コマンドプロンプトは「すべてのアプリ」「Windowsツール」にあるのでダブルクリック
・ここで、プログラムのあるプロジェクトのフォルダの中のbin/debugフォルダにある.exeファイルを指定する
例:E:\ha234_C#_akiba\chap4\chap4\bin\Debug\chap4.exe
・実行例:

C:\Users\human>E:\ha234_C#_akiba\chap4\chap4\bin\Debug\chap4.exe
       :
 .06976:***
 .13917:*******
 .20791:**********
 .27564:**************
 .34202:*****************
 .40674:********************
 .46947:***********************
 .52992:**************************
 .58779:*****************************
 .64279:********************************
 .69466:***********************************
 .74314:*************************************
 .78801:***************************************
 .82904:*****************************************
 .86603:*******************************************
 .89879:*********************************************
 .92718:**********************************************
 .95106:************************************************
  .9703:*************************************************
 .98481:*************************************************
 .99452:**************************************************
 .99939:**************************************************
 .99939:**************************************************
 .99452:**************************************************
 .98481:*************************************************
  .9703:*************************************************
 .95106:************************************************
 .92718:**********************************************
 .89879:*********************************************
 .86603:*******************************************
 .82904:*****************************************
 .78801:***************************************
 .74314:*************************************
 .69466:***********************************
 .64279:********************************
 .58779:*****************************
 .52992:**************************
 .46947:***********************
 .40674:********************
 .34202:*****************
 .27564:**************
 .20791:**********
 .13917:*******
 .06976:***

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

・サイン値の表示がすべて「.00000」から「.99999」の5桁になるようにしよう
・「{0,7:#.#####}:」を「{0,7:#.00000}:」とすれば良い
・実行結果

C:\Users\human>E:\ha234_C#_akiba\chap4\chap4\bin\Debug\chap4.exe
 .00000:
 .06976:***
 .13917:*******
 .20791:**********
 .27564:**************
 .34202:*****************
 .40674:********************
 .46947:***********************
 .52992:**************************
 .58779:*****************************
 .64279:********************************
 .69466:***********************************
 .74314:*************************************
 .78801:***************************************
 .82904:*****************************************
 .86603:*******************************************
 .89879:*********************************************
 .92718:**********************************************
 .95106:************************************************
 .97030:*************************************************
 .98481:*************************************************
 .99452:**************************************************
 .99939:**************************************************
 .99939:**************************************************
 .99452:**************************************************
 .98481:*************************************************
 .97030:*************************************************
 .95106:************************************************
 .92718:**********************************************
 .89879:*********************************************
 .86603:*******************************************
 .82904:*****************************************
 .78801:***************************************
 .74314:*************************************
 .69466:***********************************
 .64279:********************************
 .58779:*****************************
 .52992:**************************
 .46947:***********************
 .40674:********************
 .34202:*****************
 .27564:**************
 .20791:**********
 .13917:*******
 .06976:***

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

講義メモ

・「【補足】if文等のネスト」の実例を示してから、p.115「for文」に進みます

【補足】if文等のネスト:再掲載

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

ミニ演習 mini114.cs

・上の例をプログラムにしよう

作成例

//ミニ演習 mini114.cs
using System;
class mini114
{
    public static void Main()
    {
        Console.Write("整数①:"); int n1 = int.Parse(Console.ReadLine()); //整数入力
        if (n1 > 0) { //正の数?
            Console.Write("整数②:"); int n2 = int.Parse(Console.ReadLine()); //整数入力
            if (n2 > 0) { //正の数?(ifのネスト)
                Console.WriteLine("どちらも正");
            }
        }
    }
}

【補足】if文等のネスト:つづき

・if文等のネストでは「else」や「else if」がどの「if」に対するものなのか見間違いやすくなるので注意
・インデントが正しければif-else、if-elseif-elseが高さで判別できる

悪い例:

//ミニ演習 mini114.cs 悪い例
using System;
using System.Diagnostics.Eventing.Reader;

class mini114
{
    public static void Main()
    {
        Console.Write("整数①:"); int n1 = int.Parse(Console.ReadLine()); //整数入力
        if (n1 > 0) { //正の数?
            Console.Write("整数②:"); int n2 = int.Parse(Console.ReadLine()); //整数入力
            if (n2 > 0) { //正の数?(ifのネスト)
                Console.WriteLine("どちらも正");
                } //インデントが正しくないと…
            } //外側のifの終わりのインデントもおかしくなる
            else { //外側のifに対するelseなのだが…
                Console.WriteLine("これはどちらのifのelse?");
        }
    }
}

正しい例

//ミニ演習 mini114.cs 正しい例
using System;
using System.Diagnostics.Eventing.Reader;

class mini114
{
    public static void Main()
    {
        Console.Write("整数①:"); int n1 = int.Parse(Console.ReadLine()); //整数入力
        if (n1 > 0) { //正の数?
            Console.Write("整数②:"); int n2 = int.Parse(Console.ReadLine()); //整数入力
            if (n2 > 0) { //正の数?(ifのネスト)
                Console.WriteLine("どちらも正");
            }
            else { //内側のifに対するelse
                Console.WriteLine("整数①は正の数だが、整数②が正の数ではない");
            }
        }
        else { //外側のifに対するelse
            Console.WriteLine("整数①が正の数ではない");
        }
    }
}

p.115 for文

・C#には4種類の繰り返し構造文があり、主に回数指定繰り返しに向くのがfor文
・構文: for(①前処理; ②継続条件式; ③毎回の末尾で行う処理) { ④繰り返し内容 }
・前処理:繰返し開始前に行うこと。主に回数カウンタのクリアがある。省略可。
・継続条件式:bool型を返す式。主にカウンタの値の上限や下限と比較する文。省略可。
・毎回の末尾で行う処理:繰り返し内容の最後の文の後に行うこと。主にカウントアップやカウントアップ。省略可。
・よって、この繰り返しは① ②④③ ②④③ ②④③ …の順で行われ、②の結果によって中断できる
・例:5回繰返す場合: int i; for(i = 0; i < 5; i++) { 繰り返し内容 }
・なお、繰り返し内容が1文しかない時、{}を省略できるが、推奨されないことも多い

p.115 for01.cs

//p.115 for01.cs
using System;
class for01
{
    public static void Main()
    {
        int i; //カウンタ用の変数
        for (i = 0; i < 5; i++) { //①カウンタを0にする ②カウンタが5未満なら④③を繰返す ④カウントアップ
            Console.WriteLine("i = {0}", i); //③繰り返し内容(初回は"i = 0",2回目は"i = 1"…,5回目は"i = 4")
        }
    }
}

p.115 for01.csの動作について

01. int i; でカウンタ用の変数が宣言される
02. i = 0;① でカウンタ用の変数が0になる
03. i < 5;② ⇒ 0 < 5; でtrueなので繰り返し継続決定
04. Console.WriteLine("i = {0}", i);③ ⇒ Console.WriteLine("i = 0"); で 「i = 0」を表示
05. i++④ でカウンタ用の変数が+1されて1になる
06. i < 5;② ⇒ 1 < 5; でtrueなので繰り返し継続決定
07. Console.WriteLine("i = {0}", i);③ ⇒ Console.WriteLine("i = 1"); で 「i = 1」を表示
08. i++④ でカウンタ用の変数が+1されて2になる
09. i < 5;② ⇒ 2 < 5; でtrueなので繰り返し継続決定
10. Console.WriteLine("i = {0}", i);③ ⇒ Console.WriteLine("i = 2"); で 「i = 2」を表示
11. i++④ でカウンタ用の変数が+1されて3になる
12. i < 5;② ⇒ 3 < 5; でtrueなので繰り返し継続決定
13. Console.WriteLine("i = {0}", i);③ ⇒ Console.WriteLine("i = 3"); で 「i = 3」を表示
14. i++④ でカウンタ用の変数が+1されて4になる
15. i < 5;② ⇒ 4 < 5; でtrueなので繰り返し継続決定
16. Console.WriteLine("i = {0}", i);③ ⇒ Console.WriteLine("i = 4"); で 「i = 4」を表示
17. i++④ でカウンタ用の変数が+1されて5になる
18. i < 5;② ⇒ 5 < 5; でfalseなので繰り返し終了決定

p.116 for02.cs

//p.116 for02.cs
using System;
class for02
{
    public static void Main()
    {
        int i; //カウンタ用の変数
        for (i = 4; i >= 0; i--) { //①カウンタを4にする ②カウンタが0以上なら④③を繰返す ④カウントダウン
            Console.WriteLine("i = {0}", i); //"i = 4","i = 3","i = 2","i = 1","i = 0",の順に表示
        }
    }
}

補足:カウンタ用の変数の初期化の場所について(p.118 最下行)

・カウンタ用の変数をforのブロックの中でのみ用いる場合、forの頭で初期化して良い(予め宣言しなくて良い)
例:
for (int i = 4; i >= 0; i--) { //①カウンタを4にする ②カウンタが0以上なら④③を繰返す ④カウントダウン
    Console.WriteLine("i = {0}", i); //"i = 4","i = 3","i = 2","i = 1","i = 0",の順に表示
}
・このカウンタ用の変数はforを抜けると無効になるので便利だが、forを抜けた後でも利用したい場合は、予め宣言しておくこと
例:
int i;
for (i = 4; i >= 0; i--) { //①カウンタを4にする ②カウンタが0以上なら④③を繰返す ④カウントダウン
    Console.WriteLine("i = {0}", i); //"i = 4","i = 3","i = 2","i = 1","i = 0",の順に表示
}
Console.WriteLine("終了時のi = {0}", i); //-1になる

p.112 forループからの脱出

・forを構成する3要素の内、条件式を省略すると無限ループになる
 ※ すべてを省略して「for (;;)」としてもOKで、無限ループになる
・この場合、繰り返し内部の任意の場所に「break」を記述することで、ループから脱出できる(繰り返しの後続の処理はスキップされる)
・これは、ループからの脱出であり、その後に記述があれば実行される

p.117 for03.cs

//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; //forループを抜ける
            }
        }
    }
}

アレンジ演習:p.117 for03.cs

・ループ終了時のiの値を表示しよう

作成例

//アレンジ演習: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; //forループを抜ける
            }
        }
        Console.WriteLine("終了時のi = {0}", i); //【追加】5になる
    }
}

p.118 for04.cs

//p.118 for04.cs
using System;
class for04
{
    public static void Main()
    {
        int i;
        for (i = 0; ; i++) { //継続条件式のみ省略できる(無限ループになる)
            if (i >= 5) {
                break; //ループを抜ける
            }
            Console.WriteLine("i = {0}", i);
        }
    }
}

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

・iの値を0から4までカウントアップし、すぐに0までカウントダウンしよう