基礎から学ぶC#入門 90日コース | 制御構文・メソッド - Day 20:第2章総合演習

Web APP 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 20 のゴールと全体像

Day 20 は、第2章の総まとめとして コマンドライン電卓を作る総合演習です。 ここまで学んできた「制御構文」と「メソッド」を組み合わせて、 実際に動く小さなアプリケーションを完成させていきます。

電卓の基本的な流れは次のとおりです。

  1. 数値1を入力
  2. 演算子を選択
  3. 数値2を入力
  4. 計算
  5. 結果表示
  6. 続けるか選択

この流れを、メソッド分割ループを使って、読みやすく・拡張しやすい形で作っていきます。

全体設計:役割を分けて考える

どんなメソッドに分けるか

まずは、電卓の機能を「役割ごと」に分けて考えます。

  • 数値入力: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つのアプリケーションを作る」

という感覚がかなり育ってきているはずです。

ぜひ、

  • 演算を増やしてみる(べき乗、剰余など)
  • 入力のラベルや表示形式を工夫してみる
  • エラー時のメッセージを分かりやすくしてみる

といったアレンジを加えながら、 自分だけの「使いやすいコマンドライン電卓」に育てていってください。

タイトルとURLをコピーしました