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

平成20年 春期 基本情報技術者 午後 問10
問10   C言語

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

〔プログラムの説明〕

(1) 正の有限小数又は循環小数を既約分数(分子と分母がともに整数で共通の約数を もたない分数)に変換するプログラムである。

(2) 有限小数とは,小数点以下のけた数が有限けたである小数をいう。一方,循環小数とは, 小数部の特定の位置以降は,同じ数字列が無限に繰り返される小数をいう。

 例えば, は 0.2142857142857… と表記され, 142857 が操り返されるので 循環小数である。この小数部における繰返しの部分を循環節と呼ぶ。

(3) プログラムでは,循環節を除く小数部のけた数がn,循環節のけた数がkの場合, その小数を10(n+k )倍したものから10n 倍したものを引くと, 整数となることを用いて既約分数への変換を行う。

の小数表記を図に示す。

 この場合,n=1,k=6なので,10 ( 1+6 )X−101 Xを計算すると 次のとおりになる。

 したがって, となる。 さらに,分子と分母の最大公約数で約分すると, 規約分数である X= を得る。

(4) プログラムヘの入力では,循環節は "{" と "}" で囲んで表す。例えば, 0.2142857142957… は 0.2{142857} と入力する。

(5) プログラムは,整数(小数点を含まない)を入力することもできる。

(6) プログラムの実行例を表に示す。

表 プログラムの実行例

 入力 出力
 32 = 32/1
 5.237 = 5237/1000
 0.875 = 7/8
 1.{3} = 4/3
 0.2{142857} = 3/14

(7) プログラム中で定義されている関数の仕様は,次のとおりである。

    void tofraction(Char *str);

引数:整数,有限小数,循環小数のいずれかを表現した文字列 str

機能:str を既約分数に変換して表示する。str に含まれる数字は9個以下とする。

また,誤った文字列が与えられることはない。

(8) 次の関数があらかじめ定義されているものとする。

@ long gcd(long a, long b);

  引数:自然数 a, b

  返却値:a と b の最大公約数

A long power10(int num);

  引数:0〜9の整数 num

  返却値:10 の num 乗

(9) 次のライブラリ関数を用いる。

  int isdigit(int c);

  返却値:文字 c が 10 進数字であれば0以外,そうでなければ0

〔プログラム〕

#include <stdio.h>
#include <ctype.h>

void tofraction(char *);
long power10(int);
long gcd(long, long);

void tofraction(char *str){

   long numerator = 0;     /* 分子 */
   long denominator;       /* 分母 */
   int flag = 0;
   int n = 0;              /* 循環節を除く小数部のけた数 */
   int k = 0;              /* 循環節のけた数 */
   long measure;           /* 求分子と分母の最大公約数 */

   while(  ){
      if(isdigit(*str)){   /* 10 進数字か? */
         numerator  ;
         numerator += *str - '0';
         if (flag == 1) n++;
         if (flag == 2) k++;
      }else if(*str == '.'){
         flag = 1;
      }else if(*str == '{'){
         flag = 2;
      }
       ;
   }

   if(flag  ) {       /* 有限小数又は整数の場合 */
      denominator = power10(n); 
   }else{                    /* 循環小数の場合 */
      denominator =  ;
      numerator  -=  ;
   }

   measure = gcd(numerator, denominator);
   numerator /= measure; 
   denominator /= measure;
   printf("= %ld/%ld\n", numerator, denominator);
}

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

a に関する解答群

ア *str != '\0'     イ *str != '0'

ウ str != '\0'      エ str != '0'

b に関する解答群

ア *= 10      イ += 10      ウ /= 10

エ -= 10      オ %= 10

c に関する解答群

ア (*str)++     イ (*str)--

ウ str++      エ str--

d に関する解答群

ア != 0       イ != 1       ウ != 2

エ == 0       オ == 1       カ == 2

e に関する解答群

ア power10(k)

イ power10(n) * power10(k)

ウ (power10(n) - 1) * power10(k)

エ power10(n) * (power10(k) - 1)

f に関する解答群

ア denominator / power10(n)

イ denominator / power10(k)

ウ numerator / power10(n)

エ numerator / power10(k)

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

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

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

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

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

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


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