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

