アレンジ演習:p.121 sin01.cs その2「コサイン」
・SinをCosに変えてコサインを表示しよう ・0度から180度のサインは0.0~1.0だが、コサインは-1.0から1.0になる ・そこで、 サインの値が 1.0の時を50として、*の数を決める、のを コサインの値が+1.0が2.0の時を50として、*の数を決める、としよう。
作成例
//アレンジ演習:p.121 sin01.cs
using System;
class sin01 {
public static void Main() {
double s; //計算用(角度ごとのsin値を格納する)
//0度から180度(Math.PI)まで180÷45=4度ごとのラジアン値を求めて繰返す
for (double a = 0.0; a <= Math.PI; a += Math.PI / 45.0) { //1の段から9の段について繰返す
s = Math.Cos(a); //【変更】コサイン値を得る
Console.Write("{0,7:#.00000}:", s); //小数点以下5桁まで全7桁でコサイン値を表示
//コサイン値が1の時に50回になるように繰返す
for (int i = 1; i <= Math.Round((s + 1) * 25); i++) { //【変更】
Console.Write("*"); //コサイン値に比例する数だけ"*"を表示
}
Console.WriteLine(); //最期の"*"後に改行
}
}
}
p.122 while文
・for文の継続条件のみを指定できる繰り返し文 ・主に、回数指定ではなく、なんらかの条件が成立している間は何度でも繰返す場合に用いる ・なお、for文で書かれたものは全てwhile文で記述できる ・for文と同様に前判定繰り返しなので、内容が1度も実行されない場合があるときに便利
p.124 while01.cs
//p.124 while01.cs
using System;
class while01 {
public static void Main() {
int i = 0;
while (i < 100) { //100未満である間繰返す
Console.WriteLine("i = {0,3}", i); //3桁で表示
i++;
}
}
}
アレンジ演習:p.124 while01.cs
・for文にしてみよう
作成例
//アレンジ演習:p.124 while01.cs
using System;
class while01 {
public static void Main() {
for (int i = 0 ;i < 100; i++) { //0からカウントアップしながら100回繰返す
Console.WriteLine("i = {0,3}", i); //3桁で表示
}
}
}
p.125 while文を使った無限ループ
・for(;;)と同様に、while(true)とすると無限ループにできる ※ C/C++等のようにwhile(1)とすることはできない ・for(;;)と同様に、break文で脱出することができる
p.125(フラグとして用いるbool型変数)
・0(false)または1(true)しか取らない変数(の用途)にフラグがある。オン/オフの状態を保持するためのもので、
C/C++等ではint型の変数を用いることがあった
・C#ではbool型変数を用いることが出来、トラブルを回避または軽減できる
・p.125 menu01.csでは、終了フラグbENDを定義して、メニューから終了が選ばれた場合に、終了する旨を表示してから
抜ける方式を実現している。
・また、if(bool型変数) や、while(bool型変数)、for(;bool型変数;)と比較演算式の代わりも利用できる
例: bool y = true; if(y){…} , while(y){…} , for(;y;){…}
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": bEnd = true; break; //switch文を抜けるため
case "1": Console.WriteLine("ファイルが選択されました"); break;
case "2": Console.WriteLine("編集が選択されました"); break;
default: Console.WriteLine("入力に間違いがあります"); break;
}
Console.WriteLine(); //改行
if (bEnd) { //終了フラグが立っていたら(bool型変数なので条件式などと同様)
Console.WriteLine("それでは、このプログラムを終了します");
break; //whileの繰り返しを抜けるため
}
}
}
}
p.127 do while文
・単にdo文ともいい、唯一の後判定繰り返し構文。
・繰り返し内容を1度は実行しないと繰り返しを継続すべきか決められない場合などに便利
・よって「入力値が範囲外である間繰返す=範囲内になるまで抜けられない」場合に用いることが多い
・書式: do {繰り返し内容} while(継続条件); //末尾にセミコロンが必要
p.128 do_while01.cs
//p.128 do_while01.cs
using System;
class do_while01 {
public static void Main() {
int i = 10;
do { //繰り返し開始
Console.WriteLine("i = {0}", i); //この内容は必ず1回以上実行される
} while (i > 20); //繰り返しを続けるか判断する
}
}
アレンジ演習:p.106 bmi01.cs
・身長および体重において正の数が入力されるまで再入力を繰返させるようにしよう 実行例 身長(cm):0 身長(cm):-10 身長(cm):170 体重(kg):0 体重(kg):60 BMI = 20.8 BMIは25未満です ・ヒント:do-whileが2つ必要
作成例
//アレンジ演習:p.106 bmi01.cs
using System;
class bmi01 {
public static void Main() {
double bl, bw; //【移動】
do { //【追加】繰返し開始
Console.Write("身長(cm):");
bl = Convert.ToDouble(Console.ReadLine()); //【変更】
} while (bl <= 0);//【追加】0または負の数が入力されている間繰返す(先に進めない)
do { //【追加】繰返し開始
Console.Write("体重(kg):");
bw = Convert.ToDouble(Console.ReadLine()); //【変更】
} while (bw <= 0);//【追加】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.Gray;
} else {
Console.WriteLine("BMIは25未満です");
}
}
}
※ p.128「goto文」はほとんどの業務において使用禁止なので説明は割愛
p.130 continue文
・breakと異なり、現在実行中の繰り返しの後続部分をスキップするという意味
・いわば「次行こう、次」の意味
・よって、if文で代用できる場合が多いがスキップしたい条件が複雑な場合に用いると便利
例:
for(…) {
if(①) {
if(②) {
処理A
} else {
contine; //①であり②でなければ処理Bと処理Cは行わずに次へ
}
処理B
}
処理C
}
p.130 continue01.cs
//p.130 continue01.cs 0から100未満の2の倍数の合計を求める
using System;
class continue01 {
public static void Main() {
int sum = 0;
for (int i = 0; i < 100; 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を用いない方が見やすいプログラムになることを確認しよう
作成例
//アレンジ演習:p.130 continue01.cs 0から100未満の2の倍数の合計を求める
using System;
class continue01 {
public static void Main() {
int sum = 0;
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) { //iを2で割って余りが0かどうか(偶数かどうか)
sum += i;
Console.WriteLine("i = {0, 2}, sum = {1, 4}", i, sum);
}
}
Console.WriteLine("合計は {0}です", sum);
}
}
アレンジ演習:p.130 continue01.cs②
・このままではcontinueを用いない方が見やすいプログラムになってしまうので改良しよう
・iが奇数の場合、iが11の倍数であればループを抜け、でなければ次の繰り返しに進むするようにしてみよう
悪い例:
if (i % 2 == 0) {
sum += 1;
} else if (i % 11 == 0) {
break;
}
Console.WriteLine(…); //iが奇数で11の倍数ではない場合に実行してしまう
作成例
//アレンジ演習:p.130 continue01.cs 0から11未満の2の倍数の合計を求める
using System;
class continue01 {
public static void Main() {
int sum = 0;
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) { //iを2で割って余りが0かどうか(偶数かどうか)
sum += i; //合計に足しこむ
} else if (i % 11 == 0) { //iが11の倍数?
break; //繰り返しを抜ける
} else {
continue; //続きは行わずに次の繰返しへ
}
//iが奇数の場合はbreakまたはcontinueされるので次の行は実行されない
Console.WriteLine("i = {0, 2}, sum = {1, 4}", i, sum);
}
Console.WriteLine("合計は {0}です", sum);
}
}