採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

標準入力をループで処理

テクノロジ系 / loop (for / while / break / continue)

標準入力をループで処理

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() で取得できる

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

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

問題

1 行目に整数 N、2 行目以降に N 行のテキストが入力されます。

N 行のテキストをそのまま 1 行ずつ出力してください。

入力例:

3
apple
banana
cherry

期待される出力:

apple
banana
cherry

採点

php scripts/grade.php topics/loop/ch06-loop-with-input/drill/01-read-n-lines/

ヒント

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

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

問題

1 行目に整数 N、2 行目以降に N 個の整数が 1 行ずつ入力されます。

N 個の整数の合計を出力してください。

入力例:

5
1
2
3
4
5

期待される出力:

15

採点

php scripts/grade.php topics/loop/ch06-loop-with-input/drill/02-sum-n-numbers/

ヒント

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

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

問題

1 行目に整数 N、2 行目以降に N 個の整数が 1 行ずつ入力されます。

N 個の整数の 最大値 を出力してください。

入力例:

5
3
17
9
42
8

期待される出力:

42

採点

php scripts/grade.php topics/loop/ch06-loop-with-input/drill/03-max-of-n/

ヒント

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