HOME»基本情報技術者平成27年春期問題»午後問9
基本情報技術者過去問題 平成27年春期 午後問9
⇄問題文と設問を画面2分割で開く⇱問題PDF問9 ソフトウェア開発(C)
次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
[プログラムの説明]
平文(ひらぶん)の文字列を暗号化する手法として,平文の文字を換字(かえじ)表に 従って別の文字に置き換える方法がある。関数 enc_str は,与えられた平文を,換字表を用いて暗号文に変換するプログラムである。
[プログラムの説明]
平文(ひらぶん)の文字列を暗号化する手法として,平文の文字を換字(かえじ)表に 従って別の文字に置き換える方法がある。関数 enc_str は,与えられた平文を,換字表を用いて暗号文に変換するプログラムである。
- 平文は,JIS X 0201(7ビット及び8ビットの情報交換用符号化文字集合)の文字で構成されている。
- 置換の対象となる文字(以下,置換対象文字という)は,英字(A~Z,a~z),数字(0~9),空白文字,"."及び","の65種類の文字であり,換字表に格納されている。
- 換字表は5行13列の2次元文字型配列であり,全ての要素に異なる文字が格納されている
- 換字表による置換の方法について,図1に示す平文と暗号文の対応の例を用いて説明する。平文の文字列の先頭から置換対象文字を2文字ずつ選び出して行い,置換されたそれぞれの文字を暗号文の文字として,暗号文中で平文と同じ位置に入れる。ここで,置換対象文字の組合せによって,置換後の文字の組合せが決まる。置換対象文字数が奇数の場合,最後の置換対象文字については1文字で置換を行う。置換対象文字以外の文字については,平文中の文字をそのまま暗号文中で平文と同じ位置に入れる。
- 関数 enc_str の仕様は次のとおりである。ここで,引数の値に誤りはないものとする。
- 機能:
- 文字列 str を,換字表 xchg_t を用いて平文から暗号文に変換する。
- 引数:
- str 文字列
xchg_t 換字表
設問1
図2の平文と換字表を引数として関数 enc_str を実行したとき,プログラムの動作に関する次の記述中の に入れる正しい答えを,解答群の中から選べ。
- プログラムのαの行が最初に実行されるとき,変数 flg の値は 1,i の値は 0,col の値はa, row の値はbになっている。
- プログラムのβの行が最初に実行されるとき,引数 str,配列cp,rp,pos に格納されている値は,図3に示すとおりである。
- プログラムのβの行が5回目に実行されるとき,pos[1] の値は 9, 引数 str[9] の値はdになっている。
- プログラムのβの行が6回目に実行されるとき,pos[1] の値はeになっている。
a,b に関する解答群
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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] の行位置、列位置が格納されています。
〔a,bについて〕
αの行が最初に実行されるのは、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)」内の処理を開始する時点で、各変数の値は以下のようになっています。str[p-1] と str[p] が異なる文字、かつ、変数 cp[0] と変数 cp[1] が一致している(str[p-1] と str[p] の換字表の列が等しい)ため、以下の処理に分岐します。変数の値を使って演算をすると、str[0] と str[1] には次の文字が格納されます。
∴c=エ:'v'
〔dについて〕
プログラム enc_str は以下のように2文字ずつを組みにして暗号化をしていきます。
∴d=エ:'Z'
〔eについて〕
βの行が6回目に実行されるとき、通常通りであれば str[10] の"f"と str[11] の"("が置換対象文字となります。しかし、"("のように換字表に存在しない文字の場合、換字表のどこにあるかを見つける処理で flg が0のままとなり、「if (flg != 0)」内の処理が行われずに次の文字の処理に移ります。つまり、"("は飛ばされ次の str[12] の"x"が"f"とともに6回目の置換対象文字となります。
したがって pos[1] には、置換対象文字の2文字目である"x"の位置である12が格納されることとなります。∴e=イ:12
〔a,bについて〕
αの行が最初に実行されるのは、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)」内の処理を開始する時点で、各変数の値は以下のようになっています。str[p-1] と str[p] が異なる文字、かつ、変数 cp[0] と変数 cp[1] が一致している(str[p-1] と str[p] の換字表の列が等しい)ため、以下の処理に分岐します。変数の値を使って演算をすると、str[0] と str[1] には次の文字が格納されます。
- str[0]
- 換字表[4][(7+1) % 13] = 換字表[4][8] = "E"
- str[1]
- 換字表[1][7+1 % 13] = 換字表[1][8] = "v"
∴c=エ:'v'
〔dについて〕
プログラム enc_str は以下のように2文字ずつを組みにして暗号化をしていきます。
- 1回目:"F"と"u"
- 2回目:"n"と"c"
- 3回目:"t"と"i"
- 4回目:"o"と"n"
- 5回目:"△"と"△"
- str[8], str[9]
- 換字表[(2+1) % 5][(12+1) % 13] = 換字表[3][0] = "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が格納されることとなります。∴e=イ:12
設問2
図2に示す換字表を使って平文"IPA"を暗号文に変換した結果として正しい答えを,解答群の中から選べ。
解答群
- CVa
- iAP
- iCN
- iNC
- PIa
- VCa
解答選択欄
解答
- カ
解説
平文"IPA"はすべて換字表内に存在する文字です。以下のように変換されます。
まず、"I"と"P"の組みを暗号化します。"I"は換字表[4][4]、"P"は換字表[3][10]で、"I"と"P"は換字表の行も列も異なる位置にあるため、以下の処理に分岐します。
∴カ:VCa
まず、"I"と"P"の組みを暗号化します。"I"は換字表[4][4]、"P"は換字表[3][10]で、"I"と"P"は換字表の行も列も異なる位置にあるため、以下の処理に分岐します。
- str[0]
- 換字表[3][4] = "V"
- str[1]
- 換字表[4][10] = "C"
- str[2]
- 換字表[5-1-4][13-1-12] = 換字表[0][0] = "a"
∴カ:VCa