【第1部】C言語(K&R検証)編
0024.小数点のある足し算を実装する
ソース紹介
CPPファイルに記述
#include <iostream>
#include <cctype>
#include <cstdio>
#include <string>
#include <iomanip>
using namespace std;
/*
文字列 sをdoubleに変換する
*/
double atof(char s[]) {
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); i++)
;
sign = (s[i] == '-') ? -1 : 1;
for (val = 0.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
}
if (s[i] == '.') {
i++;
}
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10.0;
}
return sign * val / power;
}
/*
小数点のある足し算を実装
*/
int main()
{
string str;
double sum = 0.0;
cout << fixed;
while (getline(cin, str)) {
sum += atof(str.c_str());
cout << setprecision(8) << sum << endl;
}
return 0;
}
出力
abc.txt
1234
1234.00000000
258.325
1492.32500000
-8524.02358
-7031.69858000
875421.00259
868389.30401000
^Z
サンプル説明
このサンプルは、数値を打ち込んでいくと、どんどん加算されていきます。
と
cout << setprecision(8) << sum << endl;
の記述により、小数点以下は
8桁に固定されています。
これを
C++オンリーで書いた場合以下のようになります。
ソース紹介
CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <string>
#include <iomanip>
using namespace std;
/*
小数点のある足し算を実装
*/
int main()
{
try {
string str;
double sum = 0.0;
cout << fixed;
while (getline(cin, str)) {
sum += stod(str);
cout << setprecision(8) << sum << endl;
}
}
catch (...) {
cout << "数字以外が入力された" << endl;
return -1;
}
return 0;
}
サンプル説明
stringを使って記述する場合、
stod()間数が使用できます。これは
stringからdoubleにする関数です。
K&Rでの記述
元になったのは
第4章:関数とプログラム構造に記述されています。
非整数を返す関数の説明のところです。