平成7年度 春期 第二種 午後 問11

                        [更新日]1995.05.22
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 次の問11から問14までの4問については、この中から1問を選択し、答案用紙┃ ┃の選択欄の[選]を黒くマークして解答してください。             ┃ ┃ なお、2問以上選択した場合には、はじめの1問について採点します。     ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
問11 次のCプログラムの説明及びプログラムを読んで設問1〜4に答えよ。 [プログラムの説明] 次のプログラムは、図1のようなレコード様式で格納されている住所録 ファイル (jusho.txt)を扱うものである。 16けた8けた4けた 4けた 4けた 4けた 16けた 8けた  30けた ┌──┬──┬──┬──┬──┬──┬────┬────┬──┬──┐ │名前│関係│暑中│年賀│中元│歳暮│電話番号│郵便番号│住所│\n│ │1 │2 │3 │4 │5 │6 │7   │8   │9 │  │ └──┴──┴──┴──┴──┴──┴────┴────┴──┴──┘ レコードの終端には、改行文字(\n)が付いている。 図1 住所録ファイルのレコード様式 [項目の説明] 2は相手と自分との関係(間柄)を示している。 3は暑中見舞いを送る相手か否かを示しており、送る場合は”暑中”、 送らない場合は””である。 4は年賀状を送る相手か否かを示しており、送る場合は”年賀”、 送らない場合は””である。 5は中元を送る相手か否かを示しており、送る場合は”中元”、 送らない場合は””である。 6は歳暮を送る相手か否かを示しており、送る場合は”歳暮”、 送らない場合は””である。 いずれの項目も文字型で左詰めに格納されている。 また、項目の文字数が規定けた数に満たない場合は、右側を空白文字で埋め ている。 漢字の内部表現は1文字が2バイトであり、漢字コードの前後にシフトイン、 シフトアウトは付かない。構造体は1バイトアラインメントである。 住所録ファイルのレコード例を図2に示す。なお、上部の数字は各項目の 開始位置を示している。  1    17   25 29 33 37  41     57 65 ┌─────────────────────────────────────────────┐ │山田太郎 恩師  暑中年賀中元歳暮03-3591-2222 105東京都港区虎ノ門1ー16ー4    │ ├─────────────────────────────────────────────┤ │佐藤花子 友人    年賀    03-3436-3333 105東京都港区浜松町2ー4ー1     │ ├─────────────────────────────────────────────┤ │本田次郎 取引先 暑中年賀  歳暮06-946-4444 540大阪府大阪市中央区大手町1ー5ー63│ └─────────────────────────────────────────────┘ 図2 住所録ファイルの例 プログラム1は、住所ファイルを読み込み、レコード内の特定の項目に対 する文字列比較によって、条件に合致するレコードを検索するプログラムで ある。 プログラム2は、住所録ファイルを読み込み、あて名リストを編集出力する プログラムである。 [プログラム1] #include < stdio.h > #include < string.h > #define MATCH 1 #define UNMATCH 0 #define KEY1 "年賀" typedef struct{ char name[16],relt[8],mode[4][4],tel[16],zip[8],addr[32]; }ADR; int mdchk(char*, ADR*); main() { FILE *fp; ADR rbuf; char obuf[33]; int count; count = 0; fp = fopen( "jusho.txt" , "r") ; while (fgets( (char*)&rbuf , sizeof(ADR), fp )!= NULL ){ memset(obuf, ' ',sizeof(obuf)); obuf[sizeof(obuf)-1] = '\0'; if(mdchk(KEY1,&rbuf )==MATCH){ count++; strncpy(obuf ,rbuf.name , sizeof(rubf.name)); strncpy(obuf+16,rbuf.tel , sizeof(rubf.tel)); printf(" %s\n",obuf); } } fclose ( fp ); printf("\n*** 条件に合致した人数 = %d名\n",count ); } int mdchk( char *str , ADR *jrec) { int id; for (id = 0 ; id < 4 ; id++) if (strncmp(jrec->mode[id],str,sizeof(jrec->mode[id])) == 0) return MATCH ; return UNMATCH ; } [プログラム2] #include < stdio.h > #include < string.h > typedef struct{ char name[16],relt[8],mode[4][4],tel[16],zip[8],addr[32]; }ADR; #define SIZ 70 ‥‥‥‥‥‥‥‥1 main() { FILE *fp; ADR rbuf; char obuf[3][SIZ]; int wi, eid, wide; fp = fopen( "jusho.txt" , "r") ; wide = sizeof( rbuf.addr ); while( 1 ){ for (wi = 0 ; wi < 3 ;wi++){ memset( &obuf[wi] , ' ',SIZ); obuf[wi][SIZ-1] = '\0'; } for ( eid = 0 ; eid < SIZ / wide ; eid++ ) { if ( fgets ( ( char*)&rbuf , sizeof(ADR) , fp ) == NULL ) { fclose( fp ); return; } strncpy(obuf[0]+eid*wide , rbuf.zip , sizeof(rbuf.zip)); strncpy(obuf[1]+eid*wide , rbuf.addr , sizeof(rbuf.addr)-2); strncpy(obuf[2]+eid*wide , rbuf.name , sizeof(rbuf.name)); strncpy(obuf[2]+eid*wide+sizeof(rbuf.name) , "様" 2)); } printf("\n\n\n");/*空行の出力*/ for ( wi = 0 ; wi < 3 ; wi++)printf("%s\n",obuf[wi]); } } 設問1 住所録ファイルの内容が図2の場合(3名の住所録情報を格納)に、 プログラム1を実行したとき、whileループ脱出後のprintf関数で表 示される条件に合致した人数を解答群の中から選べ。 解答群 ア 0人 イ 1人 ウ 2人 エ 3人 設問2 プログラム2において、あて名リストに載らない項目を解答群の中か ら選べ。 解答群 ア 名前 イ 電話番号 ウ 住所 エ 郵便番号 設問3 プログラム2ではあて名を横に複数個ずつ編集して出力している。 プログラム中の1の#define文の定義を次のように変更すると、 あて名は横に何個まで編集が可能となるか、解答群の中から選べ。         #define SIZ 130 解答群 ア 2個 イ 3個 ウ 4個 エ 8個 設問4 プログラム2には不具合がある。どのような場合にどのような現象に なるか。正しい記述を解答群の中から選べ。 解答群 ア 住所の長さがちょうど30けたの場合に、住所が出力されない。 イ 編集項目のいずれかが空白の場合に、編集位置がずれてくる。 ウ 編集項目のすべてが空白の場合に、編集位置がずれてくる。 エ ファイル内のレコード数が半端な場合に、端数分のあて名が出力さ れない。
戻る 次頁:問12