2014-02-16 4 views
0

Мне нужно усреднить баллы из массива. Все, что я могу найти в книге, говорит, что так вы это делаете. В «+ =» есть ошибка: «Оператор« + »не соответствует этим операндам». Не знаю, что я делаю неправильно ...Средние баллы из массива

double calculateAverageScore(string score[],int numPlayers, double averageScore) 
{ 
double total; 
for (int i = 0; i < numPlayers; i++) 
{ 
    total += score[i]; 
} 
averageScore = total/numPlayers; 
    cout << "Average: " << averageScore << endl; 
} 
+0

Вы должны разобрать строки 'score' в парном разряде или плавает, чтобы использовать '+ ='. – Netwave

+0

Вы не можете добавить 'std :: string' в' double'. –

ответ

3

score является массивом std::string с. Вы не можете выполнять арифметические операции со строками. Для того, чтобы делать то, что вы хотите, вы должны преобразовать их в парном разряде перед:

total += std::stod(score[i]); 
+0

Кроме того, инициализация «total» до 0 требуется перед циклом for. –

1

Score представляет собой массив строк, вам нужно массив чисел (целые числа), вероятно,

0

Вы не можете добавлять элементы строки. Вы должны изменить тип своего параметра или попытаться преобразовать строку в double

+0

Возможно, это не требуется. Существуют способы преобразования строк в целые числа или двойные. Просто нужно проверить правильность укусов, если они являются цифрами. –

+0

Вы правы Я отредактировал его – Rooxo

1

Непонятно, почему вы держите оценки в массиве std::string. Вы не можете использовать объекты типа std::string в арифметических операциях. Вы должны преобразовать объект типа станда :: строк в некоторый арифметический тип, например, к int

Например

total += std::stoi(score[i]); 

Кроме того, ваша функции неопределенного поведения, потому что ничего не возвращает, а третий параметр функции не требуется. И вы забыли инициализировать переменную total.

Я бы записать функцию следующим образом

double calculateAverageScore(const string score[], int numPlayers) 
{ 
    double total = 0.0; 

    for (int i = 0; i < numPlayers; i++) 
    { 
     total += stoi(score[i]); 
    } 

    return ( numPlayers == 0 ? 0.0 : total/numPlayers); 
} 

и в основном она может быть вызвана как

cout << "Average: " << calculateAverageScore(YourArrayOfStrings, NumberOfElements) << endl; 

Вместо петли можно использовать стандартный алгоритм std::accumulate заявленную в заголовке <numeric>. Например

double total = std::accumulate(score, score + numPlayers, 0); 
0

Помимо double и std::string преобразования, если вы хотите более подробную статистику особенности о ваших данных, я бы recommed Boost Accumulator

#include <algorithm> 
#include <iostream> 
#include <vector> 

#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp> 
#include <boost/accumulators/statistics/mean.hpp> 
using namespace boost::accumulators; 

int main() 
{ 
    std::vector<double> data = {1.2, 2.3, 3.4, 4.5}; 

    accumulator_set<double, stats<tag::mean> > acc; 

    acc = std::for_each(data.begin(), data.end(), acc); 

    std::cout << "Mean: " << mean(acc) << std::endl; 
    return 0; 
} 
Смежные вопросы