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

平成14年 春期 基本情報技術者 午後 問10
問10   C言語

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

〔プログラムの説明〕

マクロ機能をもつあるプログラム言語で書かれたプログラムが,元ファイル source_file に格納されている。 この source_file 中のマクロ名を展開し,展開ファイル dest_file を生成する。

(1) 元ファイルには,マクロ定義とマクロ名を使用するプログラムのコードが格納されている。

(2) 展開ファイルには,マクロ名を展開したプログラムのコードを出力する。 ただし,元ファイルのマクロ定義は,出力しない。

(3) マクロ定義は,次の形式とする。

$STRDEF マクロ名 展開コード

$STRDEF は,必ず1けた目から始まり,$STRDEF とマクロ名の間, 及びマクロ名と展開コードの間は,一つの空白文字で区切られる。

(4) 一つのマクロ名に対するマクロ定義は,1回だけ行うことができる。

(5) 元ファイル中で,マクロ定義以降のコードに対して, 区切り文字で区切られたマクロ名の部分を展開コードに置換する。 ただし,マクロ定義の行は,置換の対象とはしない。

(6) 区切り文字は,次の @ 〜 B であり,文字型の配列 delmchar に格納されている。

@ 空白文字

A 図形文字 !"#%&'()*+,-./:;<=>?[\]^_{|}~

B 改行文字

char delmchar[] = " !\"#%&'()*+,-./:;<=>?[\\]^_{|}~\n";

注 delmchar の先頭の要素には,空白文字が格納されている。

(7) マクロ名及び展開コードは,区切り文字を含まない。

(8) 元ファイル中に現れるマクロ定義の個数は,20 までとする。

(9) マクロ名及び展開コードは,31 文字までとする。

(10) 展開の前も後も,各行は改行文字で終わり,文字数は 255 文字までとする。

(11) プログラム中で使用している関数 strchr の仕様は,次のとおりである。

char *strchr(const char *s, int c)

機能: s で指定される文字列の中の c(char 型に変換する。)の最初の出現を捜す。 文字列の終端を示すナル文字は,文字列の一部とみなす。

返却値:捜し出した文字へのポインタを返す。 文字列の中に,その文字が現れない場合,空ポインタ( NULL )を返す。

(12) このプログラムの実行例は,次のとおりである。

  元ファイル   展開ファイル
$STRDEF $$TITLE HELLO
$STRDEF $$SIGN BILLY
$STRDEF $$LENG 8
MSG     START
        OUT     $$TITLE,6
        IN      BUF,$$LENG
        OUT     BUF,$$LENG
        OUT     $$SIGN,6
        EXIT
$$TITLE DC      'Hello!'
$$SIGN  DC      'Billy'
BUF     DS      $$LENG
        END
MSG     START
        OUT     HELLO,6
        IN      BUF,8
        OUT     BUF,8
        OUT     BILLY,6
        EXIT
HELLO   DC      'Hello!'
BILLY   DC      'Billy'
BUF     DS      8
        END


      実行例

〔プログラム〕

#include <stdio.h>
#include <string.h>
#define MCRDEF 20
#define STRLNG 32
#define LINLNG 256
int divide_line();
char linbuf[LINLNG], token[LINLNG][LINLNG], delm[LINLNG];
char label[] = "$STRDEF";
char delmchar[] = " !\"#%&'()*+,-./:;<=>?[\\]^_{|}~\n";
main() {
    FILE *sfp, *dfp;
    int  mcrcnt = 0, tokcnt, flg, idx1, idx2;
    char orig[MCRDEF][STRLNG], expand[MCRDEF][STRLNG];
    sfp = fopen("source_file", "r");
    dfp = fopen("dest_file", "w");
    while(fgets(linbuf, LINLNG, sfp) != NULL) {
        tokcnt = divide_line();
        if(strcmp(token[0], label) == 0) {
            strcpy(orig[mcrcnt], token[1]);
            strcpy(expand[mcrcnt], token[2]);
            ;
        } else {
            for(idx1 = 0; idx1 < ; idx1++) {
                flg = 0;
                for(idx2 = 0; idx2 < mcrcnt; idx2++)
                    if(strcmp(token[idx1], orig[idx2]) == 0) {
                        flg = 1;
                        break;
                    }
                if()
                    fprintf(dfp, "%s%c", token[idx1], delm[idx1]);
                else
                    fprintf(dfp, "%s%c", expand[idx2], delm[idx1]);
            }
        }
    }
    fclose(sfp);
    fclose(dfp);
}
int divide_line() {
    int tokcnt = 0, lidx = 0, tidx;
    do {
        for(tidx = 0; strchr(delmchar, linbuf[lidx]) == NULL;
              lidx++, tidx++)
            token[tokcnt][tidx] = linbuf[lidx];
        token[tokcnt][tidx] = ;
        delm[tokcnt] = ;
        ;
        tokcnt++;
    } while(linbuf[lidx - 1] != '\n');
    return tokcnt;
}

基本情報技術者試験


設問  プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア idx1 = 0     イ idx1++      ウ idx2 = 0

エ idx2++      オ mcrcnt = 0    カ mcrcnt++

キ tokcnt = 0    ク tokcnt++

b に関する解答群

ア idx2       イ idx2++    ウ mcrcnt

エ mcrcnt++     オ tokcnt    カ tokcnt++

c に関する解答群

ア flg = 0     イ flg == 0     ウ flg = 1

エ flg == 1     オ idx2 = 0    カ idx2 > 0

キ idx2 < mcrcnt    ク idx2 = mcrcnt

d,e に関する解答群

ア '\0'       イ '\n'        ウ delm[lidx]

エ delm[tidx]    オ linbuf[lidx]    カ linbuf[tidx]

キ token[lidx]    ク token[tidx] 

f に関する解答群

ア lidx = 0     イ lidx++       ウ tidx = 0

エ tidx++      オ tokcnt = 0     カ tokcnt++

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

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

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

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

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

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


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