数组中的最小数字 [C]
smallest number in array [C]
我正在尝试查找数组的最小元素,我认为我做对了,但是我收到 0 作为我的最小元素,但是,我没有为我的数组的任何元素输入 0。
我知道这里有些事情做得不好,但这是我的全部代码,以便可重现和修复。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int main(){
char input[500];
printf("Enter a list of whitespace-separated real numbers terminated by EOF or 'end'.");
puts("");
printf("-----------------------------------------------------------------------------");
puts("");
gets(input);
int size = strlen(input);
int elements[size];
int i = 0;
char *p = strtok(input," ");
while( p != NULL)
{
elements[i++] = strtol(p, NULL, 10);
p = strtok(NULL," ");
}
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
elements[j] = numOfElements++;
}
//MIN ELEMENT
int min = INT_MAX;
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}
}
printf("-----------------------------------------------------------------------------\n");
printf("# of Elements: %d\n", numOfElements);
printf("Minimum: %d\n", min);
return 0;
}
结果:
Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements: 5
Minimum: 0
预期:
Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements: 5
Minimum: 1
原始发布摘录中的问题是此循环中的 else
:
int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}else{
min = elements[0];
}
}
考虑一下如果您在数组的中途会发生什么情况,并且您已更新 min
多次,但现在您遇到了一个 >= min
的元素。 else
会将 min
重置为 elements[0]
。直接删除:
int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}
}
顺便说一句,min
的任一初始化都可以。如果将其初始化为 elements[0]
,则可以在 k = 1
.
处开始循环
更新:以上答案基于最初发布的代码摘录。现在已经发布了更多代码(并且应用了我上面显示的修复),还有其他问题。
主要问题是 numOfElements
循环。这个循环完全擦除 elements
中的值,用 0
、1
、2
等替换它们。所以最小值确实是 0
。不清楚这个循环的意义是什么。我建议完全删除它。 elements
中的值的数量只是 i
,因此无需计算。如果您愿意,可以将 i
重命名为 numOfElements
。
其他问题:(1)代码需要包含<limits.h>
来定义INT_MAX
,以及(2)不应该使用gets
。将其更改为使用 fgets
或类似的东西。
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
elements[j] = numOfElements++;
}
这里有问题,当你得到这个数组的计数时你重置了元素数组
这里传过来的时候gdb乱七八糟
(gdb) p min
= 0
(gdb) p elem
elem-hash.h elements
(gdb) p elements
= {0, 1, 2, 3, 4, 5, -8096, 32767, 1431652112, 21845, 1431652512}
这里是对的
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
numOfElements++;
}
我正在尝试查找数组的最小元素,我认为我做对了,但是我收到 0 作为我的最小元素,但是,我没有为我的数组的任何元素输入 0。 我知道这里有些事情做得不好,但这是我的全部代码,以便可重现和修复。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int main(){
char input[500];
printf("Enter a list of whitespace-separated real numbers terminated by EOF or 'end'.");
puts("");
printf("-----------------------------------------------------------------------------");
puts("");
gets(input);
int size = strlen(input);
int elements[size];
int i = 0;
char *p = strtok(input," ");
while( p != NULL)
{
elements[i++] = strtol(p, NULL, 10);
p = strtok(NULL," ");
}
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
elements[j] = numOfElements++;
}
//MIN ELEMENT
int min = INT_MAX;
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}
}
printf("-----------------------------------------------------------------------------\n");
printf("# of Elements: %d\n", numOfElements);
printf("Minimum: %d\n", min);
return 0;
}
结果:
Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements: 5
Minimum: 0
预期:
Enter a list of whitespace-separated numbers.
-----------------------------------------------------------------------------
1 2 3 4 5
-----------------------------------------------------------------------------
# of Elements: 5
Minimum: 1
原始发布摘录中的问题是此循环中的 else
:
int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}else{
min = elements[0];
}
}
考虑一下如果您在数组的中途会发生什么情况,并且您已更新 min
多次,但现在您遇到了一个 >= min
的元素。 else
会将 min
重置为 elements[0]
。直接删除:
int min = INT_MAX; //I tried int min = elements[0] also
for(int k = 0; k < i; k++){
if(elements[k] < min){
min = elements[k];
}
}
顺便说一句,min
的任一初始化都可以。如果将其初始化为 elements[0]
,则可以在 k = 1
.
更新:以上答案基于最初发布的代码摘录。现在已经发布了更多代码(并且应用了我上面显示的修复),还有其他问题。
主要问题是 numOfElements
循环。这个循环完全擦除 elements
中的值,用 0
、1
、2
等替换它们。所以最小值确实是 0
。不清楚这个循环的意义是什么。我建议完全删除它。 elements
中的值的数量只是 i
,因此无需计算。如果您愿意,可以将 i
重命名为 numOfElements
。
其他问题:(1)代码需要包含<limits.h>
来定义INT_MAX
,以及(2)不应该使用gets
。将其更改为使用 fgets
或类似的东西。
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
elements[j] = numOfElements++;
}
这里有问题,当你得到这个数组的计数时你重置了元素数组
这里传过来的时候gdb乱七八糟
(gdb) p min
= 0
(gdb) p elem
elem-hash.h elements
(gdb) p elements
= {0, 1, 2, 3, 4, 5, -8096, 32767, 1431652112, 21845, 1431652512}
这里是对的
//NUM OF ELEMENTS
int numOfElements = 0;
for(int j = 0; j < i; j++){
numOfElements++;
}