講義メモ・後半

アレンジ演習:p.163 bmiclass.cs

・身長や体重に0以下の値が入力されたら、先に進まずに再入力させるようにしよう

作成例

//アレンジ演習:p.163 bmiclass.cs
using System;
class BMI { //部品クラス
    private double blm; //身長(m単位):内部計算用のインスタンス変数なのでprivate
    public double Calc(double bl, double bw) { //身長(cm)と体重(kg)を受け取ってBMIを返すインスタンスメソッド
        blm = bl / 100.0; //身長(cm)を身長(m)に換算
        return bw / Math.Pow(blm, 2.0); //体重を身長(m)の自乗で割ってBMIを得て返す
    }
}
class bmiclass { //実行用クラス
    public static void Main() { //実行用の特別メソッド
        string strBl, strBw; //入力用のローカル変数
        double blcm, bwkg; //実数変換用のローカル変数
        do { //入力ループ①
            Console.Write("身長(cm)---");
            strBl = Console.ReadLine();
            blcm = Double.Parse(strBl); //実数変換
        } while (blcm <= 0); //0以下が入力されていたら繰返す
        do { //入力ループ②
            Console.Write("体重(kg)---");
            strBw = Console.ReadLine();
            bwkg = Double.Parse(strBw); //実数変換
        } while (bwkg <= 0); //0以下が入力されていたら繰返す
        BMI bmi = new BMI(); //部品クラスのインスタンスオブジェクトを生成
        Console.WriteLine("BMIは{0:#.##}です", bmi.Calc(blcm, bwkg)); //BMIを得て小数点以下2桁で表示
    }
}

アレンジ演習:p.165 noreturnvalue.cs

・記述されている5つの「return」が全て不要であることを確認しよう
※「return」が常に不要という意味ではなく、メソッドの途中で呼び出し元に戻りたい場合に利用可能
※ このプログラムの5つの「return」はメソッドの末尾や、メソッドの末尾に向かう位置にあるので不要

作成例

//アレンジ演習:p.165 noreturnvalue.cs
using System;
class Kakeibo { //部品クラス「家計簿」
    private int total = 0; //内部処理用のprivateなインスタンス変数(残高)
    public void nyukin(int en) { //入金処理のインスタンスメソッド
        total += en; //引数で得た入金額を残高に足し込む
        Console.WriteLine("{0}円を入金しました", en);
    }
    public void shishutsu(int en) { //支出処理のインスタンスメソッド
        if (total < en) { //引数で得た支出金額より残高が小さい?
            Console.WriteLine("{0}円も支出できません", en);
        } else { //支出可能?
            total -= en; //引数で得た支出金額を残高から差し引く
            Console.WriteLine("{0}円を支出しました", en);
        }
    }
    public void gettotal() { //残高を得るインスタンスメソッド
        if (total == 0) { //残高なし?
            Console.WriteLine("残高はありません");
        } else {
            Console.WriteLine("残高は{0}円です", total);
        }
    }
}
class noreturnvalue { //実行用のクラス
    public static void Main() { //実行用の特別なメソッド
        Kakeibo k = new Kakeibo(); //家計簿クラスのインスタンスを生成
        k.gettotal(); //残高を得る(表示)
        k.nyukin(1000); //入金処理
        k.gettotal(); //残高を得る(表示)
        k.nyukin(2000); //入金処理
        k.gettotal(); //残高を得る(表示)
        k.shishutsu(500); //支出処理
        k.gettotal(); //残高を得る(表示)
        k.shishutsu(10000); //支出処理
        k.gettotal(); //残高を得る(表示)
    }
}

p.167 コンストラクタ

・全てのクラスがあらかじめ持っている特別なメソッド
・プログラマが必要に応じて記述することが可能で、そうでなければ自動的に中身が空のものが用意される
・これをデフォルトコンストラクタという
・よって、記述は任意
・メソッドだが、メソッド名はなく、戻り値型もなく、public固定
・コンストラクタはオブジェクトの生成時に自動的に呼び出されるもので、プログラマが任意に呼ぶことはできない
・よって、オブジェクトの生成時に行いたいことを記述するために用いる
 例:インスタンス変数の初期化、リソースなどの準備処理 等
