通常のインデックス表記を使用するのではなく、ポインター演算を使用して選択ソートを実行するのに問題があります。私がこれをしなければならない理由は、クラスの割り当てのためです。全体のポイントは、「詐欺師のインデックス」(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 の配列の選択ソート アルゴリズムを調べ、それを自分の要件に適合させようとしました。
- ポインター演算を使用する
- 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++;
}
}
のようなものをテストするのは安全ではないと感じたので、カウンターとしてi
andを使用しています。(とにかく NULL テストを使用する必要がありますか? 最後の要素の後のものが実際には NULL であることを保証できれば、私にはより「論理的に満足できる」ように思えます...) 追跡に使用するものに関係なく遅いポインターと速いポインターの場所、並べ替えに問題があります。j
walker->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 にあります。私は自分のロジックを見て、デバッグするためにさまざまなものを印刷しましたが、問題がどこにあるのかまだわかりません。自分のいまいましいコードを長い間見てきたので、それを見ることができないと思います。何か案は?