基本情報技術者 2015年 春期 午後 問09
次のCプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
平文の文字列を暗号化する手法として、平文の文字を換字表に従って別の文字に置き換える方法がある。関数enc_strは、与えられた平文を、換字表を用いて暗号文に変換するプログラムである。
(1) 平文は、JIS X 0201(7ビット及び8ビットの情報交換用符号化文字集合)の文字で構成されている。
(2) 置換の対象となる文字(以下、置換対象文字という)は、英字(A〜Z、a〜z)、数字(0〜9)、空白文字、“.”及び“,”の65種類の文字であり、換字表に格納されている。
(3) 換字表は5行13列の2次元文字型配列であり、全ての要素に異なる文字が格納されている。
(4) 換字表による置換の方法について、図1に示す平文と暗号文の対応の例を用いて説明する。平文の文字列の先頭から置換対象文字を2文字ずつ選び出して行い、置換されたそれぞれの文字を暗号文の文字として、暗号文中で平文と同じ位置に入れる。ここで、置換対象文字の組合せによって、置換後の文字の組合せが決まる。置換対象文字数が奇数の場合、最後の置換対象文字については1文字で置換を行う。置換対象文字以外の文字については、平文中の文字をそのまま暗号文中で平文と同じ位置に入れる。

(5) 関数enc_strの仕様は次のとおりである。ここで、引数の値に誤りはないものとする。
機能:文字列strを、換字表xchg_tを用いて平文から暗号文に変換する。
引数:str 文字列
xchg_t 換字表

設問1:
問題文を見る 図2の平文と換字表を引数として関数enc_strを実行したとき、プログラムの動作に関する次の記述中のに入れる正しい答えを、解答群の中から選べ。

(1) プログラムのαの行が最初に実行されるとき、変数flgの値は1、iの値は0、colの値はa、rowの値はbになっている。
(2) プログラムのβの行が最初に実行されるとき、引数str、配列cp、rp、posに格納されている値は、図3に示すとおりである。

