課題1: レポート課題1-1

以下の課題問題を解き、レポートとして提出せよ。

  1. 数字を整数値に変換するプログラムを 改良して、浮動小数点数も扱えるようにせよ。 例えば、以下のように動作するプログラムである。
    input number=3.141592     (斜字体部分はユーザーの入力)
    v=3.141592
    

    おおまかには、以下のようなアルゴリズムに従ったコードを書けば実現できる。

    整数部と小数部を別々に処理する
    
    最初は整数部の処理
    ・ 1文字読み込む
    ・ 数字かどうかを検査する
       数字ならば数値に変換し、足し合わせる
       (前の値を10倍して今の値を足し込む)
    これを "." (ピリオド、小数点)または数字以外の文字が現われるまで繰り返す
    
    "." (ピリオド、小数点)が現われた場合は小数部の処理に移る
    (そうでない場合は小数部はないので整数部だけでおわり)
    
    小数部の処理
    ・ 1文字読み込む
    ・ 数字かどうかを検査する
       数字ならば数値に変換し、足し合わせる
       (1文字進む毎に1桁ずつ小さい値にしながら値を足し込む)
    これを数字以外の文字が現われるまで繰り返す
    
    最後に整数部の値と小数部の値を足す
    

    プログラムへの入力として以下に示すような場合を試すこと。
    それぞれの結果について考察すること。 (何故そういう結果になったのかを説明する、等)

    入力文字列(条件)
    25(整数のみ)
    19.19825(浮動小数点数)
    0.11235(小数部分のみ)
    2816.(小数点より後の小数部がない)
    .314(小数点より前の整数部がない)
    1.2a3b5d(数字以外の文字を含む)
    3..221(連続した小数点を含む)
    9.2.3(2個所で小数点を含む)
    1   . 04(途中に空白を含む)

      注意:本課題プログラムについて、scanf()atof() などの同様の処理を行なうライブラリ関数を使用しないこと。

    補足

    C言語では整数と整数の演算の結果は整数になるため、 例えば、"1/10"と書いても 0.1という浮動小数点数にはならず、 0という整数値になる。
    (分母も分子も整数なので結果も整数になるため)

    この場合、"1.0/10"などのように、式の一部(あるいは全部)に 浮動小数点数を含めることで、0.1を表現できる。
    (もちろん直接 "0.1"と書いてもよい)

    double v = 1/10;            /* 0になる */
    double w = 1.0/10;          /* 0.1になる */
    

    同じことが整数の変数の場合にも起こるので注意すること。
    特に int型の変数同士の除算の場合に見落としがちである。

    補足2

    浮動小数点数を扱うため数値を格納する変数を int型から float型または double型にする。
    printf() を使って表示するときの書式に注意する。
    (書式指定子として浮動小数点数を表示する "%f"や "%g"などを指定すること)

    オプション課題

    以下の改良を加えよ。