平成20年 春期 基本情報技術者 午後 問10
問10 C言語次のCプログラムの説明及びプログラムを読んで,設問に答えよ。 〔プログラムの説明〕 (1) 正の有限小数又は循環小数を既約分数(分子と分母がともに整数で共通の約数を もたない分数)に変換するプログラムである。 (2) 有限小数とは,小数点以下のけた数が有限けたである小数をいう。一方,循環小数とは, 小数部の特定の位置以降は,同じ数字列が無限に繰り返される小数をいう。 例えば, は 0.2142857142857… と表記され, 142857 が操り返されるので 循環小数である。この小数部における繰返しの部分を循環節と呼ぶ。 (3) プログラムでは,循環節を除く小数部のけた数がn,循環節のけた数がkの場合, その小数を10(n+k )倍したものから10n 倍したものを引くと, 整数となることを用いて既約分数への変換を行う。 の小数表記を図に示す。 (4) プログラムヘの入力では,循環節は "{" と "}" で囲んで表す。例えば, 0.2142857142957… は 0.2{142857} と入力する。 (5) プログラムは,整数(小数点を含まない)を入力することもできる。 (6) プログラムの実行例を表に示す。 表 プログラムの実行例
(7) プログラム中で定義されている関数の仕様は,次のとおりである。 void tofraction(Char *str);
機能:str を既約分数に変換して表示する。str に含まれる数字は9個以下とする。 また,誤った文字列が与えられることはない。
引数:自然数 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'
エ -= 10 オ %= 10 ウ str++ エ str--
エ == 0 オ == 1 カ == 2 イ power10(n) * power10(k) ウ (power10(n) - 1) * power10(k) エ power10(n) * (power10(k) - 1) イ denominator / power10(k) ウ numerator / power10(n) エ numerator / power10(k)
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ] | ||||||||||||