0

バブルソートを実行する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();
}
4

2 に答える 2

6

コードは常にコピーして貼り付ける必要があります。あなたが提供したコードにはタイプミスがあり、コンパイルさえできません。

タイプミスを無視すると、次の 3 つの大きな問題があります。

  1. int i[3]要素は3つしかありません。i[3]は範囲外であり、アクセスすると予期しない結果が生じる可能性があります。

  2. 要素を交換するときは昇順で並べ替えますが、配列が完全に並べ替えられているかどうかを確認するときは降順を使用します。

  3. 厳密な不等式を使用して、配列がソートされているかどうかを確認しています。2 つの等しい要素がある場合、これは機能しません。

于 2012-06-13T18:33:15.480 に答える
0

このコードには 4 つのバグがあります。

1) 変数を として宣言していますi[3]。したがって、値は 3 つしかありません。からi[0]までi[2]。あなたは4つの値を読んでいます。配列は 3 つに制限されているため、4 つの値を読み取ることはできません。4 つの値を読み取りたい場合は、 に変更i[3]i[4]ます。

2) if(id[x]>i[x+]). この行には 2 つのバグがあります。ここでは を使用していますid[x]。として宣言された変数はありませんid[]。である必要がありますi[x]。2つ目はi[x+]。これは有効な宣言ではありません。である必要がありますi[x++]

3) 値を昇順でソートし、降順でチェックしています。したがって、これはバグになります。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+])

4gotoコードでステートメントを使用しています。しかしgoto、それは誤ったプログラミングの実践であるため、好まれません。goto は、関数呼び出しなしで実行プロセスを転送または元に戻します。これは、構造化プログラミングのアプローチに反します。gotoステートメントを好まないでください。for()2 つのループを使用すると、簡単に解決できます。

于 2012-06-14T05:25:15.413 に答える