平成23年秋期試験午後問題 問9

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】

問9 ソフトウェア開発(C)

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

〔プログラム1の説明〕
 二つの整数 x,y (0<x<y)を受け取り,x/yの値を10進小数として出力するプログラムである。
  • 関数 printRational の引数は,次のとおりである。ここで,引数の値に誤りはないものとする。
    x:
    分子を表す正の整数
    y:
    分母を表す正の整数
     ただし,x/y は有限小数(小数点以下の桁数が有限桁である小数)であり,循環小数(小数部のある桁以降で,同じ数字の列が無限に繰り返される小数)ではないものとする。
  • 次の手順でx/yを10進小数として出力する。
    • "0."を出力する
    • xが0になるまで,次の③,④を繰り返す。
    • xを10倍した値をyで割った商を出力する。
    • xを10倍した値をyで割った余りを新たにxとする。
pm09_1.png

設問1

次の記述中の に入れる正しい答えを,解答群の中から選べ。
  • プログラム1の行番号7では小数点以下の各桁の数字を出力している。この行を"putchar('0'+(x / y * 10));"に変えるとa
  • printRational(3,8)を実行した場合,行番号6の条件判定が2回目に行われるときのxの値はbであり,プログラムが終了するまでに,行番号6の条件判定はc回行われる。
a に関する解答群
  • 乗算が除算よりも先に実行されるが,正しい値が出力される
  • 乗算が除算よりも先に実行され,正しい値が出力されない
  • 除算が乗算よりも先に実行されるが,正しい値が出力される
  • 除算が乗算よりも先に実行され,正しい値が出力されない
b,c に関する解答群
  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 9
解答選択欄
  • a:
  • b:
  • c:
  • a=
  • b=
  • c=

解説

この設問の解説はまだありません。

設問2

次の説明を読み,プログラム2中の に入れる正しい答えを,解答群の中から選べ。

 x/yが循環小数となるxとyを引数に指定して関数 printRational を実行した場合,ある桁以降で同じ数字の列を無限に繰り返し出力し続け,プログラムは終了しない。この繰り返し出力される同じ数字の列を循環節と呼ぶ。 最初に現れる循環節を"["と"]"で囲んで出力するプログラムを作成した。

〔プログラム2の説明〕
  • 関数 recurringDecimal の引数は,次のとおりである。ここで,引数に誤りはないものとする。
    x:
    分子を表す正の整数
    y:
    分母を表す正の整数
  • x/yの値によって次のように場合分けを行い,それぞれ別の様式の小数点数を出力する。
    1. 小数点以下100桁までに割り切れる場合
       小数点数をそのまま出力する。例えば,recurringDecimal(1,8)を実行した場合,次のように出力する。
      • 0.125
    2. 小数点以下100桁までの間に循環節がある場合
       最初の循環節の直前までの小数点数を出力し,その後に循環節の数字の列を"["と"]"で囲んで出力する。例えば,recurringDecimal(3,22)を実行した場合,次のように出力する。
      • 0.1[36]
    3. その他の場合
       小数点以下100桁までの小数点数を出力し,その後に"…"を続けて出力する。例えば,recurringDecimal(19,131)を実行した場合,次のように出力する。
      • 0.1450381679389312977099236641221374045801526717557251908396946564885496183206106870229007633587736259...
  • 関数 recurringDecimal は,x/yの値によって出力様式を決める部分と小数点数を出力する部分の二つに分かれている。
  • x/yの値によって出力様式を決める手順は,次のとおりである。
    1. 大きさ100の配列 xHistory と変数 ri を用意する。
    2. riを0とする。
    3. xHistory[ri]にxを格納し,riを1増やす。
    4. xを10倍した値をyで割った余りを新たにxとする。
    5. xが0になった場合,出力様式は(2)の①とする。
    6. xと同じ値をもつ xHistory[i](0≦i< ri) があるかどうかを調べる。
    7. 同じ値をもつものがある場合,出力様式は(2)の②とする。このとき,x/yの値の小数点以下第 i+1 位から第 ri 位までの数字の列が最初の循環節となる。
    8. 同じ値をもつものがない場合,riが100以上であれば出力様式は(2)の③とする。そうでなければ,③に戻る。
pm09_2.png
d,e に関する解答群
  • i == 0
  • i < DIGITMAX
  • i < ri
  • i >= 0
  • ri < DIGITMAX
  • ri > 0
  • startRepeat == -1
  • startRepeat >= 0
f に関する解答群
  • i == startRepeat
  • i == startRepeat + 1
  • i == startRepeat - 1
  • i < startRepeat
  • startRepeat < 0
  • startRepeat >= 0
g に関する解答群
  • x * 10 / y
  • xHistory[i] * 10 / y
  • xHistory[ri] * 10 / y
  • xHistory[startRepeat] * 10 / y
  • '0' + x * 10 / y
  • '0' + xHistory[i] * 10 / y
  • '0' + xHistory[ri] * 10 / y
  • '0' + xHistory[startRepeat] * 10 / y
解答選択欄
  • d:
  • e:
  • f:
  • g:
  • d=
  • e=
  • f=
  • g=

解説

この設問の解説はまだありません。

Pagetop