【解決方法】選択ソートのこのコードが機能しないのはなぜですか?


#include<iostream>
using namespace std;


void PrintArray(int arr[], int size)
{
    for (int i = 0; i < size ; i++)
    {
        cout << arr[i] << " ";
    }
}
void selectionSort(int arr[],int n){
    for (int i = 0; i < n-1;i++){
        for (int j = i+1; i < n;j++){
            if(arr[i]>arr[j]){
                swap(arr[i], arr[j]);
            }
        }
    }
}
int main(){
    int arr[7] = {1,8,3,6,7,6,4};
    selectionSort(arr, 7);
    PrintArray(arr, 7);
    return 0;
}

私が試したこと:

選択ソートのコードを作成しましたが、必要な出力が提供されません。

解決策 1

コンパイルしたからといって、コードが正しいというわけではありません。 :笑う:
開発プロセスを電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえばドイツ語ではなく英語) で書いたことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階 (実際には第 4 段階か第 5 段階ですが、後で初期段階に戻ります) に入ります: テストとデバッグ。

まず、それが何をするのか、そしてそれがあなたが望んでいることとどう違うのかを見てみましょう。 これは、なぜそのような動作をしているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数値を入力させ、その数値を 2 倍にして答えを出力することを目的としている場合、入力/出力が次のようになったとします。

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題はそれを 2 倍にするビットにあることは明らかです。ビット自体に加算したり 2 を乗算したりするのではなく、自身を乗算して入力の 2 乗を返します。
それで、コードを見ると、それがここのどこかにあることが明らかです。

C#
private int Double(int value)
   {
   return value * value;
   }

何が問題なのかがわかったら、デバッガーを使用してその理由を調べてください。 メソッドの最初の行にブレークポイントを配置し、アプリを実行します。 ブレークポイントに到達すると、デバッガーは停止し、制御がユーザーに渡されます。 コードを 1 行ずつ実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (必要に応じて、コードを変更して再試行することもできます)。
コードを実行する前にコードの各行が何をすべきかを考え、それを「ステップオーバー」ボタンを使用して各行を順番に実行したときの実際の動作と比較してください。 期待通りの結果になりましたか? その場合は、次の行に進みます。
そうでない場合は、なぜそうではないのでしょうか? どう違うのでしょうか?
コードのどの部分に問題があるのか​​、また何が問題なのかを特定するのに役立つことを願っています。

ヒントを提供します。配列のインデックス値に注意してください。N 要素の配列のインデックスは 0 から (N – 1) までであることを覚えておいてください。 したがって、3 つの要素からなる配列には有効なインデックス 0、1、2 のみが含まれます。

これはスキルであり、開発だけでなく現実世界でも役立つため、伸ばす価値のあるスキルです。 すべてのスキルと同様、それは使用することでのみ向上します。

解決策 2

2 番目の for ステートメントにバグがあります。

変数に意味のある名前を付けると、この種のバグをはるかに簡単に見つけることができます。 i には lowerIndex を、j には upperIndex を使用することをお勧めします。そうすれば、この 2 つを誤って混同するのがはるかに困難になります。

コメント

タイトルとURLをコピーしました