・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ループからの脱出(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
・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
・サインではなく、コサインにしよう ・コサイン値は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)」とすれば良い
