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

平成20年 秋期 基本情報技術者 午後 問10
問10   C言語

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

〔プログラムの説明〕

 与えられた平文(ひらぶん)を,換字(かえじ)表を用いて暗号文に変換する関数 encrypt_text である。

(1) 関数 encrypt_text の引数は,次のとおりである。ただし,ファイル名に誤りはないものとする。

 in_filename   平文が格納されているファイル名
 out_filename   暗号文を格納するファイル名
 ctbl       換字表

(2) 平文に含まれるものは,次の 92 種類の文字である。

@ 英字 A 〜 Z,a 〜 z

A 数字 0 〜 9

B 記号 ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

C 空白文字

(3) 換字表は,平文に含まれる 92 種類の文字を格納した4行 23 列の2次元文字型配列である。 換字表のすべての要素には,異なる文字が格納される。

(4) 換字による暗号化は,次のとおりに行う。ただし,換字表の最下行、(行3)の下には 最上行(行0)が,最右列(列 22 )の右には最左列(列0)があるものとして処理を行う。

@ 平文の先頭から2文字ずつを取り出し,A〜Eの処理を行う。平文の文字数が奇数の場合は, 最後の1文字について,後ろに空白文字1文字を追加して2文字にして処理を行う。

A それぞれの文字について,換字表の中の位置(行と列)を求める。

B 2文字が同じ位置にある(同一の文字である)場合

 それぞれの文字を,換字表の右下(1行下で1列右)にある文字に置き換える。 換字の例を図1中のBに示す。

C 2文字が同じ行にある場合

 それぞれの文字を,換字表の右隣(同じ行の1列右)にある文字に置き換える。 換字の例を図1中のCに示す。

D 2文字が同じ列にある場合

 それぞれの文字を,換字表の直下(1行下の同じ列)にある文字に置き換える。 換字の例を図1中のDに示す。

E それぞれの文字を,換字表の同じ行で,他方の文字と同じ列にある文字に置き換える。 換字の例を図1中のEに示す。

      図1 換字の例

(5) 換字表を用いた暗号化の例を図2に示す。

      図2 換字表を用いた暗号化の例

〔プログラム〕

(行番号)

 1 #include <stdio.h>
 2
 3 #define ROWS   4   /* 換字表の行数 */
 4 #define COLS   23  /* 換字表の列数 */
 5
 6 void encrypt_text(const char *, const char *,
 7                   const char[ROWS][COLS]);
 8
 9 void encrypt_text(const char *in_filename,
10                   const char *out_filename,
11                   const char ctbl[ROWS][COLS]){
12    FILE *ifp, *ofp;
13    char ch[2];
14    int col[2], row[2], flg, i, sts;
15
16    ifp = fopen(in_filename, "r");
17    ofp = fopen(out_filename, "w");
18    do {
19        sts = fgetc(ifp);
20        if(sts != EOF){
21           ch[0] = sts;
22           sts = fgetc(ifp);
23           if (  ){   /* 文字数が奇数の場合 */
24               ch[1] = ' ';
25           }else{
26               ch[1] = sts;
27           }
28           for(i = 0; i < 2; i++){
29              flg = 0;
30              for(row[i] = 0; row[i] < ROWS; row[i]++){
31                 for(col[i] = 0; col[i] < COLS; col[i]++){
32                    if(ch[i] == ctbl[row[i]][col[i]]){
33                       flg = 1;
34                       break;
35                    }
36                 }
37                 if(flg != 0) break;
38              }
39           }
40           if(  ){
41              if(  ){      /* 2文字が同一の場合 */
42                 ch[0] = ch[1] =  ;
43              }else{            /* 2文字が同じ行にある場合 */
44                 ch[0] = ctbl[row[0]][(col[0]+1) % COLS];
45                 ch[1] = ctbl[row[1]][(col[1]+1) % COLS];
46              }
47           }else if(  ) {  /* 2文字が同じ列にある場合 */
48              ch[0] = ctbl[(row[0]+1) % ROWS][col[0]];
49              ch[1] = ctbl[(row[1]+1) % ROWS][col[1]];
50           }else{
51              ch[0] = ctbl[row[0]][col[1]];
52              ch[1] = ctbl[row[1]][col[0]];
53           }
54           fputc(ch[0], ofp);
55           fputc(ch[1], ofp);
56        }
57    }while(sts != EOF);
58    fclose(ifp);
59    fclose(ofp);
60 }

設問1 プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア ch[0] != ' '     イ ch[0] != ch[1]     ウ ch[0] == ' '

エ ch[0] == ch[1]    オ sts != EOF       カ sts == EOF

b,c に関する解答群 ア ch[0] != ch[1]     イ ch[0] == ch[1]

ウ col[0] != col[1]    エ col[0] == col[1]

オ row[0] != row[1]    カ row[0] == row[1]

d に関する解答群

ア ctbl[(col[0]+1) % ROWS][(row[0]+1) % COLS]

イ ctbl[col[0]+1][row[0]+1]

ウ ctbl[col[0]][row[0]]

エ ctbl[(row[0]+1) % ROWS][(col[0]+1) % COLS]

オ ctbl[row[0]+1][col[0]+1]

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

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

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

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

基本情報技術者試験


設問2 次の記述中の に入れる正しい答えを, 解答群の中から選べ。

(1) 平文に含まれる文字として改行文字を追加し,換字による暗号化を次のとおりに変更する。

(新しい方法)

 平文から改行文字を除いた文を従来の換字規則で暗号化し,平文と同じ位置に 改行文字を挿入したものを暗号文とする。

(2) 図2の換字表を用いた新しい方法での暗号化の例を図3に示す。

      図3 新しい方法での暗号化の例

(3) これに対応するために,プログラムを表のとおりに変更する。

      表 プログラムの変更内容

     処置       変更内容              
 行番号 14 と 15 の間
 に追加
  int cnt2; 
 行番号 19 を変更
sts = fgetc(ifp);
while((char)sts == '\n') {
   fputc('\n', ofp);
   sts = fgetc(ifp);
}
 行番号 22 を変更
cnt2 = 0;
sts = fgetc(ifp);
while((char)sts == '\n'){
   cnt2++;
   sts = fgetc(ifp);
}
  の間
 に追加
for( ; cnt2 > 0; cnt2--){
   fputc('\n', ofp);
}

解答群 ア 行番号 53 と 54     イ 行番号 54 と 55

ウ 行番号 55 と 56     エ 行番号 56 と 57

オ 行番号 57 と 58

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


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