2015-11-21 6 views
-2

Это оригинальный вопрос: 1. Пользователь вводит до 20 номеров, и эти числа будут храниться в массиве. Функции записи берутся в качестве входных данных и возвращают минимум, максимум и среднее значение. Используйте функции для вычисления min, max и average массива.Как вычислить min, max, среднее от массива?

Вот что у меня есть, но я не знаю, почему он не работает, никаких предложений?

#include <stdio.h> 


void arrmin(int a[],int num_elements); 
void arrmax(int a[], int num_elements); 
void arraver(int a[],int num_elements); 

int main(void) 
{ 
    int a[20],c,min,max; 
    float avg; 
    printf("Enter 20 numbers of elements in array\n"); 
for (c = 0; c < 20; c++) 
    scanf("%d", &a[c]); 

    min=max=a[0]; 
arrmax(a,a[20]); 
    printf("Maximum value is %d\n", max); 


arrmin(a,a[20]); 
    printf("Minimum value is %d\n", a[20]); 

    arraver(a,a[20]); 
    printf("Average value is %f\n", a[20]); 

    getch(); 
} 

void arrmax(int a[], int num_elements) 
{ 
    int i, max; 
    for (i=0; i<num_elements; i++) 
    { 
    if (a[i]>max) 
    { 
     max=a[i]; 
    } 
    } 

    return(max); 
} 
void arrmin(int a[], int num_elements) 
{ 
    int i, min; 
    for (i=0; i<num_elements; i++) 
    { 
    if (a[i]<min) 
    { 
     min=a[i]; 
    } 
    } 

    return(min); 
} 

void arraver(int a[], int num_elements) 

{ int sum,i; 
float avg; 
    sum=0; 
avg=0; 

    for (i=0; i<num_elements;i++) 
    { 
    sum=sum+a[i]; 
    avg=(float)sum/(i+1); 
     } 
return(avg); 
} 
+0

Compile со всеми предупреждениями и отладочной информации (например, 'НКУ -Wall -Wextra -g' если используя [GCC] (http://gcc.gnu.org/) ....), используйте отладчик ('gdb') и детектор утечки памяти ([valgrind] (http://valgrind.org/). ..) –

+0

И прочитал о неопределенном поведении и очень испугался от него –

ответ

0

Ваша логика выглядит неплохо, но есть несколько небольших проблем. Фиксированный код указан в нижней части ответа.

Вопросы:

  1. Pass 20 ко второму аргументу arrmax, arrmin и arraver

    • arrmax(a,a[20]); становится arrmax(a, 20).
  2. Вы, вероятно, хотите, чтобы arr... функции вернуть int или float, а не void

    • void arrmax(...) становится int arrmax(...)
    • void arraver(...) становится float arraver(...)
  3. Убедитесь, что на самом деле использовать значения Returne d ваши функции

    • arrmax(a,20); становится max = arrmax(a, 20); и т.д.
  4. Обязательно инициализировать max и min переменные в их соответствующих функций.

    • max = a[0];
    • min = a[0];
    • теперь мы можем перебирать от 1 до 19, а не от 0 до 19
  5. В min и aver принтеры должны печатать min и aver, а не a[20].

    • printf("Min is %d\n", a[20]); становится printf("Min is %d\n", min);
    • printf("Average is %f\n", a[20]); становится printf("Average is %f\n", aver);

Исправлен код:

#include <stdio.h> 

int arrmin(int a[],int num_elements); 
int arrmax(int a[], int num_elements); 
float arraver(int a[],int num_elements); 

int main(void) 
{ 
    int a[20],c,min,max; 
    float avg; 
    printf("Enter 20 numbers of elements in array\n"); 
    for (c = 0; c < 20; c++) 
     scanf("%d", &a[c]); 

    max = arrmax(a,20); 
    printf("Maximum value is %d\n", max); 

    min = arrmin(a,20); 
    printf("Minimum value is %d\n", min); 

    avg = arraver(a,20); 
    printf("Average value is %f\n", avg); 

    getch(); 
} 

int arrmax(int a[], int num_elements) 
{ 
    int i, max; 
    max = a[0]; 
    for (i=1; i<num_elements; i++) 
    { 
     if (a[i]>max) 
     { 
     max=a[i]; 
     } 
    } 

    return(max); 
} 

int arrmin(int a[], int num_elements) 
{ 
    int i, min; 
    min = a[0]; 
    for (i=1; i<num_elements; i++) 
    { 
     if (a[i]<min) 
     { 
     min=a[i]; 
     } 
    } 

    return(min); 
} 

float arraver(int a[], int num_elements) 
{ 
    int sum,i; 
    float avg; 
    sum=0; 
    avg=0; 

    for (i=0; i<num_elements;i++) 
    { 
     sum=sum+a[i]; 
     avg=(float)sum/(i+1); 
    } 
    return(avg); 
} 
+0

Спасибо за вашу помощь, мне просто интересно, почему нужно использовать max = INT_MIN; и min = INT_MAX; Я попытался запустить код без этих дополнений, и он работает – Monsterug

+0

@AlexisHolguin - Неинициализированные целые числа могут иметь любое значение. Представьте, что вы вызываете 'arrmax' с массивом чисел 1, 2, 3, 4, ... 20. Если вы используете' int max; ', max может иметь начальное значение' 1000'. Поскольку ни один из ваших номеров не превышает 1000, функция вернет неправильное значение 1000. Причина, по которой она работала в вашем случае, состоит в том, что * обычно * неинициализированные значения случайным образом получают значение 0, но это не гарантируется альтернатива устанавливает 'max' и' min' в 'a [0]' - я отредактировал свой ответ, чтобы предположить, что вместо этого. – AlexPogue

+0

Я вижу, я очень ценю вашу помощь. Я боролся с этим, но он, наконец, работает, спасибо yoyu очень – Monsterug