C#の配列は本当に便利? Console.ReadLineで入力するとメリットが見えてくる

広告

はじめに

前回の記事「Visual Studioで作る「Studentクラス」入門チュートリアル」では、3人の生徒を作り、Student[] 配列に入れて foreach 文で表示しました。

ところが、固定で3人分を書く例を見ると、「配列にしても、結局 student1student2student3 を人間が書いているので、あまり楽になっていないのでは?」と感じるかもしれません。

その疑問は自然です。固定で3人だけを扱うコードでは、配列のメリットはまだ見えにくいからです。

配列だけで楽になるのではなく、配列はfor文やforeach文と組み合わせることで便利さが見えてきます。

この記事では、Console.ReadLine() を使って人数・名前・点数を入力できるようにします。人数が3人でも10人でも、コードの形を変えずに処理できることを確認しましょう。

3人の生徒を個別に作る方法と、配列にまとめて繰り返し処理する方法の比較図
左は生徒を1人ずつ個別に扱うイメージ、右は配列にまとめて繰り返し処理するイメージです。

固定で3人分を書くと、メリットが見えにくい

前回は、次のように生徒を1人ずつ作りました。

Student student1 = new Student();
student1.Name = "田中";
student1.Score = 80;

Student student2 = new Student();
student2.Name = "佐藤";
student2.Score = 95;

Student student3 = new Student();
student3.Name = "鈴木";
student3.Score = 70;

Student[] students = new Student[] { student1, student2, student3 };

この書き方でも、配列に入れた後は foreach 文で全員に同じ処理を行えます。しかし、人数が増えるたびに student4student5 とコードを追加する必要があります。

3人だけなら大きな問題ではありませんが、30人なら30人分を手書きすることになります。これでは「配列にしたのに楽になっていない」と感じるのも当然です。

今回作るプログラム

最初に生徒の人数を入力し、その人数分だけ名前と点数を入力するコンソールアプリを作ります。入力が終わったら、全員の点数をまとめて表示します。

実行例
生徒は何人ですか?:3
1人目の名前を入力してください:田中
1人目の点数を入力してください:80
2人目の名前を入力してください:佐藤
2人目の点数を入力してください:95
3人目の名前を入力してください:鈴木
3人目の点数を入力してください:70

入力された生徒の点数を表示します。
田中さんの点数は80点です。
佐藤さんの点数は95点です。
鈴木さんの点数は70点です。

Visual Studioでコンソールアプリを作る

Visual Studioで「コンソール アプリ」を新規作成し、プロジェクト名を StudentArrayInputTutorial にします。今回は仕組みを一度に確認できるように、Program.cs にすべてのコードを書きます。

完成コード

using System;

namespace StudentArrayInputTutorial
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("生徒は何人ですか?:");
            int count = int.Parse(Console.ReadLine());

            Student[] students = new Student[count];

            for (int i = 0; i < students.Length; i++)
            {
                Student student = new Student();

                Console.Write($"{i + 1}人目の名前を入力してください:");
                student.Name = Console.ReadLine();

                Console.Write($"{i + 1}人目の点数を入力してください:");
                student.Score = int.Parse(Console.ReadLine());

                students[i] = student;
            }

            Console.WriteLine();
            Console.WriteLine("入力された生徒の点数を表示します。");

            foreach (var student in students)
            {
                student.ShowScore();
            }
        }
    }

    class Student
    {
        public string Name;
        public int Score;

        public void ShowScore()
        {
            Console.WriteLine($"{Name}さんの点数は{Score}点です。");
        }
    }
}

Visual Studioの設定によっては、Console.ReadLine() の戻り値に関する警告が表示されることがあります。まずは配列と繰り返し処理の流れに注目して、動きを確認してみましょう。

人数を入力して配列を作る

Console.Write("生徒は何人ですか?:");
int count = int.Parse(Console.ReadLine());

Student[] students = new Student[count];

Console.ReadLine() で入力した文字列を、int.Parse() で整数に変換しています。その数を使って、必要な人数分の要素を持つ配列を作ります。