(3) プログラムのβの行が5回目に実行されるとき、pos[1]の値は9、引数str[9]の値はdになっている。
(4) プログラムのβの行が6回目に実行されるとき、pos[1]の値はeになっている。
a, bに関する解答群
ア:1
イ:2
ウ:3
エ:4
オ:5
カ:6
キ:7
ク:8
ケ:9
コ:10
cに関する解答群
ア:'F'
イ:'S'
ウ:'t'
エ:'v'
オ:'7'
dに関する解答群
ア:'n'
イ:'0'
ウ:'y'
エ:'Z'
オ:空白文字
eに関する解答群
ア:11
イ:12
ウ:13
エ:14
オ:15
模範解答
a:キ、b:エ、c:エ、d:エ、e:イ
解説
解答の導き方
この問題では、文字列の中から換字表にある文字を探し、見つけた文字を2文字ずつ組にして処理します。問題文には「置換対象文字を2文字ずつ選び出して」とあります。ここで大切なのは、組にするのは文字列の隣り合う2文字ではなく、換字表にある文字を見つけた順だということです。
プログラムの変数の役割は、次のとおりです。
- p:文字列のどの位置を調べているかを表します。
- i:現在の組に、置換対象文字が何文字集まったかを表します。
- row、col:換字表の行位置と列位置を表します。
- pos:組にした文字が、文字列のどの位置にあったかを記録します。
換字表を調べるとき、rowとcolはどちらも0から始まります。また、置換対象文字でない文字が見つかった場合は、組を作る文字として数えません。
(1) αの行でのcol、row
文字列の先頭はFです。図2の換字表では、Fは行位置4、列位置7にあります。したがって、αの行が最初に実行されるときはflgが1、iが0、colが7、rowが4です。
aはcolの値なので7、bはrowの値なので4です。解答群では、それぞれキ、エに当たります。
(2) 最初のβの行までの処理
最初に見つかる置換対象文字は、位置0のFです。次に見つかるのは、位置1のuです。換字表で調べると、Fは行位置4・列位置7、uは行位置1・列位置7にあります。記録される値は次のとおりです。
2文字は同じ文字ではありませんが、列位置が同じです。そのため、プログラムの「cp[0] == cp[1]」の分岐に進みます。それぞれの文字を、同じ行の1列右の文字に置き換えます。
- Fは行位置4・列位置7から、行位置4・列位置8のEになります。
- uは行位置1・列位置7から、行位置1・列位置8のvになります。
このため、str[1]の値はvです。選択肢ではエに当たります。
(3) 5回目のβでのstr[9]
置換対象文字が見つかった位置を、2文字ずつ順に並べます。空白文字も換字表にあるので、置換対象文字として数えます。一方、括弧の「(」は換字表にないため、数えません。
5回目の組は、位置8と位置9にある同じ空白文字です。同じ文字が2つの場合、プログラムは換字表の行位置と列位置をそれぞれ1つ進めた場所の文字に置き換えます。
図2では、空白文字は行位置2・列位置12にあります。行位置は「2に1を加え、行数5で割った余り」なので3です。列位置は「12に1を加え、列数13で割った余り」なので0です。換字表の行位置3・列位置0にある文字はZです。
位置8と位置9の空白文字はどちらもZに置き換わるため、str[9]の値はZです。選択肢ではエに当たります。
(4) 6回目のβでのpos[1]
5回目の組の後に、次の組を作ります。位置10のfは置換対象文字なので、組の1文字目として記録されます。その次の位置11にある「(」は置換対象文字ではないため、組には加わりません。続く位置12のxが組の2文字目になります。
したがって、6回目のβの行では、2文字目の位置を記録したpos[1]は12です。選択肢ではイに当たります。
誤りやすいポイント
- rowは行位置、colは列位置です。変数名と図の縦横の位置を反対にしないようにします。
- 位置は0から数えます。文字列の先頭にあるFの位置は0です。
- 置換対象文字を2文字ずつ組にします。括弧のような対象外の文字が間にあっても、次に見つけた置換対象文字が同じ組に入ります。
- 空白文字は置換対象文字です。空白を読み飛ばすものとして扱うと、5回目と6回目の組を誤ります。
- βの回数は、文字列中の位置ではなく、2文字の組を処理した回数です。
FAQ
Q: 位置11の「(」は、なぜ組の文字数に入りませんか?
A: 換字表にない文字だからです。プログラムは換字表に見つかった文字だけを組に加えます。そのため、位置11を通過してもiの値は変わりません。
A: 換字表にない文字だからです。プログラムは換字表に見つかった文字だけを組に加えます。そのため、位置11を通過してもiの値は変わりません。
Q: 空白文字が置換対象だと分かるのはなぜですか?
A: 問題文で置換対象文字に空白文字が含まれ、図2の換字表にも空白文字が示されているためです。
A: 問題文で置換対象文字に空白文字が含まれ、図2の換字表にも空白文字が示されているためです。
Q: 「%」はどのような計算ですか?
A: 割り算の余りを求める計算です。たとえば列位置12の次は、13で割った余りが0になるので、列位置0に戻ります。
A: 割り算の余りを求める計算です。たとえば列位置12の次は、13で割った余りが0になるので、列位置0に戻ります。
関連キーワード: 文字列処理、二次元配列、配列添字、文字置換、剰余演算
設問2:
問題文を見る 図2に示す換字表を使って平文“IPA”を暗号文に変換した結果として正しい答えを、解答群の中から選べ。
解答群
ア:CVa
イ:iAP
ウ:iCN
エ:iNC
オ:PIa
カ:VCa
模範解答
カ
解説
解答の導き方
平文の「IPA」を、図2の換字表とプログラムの処理に沿って、左から順に見ていきます。
問題文には、置換対象文字を「2文字ずつ選び出して」置換するとあります。「I」「P」「A」はいずれも置換対象文字なので、まず「I」と「P」が組になり、最後に残る「A」は1文字で置換されます。
たとえば「I」は、図2の行4を左から見ると「M」「L」「K」「J」「I」の順に並んでいるため、行4・列4です。「P」は行3・列10にあります。
プログラムは、「I」と「P」の行位置や列位置を比べています。2文字は別の文字であり、行位置も列位置も異なります。そのため、最後の条件に進みます。
この条件では、2文字がある位置を対角に結んだ長方形の、残りの角にある文字へ置き換えます。プログラムの式に当てはめると、次のとおりです。
- 先頭の文字は、行3・列4の文字に置き換えられます。図2では「V」です。
- 2文字目は、行4・列10の文字に置き換えられます。図2では「C」です。
ここまでで、先頭の2文字は「VC」になります。
次に、最後の「A」を処理します。1文字だけ残った場合、プログラムはその文字の行位置と列位置を、それぞれ換字表の反対側から数えた位置にします。「A」は行4・列12なので、計算は次のとおりです。
- 行位置:
- 列位置:
図2の行0・列0にある文字は「a」です。したがって、「A」は「a」に置き換わり、暗号文は「VCa」になります。解答群では「カ」です。
誤りやすいポイント
- 文字の位置と換字表の位置を混同しないようにします。文字列中の位置は0、1、2ですが、換字表の行位置・列位置は図2の座標です。
- 「I」と「P」は同じ行でも同じ列でもありません。したがって、同じ行や同じ列の場合の処理ではなく、別の行・別の列の場合の処理を使います。
- 3文字目の「A」は、先の2文字と組にして処理するのではありません。2文字の置換後に1文字だけ残るため、最後の1文字用の式で置き換えます。
- 最後の「A」は「A」のままではなく、小文字の「a」に置き換わります。大文字と小文字も換字表上の別の文字です。
FAQ
Q: 「I」と「P」を置き換えるとき、文字を単純に入れ替えるのではないのですか?
A: いいえ。プログラムは、2文字の行位置・列位置を使って置換後の文字を決めます。この場合は行位置も列位置も異なるため、長方形の残りの角にある「V」と「C」に置き換えます。
A: いいえ。プログラムは、2文字の行位置・列位置を使って置換後の文字を決めます。この場合は行位置も列位置も異なるため、長方形の残りの角にある「V」と「C」に置き換えます。
Q: なぜ最後の「A」だけ別の式で置き換えるのですか?
A: 置換対象文字を2文字ずつ処理した後、1文字だけ残る場合があるためです。問題文では、置換対象文字数が奇数の場合、最後の1文字は1文字で置換すると説明されています。
A: 置換対象文字を2文字ずつ処理した後、1文字だけ残る場合があるためです。問題文では、置換対象文字数が奇数の場合、最後の1文字は1文字で置換すると説明されています。
Q: 最後の「A」が小文字の「a」になるのはなぜですか?
A: 「A」は換字表の行4・列12にあります。最後の1文字用の計算で行0・列0が選ばれ、そこにある「a」に置き換わるためです。
A: 「A」は換字表の行4・列12にあります。最後の1文字用の計算で行0・列0が選ばれ、そこにある「a」に置き換わるためです。
関連キーワード: 換字表、文字置換、二次元配列、配列添字、条件分岐



