戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2014年 春期 午後 問09


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

〔プログラムの説明〕  関数format_textは、印字したときに単語が行末で切れないようにテキストを編集してファイルに出力するプログラムである。 (1) テキストに含まれる文字は、次のものである。  ① 英字 A〜Z、a〜z  ② 数字 0〜9  ③ 記号 !"#%&'()*+,-./:;<=>?[]^_{|}~  ④ 空白文字  ⑤ 改行文字
(2) 単語は、空白文字及び改行文字を含まない文字列であり、空白文字又は改行文字で区切られている。単語の文字数は20以下とする。図1に、テキストに含まれる単語の例を示す。
基本情報技術者試験(平成26年 午後 問9 図1)
(3) 改行文字を除き、1行分として印字できる文字数(以下、最大文字数という)をプログラムの引数で与えるが、その値は40以上とする。単語の途中で最大文字数を超える場合は、単語の直前に改行文字を出力し、その単語が次の行の先頭に印字されるようにする。
(4) テキスト中の空白文字及び改行文字は、そのまま出力する。ただし、連続する空白文字を出力している途中で最大文字数を超える場合は改行文字を出力し、最大文字数を超える分は次の行の先頭から印字されるようにする。
(5) 関数format_textの引数は次のとおりである。ここで、引数の値に誤りはないものとする。  in_file 編集前のテキスト(以下、入力テキストという)が格納されているファイル名  out_file 編集後のテキスト(以下、出力テキストという)を格納するファイル名  width 最大文字数
(6) プログラムを実行したときは、図2に示すようになる。
基本情報技術者試験(平成26年 午後 問9 図2)
基本情報技術者試験(平成26年 午後 問9 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:lpos = 0  イ:lpos = sp  ウ:lpos = width  エ:lpos++  オ:lpos += sp   bに関する解答群  ア:'\0'  イ:'\n'  ウ:' '  エ:ch   cに関する解答群  ア:sp = 0  イ:sp = lpos  ウ:sp++  エ:str[lpos] = ch  オ:str[sp++] = ch   dに関する解答群  ア:lpos > 0  イ:lpos >= width  ウ:lpos > sp  エ:sp > 0  オ:(lpos + sp) > 0  カ:(lpos + sp) >= width

模範解答

a:ア、b:イ、c:ア、d:カ

解説

解答の導き方

このプログラムでは、単語をすぐには出力せず、いったん str にためます。空白文字や改行文字に出会ったときに、ためていた文字を出力します。
そのため、変数の役割は次のように考えると分かりやすいです。
  • lpos:現在の行にすでに出力した文字数
  • sp:str にためている文字数
  • str:出力する前の単語などを一時的に置く場所
str にある文字はまだ出力されていないため、単語を含む行の文字数を考えるときは、lpos と sp の両方を確認します。
まず、入力文字が改行文字だった場合を考えます。プログラムは、str に改行文字を加えてから、str の内容を出力します。改行した後は、新しい行で文字数を数え始めるので、lpos は0に戻します。したがって、aには lpos = 0 が入ります。その後の sp = 0 は、出力済みの文字を次の単語のためにリセットする処理です。
次に、入力文字が空白文字だった場合です。空白文字を出力する前に、まず、ためていた単語の文字数 sp を lpos に加えます。これで、単語を出力した後の行の文字数が分かります。
その文字数が width 以上なら、単語の後ろに改行文字を加えてから出力します。こうすれば、単語を行の途中で切らずに済みます。入力された空白文字は、改行文字の後にそのまま出力されます。改行文字の役割をするのは '\n' なので、bには '\n' が入ります。
単語と空白文字を出力した後は、str にためていた文字数をリセットします。次の単語は str の先頭からためるため、cには sp = 0 が入ります。
最後に、入力文字が英字や数字など、空白文字でも改行文字でもない場合を考えます。これから str に文字を追加する前に、現在の行の文字数が最大文字数に達しているかを調べます。
現在の行には、すでに出力した lpos 文字と、str にためている sp 文字があります。つまり、追加前の文字数は lpos + sp です。この値が width 以上なら、次の文字を加えると最大文字数を超えるので、先に改行します。その後、ためていた単語は改行の後に出力されるため、単語全体が次の行へ移ります。したがって、dには (lpos + sp) >= width が入ります。
条件に「width は40以上」「単語の文字数は20以下」とあるので、次の行に移した単語が行幅に収まらない心配はありません。

誤りやすいポイント

  • lpos だけで行の文字数を判断しないようにします。str にまだ出力されていない文字があれば、その文字数 sp も加えて考えます。
  • dの条件は「次の文字を追加する前」に調べます。現在の文字数がすでに width と等しい場合も、次の文字を追加すると超えてしまうため、条件は「以上」です。
  • bは、入力された空白文字そのものではありません。ここで追加するのは、行を分けるための改行文字です。
  • 空白文字を出力した後に sp をリセットしないと、次の単語をためる位置がずれます。
  • 元の空白文字や改行文字は、そのまま出力します。行を分けるために改行文字を追加しても、元の空白文字が消えるわけではありません。

FAQ

Q: str にためている文字数は、なぜすぐに lpos に加えないのですか?
A: str の文字はまだ出力されていないためです。空白文字に出会ったときに単語を出力する処理に合わせて、sp を lpos に加えます。ただし、単語が行に収まるかを調べるときは、出力済みの文字と、ためている文字の両方を確認します。
Q: 単語の途中で行幅を超えそうなとき、なぜ単語の先頭に改行を入れられるのですか?
A: 単語は str にためられており、まだ出力されていないからです。改行を先に出力し、その後で str の内容を出力すれば、単語を分割せずに次の行へ移せます。
Q: 行を分けるとき、空白文字は削除されますか?
A: 削除されません。問題文には、空白文字と改行文字はそのまま出力するとあります。行幅を超える場合は改行文字を追加し、元の空白文字も続けて出力します。

関連キーワード: C言語、文字列処理、配列、バッファ、ファイル入出力

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 次の記述中のに入れる正しい答えを、解答群の中から選べ。    テキストの編集処理のうち、行頭の空白文字に関する処理を変更することになった。これに合わせて関数format_textに、処理を追加する。ここで、プログラム中のa〜dには正しい答えが入っているものとする。 (1) テキストの編集処理の変更内容は、次のとおりである。  ① 入力テキスト中の1文字以上の連続する空白文字列で、印字したときに行頭に来る部分は出力しない。  ② 最初に出力する単語の場合、又は行の先頭に来る単語の場合で直前に出力した単語の最後の文字が“.”であったときは、単語の直前に空白文字を一つ出力する。
(2) 処理を変更したプログラムを実行したときは、図3に示すようになる。
基本情報技術者試験(平成26年 午後 問9 図3)
(3) 処理の変更に対応するために、プログラムを表1のとおりに変更する。
基本情報技術者試験(平成26年 午後 問9 表1)
eに関する解答群  ア:lpos == 0  イ:lpos == sp  ウ:lpos != 0  エ:lpos != sp  オ:sp == 0  カ:sp != 0   fに関する解答群  ア:lch = ' '  イ:lch = '.'  ウ:lch = ch  エ:str[sp++] = ' '  オ:str[sp++] = lch

模範解答

e:ウ、f:ウ

解説

解答の導き方

この設問では、空白文字を出力する条件と、直前の単語の最後の文字を記録する方法を考えます。
1. 行頭の空白文字を出力しない条件を考えます
変更内容では、印字したときに行頭に来る空白文字は出力しないとあります。空白文字を処理する部分では、改行が必要になった場合にlposを0に戻しています。つまり、空白文字を出力する時点でlposが0なら、行頭にいると判断できます。
追加するif文は、行頭でないときだけ空白文字を出力すればよいので、条件はlpos != 0です。空白文字を出力した場合にだけlposも増やせば、行頭の連続する空白文字はどれも出力されず、文字数にも数えられません。
2. 単語の先頭かどうかを確かめます
単語の文字は、空白文字や改行文字に出会うまでstrにためられています。spは、strに格納されている文字数です。そのため、sp == 0なら、まだ単語の文字を格納していない状態、つまり単語の先頭です。
さらに、条件にはlpos == 0もあります。これは、単語の先頭が行頭に来た場合だけ処理するためです。
3. 直前の単語が「.」で終わったかを確かめます
行番号8と9の間にlchを追加し、初期値を「.」にします。処理の開始時にはまだ直前の文字がありませんが、最初の単語の前にも空白文字を一つ出力する必要があるためです。
単語の先頭で、行頭にいて、lchが「.」なら、単語の前に空白文字を出力します。この空白文字も出力済み文字数に含めるので、lposを増やします。
最後に追加する処理では、現在の文字chをlchに記録します。これにより、次の単語が行頭に来たとき、直前の単語の最後の文字が「.」だったかを判定できます。したがって、fはlch = chです。

誤りやすいポイント

  • 空白文字を出力しない条件は、空白文字の処理に入った直後ではなく、改行処理の後のlposで判断します。改行によってlposが0になった場合も、次の空白文字は行頭の空白文字です。
  • 空白文字を出力しないときは、lposも増やしません。出力していない文字を文字数に数えると、行頭の空白文字が続いた場合に行の位置を正しく判断できなくなります。
  • lchは、空白文字や改行文字ではなく、単語に含まれる文字で更新します。空白文字で更新すると、直前の単語が「.」で終わったかどうかを判定できなくなります。
  • 最初の単語の前にも空白文字を出力するため、lchの初期値は「.」です。初期値を別の文字にすると、最初の単語に対する条件が変わってしまいます。

FAQ

Q: sp == 0は、どのような状態を表しますか?
A: strにまだ文字が格納されていない状態です。この処理では、単語の文字をstrにためるため、単語の先頭にいるかどうかの判定に使えます。
Q: lchを改行文字で更新しないのはなぜですか?
A: 判定したいのは、直前に出力した単語の最後の文字です。改行文字でlchを更新すると、その文字が「.」だったかどうかが分からなくなります。
Q: 行頭の空白文字を出力しないのに、図3では「The」の前に空白文字があります。なぜですか?
A: 行頭にある入力中の空白文字を出力したものではありません。最初の単語の前に空白文字を一つ出力するという変更内容によって、追加されたものです。

関連キーワード: C言語、条件分岐、文字列処理、ファイル入出力、状態管理

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について