基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成27年 春期 基本情報技術者 午後 問09
問09   C言語

 次の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文字で置換を行う。 置換対象文字以外の文字については,平文中の文字をそのまま暗号文中で平文と 同じ位置に入れる。


図1 平文と暗号文の対応の例

(5) 関数 enc_str の仕様は次のとおりである。ここで,引数の値に誤りはないものとする。

機能:文字列 str を,換字表 xchg_t を用いて平文から暗号文に変換する。
引数: str    文字列
    xchg_t  換字表

〔プログラム〕

#define RSIZ  5  /* 換字表の行数 */
#define CSIZ 13  /* 換字表の列数 */

void enc_str(char[], char[RSIZ][CSIZ]);

void enc_str(char str[], char xchg_t[RSIZ][CSIZ]) {
    int cp[2],   /* 置換対象文字の換字表中の列位置 */
        rp[2],   /* 置換対象文字の換字表中の行位置 */
        pos[2],  /* 置換対象文字の文字列中の位置 */
        flg, i = Ø, col, row, p = Ø;

    while (str[p] != '\Ø') {
        flg = Ø;
        for (row = Ø; row < RSIZ; row++) {
            for (col = Ø; col < CSIZ; col++) {
                if (str[p] == xchg_t[row][col]) {
                    flg = 1;
                    break;
                }
            }
            if (flg != Ø) break;
        }
        if (flg != Ø) { 
            cp[i]    = col;
            rp[i]    = row;
            pos[i++] = p;
            if (i == 2) {
                if (str[pos[Ø]] == str[pos[1]]) {
                    str[pos[Ø]] = str[pos[1]] =
                                      xchg_t[(rp[Ø] + 1) % RSIZ]
                                            [(cp[Ø] + 1) % CSIZ];
                } else {
                    if (rp[Ø] == rp[1]) {
                        str[pos[Ø]] = xchg_t[rp[1]][cp[1]];
                        str[pos[1]] = xchg_t[rp[Ø]][cp[Ø]];
                    } else if (cp[Ø] == cp[1]) {
                        str[pos[Ø]] = xchg_t[rp[Ø]]
                                           [(cp[Ø] + 1) % CSIZ];
                        str[pos[1]] = xchg_t[rp[1]]
                                           [(cp[1] + 1) % CSIZ];
                    } else {
                        str[pos[Ø]] = xchg_t[rp[1]][cp[Ø]];
                        str[pos[1]] = xchg_t[rp[Ø]][cp[1]];
                    }
                }
                i = Ø;   
            }
        }
        p++;
    }
    if (i != Ø) {
        str[pos[Ø]] = xchg_t[RSIZ - 1 - rp[Ø]][CSIZ - 1 - cp[Ø]];
    }
}
設問1 図2の平文と換字表を引数として関数 enc_str を実行したとき, プログラムの動作に関する次の記述中の に入れる正しい答えを, 解答群の中から選べ。


図2 平文と換字表の例

(1) プログラムのαの行が最初に実行されるとき,変数 flg の値は 1,i の 値は 0,col の値は , row の値は になっている。

(2) プログラムのβの行が最初に実行されるとき,引数 str,配列 cp, rp, pos に格納されている値は,図3に示すとおりである。


図3 引数 str,配列 cp,rp,pos に格納されている値

(3) プログラムのβの行が5回目に実行されるとき,pos[1] の値は 9, 引数 str[9] の値は になっている。

(4) プログラムのβの行が 6 回目に実行されるとき,pos[1] の値は になっている。

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 ←クリックすると正解が表示されます

基本情報技術者試験


設問2 図2に示す換字表を使って平文“IPA”を暗号文に変換した結果として正しい 答えを,解答群の中から選べ。

解答群

ア CVa        イ iAP        ウ iCN

エ iNC        オ PIa        カ VCa

解答 ←クリックすると正解が表示されます

[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]