BohYoh.comロゴ
情報処理技術者試験対策講座
第2種情報処理技術者試験 平成6年秋 午後 問11

 次のCプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
 テキストファイル(txt_file)を読み込んで、一定の幅(WIDTH)にあわせて折り返しを行い、出力するプログラムである。

(1)テキストファイルに含まれる文字は、次のものである。
  (1) 英数字
  (2) 図形文字(!"#%&'()*+,-./:;<=>?[\]^_{|}~
  (3) 空白文字
  (4) 改行文字
(2)折返しとは、改行文字を出力して復帰改行することをいう。
(3)テキストファイルから改行文字を読み込んだときは、1行の出力文字数が一定の行幅に満たなくても、折返しを行う。

プログラム

001 #include <stdio.h > 002 #define WIDTH 60 003 main() 004 { 005 FILE *fp; 006 int ch, pos = 0; 007 fp = fopen("txt_file", "r"); 008 while ((ch = fgetc(fp)) EOF) { 009 if ((pos b WIDTH) && (ch != '\n')) { 010 putchar('\n'); 011 pos = 0; 012 } 013 putchar(ch); 014 pos = (ch == '\n') ? 0 : pos + 1; 015 } 016 fclose(fp); 017 }


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

aに関する解答群
 ア =  イ !  ウ ==  エ !=

bに関する解答群
 ア <  イ >  ウ <=  エ >=

設問2 次の説明文の に入れる正しい答えを、解答群の中から選べ。
 連続する空白文字は1文字だけを出力するようにプログラムを変更する。行を追加しても、元のプログラムの行番号は変わらないものとする。
 まず、行番号006の直後に次の行を挿入する。

int bch = '\0';

 更にプログラムのの部分を条件式が真のときだけ実行するように変更する。すなわち、プログラムのの部分を次のように変更する。

if () {
 プログラムのの部分
}

そして、行番号015の直前に次の行を追加する。

bch=ch;


cに関する解答群
 ア 行番号009~012  イ 行番号009~013
 ウ 行番号009~014  イ 行番号013~014

dに関する解答群
 ア (ch != ‘ ’ && bch != ‘ ’)
 イ (ch != ‘ ’ || bch != ‘ ’)
 ウ (ch == ‘ ’ && bch == ‘ ’)
 エ (ch == ‘ ’ || bch == ‘ ’)


解答

a-エ  b-エ  c-ウ  d-イ

解説

 fgetc関数は、ファイルの終端に達するとEOFを返す。したがって、その値がEOFでない限り繰り返しを行えばよい。決り文句として覚えておこう。

 while文による繰り返しの中では、読み込んだ文字chputcharによって、そのまま出力する。もちろん、改行文字を読み込んだ場合は、その改行文字をそのまま出力することになることに注意しよう。
 putcharによる出力後は、改行文字を出力したときはposの値を0に戻し、そうでないときは、その値を一つだけ増やしている。したがって、posには、現在の行の中で、出力した文字数が格納されることになる。
 さて、問題として問われているif文は、読み込んだ文字が改行文字でなくても、行の文字数がWIDTHとなったときに強制的に改行して折返しを実現するためのものである。したがって、posの値がWIDTHとなったときに改行を行えばよい。

 cより先に解説する。
 空白文字が連続した場合は、1文字だけを出力する。新たに導入されたbchには、一つ前に読み込まれた文字を格納する。今読み込んだ文字chが空白文字であり、かつ、一つ前に読み込まれた文字bchも空白であるとき、すなわち、

(ch == ' ' && bch == ' ')

が成立するときは、何も出力せず、そうでないときにのみ、その文字chを出力する。そうすれば、空白文字が連続する場合、2文字目以降は出力されないことになる。
 上の式は、出力しないときの条件なので、これを反転したものが正解である。

 現在の行の中で出力した文字数posの更新は、putcharによる出力を行ったときに、必ず実行しなければならない。したがって、選択肢アやイが正解でないことはすぐにわかる。


戻る