・定義書式①: public クラス名() {処理内容}
・システム側で必ず実行されるので、実行漏れを防ぎたい初期化処理などを記述すると良い

アレンジ演習:p.167 construct01.cs

・027行目の下で「MyClass md;」を実行すると、コンストラクタが動作するかどうか確認しよう
 ⇒ 宣言のみでは動作しない
・また「MyClass md = new MyClass();」を実行すると、コンストラクタが動作するかどうか確認しよう
 ⇒ オブジェクトを生成するとした数だけ動作する

作成例

//p.167 construct01.cs
using System;
class MyClass { //部品クラス
    int x; //インスタンス変数(private扱い)
    public void showx() { //インスタンスメソッド
        Console.WriteLine("x = " + x); //インスタンス変数を利用
    }
    public MyClass() { //コンストラクタ
        x = 10; //インスタンス変数を利用
        Console.WriteLine("xに10を代入しました"); 
    }
}
class construct01 {
    public static void Main() {
        MyClass mc = new MyClass(); //ここでコンストラクタが動作
        mc.showx(); //インスタンスメソッドを呼ぶ
        MyClass md = new MyClass(); //【追加】ここでもコンストラクタが動作
    }
}

p.167 コンストラクタ:コンストラクタの引数

・メソッドと同様にコンストラクタにも引数が指定できる
・引数を指定したコンストラクタを呼び出すには、newにおいてカッコ内に引数型と引数を記述する
・定義書式②: public クラス名(引数型 引数名, …) {処理内容}
 例: public Slime(int h, int p) { hp = h; mp = p; }
・呼び出し法: new クラス名(値や式, …);

提出:アレンジ演習:p.167 construct01.cs

講義メモ

p.158「簡単なクラスを定義しよう(生成と参照)」から

p.157 簡単なクラスを定義しよう(インスタンス変数の複数定義・生成)【再掲載】

・「int x, y;」というように、同じ型の変数をまとめて宣言できる
・インスタンス名も同様で「クラス名 インスタンス名①, インスタンス名②, …」と記述できる
・なお、インスタンスの生成もまとめて行える(「int x = 1, y = 2;」と同様に)
・書式例: クラス名 インスタンス名① = new クラス名(), インスタンス名② = new クラス名(), …;

p.158 簡単なクラスを定義しよう(生成と参照)

・「クラス名 インスタンス名」で宣言したインスタンス名(オブジェクト名)にはオブジェクトそのものが格納されるわけではない。
・p.40下の参照型の図の通り、インスタンス名にはオブジェクトを示す参照(オブジェクトの位置情報)が与えられる
・よって、異なる2つのインスタンス名に1つのオブジェクトの参照を格納でき、同じオブジェクトを指すことができる(p.159上の図参照)
・つまり、こうすることで、オブジェクトに別名をつけることが可能
・これは多くのテクニックに活用されている

アレンジ演習:p.158 simpleclass03.cs

・021行目の後で、新たにMyClassオブジェクトを生成して変数bに与え、b.xに1000を代入すると、a.xはどうなるか確認しよう

作成例

//アレンジ演習:p.158 simpleclass03.cs
using System;
class MyClass { //クラスの定義
    public int x; //インスタンス変数の定義
}
class simpleclass03 { //実行用クラス
    public static void Main() { //実行用メソッド
        MyClass a, b; //クラス型の2変数の宣言
        a = new MyClass(); //オブジェクトを生成して変数aで参照する
        a.x = 10; //変数a経由でインスタンス変数xに代入
        b = a; //変数aの参照を変数bに代入する(同じオブジェクトへの参照になる))
        Console.WriteLine("b.x = {0}", b.x); //a.xと同じインスタンス変数なので10
        b.x = 100; //変数b経由でインスタンス変数xに代入
        Console.WriteLine("a.x = {0}", a.x); //b.xと同じインスタンス変数なので100
        //【以下追加】
        b = new MyClass(); //オブジェクトを新たに生成して変数bで参照する
        b.x = 1000; //変数b経由でインスタンス変数xに代入
        Console.WriteLine("a.x = {0}", a.x); //b.xとは異なるインスタンス変数なので100のまま
    }
}

