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

