基本情報技術者過去問題 平成23年秋期 午後問8 解説

問題文は他のサイトを別ウインドウで開いてご覧ください。

設問1

代入文 1 です。
<<
Answer
=One
+Two
+Three
+>>

状態遷移図に照らし合わせます。
開始、
左辺、空白、空白、空白、空白、空白、
代入、変数、空白、空白、
演算、変数、空白、空白、
演算、変数、空白、空白、空白、空白、
演算、err←65 と遷移します。

同じことをすべての代入文で行えば答えは出ますが、もう少し簡単に答えを導き出すこともできます。

代入文 2 は7FFFのFを16進数の数字ではなく、変数として認識します。
「7F」の部分で「定数」の次が「英字」なので51番のerrorがでます。

代入文 3 は演算子が連続しているのがおかしいです。
「++」の部分で「演算」の次が「演算子」なので61番のerrorがでます。

代入文 4 は=の前に計算しているのがおかしいです。
「1+」の部分で「左辺」の次が「演算子」なので24番のerrorがでます。

空欄「a」は「イ」です。
空欄「b」は「ウ」です。

空欄「c」

引数と初期値です。

0 1 2 3 4 5 6 7 8 9 10 11 12 13
S
<< A n s = X 1 + 1 0 * X 2 >>
V
0 2 2 2 10 2 3 11 3 3 12 2 3 1

i next priority
  0 10

ループが終わる条件が V が 1 になることですので、プログラム1は引数を左から順に判定していることがわかります。

判定条件「c」が空欄になっているのでTrueと仮定してみます。

i next priority
  0 10
1 1 2

next には最も優先順位が高い演算子をいれなければならないので、これでは全く駄目です。
ここでは判定は False でなければなりません。

ではいつ True にすればいいでしょうか?
最初に True になるのは V[7] すなわち 11 のときです。

また仮に 11 が何度も出てくるデータだった場合はどうでしょうか?
優先度が同じ「演算子」はより左にあるものを優先しなければなりませんので、 空欄「c」に使う比較演算子は「以上」ではなく「より大きい」でなくてはなりません。

空欄「c」は「ア」です。

i next priority
  0 10
1
2
3
4
5
6
7 7 11
8
9
10 10 12
11
12
13

空欄「d」

プログラム2はループ条件が V[ i ] が 0 になるまでなので、配列の右から検査していることがわかります。 また同じ優先度の演算子はより左にあるものを優先しなければならないので、空欄「d」につかう比較演算子は「以上」でなければなりません。

空欄「d」は「イ」です。

i next priority
  0 11
12
11
10 10 12
9
8
7
6
8
5
4
3
2
1
0

空欄「e」

繰り返しの回数を最小にします。 引数が文法上の誤りがないデータであれば「=」より前には演算子は存在しません。「=」の次の値も演算子ではありません。演算子の可能性があるのは「=」の次の次の値からです。
よって「=」から +2 足した値から検査すればよいことになります。

空欄「e」は「エ」です。

空欄「 f 」

引数の from と move の具体的な数字はないので自分で設定します。

引数と初期値
from to move
6 11 3

空欄「 f 」の判定が True の場合 S[ i ] V[ i ]を S[ i+move ] V[ i+move ] に上書きするのですが、後ろにずらす場合はまだコピーし終わってない数値を書き換えてしまってはまずいので、数列のおしりからコピーをしていきます。

i の初期値は to で 1 を引きながら from まで繰り返せばいいです。

いちおうトレースするとこうなります。(Vは省略します。)

  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
i S
<<           + w k # 1 >>      
11 <<           + w k # 1 >>     >>
10 <<           + w k # 1 >>   1 >>
9 <<           + w k # 1 >> # 1 >>
8 <<           + w k # 1 k # 1 >>
7 <<           + w k # w k # 1 >>
6 <<           + w k + w k # 1 >>

空欄「 f 」は「ウ」です。

空欄「g」

空欄「g」は逆の処理をします。

引数と初期値
from to move
6 11 -3

i の初期値は from で 1 を足しながら to まで繰り返せばいいです。

  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
i S
<<           + w k # 1 >>      
6 <<     +     + w k # 1 >>      
7 <<     + w   + w k # 1 >>      
8 <<     + w k + w k # 1 >>      
9 <<     + w k # w k # 1 >>      
10 <<     + w k # 1 k # 1 >>      
11 <<     + w k # 1 >> # 1 >>      


空欄「g」は「イ」です。


ホームに戻るボタン↓