p.159 簡単なクラスを定義しよう(実行用クラスとインスタンス変数)

・Mainメソッドを含む実行用クラスに、インスタンス変数を定義することが可能
・実行用クラスのインスタンスを生成すると、その中にあるインスタンス変数にアクセスできる
・詳しい仕組みはp.202「静的メソッド」にて
 ※チームルールによっては、実行用クラスに、インスタンス変数を定義することは非推奨の場合もある

p.160 メソッドを定義しよう

・Mainメソッドのような処理(振る舞い)の記述を、実行用ではないクラスにも記述できる
・メソッドは0個以上の情報を得て、なにか処理を行い、0または1個の情報を返すことができる
・例: Addメソッドに1と2を渡すと、加算処理が動作して、3を返す
・メソッドの定義書式: アクセス修飾子 戻り値型 メソッド名(引数型 引数名, …){処理内容}
・アクセス修飾子:メソッドをクラスの外から呼び出す場合はpublicを指定(よって、Mainメソッドはpublic)
 何も指定しないか、privateを指定すると、内部用になる(クラス内の別のメソッドからは利用可能)
・戻り値型(復帰型)は返す情報のデータ型を記述する。なお、ない場合は voidを指定する(よって、Mainメソッドは基本的にvoid)
・引数:メソッドに渡す情報で、0個以上いくつでも記述でき「データ型 引数名」をカンマつなぎする
・なお、0個の場合はカッコのみ記述する(よって、MainメソッドはMain()が基本)
・処理内容では、戻り値型が指定してある時は「return 値や式;」が必須になり、分岐などを含むときは、どの分岐になっても
 必ずreturnが実行される必要がある。
・外部からメソッドを実行するには、インスタンス変数と同様に「オブジェクト名.メソッド名(…)」とする
・例:
 class Monster { //クラスの定義
  public int hp; //インスタンス変数の定義
  public void showhp() { Console.WriteLine("HPは{0}", hp); } //メソッドの定義
 }
 :
 class Game { //実行用クラス
  public static void Main() { //実行用の特別なメソッド
   Monster slalin = new Monster(); //Monsterオブジェクトを生成してスラリンとする
   slalin.hp = 10; //スラリンのインスタンス変数hpに代入
   slalin.showhp(); //スラリンのメソッドshowhp()を実行
  }
 }

アレンジ演習:p.161 method01.cs

・2引数を受け取り、差を返すpublic int Sub(int x, int y)メソッドを追記しよう
・Mainメソッドに上記を呼び出す記述を追記しよう
・どちらも、できるだけシンプルにすること

作成例


//アレンジ演習:p.161 method01.cs
using System;
class MyClass { //クラスの定義
    public int Add(int x, int y) { //int型の2引数を受け取ってint型の値を返すAddメソッドの定義
        int z; //計算用の変数(※メソッドの中で定義しているのでメソッド内のみ有効なローカル変数)
        z = x + y;
        return z; //和を返す
    }
    public int Sub(int x, int y) { //int型の2引数を受け取ってint型の値を返すSubメソッドの定義
        return (x > y) ? x - y : y - x; //差を返す
    }
}
class method01 {
    public static void Main() { //実行用の特殊クラス(この1行下が開始行)
        MyClass a = new MyClass(); //MyClassオブジェクトを生成し変数aで扱う
        int sum; //戻り値用の変数(※ローカル変数)
        sum = a.Add(100, 200); //変数a経由でAddメソッドを呼んで2引数を渡し、結果を変数sumで受け取る
        Console.WriteLine("sum = {0}", sum); //受け取った結果を表示
        //変数a経由でSubメソッドを呼んで2引数を渡し、受け取った結果を表示
        Console.WriteLine("sub = {0}", a.Sub(50, 200));
    }
}

