設問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」は「イ」です。
ホームに戻るボタン↓