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

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

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

〔プログラムの説明〕

関数 update_master は,処理年月を与えて,月刊誌の定期購読者マスタファイルの更新を 行うプログラムである。

(1) 関数 update_master の引数は,次のとおりである。

omf_name 旧定期購読者マスタファイル名
trf_name トランザクションファイル名
nmf_name 新定期購読者マスタファイル名
b_year 処理年月の西暦年
b_month 処理年月の月

(2) 新旧の定期購読者マスタファイル及びトランザクションファイルのレコード様式は 次のとおりである。

購読者コード
  12 けた
空白
  1 けた
雑誌コード
  12 けた
空白
  1 けた
購読終了年月
  6 けた

@ 購読者コード及び雑誌コードは,空白を含まない 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 が string2 より小さいとき)
     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 () {
        if ( m_sts == EOF )
            flg = 1;
        else if ( t_sts == EOF )
            flg = -1;
        else if ( (flg = 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",);
            m_sts = fscanf(oldmf, "%12s %12s %6ld\n",
                           om_usrid, om_magid, &om_ldate);
        } else {
            if ()
                fprintf(newmf, "%12.12s %12.12s %6ld\n",);
            if ( flg == 0 )
                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);
        }
    }
    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

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

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

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

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


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