Имея double july[30]
допустимые индексы от 0 до 29, но имея for(i=0;i<31;i++)
формы july[i]
доступ к индексам до 30 и формы july[i+1]
доступ к индексам до 31, с неопределеннымповедение.
Кроме того, внутри цикла могут быть установлены только записи от 0 до i , поэтому формы july[i+1]
в лучшем случае получают доступ к неинициализированной записи массива.Из-за того, что
if(july[i+1]<=july[i]){
b=july[i+1];
}
else if(july[i+1]>=july[i]){
c=july[i+1];
не позволяет найти мин / макс, вам нужно сравнить новую запись с b и c
Чуть выше я сказал, что может быть установлено , потому что вы не проверяете возвращаемое значение с помощью scanf , если не двойное представление, введите scanf останавливается окончательно, чтобы установить записи, в случае ошибки вам необходимо сбросить неверный ввод и повторить scanf .
В printf("%lf\n%lf",a,b,c);
вы хотите напечатать 3 значения (сумма, мин и макс), поэтому % lf отсутствует в формате.
Предложение может быть:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
double july[30];
double sum = 0;
double min = INFINITY;
double max = -INFINITY;
for (size_t i = 0; i != (sizeof(july) / sizeof(july[0])); ++i) {
printf("enter value #%zu : ", i);
while (scanf("%lf", &july[i]) != 1) {
fputs("invalid value, reenter it : ", stderr);
/* flush all the line */
int c;
while ((c = getchar()) != '\n') {
if (c == EOF) {
fputs("end of file, abort\n", stderr);
return -1;
}
}
}
sum += july[i];
if(july[i] < min)
min = july[i];
if (july[i] > max)
max = july[i];
}
printf("sum=%f\nmin=%f\nmax=%f\n", sum, min, max);
return 0;
}
Компиляция и выполнение
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
enter value #0 : 1
enter value #1 : 4
enter value #2 : 2
enter value #3 : 5
enter value #4 : 88
enter value #5 : 78
enter value #6 : 12
enter value #7 : 11
enter value #8 : 3
enter value #9 : -5
enter value #10 : 12
enter value #11 : 1
enter value #12 : 1
enter value #13 : 1
enter value #14 : 1
enter value #15 : 1
enter value #16 : 1
enter value #17 : 1
enter value #18 : 1
enter value #19 : 1
enter value #20 : 1
enter value #21 : 1
enter value #22 : 1
enter value #23 : 1
enter value #24 : aze
invalid value, reenter it : 1
enter value #25 : 1
enter value #26 : 1
enter value #27 : 1
enter value #28 : 1
enter value #29 : 1
sum=230.000000
min=-5.000000
max=88.000000
pi@raspberrypi:/tmp $
Как вы можете видеть
- Я называю переменную из их поведения, делая код более понятным, в отличие от a, b и c
- правильный тип для индекса:
size_t
- Я не использую буквенное целое число, но я использую sizeof в для следовать размеру of массив, даже если он изменен
- Я использую
INFINITY
для инициализации min , потому что любой действительный double ниже, чем его, и -INFINITY
для инициализации max потому что любое действительное double больше, чем оно - в случае неверного ввода на scanf Я сбрасываю всю строку перед тем, чтобы повторить, вытакже можно просто прочитать слово, если вы предпочитаете
- в printf , вам не нужна буква 'l', потому что printf не может получить float чьи преобразуются в double (но 'l' необходим в scanf для чтения double )