p.161 メソッドを定義しよう:インスタンスメソッド

・通常のメソッドはインスタンスに含まれており、newなどでインスタンスオブジェクトを生成することにより利用可能になる
・このようなメソッドをインスタンスメソッドという
・なお、Mainメソッド、Console.WriteLineメソッドなどは特殊型でインスタンスメソッドではない
・インスタンスメソッドは自分の属するオブジェクトにあるインスタンス変数を扱える
・例:
 class Monster { //部品クラスの定義
  public int hp; //インスタンス変数の定義
  public void showhp() { //インスタンスメソッドの定義
   Console.WriteLine("HPは{0}", hp); //hpを表示
  } 
 }
 :
 class Game { //実行用クラス
  public static void Main() { //実行用の特別なメソッド
   Monster slalin = new Monster(); //Monsterオブジェクトを生成してスラリンとする
   slalin.hp = 10; //スラリンのインスタンス変数hpに代入
   slalin.showhp(); //スラリンのインスタンスメソッドshowhp()を実行
   Monster hoimin = new Monster(); //Monsterオブジェクトを生成してホイミンとする
   hoimin.hp = 20; //ホイミンのインスタンス変数hpに代入
   hoimin.showhp(); //ホイミンのインスタンスメソッドshowhp()を実行
  }
 }

今週の話題

ゲームソフト販売本数ランキング:今週1位も「ドンキーコング リターンズ HD(Switch)」 GO!
【PS Plus】フリープレイ&ゲームカタログの対象タイトルは2026年1月以降PS5向けが中心になると発表。PS4向けの配信は不定期に GO!
コーエーテクモHD、『真・三國無双 ORIGINS』好スタートも通期予想達成に黄色信号―プライム市場維持への課題も【ゲーム企業の決算を読む】GO!
HEROZ、『将棋ウォーズ』好調も成長事業への投資先行で上半期は減益で折り返し【ゲーム企業の決算を読む】GO!
マイクロソフト、ゲーム事業は減収も利益は改善―Game Passが成長をけん引【2025年度第2四半期決算】GO!
AIによるゲームプレイ補助ソフト「Gaming Copilot」Steamでリリース。プレイヤーへリアルタイムに戦略などをアドバイス GO!
SIEが2025年4月1日から新経営体制へ―西野秀明氏が社長に、会長だった十時裕樹氏はソニーグループCEOに就任へ GO!

ユービーアイソフト、複数スタジオで計185人をレイオフしUbisoft Leamingtonを閉鎖―長期的な安定性を確保するため GO!
海外メディア「理論上、“闇市場”を防ぐ方法は本作にない」―『ポケポケ』全プレイヤーにRMTやデータ改ざんに関与しないよう注意呼び掛け。トレード機能が不正の温床となることを懸念か GO!

前回のコメント

・理解できた

 何よりです。

・今回もありがとうございました
 一回一回の内容もだいぶ濃くなってきたような気がしますがこのまま頑張っていこうと思います。
・図のおかげで理解がより深まったと思います。次も頑張ります。

 何よりです。応援します。

・ゲーム作りではクラスを多用するという事で、お時間とって説明いただきありがとうございました。
 全部ゲーム作りで、考えてしまいます。
 逆にクラスをたくさん使う事で実際のシステム系の開発で使われているものがあれば、教えてください。
 ウェブアプリケーションらしいですが、どんなウェブアプリケーションで使うのでしょうか。

 「クラスをたくさん使う」かどうかにこだわる必要はありません。
 ゲーム系開発に活用されることが多いC#、C++、Webアプリケーションに用いることの多いJavaが、
 どちらもオブジェクト指向言語であり、部品化、再利用、チーム開発の効率化に多数のクラスを有効活用していると
 考えるとよいでしょう。
 Webアプリケーションの種類による多寡はないと思いますが、ネットトレーディングなどの複雑なものでは、
 設計でも実装でもクラスを活用できる能力が問われるでしょう。

