这是一本教科书的示例。但是当我验证程序时,我发现书中的答案是错误的。我找不到正确的代码位置。 谢谢您的帮助!
我已经运行了代码。没有语法错误。
#include<stdio.h>
int main() {
int a[10], i, j, k, x;
printf("Input 10 numbers:\n");
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
printf("\n");
for (i = 0; i < 9; i++) {
k = i;
for (j = i + 1; j < 10; j++) {
if (a[j] < a[k]) {
k = j;
}
if (i != k) {
x = a[i];
a[i] = a[k];
a[k] = x;
}
}
}
printf("the sorted numbers:\n");
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
输出错误。
例如: 输入10个数字: 1 3 2 4 6 5 7 8 11 9
排序数字: 1 3 2 4 5 6 7 8 9 11
答案 0 :(得分:1)
问题是交换检查在错误的位置。它在内部循环中,但必须在内部循环之后(但在外部循环内部)。代码的排序部分应为:
for(i=0; i<9; i++){
k=i;
for(j=i+1; j<10; j++){
if(a[j]<a[k]){
k=j;
}
}
if(i!=k){
x=a[i];
a[i]=a[k];
a[k]=x;
}
}
请注意,if(i!=k)
检查现在位于内部循环之后,而不是内部循环。
使用以下输入:
Input 10 numbers:
1 3 2 4 6 5 7 8 11 9
它现在产生:
the sorted numbers:
1 2 3 4 5 6 7 8 9 11
答案 1 :(得分:0)
正确缩进代码后,很明显:if (i != k) {...
被放置在循环内。把它放高一点。
请采用良好的编码风格(有很多)并坚持下去。您将了解到正确缩进会发现多少错误。