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);
Другие вопросы по тегам