前回のコメントのうち、リクエストについて

・ここまで勉強してきたものを実践して慣れていきたいと思ったので、
 問題集のような本やサイトなどでおすすめなものはありますでしょうか?
 ありましたら教えてほしいです。

 「北ソフト工房」の「C# 練習問題集」が良いかもしれません。
 https://kitako.tokyo/lib/CsExercise.aspx
 序盤は簡単すぎますので、
 3. 分岐
 4. 繰り返し
 5. 配列
 あたりに挑戦すると良いでしょう。

講義メモ:第7章 クラスの基礎

p.153 クラスとは何か

・C#などのオブジェクト指向言語では、プログラムをクラスを単位として作成し、データ構造もクラスを基本として扱うことができる
・プログラムは設計図にあたるソースを、ビルドすることによって実行体がメモリの上に生成されて動作する
・この設計図にあたるのがクラス、実行体にあたるのがオブジェクト(インスタンス)
・この考え方を、クラスの中で用いるデータ構造や部品にあてはめることもできる
・例えば、X座標とY座標を保持できる座標情報をクラスとして、点Aの座標をこのクラスのオブジェクトaで、点Bの座標をこのクラスの
 オブジェクトbで扱える
・そして、この座標情報のクラスをプログラムの中に記述して、mainメソッドでオブジェクトaとbを生成して利用できる

p.154 簡単なクラスを定義しよう

・例えば、X座標とY座標を保持できる座標情報をクラス名「map」として定義することができる。
・定義書式例: class クラス名 { 型 変数名; … }
 例: class map { int x; int y; } //座標情報クラス「map」の定義
・クラスの中に記述した変数などのことをメンバという。メンバにはデータとメソッドなどがある
・ちなみに、6章までで作成したプログラムはすべてクラスで、メンバはmain()メソッドのみだった
・クラスの中に記述した変数のことをクラス変数、データメンバともいう
・クラスからオブジェクトを生成すると、生成したオブジェクトの中にクラス変数の実体ができる
 例: mapクラスからオブジェクトgoalを生成し、goalのX座標とY座標を格納する
 例: mapクラスからオブジェクトstartを生成し、startのX座標とY座標を格納する
・このことから、クラス変数を基本的にインスタンス変数ともいう(※例外あり)
・インスタンス変数はオブジェクトの中に守られているので、外側から扱う許可を与える必要がある
・このアクセス制限を示す表現をアクセス修飾子といい、基本的に public が許可を示す
・ちなみに、mainメソッドもクラスの外側にあるシステムが扱うので、public が必要
・外側から扱う定義書式例: class クラス名 { public 型 変数名; … }
 例: class map { public int x; public int y; } //座標情報クラス「map」の定義
・なお、アクセス修飾子を記述しないと private が指定されているとみなされ不許可を示す
例:
class MyCat { //クラス「MyCat」の定義
 public int catNo; //猫番号のインスタンス変数
 public string catName; //猫名のインスタンス変数
 public double catWeight; //猫体重のインスタンス変数
}

p.154 簡単なクラスを定義しよう(定義したクラスを使おう)

・クラスからオブジェクトを生成して扱うには、オブジェクトの名前にあたるインスタンス名が必要(※例外あり)
・このインスタンス名は「クラスを型とする変数」という書式になる
・インスタンス名の定義書式: クラス名 インスタンス名;
 例: map goal; //インスタンス名goalを定義する
 例: map start; //インスタンス名startを定義する
 例: myCat tama; //インスタンス名tamaを定義する
・そして、クラスからインスタンスを生成するには演算子newを用いる(配列の生成のnewと同じ意味)
・インスタンスの生成の書式: インスタンス名 = new クラス名();
 例: goal = new map(); //mapオブジェクトを生成し、goalとする
 例: tama = new myCat(); //myCatオブジェクトを生成し、tamaとする
