C# | 2週間で身につくアプリを作りながら学ぶC#の基本 - 4日目

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

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 問のクイズを出して、正解数をカウントする」ようなアプリを作りながら、
配列とループの組み合わせにさらに慣れていきます。

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