基本情報技術者過去問題 平成25年秋期 午後問8 設問1

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

引数を設定する。

設問2の文字列を引数に使います。

引数
Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
NULL NULL

初期値を設定します。

表1
P
index
C
index
MF MD Distance Fitnum
0 0

なお Esym は 文字"$" です。

最初のループ

最初のループで文字列の最初の4文字をコピーします。

Compresseddata[0] に Plaindata[0] をいれます。
Cindex を +1 します。
Pindex を +1 します。

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1

ループして Pindex が 1 なので
Compresseddata[1] に Plaindata[1] をいれます。
Cindex を +1 します。
Pindex を +1 します。

ループして Pindex が 2 なので
Compresseddata[2] に Plaindata[2] をいれます。
Cindex を +1 します。
Pindex を +1 します。

ループして Pindex が 3 なので
Compresseddata[3] に Plaindata[3] をいれます。
Cindex を +1 します。
Pindex を +1 します。

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4

Pindex が 4 になったのでループを抜けます。

メインループの1回目

Maxfitnumに -1 をいれます。
Maxdistanceに -1 をいれます。
Distanceに 4 をいれます。


P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4

内側のループにはいる条件、空欄「a」が未定ですが、先を見てみないとわからないので True だったと仮定して処理を続けます。

Fitnumに0をいれます。

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 0

Fitnum < Distance かつ
(Pindex + Fitnum) < Plength すなわち 24
なのでさらに内側のループにはいります。

Plaindata[Pindex + Fitnum]が
空欄[b]と等しくなかったら、何もせずにループを break、
空欄[b]と等しかったら、Fitnum に +1 してループします。

この処理では Pindex の5番目の文字と1番目の文字が異なるかどうかを判定しています。
True なのでループをbreakして次にすすみます。

次の判定処理では同じ文字並びの文字数が4以上、かつ、最も多いかどうかを調べていますが、 Falseなので何もせずに次にすすみます。

そして空欄「c」の処理を行いループの先頭に戻るのですが、ループする前に何をしなければならないでしょうか?
ここでは比較文字の位置をひとつ左にずらさなければなりませんので空欄「c」は「イ」です。

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0

比較文字を左にひとつずらしたのですが、文字列の先頭を越えて文字がなくなってしまいました。
このループの継続条件は、ひとつは「Distance が 26 以下であること」で、もうひとつは「比較文字位置が文字列の先頭を越えないこと」だったのです。
よって空欄「a」の答えは「ア」になります。

判定はFalseなのでようやく内側のループを抜けて次の選択処理をします。 Maxfitnum は -1 なので True です。 Compresseddata[4] に Plaindata[4] をいれます。
Cindex を +1 します。
Pindex を +1 します。

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5

これで外側のループの1回目が終了しました。

メインループの2回目


Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6

メインループの3回目


Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F G NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7

メインループの4回目

ここでようやく文字が一致します。

内側のループにはいり、ループしながら Distance を 1 づつ増やしていき Distance が 7 になったところで文字が一致します。

Plaindata[Pindex + Fitnum] と 空欄「b」 すなわち
Plaindata[7 + 0]の文字「A」と、文字列の先頭の文字「A」が同じなので Fitnum を +1 してループします。
今度は Plaindata[Pindex + Fitnum] が Plaindata[7 + 1] になりますので、
Plaindata[7 + 1] の文字「B」と、文字列の2文字目「B」を比べなければなりません。

よって空欄「b」は「エ」のPlaindata[Pindex - Distance + Fitnum]です。

さらに文字が一致しなくなるまで処理はループします。
Fitnum を +1
Plaindata[7+2] 、 Plaindata[7-7+2] ともに「C」
Fitnum を +1
Plaindata[7+3] 、 Plaindata[7-7+3] ともに「D」
Fitnum を +1
Plaindata[7+4] 、 Plaindata[7-7+4] ともに「E」
Fitnum を +1
Plaindata[7+5] 、 Plaindata[7-7+4] は「A」と「F」
文字が一致しなくなりましたのでループをbreakします。

Fitnumは5になりました。

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 -1 4 5 6 7 1 2 3 4 5

次の条件式も Fitnum が 5 になったことではじめてTrueになり処理を行います。
Maxfitnum に 5 をいれます。
Maxdistance に 7 をいれます。

Distance を +1 します。

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 5 -1 7 4 5 6 7 8 1 2 3 4 5

次の条件式も Maxfitnum が 5 になったことではじめてFalseとなり、下の処理を行います。
Comresseddata[7] に "$"をいれます。
Comresseddata[8] に IntToAlphabet(7) をいれます。(アルファベットの7文字目が返ってくるので「G」)
Comresseddata[9] に IntToAlphabet(5) をいれます。(アルファベットの5文字目が返ってくるので「E」)
Cindexを +3 します。
Pindexを +5 しなければならないので空欄「d」は「エ」です。

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F G $ G E NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 5 -1 7 4 5 6 7 8 1 2 3 4 5
12 10

これでプログラム「Compress」に関する空欄は全部埋まりましたが処理を続けます。

メインループの5回目

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F G $ G E
$ E D
NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 5 -1 7 4 5 6 7 8 1 2 3 4 5
12 10 -1 4 -1 5 4 5 6 7 8 9 10 11 12 13 1 2 3 4
16 13

メインループの6回目

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F G $ G E
$ E D F
NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 5 -1 7 4 5 6 7 8 1 2 3 4 5
12 10 -1 4 -1 5 4 5 6 7 8 9 10 11 12 13 1 2 3 4
16 13 -1 -1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0
17 14

メインループの7回目

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-x] C
length
A B C D E F G $ G E
$ E D F $ M G
NULL

P
index
C
index
MF MD Distance Fitnum
0 0
1 1
2 2
3 3
4 4 -1 -1 4 5 0
5 5 -1 -1 4 5 6 0
6 6 -1 -1 4 5 6 7 0
7 7 -1 5 -1 7 4 5 6 7 8 1 2 3 4 5
12 10 -1 4 -1 5 4 5 6 7 8 9 10 11 12 13 1 2 3 4
16 13 -1 -1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0
17 14 -1 7 -1 13 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7
24 17

ループを抜けて最後に Clength に Cindex をいれて処理を終了します。

Plaindata[0-23] P
length
A B C D E F G A B C D E
A B C D F E F G A B C D
24
Compressdata[0-16] C
length
A B C D E F G $ G E
$ E D F $ M G
17


ホームに戻るボタン↓