C++サンプル集

【第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 << fixed;
 と
        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章:関数とプログラム構造に記述されています。非整数を返す関数の説明のところです。