我编写了一个C程序来进行冒泡排序但是在执行它时IDE会挂起。 为什么会这样?代码如下:
#include<stdio.h>
main()
{
int i[3],temp,n,x;
printf("Enter 4 positive numbers");
for(n=0;n<=3;n++)
{
scanf("%d",&i[n]);
}
recheck:
for(x=0;x<=2;x++)
{
if(id[x]>i[x+])
{
temp=i[x];
i[x]=i[x+1];
i[x+1]=temp;
}
}
if(i[0]>i[1]&&i[1]>i[2]&&i[2]>i[3])
{
for(n=0;n<=3;n++)
{
printf("%d",i[n]);
}
}
else
{
goto recheck;
}
getche();
}
答案 0 :(得分:6)
您应始终复制粘贴代码。您提供的代码有一些拼写错误,甚至无法编译。
忽略拼写错误有三个主要问题:
int i[3]
只有3个元素。 i[3]
超出范围,访问它可能会导致意外结果。
交换元素时,按升序排序,但在检查数组是否完全排序时,使用降序。
您正在使用严格不等式来检查数组是否已排序。如果有两个相同的元素,这将不起作用。
答案 1 :(得分:0)
此代码中有4个错误。
1)您将变量声明为i[3]
。所以它只需要三个值。从i[0]
到i[2]
。你正在读四个值。因此,当数组限制为三个时,它无法读取四个值。如果您希望阅读四个值,请将i[3]
更改为i[4]
。
2)if(id[x]>i[x+])
。这行有两个错误。在这里您使用的是id[x]
。但是没有变量声明为id[]
。它应该是i[x]
。第二个是i[x+]
。这不是一个有效的声明。它应该是i[x++]
。
3)您按升序对值进行排序,并按降序检查它们。
所以这导致了一个bug。改变if(i[0]>i[1]&&i[1]>i[2]&&i[2]>i[3])
使用if(i[0]<i[1]&&i[1]<i[2]&&i[2]<i[3])
或使用if(id[x]>i[x+])
更改if(id[x]<i[x+])
4您在代码中使用goto
语句。但是goto
没有被优先考虑,因为它是一种错误的编程习惯。 goto转发或恢复执行过程没有任何函数调用。这违反了结构化编程方法。所以不要更喜欢goto
陈述。
您可以使用两个for()
循环轻松解决问题。