C# | 1 日 90 分 × 7 日アプリ学習:初級編

Web APP C#
スポンサーリンク

4日目のゴール

初級編 4日目のテーマは
「“1回で終わり”じゃない、何度も使える C# コンソールアプリの形を身につけること」 です。

ここまでで、あなたはすでに

入力(ReadLine+TryParse)
配列+for で複数データを扱う
メソッドで処理をまとめる

というところまで来ています。

今日はここに、

アプリ全体をループさせる
メニューから処理を選べるようにする
switch 文で分岐をスッキリ書く

という「アプリらしい動き」を足していきます。


「1回動いて終わり」から卒業する

今までのプログラムの“もったいなさ”

3日目までのプログラムは、だいたいこういう流れでした。

入力する
計算・集計する
結果を表示する
プログラム終了

動きとしては正しいのですが、
ユーザー目線で見ると、こう思うはずです。

「もう一回やりたいとき、また起動し直すの?」
「別のデータで試したいときに不便じゃない?」

ここで必要になるのが、
「アプリ全体をループさせる」という発想 です。


while で「メインループ」を作る

「終了します」と言うまで続ける

まずは、いちばんシンプルな「メインループ」の形を見てみましょう。

using System;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("何か処理をします…(仮)");

            Console.WriteLine("続けますか? (y/n):");
            string answer = Console.ReadLine();

            if (answer == "n" || answer == "N")
            {
                Console.WriteLine("終了します。");
                break;
            }
        }
    }
}
C#

ここでの流れを丁寧に追います。

while (true)
「とりあえずずっと繰り返す」という宣言

中で「今回の処理」を行う(今は仮のメッセージ)
終わったら「続けるかどうか」を聞く
n が入力されたら break でループを抜ける
→ Main メソッドの終わりに到達して、プログラム終了

ポイントは、
「ループを抜ける条件を自分で決めている」 ことです。

「ユーザーが n と言ったら終わる」
というルールを、自分で書いているわけですね。


メニューを表示して「やりたいこと」を選ばせる

メニュー表示の基本形

次に、「何をするか」を選べるようにします。

using System;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("===== メニュー =====");
            Console.WriteLine("1: 今日の勉強時間を記録する");
            Console.WriteLine("2: 簡易電卓を使う");
            Console.WriteLine("0: 終了する");

            int choice = ReadInt("番号を選んでください:");

            if (choice == 0)
            {
                Console.WriteLine("アプリを終了します。");
                break;
            }
            else if (choice == 1)
            {
                Console.WriteLine("勉強時間記録モード(仮)");
            }
            else if (choice == 2)
            {
                Console.WriteLine("簡易電卓モード(仮)");
            }
            else
            {
                Console.WriteLine("0〜2 の範囲で選択してください。");
            }
        }
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}
C#

ここで大事なのは、
「メニュー表示 → 入力 → 分岐 → またメニューに戻る」
という“アプリのリズム”です。

ユーザーから見ると、

メニューが出る
やりたい番号を選ぶ
処理が走る
終わったらまたメニューに戻る

という、かなり「アプリっぽい」体験になります。


if から switch へ:分岐をスッキリ書く

switch 文の基本形

メニュー番号の分岐は、if でも書けますが、
選択肢が増えると少し読みにくくなります。

そこで使えるのが switch 文です。

switch (choice)
{
    case 0:
        // 0 のときの処理
        break;

    case 1:
        // 1 のときの処理
        break;

    case 2:
        // 2 のときの処理
        break;

    default:
        // どれにも当てはまらないとき
        break;
}
C#

if との違いを整理すると、

if
条件を自由に書ける(choice == 1 以外も書ける)
柔軟だが、選択肢が多いと縦に長くなりがち

switch
「ある1つの値が、どのパターンに当てはまるか」を書くのに向いている
メニュー番号のような「離散的な選択肢」にぴったり

メニューのように「1, 2, 3, 0…」と分かれている場合は、
switch を使うと読みやすくなります。


メニュー+switch+メソッドで“形”を作る

まずは骨組みだけ作る

