以下の課題問題を解き、レポートとして提出せよ。
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"などを指定すること)
オプション課題
以下の改良を加えよ。