0

构建一个程序,从用户那里读取一个包含 n 个元素的数组并找到具有最小值的元素。然后程序找到与该最小值相等的元素的数量。找到的具有最小值的元素以及与数组最小值相等的元素的数量应显示在屏幕上。

我写了这段代码:

#include <stdio.h>
int main() {
  int n = 1, min = 0, count = 0;
  int number[n];

  printf("Enter the size of array you want");
  scanf("%i", &n);

  int x;
  for (x = 0; x < n; x++) {
    int num;
    printf("\nEnter a Integer");
    scanf("%i", &num); 
    number[x] = num;
    if (number[x] < min)
      min = number[x];
  }
  int i;
  for (i = 0; i < n; i++) {
    if (min = number[i])
      count++; 
  }
  printf("%s%i", "\nThe smallest Integer you entered was ", min);
  printf("%s%i", "\nNumber of times you entered this Integer: ", count);

  return 0;
}

但问题是,当我运行它并添加整数时,它没有找到最小值以及正确重复的时间!

我哪里错了?

4

6 回答 6

5

假设您的编译器支持可变长度数组,您需要重新排序调用

int number[n];
scanf("%i", &n);

这样您就知道n在声明数组之前的值

scanf("%i", &n);
int number[n];

之后,您应该初始化min为更大的值以避免忽略所有正值

int min = INT_MAX;

(您需要包含<limits.h>的定义INT_MAX

最后,

if (min = number[i])

分配number[i]min. 用于==测试是否相等。

对于最后一点,您的编译器应该警告您“条件语句中的赋值”。如果没有,请确保您已启用警告(-Wall使用 gcc,/W4使用 MSVC)

于 2013-08-16T07:02:01.103 回答
2
for (i = 0; i < n; i++) {
    if (min = number[i])
      count++; 
  }

替换min = number[i]min == number[i]

于 2013-08-16T07:02:22.077 回答
2

您正在检查数组元素 <0 行:

if (number[x] < min/*as u specified min =0 before*/),...

所以最小值设置为零,实际上没有替换发生..

完整的解决方案:

#include <stdio.h>
int main() {
  int n = 1, min = 0, count = 0;
  int number[n];

  printf("Enter the size of array you want");
  scanf("%i", &n);

  int x,y;
  for (y = 0; y < n; y++)
  {
     printf("\nEnter a Integer");
     scanf("%i", &number[y]);
  } 
  min=number[0];
  for (x = 0; x < n; x++) {

    if (number[x] < min)
      min = number[x];
  }
  int i;
  for (i = 0; i < n; i++) {
    if (min == number[i])
      count++; 
  }
  printf("%s%i", "\nThe smallest Integer you entered was ", min);
  printf("%s%i", "\nNumber of times you entered this Integer: ", count);

  return 0;
}
于 2013-08-16T07:04:04.130 回答
1

1.只有用户输入数组大小后,才能确定数组编号的大小。由于数组大小不确定,应使用malloc动态分配数组。

2.您应该将 min 设置为数组的第一个元素。由于用户输入的最小值可能大于零,如果将最小值设置为零,那么即使最小值大于零,它也会返回零

3.你应该使用 == 而不是 = 来测试两个数字的相等性

4.最后,你应该使用free使内存可用,避免内存泄漏。

以下是完整的程序:

#include <stdio.h>
int main() {
int n = 1, min = 0, count = 0;
int* number;

printf("Enter the size of array you want");
scanf("%i", &n);
number = (int*)malloc(sizeof(int)*n);

int x;
for (x = 0; x < n; x++) {
    int num;
    printf("\nEnter a Integer");
    scanf("%i", &num); 
    number[x] = num;

    if( x == 0  || number[x] < min )
    min = number[x];
}
int i;
for (i = 0; i < n; i++) {
    if (min == number[i])
        count++; 
}
printf("%s%i", "\nThe smallest Integer you entered was ", min);
printf("%s%i", "\nNumber of times you entered this Integer: ", count);

free(number);
number = NULL;
return 0;

}

于 2013-08-16T07:09:53.100 回答
0

在您的代码中

if (min = number[i])

您将 number[i] 分配给 min。你应该写

if (min == number[i])

反而。

于 2013-08-16T07:05:04.517 回答
0

您的代码有几处错误。首先你定义了 array number[1]。其次min在初始化为min = 0.

我建议将数组定义为最大可能大小,例如number[100]. 并从用户那里读取输入的数量n,并且只使用n数组的第一个元素。对于第二个问题,将 min 定义为inttype 表示的最大数。

于 2013-08-16T07:16:55.073 回答