講義メモ ・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); } } } 第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つのインスタンス変数の値を表示 } } 解説:クラス図とオブジェクト図の一種 ・https://ha242.rundog.org/wp-content/uploads/2025/01/DSC_1228-1040x586.jpg 提出:アレンジ演習:p.157 simpleclass02.cs 次回予告:p.158「簡単なクラスを定義しよう(生成と参照)」から