在C中找到最小值和最大值的问题

时间:2019-06-20 15:46:47

标签: c

在由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 按任意键继续 。 。 ”。

预先感谢您的帮助

3 个答案:

答案 0 :(得分:4)

具有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 不能接收转换为 double < / em>(但在 scanf 中必须有'l'才能读取 double

答案 1 :(得分:-2)

for (i = 0;i<30;i++) {
    scanf("%lf", &july[i]);
    a = a + july[i];
    if (i == 0)
        b = july[i];
    if (july[i] <= b)
            b = july[i];
    if (july[i] > c)
            c = july[i];
    }
如果需要,可以如上所述添加

scanf检查

答案 2 :(得分:-2)

<?php 
  define('WP_USE_THEMES', false);
  require('../blog/wp-load.php');
  $post_id = rand(1, last_post_id);
  query_posts('showposts='.$post_id.’);
?>

对于10个值(用户输入)。您可以根据需要更改Array大小及其参数!