p.102 if文
・条件演算子の構造を複数の文で柔軟に見やすく表現できる構文
・基本的構文
if (bool型を返す式) {
式がtrueである場合のみ実行すること
}
・例:
if (a == 0) {
Console.WriteLine("ゼロだ"); //変数aが0であれば「ゼロだ」と表示
}
・bool型を返す式を条件式ともいい、これがtrueかfalseかによって実行可否が決まる
・条件演算子の3項目にある「falseの場合の式(=でなければ)」をif文で扱う構文がif-else構文
・基本的構文
if (bool型を返す式) {
式がtrueである場合のみ実行すること
} else {
式がfalseである場合のみ実行すること
}
・よって、1つのifに対してelseを1つだけ記述できる
・例:
if (a % 2 == 0) {
Console.WriteLine("偶数"); //変数aが2で割り切れたら「偶数」と表示
} else {
Console.WriteLine("奇数"); //でなければ「奇数」と表示
}
・ifの条件に続く{…}をifブロック、elseに続く{…}をelseブロックという
・よって、ifブロックの内容と、elseブロックの内容はどちらかのみが実行される
・なお、ブロックの開始を示す「{」の位置については複数のルールがあり、チームルールを定めることがある
・ブロックの内容が1文の場合、{}は省略できる
・例: if (a == 0) Console.WriteLine("ゼロだ"); //変数aが0であれば「ゼロだ」と表示
※ チームルールによっては推奨されないことがある
・例: if (a == 0) Console.WriteLine("ゼロだ"); a = 100; //最後の代入はifとは無関係なのに誤読しやすい
p.103 if文:else if
・ifとelseの間に「ではなくて、もしも~なら」を意味する追加の条件文をelse if(…)で複数記述できる
・これにより多分岐構造を表現できる
・例:
if (a <= 0) { //0または負の数
Console.WriteLine("範囲外"); //変数aが0以下なら「範囲外」と表示
} else if (a % 2 == 0) { //ではなくて2の剰余が0
Console.WriteLine("偶数"); //変数aが0超で2で割り切れたら「偶数」と表示
} else { //どちらでもなければ
Console.WriteLine("奇数"); //変数aが0超で2で割り切れなければ「奇数」と表示
}
・なお、else if(…)の後にelseがなくてもOK
・また、elseの後にはelse ifを記述できない
アレンジ演習:p.104 if01.cs
・nの値を10固定ではなく、コンソールから入力するようにしよう ・「nは5より大きくはない」を分割して「nは5より小さい」と「nは5と等しい」のどちらかを表示するようにしよう
作成例
// if01.cs
using System;
class if01
{
public static void Main()
{
int n;
Console.Write("整数値:");
n = int.Parse(Console.ReadLine());
if (n > 5) { //nは5超?
Console.WriteLine("nは5より大きい");
}
else if (n == 5) { //ではなくて5と等しい?
Console.WriteLine("nは5と等しい");
}
else { //どちらでもない?(nは5未満)
Console.WriteLine("nは5より小さい");
}
}
}
p.105 if02.cs に関して補足
・「int nShojikin = Int32.Parse(stShojikin);」はintかInt32かに統一すると良い ⇒「Int32 nShojikin = Int32.Parse(stShojikin);」 ⇒「int Shojikin = int.Parse(stShojikin);」 ※ 業務上、統一が義務化される場合もある
アレンジ演習:p.105 if02.cs
・Parseの前後の型を「int」または「Int32」に統一しよう(どちらでもOK)
作成例
//アレンジ演習:p.105 if02.cs
using System;
class if02
{
public static void Main()
{
Console.Write("所持金はいくらですか---");
string stShojikin = Console.ReadLine();
int nShojikin = int.Parse(stShojikin); //【変更】
Console.Write("単価はいくらですか---");
string stTanka = Console.ReadLine();
int nTanka = int.Parse(stTanka); //【変更】
Console.Write("何個買いますか---");
string stKosu = Console.ReadLine();
int nKosu = int.Parse(stKosu); //【変更】
int nSogaku = nTanka * nKosu;
if (nShojikin < nSogaku) {
Console.WriteLine("所持金が足りません");
}
else {
int nOtsuri = nShojikin - nSogaku;
Console.WriteLine("所持金は" + nOtsuri + "円残っています");
}
}
}
p.106 bmi01.cs に関して補足
・Math.Pow()メソッドはp.49参照
・Console.ForegroundColor は、Consoleクラスのプロパティ(p.207で後述)で、コンソールの文字色を指す。
・ConsoleColor.Red は、C#が提供するConsoleColor列挙型(p.66)の列挙子の一つ。整数0~15で示される16色が用意されている
・なお「文字色を黒に戻す」とあるが、コンソールの文字色の既定値はBlackではなくGrayなので、Grayに戻すと良い
・最後のif文のelseの{}が略されているが、ifブロックの{}があるので、この省略は推奨されないことがある
・文字列の実数型への変換に「Convert.ToDouble」を用いているが、これは.NET型の表記なので左辺もSystem.Double型に統一するか、double.Parseにすると良い。
アレンジ演習:p.106 bmi01.cs
・「BMIは25未満です」を「BMIは20~25なので標準的です」に書き換えよう ・そして、BMIが20未満であれば「BMIが20未満です!!」と水色(Cyan)で表示しよう
作成例
//アレンジ演習:p.106 bmi01.cs
using System;
class bmi01
{
public static void Main()
{
Console.Write("身長(cm)---");
string stBl = Console.ReadLine();
double bl = Convert.ToDouble(stBl); //文字列からdouble型の変換
Console.Write("体重(kg)---");
string stBw = Console.ReadLine();
double bw = Convert.ToDouble(stBw); //文字列からdouble型の変換
double bmi = bw / Math.Pow((bl / 100.0), 2.0); //体重÷身長(m)の2乗
Console.WriteLine("BMI = {0:##.#}", bmi); //BMIを小数点以下1桁まで表示
if (bmi >= 25.0) {
Console.ForegroundColor = ConsoleColor.Red; //文字色を赤に
Console.WriteLine("BMIが25以上です!!");
Console.ForegroundColor = ConsoleColor.Gray; //【変更】灰色
}
else if (bmi < 20.0) { //【以下追加】
Console.ForegroundColor = ConsoleColor.Cyan; //文字色を水色に
Console.WriteLine("BMIが20未満です!!");
Console.ForegroundColor = ConsoleColor.Gray; //灰色
}
else {
Console.WriteLine("BMIは20~25なので標準的です"); //【変更】
}
}
}
p.107 bmi02.cs に関して補足
・各「else if」において直前の条件文の該当部分を取り除く表現をしているが、まったく無意味 ・「else」には「ではなくて」の意味があるので不用 ・無駄な条件文を記述すると、保守性が低い(変更や改良の効率が悪い)プログラムになってしまう ・なお、最後に文字色を白に戻しているが、コンソールの文字色の既定値はBlackではなくGrayなので、Grayに戻すと良い
アレンジ演習:p.107 bmi02.cs
・各「else if」にある直前の条件文の該当部分を取り除く表現を削除しよう ・各「else if」にある直前の条件文の該当部分を取り除く表現を削除しよう ・最後に文字色をGrayに戻そう ・文字列の実数型への変換にはdouble.Parseを用いよう
作成例
//アレンジ演習:p.107 bmi02.cs
using System;
class bmi02
{
public static void Main()
{
string strShow = "BMIは{0:##.#}で{1}です"; //書式指定文字列の事前定義
Console.Write("身長(cm)---");
string strBl = Console.ReadLine();
double bl = double.Parse(strBl); //【変更】
Console.Write("体重(kg)---");
string strBw = Console.ReadLine();
double bw = double.Parse(strBw); //【変更】
double bmi = bw / Math.Pow((bl / 100.0), 2.0);
if (bmi < 18.5) {
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine(strShow, bmi, "やせすぎ");
}
else if (bmi < 25.0) { //【変更】「bmi >= 18.5 && 」は不用
Console.WriteLine(strShow, bmi, "適正体重");
}
else if (bmi < 30.0) { //【変更】「bmi >= 25.0 && 」は不用
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.WriteLine(strShow, bmi, "第1度肥満");
}
else if (bmi < 35.0) { //【変更】「bmi >= 30.0 && 」は不用
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine(strShow, bmi, "第2度肥満");
}
else if (bmi < 40.0) { //【変更】「bmi >= 35.0 && 」は不用
Console.ForegroundColor = ConsoleColor.Magenta;
Console.WriteLine(strShow, bmi, "第3度肥満");
}
else {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(strShow, bmi, "第4度肥満");
}
Console.ForegroundColor = ConsoleColor.Gray; //【変更】
}
}
p.109 switch文
・if-else if-else構文のような多分岐構造の専用の構文で、各種の言語に実装されている
・ただし、C#のswitch文は文法ルールがC/C++等とは異なるの注意
・書式:
switch (整数またはstring型の式) {
case 整数値か文字列① : ①と等しい場合の処理; …; break;
case 整数値か文字列② : ②と等しい場合の処理; …; break;
:
default : 上記のどれでもない場合の処理; …; break; //省略可
}
・整数またはstring型のみが可能で、実数は指定できない
・なお、char型は内部的に整数の文字コードになるので、指定可能
・C/C++等では「default :」の「break;」は記述してもしなくても良いが、C#では必須。
・また、C/C++等では「case ●:」の「break;」を記述しないことで特殊な動作をさせるフォールスルー(p.110)が可能だが、C#では不可。
・「case ●:」の「整数値か文字列」は、定数または定数式(定数を返す式)である必要があり、変数や変数を含む式は記述できない
p.111 switch01.cs に関して補足
・文字列のint型への変換に「Int32.Parse」を用いているが、これは.NET型の表記なので左辺もSystem.Int32型に統一するか、 int.Parseにすると良い。
アレンジ演習:p.111 switch01.cs
・Menuに「4:印刷」を追加し、switch文に反映しよう ・int型への変換はint.Parseにしよう
作成例
//アレンジ演習:p.111 switch01.cs
using System;
class switch01
{
public static void Main()
{
Console.WriteLine("******* Menu *******");
Console.WriteLine("1:ファイル");
Console.WriteLine("2:編集");
Console.WriteLine("3:表示");
Console.WriteLine("4:印刷"); //【追加】
Console.WriteLine("0:終了");
Console.WriteLine("********************");
Console.Write("\n選択---");
string strAns = Console.ReadLine();
int ans = int.Parse(strAns); //【変更】
switch (ans) {
case 1:
Console.WriteLine("ファイルが選択されました");
break;
case 2:
Console.WriteLine("編集が選択されました");
break;
case 3:
Console.WriteLine("表示が選択されました");
break;
case 4: //【追加】
Console.WriteLine("印刷が選択されました"); //【追加】
break; //【追加】
case 0:
Console.WriteLine("終了が選択されました");
break;
default:
Console.WriteLine("入力ミスです");
break;
}
}
}
アレンジ演習:p.113 switch02.cs
・if-else if-else構造で書き換えよう
作成例
//アレンジ演習:p.113 switch02.cs
using System;
class switch02
{
public static void Main()
{
Console.WriteLine("******* Menu *******");
Console.WriteLine("1:ファイル");
Console.WriteLine("2:編集");
Console.WriteLine("3:表示");
Console.WriteLine("0:終了");
Console.WriteLine("********************");
Console.Write("\n選択---");
string strAns = Console.ReadLine();
if (strAns == "1") { //【変更】
Console.WriteLine("ファイルが選択されました");
} else if (strAns == "2") { //【変更】
Console.WriteLine("編集が選択されました");
} else if (strAns == "3") { //【変更】
Console.WriteLine("表示が選択されました");
} else if (strAns == "0") { //【変更】
Console.WriteLine("終了が選択されました");
} else { //【変更】
Console.WriteLine("入力ミスです");
}
}
}
補足:caseの多重化
・C#では「case ●:」の後に処理を記述した場合は「break;」が必須だが、「case ●:」のみを記述して分岐先をしてできる
・このことを利用して「または」構造を表現できる
・例:
switch (str) {
case "Y" : //strが"Y"であればここに分岐してそのまま次の「case "y"」に進む
case "y" : Console.WriteLine("はい"); break;
case "N" : //strが"N"であればここに分岐してそのまま次の「case "x"」に進む
case "n" : //strが"n"であればここに分岐してそのまま次の「case "x"」に進む
case "X" : //strが"X"であればここに分岐してそのまま次の「case "x"」に進む
case "x" : Console.WriteLine("いいえ"); break;
}
アレンジ演習:p.113 switch02.cs つづき
・元のswitch文にもどしてから、"0"の代わりに、"Q"でも"q"でも"終了が選択されました"と表示するようにしよう
作成例
//アレンジ演習:p.113 switch02.cs つづき
using System;
class switch02
{
public static void Main()
{
Console.WriteLine("******* Menu *******");
Console.WriteLine("1:ファイル");
Console.WriteLine("2:編集");
Console.WriteLine("3:表示");
Console.WriteLine("0:終了(Q/qでも可)"); //【変更】
Console.WriteLine("********************");
Console.Write("\n選択---");
string strAns = Console.ReadLine();
switch (strAns) {
case "1":
Console.WriteLine("ファイルが選択されました");
break;
case "2":
Console.WriteLine("編集が選択されました");
break;
case "3":
Console.WriteLine("表示が選択されました");
break;
case "0":
case "Q": //【追加】
case "q": //【追加】
Console.WriteLine("終了が選択されました");
break;
default:
Console.WriteLine("入力ミスです");
break;
}
}
}
p.115 for文
・C#の繰返し構文は4種類あり、それぞれ特性があり、繰返しの内容に応じて使い分けると良い
・for文は「回数指定の繰返し」に向く構文
・書式: for (①初期化子; ②条件式; ③反復子) { 繰返し内容 }
①初期化子:繰返しの開始直前に1度だけ行うこと。主に、回数カウンタのクリアに利用
②条件式:繰返しの継続条件となるbool型を返す式。主に、回数カウンタ < 回数 (カウンタが0からの場合)
③反復子:繰返しの最後に毎回行うこと。主に、回数カウンタのカウントアップ(インクリメント)
・書式例: for (カウンタ変数 = 0; カウンタ変数 < 5; カウンタ変数++) { 5回繰返す処理 }
・実装例: for (int i = 0; i < 3; i++) { Console.Write("やらせはせん"); } //3回繰返す
この例では、iの値が0、1、2の順に変化し、3になったところで継続条件「i < 3」がfalseになってif文を抜ける
・if文と同様に、繰返し内容が1文の場合に{}を省略できるが、推奨されないことも多い
アレンジ演習:p.115 for01.cs
・このプログラムではfor文の外でカウンタ用の変数iを宣言しているので、for文を抜けた後でも変数iの値を表示したり再利用することができる ・よって、for文を抜けた直後の変数iの値を表示して確認しよう
作成例
//アレンジ演習:p.115 for01.cs
using System;
class for01
{
public static void Main()
{
int i; //カウンタ用変数
for (i = 0; i < 5; i++) { //カウンタ用変数を0から、5未満である間、+1しつつ繰返す
Console.WriteLine("i = {0}", i); //カウンタ用変数の値を表示
}
Console.WriteLine("繰返し終了時のi = {0}", i); //【追加】カウンタ用変数の値を表示(5)
}
}
p.116 for文:つづき
・繰返しはインクリメントではなくデクリメントで行うことが可能
・書式例: for (カウンタ変数 = 4; カウンタ変数 >= 0; カウンタ変数--) { 5回繰返す処理 }
こうすると、4,3,2,1,0とカウンタ変数が変化し、5回繰返しになる
アレンジ演習:p.116 for02.cs
・このプログラムではfor文の外でカウンタ用の変数iを宣言しているので、for文を抜けた後でも変数iの値を表示したり再利用することができる ・よって、for文を抜けた直後の変数iの値を表示して確認しよう
提出:アレンジ演習:p.116 for02.cs