基本情報23年 特別 午後 問8

(注意:6月に行われた「特別試験」のものです。先日10月に行われた秋試験では”ありません”)
先々週、問7をやっているので、今回は問8

【問題を解く前に】
言語系の問題は、基本的には、プログラムを解析することなんだけど、
情報処理試験にだけ使えるテクニックとして

 プログラムはただしいとして(=バグがないとして)考えると、
 こうならないとおかしいはず!というふうに「推測する」

というのがあります。今回、それを使います

【解き方】

aについて
 選択肢をみると、for文内で、
 NEXTの前にDumpがあるかないかで分かれる

 Initが成立したら、NextをやるまえにDumpしないと、Initの情報が消えるので、
 前にあるのが正解。ここで、イはない。ウは、Rが-1で印刷しちゃいけないときも
 印刷しようとするので、ウもない。

 アかエか?

 これは、始めのinitのRが-1の場合(印刷してはいけない場合)を考えるとわかる。
 そのとき、印刷してはいけない。エは印刷してしまうので、これもない。
 答えはア

bについて
37ページのNext(3つめの関数)の中、Lが1、L+1が0のとき、処理してる
ということは、1,0ときたとき。
あたまらかやっているので、見つかった最初でやっている

cについて
現在地がLで、L−1に対してやっているので、
「より前」に対してやっている

dについて
 はじめの1,0(L=1)でひっかかり、このとき
  S[l]=1
  S[l+1]=0
 つまり。1、0を0,1にするので、
 0,1,101

eについて
 まず、聞いているのはNextの関数の中の
  Init(s,L−1,C)
 において、L−1を聞いている。

 nextのはじめでL=1といれているので、
 最小値のとき、この式はfor文で成り立つから、INITを実行する。
 ここで、L−1をもとめているので1−1=0で、最小値は0

 最大値は、L<NでN=5だから、Lの最大値は4、
 InitのところでL−1になるので、ここでの第二引数は4−1=3となる

 だから、0から3

fについて
 はじめに0をいれて、for文は成立するのだから、そのままInitにいく。
 このときC=0,これが最小のはず(Cは足しているのでC=0より小さくなれない)

 最大を考える。ここでCは、1を書く個数。
 この問題が成立するには、全体で3以下。しかし、Initのまえ、s[l+1]で1こ1を使ってる
 と書いてあるのでCは3−1=2こでいい

 だから0から2

gについて

はじめのInitで11100になる。
終わりは、これと真逆になっているはず。なので00111

【答え】
a ア
b エ
c エ
d ア
e イ
f ア
g イ