C# | 1 日 90 分 × 7 日アプリ学習:初級編

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

5日目のゴール

初級編 5日目のテーマは
「“1つのものに、複数の情報がくっついている”状態を、C# でちゃんと表現できるようになること」 です。

ここまでであなたは、
「数の集まり(配列)」は扱えるようになりました。
でも現実のデータは、もっと“セット”になっています。

名前と点数
日付と勉強時間
科目名と勉強時間
ID とパスワード

今日はここに踏み込んでいきます。

キーワードは二段階です。

まずは「並行配列(名前配列+点数配列)」
そのあとで「クラスで1つの“型”としてまとめる」

いきなり難しいことはしません。
「こういうふうに整理すると、コードがグッと読みやすくなる」という感覚をつかむのがゴールです。


「名前」と「点数」を別々の配列で持つ

まずは“素朴なやり方”から

例えば、3人のテスト結果を扱いたいとします。

太郎 80 点
花子 95 点
次郎 70 点

これを、まずは「名前配列」と「点数配列」に分けて持ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        string[] names = { "太郎", "花子", "次郎" };
        int[] scores = { 80, 95, 70 };

        for (int i = 0; i < names.Length; i++)
        {
            Console.WriteLine(names[i] + " さん: " + scores[i] + " 点");
        }
    }
}
C#

ここでのルールはシンプルです。

インデックス 0 は「太郎」と「80」
インデックス 1 は「花子」と「95」
インデックス 2 は「次郎」と「70」

つまり、「同じインデックス同士がペア」という約束で動いています。

このやり方は、
「とりあえず動かす」には十分です。
でも、人数が増えたり、情報が増えたりすると、
だんだん“ほつれ”が出てきます。


並行配列のつらさをあえて感じてみる

「インデックスがズレたら終わり」という不安

例えば、あとから点数配列だけをソートしたり、
誰か1人だけ削除したりしたらどうなるでしょう。

names と scores のインデックスがズレる
太郎なのに 95 点、花子なのに 70 点、みたいな状態になる
でもコンパイラは怒ってくれない(型的には正しいから)

つまり、
「人間の約束で整合性を保っている」
という、ちょっと危うい状態です。

ここで初めて、
「名前と点数を“1つのかたまり”として扱いたい」
という欲求が出てきます。

この“モヤモヤ”が、今日の本題への入口です。


「1人分」を1つの型にする発想

「生徒」という“もの”をコードで表す

現実世界では、
「太郎」という人は、名前も点数も両方持っています。

それを C# で表現するなら、
「名前」と「点数」をセットにした“型”を作るのが自然です。

そのために使うのが「クラス」です。

まずは、最小限のクラスを書いてみます。

class Student
{
    public string Name;
    public int Score;
}
C#

これは、

Student という新しい“型”を定義している
その中に Name(名前)と Score(点数)というフィールドを持っている

という意味です。

int や string と同じように、
Student という「自分で作った型」が使えるようになります。


Student 型を使ってみる

1人分のデータを作る

さっき定義した Student を使って、
1人分のデータを作ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Student s = new Student();

        s.Name = "太郎";
        s.Score = 80;

        Console.WriteLine(s.Name + " さん: " + s.Score + " 点");
    }
}

class Student
{
    public string Name;
    public int Score;
}
C#

ここで起きていることを丁寧に追います。

Student s = new Student();
Student 型の変数 s を作り、new で“中身”を用意している

s.Name = “太郎”;
s の中の Name フィールドに “太郎” を入れている

s.Score = 80;
s の中の Score フィールドに 80 を入れている

Console.WriteLine で、s.Name と s.Score を使って表示している

ポイントは、
「名前と点数が、s という“1人分の箱”の中に一緒に入っている」
ということです。


Student の配列で「複数人」を扱う

並行配列から「オブジェクトの配列」へ

いよいよ本命です。
Student を配列にして、「複数人」を扱ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        Student[] students = new Student[3];

        students[0] = new Student();
        students[0].Name = "太郎";
        students[0].Score = 80;

        students[1] = new Student();
        students[1].Name = "花子";
        students[1].Score = 95;

        students[2] = new Student();
        students[2].Name = "次郎";
        students[2].Score = 70;

        for (int i = 0; i < students.Length; i++)
        {
            Console.WriteLine(students[i].Name + " さん: " + students[i].Score + " 点");
        }
    }
}

class Student
{
    public string Name;
    public int Score;
}
C#

ここでの構造はこうです。

students は「Student 型の配列」
students[0] は「1人目の Student」
students[0].Name / students[0].Score で、その人の情報にアクセス

つまり、

配列のインデックスで「誰か」を選び
ドット(.)のあとで「その人のどの情報か」を選ぶ

という二段階になっています。

並行配列のときは、

names[i] と scores[i] を“人間の約束”で対応させていました。
Student 配列なら、
「1人分の中に全部入っている」ので、ズレようがありません。


入力と組み合わせて「生徒一覧アプリ」を作る

名前と点数を入力して、一覧と統計を出す

