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

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

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

〔プログラムの説明〕

 関数 format_text は,印字したときに単語が行末で切れないようにテキストを 編集してファイルに出力するプログラムである。

(1) テキストに含まれる文字は,次のものである。

(2) 単語は,空白文字及び改行文字を含まない文字列であり,空白文字又は改行文字で 区切られている。単語の文字数は 20 以下とする。図1に,テキストに含まれる単語の例を示す。

図1 テキストに含まれる単語の例

(3) 改行文字を除き,1行分として印字できる文字数(以下,最大文字数という)を プログラムの引数で与えるが,その値は 40 以上とする。単語の途中で最大文字数を 超える場合は,単語の直前に改行文字を出力し,その単語が次の行の先頭に印字されるようにする。

(4) テキスト中の空白文字及び改行文字は,そのまま出力する。ただし, 連続する空白文字を出力している途中で最大文字数を超える場合は改行文字を出力し, 最大文字数を超える分は次の行の先頭から印字されるようにする。

(5) 関数 format_text の引数は次のとおりである。ここで,引数の値に誤りはないものとする。

in_file    編集前のテキスト(以下,入力テキストという)が格納されているファイル名

out_file   編集後のテキスト(以下,出力テキストという)を格納するファイル名

width     最大文字数

(6) プログラムを実行したときは,図2に示すようになる。

図2 最大文字数を 50 とした場合の例

〔プログラム〕

(行番号)

 1 #include <stdio.h>

 2 #define WLEN_MAX 2Ø /* 単幅の最大長 */

 3 void format_text(char *, Char *, int);

 4 void format_text(char *in_file, char *out_file, int width) {
 5      FILE *ifp, *ofp;
 6      int  ch,         /* 入力した文字 */
 7           lpos = Ø,   /* 出力処理をしている行での出力済み文字数 */
 8           sp = Ø;     /* strに格納されている文字数 */
 9      char str[WLEN_MAX + 2];    /* 単語を含む出力用文字列 */

1Ø      ifp = fopen(in_file, "r");
11      ofp = fopen(out_file, "w");

12      while ((ch = fgetc(ifp)) != EOF) {
13          if (ch == '\n') {
14              str[sp++] = ch;
15              str[sp]   = '\Ø';
16              fputs(str, ofp);
17              ;
18              sp = Ø;
19          } else if (ch == ' ') {
2Ø              lpos += sp;
21              if (lpos >= width) {
22                 str[sp++] = ;
23                 lpos = Ø;
24              }
25              str[sp] = '\Ø';
26              fputs(str, ofp);
27              fputc(ch, ofp);
28              lpos++;
29              ;
3Ø          } else {
31              if (  ) {
32                   fputc('\n', ofp);
33                   lpos = Ø;
34              }
35              str[sp++] = ch;
36          }
37      }
38      str[sp] = '\Ø';
39      fputs(str, ofp);

4Ø      fclose(ifp);
41      fclose(ofp);
42 }

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

a に関する解答群

ア lpos = Ø       イ lpos = sp       ウ lpos = width

エ lpos++       オ lpos += sp

b に関する解答群

ア '\Ø'       イ '\n'       ウ ' '       エ ch

c に関する解答群

ア sp = Ø       イ sp = lpos       ウ sp++

エ str[lpos] = ch       オ str[sp++] = ch

d に関する解答群

ア lpos > Ø       イ lpos >= width

ウ lpos > sp       エ sp > Ø

オ (lpos + sp) > Ø       カ (lpos + sp) >= width

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

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

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

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

基本情報技術者試験


設問2 次の記述中の に入れる正しい答えを, 解答群の中から選べ。

 テキストの編集処理のうち,行頭の空白文字に関する処理を変更することになった。 これに合わせて関数 format_text に,処理を追加する。ここで, プログラム中の には 正しい答えが入っているものとする。

(1) テキストの編集処理の変更内容は,次のとおりである。

@ 入力テキスト中の1文字以上の連続する空白文字列で,印字したときに行頭に 来る部分は出力しない。

A 最初に出力する単語の場合,又は行の先頭に来る単語の場合で直前に 出力した単語の最後の文字が“.”であったときは,単語の直前に空白文字を一つ出力する。

(2) 処理を変更したプログラムを実行したときは,図3に示すようになる。

図3 処理を変更し,最大文字数を 50 とした場合の例

(3) 処理の変更に対応するために,プログラムを表1のとおりに変更する。

表1 プログラムの変更内容

   処置                 変更内容                             
行番号 8 と 9 の 
間に追加
int  lch = '.';
行番号 26 と 27
の間に追加
   if () {
行番号 28 と 29
の間に追加
   }
行番号 34 と 35
の間に追加
  if ((lpos == Ø) && (sp == Ø) && (lch == '.')) {
fputc(' ', ofp);
lpos++; }
;

e に関する解答群

ア lpos == Ø       イ lpos == sp       ウ lpos != Ø

エ lpos != sp       オ sp == Ø       カ sp != Ø

f に関する解答群

ア lch = ' '       イ lch = '.'       ウ lch = ch

エ str[sp++] = ' '       オ str[sp++] = lch

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

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


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