- Day 7:第1週総合練習で「全部つながる」感覚をつかむ
- 目標イメージ:どんな成績管理プログラムを作るか
- Step 1:データの設計をシンプルに考える
- Step 2:1人分の成績管理プログラムの骨組み
- Step 3:合計点と平均点を計算する
- Step 4:最高点・最低点を求める
- Step 5:合格判定をする
- Step 6:5人分の点数を管理する
- Step 7:各学生の合計点・平均点・最高点・最低点を計算する
- Step 8:平均点を計算(練習課題)
- Step 9:80点以上だけ表示(練習課題)
- Step 10:60点未満を抽出(練習課題)
- Step 11:合格者数を計算(練習課題)
- Day 7 総合練習テンプレート
- Day 7のまとめ:つながった瞬間が「第1週クリア」のサイン
Day 7:第1週総合練習で「全部つながる」感覚をつかむ
Day 7は、第1週の総仕上げです。 ここまで学んできた 変数・条件分岐・ループ・配列 を全部まとめて使い、ひとつの「成績管理プログラム」を作っていきます。 雑誌の特集記事を読むような気持ちで、「あ、この書き方はDay 4でやった条件分岐だ」「このループはDay 5のパターンだ」と、頭の中でつながりを感じながら読み進めてみてください。
目標イメージ:どんな成績管理プログラムを作るか
今回作るプログラムは、次のような機能を持ちます。
- 学生名を管理する
- 点数一覧を管理する
- 合計点を計算する
- 平均点を計算する
- 最高点を求める
- 最低点を求める
- 合格判定をする
さらに、練習課題として次のことも行います。
- 5人分の点数を管理する
- 平均点を計算する
- 80点以上だけ表示する
- 60点未満を抽出する
- 合格者数を計算する
到達目標は、
変数・条件分岐・ループ・配列を組み合わせられる。 という状態になることです。
Step 1:データの設計をシンプルに考える
まずは、「どんなデータを扱うか」を整理します。
学生と点数のイメージ
- 学生名:
string - 1人分の点数一覧:
number[] - 複数人分の点数一覧:
number[][](「数値の配列の配列」)
最初は 1人分から始めて、あとで 5人分に広げていきます。
Step 2:1人分の成績管理プログラムの骨組み
まずは、1人分の成績を扱うシンプルなバージョンを書いてみます。
// day7-single-student.ts
// 1人分の成績管理プログラム
// 学生名(文字列型)
const studentName: string = "Alice";
// 点数一覧(例:国語・数学・英語・理科・社会)
const scores: number[] = [80, 90, 75, 88, 92];
console.log("学生名:", studentName);
console.log("点数一覧:", scores);
TypeScriptここまでで、
- 変数(
studentName,scores) - 配列(
number[])
を使って、基本的なデータを用意できました。
Step 3:合計点と平均点を計算する
次に、点数一覧から 合計点 と 平均点 を計算します。
合計点の計算ロジック
- 最初に
sum = 0を用意しておく - ループで配列を回しながら、
sum += scoreとして足していく
let sum: number = 0; // 合計点を入れる変数。最初は 0 からスタート
for (const score of scores) {
sum += score; // 合計に点数を足していく
}
console.log("合計点:", sum);
TypeScript平均点の計算ロジック
- 合計点 ÷ 点数の数(
scores.length)
const average: number = sum / scores.length;
console.log("平均点:", average);
TypeScript深掘りポイント:
- 「ループの外で初期値を用意して」「ループの中で少しずつ更新する」という流れは、Day 5で練習した「合計」のパターンそのものです。
scores.lengthは「何科目分の点数があるか」を教えてくれるので、平均点の計算に欠かせません。
Step 4:最高点・最低点を求める
次は、点数一覧の中から いちばん高い点 と いちばん低い点 を探します。
最高点のロジック(手書き版)
- 最初に「仮の最高点」として、配列の最初の要素を入れておく
- ループで回しながら、「今見ている点数が最高点より高ければ更新する」
let maxScore: number = scores[0]; // 仮の最高点として最初の要素を入れる
for (const score of scores) {
if (score > maxScore) {
maxScore = score; // より高い点が見つかったら更新
}
}
console.log("最高点:", maxScore);
TypeScript最低点のロジック(手書き版)
let minScore: number = scores[0]; // 仮の最低点として最初の要素を入れる
for (const score of scores) {
if (score < minScore) {
minScore = score; // より低い点が見つかったら更新
}
}
console.log("最低点:", minScore);
TypeScript深掘りポイント:
- 最大値・最小値のロジックは、ほぼ対称的です。
- 「条件を変えるだけで、別の意味の検索になる」という感覚を持っておくと、配列処理の応用がしやすくなります。
Step 5:合格判定をする
ここでは、シンプルに 平均点が60点以上なら合格 としてみます。
合格判定のロジック
const isPassed: boolean = average >= 60; // 合格ラインは 60 点以上
if (isPassed) {
console.log("合格判定: 合格です。");
} else {
console.log("合格判定: 不合格です。");
}
TypeScript深掘りポイント:
average >= 60という条件が、「合格ライン」をそのままコードで表現しています。- Day 4で学んだ「条件分岐」のパターンが、そのままここで生きています。
Step 6:5人分の点数を管理する
ここからが、Day 7の本番です。 5人分の点数をまとめて管理して、平均点や合格者数などを計算していきます。
データ構造の選び方
今回は、次のような形でデータを持ちます。
- 学生名の配列:
string[] - 各学生の点数一覧の配列:
number[][](「数値の配列の配列」)
// day7-multi-students.ts
// 5人分の成績管理プログラム
// 学生名一覧
const studentNames: string[] = ["Alice", "Bob", "Charlie", "Diana", "Edward"];
// 各学生の点数一覧(例:国語・数学・英語・理科・社会)
const studentScores: number[][] = [
[80, 90, 75, 88, 92], // Alice
[60, 70, 65, 58, 62], // Bob
[95, 85, 90, 93, 88], // Charlie
[50, 55, 45, 60, 52], // Diana
[78, 82, 80, 76, 79], // Edward
];
console.log("学生名一覧:", studentNames);
console.log("点数一覧:", studentScores);
TypeScript深掘りポイント:
number[]が「1人分の点数一覧」、それが5人分集まるとnumber[][]になります。- 「配列の中に配列が入っている」という構造は、最初は少しだけ不思議に感じるかもしれませんが、慣れるととても強力な表現になります。
Step 7:各学生の合計点・平均点・最高点・最低点を計算する
ここで、5人それぞれについて、成績をまとめて計算して表示します。
各学生の成績計算ロジック
- 外側のループで「学生」を回す
- 内側のループで「その学生の点数」を回して合計・最高点・最低点を計算
- 合計 ÷ 科目数で平均点を求める
- 平均点から合格判定をする
console.log("=== 各学生の合計点・平均点・最高点・最低点・合格判定 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i]; // i 番目の学生名
const scores: number[] = studentScores[i]; // i 番目の学生の点数一覧
let sum: number = 0;
let maxScore: number = scores[0];
let minScore: number = scores[0];
// 点数一覧をループして、合計・最高点・最低点を計算
for (const score of scores) {
sum += score;
if (score > maxScore) {
maxScore = score;
}
if (score < minScore) {
minScore = score;
}
}
const average: number = sum / scores.length;
const isPassed: boolean = average >= 60;
console.log(`\n${name} の成績:`);
console.log(" 点数一覧:", scores);
console.log(" 合計点:", sum);
console.log(" 平均点:", average);
console.log(" 最高点:", maxScore);
console.log(" 最低点:", minScore);
if (isPassed) {
console.log(" 合格判定: 合格");
} else {
console.log(" 合格判定: 不合格");
}
}
TypeScript深掘りポイント:
- 外側の
forで「学生」を回し、内側のfor...ofで「点数」を回しています。 - 「ループの中にループがある」形は、最初は少しだけ頭を使いますが、慣れると自然に読めるようになります。
- ここまでで、変数・条件分岐・ループ・配列 がすべて登場しています。
Step 8:平均点を計算(練習課題)
練習課題のひとつ「平均点を計算」は、すでに上で実装しています。 ここでは、平均点だけをシンプルに表示するバージョンも書いておきます。
console.log("\n=== 各学生の平均点一覧 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
console.log(`${name} の平均点: ${average}`);
}
TypeScriptStep 9:80点以上だけ表示(練習課題)
次は、「平均点が80点以上の学生だけ」を表示してみます。
console.log("\n=== 平均点が80点以上の学生 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average >= 80) {
console.log(`${name}(平均点: ${average})`);
}
}
TypeScript深掘りポイント:
- 「平均点を計算するロジック」は同じで、条件だけを変えています。
- 条件を変えるだけで、「80点以上」「70点以上」「合格ライン」など、いろいろなフィルタリングができます。
Step 10:60点未満を抽出(練習課題)
次は、「平均点が60点未満の学生」を抽出して表示します。
console.log("\n=== 平均点が60点未満の学生 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average < 60) {
console.log(`${name}(平均点: ${average})`);
}
}
TypeScript深掘りポイント:
average < 60という条件が、「不合格ライン」をそのままコードで表現しています。- Day 4で学んだ「条件分岐」が、ここでもそのまま使われています。
Step 11:合格者数を計算(練習課題)
最後に、「平均点が60点以上の学生が何人いるか」を数えてみます。
合格者数のロジック
- 最初に
passedCount = 0を用意しておく - 各学生の平均点を計算し、条件を満たしたら
passedCount++する
console.log("\n=== 合格者数の計算 ===");
let passedCount: number = 0;
for (let i = 0; i < studentNames.length; i++) {
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average >= 60) {
passedCount++; // 合格者を1人カウント
}
}
console.log("合格者数:", passedCount, "人");
TypeScript深掘りポイント:
- 「合計を計算する」ときと同じように、「カウントを増やす」という形で考えます。
passedCount++は、「合格者が1人増えた」という意味です。- こうした「カウンタ変数」は、ループと条件分岐の組み合わせでよく登場します。
Day 7 総合練習テンプレート
最後に、今日の内容をひとつのファイルにまとめたテンプレートを載せておきます。 このままコピーして、点数や合格ラインを変えたり、学生を増やしたりしながら、自分なりの成績管理プログラムに育ててみてください。
// day7-practice.ts
// Day 7:第1週総合練習 成績管理プログラム
// 学生名一覧
const studentNames: string[] = ["Alice", "Bob", "Charlie", "Diana", "Edward"];
// 各学生の点数一覧(例:国語・数学・英語・理科・社会)
const studentScores: number[][] = [
[80, 90, 75, 88, 92], // Alice
[60, 70, 65, 58, 62], // Bob
[95, 85, 90, 93, 88], // Charlie
[50, 55, 45, 60, 52], // Diana
[78, 82, 80, 76, 79], // Edward
];
console.log("=== 学生一覧と点数 ===");
console.log("学生名:", studentNames);
console.log("点数一覧:", studentScores);
console.log("\n=== 各学生の合計点・平均点・最高点・最低点・合格判定 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
let maxScore: number = scores[0];
let minScore: number = scores[0];
for (const score of scores) {
sum += score;
if (score > maxScore) {
maxScore = score;
}
if (score < minScore) {
minScore = score;
}
}
const average: number = sum / scores.length;
const isPassed: boolean = average >= 60;
console.log(`\n${name} の成績:`);
console.log(" 点数一覧:", scores);
console.log(" 合計点:", sum);
console.log(" 平均点:", average);
console.log(" 最高点:", maxScore);
console.log(" 最低点:", minScore);
console.log(" 合格判定:", isPassed ? "合格" : "不合格");
}
console.log("\n=== 平均点が80点以上の学生 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average >= 80) {
console.log(`${name}(平均点: ${average})`);
}
}
console.log("\n=== 平均点が60点未満の学生 ===");
for (let i = 0; i < studentNames.length; i++) {
const name: string = studentNames[i];
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average < 60) {
console.log(`${name}(平均点: ${average})`);
}
}
console.log("\n=== 合格者数の計算 ===");
let passedCount: number = 0;
for (let i = 0; i < studentNames.length; i++) {
const scores: number[] = studentScores[i];
let sum: number = 0;
for (const score of scores) {
sum += score;
}
const average: number = sum / scores.length;
if (average >= 60) {
passedCount++;
}
}
console.log("合格者数:", passedCount, "人");
TypeScriptDay 7のまとめ:つながった瞬間が「第1週クリア」のサイン
Day 7では、
- 変数でデータを持ち
- 配列で複数人・複数科目の点数をまとめ
- ループで合計・平均・最高点・最低点を計算し
- 条件分岐で合格判定やフィルタリングを行う
という流れを、一つの成績管理プログラムの中で体験しました。
「ここで使っているループはDay 5でやった形だな」「この条件分岐はDay 4の応用だな」「配列はDay 6で練習したやつだ」と、頭の中でつながりを感じられたら、第1週の到達目標はしっかりクリアできています。
このプログラムは、ぜひ自分なりにアレンジしてみてください。 科目を増やす、合格ラインを変える、合格者一覧を表示する——そうやって少しずつ“自分のプログラム”にしていくことが、次のステップへのいちばんの近道になります。

