平成20年 秋期 基本情報技術者 午後 問10
問10 C言語次の C プログラムの説明及びプログラムを読んで,設問1,2に答えよ。 〔プログラムの説明〕 与えられた平文(ひらぶん)を,換字(かえじ)表を用いて暗号文に変換する関数 encrypt_text である。 (1) 関数 encrypt_text の引数は,次のとおりである。ただし,ファイル名に誤りはないものとする。
(2) 平文に含まれるものは,次の 92 種類の文字である。 A 数字 0 〜 9 B 記号 ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~ C 空白文字 (3) 換字表は,平文に含まれる 92 種類の文字を格納した4行 23 列の2次元文字型配列である。 換字表のすべての要素には,異なる文字が格納される。 (4) 換字による暗号化は,次のとおりに行う。ただし,換字表の最下行、(行3)の下には 最上行(行0)が,最右列(列 22 )の右には最左列(列0)があるものとして処理を行う。
A それぞれの文字について,換字表の中の位置(行と列)を求める。 B 2文字が同じ位置にある(同一の文字である)場合 それぞれの文字を,換字表の右下(1行下で1列右)にある文字に置き換える。 換字の例を図1中のBに示す。 C 2文字が同じ行にある場合 それぞれの文字を,換字表の右隣(同じ行の1列右)にある文字に置き換える。 換字の例を図1中のCに示す。 D 2文字が同じ列にある場合 それぞれの文字を,換字表の直下(1行下の同じ列)にある文字に置き換える。 換字の例を図1中のDに示す。 E それぞれの文字を,換字表の同じ行で,他方の文字と同じ列にある文字に置き換える。 換字の例を図1中のEに示す。
図1 換字の例 図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[1] オ sts != EOF カ sts == EOF ウ col[0] != col[1] エ col[0] == col[1] オ row[0] != row[1] カ row[0] == row[1] d に関する解答群 イ 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]
設問2 次の記述中の に入れる正しい答えを, 解答群の中から選べ。 (1) 平文に含まれる文字として改行文字を追加し,換字による暗号化を次のとおりに変更する。 (新しい方法) 平文から改行文字を除いた文を従来の換字規則で暗号化し,平文と同じ位置に 改行文字を挿入したものを暗号文とする。 (2) 図2の換字表を用いた新しい方法での暗号化の例を図3に示す。
図3 新しい方法での暗号化の例 (3) これに対応するために,プログラムを表のとおりに変更する。 表 プログラムの変更内容
ウ 行番号 55 と 56 エ 行番号 56 と 57 オ 行番号 57 と 58
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
| ||||||||||||||||