2014-02-16 4 views
3

В среднем я должен показать два десятичных знака. Прямо сейчас он округляется до ближайшего числа и показывает нули, когда в расчетной сумме есть разное количество для десятых и сотых. Наверное, что-то очень простое. Я думал, что объявление типа double будет позволять этому показывать правильный расчет.Расчетные средние значения C++

double CalculateAverageScore(int score[],int numPlayers, double averageScore) 
{ 
    double total = 0; 
    for (int i = 0; i < numPlayers; i++) 
    { 
     total += score[i]; 
    } 
    averageScore = total/numPlayers; 
    cout << fixed << showpoint << setprecision(2); 
    cout << "\nAverage Score: " << averageScore << endl; 
    return averageScore; 
} 
+2

Почему 'double averageScore' аргумент и переменная locale? –

+0

Удалите параметр 'double averageScore', поскольку вы возвращаете значение и не меняете аргумент. –

+0

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

ответ

1

Ваше решение должно работать так, как описано в вашем примере.

double total = 0; 
// ... 
averageScore = total/numPlayers; // Result of division is of type double. 

Здесь вы делящие double на int и результат должен быть double. Таким образом, никакого приведения не требуется.

Некоторые другие проблемы, хотя:

  • Вы объявившие параметр score в int*, который позволяет клиенту передавать нулевое значение (и не проверить это).
  • Вы указали параметр numPlayers как int, который является плохой практикой, вместо этого объявите std::size_t.
  • averageScore объявлен как параметр, но аргумент никогда не используется. Вместо этого объявите его как локальную переменную.
  • У вас отсутствует const-correctness, то есть параметры прохода как const, когда вы не собираетесь изменять.

Рассмотрите возможность передачи score в качестве ссылки на int[N], используя вместо этого параметр шаблона. Тогда вам не придется передавать длину массива в качестве второго параметра. Например .:

template <const std::size_t N> 
double average(const int (&score)[N]) { 
    return static_cast<double>(std::accumulate(std::begin(score), std::end(score), 0))/N; 
} 

и использовать в качестве:

int score[5] = { 2, 2, 3, 4, 5}; 
std::cout << std::fixed << std::showpoint << std::setprecision(2); 
std::cout << average(score) << std::endl; // Outputs 3.20 

Можно также использовать контейнер из стандартной библиотеки, а не встроенный в массив для score, например, std::array.

+0

1. Вот что я подумал. Я дважды проверил книгу, и имеет смысл, что бросок ее исправляет. В примере сказано, что без литой 1/2 равен 0, потому что даже в виде двойника десятичного числа нет. литой составляет 1.0/2, что равно .5. 2. – Zach707

+0

@ Zach707 Передача 'double' и' int' в двоичный оператор для деления будет способствовать 'int' в' double' и выполнять деление с плавающей запятой. Таким образом, '1.0/2' становится' 1.0/2.0', а результат равен '0,5'. – Snps

+0

@ Zach707 Я собрал вашу функцию, не затронутую GCC 4.8.2, и выведет среднее значение с двумя десятичными знаками. – Snps

5
averageScore = total/numPlayers; 
        ^^^ 
      integer division 

Для того, чтобы сохранить двойную точность:

averageScore = static_cast< double>(total)/numPlayers; 
        ^^^ 
       explicit cast 

Однако в случае, если вы Деление double с помощью int результата должен быть уже Необходимо double и не литой.


И так как вы объяснили вам интересно узнать о передовом опыте в настоящее время, находясь на вашей сцене в кривом программировании - вы должны действительно изменить функцию

double CalculateAverageScore(int score[],int numPlayers) 
{ 
    //... 
    double averageScore = total/numPlayers; 
    return averageScore; 
} 

, как вы ранее приняли averageScore в качестве аргумента но не используют его начальное значение:

double CalculateAverageScore(int score[],int numPlayers, double averageScore) 
{ 
    double total = 0.0; 
    //... 
    averageScore = total/numPlayers; 
       ^
      forget initial value, so it was useless 
      == no need to pass averageScore as argument 
    //.... 
} 
+0

Как явным образом спросил [tag: C++], я бы рекомендовал «double (total)» –

+0

. Было бы лучше использовать C static 'static_cast' в программе на C++. Кроме того, неопытные программисты могут подумать, что '(double)' cast применяется к частному, а не к дивиденду. –

+1

Выглядит как «total» уже «double». –

Смежные вопросы