・インスタンス名の定義とインスタンスの生成は(変数の初期化と同様に)まとめて実行できる
・インスタンスの定義と生成の書式: クラス名 インスタンス名 = new クラス名();
 例: myCat tama = new myCat(); //インスタンス名tamaを定義し、myCatオブジェクトを生成して与える
・すると、インスタンス変数は「インスタンス名.インスタンス変数名」で利用できる
・この「.」は「の」と読むと分かりやすい
 例: tama.catNo = 500; //インスタンス名tamaのインスタンス変数catNoに代入
 例: tama.catName = "たま"; //インスタンス名tamaのインスタンス変数catNameに代入
 例: tama.catWeight = 3.14; //インスタンス名tamaのインスタンス変数catWeightに代入
・よって、インスタンス変数を持つクラスを定義することで、変数をまとめて扱えるようになる

p.156 simpleclass.cs

//p.156 simpleclass.cs
using System;
class myclass //プログラマによるクラスの定義(クラス名:myclass)
{
    public int x; //外部から利用できるインスタンス変数xの定義
}
class simpleclass //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        myclass mc = new myclass(); //myclassクラスのインスタンスを生成しインスタンス名mcとする
        mc.x = 10; //インスタンスmcのインスタンス変数xに10を代入
        Console.WriteLine("mc.x = {0}", mc.x); //インスタンスmcのインスタンス変数xの値を表示
    }
}

アレンジ演習:p.156 simpleclass.cs

・クラス名:myclassをSlimeに
・インスタンス変数xをhpに
・インスタンス名mcをslalinにしてみよう・そして、インスタンス変数mpを追加してみよう
・それから、2つ目のインスタンスhoiminも生成してみよう

作成例

//アレンジ演習:p.156 simpleclass.cs
using System;
class Slime //スライムを表すクラスの定義
{
    public int hp; //スライムが持つインスタンス変数
    public int mp; //スライムが持つインスタンス変数
}
class simpleclass //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        Slime slalin = new Slime(); //「スライムのスラリンがあらわれた」
        slalin.hp = 10; //「スラリンのHPは10」
        slalin.mp = 20; //「スラリンのMPは20」
        Console.WriteLine("スラリンのHPは{0}", slalin.hp); //インスタンスslalinのインスタンス変数hpの値を表示
        Console.WriteLine("スラリンのMPは{0}", slalin.mp); //インスタンスslalinのインスタンス変数mpの値を表示

        Slime hoimin = new Slime(); //「スライムのホイミンがあらわれた」
        hoimin.hp = 30; //「ホイミンのHPは30」
        hoimin.mp = 40; //「ホイミンのMPは40」
        Console.WriteLine("ホイミンのHPは{0}", hoimin.hp); //インスタンスhoiminのインスタンス変数hpの値を表示
        Console.WriteLine("ホイミンのMPは{0}", hoimin.mp); //インスタンスhoiminのインスタンス変数mpの値を表示
    }
}

p.157 簡単なクラスを定義しよう(インスタンス変数の複数定義・生成)

・「int x, y;」というように、同じ型の変数をまとめて宣言できる
・インスタンス名も同様で「クラス名 インスタンス名①, インスタンス名②, …」と記述できる
・なお、インスタンスの生成もまとめて行える(「int x = 1, y = 2;」と同様に)
・書式例: クラス名 インスタンス名① = new クラス名(), インスタンス名② = new クラス名(), …;

アレンジ演習:p.157 simpleclass02.cs

・「MyClass a, b;」からの3行を1行にしてみよう

作成例

//アレンジ演習:p.157 simpleclass02.cs
using System;
class MyClass //プログラマによるクラスの定義(クラス名:myclass)
{
    public int x; //外部から利用できるインスタンス変数xの定義
}
class simpleclass02 //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass02)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        MyClass a = new MyClass(), b = new MyClass(); //【変更】2つのインスタンスの定義と生成をまとめて
        a.x = 10;  //1つめのインスタンスのもつインスタンス変数への代入
        b.x = 100; //2つめのインスタンスのもつインスタンス変数への代入
        Console.WriteLine("a.x = {0}, b.x = {1}", a.x, b.x); //上記2つのインスタンス変数の値を表示
    }
}

