I - 1.08.while文 Editorial

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • while 文を使うと繰り返し処理ができる
  • 条件式が真のとき処理を繰り返す
Copy
  1. while 条件式:
  2. 処理
while 条件式:
    処理
  • NN 回処理する」というプログラムを書く場合、「カウンタ変数を 00 からはじめ、カウンタ変数が NN より小さいときにループ」という形式で書く
Copy
  1. i = 0 # カウンタ変数
  2. while i < N:
  3. 処理
  4. i += 1
i = 0  # カウンタ変数
while i < N:
    処理
    i += 1

while 文

while 文を使うと、プログラムの機能の中でも非常に重要な「繰り返し処理」(ループ処理)を行うことができます。

無限ループ

次のプログラムは、「Hello と出力して改行した後、AtCoder と出力する処理」を無限に繰り返すプログラムです。

Copy
  1. while True:
  2. print("Hello")
  3. print("AtCoder")
while True:
    print("Hello")
    print("AtCoder")
実行結果
Hello
AtCoder
Hello
AtCoder
Hello
AtCoder
Hello
AtCoder
Hello
AtCoder
...(無限に続く)

while 文は次のように書き、条件式が真のとき処理を繰り返し続けます。

Copy
  1. while 条件式:
  2. 処理
while 条件式:
    処理

先のプログラムでは条件式の部分に True と書いているため、無限に処理を繰り返し続けます。
このように、無限に繰り返し続けることを無限ループと言います。

11 ずつカウントする

次のプログラムは、11 から順に整数を出力し続けます。

Copy
  1. i = 1
  2. while True:
  3. print(i)
  4. i += 1 # ループのたびに 1 増やす
i = 1
while True:
    print(i)
    i += 1  # ループのたびに 1 増やす
実行結果
1
2
3
4
5
6
7
8
...(無限に 1 ずつ増えていく)

ループ回数の指定

11 ずつカウントするプログラムを「11 から 55 までの数を出力するプログラム」に変える場合、次のようにします。

Copy
  1. i = 1
  2.  
  3. # i が 5 以下の間だけループ
  4. while i <= 5:
  5. print(i)
  6. i += 1
i = 1

# i が 5 以下の間だけループ
while i <= 5:
    print(i)
    i += 1
実行結果
1
2
3
4
5

カウンタ変数は 00 から NN 未満まで

55Hello と出力されるプログラムを考えます。
以下では書き方を二つ紹介します。この教材では二つ目の書き方を推奨します。

推奨しない書き方

Copy
  1. # i を 1 からはじめる
  2. i = 1
  3.  
  4. # i が 5 以下の間だけループ
  5. while i <= 5:
  6. print("Hello")
  7. i += 1
# i を 1 からはじめる
i = 1

# i が 5 以下の間だけループ
while i <= 5:
    print("Hello")
    i += 1
実行結果
Hello
Hello
Hello
Hello
Hello

NN 回処理をする」というプログラムを while 文で書く場合、今までは「i11 からはじめ、NN 以下の間ループする」という形式で書いてきました。

Copy
  1. i = 1
  2. while i <= N:
  3. 処理
  4. i += 1
i = 1
while i <= N:
    処理
    i += 1

この形式は一見わかりやすいと感じるかもしれません。
しかし、この書き方はあまり一般的ではなく、次のように書いたほうがより一般的です。

推奨する書き方

Copy
  1. # i を 0 からはじめる
  2. i = 0
  3.  
  4. # i が 5 未満の間だけループ
  5. while i < 5:
  6. print("Hello")
  7. i += 1
# i を 0 からはじめる
i = 0

# i が 5 未満の間だけループ
while i < 5:
    print("Hello")
    i += 1
実行結果
Hello
Hello
Hello
Hello
Hello

NN 回処理する」というプログラムを書く場合、次のように「i00 からはじめ、NN より小さいときにループする」という形式で書くのがより一般的です。

Copy
  1. i = 0
  2. while i < N:
  3. 処理
  4. i += 1
i = 0
while i < N:
    処理
    i += 1

最初は分かりづらく感じるかもしれませんが、この形式で書いた方がプログラムをよりシンプルに書けることがあるので、慣れるようにしましょう。

なお、このプログラムの変数 i のように、「何回目のループか」を管理する変数のことをカウンタ変数と呼ぶことがあります。カウンタ変数には慣例的に i を使い、i が使えない場合は j, k, l ... と名前をつけていくことが多いです。

応用例

NN 人の合計点を求めるプログラムを作ってみましょう。
次のプログラムは「入力の個数 NN」と「点数を表す NN 個の整数」を入力で受け取り、点数の合計を出力します。

Copy
  1. N = int(input())
  2.  
  3. s = 0 # 合計点を表す変数
  4. i = 0 # カウンタ変数
  5.  
  6. while i < N:
  7. x = int(input())
  8. s += x
  9. i += 1
  10.  
  11. print(s)
N = int(input())

s = 0  # 合計点を表す変数
i = 0  # カウンタ変数

while i < N:
    x = int(input())
    s += x
    i += 1

print(s)
入力
3
1
10
100
実行結果
111

合計点を表す変数 s を用意して、ループするたびに入力を変数 x に受け取り s に足しています。

このように、繰り返し処理を使えば様々な処理が行えるようになります。

細かい話

細かい話なので、飛ばして問題を解いても良いです。

22 ずつ増やす

今までは i11 ずつだけ増やしてきましたが、22 ずつ増やすこともできます。

Copy
  1. i = 0
  2.  
  3. while i < 10:
  4. print(i)
  5. i += 2
i = 0

while i < 10:
    print(i)
    i += 2
実行結果
0
2
4
6
8

以下のように書くことで i22 ずつ増やしています。

Copy
i += 2
i += 2

同様にして、より多く飛ばしてループすることもできます。

逆順ループ

55 から 00 までの数を出力したい場合は以下のようにします。

Copy
  1. i = 5
  2.  
  3. while i >= 0:
  4. print(i)
  5. i -= 1
i = 5

while i >= 0:
    print(i)
    i -= 1
実行結果
5
4
3
2
1
0

以下のように書くことで i11 ずつ減らしています。

Copy
i -= 1
i -= 1

無限ループをコードテストで実行した場合

AtCoder のコードテストでは、実行時間が長すぎるとプログラムが中断されます。また、出力が長すぎる場合も途中から省略されます。
そのため、はじめに紹介した「Hello と出力して改行した後、AtCoder と出力する処理」を無限に繰り返すプログラムをコードテストで実行しても無限には出力されず、一例としては次のように表示されます。

実行結果
Hello
AtCoder
(中略)
Hello
AtCoder
H
終了コード
9

無限ループが発生した場合、終了コードは実行時間が長すぎることを表す 9 となります。

問題

リンク先の問題を解いてください。



2025-04-14 (Mon)
08:27:23 +00:00