ここからが楽しいところです。
Student 配列と入力を組み合わせて、
小さな「生徒管理」っぽいアプリを作ってみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int count = ReadInt("何人分のデータを入力しますか?:");

        Student[] students = new Student[count];

        for (int i = 0; i < students.Length; i++)
        {
            Console.WriteLine("----------");
            Console.WriteLine((i + 1) + "人目の情報を入力します。");

            Console.Write("名前:");
            string name = Console.ReadLine();

            int score = ReadInt("点数を入力してください:");

            Student s = new Student();
            s.Name = name;
            s.Score = score;

            students[i] = s;
        }

        Console.WriteLine();
        Console.WriteLine("【一覧】");

        for (int i = 0; i < students.Length; i++)
        {
            Console.WriteLine(students[i].Name + " さん: " + students[i].Score + " 点");
        }

        int total = 0;
        int max = students[0].Score;
        int min = students[0].Score;
        string maxName = students[0].Name;
        string minName = students[0].Name;

        for (int i = 0; i < students.Length; i++)
        {
            int s = students[i].Score;
            total = total + s;

            if (s > max)
            {
                max = s;
                maxName = students[i].Name;
            }

            if (s < min)
            {
                min = s;
                minName = students[i].Name;
            }
        }

        double average = (double)total / students.Length;

        Console.WriteLine();
        Console.WriteLine("【統計】");
        Console.WriteLine("人数: " + students.Length);
        Console.WriteLine("合計点: " + total);
        Console.WriteLine("平均点: " + average);
        Console.WriteLine("最高点: " + maxName + " さん (" + max + " 点)");
        Console.WriteLine("最低点: " + minName + " さん (" + min + " 点)");
    }

    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("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}

class Student
{
    public string Name;
    public int Score;
}
C#

ここで深掘りしたいのは、「最大点とその人の名前」をどう扱っているかです。

max だけでなく maxName も一緒に更新している
min だけでなく minName も一緒に更新している

つまり、

「最大点が更新されたら、そのときの人の名前も一緒に覚えておく」
というロジックになっています。

Student 型のおかげで、
「students[i].Score」と「students[i].Name」が
常にセットで扱えるので、とても自然に書けています。


クラスを使うと「意味のある型」が増えていく

int や string と同じ“仲間”としての Student

ここまで来ると、
Student は「特別なもの」ではなくなります。

int や string と同じように、
「Student 型の変数」「Student 型の配列」が
当たり前に使えるようになります。

例えば、こんなメソッドも書けます。

static void PrintStudent(Student s)
{
    Console.WriteLine(s.Name + " さん: " + s.Score + " 点");
}
C#

Main からは、こう呼べます。

PrintStudent(students[i]);
C#

「Student という“意味のある型”を作る」
→ その型を引数や戻り値に使う
→ コードの“日本語としての読みやすさ”が一気に上がる

これが、クラスを使う一番の価値です。


5日目のミニアプリ:簡易「学習記録」クラス

勉強時間にも“名前”をつけてみる

Student の代わりに、
「日付と勉強時間」をセットにした型を作ることもできます。

例えば、こんな感じです。

class StudyLog
{
    public string DateText;
    public int Minutes;
}
C#

これを使って、
「3日分の勉強記録」を入力・表示してみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int count = 3;
        StudyLog[] logs = new StudyLog[count];

        for (int i = 0; i < logs.Length; i++)
        {
            Console.WriteLine("----------");
            Console.WriteLine((i + 1) + "件目の記録を入力します。");

            Console.Write("日付(例: 2026-04-18):");
            string date = Console.ReadLine();

            int minutes = ReadInt("勉強時間(分)を入力してください:");

            StudyLog log = new StudyLog();
            log.DateText = date;
            log.Minutes = minutes;

            logs[i] = log;
        }

        Console.WriteLine();
        Console.WriteLine("【勉強記録一覧】");

        int total = 0;

        for (int i = 0; i < logs.Length; i++)
        {
            Console.WriteLine(logs[i].DateText + " : " + logs[i].Minutes + " 分");
            total = total + logs[i].Minutes;
        }

        double average = (double)total / logs.Length;

        Console.WriteLine();
        Console.WriteLine("合計勉強時間: " + total + " 分");
        Console.WriteLine("平均勉強時間: " + average + " 分");
    }

    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("数字として解釈できませんでした。もう一度入力してください。");
            }
        }
    }
}

class StudyLog
{
    public string DateText;
    public int Minutes;
}
C#

ここでもやっていることは同じです。

「1件分の記録」を StudyLog という型にまとめる
StudyLog の配列で「複数件」を扱う
for で回して集計する

Student でも StudyLog でも、
「現実の“1つのもの”を1つの型にする」
という考え方は共通です。


5日目で絶対に押さえておきたいポイント

「セットの情報」をクラスでまとめる感覚

今日の一番大事なポイントを、言葉でまとめるとこうです。

現実の“1つのもの”には、複数の情報がくっついている
それをバラバラの配列で持つと、インデックスの対応がつらくなる
クラスを使うと、「1つの型」としてまとめられる
その型の配列を作れば、「複数のもの」を自然に扱える

具体的には、この流れを体で覚えてほしいです。

クラスを定義する(Student / StudyLog など)
そのクラスのインスタンスを new で作る
フィールドに値を入れる(s.Name = “…”; など)
クラスの配列を作る(Student[] students = new Student[count];)
配列の各要素に new したインスタンスを入れる

ここまで来ると、
「ただの数の集まり」ではなく
「意味のあるデータ構造」を自分で設計できるようになります。


もし余裕があればやってみてほしいこと

自分の“よく使う情報セット”をクラスにしてみる

例えば、こんなものを考えてみてください。

本のタイトル+著者名+ページ数
ゲームのタイトル+プレイ時間+評価(1〜5)
タスク名+締切日+優先度

それぞれをクラスにして、
配列に入れて、一覧表示してみる。

やることは全部、今日やったことの応用です。


5日目のまとめ

初級編 5日目で、あなたは

「数や文字の集まり」から
「意味のある“1つのもの”を表す型」

へと、一段階ステップアップしました。

クラス
フィールド
クラスの配列
クラスを引数や戻り値に使うメソッド

これらは、
この先どんなアプリを書いても、
必ず何度も出てくる“本筋”の概念です。

6日目・7日目では、
今日作った「意味のある型」を
メニュー付きアプリの中に組み込んで、
いよいよ「小さな実用アプリ」に近づけていきます。

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