【问题标题】:Problem with finding minimum and maximum values in C在C中找到最小值和最大值的问题
【发布时间】:2019-06-20 15:46:47
【问题描述】:

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

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

#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 按任意键继续 。 . ." 没有别的了

提前感谢您的帮助

【问题讨论】:

  • for(i=0;i&lt;31;i++){ 将超出july[30] 的范围
  • abc 不是好的变量名。使用更具描述性的内容。
  • 另外,printf 只打印三个传递变量中的两个。
  • ALso july[i+1] 可以访问数组外或在最好的情况下访问非初始化值
  • 在学习时保持您的解决方案简单。在不同的循环中进行总和最小最大搜索。发生了什么会更清楚。

标签: c


【解决方案1】:

double july[30] 的有效索引从 0 到 29,但 for(i=0;i&lt;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返回的值,如果输入非双重表示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、bc
  • 相反
  • 索引的正确类型是size_t
  • 我不使用文字整数,但我在 for 中使用 sizeof 来跟踪数组的大小,即使它已更改
  • 我使用INFINITY 初始化min,因为任何有效的double 都低于它,而-INFINITY 初始化max,因为任何有效的 double 大于它
  • 如果在 scanf 上输入无效,我会刷新之前的所有行以重做,如果您愿意,也可以只读一个单词
  • printf 中,您不需要 'l',因为 printf 无法接收转换为 doublefloat /em>(但在 scanf 中需要 'l' 才能读取 double

【讨论】:

  • 从OP的问题陈述来看,数组大小应该是31。甚至不需要使用数组,一个简单的double 变量就足够了。 OP 可能会编写 2 个单独的循环:一个将值读入数组,第二个用于计算数组中值的总和、最小值和最大值,其中初始值更容易确定(使用数组的第一个元素)。
  • 另一个有趣的问题是 NaN 值是否应该产生 NaN 结果或被忽略...
  • @chqrlie 你好,cela faisait longtemps,tu as diminué ton activité ici,ceci dit moi aussi et plus ça va plus je pense carrément arrêter,j'ai un certain raz le bol de certaines pratiques .. .
  • Bonjour Bruno,l'activité est assez 变量,comme l'intérêt des questions :)
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多