解説:クラス図とオブジェクト図の一種

提出:アレンジ演習:p.157 simpleclass02.cs

講義メモ

・p.150「foreach文による反復処理」から

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

・5人の名前を全て小文字にした要素を追加して10要素にし、どう整列されるか確認しよう
 ⇒小文字と大文字は同じ順序だが、同じ字の小文字と大文字では小文字の方が前になる
・英記号「!,#,$,%,&」がどう整列されるか確認しよう
 ⇒文字コード順になる(文字コードは順に 21,23,24,25,26)
・負の数を含む実数値の場合、どう整列されるか確認しよう
 ⇒小さい(-∞に近い)ものからの順になる
・「ちぢっつづてで」のように小文字や濁点を含むひらがなの場合、どう整列されるか確認しよう
 ⇒文字コード順になる(文字コードは順に 3061,3062,3063,3064,3065,3066,3067)

作成例

//アレンジ演習:p.148 sort01.cs
using System;
class sort01 {
    public static void Main() {
        string[] name = new string[10]{
            "Eric", "Peter", "Frank", "Kate", "Thomas", 
            "eric", "peter", "frank", "kate", "thomas"};
        for (int i = 0; i < name.Length; i++) {
            Console.WriteLine(name[i]);
        }
        Console.WriteLine();
        Array.Sort(name);
        for (int i = 0; i < name.Length; i++) {
            Console.WriteLine(name[i]);
        }
        Console.WriteLine();
        Array.Reverse(name);
        for (int i = 0; i < name.Length; i++) {
            Console.WriteLine(name[i]);
        }
        char[] c = {'!', '#' , '$' , '%', '&'}; //文字コード 21,23,24,25,26
        Array.Sort(c); //文字コード順になる
        for (int i = 0; i < c.Length; i++) {
            Console.WriteLine(c[i]);
        }
        double[] d = {-3.14, 3.14, 2.25, 0, -2.25}; //負の数を含む実数値
        Array.Sort(d); //小さい(-∞に近い)ものからの順になる
        for (int i = 0; i < d.Length; i++) {
            Console.WriteLine(d[i]);
        }
        char[] j = {'ち','ぢ','っ','つ','づ', 'て', 'で'}; //文字コード 3061,3062,3063,3064,3065,3066,3067
        Array.Sort(j); //文字コード順になる
        for (int i = 0; i < j.Length; i++) {
            Console.WriteLine(j[i]);
        }
    }
}

p.150 foreach文による反復処理

・foreach文は配列などのデータ構造の全要素について繰返したい場合の簡略構文で、各種の構造に対応している
・ここでは配列での利用法の理解を。
・配列における書式: foreach (型 作業変数名 in 配列名) {繰返し内容}
・配列から1要素ずつ作業変数にコピーされるので、これを用いる処理を繰返し内容に記述する
・ただし、作業変数はコピーなので、書き換えはエラーになる
・よって、配列の要素値に格納したり、変更したりする処理は記述できない
・なお、配列における書式では、配列の型情報が得られるので、作業変数の型は暗黙の型(var)で良い
 ※ チームルールによっては、foreach文の作業変数の型はvarのみとしている場合ある

アレンジ演習:p.150 foreach01.cs

・2つあるforeach文の作業変数の型をvarにしよう

作成例

//アレンジ演習:p.150 foreach01.cs
using System;
class foreach01
{
    public static void Main()
    {
        string[] Animal = new string[]{"犬", "猫", "雉", "猿"};
        int[] Num = new int[]{10, 20, 30, 40};
        foreach (var str in Animal) { //作業変数strは自動的にAnimalのstring型になる
            Console.WriteLine(str);
        }
        Console.WriteLine();
        foreach (var i in Num) { //作業変数iは自動的にNumのint型になる
            Console.WriteLine(i);
        }
    }
}

