基本情報技術者過去問題 平成23年秋期 午後問9 の出題の説明がおかしい?

基本情報技術者過去問題 平成23年秋期 午後問9 の出題の説明がおかしい?

現在、基本情報技術者試験を勉強中で、C言語とアルゴリズムを勉強中です。

解説本では、循環小数について説明していてこの部分の解説は正しいので、コード自体は正しい。
しかし有限小数の場合は、もしかすると私が間違っているのかもしれないけど、説明に少し実際のコードの出力と違う記載がありました。>>結論、私の間違いで、説明に間違いはありませんでした。

基本情報技術者問題 平成23年秋期 午後問9 ソフトウェア開発(C)

設問2で割り切れる場合
例えば出題文では
recurringDecimal(3,22)は
0.125
と出力されるとありますが、

コードは、
if(startRepeat >=0){
putchar(‘]’)
}else{
(略)
}
となっていて、startRepeatは正になるので、
0.125[0]となるはず。
つまり、[0]が説明に必要だと思います。ちょっとしたことなんですが、これがあるのと無いのとでは、コードの解釈が間違っていると思って、正解のはずが間違いだと思って正しい解答を考えなくてはなりません。

多分、循環小数の場合の対応では必要なコードなので、全体的には正しいのかもしれませんが、説明にカッコが無いので、その部分で戸惑ってしまいました。
循環小数について考えれば、このコードは間違いではないのでしょうが、出力が違うので気になって仕方なかった。
後日また、解いてみて解説通りだったら、間違った部分を記載して訂正しておく。
>>結論、私の間違いで、説明に間違いはありませんでした。

実際のC言語のソースコード

XCODEでC言語プロジェクトで組んで実行みると、なんと0.125と出力された。自分の間違った予想では、0.125[0]だと思ってた。
とういことは、やはり問題文は正しいみたい。どうやら私の勘違い。いったいどこを間違っているのか?
下のプログラムを実行したときの出力

Hello, World!
0.125
Program ended with exit code: 0

//
//  main.c
//  h23A09
//
//  Created by 間世田 on 2017/05/03.
//  Copyright © 2017年 maseda. All rights reserved.
//

#include <stdio.h>

void recurringDecimal(int x,int y);

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    recurringDecimal(1, 8);
    return 0;
}
#define DIGITAMAX 100

void recurringDecimal(int x, int y){
    int xHistory[DIGITAMAX];
    int i,ri = 0,startRepeat = -1;
    while((x>0) && (ri < DIGITAMAX) && (startRepeat == -1) ){
        xHistory[ri] = x;
        ri++;
        x = x*10 % y;
        for(i=0;i<ri;i++){
            if(xHistory[i]==x){
                startRepeat = i;
            }
        }
    }
    putchar('0');
    putchar('.');
    for(i=0;i<ri;i++){
        if(i == startRepeat){
            putchar('[');
        }
        putchar('0' + xHistory[i]*10/y);//文字列0はASCIIコードで42になり、Int型と加算するとその数字の文字コードになる
    }
    if(startRepeat >=0 ){
        putchar(']');
    }else{
        if((ri>=DIGITAMAX) && (x>0)){
            putchar('.');
            putchar('.');
            putchar('.');
        }
    }
    putchar('\n');
}

間違った原因がわかった

while文ではX>0となっています。ここです。X=0のときにWhileから抜けるのですが、ここを見落としていました。
いやーここだったとは気づかない。
つまり、Xが0になったときに、if xHistory[i] == x となると私が思い込んで、xHistory[i]に0を代入してしまい、startRepeatにi=3を与えてしまったのです。startRepeatは正になるとWhile文から抜けますし、正になると[]が出力されますが、正しくコードを解釈すれば有限小数では出力されません。これは説明文が正しい。(当たり前ですが。)
 本来なら、startRepeatは-1のままで、X=0なので、この条件でWhile文を抜けるはずが、startRepeatにi=3を与えることで、WHILE文を抜ける条件だと勘違いしていました。
そのため、startRepeatが正になって、[]のカッコが出力されると勘違いしていました。
2,3時間何度も同じところを間違っているので、出力したメモを何度も書いていました。

問題を解くときの結論

思い込まずに、きちんとコードを確認しよう。
複数の条件のときは注意しよう。
理解できないときは、実際のコードをC言語のコンパイラで実行しよう

こちらの記事もどうぞ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です