ここまでの要素を組み合わせて、
「メニュー付きアプリの骨組み」を作ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            PrintMenu();
            int choice = ReadInt("番号を選んでください:");

            if (choice == 0)
            {
                Console.WriteLine("アプリを終了します。");
                break;
            }

            switch (choice)
            {
                case 1:
                    RunStudyRecorder();
                    break;

                case 2:
                    RunCalculator();
                    break;

                default:
                    Console.WriteLine("0〜2 の範囲で選択してください。");
                    break;
            }

            Console.WriteLine();
        }
    }

    static void PrintMenu()
    {
        Console.WriteLine("===== メニュー =====");
        Console.WriteLine("1: 今日の勉強時間を記録する");
        Console.WriteLine("2: 簡易電卓を使う");
        Console.WriteLine("0: 終了する");
    }

    static int ReadInt(string message)
    {
        while (true)
        {
            Console.WriteLine(message);
            string text = Console.ReadLine();

            int value;
            bool ok = int.TryParse(text, out value);

            if (ok)
            {
                return value;
            }
            else
            {
                Console.WriteLine("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }

    static void RunStudyRecorder()
    {
        Console.WriteLine("【勉強時間記録モード】(中身はこれから作る)");
    }

    static void RunCalculator()
    {
        Console.WriteLine("【簡易電卓モード】(中身はこれから作る)");
    }
}
C#

ここでの超重要ポイントは、

Main は「アプリ全体の流れ」だけを書く
具体的な機能は RunStudyRecorder / RunCalculator に任せる

という構造です。

この形が作れるようになると、
機能を増やしても Main がぐちゃぐちゃになりません。


勉強時間記録モードを作り込む

今日の勉強時間を入力してフィードバックする

RunStudyRecorder の中身を、
1日目・2日目・3日目の知識で作り込みます。

static void RunStudyRecorder()
{
    Console.WriteLine("【勉強時間記録モード】");

    int minutes = ReadInt("今日の勉強時間を入力してください(分):");

    Console.WriteLine("今日の勉強時間は " + minutes + " 分ですね。");

    if (minutes >= 60)
    {
        Console.WriteLine("素晴らしい!1時間以上勉強できています!");
    }
    else if (minutes >= 30)
    {
        Console.WriteLine("いいペースです。この調子で続けましょう。");
    }
    else if (minutes > 0)
    {
        Console.WriteLine("少しでも手をつけたのは立派です。明日はもう 10 分だけ増やしてみませんか?");
    }
    else
    {
        Console.WriteLine("まずは 5 分だけでもやってみる日を作ってみましょう。");
    }
}
C#

ここは、すでにあなたが書けるレベルのコードです。

メニューから「1」を選ぶたびに、
このモードが何度でも呼び出されます。


簡易電卓モードを作り込む

2日目の電卓を「モード」として組み込む

RunCalculator の中身も、
2日目で作った電卓をベースにします。

static void RunCalculator()
{
    Console.WriteLine("【簡易電卓モード】");
    Console.WriteLine("1: 足し算");
    Console.WriteLine("2: 引き算");
    Console.WriteLine("3: 掛け算");
    Console.WriteLine("4: 割り算");

    int op = ReadInt("番号を選んでください(1〜4):");

    double a = ReadDouble("1つ目の数値を入力してください:");
    double b = ReadDouble("2つ目の数値を入力してください:");

    double result;

    switch (op)
    {
        case 1:
            result = a + b;
            Console.WriteLine("結果: " + result);
            break;

        case 2:
            result = a - b;
            Console.WriteLine("結果: " + result);
            break;

        case 3:
            result = a * b;
            Console.WriteLine("結果: " + result);
            break;

        case 4:
            if (b == 0)
            {
                Console.WriteLine("0 で割ることはできません。");
            }
            else
            {
                result = a / b;
                Console.WriteLine("結果: " + result);
            }
            break;

        default:
            Console.WriteLine("1〜4 の範囲で選択してください。");
            break;
    }
}

static double ReadDouble(string message)
{
    while (true)
    {
        Console.WriteLine(message);
        string text = Console.ReadLine();

        double value;
        bool ok = double.TryParse(text, out value);

        if (ok)
        {
            return value;
        }
        else
        {
            Console.WriteLine("数値として解釈できませんでした。もう一度入力してください。");
        }
    }
}
C#

これで、

メニューで「2」を選ぶ
→ 電卓モードに入る
→ 計算が終わる
→ Main の while に戻って、またメニューが出る

という流れが完成します。


4日目で絶対に押さえておきたい「アプリの形」

メインループ+メニュー+モード分割

今日の一番の収穫は、
「アプリ全体の“型”を持てたこと」 です。

while (true) でメインループを作る
メニューを表示するメソッド(PrintMenu)を用意する
入力専用メソッド(ReadInt / ReadDouble)を使い回す
switch でモードを切り替える
各モードは専用メソッド(RunStudyRecorder / RunCalculator)に分ける

この構造さえ作れれば、
機能を増やすのは「モードを1つ足す」だけです。

RunTodoList
RunStudyStats
RunGameLikeQuiz

など、いくらでも増やしていけます。


もし余裕があればやってみてほしいこと

自分専用のメニュー項目を1つ足してみる

例えば、

3: 1週間の勉強時間を入力して統計を出す(3日目の内容)

というモードを追加してみてください。

やることは、

メニュー表示に「3: …」を足す
switch に case 3 を足す
RunWeeklyStudy というメソッドを作る
中身は 3日目で作った「1週間の勉強時間アプリ」を移植する

というだけです。


4日目のまとめ

初級編 4日目で、あなたは

「1回動いて終わりのプログラム」から
「何度も使える“アプリの形”」へ

一段階ステップアップしました。

メインループ
メニュー
switch
モードごとのメソッド

この4つを組み合わせると、
コードは「ただのサンプル」から
「自分が日常的に使えるツール」に近づいていきます。

5日目以降は、
この“アプリの骨組み”の中に、
もう少し構造化されたデータ(名前+点数のセットなど)を入れていきます。
そこまで行くと、いよいよ「小さな実用アプリ」の入り口です。

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