スゴ技

平成23年度 秋 基本情報技術者試験 【問9】(その2)

Blog: |

ブログの次男こと宮本です.

前回に引き続き,今回も秋の基本情報処理技術者試験午後問題のC言語解説です.設問1はかなり容易でしたが,それを踏まえての設問2となります.少しややこしい部分はありますが,高度な文法事項を扱っているわけではないので,じっくり考えれば解ける問題かと思います.

【設問2】 プログラム中の空欄の穴埋め問題です.設問1が有限小数だけを対象としていたのに対し,設問2では無限循環小数も範囲に含みます.整数を整数で割っているので,答が無理数となることはありませんが,仕様である小数点以下100桁に収まらない可能性は十分にあります(もちろん,分母が3桁以上の場合ですが).これらのことより,答の表示形式は,①割り切れる,②100桁以内に循環する,③その他,となります.その他とは,循環はするが循環節が100桁を超える場合です.前述のとおり,無理数は存在し得ませんので,この3通りのいずれかに当てはまります.

では空欄を見ていくことにしましょう.空欄 d は,while の継続条件を考える問題です.逆に考えれば,終了条件は上記の表示形式①②③のいずれかを満たした場合となることに着目しましょう.まず第1の継続条件「 x > 0 」は,「余りがある」という意味です.裏返せば,「余りが無くなれば(割り切れれば)終了」という,①の条件になります.第2の継続条件「」は,「最大桁数以内なら」という意味です.これも裏返せば,「最大桁数を超えれば終了」ということになり,③の条件に相当します.残ったのは②の条件ですが,意味としては「循環節が見つかれば終了」となるようにします.継続条件に書き直すと,「循環節が見つからなければ継続」となりますので,循環節を表す変数 startRepeat に関する選択肢の中から選ぶようにします.この変数の初期値は -1 ですので,-1 が続いている限り,循環節が見つかっていない状態を表しています.よって答えは,キの「 startRepeat == -1 」となります.

空欄 e は,for 文の継続条件に関する問題です.条件を考える前に,ループ内の処理を見てみましょう.配列 xHistory[] は各桁における剰余(次の桁への余り)を記憶しています.if 文は,「過去に同じ余りが存在したかどうか」を調べています.なぜなら,同じ余りがあれば,そこからは必ず以前と同じ循環を繰り返すからです.この条件が成立すれば,「 startRepeat = i 」,つまり,その桁から循環が開始されることになります.求めたいことは,「 i = 0 」からどこまでを調べればよいかということです.現時点までの計算桁数を記憶しているのは変数 ri ですので,0 から ri を超えない範囲で判定をすればよいことになります.よって答は,ウの「 i < ri 」となります.

空欄 f は,if 文の条件に関する問題です.実行内容は,記号 ‘[‘ を表示することで,これは循環節の開始箇所を表しています.プログラム中では,小数点以下第1桁を0,第2桁を1,…というように,実際の桁数と変数の値が1つずれる形になっています.表示したい箇所は「循環節が始まる直前」で,if 文より putchar 文の方が後に記述されていますので,startRepeat と i が一致した個所で十分です.よって答は,アの「 i == startRepeat 」となります.

空欄 g は,実際に各桁の数字を表示する部分です.ただ,表示命令は putchar ですので,数字を文字として扱う必要が出てきます.配列 xHistory[] が記憶しているのは各桁の数字そのものではなく,直前の桁での余りになります.ですので,計算式としては,「直前の桁の余りを10倍した値を y で割った商に文字 ‘0’ の ASCII コードを足す」という,文字に表わすと少し複雑なものとなりました.よって答は,カの「 ‘0’ + xHistory[i] * 10 / y 」となります.

いかがでしたでしょうか?多少考える部分があるとはいうものの,文法事項としては C 言語の半分も進んでいない状態で解けると思います.例年のような,複雑なポインタや構造体も含まれていませんし,技術レベルとしては C 言語検定 3 級の範囲と考えてよいでしょう.もしかしたら,試験会場で見てからでも十分に解けたかも知れないですね.やはり,今回の難易度は高くなかったと判断するのが妥当だと思います.

2011年(平成23年度)秋期の解説

Date:

Tagタグ

Teamライターチーム紹介

神戸電子オフィシャルSNS

オープンキャンパスなどの
誰でも参加OKの楽しいイベント
やブログの最新記事などお届けします!

ページの上へ移動