C++: что-то не так с моим аккумулятором
Я запускал этот код, но мне не удалось получить накопление удвоенных цифр.
#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;
}
Вот пример ввода / вывода:
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 для одного элемента, и он был выведен с дробной частью, так что, по крайней мере, я знаю, что что-то не так с аккумулятором. Я попытался привести несколько удвоенных частей операндов, но это не сработало.
2 ответа
accumulate
выводит его тип аккумулятора из аргумента начального значения. Пытаться:
double sum_mark = accumulate(student_marks.begin(), student_marks.end(), 0.0);
^^^
accumulate(student_marks.begin(), student_marks.end(), 0);
Потому что вы прошли в целое число 0
шаблон был создан с типом int
, в результате чего все перечисленные числа удваиваются до целых. Вам нужно пройти в double
для вашего начального значения. Как примечание, включите все предупреждения компилятора. Ваш компилятор должен предупредить вас об этом усечении.
accumulate(student_marks.begin(), student_marks.end(), 0.0);