・p.105「if02.cs」から再開します
提出フォロー:アレンジ演習:p.104 if01.cs・その3
・比較対象の値も5固定ではなくて、コンソールから入力するようにしよう
作成例
//アレンジ演習: p.104 if01.cs その3
using System;
class if01
{
public static void Main()
{
int n;
//n = 10;
Console.Write("n : "); n = int.Parse(Console.ReadLine()); //【変更】nを入力
int a; //【追加】比較対象
Console.Write("比較対象 : "); a = int.Parse(Console.ReadLine()); //【追加】aを入力
if (n > a) { //【変更】式「n > a」の評価がtrueなら後続のブロック内を実行
Console.WriteLine("nは{0}より大きい", a); //【変更】
}
else if (n < a) { //【変更】上記がfalseで式「n < a」の評価がtrueなら後続のブロック内を実行
Console.WriteLine("nは{0}より小さい", a); //【変更】
}
else { //上記の両方がfalseなら後続のブロック内を実行
Console.WriteLine("nは{0}", a); //【変更】
}
}
}
p.105 if02.cs 解説
・「Int32.Parse」の「Int32」は.NET型(p.42)の「int」なので、「int.Parse」と同じ意味 ・変数nSogakuについて:021行目でこの変数の初期化を行っているのは、023行目と027行目で用いているのが理由。 こうすることで、掛け算が1度で済む。
アレンジ演習:p.105 if02.cs
・String型の変数「stShojikin」「stTanka」「stKosu」はなくても良いので削除しよう。 ・int型の変数に対して「Int32.Parse」は適切ではないので、「int.Parse」に統一しよう。
作成例
//アレンジ演習:p.105 if02.cs
using System;
class if02
{
public static void Main()
{
Console.Write("所持金はいくらですか---");
int nShojikin = int.Parse(Console.ReadLine());
Console.Write("単価はいくらですか---");
int nTanka = int.Parse(Console.ReadLine());
Console.Write("何個買いますか---");
int nKosu = int.Parse(Console.ReadLine());
int nSogaku = nTanka * nKosu;
if (nShojikin < nSogaku) {
Console.WriteLine("所持金が足りません");
} else {
int nOtsuri = nShojikin - nSogaku;
Console.WriteLine("所持金は" + nOtsuri + "円残っています");
}
}
}
p.106 bmi01.cs 解説
・Convert.ToDouble()は、double.Parse()と同じ効果を持つ(p.47)
・Console.ForegroundColorは、コンソールの文字色を指すプロパティ(後述:値を設定/確認する仕掛)
・ConsoleColor.Redは、コンソールの色を提供する列挙型(p.66)
・ConsoleColor列挙型の列挙子として、Red、Black、Blue、DarkCyan(暗水色)、DarkYellow(暗黄色)、Mazenta(赤紫)、Whiteなどが
ある
・「##.#」は最低限でも整数部は2桁取り、小数点以下は1桁にするカスタム書式指定(p.32)
・なお、BMIは肥満度で、体重(kg)÷身長(m)の2乗で得る。
・Math.Pow(p.49)は累乗値をdouble型で返す
・028行目でelseの後の{}を省略しているが、その前のifには{}があるので、中途半端な省略であり誤読の懸念があり、
推奨されないことが多い。
アレンジ演習:p.106 bmi01.cs
・String型の変数「stBl」「stBw」「stKosu」はなくても良いので削除しよう。
・誤読の懸念がある「{}の省略」を改善しよう
・文字色を黒にもどしているが、Visual Studio 2022のコンソールの文字色は黒ではない。灰色(Gray)にしよう。
作成例
//アレンジ演習:p.106 bmi01.cs
using System;
class bmi01
{
public static void Main()
{
Console.Write("身長(cm)---");
double bl = Convert.ToDouble(Console.ReadLine()); //【変更】
Console.Write("体重(kg)---");
double bw = Convert.ToDouble(Console.ReadLine()); //【変更】
double bmi = bw / Math.Pow((bl / 100.0), 2.0); //BMI=体重÷身長の自乗
Console.WriteLine("BMI = {0:##.#}", bmi); //小数点以下1桁まで表示
if (bmi >= 25.0) {
//Console.BackgroundColor = ConsoleColor.Green; //【参考】文字の背景色を緑にする
Console.ForegroundColor = ConsoleColor.Red; //文字色をに赤する
Console.WriteLine("BMIが25以上です!!");
Console.ForegroundColor = ConsoleColor.Gray; //【変更】文字色を灰色に
}
else {
Console.WriteLine("BMIは25未満です");
}
}
}
p.106 bmi02.cs 解説
・009行目の変数「strShow」は023行目以降のConsole.WriteLineで用いる書式文字列
・このように変数としてあらかじめ用意しておいて、複数のConsole.WriteLineで使いまわしすることも可能
・つまり、変数「strShow」を用いない場合、023行目は下記のようになる
Console.WriteLine("BMIは{0:##.#}で{1}です", bmi, "やせすぎ");
・この「"BMIは{0:##.#}で{1}です"」を変数「strShow」で与えるので下記のようになる
Console.WriteLine(strShow, bmi, "やせすぎ");
・この工夫をするために、判定結果を別の文字列にしているところが、このプログラムの良さ。つまり本来は:
Console.WriteLine("BMIは{0:##.#}でやせすぎです", bmi);
・この工夫により可読性(読みやすさ)や保守性(変更しやすさ)を向上している
アレンジ演習:p.107 bmi02.cs
・複数ある「●● && ■■」の構文の「●● &&」が不要であることを確認しよう ・文字色を白に戻しているが、Visual Studio 2022のコンソールの文字色は白ではない。灰色(Gray)にしよう。
作成例
//アレンジ演習:p.108 bmi02.cs
using System;
class bmi02
{
public static void Main()
{
string strShow = "BMIは{0:##.#}で{1}です"; //形式指定文字列の使いまわし用
Console.Write("身長(cm)---");
double bl = Double.Parse(Console.ReadLine()); //【変更】
Console.Write("体重(kg)---");
double bw = Double.Parse(Console.ReadLine()); //【変更】
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) { //【変更】
Console.WriteLine(strShow, bmi, "適正体重");
}
else if (bmi < 30.0) { //【変更】
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.WriteLine(strShow, bmi, "第1度肥満");
}
else if (bmi < 35.0) { //【変更】
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine(strShow, bmi, "第2度肥満");
}
else if (bmi < 40.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 5.3 switch文
・整数値か文字列値による多分岐に特化した構文としてswitch文がある
・条件ではなく、値による分岐だが、可読性(読みやすさ)や保守性(変更しやすさ)を向上できる
・なお、実数値は利用できない
※ switch文は各種のプログラム言語で実装されているが、文法ルールが異なるので注意
・基本書式Ⅰ:
switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {
case 定数または定数を返す式①:
①の時の実行文;
break;
case 定数または定数を返す式②:
②の時の実行文;
break;
:
}
p.109 5.3 switch文(続き)
・他の言語におけるswitch文とは異なり、caseの実行文の後にはbreak;が必須
・「または」を意味する構文が必要な場合は、中身のないcaseを連続で記述できる
・基本書式Ⅱ:
switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {
case 定数または定数を返す式①:
case 定数または定数を返す式②:
①または②の時の実行文;
break;
case 定数または定数を返す式③:
③の時の実行文;
break;
:
}
p.109 5.3 switch文(続き)
・if-else if-else構文の最後のelseと同様に「上記のどれでもなければ」を意味する「default:」を追記できる
・他の言語におけるswitch文とは異なり、default:の実行文の後にもbreak;が必須
・基本書式Ⅲ:
switch (整数型または文字列型の変数か、整数値か文字列値を返す式) {
case 定数または定数を返す式①:
①の時の実行文;
break;
case 定数または定数を返す式②:
②の時の実行文;
break;
:
default:
上記のどれでもない場合の実行文;
break;
}
・なお、case、defaultは文ではなくラベル扱いなので末尾は「:」(コロン)とする
・breakは(他の用途でも用いる)脱出文なので末尾は「;」(セミコロン)とする
アレンジ演習:p.111 switch01.cs
・018行目の「Int16.」は「int」または「Int32.」にしないと無駄な型変換を行ってしまう ・変数「strAns」を除去しよう
作成例
//アレンジ演習: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("0:終了");
Console.WriteLine("********************");
Console.Write("\n選択---");
int ans = int.Parse(Console.ReadLine()); //【変更&修正】
switch (ans) { //入力値の整数変換結果により多分岐する
case 1:
Console.WriteLine("ファイルが選択されました");
break;
case 2:
Console.WriteLine("編集が選択されました");
break;
case 3:
Console.WriteLine("表示が選択されました");
break;
case 0:
Console.WriteLine("終了が選択されました");
break;
default: //1,2,3,0以外の場合
Console.WriteLine("入力ミスです");
break;
}
}
}
アレンジ演習:p.113 switch02.cs
・「4:印刷」を追加しよう ・「one」「two」「three」「four」「zero」でも対応する分岐をするようにしよう
作成例
//アレンジ演習: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("4:印刷"); //【追加】
Console.WriteLine("0:終了");
Console.WriteLine("********************");
Console.Write("\n選択---");
string strAns = Console.ReadLine();
switch (strAns) { //文字列変数の値によって多分岐する
case "1":
case "one": //【追加】
Console.WriteLine("ファイルが選択されました");
break;
case "2":
case "two": //【追加】
Console.WriteLine("編集が選択されました");
break;
case "3":
case "three": //【追加】
Console.WriteLine("表示が選択されました");
break;
case "4": //【以下追加】
case "four":
Console.WriteLine("印刷が選択されました");
break;
case "0":
case "zero": //【追加】
Console.WriteLine("終了が選択されました");
break;
default:
Console.WriteLine("入力ミスです");
break;
}
}
}