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

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

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

〔プログラムの説明〕

 関数 markup_reference は,文書から参考資料名を抜き出して, 参照番号に置き換えるとともに,文書の末尾に参考資料名の一覧を追加して, 出力するプログラムである。

(1) 元の文書中では,参考資料名は文字"\"で囲まれている。文字"\"がこれ以外の用途で 使用されることはない。

(2) 参照番号は,元の文書中の異なる参考資料名に対して, 出現順に1から順に割り当てる番号である。

(3) プログラムの実行例は,図のとおりである。図中の,処理後の文書の例に示すように, 参考資料名の一覧は,"References" 以降に,参照番号と参考資料名を対にして出力する。

(元の文書の例)

The program language includes C, COBOL , Java, etc\Computer Journal\.
The feature of the Java language has been to have taken the idea of
object-oriented\Java Report\. In other languages, the idea of objec
t-oriented is being taken \Ccomputer Journal\.

             
(処理後の文書の例)

The program language includes C, COBOL , Java, etc[1]. The feature of
the Java language has been to have taken the idea of object-oriente
d[2]. In other languages, the idea of object-oriented is being taken
[1].

References
[1] Computer Journal
[2] Java Report

      図 プログラムの実行例

(4) 参考資料名は 255 文字以下であり,途中で改行されることはない。個数は 50 以下である。

(5) 元の文書に含まれる文字は,次のとおりである。

 @ 英数字

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

 B 空白文字

 C 改行文字

(6) 関数 markup_reference の引数は,次のとおりである。ただし,ファイルの名称に 誤りはないものとする。

  in_filename 元の文書が格納されているファイルの名称

  out_filename 処理後の文書を格納するファイルの名称

〔プログラム〕

#include <stdio.h>
#include <string.h>

#define MRNUM 50       /* 参考資料名の最大個数 */
#define MRLNG 255      /* 参考資料名の最大文字数 */
#define MARK '\\'      /* 参考資料名の囲み文字 */ 

void markup_reference(const char *, const char *);

void markup_reference(const char *in_filename, 
                      const char *out_filename){ 
   FILE *ifp, *ofp;
   char ch, ref_name[MRLNG + 1],
        ref_name_tbl[MRNUM][MRLNG + 1];
   int i, ref_num = 0;

   ifp = fopen(in_filename, "r");
   ofp = fopen(out_filename, "w");
   while((ch = fgetc(ifp)) != EOF){
      if(  )
         fputc(ch, ofp);
      else{
         for(i = 0; (ref_name[i] = fgetc(ifp)) != MARK; i++);
          = '\0';
         for(i = 0; i < ref_num; i++)
            if(strcmp(ref_name, ref_name_tbl[i]) == 0) 
            break;
         if(  ){
            strcpy(ref_name_tbl[ref_num], ref_name);
            ref_num++;
         }
         fprintf(ofp, "[%d]",  );
      }
   }
   fprintf(ofp, "\n\nReferences\n");
   for(i = 0; i < ref_num; i++)
      fprintf(ofp, "[%d] %s\n", i + 1, ref_name_tbl[i]);
   fclose(ifp); 
   fclose(ofp);
}

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

a に関する解答群

ア ch == '\0'      イ ch != '\0'

ウ ch == MARK      エ ch != MARK

オ ref_num == 0     カ ref_num != 0

b に関する解答群

ア ch           イ ref_name[i]

ウ ref_name[i + 1]     エ ref_name[i - 1]

オ *ref_name

c に関する解答群

ア i == 0        イ i != 0

ウ i < ref_num      エ i >= ref_num

オ ref_num == 0

d に関する解答群

ア i + 1       イ ref_num + 1

ウ &anp;i + 1      エ &ref_num + 1

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

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

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

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


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