ch06 6章中 6章目

ch06 — 標準入力をループで処理

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch06 — 標準入力をループで処理」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch06 — 標準入力をループで処理」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch06 — 標準入力をループで処理」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

ループの基本構文を覚えたら、次は 実用パターン に進む。プログラミング演習でも実務でも頻出するのが「最初に件数 N が与えられ、続く N 行に実データが並ぶ」という入力形式だ。たとえば「テストの人数 → 各人の点数」「商品数 → 各商品の価格」のように、件数を先に教えてもらえば、こちらは N 回の for ループでデータを順に読めば良い、という構造になる。

具体的な書き方は、まず trim(fgets(STDIN)) で 1 行目から N を受け取り、続けて for ($i = 0; $i < $N; $i++) の中でもう一度 fgets(STDIN) を呼ぶ、というパターンになる。読んだ値は文字列なので、数値計算したいときは (int) でキャストするのを忘れないこと。読み込んだ値はその場で集計してもいいし、いったん配列に貯めて後でまとめて処理する形でもいい — 後者なら配列章で学ぶ array_sum() / max() / min() のような 組み込み関数 をそのまま使えて、ループの中で if の山を書かずに済む。

このパターンを押さえると、「入力フォーマットを読むループで処理集計値を出力」という、プログラミング演習で出題される問題の 半分以上 が同じ骨格で解けることに気づくはずだ。逆に言うと、ここで「件数 N → N 行データ → 集計」の型が体に染みていないと、後の配列・関数の章で「何でこんな構造になってるんだろう」と毎回混乱することになる。シンプルだが土台になるパターンなので、ドリルで手を動かして体得しておきたい。

学習目標

  • 「件数 N の後に N 行のデータ」というよくある入力形式を処理できる
  • ループの中で fgets(STDIN) を呼び、複数行入力を読める
  • ループの結果を集計 (合計・最大値) できる

ドリル

no 内容
01 1 行目に N、2 行目以降に N 行のテキスト → そのまま出力
02 1 行目に N、2 行目以降に N 個の整数 → 合計を出力
03 1 行目に N、2 行目以降に N 個の整数 → 最大値を出力

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. 標準入力をループで処理

    Lesson 3 / Chapter 6

  2. よくある入力形式

    3
    りんご
    みかん
    ぶどう
    • 1 行目に 件数 N
    • 2 行目以降に N 行のデータ

    この形式は競技プログラミングや paizaLMS でも頻出。

  3. 件数 N を読んで N 回ループ

    <?php
    $n = (int) trim(fgets(STDIN));
    for ($i = 0; $i < $n; $i++) {
        $line = trim(fgets(STDIN));
        echo $line . "\n";
    }
    • まず 1 行目で N を読む
    • for で N 回ループ
    • 各回で fgets(STDIN) を 1 回呼ぶ
    • 読んだ値を使う / 配列に貯める
  4. 配列に貯める

    <?php
    $n = (int) trim(fgets(STDIN));
    $lines = [];
    for ($i = 0; $i < $n; $i++) {
        $lines[] = trim(fgets(STDIN));
    }
    • $lines = []; で空の配列を用意
    • $lines[] = ...; で末尾に追加
    • N 回ループしたら N 個の要素が入っている
  5. 合計を計算する

    <?php
    $n = (int) trim(fgets(STDIN));
    $sum = 0;
    for ($i = 0; $i < $n; $i++) {
        $sum += (int) trim(fgets(STDIN));
    }
    echo $sum . "\n";
    • $sum = 0; で 0 から始める
    • ループの中で $sum += ...; で足していく
    • 最後に $sum を出力

    array_sum($arr) で配列の合計を一発で計算する書き方もある。

  6. 最大値を計算する

    <?php
    $n = (int) trim(fgets(STDIN));
    $values = [];
    for ($i = 0; $i < $n; $i++) {
        $values[] = (int) trim(fgets(STDIN));
    }
    echo max($values) . "\n";
    • 一旦配列に貯める
    • max($values) で配列の最大値を取得

    ループの中で「これまでの最大」を更新していく書き方もある:

    $best = PHP_INT_MIN;
    for (...) {
        $v = (int) trim(fgets(STDIN));
        if ($v > $best) $best = $v;
    }
  7. このチャプターでできるようになること

    ✅ 「N 行のデータ」を for ループで読める ✅ 読んだ値を配列に貯められる ✅ 合計を計算できる ✅ 最大値を max() で取得できる

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 3 / Chapter 6


