2015-03-17 5 views
-3

мое назначение:функции найти среднее и пиковое значение в C++

программы должны фигурировать 2 функции, один для вычисления среднего значения в массиве (возвращается результат в виде двойной) и один, чтобы найти пиковое значение в массиве (возвращающий результат как значение без знака). Массив (unsigned ints) и количество значений в массиве (unsigned int) должны передаваться через функции в качестве параметров.

Может кто-нибудь объяснить, как исправить мой код?

#include <iostream> 

    using namespace std; 

    #define SIZE 10 

    double findAverage (unsigned int); 

    unsigned findPeak (unsigned int); 

    unsigned numbers [SIZE] = {47, 1, 0, 1324, 99, 1000, 65536, 19, 0, 24000 }; 
    unsigned sum; 
    unsigned peak; 

    int main() 
    { 
     double average; 

     for (int i = 0 ; i < SIZE; i++) 
     { 
      sum += numbers[i]; 
     } 

     average = findAverage(numbers[SIZE]); 

     cout << "The average value is : " << average << endl; 

     peak = findPeak(numbers[SIZE]); 

     cout << "The peak value is : " << peak << endl; 
    } 
    double findAverage (unsigned sum) 
    { 
     double average; 
     average = sum/SIZE; 
     return average; 
    } 
    unsigned findPeak (unsigned int *) 
    { 
     for (int i = 0 ; i < SIZE; i++) 
     { 

      if (numbers[i] > peak) 
      { 
       peak = numbers[i]; 
      } 
     } 
    return peak; 
    } 
+1

_ «Может кто-то пожалуйста, объясните, как исправить мой код ??» _ Если вы сообщите нам, что именно должно быть исправлено с ним (ошибки компилятора, ошибки компоновщика, ошибки времени выполнения, неожиданный вывод). –

+0

'sum/SIZE' google integer math. – drescherjm

ответ

-1

Здесь бегущая версия:

#include <iostream> 

using namespace std; 

double findAverage (unsigned int *, unsigned int); 

unsigned int findPeak (unsigned int *, unsigned int); 

int main() 
{ 
    const int size = 10; 
    unsigned int numbers [] = {47, 1, 0, 1324, 99, 1000, 65536, 19, 0, 24000 }; 

    double average = findAverage(numbers, size); 

    cout << "The average value is : " << average << endl; 

    unsigned int peak = findPeak(numbers, size); 

    cout << "The peak value is : " << peak << endl; 
} 
double findAverage (unsigned int *numbers, unsigned int size) 
{ 
    unsigned int sum = 0; 
    for (int i = 0 ; i < size; i++) 
    { 
     sum += numbers[i]; 
    } 
    double average = (double)sum/size; 
    return average; 
} 
unsigned int findPeak (unsigned int *numbers, unsigned int size) 
{ 
    unsigned int peak = 0; 
    for (int i = 0 ; i < size; i++) 
    { 

     if (numbers[i] > peak) 
     { 
      peak = numbers[i]; 
     } 
    } 
    return peak; 
} 

Примечания: Вы должны избегать глобальных переменных. Я думаю, что расчет суммы имеет смысл в findAverage(). Затем нужно передать массив. Объявление findPeak пропустило *, оно не соответствовало определению. Чтобы передать массив, вы не должны указывать [...]. Просто передайте указатель на первый элемент, написав имя массива. average = sum/SIZE; сначала оценивает sum/SIZE, выполняя целочисленное деление, поэтому результат усекается. Вы должны наложить один из операндов, чтобы заставить двойное деление.

+0

Я собираюсь сделать здесь nitpick и сказать сумму, и пик должен быть инициализирован равным 0. Среднее значение может быть объявлено и определено в той же строке. Написание только «unsigned» - это плохая практика, и работает только здесь, потому что компилятор принимает int как тип. Кроме того, он не следовал шаблону, но он сказал, что его функции должны принимать размер массива, которого у них нет. – dwcanillas

+0

@ dwcanillas, вы правы, Amadeusz сделал редактирование для инициализации, и я отредактировал другое предложение сейчас – jhnnslschnr

0

Вы передаете числа [SIZE], чтобы найтиAverage вместо суммы.

В определении findPeak отсутствует имя параметра.

Кроме того, цифры [SIZE] нет в массиве, номера [SIZE-1] является последним элементом массива, так как индексация начинается с 0.

Это также не является хорошей идеей, чтобы указать размер массива и добавить элементы вручную (в {}). Вы можете легко ошибиться.

Кроме того, вы должны поместить весь код в функции. Поэтому в основном вы просто называете их. Не используйте также глобальные переменные, они здесь вообще не нужны и могут вызывать всевозможные проблемы в крупных проектах. Так что не привыкните к вредным привычкам. Просто поместите свои переменные в основное и передайте их в функции как параметры. (Вы на самом деле сделать это, но в настоящее время это лишнее, потому что, например, сумма глобальна.)

3

Из описания назначения:

Массив (без знака INTS) и число значений в массиве (unsigned int) должны передаваться через функции в качестве параметров.

А где есть два параметра в функциях?

double findAverage (unsigned int); 
    unsigned findPeak (unsigned int); 

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

double findAverage(const unsigned int a[], unsigned int n) 
    { 
     double sum = 0.0; 

     for (unsigned int i = 0; i < n; i++) sum += a[i]; 

     return n == 0 ? sum : sum/n; 
    } 

    unsigned int findPeak(const unsigned int a[], unsigned int n) 
    { 
     unsigned int max = 0; 

     for (unsigned int i = 1; i < n; i++) 
     { 
     if (a[max] < a[i]) max = i; 
     } 

     return max; 
    } 

Я определенная функции findPeak таким образом, что она retursn индекс максимального элемента. Вы можете переписать его так, чтобы он возвращал максимальный элемент.

Примите во внимание, что эти задачи могут быть выполнены с использованием стандартных алгоритмов std::accumulate и std::max_element заявленных соответственно в заголовках <numeric> и <algorithm>.

Также нет необходимости определять ваши переменные в глобальном названии имен. Их можно определить как локальные переменные main.

0

Ваши функции должны быть независимыми и многоразовые:

Они не должны полагаться на SIZE

Они не должны напрямую использовать массив: массив с размером должны быть параметры. Перейдите как const (нет необходимости изменять массив).

Ниже приведен пример:

double findAverage (const unsigned myArray[], int arraySize) 
{ 
    unsigned sum = 0; 
    double average = 0.0; 
    for (int i = 0 ; i < arraySize; i++) 
    { 
     sum += myArray[i]; 
    } 

    if (arraySize) average = sum/arraySize; 
    return average; 
} 

unsigned findPeak (const unsigned myArray[], int arraySize) 
{ 
    unsigned peak = 0; 
    for (int i = 0 ; i < arraySize; i++) 
    { 
     if (myArray[i] > peak) 
     { 
      peak = numbers[i]; 
     } 
    } 
    return peak; 
} 

Вызов:

average = findAverage(numbers, SIZE); 
peak = findPeak(numbers,SIZE); 
Смежные вопросы