4日目のゴールとテーマ
4日目のテーマは「配列で“まとめて”データを扱う」です。
3日目までは、点数や年齢などを「1 個ずつ」変数に入れていました。
今日はここを一気にレベルアップさせて、
- 複数の点数を「配列」にまとめて保存する
- for 文で配列をぐるっと回して、合計・平均を出す
- 最高点・最低点も求めてみる
という「ちょっと本格的な集計アプリ」を作ります。
配列は最初だけ少しとっつきにくいですが、
一度つかめば「アプリ開発の世界が一気に広がる」重要な概念です。
配列とは何かをイメージでつかむ
「同じ種類の変数を並べたもの」
まずはイメージからいきます。
昨日までの書き方だと、3 人分の点数を持ちたいとき、こうなります。
int score1 = 80;
int score2 = 90;
int score3 = 75;
C#動きはしますが、人数が増えると地獄です。
10 人、30 人、100 人…と増えたら、変数名を考えるだけで疲れます。
そこで登場するのが「配列」です。
int[] scores = new int[3];
C#これは、
「int 型の値を 3 つ入れられる“並んだ箱”を用意する」
という意味です。
1 個の箱(変数)ではなく、「同じ型の箱が横に並んでいる」イメージを持ってください。
配列の「部屋番号(インデックス)」
配列の中の 1 つ 1 つの箱には「部屋番号」が付いています。
これを「インデックス」と呼びます。
C# では、インデックスは 0 から始まります。
int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
C#ここでのポイントは次です。
scores[0]→ 1 人目の点数scores[1]→ 2 人目の点数scores[2]→ 3 人目の点数
「0 から始まる」というのは最初は違和感がありますが、
プログラミングではほぼ“世界共通ルール”だと思ってください。
配列の基本的な宣言と代入
宣言してから値を入れるパターン
さっきの例をもう一度整理します。
int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
C#分解すると、
int[]→ 「int 型の配列」という意味scores→ 配列の名前new int[3]→ 「int を 3 個分入れられる配列を作る」
この時点では、中身は全部 0 です。
そのあとで、1 つずつ値を代入しています。
最初から中身を指定するパターン
もし最初から値が分かっているなら、もっと短く書けます。
int[] scores = { 80, 90, 75 };
C#これは、
- 要素数 3 の配列を作る
scores[0] = 80;scores[1] = 90;scores[2] = 75;
をまとめて書いた形です。
for 文と配列の組み合わせが最強
配列を for でぐるっと回す
配列の真価は「for 文と組み合わせたとき」に発揮されます。
int[] scores = { 80, 90, 75 };
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine((i + 1) + " 人目の点数: " + scores[i]);
}
C#ここで新しく出てきたのが scores.Length です。
Lengthは「配列の長さ」(要素数)- この場合は 3
i < scores.Length と書くことで、
- i = 0 → OK
- i = 1 → OK
- i = 2 → OK
- i = 3 → NG(ループ終了)
となり、scores[0]〜scores[2] まで、ちょうど全部を回れます。
合計を出すのも同じパターン
3日目にやった「sum パターン」を配列に適用してみます。
int[] scores = { 80, 90, 75 };
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum = sum + scores[i];
}
Console.WriteLine("合計点: " + sum);
C#ここでのポイントは、
scores[i]が「i 人目の点数」- それを sum に足していく
という流れです。
平均も同じように出せます。
double average = (double)sum / scores.Length;
Console.WriteLine("平均点: " + average);
C#ユーザー入力を配列に入れていくアプリ
人数分の点数を配列に保存する
今度は、点数をコードに直接書くのではなく、
ユーザーに入力してもらって配列に入れていきます。
int count = 3;
int[] scores = new int[count];
for (int i = 0; i < count; i++)
{
Console.WriteLine((i + 1) + " 人目の点数を入力してください:");
string text = Console.ReadLine();
int score = int.Parse(text);
scores[i] = score;
}
C#流れを言葉で追ってみます。
人数(count)を決める
その人数分の配列を作る
for で 0〜count-1 まで回す
毎回「何人目か」を表示
点数を文字列で受け取る
int に変換するscores[i] に代入する
これで、「人数分の点数が配列にたまっている状態」が作れます。
そのまま合計・平均・表示に使える
配列に入ってしまえば、あとはさっきと同じです。
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum = sum + scores[i];
}
double average = (double)sum / scores.Length;
Console.WriteLine("合計点: " + sum);
Console.WriteLine("平均点: " + average);
C#「入力用のループ」と「集計用のループ」を分けることで、
コードの見通しが良くなります。
最高点・最低点を求めるパターン
最大値を求める考え方
「最高点」を求めるときの考え方はシンプルです。
- 最初に「仮の最高点」を決める
- 配列を順番に見ていき、今の最高点より大きければ更新する
コードで書くとこうなります。
int[] scores = { 80, 90, 75, 100, 65 };
int max = scores[0];
for (int i = 1; i < scores.Length; i++)
{
if (scores[i] > max)
{
max = scores[i];
}
}
Console.WriteLine("最高点: " + max);
C#ここでの重要ポイントを深掘りします。
なぜ max を 0 ではなく scores[0] にするのか
もし全員の点数が 0 未満(例えばマイナス点)だったら、int max = 0; としてしまうと正しく動きません。
scores[0] を初期値にしておけば、
- 「少なくとも誰か 1 人の点数」
- そこからスタートして、より大きいものがあれば更新
という安全なロジックになります。
なぜ i は 1 から始めるのか
max = scores[0]; で 0 番目はすでに見ているので、
ループは 1 番目からで十分です。
最小値も同じパターン
最低点も、考え方はまったく同じです。
int min = scores[0];
for (int i = 1; i < scores.Length; i++)
{
if (scores[i] < min)
{
min = scores[i];
}
}
Console.WriteLine("最低点: " + min);
C#違いは > が < になっているだけです。
4日目の仕上げ:点数集計アプリ(配列版)
入力 → 配列保存 → 合計・平均・最高・最低
ここまでの内容を全部まとめたミニアプリの例を出します。
そのまま写してもいいし、人数やメッセージを変えても OK です。
Console.WriteLine("人数を入力してください:");
string countText = Console.ReadLine();
int count = int.Parse(countText);
int[] scores = new int[count];
for (int i = 0; i < count; i++)
{
Console.WriteLine((i + 1) + " 人目の点数を入力してください:");
string text = Console.ReadLine();
int score = int.Parse(text);
scores[i] = score;
}
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum = sum + scores[i];
}
double average = (double)sum / scores.Length;
int max = scores[0];
int min = scores[0];
for (int i = 1; i < scores.Length; i++)
{
if (scores[i] > max)
{
max = scores[i];
}
if (scores[i] < min)
{
min = scores[i];
}
}
Console.WriteLine("=== 集計結果 ===");
Console.WriteLine("人数: " + scores.Length + " 人");
Console.WriteLine("合計点: " + sum);
Console.WriteLine("平均点: " + average);
Console.WriteLine("最高点: " + max);
Console.WriteLine("最低点: " + min);
C#ここまで動かせたら、4日目としてはかなりいい仕上がりです。
「配列+for+if」で、かなり実用的な集計アプリが作れるようになっています。
4日目のまとめ
今日のキーワードを整理します。
配列(int[] など)
同じ型の値をまとめて扱うための「並んだ箱」。インデックスは 0 から。
Length
配列の要素数。scores.Length のように使う。
for + 配列for (int i = 0; i < 配列.Length; i++) が鉄板パターン。
最大値・最小値
最初に「仮の値」を入れておき、より大きい(小さい)ものがあれば更新する。
ここまで来ると、「データをまとめて扱う」感覚がかなり身についてきています。
次回(5日目)への予告
5日目は、配列をもう一歩進めて
文字列の配列(名前リストなど)
メニュー選択風のアプリ
簡単な「クイズアプリ」の土台
などを作っていきます。
例えば、「3 問のクイズを出して、正解数をカウントする」ようなアプリを作りながら、
配列とループの組み合わせにさらに慣れていきます。
