5日目のゴールとテーマ
5日目のテーマは「文字列の配列を使って、クイズアプリの土台を作る」です。
4日目までは「数値の配列」で点数を扱いましたが、今日は
- 質問文や選択肢、答えを「文字列の配列」で管理する
- for 文で問題を順番に出す
- 正解数をカウントして、最後に結果を表示する
という「ミニクイズアプリ」を作ります。
ここまで来ると、C# で作るコンソールアプリが一気に“遊べるもの”になってきます。
数値だけじゃない「文字列の配列」
文字列の配列の基本形
4日目は int[](整数の配列)を使いました。
今日は string[](文字列の配列)を使います。
string[] names = { "Taro", "Hanako", "Jiro" };
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine((i + 1) + " 人目: " + names[i]);
}
C#ここで押さえたいポイントはこうです。
string[]は「文字列を並べて持つ配列」names[i]が「i 番目の名前」Lengthは数値の配列と同じく「要素数」
配列は「中身の型」が違うだけで、使い方の基本は同じです。
質問文を配列で持つイメージ
クイズアプリを作るとき、質問を 1 個ずつ変数にするとこうなります。
string q1 = "C# はどの会社が作った言語?";
string q2 = "C# のファイル拡張子は?";
string q3 = "コンソールに出力するメソッドは?";
C#これを配列にすると、こうまとまります。
string[] questions =
{
"C# はどの会社が作った言語?",
"C# のファイル拡張子は?",
"コンソールに出力するメソッドは?"
};
C#この「まとめて持てる」感じが、配列の強さです。
クイズの「問題」と「答え」を配列で管理する
質問と答えを別々の配列で持つ
まずは、シンプルに「質問」と「正解」を 1 対 1 で持ってみます。
string[] questions =
{
"C# はどの会社が作った言語?",
"C# のファイル拡張子は?",
"コンソールに出力するメソッドは?"
};
string[] answers =
{
"Microsoft",
".cs",
"Console.WriteLine"
};
C#ここで大事なのは、「同じインデックス同士がペア」ということです。
questions[0]とanswers[0]が 1 問目のセットquestions[1]とanswers[1]が 2 問目のセット
という対応関係を意識してください。
for 文で「問題を順番に出す」
この 2 つの配列を使って、問題を順番に出してみます。
for (int i = 0; i < questions.Length; i++)
{
Console.WriteLine("第 " + (i + 1) + " 問");
Console.WriteLine(questions[i]);
Console.WriteLine("答えを入力してください:");
string userAnswer = Console.ReadLine();
Console.WriteLine("あなたの答え: " + userAnswer);
Console.WriteLine("正解: " + answers[i]);
Console.WriteLine();
}
C#流れを言葉で追うとこうです。
- i を 0 から questions.Length – 1 まで回す
- 毎回、
questions[i]を表示する - ユーザーの答えを
Console.ReadLine()で受け取る - 正解
answers[i]を表示する
まだ「正解かどうかの判定」はしていませんが、
これだけで「クイズっぽい動き」になります。
正解判定とスコアカウントを追加する
文字列の比較で正解かどうかを判定する
ユーザーの答えが正解かどうかを判定するには、
文字列同士を比較します。
if (userAnswer == answers[i])
{
Console.WriteLine("正解!");
}
else
{
Console.WriteLine("不正解…");
}
C#ここでの重要ポイントは次です。
- 文字列の比較も
==を使う - 大文字・小文字を区別する(”Microsoft” と “microsoft” は別物)
大文字・小文字を無視したい場合は、両方を小文字にしてから比較します。
if (userAnswer.ToLower() == answers[i].ToLower())
{
Console.WriteLine("正解!");
}
else
{
Console.WriteLine("不正解…");
}
C#ToLower() は「全部小文字にする」メソッドです。
正解数をカウントする
クイズらしくするために、「正解数」を数えましょう。
int score = 0;
for (int i = 0; i < questions.Length; i++)
{
Console.WriteLine("第 " + (i + 1) + " 問");
Console.WriteLine(questions[i]);
Console.WriteLine("答えを入力してください:");
string userAnswer = Console.ReadLine();
if (userAnswer.ToLower() == answers[i].ToLower())
{
Console.WriteLine("正解!");
score = score + 1;
}
else
{
Console.WriteLine("不正解…");
Console.WriteLine("正解は: " + answers[i]);
}
Console.WriteLine();
}
Console.WriteLine("あなたの正解数は " + score + " / " + questions.Length + " 問です。");
C#ここで深掘りしたいのは score = score + 1; です。
- 最初に
score = 0;としておく - 正解のたびに 1 ずつ増やす
- ループが終わったとき、score に「正解数」が入っている
これは 3日目の「sum パターン」と同じ考え方です。
「何かを数えるときは、変数を 0 からスタートして、条件を満たしたときに 1 足す」
このパターンを体に染み込ませてください。
選択肢付きクイズにして“アプリ感”を上げる
選択肢も配列で持つ
今のクイズは「自由入力」なので、スペルミスなどで不正解になりやすいです。
そこで、選択肢付きのクイズにしてみます。
問題ごとに 3 つの選択肢を用意する例です。
string[] questions =
{
"C# はどの会社が作った言語?",
"C# のファイル拡張子は?",
"コンソールに出力するメソッドは?"
};
string[,] choices =
{
{ "Microsoft", "Apple", "Google" },
{ ".cs", ".csharp", ".txt" },
{ "Console.WriteLine", "Console.Print", "System.Out" }
};
int[] correctIndex =
{
0,
0,
0
};
C#ここで新しく出てきたのが「2 次元配列」です。
string[,] choicesは「文字列の 2 次元配列」- 1 つ目のインデックスが「問題番号」
- 2 つ目のインデックスが「選択肢番号」
例えば、
choices[0, 0]→ 1 問目の 1 番目の選択肢(”Microsoft”)choices[1, 2]→ 2 問目の 3 番目の選択肢(”.txt”)
という対応になります。
correctIndex は「正解の選択肢の番号」です。
ここでは全部 0(1 番目の選択肢が正解)にしています。
選択肢を表示して、番号で答えてもらう
このデータを使って、クイズを出してみます。
int score = 0;
for (int i = 0; i < questions.Length; i++)
{
Console.WriteLine("第 " + (i + 1) + " 問");
Console.WriteLine(questions[i]);
Console.WriteLine("1: " + choices[i, 0]);
Console.WriteLine("2: " + choices[i, 1]);
Console.WriteLine("3: " + choices[i, 2]);
Console.WriteLine("番号で答えてください(1〜3):");
string answerText = Console.ReadLine();
int answerNumber = int.Parse(answerText);
int answerIndex = answerNumber - 1;
if (answerIndex == correctIndex[i])
{
Console.WriteLine("正解!");
score = score + 1;
}
else
{
Console.WriteLine("不正解…");
int correctNumber = correctIndex[i] + 1;
Console.WriteLine("正解は " + correctNumber + " 番: " + choices[i, correctIndex[i]]);
}
Console.WriteLine();
}
Console.WriteLine("あなたの正解数は " + score + " / " + questions.Length + " 問です。");
C#ここでの重要ポイントを整理します。
choices[i, 0]〜choices[i, 2]で 3 つの選択肢を表示- ユーザーには「1〜3 の番号」で答えてもらう
- 入力された番号から 1 を引いて、インデックスに変換(
answerNumber - 1) - そのインデックスと
correctIndex[i]を比較して正解判定
「人間には 1 始まりで見せて、プログラム内部では 0 始まりで扱う」
この変換が、配列を使うときのよくあるパターンです。
5日目の仕上げ:自分オリジナルのクイズにしてみる
問題を自分の好きなテーマに変える
ここまで来たら、あとは「中身を自分仕様にする」だけです。
- 好きなゲームのクイズ
- 自分のプロフィールクイズ
- C# の復習クイズ
など、テーマは何でも構いません。
やることはシンプルです。
questionsの中身を書き換えるchoicesの中身を書き換えるcorrectIndexを正しい番号に合わせる
これだけで、完全オリジナルのクイズアプリになります。
5日目のまとめ
今日のキーワードを整理します。
文字列の配列(string[])
質問や名前、メッセージなどをまとめて持つのに使える。
2 次元配列(string[,])
問題 × 選択肢のように「表形式」のデータを持つときに使える。
文字列の比較== で比較できる。大文字小文字を無視したいときは ToLower() を使う。
スコアカウントint score = 0; から始めて、正解のたびに score = score + 1;。
ここまでできると、「配列+for+if+入力」で
かなり遊べるアプリが作れるようになっています。
次回(6日目)への予告
6日目は、ここまでのコンソールアプリの知識を使いながら、
- メソッド(自分で処理のまとまりを作る)
- 「同じ処理を何度も使い回す」
- コードを読みやすく分割する
という方向に進みます。
クイズアプリの「1 問出す処理」をメソッドに切り出したり、
点数集計をメソッド化したりして、「プロっぽい書き方」に一歩近づいていきます。

