我对此代码有疑问:当我输入一个负值作为输入的第一个值时,程序将其替换为0.如果我在其他地方输入它,它可以正常工作。为什么会这样?我该如何解决?提前谢谢!
#include <stdio.h>
#define N 5
int main () {
float a[N], temp;
int i, j;
for (i=0; i<N; i++) {
scanf ("%f", &a[i]);
for (j=0; j<N; j++)
if (a[i]<a[j]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
for (i=0; i<N; i++)
printf ("%.2f ", a[i]);
return 0;
}
答案 0 :(得分:2)
你非常接近。正如其他人提到的那样,问题是a
未被初始化,所以在你填充它之前它已经充满了垃圾。但是如果你初始化它会充满零,这将搞乱排序。
诀窍是只排序到你填充的地方。那将是i
。
for (i=0; i < N; i++) {
scanf ("%f", &a[i]);
for (j=0; j < i; j++) {
if (a[i]<a[j]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
注意它是j < i
。它不是j <= i
因为将元素与自身进行比较没有意义
顺便说一句,这是一种低效的排序方式。它基本上是bubble sort,但与泡泡排序不同,如果数组已排序,它可以提前停止,你将始终进行快速变大的((n-1)*n)/2操作。在100个元素处,您正在进行4950次比较。
你最好阅读所有内容并整理整个列表。
答案 1 :(得分:0)
内部循环(具有索引j
的内部循环)完全未定义,因为它在a
中的所有值都已初始化之前迭代a
。
要解决此问题,您需要将数组的填充分隔为自己的循环,然后对其进行进一步处理。从行:
if (a[i]<a[j]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
我猜你正在尝试实施冒泡排序。这个 需要两个嵌套循环,但你现在的方式是错误的 - 数组填充需要独立,然后才开始排序,如前所述。