・「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行分出来たの改行
}
}
}