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

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

2日目のゴール

初級編 2日目のテーマは
「入力が“うまくいかなかったとき”も落ちない、ちょっと大人な C# プログラムを書くこと」 です。

1日目でやったことはこうでした。

Console.ReadLine で入力を受け取る
int.Parse / double.Parse で数値に変換する
計算して結果を表示する

今日はここに、

「数字じゃないものが入力されたらどうする?」
「空のまま Enter されたら?」

といった“現実に起こりがちな失敗”をちゃんと扱う力を足していきます。

キーワードはこの2つです。

int.TryParse / double.TryParse
while で「正しい入力が来るまで聞き続ける」


Parse の弱点:「変換できないときに落ちる」

int.Parse は“厳しい先生”

1日目で使った int.Parse は、とてもストレートです。

string text = Console.ReadLine();
int value = int.Parse(text);
C#

text が “123” なら問題ありませんが、
“abc” や 空文字、”12a” などが来ると、
例外(エラー)が発生してプログラムが落ちます。

「ユーザーは必ず正しい数字を入れてくれる」
という前提ならいいのですが、
現実のアプリではそうはいきません。

そこで登場するのが TryParse です。


TryParse は「変換できたかどうかを教えてくれる」

int.TryParse の基本形

TryParse は、
「変換を試してみて、成功したかどうかを true / false で返す」メソッドです。

形はこうです。

string text = Console.ReadLine();

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

ここで起きていることを分解します。

value という int 変数を先に宣言しておく
int.TryParse(text, out value) を呼ぶ
text が整数として解釈できれば
ok は true になり、value に変換後の値が入る
text が整数として解釈できなければ
ok は false になり、value には意味のある値は入らない(使わない)

ポイントは、「エラーを投げずに、結果を bool で返してくれる」ことです。


TryParse を if と組み合わせる

変換に成功したときだけ処理を進める

まずは一番シンプルなパターンから。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("年齢を入力してください:");
        string text = Console.ReadLine();

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

        if (ok)
        {
            Console.WriteLine("あなたは " + age + " 歳ですね。");
        }
        else
        {
            Console.WriteLine("数字として解釈できませんでした。半角の数字で入力してください。");
        }
    }
}
C#

ここでの流れはこうです。

ユーザーが何か入力する
TryParse で「整数として読めるか」を試す
ok が true なら age を使って処理を続ける
ok が false なら「入力がおかしい」とメッセージを出す

Parse は「できなかったら落ちる」
TryParse は「できなかったら false を返す」

この違いがとても大きいです。


「正しい入力が来るまで聞き続ける」パターン

while と TryParse の組み合わせ

実際のアプリに近づけるなら、
「失敗したらもう一度入力してもらう」方が自然です。

そこで、while を組み合わせます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int age = ReadInt("年齢を入力してください:");

        Console.WriteLine("あなたは " + age + " 歳ですね。");
    }

    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#

ここで重要なのは ReadInt メソッドです。

メッセージを表示する
入力を受け取る
TryParse で変換を試す
成功したら return で値を返す
失敗したらエラーメッセージを出して、while の先頭に戻る

while (true) は「無限ループ」に見えますが、
中で return value; が呼ばれた瞬間にメソッドごと抜けるので、
「正しい入力が来たら終わるループ」になっています。

このパターンは、実務でもよく使う“定番の書き方”です。


double.TryParse で小数も扱う

身長や金額など「小数がありえる値」

int.TryParse と同じノリで、double.TryParse も使えます。

using System;

class Program
{
    static void Main(string[] args)
    {
        double height = ReadDouble("身長を入力してください(cm):");
        double weight = ReadDouble("体重を入力してください(kg):");

        double heightM = height / 100.0;
        double bmi = weight / (heightM * heightM);

        Console.WriteLine("あなたの BMI 風の値は " + bmi + " です。");
    }

    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#

ReadInt と ReadDouble を用意しておくと、
「入力まわりの面倒な部分」をメソッドに閉じ込めておけます。

Main から見ると、

double height = ReadDouble("身長を入力してください(cm):");
C#

と書くだけで、
「正しい数値が入力されるまで聞き続けてくれる」
という、とても頼もしいメソッドになります。


例題1:安全な「合計金額計算アプリ」に進化させる

1日目のアプリを TryParse 版にする

1日目で作った「合計金額計算アプリ」を、
入力エラーに強い形に書き直してみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("商品名を入力してください:");
        string itemName = Console.ReadLine();

