0

我一直在运行这段代码,但我无法获得双倍数字的累积。

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int main(){
    vector<double> student_marks;
    size_t num_students;

    cout<<"Number of students:";
    cin>>num_students;

    student_marks.resize(num_students);

    for(size_t i=0;i<student_marks.size();i++){
        cout<<"Enter mark of student #"<<i+1<<":";
        cin>>student_marks[i];
    }

    double sum_mark = accumulate(student_marks.begin(), student_marks.end(), 0);

    cout<<"Total mark:"<<sum_mark<<endl
    <<"Average mark:"<<sum_mark/student_marks.size()<<endl;

    return 0;
}

以下是 I/O 的示例:

Number of students:3
Enter mark of student #1:1.8
Enter mark of student #2:2.3
Enter mark of student #3:3.4
Total mark:6
Average mark:2

这里的总分应该是7.5,但是编译器完全忽略了小数部分,只计算整数部分,就好像我输入的数字是整数一样。我认为累积基本上支持任何类型的数字,但似乎我无法告诉它将数字累积为两倍。我在单个元素上运行了一个cout,它与小数部分一起输出,所以至少我知道累加器有问题。我尝试将操作数的几个部分转换为加倍,但没有奏效。

4

2 回答 2

2

accumulate从初始值参数推导出其累加器类型。尝试:

double sum_mark = accumulate(student_marks.begin(), student_marks.end(), 0.0);
                                                                         ^^^
于 2014-07-18T15:33:49.387 回答
1
accumulate(student_marks.begin(), student_marks.end(), 0);

因为您传入了 integer 0,所以模板被实例化为 type int,导致所有枚举的双精度都被截断为整数。您需要传入 adouble作为初始值。作为旁注,打开所有编译器警告。你的编译器应该警告你这个截断。

accumulate(student_marks.begin(), student_marks.end(), 0.0);
于 2014-07-18T15:33:49.500 回答