2015-05-04 2 views
-1

У меня есть небольшая проблема в моем коде для нахождения минимального значения из серии чисел. Когда я инициализирую min = 0, минимальное значение получается равным 0. Но когда я не инициализирую min, ответ правильный!как правильно инициализировать переменную min?

Почему это происходит? Xcode сообщает мне, что я должен инициализировать переменную min.

int a[20] = {0}; 
int max = 0; 
int min ; 
int sum = 0; 

srand((unsigned)time(NULL)); 

for (int i = 1; i <= 20; i++) { 
    a[i] = 100 + rand()%(200 - 100 + 1); 

    if (max < a[i]) { 
     max = a[i]; 
    } 
    printf("%d,%d\n",a[i],i); 

    if (min > a[i]) { 
     min = a[i]; 
    } 

    sum += a[i]; 
} 

printf("最大值:%d\n",max); 
printf("最小值:%d\n",min); 
printf("平均值:%d\n",sum/20); 
+1

Что вы думаете 'if (min> a [i])' делает? Просто инициализируйте 'min' в' INT_MAX' из 'limits.h', и все будет работать нормально. –

ответ

0

Предупреждение о компиляторе связано с тем, что доступ к значению неинициализированных переменных дает неопределенное поведение.

Общий метод, чтобы найти минимальное значение в массиве, чтобы инициализировать min быть первым элементом в массиве, а затем итерации последующих элементы

min = a[0]; 
for (i = 1; i < 20; ++i)  /* assume 20 elements */ 
    if (a[i] < min) min = a[i]; 

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

Другое, что нужно посмотреть, это то, что индексирование массива начинается с нуля. Таким образом, массив с 20 элементами (как в int a[20]) имеет действительные индексы 0 до 19. Выполнение цикла от 1 до 20 - и поэтому доступ к a[1] до a[20] дает неопределенное поведение, так как a[20] не существует.

+0

спасибо, сэр ... Могу ли я узнать ваш github? – rectinajh

+0

Не имеет github. – Peter

1

Вы должны инициализировать min с большим числом, иначе 0могуществе остаются наименьшим номером.

Вы можете инициализировать min в

int min = INT_MAX; 

INT_MAX это наибольшее значение, которое может быть проведен с помощью int (Должен добавить <limits.h> для INT_MAX).

Если вы не инициализировать min со значением, то она будет иметь неопределенное значение, которое может быть что угодно, поэтому всегда инициализировать локальные переменные перед использованием их значения ..

2

Если вы не инициализировать локальная переменная, ее значение равно неопределенным, и использование этого приведет к неопределенного поведения.

Что вы должны сделать, это инициализировать его большого значения, так же, как вы инициализировать max в небольшую значения. Используйте INT_MAX из файла заголовка <limits.h>.


Кроме того, если ваши переменные не могут быть отрицательными, вы, вероятно, следует использовать unsigned int и инициализировать min в UINT_MAX.

2

Когда я инициализировать min = 0, минимальное значение получается как 0.

потому что в этом случае if (min > a[i]) всегда ложный. Remeber, a[i] составляет> = 100.

Но когда я не инициализировать min, ответ правильный!

если вы не инициализировать локальную переменную, ее значение в indeterminent и содержит некоторое значение мусора (возможно большой один). Итак, , казалось бы,, ваша логика работает, и вы , видимо,, получая вправо ответ. Однако использование значений неинициализированной локальной переменной вызывает undefined behaviour.

Решение: Initialize min с наибольшим значением possbile, INT_MAX присутствует в файле заголовка.

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