基本情報技術者試験 (FE) 科目 B — 擬似言語
繰り返し (while) の書き方と無限ループの避け方
while (条件) から endwhile までを、条件が真である間くり返す。ループ本体で条件に絡む変数を更新しないと、条件は永遠に真のままとなり無限ループになる。
while は「条件が真の間くり返す」
while (条件) ... endwhile は、条件が真である間、間に挟まれた処理を何度もくり返します。 条件が最初から偽なら 1 回もまわりません。
while (条件)
// くり返したい処理
endwhile条件式のカッコは省略できません。endwhile で必ず閉じます。 for 文と違って、ループ変数の初期化・更新はプログラマが自分で書く 必要があります。
ブラウザで動かしてみる
1 から n までの合計を求める典型例です。i を 1 で初期化し、 本体の最後で i ← i + 1 と 1 ずつ増やしています。一行ずつ実行 を押していくと、i と 合計 が交互に変わっていく様子を右側の表で追えます。
変数
出力
n を 10 や 100 に変えて再実行すると、 出力される合計値がガウス和 (n(n+1)/2) と一致することが確認できます。
「更新を忘れると無限ループ」の落とし穴
while で最も多いバグが、ループ本体で条件に絡む変数を更新し忘れる ことです。次のコードは i ← i + 1 を書き忘れているので、i は永遠に 1 のまま、条件 i ≦ 5 はずっと真、ループは止まりません。
整数型: i ← 1
while (i ≦ 5) // ← 本体で i を増やさないと永遠にまわる
print(i)
endwhileこの実行シミュレーターは 100000 ステップを超えると自動停止しますが、 試験問題では手で追いかけて「これは止まるか?」を判断する必要があります。ループ条件に出てくる変数が、本体で必ず条件を偽に近づける方向に更新されているか を先にチェックする癖をつけましょう。
回数が事前に分からない場合の while
for が「n 回まわす」向きなのに対し、while は 「いつ終わるか事前に分からない繰り返し」に向いています。 次の例は 100 を 2 で割り続けて 1 になるまで何回かかるかを数えます。
変数
出力
こういう「終了条件が動的に決まる」処理は for では書きにくく、while の方が自然です。for と while の使い分けの感覚は 次の for のレッスン と読み比べると掴めます。
試験でつまずきやすいポイント
- 更新式の位置:
i ← i + 1を本体の先頭に書くのか末尾に書くのかで、出力がずれる問題がよく出る - 境界条件:
while (i ≦ n)とwhile (i < n)で 1 回分の差が出る。「以下 / より小さい」で n 回目を含むか変わる - 初期化の位置: while の外で 1 度だけ初期化するべきものを、 本体の中に書いてしまうと毎ループで初期化されて意図と違う挙動になる
while が読めるようになったら、次は「回数を明示する」形の 繰り返し (for) に進みましょう。境界条件の考え方は共通です。
よくある疑問
理解できたか試す / 自由に動かす
この構文をもっと練習する(おすすめ書籍)
擬似言語の記法の読み方から、トレースして答えを出すまでを一冊で通せる科目B特化本。手を動かして追う練習量を確保したいときの定番。
プログラミング未経験を前提に、記号の意味とアルゴリズムの考え方を最小単位から積み上げる入門書。変数や条件分岐で手が止まる段階に向く。
科目Bの出題パターンを網羅的に演習できる対策書。構文を理解した後、解法の型を身につける段階で効く。
本セクションはAmazonアソシエイトのリンクを含みます。
プログラムの読み方でつまずいたら。
たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)