gpt4 book ai didi

c - 在 C 中查找最小值和最大值的问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:20 26 4
gpt4 key购买 nike

我在查找包含 31 个对象的数组中的最大值和最小值时遇到了问题。

我试图通过在 for 语句中放置 if 语句来找到最大值和最小值,如下所示。还有,我想求数组所有值的和,但是这三个目标最后都没有成功

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
double july[30], a, b, c;
a = 0;
b = 0;
c = 0;
int i;
for (i = 0; i < 31; i++) {
scanf("%lf", &july[i]);
a = a + july[i];
if (july[i + 1] <= july[i]) {
b = july[i + 1];
} else
if (july[i + 1] >= july[i]) {
c = july[i + 1];
}
}
printf("%lf\n%lf", a, b, c);
return 0;
}

当我运行代码时,我将所有值写入数组,但最终结果为空,输出为:“进程在 14.42 秒后退出,返回值 3221225477按任意键继续 。 . ”,除此之外

预先感谢您的帮助

最佳答案

拥有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];

不允许找到最小值/最大值,您需要将新条目与bc

进行比较

刚才我说可以设置因为你不检查scanf返回的值,如果一个非double表示是输入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、bc 相反
  • 索引的正确类型是size_t
  • 我不使用文字整数,但我在 for 中使用 sizeof 来跟随数组的大小,即使它发生变化也是如此
  • 我使用 INFINITY初始化 min 因为任何有效的 double 都低于它,并且 -INFINITY初始化 max 因为任何有效的 double 都大于它
  • 如果在 scanf 上输入无效,我会刷新之前的所有行以重做,如果你愿意,你也可以只读一个词
  • printf 中您不需要 'l' 因为 printf 无法接收转换为 double< 的 float/em>(但在 scanf 中读取 double 需要 'l')

关于c - 在 C 中查找最小值和最大值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56689634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com