東京理科大学 infoserv[更新日]2000.10.23


次の問7から問10までの4問については,この中から1問を選択し,
答案用紙の選択欄のを マークして解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

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

〔プログラムの説明〕

関数 addrsync は,二つのアドレス帳の内容を同一にする(同期をとる)関数である。

(1) アドレス帳はデスクトップ型パソコン(デスクトップ PC)とノート型パソコン (ノート PC)上にあり,それぞれを個別に使用するので,1 日に 1 回同期処理を行う。
(2) 各アドレス帳は複数件のレコードで構成される。 1 件のレコードは,フラグ,氏名,メールアドレス,更新日時で構成される。 ただし,一つのアドレス帳に氏名が同一のレコードは存在しない。
(3) 同期処理を行う際には,各アドレス帳を構造体 ADDR の配列 (以下 ADDR 配列と呼ぶ)に変換後,氏名の昇順に整列してから関数 addrsync を呼び出す。 関数 addrsyncの引数は,デスクトップ PC のアドレス帳の ADDR 配列,ノート PC の アドレス帳の ADDR 配列,及び同期した ADDR 配列である。 関数 addrsync の実行後,同期したADDR 配列から,新しいアドレス帳を作成する。
(4) 構造体 ADDR の定義は,次のとおりである。

typedef struct {
    char flag;   /* フラグ */
    char *name;  /* 氏名へのポインタ */
    int  nlen;   /* 氏名の長さ */
    char *addr;  /* メールアドレスへのポインタ */
    int  alen;   /* メールアドレスの長さ */
    char *time;  /* 更新日時へのポインタ */
} ADDR;

フラグは現在のレコードの状態を示し,内容は次のとおりである。
“ ”(空白):同期後に変化なし(初期値) “U”:同期後更新された
“A”:同期後追加された  “D”:同期後削除された

“E”: ADDR 配列の終端を示す。氏名,メールアドレスともに意味をもたず, 氏名の長さ,メールアドレスの長さには −1 が格納される。 更新日時の形式は“YYYY-MM-DD hh:mm:ss”(西暦年-月-日 時:分:秒)である。

(5)  デスクトップ PC のアドレス帳の ADDR 配列とノート PC のアドレス帳の ADDR 配列の各要素を,氏名をキーとして照合し,更新日時とフラグの内容に応じて 処理することによって同期をとる。 氏名が片方にだけ存在する場合の処理内容を表 1 に,氏名が両方に存在する場合の処理内容を 表 2 に示す。
(6)  strncmp(str1,str2,leng)関数は,str1 で指される配列を str2 で指される配列と leng 文字だけ比較し,大きいか,等しいか又は小さいかによって,それぞれ,正の整数, 0 又は負の整数を返す。

   表1 氏名が片方にだけ存在する場合の処理内容
  フラグの内容   処理内容(同期した ADDR 配列への格納)      

“U”

格納する

“A”

格納する

“D”

格納しない

   表2 氏名が両方に存在する場合の処理内容

フラグの内容の組合せ

処理内容(同期した ADDR 配列への格納)

“ ”と“ ”

ノート PC の要素を格納する

“ ”と“U”

“U”の要素を格納する

“ ”と“A”

“A”の要素を格納する

“ ”と“D”

格納しない

“U”と“U”

更新日時の新しい方の要素を格納する

“U”と“A”

更新日時の新しい方の要素を格納する

“U”と“D”

“U”の要素の更新日時の方が新しいときだけ,格納する

“A”と“A”

更新日時の新しい方の要素を格納する

“A”と“D”

“A”の要素の更新日時の方が新しいときだけ,格納する

“D”と“D”

格納しない

〔プログラム〕

#include <string.h>
#include <stdio.h>
typedef struct {
    char flag;        /* フラグ */
    char *name;       /* 氏名へのポインタ */
    int  nlen;        /* 氏名の長さ */
    char *addr;       /* メールアドレスへのポインタ */
    int  alen;        /* メールアドレスの長さ */
    char *time;       /* 更新日時へのポインタ */
} ADDR;

int namecmp(char *, int, char *, int);
void addrsync(ADDR desk[], ADDR note[], ADDR sync[])
{
    int didx=0, nidx=0, sidx=0, comp;
    while (  ) {
        comp = namecmp(desk[didx].name, desk[didx].nlen,
                            note[nidx].name, note[nidx].nlen);
        if (comp < 0) {
            if (desk[didx].flag != 'D') {
                sync[sidx] = desk[didx];
                sync[sidx++].flag = ' ';
            }
            ;
        }
        else if (comp > 0) {
            if (note[nidx].flag != 'D') {
                sync[sidx] = note[nidx];
                sync[sidx++].flag = ' ';
            }
            ;
        }
        else {
            if (strncmp(desk[didx].time, note[nidx].time, 19) 
                    > 0) {
                if (desk[didx].flag != 'D') {
                    sync[sidx] = desk[didx];
                    sync[sidx++].flag = ' ';
                }
            }
            else {
                if (note[nidx].flag != 'D') {
                    sync[sidx] = note[nidx];
                    sync[sidx++].flag = ' ';
                }
            }
            ;
        }
    }
    sync[sidx].flag = 'E';
    sync[sidx].nlen = -1;
    sync[sidx].alen = -1;
}
int namecmp(char *str1, int len1, char *str2, int len2)
{
    int leng, result;

    if (len1 == -1) return 1;
    if (len2 == -1) return -1;
    leng = (len1 < len2) ? len1 : len2;
    result = strncmp(str1, str2, leng);
    if (result == 0)
        ;
    return result;
}
設問   プログラム中の に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア desk[didx].flag == 'E'

イ desk[didx].flag == 'E' && note[nidx].flag == 'E'

ウ desk[didx].flag == 'E' || note[nidx].flag == 'E'

エ desk[didx].flag != 'E'

オ desk[didx].flag != 'E' && note[nidx].flag != 'E'

カ desk[didx].flag != 'E' || note[nidx].flag != 'E'

b 〜 d に関する解答群

ア didx++        イ nidx++        ウ sidx++

エ didx++, nidx++    オ didx++, sidx++    カ nidx++, sidx++

キ didx++, nidx++, sidx++ 

e に関する解答群

ア result = 1

イ result = -1

ウ result = len1 - len2

エ result = len2 - len1

オ result = (len1 < len2) ? len1 : len2

カ result = (len1 < len2) ? len2 : len1


東京理科大学 infoserv 戻る 次頁:問08