よくある入力形式

3
りんご
みかん
ぶどう
  • 1 行目に 件数 N
  • 2 行目以降に N 行のデータ

この形式は競技プログラミングや paizaLMS でも頻出。


件数 N を読んで N 回ループ

<?php
$n = (int) trim(fgets(STDIN));
for ($i = 0; $i < $n; $i++) {
    $line = trim(fgets(STDIN));
    echo $line . "\n";
}
  • まず 1 行目で N を読む
  • for で N 回ループ
  • 各回で fgets(STDIN) を 1 回呼ぶ
  • 読んだ値を使う / 配列に貯める

配列に貯める

<?php
$n = (int) trim(fgets(STDIN));
$lines = [];
for ($i = 0; $i < $n; $i++) {
    $lines[] = trim(fgets(STDIN));
}
  • $lines = []; で空の配列を用意
  • $lines[] = ...; で末尾に追加
  • N 回ループしたら N 個の要素が入っている

合計を計算する

<?php
$n = (int) trim(fgets(STDIN));
$sum = 0;
for ($i = 0; $i < $n; $i++) {
    $sum += (int) trim(fgets(STDIN));
}
echo $sum . "\n";
  • $sum = 0; で 0 から始める
  • ループの中で $sum += ...; で足していく
  • 最後に $sum を出力

array_sum($arr) で配列の合計を一発で計算する書き方もある。


最大値を計算する

<?php
$n = (int) trim(fgets(STDIN));
$values = [];
for ($i = 0; $i < $n; $i++) {
    $values[] = (int) trim(fgets(STDIN));
}
echo max($values) . "\n";
  • 一旦配列に貯める
  • max($values) で配列の最大値を取得

ループの中で「これまでの最大」を更新していく書き方もある:

$best = PHP_INT_MIN;
for (...) {
    $v = (int) trim(fgets(STDIN));
    if ($v > $best) $best = $v;
}

このチャプターでできるようになること

✅ 「N 行のデータ」を for ループで読める ✅ 読んだ値を配列に貯められる ✅ 合計を計算できる ✅ 最大値を max() で取得できる

→ ドリルへ

この章で取り組む 演習問題の流れ (3ステップ)
  1. 01 ドリル 01 — N 行をそのまま出力 README.md starter.php answer.php
  2. 02 ドリル 02 — N 個の整数の合計 README.md starter.php answer.php
  3. 03 ドリル 03 — N 個の整数の最大値 README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — N 行をそのまま出力

問題

1 行目に整数 N、2 行目以降に N 行のテキストが入力されます。 N 行のテキストをそのまま 1 行ずつ出力してください。

入力例:

3
apple
banana
cherry

期待される出力:

apple
banana
cherry

ヒント

  • $n = (int) trim(fgets(STDIN)); で件数を読む
  • for ($i = 0; $i < $n; $i++) で N 回ループ
  • 各回で $line = trim(fgets(STDIN)); echo $line . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — N 個の整数の合計

問題

1 行目に整数 N、2 行目以降に N 個の整数が 1 行ずつ入力されます。 N 個の整数の合計を出力してください。

入力例:

5
1
2
3
4
5

期待される出力:

15

ヒント

  • $n = (int) trim(fgets(STDIN)); で件数を読む
  • $sum = 0; で合計用変数
  • for ($i = 0; $i < $n; $i++) { $sum += (int) trim(fgets(STDIN)); }
  • 最後に echo $sum . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 03 — N 個の整数の最大値

問題

1 行目に整数 N、2 行目以降に N 個の整数が 1 行ずつ入力されます。 N 個の整数の 最大値 を出力してください。

入力例:

5
3
17
9
42
8

期待される出力:

42

ヒント

  • $n = (int) trim(fgets(STDIN)); で件数を読む
  • $values = []; を用意して、N 個の整数を $values[] = ...; で貯める
  • echo max($values) . "\n"; で最大値を出力
  • (別解) ループの中で「これまでの最大」を更新していく書き方でもよい

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(3問)

  1. ドリル 01 — N 行をそのまま出力

    README.md starter.php answer.php

  2. ドリル 02 — N 個の整数の合計

    README.md starter.php answer.php

  3. ドリル 03 — N 個の整数の最大値

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます