BohYoh.comロゴ
情報処理技術者試験対策講座
第2種情報処理技術者試験 平成7年春 午後 問7

 次のCプログラムの説明及びプログラムを読んで、設問に答えよ。
〔プログラムの説明〕
 次のプログラムは、図1のようなレコード様式で格納されている住所録ファイル(jusho.txt)を扱うためのものである。

16けた8けた4けた4けた4けた4けた16けた8けた30けた
名前
(1)
関係
(2)
暑中
(3)
年賀
(4)
中元
(5)
歳暮
(6)
電話番号
(7)
郵便番号
(8)
住所
(9)
\n
図1 住所録ファイルのレコード形式

〔項目の説明〕
 (2)は相手と自分との関係(間柄)を示している。
 (3)は暑中見舞いを送る相手か否かを示しており、送る場合は“暑中”、送らない場合は“  ”である。
 (4)は年賀状を送る相手か否かを示しており、送る場合は“年賀”、送らない場合は“  ”である。
 (5)は中元を送る相手か否かを示しており、送る場合は“中元”、送らない場合は“  ”である。
 (6)は歳暮を送る相手か否かを示しており、送る場合は“歳暮”、送らない場合は“  ”である。
 いずれの項目も文字型で左詰めに格納されている。また、項目の文字数が規定けたに満たない場合は、右側を空白文字で埋めている。
 漢字の内部表現は1文字が2バイトであり、漢字コードの前後にシフトイン、シフトアウトは付かない。構造体は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-646-4444  540   大阪府大阪市中央区大手町1-5-63
図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(rbuf.name)); strncpy(obuf+16 , rbuf.tel , sizeof(rbuf.tel)); printf(" %s\n",obuf); } } fclose(fp); printf("\n*** 条件に合致した人数 = %d名\n", count); } int mdchk( char *str , ADR *jrec) { int id; for (id = 0; id &lt; 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  …………………… -! 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 &lt; 3; wi++) { memset( &obuf[wi], ' ', SIZ); obuf[wi][SIZ-1] = '\0'; } for (eid = 0 ;eid &lt; 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 &lt; 3; wi++) printf("%s\n",obuf[wi]); } }



設問 プログラムの中の   に入れる正しい答えを、解答群の中から選べ。
設問1 住所録ファイルの内容が図2の場合(3名の住所録情報を格納)に、プログラム1を実行したとき、whileループ脱出後のprintf関数で表示される条件に合致した人数を解答群の中から選べ。
 ア 0人  イ 1人  ウ 2人  エ 3人


設問2 プログラム2において、あて名リストに載らない項目を解答群の中から選べ。
 ア 名前  イ 電話番号  ウ 住所  エ 郵便番号


設問3 プログラム2ではあて名を横に複数個ずつ編集して出力している。プログラム中の-!$N#define文の定義を次のように変更すると、あて名は横に何個まで編集が可能となるか、解答群の中から選べ。
 ア 2個  イ 3個  ウ 4個  エ 8個


設問4プログラム2には不具合がある。どのような場合にどのような現象になるか、正しい記述を解答群の中から選べ。
ア 住所の長さがちょうど30けたの場合に、住所が出力されない。
イ 編集項目のいずれかが空白の場合に、編集位置がずれてくる。
ウ 編集項目のすべてが空白の場合に、編集位置がずれてくる。
エ ファイル内のレコード数が半端な場合に、端数分のあて名が出力されない。


解答

a-エ  b-イ  c-ウ  d-エ

解説

 KEY1は、”年賀”と定義されている。図2のデータでは、全員に年賀状を送ることになっているので、答えは3となる。

 〔プログラム2〕は、zip, addr, nameを取り扱っている。これらは郵便番号、住所、名前に相当している。したがって答えは郵便番号となる。

 あて名は、住所のけた数である30に揃えて出力される。したがって、横幅が130であれば、4件のデータを横に並べることができる。

 データの入力が終了すると、プログラムは、returnによって終了する。したがって、obufに蓄えられたデータが出力されずじまいとなる。たとえば、横に2件ずつのデータを出力しているおり、データが5件であるとき、最後の5件目のデータは出力されない。すなわち、データの件数が、1行に並べて出力する件数の倍数でないときは、最後の行が出力されない。


戻る