2

通常のインデックス表記を使用するのではなく、ポインター演算を使用して選択ソートを実行するのに問題があります。私がこれをしなければならない理由は、クラスの割り当てのためです。全体のポイントは、「詐欺師のインデックス」(pointer + i)なしでポインター演算を使用することを学ぶことです。ここiで、インデックスは次のようになりますarray[i]

sort 関数を呼び出す前に、1000 個の構造体の配列を割り当てます。typedef は次のとおりです。

typedef struct
{
    char* name;
    char* art;
    int rating;
} ENTRY;

アイデアは、ASCII アートを含むファイルを読み取ることです。各芸術作品は、独自の構造体にスローされます。テキスト ファイルの 1 つの「エントリ」を次に示します。

Jean Pajerek
  |\_____/|
  |[o] [o]|
  |   V   |
  |       |
 -ooo---ooo-
# 4

フクロウです!しかし、私がする必要があるのは、構造体の適切なフィールドに名前、アート、評価を格納することです。私の読み取り機能は完全に機能します。1000 個の構造体の配列を割り当ててから、テキスト ファイルをそこに読み込みます。画像は 18 枚程度しかありませんので、ご安心ください。

それでは、私の選択ソート機能について話しましょう。まず、インデックス表記を使用して int の配列の選択ソート アルゴリズムを調べ、それを自分の要件に適合させようとしました。

  1. ポインター演算を使用する
  2. int の代わりに構造体を移動する

コードは次のとおりです。

void sort(ENTRY* aryptr, int* counter)
{
    ENTRY* slow;
    ENTRY* fast;
    ENTRY* lastmin;
    ENTRY min;
    ENTRY temp;
    int i;
    int j;

    printf("\n\n...SORTING\n\n\n");

    slow = aryptr;

    for (i=0; i < *counter - 2; i++)
    {
        min = *slow;        

        fast = slow + 1;
        for (j = i + 1; j < *counter-1; j++)
        {
            if (strcmp(fast->name, min.name) < 0 )
            {
                min = *fast;
                lastmin = fast;
            }
            fast++;           
        }

        temp = *slow;
        *slow = min;
        *lastmin = temp;

   slow++;      

    }
}

のようなものをテストするのは安全ではないと感じたので、カウンターとしてiandを使用しています。(とにかく NULL テストを使用する必要がありますか? 最後の要素の後のものが実際には NULL であることを保証できれば、私にはより「論理的に満足できる」ように思えます...) 追跡に使用するものに関係なく遅いポインターと速いポインターの場所、並べ替えに問題があります。jwalker->name != NULL

問題は次のようなものです。この art.txt ファイルには、さまざまな芸術作品がたくさん含まれています。一部の作品は同じ人物によるものです。

VOLDEMORT
(art is hippogryph)
# 1
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3   
TONY STARK
(art is blob)
#1
EDDARD STARK
(art is dragon)
#5

並べ替えが完了すると、同じ作者の作品が配列内で隣り合わせになります。同一人物による作品の順番は問いません。コードで並べ替えたとします。次のような結果が得られます。

EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3      
EDDARD STARK
(art is dragon)
#5
EDDARD STARK
(art is turtle)
# 4
TONY STARK
(art is blob)
#1
VOLDEMORT
(art is hippogryph)
# 1

EDDARD STARK によってソートされたアートのブロックには、そのブロックの FIRST PIECE OF ART のコピーが END にあります。私は自分のロジックを見て、デバッグするためにさまざまなものを印刷しましたが、問題がどこにあるのかまだわかりません。自分のいまいましいコードを長い間見てきたので、それを見ることができないと思います。何か案は?

4

1 に答える 1

1
void sort(ENTRY* aryptr, int* counter)
{
    ENTRY* slow;
    ENTRY* fast;
    ENTRY* lastmin;
    ENTRY min;
    ENTRY temp;
    int i;
    int j;

    printf("\n\n...SORTING\n\n\n");

    slow = aryptr;

    for (i=0; i < *counter - 2; i++)
    {
        min = *slow;        

        fast = slow + 1;
        for (j = i + 1; j < *counter-1; j++)
        {
            if (strcmp(fast->name, min.name) < 0 )//comparison
            {
                min = *fast;//save data to min
                lastmin = fast;//save position to last min
            }
            fast++;//increment index
        }

        //problematic, always swapping. need if statement. Lastmin
        //May go unassigned, then "slow" will be duplicated to "lastmin"
        temp = *slow;
        *slow = min;
        *lastmin = temp;//at first run through

   slow++;      //increment index

    }
}
于 2012-04-26T07:38:47.877 に答える