アレンジ演習:p.150 foreach01.cs(続き)

・以下の2次元配列の全要素をforeachで表示しよう
  string[,] Animal = new [,]{{"犬", "猫"}, {"雉", "猿"}};
・以下のジャグ配列の全要素をforeachで表示しよう(2重ループになる)
  int[][] Num = new[]{new[]{10, 20, 30}, new[]{40, 50}};

作成例

//アレンジ演習:p.150 foreach01.cs
using System;
class foreach01
{
    public static void Main()
    {
        string[,] Animal = new [,]{{"犬", "猫"}, {"雉", "猿"}}; //2次元配列
        foreach (var str in Animal) { //1次元配列の場合と全く同じで良い
            Console.WriteLine(str);
        }
        Console.WriteLine();
        int[][] Num = new[]{new[]{10, 20, 30}, new[]{40, 50}}; //ジャグ配列は配列の配列なので
        foreach (var i in Num) { //作業変数iは自動的に配列になる
            foreach (var j in i) { //よって作業変数jは内側の配列の要素になる
                Console.WriteLine(j);
            }
        }
    }
}

p.152 練習問題 ヒント

・合計用の変数を0で初期化
・コンソールに「受験者数:」と表示し、受験者数の変数に入力
・受験者数を要素数とする点数の配列を生成
・カウンタ用の変数を0から受験者数未満について繰返しながら:
 ①点数の配列の各要素に点数を入力
 ②点数の配列の各要素の値を合計用の変数に足し込む
・合計用の変数を実数に変換し、受験者数で割って平均値を得て表示
・点数の配列をソート
・点数の配列をリバース(逆順にすることで降順になる)
・点数の配列の全件を表示

作成例

//p.152 練習問題
using System;
class ex0601 {
    public static void Main() {
        int sum = 0; //合計用の変数を0で初期化
        Console.Write("受験者数:"); int num = int.Parse(Console.ReadLine()); 
        int[] point = new int[num]; //受験者数を要素数とする点数の配列を生成
        for (int i = 0; i < num; i++) { //カウンタ用の変数を0から受験者数未満について繰返し
            Console.Write("{0}:", i); point[i] = int.Parse(Console.ReadLine()); 
            sum += point[i]; //点数の配列の各要素の値を合計用の変数に足し込む
        }
        Console.WriteLine("平均値:{0}",(double)sum / num); //合計用の変数を実数に変換し、受験者数で割って平均値を得て表示
        Array.Sort(point); //点数の配列をソート
        Array.Reverse(point); //点数の配列をリバース(逆順にすることで降順になる)
        foreach (int i in point) { //点数の配列の全件について繰返す
            Console.WriteLine(i);
        }
    }    
}

今週の話題

ゲームソフト販売本数ランキング:今週1位は「ドンキーコング リターンズ HD(Switch)」 GO!
「さまざまな形で生成AIを活用していく」カプコン生成AIでゲーム開発を効率化―アイデア出しの高速化・効率化を実現 GO!
GLOEは今期赤字予想、事業領域拡大による先行投資で―「eスポーツ×福祉領域」での伸長に期待【ゲーム企業の決算を読む】GO!
海外展開・マルチプラットフォーム対応を強力にサポート―『FREEDOM WARS Remastered』開発スタッフが語るReadSpeakerの強みと音声合成ソリューションの未来 GO!
ゲーム向けAI翻訳サービス「DMM GAME翻訳」が初回1文字1円のスタータープランを提供開始―2月末までは20%オフキャンペーンも実施 GO!

Warner Bros. Games社長が退任へ…『スーサイド・スクワッド』不調が原因か、今後はライブサービス重視となる報道も GO!
フジテレビ問題巡り、任天堂もCM差し止めへ―スポンサー離れは少なくとも50社以上 GO!