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

