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

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

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

〔プログラム1の説明〕

 二つの整数 x, y ( 0 < x < y )を受け取り,x / y の値を 10 進小数として出力するプログラムである。

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

    x: 分子を表す正の整数
    y: 分母を表す正の整数

 ただし,x / y は有限小数(小数点以下の桁数が有限桁である小数)であり,循環小数(小数部のある桁以降で, 同じ数字の列が無限に繰り返される小数)ではないものとする。

(2) 次の手順で x / y を 10 進小数として出力する。

   @ “0.”を出力する。

   A x が 0 になるまで,次のB,Cを繰り返す。

   B x を 10 倍した値を y で割った商を出力する。

   C x を 10 倍した値を y で割った余りを新たに x とする。

〔プログラム1〕

(行番号)
 1  #include <stdio.h>

 2  void printRational(int, int);

 3  void printRational(int x, int y) {
 4      putchar('0');
 5      putchar('.');
 6      while (x > 0) {
 7          putchar('0' + (x * 10 / y));
 8          x = x * 10 % y;
 9      }
10      putchar('\n');
11  }

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

(1) プログラム1の行番号7では小数点以下の各桁の数字を出力している。 この行を“putchar('0' + (x / y + 10));”に変えると

(2) printRational(3,8) を実行した場合,行番号6の条件判定が2回目に行われるときの x の値は であり,プログラムが終了するまでに,行番号6の条件判定は 回行われる。

a に関する解答群

ア 乗算が除算よりも先に実行されるが,正しい値が出力される

イ 乗算が除算よりも先に実行され,正しい値が出力されない

ウ 除算が乗算よりも先に実行されるが,正しい値が出力される

エ 除算が乗算よりも先に実行され,正しい値が出力されない

b,c に関する解答群

ア 0      イ 1      ウ 2      エ 3      オ 4

カ 5      キ 6      ク 7      ケ 8      コ 9

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

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

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

基本情報技術者試験


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

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

〔プログラム2の説明〕

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

   x: 分子を表す正の整数
   y: 分母を表す正の整数
(2) x / y の値によって次のように場合分けを行い,それぞれ別の様式の小数点数を出力する。

 @ 小数点以下 100 桁までに割り切れる場合

  小数点数をそのまま出力する。例えば,recurringDecimal(1, 8) を実行した場合,次のように出力する。

    0.125
 A 小数点以下 100 桁までの間に循環節がある場合

  最初の循環節の直前までの小数点数を出力し,その後に循環節の数字の列を“ [ ”と“ ] ”で囲んで出力する。 例えば,recurringDecimal(3,22) を実行した場合,次のように出力する。

    0.1[36]

 B その他の場合

  小数点以下 100 桁までの小数点数を出力し,その後に“…”を続けて出力する。例えば, recurringDecimal(19,131) を実行した場合,次のように出力する。

        0.1450381679389312977099236641221374045801526717557251908
        396946564885496183206106870229007633587736259...

(3) 関数 recurringDecimal は,x / y の値によって出力様式を決める部分と小数点数を出力する部分の 二つに分かれている。

(4) x / y の値によって出力様式を決める手順は,次のとおりである。

 @ 大きさ 100 の配列 xHistory と変数 ri を用意する。

 A ri を 0 とする。

 B xHistory[ri] に x を格納し,ri を1増やす。

 C x を 10 倍した値を y で割った余りを新たに x とする。

 D x が 0 になった場合,出力様式は (2) の@とする。

 E x と同じ値をもつ xHistory[i] ( 0 ≦ i < ri ) があるかどうかを調べる。

 F 同じ値をもつものがある場合,出力様式は (2) のAとする。このとき,x / y の値の 小数点以下第 i+1 位から第 ri 位までの数字の列が最初の循環節となる。

 G 同じ値をもつものがない場合,ri が 100 以上であれば出力様式は (2) の Bとする。 そうでなければ,Bに戻る。

〔プログラム2〕

#include <stdio.h>

#define DIGITMAX 100 /* 出力する小数点以下の最大桁数 */

void recurringDecimal(int, int);

void recurringDecimal(int x, int y) {
    int xHistory[DIGITMAX];
    int i, ri = 0, startRepeat = -1;

    /* 出力様式の決定 */
    while ((x > 0) && (ri < DIGITMAX) && (  )) {
        xHistory[ri] = x;
        ri++;
        x = x * 10 % y;
        for (i = 0;  ; i++) {
            if (xHistory[i] == x) {
                startRepeat = i;
            }
        }
    }
    /* 小数点数の出力 */
    putchar('0');
    putchar('.');
    for (i = 0; i < ri; i++) {
        if(  ) {
            putchar('[');
        }
        putchar(  );
    }
    if (startRepeat >= 0){
        putchar(']');
    } else {
        if ((ri >= DIGITMAX) && ( x > 0)){
            putchar('.');
            putchar('.');
            putchar('.');
        }
    }
    putchar('\n');
}

d,e に関する解答群

ア i == 0        イ i < DIGITMAX

ウ i < ri       エ i >= 0

オ ri < DIGITMAX      カ ri > 0

キ startRepeat == -1   ク startRepeat >= 0

ケ startRepeat > i

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 ←クリックすると正解が表示されます


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