次のプログラムで、x と y の値を入れ替えるつもりで2つの代入文を書いた。実行した後の x と y の値の組はどれか。
- Ax = 3, y = 3
- Bx = 7, y = 3
- Cx = 7, y = 7
基本情報技術者試験の科目Bの擬似言語で書いたプログラムを実行して、1行ずつ変数の値の変化を確かめられます。if・while・for、配列、関数と再帰呼出しに対応しています。問題のプログラムを入力して、自分のトレース(手で追った結果)と比べてみてください。
お気に入りと最近使ったツールは、このブラウザ内(localStorage)にのみ保存されます。
試験の擬似言語の主な書き方に対応した、学習用の簡単な処理系です。実際の試験問題の書き方とは細部が異なることがあります。変数の表は、その時点で実行している関数の中の変数を表示します(関数の外で宣言した変数は、関数の中からも使えます)。配列は参照で渡します。
ほかの入力は今の値のまま、選んだ入力だけを今の値の1/4〜4倍の範囲で変えたときの結果です。赤い点が今の値です。
基本情報技術者試験の科目Bでは、擬似言語で書かれたプログラムを読み、実行結果や空欄に入る字句を答える問題が中心です。そのためには、プログラムを1行ずつ追いかけて、変数の値がどう変わるかを表に書きながら確かめるトレースの力が欠かせません。このツールでは、自分で手を動かしてトレースした結果を、実際に実行した結果と1行ずつ比べられます。
擬似言語では、変数は「整数型: x」のように型を付けて宣言し、値の代入は「x ← 1」のように矢印で書きます。条件分岐は if … elseif … else … endif、繰返しは while … endwhile や for … endfor で書きます。配列は {1, 2, 3} のように書き、要素は a[1] のように1から数える番号で指定します。関数は「○整数型: f(整数型: n)」のように宣言し、return で値を返します。÷ の結果は、整数型の変数に入れると小数部が切り捨てられることに注意します。
トレースでは、変数ごとに列を作った表に、1行実行するたびに変わった値を書き込みます。繰返しは、毎回の条件の判定を忘れずに書き、最後に条件が偽になって抜ける回も数えます。配列の番号が1から始まるのか0から始まるのか、繰返しの終わりが「まで」なのか「未満」なのかで、結果が1回分ずれる(オフバイワン)間違いがよく起こります。再帰呼出しでは、呼出しの深さごとに変数が別々にあることを意識し、戻り値を下から順に計算します。
科目Bでよく題材になるのは、配列の合計・最大値・並べ替え(バブルソートや選択ソート)、二分探索、最大公約数(ユークリッドの互除法)、2進数への変換、再帰(階乗・フィボナッチ数)、スタックやキューを配列で作るプログラムなどです。例を選んで実行し、トレースの表で変数の変化を確かめてから、条件や繰返しの範囲を少し変えて、結果がどう変わるかを試してみてください。
正解:A. a = 2, b = 3, c = 1
t ← a で、最初の a の値1を t に退避します。a ← b で a = 2、b ← c で b = 3 になり、最後の c ← t で退避しておいた1が c に入ります。3つの値が1つずつ前へずれるので、a = 2、b = 3、c = 1 です。t を使わずに c ← a と書くと、その時点の a はすでに2なので c = 2 になってしまいます。
正解:B. 5
x と n の値をトレース表に書き出すと、繰返しのたびに x は 3、9、27、81、243 と変わり、n は1ずつ増えます。x = 81 のときはまだ x < 100 が成り立つので、もう1回実行して x = 243、n = 5 になります。次の判定で x < 100 が偽になり、繰返しを抜けます。条件の判定は6回行われますが、中の処理が実行されるのは5回です。
正解:A. 25
i は 1、3、5、7、9 と2ずつ増え、次の11は終値10を超えるので繰返しは終わります。s = 1 + 3 + 5 + 7 + 9 = 25 です。for 文では、制御変数が終値を超えた時点で繰返しを抜けるので、終値を超えた値で中の処理を実行することはありません。
正解:A. 15
内側の繰返しは j が i から5まで動くので、i = 1 のとき5回、i = 2 のとき4回、…、i = 5 のとき1回実行されます。合計は 5 + 4 + 3 + 2 + 1 = 15 です。内側の初期値が外側の変数 i によって変わるので、単純に 5 × 5 にはなりません。
正解:B. 6
内側の繰返しは j = 1〜i で、j が奇数のときだけ c を増やします。i = 1 では j = 1 の1回、i = 2 では j = 1 の1回、i = 3 では j = 1、3 の2回、i = 4 では j = 1、3 の2回で、合計 1 + 1 + 2 + 2 = 6 です。内側の処理は全部で 1 + 2 + 3 + 4 = 10 回実行されますが、そのうち条件を満たすのは6回です。繰返しの中に条件分岐を入れた、制御構造の組合せの基本形です。
正解:A. 2
m は、それまでに見た中で最大の要素の要素番号です。i = 2 で a[2] = 8 > a[1] = 3 なので m = 2 になります。i = 4 の a[4] = 8 は a[2] = 8 と等しく、> は成り立たないので m は変わりません。そのため最大値が複数あるときは、最初に現れた要素番号2が残ります。条件を ≧ にすると、最後に現れた要素番号4になります。
変数・配列の宣言、代入、if・while・do while・for、関数と手続、配列の要素数と末尾への追加、算術・比較・論理の演算に対応しています。2次元配列、オブジェクト(クラス)、ビット演算の記号など、問題ごとに定義される書き方には対応していないものがあります。
÷ は普通の割り算で、7 ÷ 2 は3.5です。整数型の変数(や整数型の関数の戻り値)に入れると小数部を切り捨てるので、「整数型: mid ← (1 + 8) ÷ 2」では mid は4になります。余りは mod で求めます。
実行した行が2万を超えると止めて、エラーを表示します。while の条件で使う変数が繰返しの中で変わっているかを確かめてください。
いいえ。プログラムはこのページの中(ブラウザの中)だけで実行され、どこにも送りません。