平成27年春期試験午後問題 問9

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】

問9 ソフトウェア開発(C)

次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

[プログラムの説明]
 平文(ひらぶん)の文字列を暗号化する手法として,平文の文字を換字(かえじ)表に 従って別の文字に置き換える方法がある。関数 enc_str は,与えられた平文を,換字表を用いて暗号文に変換するプログラムである。
  • 平文は,JIS X 0201(7ビット及び8ビットの情報交換用符号化文字集合)の文字で構成されている。
  • 置換の対象となる文字(以下,置換対象文字という)は,英字(A~Z,a~z),数字(0~9),空白文字,"."及び","の65種類の文字であり,換字表に格納されている。
  • 換字表は5行13列の2次元文字型配列であり,全ての要素に異なる文字が格納されている
  • 換字表による置換の方法について,図1に示す平文と暗号文の対応の例を用いて説明する。平文の文字列の先頭から置換対象文字を2文字ずつ選び出して行い,置換されたそれぞれの文字を暗号文の文字として,暗号文中で平文と同じ位置に入れる。ここで,置換対象文字の組合せによって,置換後の文字の組合せが決まる。置換対象文字数が奇数の場合,最後の置換対象文字については1文字で置換を行う。置換対象文字以外の文字については,平文中の文字をそのまま暗号文中で平文と同じ位置に入れる。
    pm09_1.png
  • 関数 enc_str の仕様は次のとおりである。ここで,引数の値に誤りはないものとする。
    機能:
    文字列 str を,換字表 xchg_t を用いて平文から暗号文に変換する。
    引数:
    str   文字列
    xchg_t 換字表
pm09_2.png

設問1

図2の平文と換字表を引数として関数 enc_str を実行したとき,プログラムの動作に関する次の記述中の に入れる正しい答えを,解答群の中から選べ。
pm09_3.png
  • プログラムのαの行が最初に実行されるとき,変数 flg の値は 1,i の値は 0,col の値はa, row の値はbになっている。
  • プログラムのβの行が最初に実行されるとき,引数 str,配列cp,rp,pos に格納されている値は,図3に示すとおりである。
    pm09_4.png
  • プログラムのβの行が5回目に実行されるとき,pos[1] の値は 9, 引数 str[9] の値はdになっている。
  • プログラムのβの行が6回目に実行されるとき,pos[1] の値はeになっている。
a,b に関する解答群
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 10
c に関する解答群
  • 'F'
  • 'S'
  • 't'
  • 'v'
  • '7'
d に関する解答群
  • 'n'
  • 'O'
  • 'y'
  • 'Z'
  • 空白文字
e に関する解答群
  • 11
  • 12
  • 13
  • 14
  • 15
解答選択欄
  • a:
  • b:
  • c:
  • d:
  • e:
  • a=
  • b=
  • c=
  • d=
  • e=

解説

プログラム enc_str では引数で与えられた平文を先頭から1文字ずつ走査し、文字列の暗号化を行うプログラムです。whileループの入れ子になったforループでは、平文内のの現在の文字(str[p])が換字表のどこにあるかを探索しています。換字表の中に存在すれば、flg を1にしてループから抜けています。このとき、変数 row と col には換字表における str[p] の行位置、列位置が格納されています。

abについて〕
αの行が最初に実行されるのは、while文の1回目のループ処理です。変数 p の初期値は0なので、row と col には、換字表における文字 str[0](="F")の探索結果が格納されています。"F"は換字表の行位置4、列位置7にあるので、col の値は7、row の値は4になっています。

a=キ:7
 b=エ:4

cについて〕
βの行が最初に実行されるのは i が2のとき、すなわち平文の2文字目に当たる"u"を処理するときになります。1文字目の"F"は行位置4・列位置7、2文字目の"u"は行位置1・列位置7ですから、「if (i == 2)」内の処理を開始する時点で、各変数の値は以下のようになっています。
pm09_5.png
str[p-1] と str[p] が異なる文字、かつ、変数 cp[0] と変数 cp[1] が一致している(str[p-1] と str[p] の換字表の列が等しい)ため、以下の処理に分岐します。
pm09_6.png
変数の値を使って演算をすると、str[0] と str[1] には次の文字が格納されます。
str[0]
換字表[4][(7+1) % 13] = 換字表[4][8] = "E"
str[1]
換字表[1][7+1 % 13] = 換字表[1][8] = "v"
よって、βの行が最初に実行されるとき str[1] には"v"が格納されています。

c=エ:'v'

dについて〕
プログラム enc_str は以下のように2文字ずつを組みにして暗号化をしていきます。
  • 1回目:"F"と"u"
  • 2回目:"n"と"c"
  • 3回目:"t"と"i"
  • 4回目:"o"と"n"
  • 5回目:"△"と"△"
str[9] と組になるのは8文字目の str[8] です。str[8] と str[9] はともに'△'なので、以下の処理に分岐します。
pm09_7.png
"△"は換字表の行位置2・列位置12にあるので、str[8] と str[9] には以下の式で求められる同じ文字が格納されます。
str[8], str[9]
換字表[(2+1) % 5][(12+1) % 13] = 換字表[3][0] = "Z"
したがってβの行が5回目に実行されるとき、str[9] の値は"Z"になっています。

d=エ:'Z'

eについて〕
βの行が6回目に実行されるとき、通常通りであれば str[10] の"f"と str[11] の"("が置換対象文字となります。しかし、"("のように換字表に存在しない文字の場合、換字表のどこにあるかを見つける処理で flg が0のままとなり、「if (flg != 0)」内の処理が行われずに次の文字の処理に移ります。つまり、"("は飛ばされ次の str[12] の"x"が"f"とともに6回目の置換対象文字となります。

したがって pos[1] には、置換対象文字の2文字目である"x"の位置である12が格納されることとなります。
pm09_8.png
e=イ:12

設問2

図2に示す換字表を使って平文"IPA"を暗号文に変換した結果として正しい答えを,解答群の中から選べ。
解答群
  • CVa
  • iAP
  • iCN
  • iNC
  • PIa
  • VCa
解答選択欄
  •  
  •  

解説

平文"IPA"はすべて換字表内に存在する文字です。以下のように変換されます。

まず、"I"と"P"の組みを暗号化します。"I"は換字表[4][4]、"P"は換字表[3][10]で、"I"と"P"は換字表の行も列も異なる位置にあるため、以下の処理に分岐します。
pm09_9.png
str[0]
換字表[3][4] = "V"
str[1]
換字表[4][10] = "C"
この時点で消去法で「カ」が正しいとわかりますが、一応最後まで変換していきます。最後の文字"A"は、組となる文字がないので i=1 でwhileループを抜けることになり、プログラムの最後に記述された以下の部分の処理対象となります。
pm09_10.png
"A"は換字表[4][12]なので、
str[2]
換字表[5-1-4][13-1-12] = 換字表[0][0] = "a"
以上より、平文"IPA"は暗号文"VCa"に変換されます。

∴カ:VCa

Pagetop