講義メモ ・p.118「for04.cs(条件式のみの省略)」から 提出フォロー:アレンジ演習:p.117 for03.cs ・・4,3,2,1,0 とカウントダウンするように書き換えよう 作成例 //アレンジ演習:p.117 for03.cs カウントダウン using System; class for03 { public static void Main() { int i = 4; //【変更】 for ( ; ; ) { //無限ループ!! Console.WriteLine("i = {0}", i); i--; //【変更】WriteLineメソッドが実行されたらiを1減らす if (i < 0) { //【変更】iが0未満になったらbreak文で脱出 break; } } } } p.118 forループからの脱出(for04.cs:条件式のみの省略) ・for文の3要素のうち中央の継続条件を省略すると、無限ループになる p.118 for04.cs //p.118 for04.cs using System; class for04 { public static void Main() { int i; //カウンタ用の変数iの宣言のみ for (i = 0;;i++) { //変数iを0にして、インクリメントしながら無限ループする if (i >= 5) { //変数iが5以上なら break; //ループを抜ける } Console.WriteLine("i = {0}", i); //iの値を表示 } //繰り返しの最後でインクリメントをしている } } p.118 forループからの脱出(for文における初期化) ・forの第1要素で用いることが多いカウンタ用の変数は、事前に宣言する必要は無い ・forの第1要素において初期化しても良いので、単純な回数指定繰り返しは下記の書式にできる。  for (int カウンタ用変数 = 0; カウンタ用変数 < 回数; カウンタ用変数++) {…} ・なお、このカウンタ用変数は、forの内部でのみ有効になるので、繰り返しの外で誤って用いることを防止できる  ※ 繰り返しの外で用いる場合は事前に宣言する必要がある ・for文における初期化にすると、カウンタ用の変数名の重複が可能なので「i」などにを統一することが多い アレンジ演習:p.118 for04.cs ①現状では、forの繰り返しの終わった後で、カウンタ用の変数iにアクセスできることを確認しよう ②それから、カウンタ用の変数iを事前に宣言せず、for文において初期化し、動作が変わらないことを確認しよう ③forの繰り返しの終わった後で、カウンタ用の変数iにアクセスできないことを確認しよう 作成例 //アレンジ演習:p.118 for04.cs using System; class for04 { public static void Main() { //int i; //【削除】カウンタ用の変数iの宣言のみ for (int i = 0;;i++) { //【変更】変数iを0で初期化して、インクリメントしながら無限ループする if (i >= 5) { //変数iが5以上なら break; //ループを抜ける } Console.WriteLine("i = {0}", i); //iの値を表示 } //繰り返しの最後でインクリメントをしている //Console.WriteLine("繰り返し終了後のi = {0}", i); //【追加】iの値を表示できる⇒【削除】できない } } p.119 forループのネスト ・ある構造の内側に同じ構造を持つことを「入れ子」「ネスト」という。 ・forループはいくつでもネストができるので、例えば「1年生から3年生までの、1組から3組まで繰返す」というような処理を記述できる ・2つのネストのことを2重ループともいう ・forループのネストでは内側のネストを1通り終えてから外側のネストの続きが実行される  例:「1年生から3年生までの、1組から3組まで繰返す」であれば   {1年1組、1年2組、1年3組}、{2年1組、2年2組、2年3組}、{3年1組、3年2組、3年3組} の順になる ・内側のネストでは外側のネストのカウンタ用変数とは別の変数を使う。一般に、外側はi、内側はjを使うことが多い アレンジ演習:p.119 kuku01.cs ・カウンタ用の変数i、jを事前に宣言せず、for文において初期化しよう ・なお、外側や外側のループで宣言/初期化した変数は内側のループから利用できる  ※逆は不可(内側のループで宣言/初期化した変数は外側のループやその外側からは利用できない) 作成例 //アレンジ演習:p.119 kuku01.cs using System; class kuku01 { public static void Main() { //int i, j; //【削除】 for (int i = 1; i <= 9; i++) { //【変更】外側のループでiを1から9まで繰り返す(iの段) for (int j = 1; j <= 9; j++) { //【変更】内側のループでjを1から9まで繰り返す(×j) Console.WriteLine("{0} * {1} = {2}", i, j, i * j); //i、j、積を表示 } //内側のループはここまで Console.WriteLine("------------"); //段の終わりの区切り線を表示 } //外側のループはここまで } } アレンジ演習:p.119 kuku01.cs つづき ・内側のWriteLineをWriteにして、積だけを3桁で表示しよう(p.29参照) ・そして、外側のWriteLineを改行のみにしよう(引数を空にすれば良い) 作成例 //アレンジ演習:p.119 kuku01.cs つづき using System; class kuku01 { public static void Main() { for (int i = 1; i <= 9; i++) { //外側のループでiを1から9まで繰り返す(iの段) for (int j = 1; j <= 9; j++) { //内側のループでjを1から9まで繰り返す(×j) Console.Write("{0,3}", i * j); //【変更】積を3桁で表示 } //内側のループはここまで Console.WriteLine(); //【変更】改行のみ } //外側のループはここまで } } アレンジ演習:p.119 kuku01.cs さらにつづき ・内側の繰り返しの回数を、外側のカウンタiで決めるようにしよう ・すると、下記のように、九九表の右上の重複部分を表示しないようにできる ※無限ループにより止まらなくなったら「Ctrlキーを押しながらC」で止めると良い(コンソールを閉じても良いが、状況がのこらない) 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 作成例 //アレンジ演習:p.119 kuku01.cs つづき using System; class kuku01 { public static void Main() { for (int i = 1; i <= 9; i++) { //外側のループでiを1から9まで繰り返す(iの段) for (int j = 1; j <= i; j++) { //【変更】内側のループでjを1からiまで繰り返す(×j) Console.Write("{0,3}", i * j); //積を3桁で表示 } //内側のループはここまで Console.WriteLine(); //【変更】改行のみ } //外側のループはここまで } } p.121 forループのネスト(Mathクラスのメンバ) ・MathクラスはC#システムが提供する数学的なパーツ集。クラスを構成する要素をメンバという。 ・クラスのメンバを用いるには「クラス名.メンバ名」とする場合と、後述するオブジェクトを使う場合がある。 ・ここで用いる PI、Sin()、Round()は「クラス名.メンバ名」で利用できる(後述する静的メンバなので) ・Math.PI:円周率が格納されている定数 ・Math.Sin(実数):指定した実数で得た三角関数のサインを返すメソッド。実数では角度のラジアン値を指定する。  ※ ラジアン値:角度÷180×円周率 ・Math.Round(実数):小数点以下を四捨五入する(最も近い整数を返す) p.121 sin01.cs //p.121 sin01.cs using System; class sin01 { public static void Main() { double s; //0度から180度(PI)までについて、180/45=4度ごとに繰り返す for (double a = 0.0; a <= Math.PI; a += Math.PI / 45.0) { s = Math.Sin(a); //現在の角度のサイン値を得る Console.Write("{0,7:#.#####}:", s); //7桁で表示 for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍(小数点以下切上げ)回繰返す Console.Write("*"); //「*」を表示して棒グラフにすること } Console.WriteLine(); //改行しておく } } } アレンジ演習:p.121 sin01.cs ・1行目の「0.0」が表示されず、小数点の位置がずれていることを改善しよう ・そのために、小数点以下を5桁固定で末尾の0を省略しないように指定すれば良い(p.32参照) 作成例 //アレンジ演習:p.121 sin01.cs using System; class sin01 { public static void Main() { double s; //0度から180度(PI)までについて、180/45=4度ごとに繰り返す 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桁固定で表示 for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍(小数点以下切上げ)回繰返す Console.Write("*"); //「*」を表示して棒グラフにすること } Console.WriteLine(); //改行しておく } } } アレンジ演習:p.121 sin01.cs ⇒ cos01.cs ・サインではなく、コサインにしよう  https://irf.rundog.org/wp-content/uploads/DSC_0859-scaled.jpg ・コサイン値はMath.Cos()メソッドで得られる ・ただし、0度から180度のサインは0.0~1.0だが、コサインは1.0から-1.0になる ・そこで、コサインの値が-1.0のときには「*」を0個、1.0の時には「*」を50個出すようにしよう ・つまり「Math.Round(s * 50)」を「Math.Round((s + 1) * 25)」とすれば良い 作成例 //アレンジ演習:p.121 sin01.cs ⇒ cos01.cs using System; class sin01 { public static void Main() { double s; //0度から180度(PI)までについて、180/45=4度ごとに繰り返す 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桁固定で表示 for (int i = 1; i <= Math.Round((s + 1) * 25); i++) { //コサイン値+1の25倍(小数点以下切上げ)回繰返す Console.Write("*"); //「*」を表示して棒グラフにすること } Console.WriteLine(); //改行しておく } } } p.122 while文 ・if文を第2要素のみにした繰り返し構文がwhile文 ・よって「回数指定の繰り返し」ならforを、回数が決まらない繰り返しならwhileを用いると良い ・書式: while(継続条件){…} ・なお、for文とwhile文は繰り返しの1回目の前に継続条件のチェックをするので、前判定繰り返しという。 ・前判定繰り返しは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); //0から99までを3桁で表示 i++; //インクリメントする } } } アレンジ演習:p.124 while01.cs ⇒ whilefor01.cs ・for文で書き直そう //アレンジ演習:p.124 while01.cs ⇒ whilefor01.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); //0から99までを3桁で表示 } } } p.124 条件式は必ずbool型 ・for文の第2要素(継続条件)および、while文、do-while文の継続条件には、bool型の変数または式のみ記述できる ・よって、bool型を返す演算子である関係演算子の式を用いることが多い。 ・なお、C/C++では整数値でbool型を代用できるため「while(1)」などの表記が可能だが、C#では文法エラーになる p.125 while文を使った無限ループ ・無限ループはfor文の第2要素の省略で可能だが、第1要素も第3要素も省略した「for(;;)」を用いる代わりに、 「while(true)」とする方が分かりやすい。 ・なお、繰り返し文の中でbreakを実行することで、ループを抜けられるが、switch-case文のbreak文はswitch構造の一部なので、ループは抜けないので注意 ・また、2重ループの内側のループの中でbreakを実行すると、内側のループのみを抜けるので、外側のループは続行になる p.125 menu01.cs //p.125 menu01.cs using System; class menu01 { public static void Main() { bool bEnd = false; //bool型の変数で表した終了フラグをオフにする 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": //0:終了 bEnd = true; //終了フラグをオンにする break; //switch構造を抜ける(繰返しは抜けない) case "1": //1:ファイル Console.WriteLine("ファイルが選択されました"); break; //switch構造を抜ける(繰返しは抜けない) case "2": //2:編集 Console.WriteLine("編集が選択されました"); break; //switch構造を抜ける(繰返しは抜けない) default: Console.WriteLine("入力に間違いがあります"); break; //switch構造を抜ける(繰返しは抜けない) } Console.WriteLine(); //改行 if (bEnd) { //「if (bEnd == true)」と同じ意味:終了フラグがオン? Console.WriteLine("それでは、このプログラムを終了します"); break; //繰り返しを抜ける } } } } 提出:アレンジ演習:p.125 menu01.cs ・終了フラグ「bool bEnd = false;」を用いずに同じ処理になるようにしよう 次回予告:p.127「do while文」から