基本情報技術者過去問

平成17年 午後 問6

最終更新日 2005/12/11
webmaster@tomnetwork.net

Tomのネットワーク勉強ノート
 過去問
  基本情報技術者過去問(午前・午後)
   基本情報技術者過去問 平成17年 午後 問6

問6 次の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が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のネットワーク勉強ノート
 過去問
  基本情報技術者過去問(午前・午後)
   基本情報技術者過去問 平成17年 午後 問6