3と入力した場合 → Studentを3人分入れられる配列
10と入力した場合 → Studentを10人分入れられる配列

人数が変わっても、Student[] students = new Student[count]; というコードは変わりません。変わるのは、実行した人が入力する count の値だけです。

for文で人数分のStudentを作る

for (int i = 0; i < students.Length; i++)
{
    Student student = new Student();

    Console.Write($"{i + 1}人目の名前を入力してください:");
    student.Name = Console.ReadLine();

    Console.Write($"{i + 1}人目の点数を入力してください:");
    student.Score = int.Parse(Console.ReadLine());

    students[i] = student;
}

students.Length は配列の要素数です。人数を3と入力すれば3回、10と入力すれば10回、for 文の中が繰り返されます。

ループの中では、毎回新しい Student を作り、入力された名前と点数を代入しています。最後の students[i] = student; で、作った生徒を配列の対応する場所に保存します。

students[0] → 1人目の生徒
students[1] → 2人目の生徒
students[2] → 3人目の生徒

配列の番号は0から始まるため、画面には i + 1 を表示しています。これにより、利用者には「1人目」「2人目」と分かりやすく表示できます。

foreach文で全員の点数を表示する

foreach (var student in students)
{
    student.ShowScore();
}

入力が終わったら、foreach 文で配列の先頭から生徒を1人ずつ取り出します。取り出した生徒の ShowScore() を呼び出すので、全員に同じ表示処理を行えます。

ここでも、人数が3人か10人かを気にする必要はありません。配列に入っている人数分だけ、foreach 文が自動的に繰り返します。

for文とforeach文の役割

  • for 文:配列の番号 i を使いながら、入力した生徒を配列に保存する
  • foreach 文:配列から生徒を1人ずつ取り出し、同じ処理を行う

今回は、配列の何番目に保存するかを指定したい入力処理で for 文を使い、番号を意識せず全員を表示したい処理で foreach 文を使っています。

つまり、配列はデータをまとめて入れる「入れ物」、for 文と foreach 文は、その入れ物に対して同じ処理を繰り返す仕組みです。この3つを組み合わせることで、人数が変わっても同じ形のコードで処理できます。

コンソール入力からStudent配列を作り、全員の点数を順番に表示する流れの図
入力した生徒を配列へ保存し、繰り返し処理で全員の結果を表示する流れです。

入力した人数が変わってもコードは変わらない

固定データの書き方では、人数が増えるたびに変数と代入処理を追加する必要がありました。一方、入力版では次の部分が人数に合わせて自動的に繰り返されます。

  • 人数分の配列を用意する
  • for 文で人数分の Student を作る
  • 名前と点数を入力して配列に保存する
  • foreach 文で全員を表示する

3人から30人に増えても、プログラムを書き直す必要はありません。ここで初めて、配列を繰り返し処理と組み合わせるメリットがはっきり見えてきます。

初心者が気をつけたい点

この例では説明を分かりやすくするため、人数と点数には整数が入力される前提で int.Parse() を使っています。文字や空欄を入力するとエラーになります。

基本の流れを理解できたら、次の発展として int.TryParse() を使い、正しい数値が入力されるまで聞き直す処理に挑戦するとよいでしょう。

今回のまとめ

  • 固定で3人分を書く例では、配列のメリットは見えにくい
  • Console.ReadLine() を使うと、実行時に人数・名前・点数を入力できる
  • Student[] で、入力された人数分の生徒をまとめて管理できる
  • for 文で、人数分の生徒を作って配列に保存できる
  • foreach 文で、配列内の全員に同じ処理を行える
  • 人数が変わっても、コードの形は変わらない

配列だけで楽になるのではありません。配列は、for文やforeach文と組み合わせることで便利さが見えてきます。

「同じ種類のデータをまとめる」「そのデータに同じ処理を繰り返す」という場面に出会ったら、配列と繰り返し処理をセットで考えてみてください。

訪問数 8 回, 今日の訪問数 8回

広告