基本情報技術者過去問平成17年 午後 問6最終更新日 2005/12/11
|
Tomのネットワーク勉強ノート |
![]() |
![]() |
![]() |
問6 次のCプログラムの説明及びプログラムを読んで,設間に答えよ。
〔プログラムの説明〕
関数update_masterは,処理年月を与えて,月刊誌の定期購読者マスタファイ
ルの更新を行うプログラムである。
(1)関数update_masterの引数は,次のとおりである。
omf_name 旧定期購読者マスタファイル名
trf name トランザクションファイル名
nmf_name 新定期購読者マスタファイル名
b_year 処理年月の西暦年
b_month 処理年月の月
(2)新旧の定期購読者マスタファイル及びトランザクションファイルのレコード様式
は次のとおりである。
_ |
|
@ 購読者コード及び雑誌コードは,空白を含まない12文字の英数字列である。
A 購読終了年月は,YYYYMMの形式で6けたの数字列である。
B レコードの終端には,改行文字'\n,が付いている。
C レコードは,購読者コードを第1キー,雑誌コードを第2キーとして昇順に整列されている。
D 購読者は,複数の雑誌を購読することはあるが,同一の雑誌を重複して購読することはない。
(3)旧定期購読者マスタファイル及びトランザクションファイルのレコードに誤りはないものとする。
(4)トランザクションファイルには,旧定期購読者マスタファイルを更新するため
の,新規購読,購読期間延長及び購読打切りの3種類のレコードがある。
@ 新規購読及び購読期間延長レコードの購読終了年月は,与えられた処理年月以
降になっている。
A 購読打切リレコードの購読終了年月は,“999999”となっている。
(5)次のどちらかの条件を満足するレコードを,抽出レコードとする。
@ 旧定期購読者マスタファイルのレコードのうち,購読者コードと雑誌コードの
組合せがトランザクションファイルには含まれていないもの
A トランザクションファイルに含まれるレコード
(6)抽出レコードのうち,購読終了年月が与えられた処理年月以降であり,かつ
“999999”ではないものだけを,新定期購読者マスタファイルに出力する。
(7)プログラム中で使用している関数strcmpの仕様は,次のとおりである。
int strcmp (char *string1 char *string2)
機能 : 引数で指定される二つの文字列string1とstring2を比較し, そ
の大小関係を返す。
返却値 : 負の数 (string1がstrttng2より小さいとき)
0 (string1がstring2に等しいとき)
正の数 (string1がstring2より大きいとき)
〔プログラム〕
#include <stdio.h>
#include <string.h>
void update_master(char *, char *, char *, int, int);
void update_master(char *omf_name, char *trf_name
char *nmf_name, int b_year, int b_month)
{
FILE *oldmf
/* 旧定期購読者マスタファイル */
*trf,
/* トランザクションファイル */
*newmf,
/* 新定期購読者マスタファイル */
char om_usrid[13], om_magid[13],
t_usrid[13], t_magid[13];
long b_date, om_ldate, t_ldate, m_sts,
t_sts, flg;
oldmf = fopen(omf_name, "r");
trf = fopen(trf_name,
"r");
newmf = fopen(nmf_name, "w");
b_date = b_year * 100 + b_month;
m_sts = fscanf (oldmf, "%12s %12s #6ld\n",,
om_usrid, om_magid, &om_ldate);
t_sts = fscanf( trf, "%12s %12s %6ld\n",
t_usrid, t_magid, &t_ldate);
while (【 a 】) {
if ( m_sts == EOF )
flg = 1;
else if ( t_sts == EOF )
flg = -1;
else if ( ( t_sts = strcmp( om_usrid, t_usrid)) == 0 )
flg = strcmp( om_magid, t_magid);
if ( flg < 0 ) {
if ( om_ldate >= b_date )
fprintf( newmf, "%12.12s
%12.12s %6ld\n" , 【 b 】);
m_sts = fscanf( odlmf, "%12s %12s %6ld\n",
om_usrid,
om_magid, &om_ldate);
} else {
if (【 c 】)
fprintf( newmf, "%12.12s
%12.12s %6ld\n",【 d 】);
if ( flg == 0 )
m_sts = fcanf( oldmf, "%12s
%12s %6ld\n",
om_usrid,
om_magid, &om_ldate);
t_sts = fcanf( trf, "%12s %12s %6ld\n",
t_usrid, t_magid,
&t_ldate);
}
}
fclose(oldmf);
fclose(trf);
fclose(newmf);
}
設問 プログラム中の【 】に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア (m_sts == EOF) && (t_sts == EOF)
イ (m_sts == EOF) || (t_sts == EOF)
ウ (m_sts != EOF) && (t_sts != EOF)
エ (m_sts != EOF) || (t_sts != EOF)
オ m_sts == EOF
カ m_sts != EOF
キ t_sts == EOF
ク t_sts != EOF
b,dに関する解答群
ア om_usrid, om_magid, om_ldate
イ om_usrid, om_magid, t_ldate
ウ om_usrid, t_magid, om_ldate
エ om_usrid, t_magid, t_ldate
オ t_usrid, om_magid, om_ldate
カ t_usrid, om_magid, t_ldate
キ t_usrid, t_magid, om_ldate
ク t_usrid, t_magid, t_ldate
cに関する解答群
ア b_date == 999999 イ b_date != 999999
ウ om_ldate == 999999 エ om_ldate != 999999
オ t_ldate == 999999 カ t_ldate !=
999999
Tomのネットワーク勉強ノート |
![]() |
![]() |
![]() |