講義メモ ・「p.116 for文:つづき」についての補足説明の後、p.117「forループからの脱出」に進みます。 アレンジ演習:p.116 for02.cs ・このプログラムではfor文の外でカウンタ用の変数iを宣言しているので、for文を抜けた後でも変数iの値を表示したり再利用することができる ・よって、for文を抜けた直後の変数iの値を表示して確認しよう 作成例 //アレンジ演習:p.116 for02.cs using System; class for02 { public static void Main() { int i; //カウンタ用変数を定義 for (i = 4; i >= 0; i--) { //カウンタ用変数を4から、0以上である間、-1しつつ繰返す Console.WriteLine("i = {0}", i); } Console.WriteLine("繰返し終了時のi = {0}", i); //【追加】 } } p.116「for文:つづき」についての補足説明 ・この例で分かる通り、カウンタ用変数の値を繰返し終了の後にも使いたい場合は、事前に宣言する ・しかし、繰返し終了の後のカウンタ用変数の値は範囲を超えているので、不用意に用いるとトラブルの基になる ・よって、どうしても必要な場合を除いて、カウンタ用変数の宣言(初期化)はforの内部で行うと良い p.117 forループからの脱出 ・繰返しなどのブロック構造の中で break を実行するとブロックから抜けて、ブロック末尾の「}」の直後にジャンプして続行する ・switch文(p.109)のbreakも同様の役割になっている ・なお、for文の継続条件は省略可能で、省略すると無限ループになる ・一般的に、無限ループで組んでおいて、なんらかの状況の発生時にbreakで抜けるような仕組みも多い。 ・しかし、意図しない無限ループには注意 ・なお、for文の全構造は省略可能なので、単純に無限ループしたいだけなら「for (;;) {繰返し内容}」とすれば良い アレンジ演習 p.117 for03.cs ・for文を抜けた直後の変数iの値を表示して確認しよう ・なお、抜けられない無限ループに陥った場合は、キーボードからCtrlキーを押しながらCキーをおすと強制停止できる 作成例 //アレンジ演習 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; //ループを抜ける } } //breakによりここにジャンプする Console.WriteLine("for終了時のi = {0}", i); //【追加】5 } } p.118「for文:つづき」についての補足説明 ・カウンタ用変数の宣言(初期化)はforの内部で行うことができる ・例: for (int i = 0; i < 5; i++) {繰返し内容} ・カウンタ用変数の値を繰返し終了の後にも使いたい場合は、事前に宣言するが、繰返し終了の後のカウンタ用変数の値は範囲を超えているので、不用意に用いるとトラブルの基になる ・よって、カウンタ用変数の宣言(初期化)はforの内部で行うと良い ・この変数は繰返し終了時に破棄されるので、外側で不用意に用いられる懸念がなくなる ・つまり、カウンタ用変数は全て同じ名前で良い(一般に、i、ctrなどが用いられる) p.119 forループのネスト ・ネストは「入れ子」ともいい、ある構造の中に同じ構造を置くこと。 ・forループの場合、繰返し内容としてforループを記述できる。この構造を「forループのネスト」「2重ループ」などという ・なお、そのまた内側でもforループを記述できるので、多重ループが可能 ・2重ループでは縦と横の2D構造を、3重ループでは奥行を含めた3D構造を扱いやすい ・forループのネストでは外側用のカウンタ変数と内側用のカウンタ変数を別にする。なお、i、jとすることが多い ・例:1階1号室から3階4号室まで12部屋について繰返す  for (int i = 1; i <= 3; i++) { //外側の繰返し(例:i階)   for (int j = 1; j <= 4; j++) { //内側の繰返し(例:j号室)    繰返し内容=3回×4回実行される(1階1号室,1階2号室,1階3号室,1階4号室,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の段から9の段まで繰返す for (j = 1; j <= 9; j++) { //(段ごとに)×1から×9まで繰返す //Console.WriteLine("{0} * {1} = {2}", i, j, i * j); //表示【削除】 Console.Write("{0,3}", i * j); //【変更】積のみ表示(桁数指定:p.29)、改行しない } //×1から×9までの繰返しの終わり //Console.WriteLine("------------"); //区切り線を表示【削除】 Console.WriteLine(); //【変更】改行のみを行う } //1の段から9の段までの繰返しの終わり } } p.121 sin01.cs補足① Math.PI定数 ・Mathクラス(クラスの意味は後述するが、部品の位置づけ)に含まれる定数(p.39) ・適度な精度の円周率が格納されている p.121 sin01.cs補足② Math.Sinメソッド ・Mathクラスに含まれるメソッドで、角度を渡すとそのサイン値が返される ・但し、角度はラジアン値(180度を円周率とした時の度数分の値)で指定する ・ラジアン値はdouble型で渡し、サイン値はdouble型で返される。 ・よって、Sin(180度)は0.0なので、Math.Sin(Math.PI)とすると、180度のサインなので0.0が返される  例: Console.WriteLine(Math.Sin(Math.PI)) ⇒ 0が表示される  例: Console.WriteLine(Math.Sin(Math.PI / 2)) ⇒ 1が表示される (Sin(90度)は1.0なので) p.121 sin01.cs補足③ Math.Roundメソッド ・Mathクラスに含まれるメソッドで、小数点以下を四捨五入した値が返される ・元の値はdouble型で渡し、四捨五入結果もdouble型で返される。  例: Console.WriteLine(Math.Round(2.56)) ⇒ 3が表示される アレンジ演習:p.121 sin01.cs ・小数点以下を5桁固定で表示されるようにしよう(すると1行目に「0.0」が表示される)  ヒント:「{0,7:####}」を「{0,7:#.00000}」とすれば良い 作成例 //アレンジ演習:p.121 sin01.cs using System; class sin01 { public static void Main() { double s; //サイン値 //角度のラジアン値0.0(0度)からPI(180度)まで 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); //[変更】小数点以下5桁固定で表示 for (int i = 1; i <= Math.Round(s * 50); i++) { //サイン値の50倍だけ Console.Write("*"); //アスタリスクを描くことで棒グラフにする } Console.WriteLine(); //1行分出来たの改行 } } } ミニ演習 cos01.cs ・p.121 sin01.csを基に、コサインカーブを描こう ・Math.Sin()をMath.Cos()にすれば良い ・ただし、0度から180度のサインは0.0~1.0だが、コサインは-1.0から1.0になる ・そこで、コサイン値に1を加算して0.0~2.0にして、コサイン値の25倍だけの「*」を描くようにしよう 作成例 //ミニ演習 cos01.cs using System; class sin01 { public static void Main() { double s; //コサイン値 //角度のラジアン値0.0(0度)からPI(180度)まで 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); //小数点以下5桁固定で表示 for (int i = 1; i <= Math.Round((s + 1) * 25); i++) { //【変更】コサイン値+1の25倍だけ Console.Write("*"); //アスタリスクを描くことで棒グラフにする } Console.WriteLine(); //1行分出来たの改行 } } } p.122 while文 ・for文の継続条件のみを記述するシンプルな繰返し文 ・よって「●●であるあいだ、繰返す」場合に向いている ・for文と同じ前判定繰り返しになり、初回のチェックで継続条件が成立しないと、1度も繰返さない ・ちなみに、for文で書かれたものは全てwhile文で記述できる 例:  for(①; ②; ③) {   ④  }   ↓for文で上記の用に記述したものと、while文で下記のように記述したものは同じ  ①  while(②) {   ④   ③  } アレンジ演習:p.124 while01.cs ・while文を抜けた直後の変数iの値を表示して確認しよう 作成例 //アレンジ演習: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の値を3桁指定で表示 i++; //iの値をインクリメント } Console.WriteLine("ループ終了時のi = {0,3}", i); //iの値を3桁指定で表示(100) } } ミニ演習 mini124.cs ・p.124 while01.csをfor文で書き直そう ・アレンジ演習で追加した「直後の変数iの値を表示」する処理は削除して良い 作成例 //ミニ演習 mini124.cs using System; class mini124 { public static void Main() { for (int i = 0; i < 100; i++) { //iの値が100未満である間、繰返す Console.WriteLine("i = {0,3}", i); //iの値を3桁指定で表示 } } } p.125 whileを使った無限ループ ・whileのカッコ内はforの場合と異なり、省略不可 ・そこで、無限ループを表すには、bool型のリテラルtrueを用いて「while (true) {繰返し内容」」とする  ※ C/C++などでは「while(1)」とできるがC#ではエラーになる ・無限ループからの脱出はforの場合の同様に「break」を用いる アレンジ演習: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": case "O": //【追加】大文字のオーでも終了する case "o": //【追加】小文字のオーでも終了する bEnd = true; break; case "1": Console.WriteLine("ファイルが選択されました"); break; case "2": Console.WriteLine("編集が選択されました"); break; default: Console.WriteLine("入力に間違いがあります"); break; } Console.WriteLine(); if (bEnd) { Console.WriteLine("それでは、このプログラムを終了します"); break; } } } } p.127 do-while文 ・後判定繰り返し文で、繰返し内容を実行してから、繰返しを続行するか判断したい場合に用いる ・よって、入力データのチェックなどに活用される ・書式: do { 繰返し内容 } while (継続条件); //末尾にセミコロンが必要 ・たとえば、Yかyが入力されるまで先に進まないようにする場合などに便利 ・例:  string ans;  do { //繰返し開始   なんらかの処理   ans = Console.ReadLine();  } while (ans != "Y" && ans != "y"); //入力がYでなくyでもなければdoに戻る(Yかyが入力されたら抜ける) ※ 繰返し内容が1行しかなくても{}は省略しないことを推奨 アレンジ演習:p.128 do_while01.cs ・変数iの初期値をコンソールから入力するようにしよう ・そして、iの値を20超にすると、無限ループすることを確認しよう  ※ キーボードからCtrlキーを押しながらCキーで止められる 作成例 //アレンジ演習:p.128 do_while01.cs using System; class do_while01 { public static void Main() { int i = 10; Console.Write("i : "); i = int.Parse(Console.ReadLine()); //iの値を変更 do { //繰返し開始 Console.WriteLine("i = {0}", i); //この行は必ず1度は実行 } while (i > 20); //継続条件(10のままだと継続しないが、20超だと無限ループ) } } ミニ演習 mini128.cs ・p.106 bmi01.csを改良して、身長および体重において正の数が入力されるまで先に進まないようにしよう ・つまり、負の数が入力されている間、入力案内の表示、入力と変換を繰返すと良い 作成例 //ミニ演習 mini128.cs using System; class bmi01 { public static void Main() { double bl, bw; //【移動」身長、体重 do { //【追加】身長用の入力ループ Console.Write("身長(cm)---"); string stBl = Console.ReadLine(); bl = Convert.ToDouble(stBl); //【変更】宣言済変数を用いる } while (bl < 0); //【追加】負の数であるあいだ、繰返す(抜けない) do { //【追加】体重用の入力ループ Console.Write("体重(kg)---"); string stBw = Console.ReadLine(); bw = Convert.ToDouble(stBw); } while (bw < 0); //【追加】負の数であるあいだ、繰返す(抜けない) double bmi = bw / Math.Pow((bl / 100.0), 2.0); Console.WriteLine("BMI = {0:##.#}", bmi); if (bmi >= 25.0) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("BMIが25以上です!!"); Console.ForegroundColor = ConsoleColor.Black; } else Console.WriteLine("BMIは25未満です"); } } p.128 goto文:通常、利用禁止なので割愛 p.130 continue文 ・breakと同様に繰返し内容の中で用いる制御文 ・実行すると、その時の繰返し内容の後続部分をスキップして、次の繰返しに進む ・「次いこう、次」のイメージで、ループは中断されず、継続される ・p.130 continue01.csのように、if文で代用できることもあるが、繰返し内容が複雑だったり、ネストが深い場合に用いると可読性や保守性が向上する 例: for(;;) {  if(①) {   if(②) {    処理A //①であり②である場合、処理Aを実行(この後、処理Bと処理Cも実行)   } else {    continue; //①であり②でない場合、処理Bと処理Cをスキップして次の繰返しへ   }   処理B //①であれば実行するが、②でない場合は実行しない  }  処理C //①②にかかわらず実行するが、①であり②でない場合は実行しない } アレンジ演習:p.130 continue01.cs ・100までの固定になっているが、コンソールから、いくつまでか入力できるようにしよう 次回予告:p.130 continue01.csの補足から再開し、p.132「練習問題」に進みます