【问题标题】:find the smallest number of n integers找到 n 个整数中的最小数目
【发布时间】:2015-06-07 22:53:43
【问题描述】:

C 编程初学者。 我不明白为什么这段代码不起作用。我得到的最小值和最大值的答案是 2686672 和 4525824。谁能解释一下吗?谢谢。

#include <stdio.h>

int main(void) {
    int array[20], i, x, y;
    int max, min;

    printf("Please enter number of integers to be checked\n");
    scanf("%d", &x);

    for (y = 0; y <= x; y++) {
        printf("Please enter your numbers\n");
        scanf("%d", &i);
    }

    min = array[0];
    max = array[0];

    for (y = 0; y <= x; y++) {
        if (array[i] < min) {
            min = array[i];
        } else if (array[i] > max) {
            max = array[i];
        }
    }

    printf("%d is the min and %d is the max", min, max);
}

【问题讨论】:

  • 始终检查 scanf() 和函数系列的返回值,以确保输入/转换操作成功。
  • 如果要检查的整数个数 > 20 会怎样?写入超过缓冲区的末尾。 IE。未定义的行为,可能导致任何事情,包括段错误事件。
  • 数字被输入到'i',它们应该被输入到array[y]
  • 关于这一行:'for (y = 0; y

标签: c integer min


【解决方案1】:

您在

的部分
for (y=0;y<=x;y++){
        printf ("Please enter your numbers\n");
        scanf ("%d",&i);
        }

有几个问题。首先,您每次都将值存储在 i 中;这将在下一次循环中被覆盖。其次,你想要

我想你想要:

for (y=0;y< x;y++){
        printf ("Please enter your numbers\n");
        scanf ("%d",&array[y]);
        }

【讨论】:

  • 次要:检查两端1 &lt;= x &lt;= 20.
  • @chux,这将不起作用,因为数组偏移量从 0 开始,并且 20 条目数组的最大偏移量为 19,因此建议的代码是正确的。尽管需要检查 scanf() 的返回值以确保成功输入了有效值。 (如果不成功,显示错误消息,减少循环计数器,以便再次尝试输入/转换。
  • @user3629249 注释“检查两端1 &lt;= x &lt;= 20”适用于整数个数x,而不适用于数组y 的索引array。正如@Foon 正确评论“检查用户是否要求 1 <= x,因为输入 0 或负整数会导致 UB。
【解决方案2】:

当您有循环要求输入数字时,您没有将读入 i 的值存储在数组中。

稍后,您将使用 i 索引数组,但循环计数器为 y - 所以 i 永远不会改变(也不一定是有效索引,因为它保存通过 scanf 读取的最后一个值)。

再次检查您的代码以确保您确实将读取的值存储到数组中,然后在计算最大值和最小值时检查您使用的数组索引。

【讨论】:

    【解决方案3】:

    您永远不会将数字存储到数组中。您覆盖用户在每次通过时输入的数字。因此,无论发生什么初始化为最大值和最小值,最终都会得到垃圾数据。

     for (y=0;y<=x;y++){
            printf ("Please enter your numbers\n");
            scanf ("%d",&i);
            array[y] = i;
            }
    

    至少这样,阵列位置中会有一些东西可以在稍后与您的 Max/Min Logic 进行比较。

    干杯。

    【讨论】:

      【解决方案4】:

      编写一个循环以在输入数组后将其转储出 - 以确保您得到正确的东西

      for(i = 0 ; i < x; i++)
      {
       printf("%d\n", array[i];
      }
      

      另外(正如其他人所说)您的循环边界需要是

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        相关资源
        最近更新 更多