講義メモ ・p.130 continue01.csの補足から再開し、p.132「練習問題」に進みます アレンジ演習:p.130 continue01.cs ・100までの固定になっているが、コンソールから、いくつまでか入力できるようにしよう 作成例 //アレンジ演習:p.130 continue01.cs --- 0から100未満の2の倍数の合計を求める using System; class continue01 { public static void Main() { int sum = 0; Console.Write("i : "); int limit = int.Parse(Console.ReadLine()); //【追加】 for (int i = 0; i < limit; i++) { //【変更】 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の主な用途 ・単純に繰返し内容の一部をスキップするだけであれば、if文を用いる方が理解しやすいことが多い ・しかし、繰返し内容や、スキップの条件が複雑な場合、continueを用いる事で可読性や保守性(改良しやすさ)を向上できることがある ・例:以下を繰返す場合  ① 3の倍数であれば   ・「3の倍数」と表示   ・しかも、偶数であれば、これ以降をスキップする  ② 何回目かを表示する ・この例は、contunueを用いる事で②を複数回記述したり、表現を大きく変えることを避けられる ミニ演習 mini130a.cs ・上の例を、1から10までの繰返しにおいて実装して動作を確認しよう 作成例 //ミニ演習 mini130a.cs:continueの活用例 using System; class mini130a { public static void Main() { for (int i = 1; i <= 10; i++) { if (i % 3 == 0) { //3の倍数であれば Console.WriteLine("3の倍数"); if (i % 2 == 0) { //しかも偶数であれば continue; //これ以降をスキップする } } Console.WriteLine("{0}回目", i); //3の倍数かつ偶数の時のみ非実行 } } } p.130 continue01.csの補足:continueの主な用途(つづき) ・また、breakと組みわせることで、繰返し処理内容を制御する場合にも用いる ・例:  ・身長と体重を入力するとBMIを表示することを無限に繰返す  ・ただし、身長に0が入力されたら繰返しを抜ける  ・そして、体重に0が入力されたら、それ以降をスキップすることで、身長の入力に戻る  ・BMI=体重(kg)÷身長(m)÷身長(m) ミニ演習 mini130b.cs ・上の例を、while(true)による無限ループにおいて実装して動作を確認しよう 作成例 //ミニ演習 mini130b.cs:continueの活用例 using System; class mini130b { public static void Main() { double height, weight; //身長、体重 while (true) { //無限ループ Console.Write("身長(m):"); height = double.Parse(Console.ReadLine()); if (height == 0) { //身長が0なら break; //繰返しを脱出 } Console.Write("体重(kg):"); weight = double.Parse(Console.ReadLine()); if (weight == 0) { //体重が0なら continue; //これ以降をスキップすることで身長の入力に戻る } Console.WriteLine("BMI={0}", weight / height / height); //BMIを表示 } } } p.132 練習問題1 ヒント ex0501.cs ・BMI=体重÷(身長×身長) なので、これが22となる体重は 22×身長×身長 で得られる ・この身長はメートル単位なのでセンチメートル単位にすると、22×(身長cm÷100)×(身長cm÷100) ・この式を身長=160から、身長<=180である間、身長をインクリメントしながら繰り返し、  その中で身長と体重を表示すれば良い 作成例 //p.132 練習問題1 ex0501.cs using System; class ex0501 { public static void Main() { for (int height = 160; height <= 180; height++) { double heightm = height / 100.0; //mに換算 Console.WriteLine("身長:{0}cm 体重:{1}kg", height, 22 * heightm * heightm); } } } p.132 練習問題2 ヒント ex0502.cs ・合計用の変数sumを0で初期化しておく ・コンソールから整数nを入力することを、1以上の値が入力されるまで繰返す ・カウント用の変数iを1から、iがn以下である間、iを+1しながら、下記を繰返す  ・sumにiの値を足しこむ ・sumの値を表示 作成例 //p.132 練習問題2 ex0502.cs using System; class ex0502 { public static void Main() { int sum = 0; //合計 int n; do { Console.Write("n:"); n = int.Parse(Console.ReadLine()); } while (!(n >= 1)); //1以上が入力されるまで先に進まない for (int i = 1; i <= n; i++) { sum += i; //合計に足しこむ } Console.WriteLine("合計:{0}", sum); } } 第6章 配列 p.133 配列とは ・同じ型で同じ意味の変数を「●の■番目」としてまとめて扱える仕掛け。 ・この●を配列(名)、■を添字またはインデクスという ・配列を構成するデータを要素、その数を要素数という ・配列の利用には宣言が必要で、それから、要素の数だけの領域を確保する生成を行う ・宣言の書式: 型[] 配列名; //例: string[] names; 文字列配列namesの宣言 ・生成の書式: 配列名 = new 型[要素数]; //例: names = new string[100]; namesとして文字列100個分 ・宣言と生成は1文で行える 例:string[] names = new string[100]; p.135 配列とは(配列の要素の利用) ・配列名に続けて[添字]をつけることで、配列の要素にアクセスできる。 ・添字は0からなので、要素数-1までになることに注意。 ・配列名[要素数]は存在せず、アクセスすると異常終了してしまう。 ・要素は変数と全く同様に利用できる。  例: string[] names = new string[3]; names[0] = "Amuro"; names[1] = "Kai"; names[2] = "Ryu"; p.135 配列とは(配列の初期化) ・変数と同様に配列の生成時に初期値を与える(初期化する)ことが可能 ・この時、初期値の数を要素数できるので、要素数を省略して良い ・書式: 型[] 配列名 = {値,…};  例: string[] ms = {"ザク","グフ","ドム"}; //3要素になる ・生成の書式の後ろに{値,…}を指定して初期化できるが、要素数と値の数が合ってないとエラー。  ※ よって、要素数を省略する形式を用いるのが望ましい p.135 配列とは(配列のプロパティ) ・C#の配列はクラス(第7章)と同様の「データと処理をもつオブジェクト」として実装されている ・よって、クラスの持つ機能の一種であるプロパティが利用できる ・配列のプロパティの1つがLengthで、これを用いると要素数がわかる ・利用書式: 配列名.Length ・これを用いると、配列の要素数が変わっても処理の記述が変わらない=変化に強いプログラムになる ・例: for (int i = 0; i < 配列.Length; i++) { 配列の全要素についての処理 } アレンジ演習:p.136 average02.cs ・配列pointの要素を1つ増やして「60」を入れよう ・配列pointの初期化式に要素値を書き加えるのみで良いことを確認しよう 作成例 //アレンジ演習:p.136 average02.cs using System; class average02 { public static void Main() { int[] point = {70, 80, 50, 60}; //【変更】int型の配列pointの初期化 int sum = 0, no; //合計、要素数 no = point.Length; //配列のプロパティで要素数を得る for (int i = 0; i < no; i++) { //全要素について繰返す sum += point[i]; //要素値を合計に足しこむ } double average = (double)sum / no; //実数化して要素数で割ることで平均を実数で得る Console.WriteLine("合計 = {0}, 平均 = {1:##.#}", sum, average); //合計と平均を表示 } } p.137 2次元配列 ・2次元配列とは添字を2つもつ配列であり、配列名[添字①, 添字②] で表す ・例えば、将棋やチェスやオセロなどの盤や、平面の迷路を表すには2次元配列が向く ・宣言の書式: データ型[,] 配列名; ・生成の書式: 配列名 = new データ型[要素数①, 要素数②]; ・配列と同様に、宣言と生成を同時に行える  例: int[,] map = new int[2, 3]; //2×3の2次元配列の宣言と生成  これにより、map[0,0],map[0,1],map[0,2],map[1,0],map[1,1],map[1,2]の6要素が生成される  つまり、添字①の0から1について、それぞれ添字②の0から2までがあるという形式で、下記の表のイメージ。  +--------+--------+--------+  |map[0,0]|map[0,1]|map[0,2]|  +--------+--------+--------+  |map[1,0]|map[1,1]|map[1,2]|  +--------+--------+--------+ ・2次元配列の全要素を扱う場合、forの2重ループにして、外側で添字①を、内側で添字②を扱うと良い  書式例:  for (int i = 0; i < 要素数①; i++) {   for (int j = 0; j < 要素数②; j++) {    配列名[i, j]を操作   }  }  この例を当てはめると、map[0,0],map[0,1],map[0,2],map[1,0],map[1,1],map[1,2]の順に扱われる p.138 array01.csについて ・2重ループにおいては{}の省略は推奨されないことが多い(チームルールによっては禁止) ・特に、このソースの用に繰り返し内容が2行分ある場合、{}を省略すると非常に誤読を招きやすいので注意 アレンジ演習:p.138 array01.cs ・配列myArrayへの要素値の代入も二重ループで行うようにしよう ・要素値はインクリメントを用いると良い 作成例 //アレンジ演習:p.138 array01.cs using System; class array01 { public static void Main() { int[,] MyArray = new int[2,3]; int i, j; //MyArray[0, 0] = 1; //MyArray[0, 1] = 2; //MyArray[0, 2] = 3; //MyArray[1, 0] = 4; //MyArray[1, 1] = 5; //MyArray[1, 2] = 6; int n = 1; //要素値 for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { MyArray[i, j] = n++; //要素値として代入しインクリメント } } for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]); } } } } アレンジ演習:p.138 array01.cs:さらに ・2重ループを1つにまとめ、カウンタの変数の初期化もループ内で行おう 作成例 //アレンジ演習:p.138 array01.cs using System; class array01 { public static void Main() { int[,] MyArray = new int[2,3]; //2次元配列MyArray[2,3]の生成 int n = 1; //要素値 for (int i = 0; i < 2; i++) { //第1添字の全要素について繰返す for (int j = 0; j < 3; j++) { //第2添字の全要素について繰返す MyArray[i, j] = n++; //要素値として代入しインクリメント Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]); } } } } p.138 2次元配列(初期化) ・1次元の配列と同様に、要素値を並べる事で初期化が可能 ・この時、{}をネストにして2次元であることを表すと良い ・書式: データ型[,] 配列名 = { { 値,… }, { 値,… }, … } アレンジ演習:p.139 array02.cs ・最後に全要素の合計値を表示しよう 作成例 //アレンジ演習: array02.cs using System; class array02 { public static void Main() { int[,] MyArray = {{1, 2, 3}, {4, 5, 6}}; //配列の初期化 int sum = 0; //【追加】合計 for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { Console.WriteLine("MyArray[{0}, {1}] = {2}", i, j, MyArray[i, j]); sum += MyArray[i, j]; //【追加】要素値を合計に足し込む } } Console.WriteLine("合計 = {0}", sum); //【追加】 } } テキスト正誤:p.139 11行目から3行 最初の書き方では要素数が指定されているので、全部の要素の初期値を書く必要があります。 例えば、下記はエラーになります。  int[,] MyArray = new int[4, 2] {{1, 2, 3}, {4, 5, 6}}; //エラー よって,C/C++のように「初期値が指定されていない要素は0で初期化される」ことはありません。  int[,] MyArray = new int[,] {{1, 2, 3}, {4, 5, 6}}; //エラー とすれば、初期値の数だけの要素を持った配列になります。 なお、この「new int[,]」は省略できます。 p.140 array03.cs 補足 ・023行目などで用いている「Char.IsNumber(文字列s, 位置n)」は、文字列sの先頭を0文字目とした時のn文字目が、数字かどうかを返すメソッド ・よって、位置nが0であれば、文字列の先頭文字が数字であればtrue、でなければfalseを返す ・これで事前にチェックすることで、int.Parseメソッドなどで数値化できる文字列かどうかがわかるので、以上終了を防ぐことができる ・このプログラムでは、事前に1桁であることもチェックしているので、先頭文字のチェックだけで良い アレンジ演習:p.140 array03.cs ・if文の中で「Char.IsNumber(strClass, 0) != true」などとしているが、「!Char.IsNumber(strClass, 0)」とシンプルにできることを確認しよう 提出:アレンジ演習:p.140 array03.cs 次回予告:「アレンジ演習:p.140 array03.cs」の続きから