Turbo C在执行C冒泡排序程序时挂起

时间:2012-06-13 18:07:26

标签: c sorting

我编写了一个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();
}

2 个答案:

答案 0 :(得分:6)

您应始终复制粘贴代码。您提供的代码有一些拼写错误,甚至无法编译。

忽略拼写错误有三个主要问题:

  1. int i[3]只有3个元素。 i[3]超出范围,访问它可能会导致意外结果。

  2. 交换元素时,按升序排序,但在检查数组是否完全排序时,使用降序。

  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()循环轻松解决问题。