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 个值(sum、min 和 max),因此格式中缺少 %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
- 我不使用文字整数,但我在 for 中使用 sizeof 来跟踪数组的大小,即使它已更改
- 我使用
INFINITY 初始化min,因为任何有效的double 都低于它,而-INFINITY 初始化max,因为任何有效的 double 大于它
- 如果在 scanf 上输入无效,我会刷新之前的所有行以重做,如果您愿意,也可以只读一个单词
- 在 printf 中,您不需要 'l',因为 printf 无法接收转换为 doublefloat /em>(但在 scanf 中需要 'l' 才能读取 double)