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

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

引数を用意します。

表3から引数を作ります。
配列の添え字は0から始まったり1から始まったりプログラムによってまちまちです。
Pattern[ ] のデータ数は8個ですから0から始まる場合は0から7、1から始まる場合は1から8になりますが、 このプログラムの場合は0から始まると問題文にありますので、 引数を整理するときに混乱しないように表に書いておきます。

Pattern
[0-7]
* #
Value
[0-5]
00000+



メインプログラム

ではプログラムを見ていきます。
fill文字は Pattern[0] です。
signif は初期設定ではoffにします。
v の初期値は 0 です。

ループは Pattern[ ] の文字数回繰り返します。
Pattern[ ] が□または■だった場合、
ケース1~7のいずれかの処理をした後、v を +1 します。

その他の文字だった場合、
signif が off だったときはfill文字に書き換え(ケース8)、
signif が on だったときはそのまま何もしないでおきます(ケース9)。
このとき v に変化はありません。

以上のことから、表には処理結果と v 及び signif がどう変化しているかをメモっていきます。

ループ1回目の結果は以下になります。

Pattern
[0-7]
* #
Value
[0-5]
00000+
ケース 8
結果 *
v 0
signif off

あとはどんどんやるだけです。
v が変わったり変わらなかったり、signif が変わったり変わらなかったり、Pattern[ ] を書き換えたり書き換えなかったりですから、どれかを記憶を頼りにやってしまうのは大変危険です。
でも表さえ作ってしまえば案外簡単ですよね。

Pattern
[0-7]
* #
Value
[0-5]
00000+
ケース 8 1 1 8 1 1 1 8
結果 * * * * * * * *
v 0 1 2 2 3 4 5 5
signif off off off off off off off off

空欄 b , c

空欄 b

Pattern
[0-7]
* #
Value
[0-5]
00012-
ケース 8 1 1 1 8 4 6 9
結果 * * * * * 1 2 #
v 0 1 2 3 3 4 5 5
signif off off off off off on on on

空欄 c

Pattern
[0-7]
* #
Value
[0-5]
00012+
ケース 8 1 1 2 9 6 7 8
結果 * * * * 1 2 *
v 0 1 2 3 3 4 5 5
signif off off off on on on off off


設問2

設問2は表を作る必要はありません。読むだけで解けます。

最初の条件分岐は signif が off かどうかなので、上の処理はケース1から5、下の処理はケース6から7に当てはまります。

各処理は2つに別れます。

上の処理のひとつめの処理は、signif を on にするかを判定しています。
まず Pattern[p] が□、かつ Value[v] が 0 のときは、Value[v+1]がどんな内容であろうと signif は off のまま(ケース1)。
上記の判定にもれ、 Value[v+1] が記号「+」じゃなければ signif を on にします(ケース2と4の場合)。
そして、どちらの判定にもれた場合は何もしません。すなわち signif は、やはりそのままになります。(ケース3と5の場合)。

上の処理のふたつめの処理は、fill文字をいれるか Value[v] をいれるかを判定しています。
fill文字をいれるのは Value[ ] が 0 のとき(ケース1と2と3の場合)なので、空欄dは Value[v]="0" です。
Value が 1 から 9 のとき(ケース4と5の場合)は Pattern[ ] を Value[ ] で上書きします。

下の処理のひとつめの処理は signif を off に戻すかを判定しています。
signif を off にするのはケース7の場合なので、空欄eは Value[v+1]="+" です。

下の処理のふたつめの処理はケース6、7、どちらであろうとも Pattern[ ] を Value[ ] で上書きします。

設問3

日本語が大変難しい設問3ですが、
「数値の後に続く文字を fill文字で置き換えるケース」はケース 8 です。
「数値の後に続く文字を fill文字で置き換えるために用意されたケース」はケース8の処理を使うために事前に使うケース、ということになりますから signif を off に変更するケース、すなわち 1、3、5、7 となります。
ただし求められているのは、
数値が正なら数値の後に続く文字を fill文字で置き換えるために用意されたケース」です。
ケース 1 は解答群の中にないので除外します。
ケース 7 は設問1の空欄 c において使用しているのでトレースで実証済みです。
問題はケース 3 と 5 なんです。

自分で引数を用意する

ここまでのトレースではケース 3 と 5 の処理を通っていません。
設問に適切な引数がないときはテストデータを自分で作らなければならないのですが、ここで問題が発生します。

問題文には「関数 Edit が呼び出されるとき、各引数には正しい値が設定されているものとする。」とありますが、 何をもって「正しい値」とするかについては何ら制約が説明されていないのです。
仕方がないので制約を想像して作るしかありませんので、プログラムを完璧に把握することは諦め、おおざっぱに引数を作ります。(そうするよりないのです。)

まず、ケース 5 を通る Value [ ] を考えます。
ケース 7 との違いは事前に signif が on になっていないということです。
ループしている間に 0 以外の数字があると signif が on になってしまうのでケース 5 に通すための数値は 桁数を問わない「 1 から 9 」です。例えば「0001+」「000003+」「5+」などです。

次に、ケース3を使用する Value [ ] を考えます。
ケース5との違いを考えると、 桁数を問わない「 0 」です。例えば「000+」「000000+」「0+」などです。
しかもわざわざ Pattern [ ] に■を使って無理やり通します。
ケース3の存在意義は全くわからないのですが、引数の制約が判明しない以上仕方がありません。
Pattern [ ] に□■以外の文字を使えば、記号、数字が入り混じった奇怪なデータを通すこともできますが、 試験中にそんなことを考慮する時間はないのですべて無視します。
プログラム全体の仕様がわからない場合は、とりあえず無難なテストデータを1本だけ無理やり通すのです。
そうすればプログラムの動きだけは把握できます。(そうするよりありませんので。)

トレースの仕方としては以上となります。
設問ですが「数値が正なら」とありますのでケース 3 は当てはまりません。
エの 5 及び 7 となります。

設問3を試験時間内に確信を持って回答できる人はいないと思います。
解けなかったとしても気にする必要はありません。
問題文からプログラムの全体像が把握できるように作問されていないので、誰もが釈然としないのです。
問われているのはあくまでアルゴリズムの解析力があるかどうかなので、こういったプログラムの利用価値や利用方法をわざと曖昧にして問題を難しくする設問もあり得るということなのでしょう。
基本情報とは言っても国家資格ですのでこのぐらいのことは致し方ないかと思われます。
(合格点は60点です。完璧である必要は全くありません。)

ホームに戻るボタン↓