        int price = ReadInt("単価を入力してください(円):");
        int quantity = ReadInt("個数を入力してください:");

        int total = price * quantity;

        Console.WriteLine("----------");
        Console.WriteLine("商品名: " + itemName);
        Console.WriteLine("単価: " + price + " 円");
        Console.WriteLine("個数: " + quantity + " 個");
        Console.WriteLine("合計金額: " + total + " 円");
    }

    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#

ここでのポイントは、「入力のロジックをメソッドに追い出した」ことです。

Main は「アプリの流れ」だけを書いている
ReadInt は「整数入力の面倒を見る」ことだけに集中している

この分離ができると、コードが一気に読みやすくなります。


例題2:メニュー付きの簡易電卓

ユーザーに「何をしたいか」を選ばせる

次は、入力+条件分岐を組み合わせた「メニュー式」のミニアプリです。

仕様はこうです。

1: 足し算
2: 引き算
3: 掛け算
4: 割り算

ユーザーに 1〜4 のどれかを選んでもらい、
2つの数値を入力して計算する。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("簡易電卓");
        Console.WriteLine("1: 足し算");
        Console.WriteLine("2: 引き算");
        Console.WriteLine("3: 掛け算");
        Console.WriteLine("4: 割り算");

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

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

        double result;

        if (choice == 1)
        {
            result = a + b;
            Console.WriteLine("結果: " + result);
        }
        else if (choice == 2)
        {
            result = a - b;
            Console.WriteLine("結果: " + result);
        }
        else if (choice == 3)
        {
            result = a * b;
            Console.WriteLine("結果: " + result);
        }
        else if (choice == 4)
        {
            if (b == 0)
            {
                Console.WriteLine("0 で割ることはできません。");
            }
            else
            {
                result = a / b;
                Console.WriteLine("結果: " + result);
            }
        }
        else
        {
            Console.WriteLine("1〜4 の範囲で選択してください。");
        }
    }

    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 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#

ここで新しく出てきたのは、「0 で割るチェック」です。

b が 0 のときに割り算をすると、
C# 的にはエラーや特殊な値になるので、
事前に if で弾いています。

「入力値に応じて、そもそも処理をしていいかどうかを判断する」
これも、現実のアプリではとても大事な考え方です。


2日目で絶対に押さえておきたいポイント

TryParse パターンを“手グセ”にする

今日の一番の収穫は、これです。

入力は string
→ TryParse で「変換できるかどうか」を調べる
→ 成功したら値を使う、失敗したらメッセージを出す
→ while と組み合わせれば「正しい入力が来るまで聞き続ける」メソッドになる

具体的には、この形を体で覚えてほしいです。

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#

この一つのメソッドだけで、
「整数入力まわりの面倒ごと」をかなり片付けられます。


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

「範囲チェック」も足してみる

例えば、学習時間の入力で、

0 未満はおかしい
1440 分(24 時間)を超えるのもおかしい

といったチェックを入れてみてください。

ReadInt の中で、

変換に成功したあとに
if (value < 0 || value > 1440) を追加して
「現実的な範囲かどうか」も判定する

という形にできます。


2日目のまとめ

初級編 1日目は「入力できるようになる日」でした。
2日目はそこに、

「入力が変でも落ちない」
「正しい値が来るまで、優しく聞き直す」

という“現実対応力”が加わりました。

TryParse
while ループ
入力専用メソッド(ReadInt / ReadDouble)

この3つは、
今後どんなコンソールアプリを書いても、
ほぼ確実に何度も使う“相棒”になります。

3日目以降は、
この「安全な入力」を前提に、
配列やメソッド、簡単なデータ構造と組み合わせて
少しずつ“アプリらしさ”を上げていきます。

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