Day 20 のゴールと全体像
Day 20 は、第2章の総まとめとして コマンドライン電卓を作る総合演習です。 ここまで学んできた「制御構文」と「メソッド」を組み合わせて、 実際に動く小さなアプリケーションを完成させていきます。
電卓の基本的な流れは次のとおりです。
- 数値1を入力
- 演算子を選択
- 数値2を入力
- 計算
- 結果表示
- 続けるか選択
この流れを、メソッド分割とループを使って、読みやすく・拡張しやすい形で作っていきます。
全体設計:役割を分けて考える
どんなメソッドに分けるか
まずは、電卓の機能を「役割ごと」に分けて考えます。
- 数値入力:
InputNumber() - 演算子入力:
InputOperator() - 計算:
Calculate() - 結果表示:
ShowResult() - 続けるかどうかの選択:
AskContinue()
そして、Main メソッドは「全体の流れ」を組み立てるだけにして、 細かい処理はそれぞれのメソッドに任せる形にします。
数値入力メソッド
ユーザーから数値を安全に受け取る
まずは、数値を入力してもらうメソッドを作ります。 初心者の方がつまずきやすいポイントは「数字以外が入力されたとき」なので、 double.TryParse を使って、安全に数値変換するテンプレートにしておきます。
using System;
class Program
{
// 数値を入力してもらうメソッド
static double InputNumber(string label)
{
while (true)
{
Console.WriteLine($"{label}を入力してください:");
string? input = Console.ReadLine();
// TryParse は、変換に成功したかどうかを true/false で返します
if (double.TryParse(input, out double value))
{
// 正しく数値に変換できたので、その値を返します
return value;
}
else
{
// 数字以外が入力された場合は、再入力を促します
Console.WriteLine("数値として認識できませんでした。もう一度入力してください。");
}
}
}
}
C#ポイント:
labelを引数にすることで、「数値1」「数値2」などを柔軟に表示できます。while (true)で「正しい数値が入力されるまで繰り返す」仕組みになっています。TryParseを使うことで、例外を出さずに安全に入力チェックができます。
演算子入力メソッド
+ - * / のいずれかを選んでもらう
次に、演算子を入力してもらうメソッドを作ります。
// 演算子を入力してもらうメソッド
static string InputOperator()
{
while (true)
{
Console.WriteLine("演算子を選んでください(+ - * /):");
string? op = Console.ReadLine();
// 許可する演算子だけを受け付けます
if (op == "+" || op == "-" || op == "*" || op == "/")
{
return op;
}
else
{
Console.WriteLine("不正な演算子です。+ - * / のいずれかを入力してください。");
}
}
}
C#ポイント:
- 許可する演算子を明示的にチェックしています。
- 不正な入力があっても、エラーで落とさずに再入力を促します。
- こうした「入力チェック」は、セキュリティの観点からも非常に重要です。
計算メソッド
演算子に応じて計算する
次に、数値1・数値2・演算子を受け取って、計算結果を返すメソッドを作ります。
// 演算子に応じて計算を行うメソッド
static double Calculate(double a, double b, string op)
{
switch (op)
{
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
// 割り算は 0 で割ると危険なのでチェックします
if (b == 0)
{
Console.WriteLine("0 で割ることはできません。結果は 0 とします。");
return 0;
}
return a / b;
default:
// ここには通常来ませんが、念のための保険として 0 を返します
Console.WriteLine("未知の演算子です。結果は 0 とします。");
return 0;
}
}
C#ポイント:
switch文で演算子ごとに処理を分けています。- 割り算だけは「0 で割る」ケースを特別扱いして、安全性を確保しています。
- 「ありえないはずのケース」にも一応対処しておくのは、堅牢なコードを書くうえで大切な習慣です。
結果表示メソッド
計算式と結果を分かりやすく表示する
計算結果を表示するメソッドを作ります。
// 計算式と結果を表示するメソッド
static void ShowResult(double a, double b, string op, double result)
{
Console.WriteLine("=== 計算結果 ===");
Console.WriteLine($"{a} {op} {b} = {result}");
}
C#ポイント:
- 「表示だけ」を担当する単一責任のメソッドです。
- 表示形式を変えたくなったときは、このメソッドだけを直せばよくなります。
続けるかどうかの選択メソッド
ユーザーに「もう一度?」と聞く
最後に、「続けるかどうか」を選んでもらうメソッドを作ります。
// 続けるかどうかを確認するメソッド
static bool AskContinue()
{
while (true)
{
Console.WriteLine("続けて計算しますか?(y/n):");
string? input = Console.ReadLine();
if (input == "y" || input == "Y")
{
return true; // 続ける
}
else if (input == "n" || input == "N")
{
return false; // 終了する
}
else
{
Console.WriteLine("y か n を入力してください。");
}
}
}
C#ポイント:
boolを戻り値にすることで、「続ける/やめる」をシンプルに表現しています。- 入力チェックをしっかり行い、意図しない入力に対しても安全に振る舞います。
全体を組み立てる:Main メソッド
ループで「何度でも計算できる電卓」にする
ここまで作ったメソッドを組み合わせて、 Main で「コマンドライン電卓」の全体の流れを完成させます。
using System;
class Program
{
static double InputNumber(string label)
{
while (true)
{
Console.WriteLine($"{label}を入力してください:");
string? input = Console.ReadLine();
if (double.TryParse(input, out double value))
{
return value;
}
else
{
Console.WriteLine("数値として認識できませんでした。もう一度入力してください。");
}
}
}
static string InputOperator()
{
while (true)
{
Console.WriteLine("演算子を選んでください(+ - * /):");
string? op = Console.ReadLine();
if (op == "+" || op == "-" || op == "*" || op == "/")
{
return op;
}
else
{
Console.WriteLine("不正な演算子です。+ - * / のいずれかを入力してください。");
}
}
}
static double Calculate(double a, double b, string op)
{
switch (op)
{
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
if (b == 0)
{
Console.WriteLine("0 で割ることはできません。結果は 0 とします。");
return 0;
}
return a / b;
default:
Console.WriteLine("未知の演算子です。結果は 0 とします。");
return 0;
}
}
static void ShowResult(double a, double b, string op, double result)
{
Console.WriteLine("=== 計算結果 ===");
Console.WriteLine($"{a} {op} {b} = {result}");
}
static bool AskContinue()
{
while (true)
{
Console.WriteLine("続けて計算しますか?(y/n):");
string? input = Console.ReadLine();
if (input == "y" || input == "Y")
{
return true;
}
else if (input == "n" || input == "N")
{
return false;
}
else
{
Console.WriteLine("y か n を入力してください。");
}
}
}
static void Main(string[] args)
{
Console.WriteLine("=== コマンドライン電卓 ===");
while (true)
{
// 数値1の入力
double number1 = InputNumber("数値1");
// 演算子の入力
string op = InputOperator();
// 数値2の入力
double number2 = InputNumber("数値2");
// 計算
double result = Calculate(number1, number2, op);
// 結果表示
ShowResult(number1, number2, op, result);
// 続けるかどうか確認
bool cont = AskContinue();
if (!cont)
{
Console.WriteLine("電卓を終了します。");
break; // while ループを抜けて終了
}
Console.WriteLine(); // 見やすくするための空行
}
}
}
C#Day 20 のまとめ
Day 20 では、第2章の総合演習として コマンドライン電卓を作りました。
- 数値入力
- 演算子入力
- 計算
- 結果表示
- 続けるか選択
という一連の流れを、
- 役割ごとにメソッドに分割し
whileループで「何度でも使える電卓」にし- 入力チェックや 0 割り対策で安全性も意識した
形で組み立てました。
ここまで来ると、
「自分で設計して、メソッドを組み合わせて、1つのアプリケーションを作る」
という感覚がかなり育ってきているはずです。
ぜひ、
- 演算を増やしてみる(べき乗、剰余など)
- 入力のラベルや表示形式を工夫してみる
- エラー時のメッセージを分かりやすくしてみる
といったアレンジを加えながら、 自分だけの「使いやすいコマンドライン電卓」に育てていってください。

