1
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>

using std::cin; using std::sort;
using std::cout; using std::streamsize;
using std::endl; using std::string;
using std::setprecision; using std::vector;
int main()
{

    cout << "Please enter your midterm and final exam grades: ";
    double midterm, final;
    cin >> midterm >> final;

    cout << "Enter all your homework grades, "
        "followed by end-of-file: ";
    vector<double> homework;
    double x;

    while (cin >> x)
        homework.push_back(x);

        int size = homework.size();
        if (size == 0) {
                    cout << endl << "You must enter your grades. "
                    "Please try again." << endl;
                    return 1;
                        }

    sort(homework.begin(), homework.end());

    int mid = size/2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2
            : homework[mid];

    streamsize prec = cout.precision();
    cout << "Your final grade is " << setprecision(3)
        << 0.2 * midterm + 0.4 * final + 0.4 * median
        << setprecision(prec) << endl;
return 0;
}

この例では、「streamsize」のポイントは何ですか? cout.precision() がこのように設定されているのはなぜですか? 次の行には「setprecision(3)」があり、最後にもう一度 setprecision(prec) があります。何故ですか?

streamsize prec = cout.precision();
cout << "Your final grade is " << setprecision(3)
    << 0.2 * midterm + 0.4 * final + 0.4 * median
    << setprecision(prec) << endl;
4

2 に答える 2

2

このコードは、 の精度をstd::cout元の値にリセットして、以降の の使用でstd::cout3 桁の精度が使用されないようにします。

と の間で例外がスローされた場合でも精度がリセットされるように、スコープ ガードを使用することをお勧めします。setprecision(3)setprecision(prec)

于 2013-10-05T13:54:17.697 に答える
1

その理由は、作成者が自分が出力する値の精度を設定したかったが、後でそれを使用するすべての人のためにストリームの既存の精度を保持したかったからです。

使用する理由streamsizeは簡単です: からの正確な型の戻り値ですcout.precision()

于 2013-10-05T13:54:22.173 に答える