for は「何回回すか」を先に書く繰返しでした。while は違います。条件が真である間ずっと繰り返すので、何回で終わるかは動かしてみるまで分かりません。この違いが分かると、読み方が変わります。
第1部 擬似言語の教科書 地図+20回
G1擬似言語の地図(入口)G2-1変数と宣言G2-2データ型G2-3代入「←」G3-1部品を呼ぶ/戻るG3-2引数G3-3戻り値・手続と関数G4-1配列と要素番号G4-2配列の読み書きG5選択処理 ifG6-1繰返し forG6-2配列を for で回すG7繰返し whileG8-1算術演算子と優先順位G8-2and / or / notG9-12次元配列G9-22重ループG10大域変数と局所変数G11未定義G12-1演算子 . の読み方G12-2クラスとはG12-3コンストラクタ
while の書き方 ── IPAが決めていること
出典:IPA「擬似言語の記述形式」
-
while (条件式) 処理 endwhile
- 前判定繰返し処理を示す。
条件式が真の間,処理を繰返し実行する。
処理は,0 以上の文の集まりである。 -
do 処理 while (条件式)
- 後判定繰返し処理を示す。
処理を実行し,条件式が真の間,処理を繰返し実行する。
処理は,0 以上の文の集まりである。
覚えることは「判定が先か、処理が先か」だけです。名前の前判定・後判定がそのまま順番を表しています。
for との違い ── 回数が決まっているか
| 回す回数 | 典型的な使われ方 | |
|---|---|---|
for |
先に決まっている(制御記述に書いてある) | 配列を先頭から末尾まで見る |
while |
やってみないと分からない | ある状態になるまで繰り返す |
for は回数が書いてある。while は動かすまで分からない
for (i を 1 から 10 まで 1 ずつ増やす) なら、読んだ瞬間に10回だと分かります(G6)。while にはそれがありません。回数を知りたければ、実際に追うしかないのです。
お湯が沸くまで待つのと同じです。何分かかるかは先に決まっていなくて、沸いたかどうかを見て、まだなら待ち続ける。while が書き表しているのは、この形です。
次のうち、while で書くのがいちばんふさわしいのはどれですか。
while の中では、条件式に出てくる変数のどれかが必ず変化します。変化しなければ条件は真のままで、繰返しが終わらないからです。
だから while を読むときは、まず条件式に出てくる変数を見つけ、それが中のどこで変わるかを探すのが近道です。そこが「終わりに近づいていく仕組み」です。
次のプログラムを実行すると、"X" は何回出力されますか。
整数型: n ← 3 while (n > 0) "X" を出力する endwhile
前判定と後判定 ── 違いが出るのは1か所だけ
2つの形の差は、条件が最初から偽だったときにしか現れません。
最初から偽のとき
前判定(while)
整数型: n ← 5 while (n > 10) "A" を出力する endwhile
先に条件を見ます。5 > 10 は偽なので、中には一度も入りません。出力はありません(0回)。
後判定(do-while)
整数型: n ← 5 do "A" を出力する while (n > 10)
先に処理をやります。“A” が1回出力されてから条件を見て、偽なので終わります(1回)。
逆にいえば、条件が最初から真ならどちらも同じ動きになります。違いが出るのは最初の1回だけ ── ここだけ押さえておけば十分です。
次のプログラムを実行し終えたとき、n はいくつですか。
整数型: n ← 1 do n ← n + 1 while (n < 4)
1行ずつ動かして確かめる
while がいちばん活きるのは、何回で終わるか、やってみないと分からないときです。
整数型: nokori ← 20 整数型: kaisu ← 0 while (nokori ≧ 6) nokori ← nokori - 6 kaisu ← kaisu + 1 endwhile
追いかける前に ─ このプログラムは何をする?
20 から 6 を、引けるだけ引くだけです。引いた回数を kaisu に数えます。
nokori |
kaisu |
nokori ≧ 6 |
|
|---|---|---|---|
| はじめ | 20 | 0 | 真 |
| 1周 | 14 | 1 | 真 |
| 2周 | 8 | 2 | 真 |
| 3周 | 2 | 3 | 偽 → 終わり |
終わったとき kaisu は 3、nokori は 2。これは 20 ÷ 6 の商と余りそのものです。
3回だと最初から分かっていたわけではありません。引いてみて、6 より小さくなったところで止まる ── これが while の使いどころです。
条件は nokori ≧ 6。その nokori が、中の nokori ← nokori - 6 で毎周小さくなります。だから必ず終わります。
この行が無ければ終わりません。while を読むときに最初に探すのは、ここです。
引けるだけ引く
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
結果
トレース表(進めると1行ずつ積み上がります)
(基本情報技術者試験 科目B サンプル問題 問4)最大公約数を求める問題では、2つの数が等しくなるまで、大きいほうから小さいほうを引き続けます。
while (x ≠ y)
何回引けば等しくなるかは、やってみないと分かりません。だからここも while です。「回数が先に決まらないから while」という選び方は、いま見た例とまったく同じです。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 前判定でも1回は実行されると思う | 条件が最初から偽なら0回。中に入らない |
| 後判定でも0回がありうると思う | 処理が先なので必ず1回は実行される |
| 判定の回数と周回数を同じだと思う | 前判定は抜けるための判定が1回多い |
| 条件式の変数が中で変わらない | 変わらなければ終わらない。どこで変わるかを探す |
「〜まで繰り返す」を if で書く |
if は1回だけ。繰返しではない |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 基本情報技術者試験 科目B サンプル問題(2022年12月26日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
n ← 5 を使った前判定・後判定の例は当サイトのオリジナルです。

