0

得点の多い順に並べ替える選択並べ替えを実行しようとしています。3 つのカテゴリがあります。ゴール、アシスト、名前。ゴールで正しく並べ替えることができ、並べ替え後にプレーヤーのゴールとアシストを正しい場所に保つことができますが、並べ替え後に名前を正しい場所に移動しようとすると、名前の最初の文字しか移動しません。これが私のコードです。助けてくれてありがとう!

void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
{
    int lh, rh, i, tempG, tempA, tempN;
    for(lh = 0; lh < size; lh++)
    {
            rh = lh;
            for(i = lh; i < size; i++)
            {
                    if(goals[i] > goals[rh])
                    {
                            rh = i;
                    }
            tempG = goals[lh];
            tempA = assists[lh];
            tempN = *names[lh];
            goals[lh] = goals[rh];
            *names[lh] = *names[rh];
            assists[lh] = assists[rh];
            goals[rh] = tempG;
            *names[rh] = tempN;
            assists[rh] = tempA;
            }
    }

}

それが私の問題を示すのに役立つ場合、これが私の出力です..

Pre-Sort
Name                       Goals                   Assists
Redden                         2                         0
Berglund                       5                         2
Jackman                        2                         0
Stewart                        4                         0
Oshie                          3                         5
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Tarasenko                      5                         5
Post-Sort
Name                       Goals                   Assists
Tedden                         5                         5
Berglund                       5                         2
Sackman                        4                         0
Otewart                        3                         5
Rshie                          2                         0
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Jarasenko                      2                         0
4

2 に答える 2

0

あなたが持っている関連する文字コピーコードを見てください:

int tempN;
...
tempN = *names[lh];
*names[lh] = *names[rh];
*names[rh] = tempN;

あなたの "names" 変数はchar**(ポインターとして渡す配列としてインスタンス化されていると仮定しchar*ます) であるため、 を実行するときは*names[lh]、最初にインデックスを作成してat indexchar**を取得し、それを逆参照します。これは、インデックス lhの 0 番目の要素にインデックスを付けることと同じことです。これにより、最初の文字が得られます。名前に関連するすべての操作に対してこれを行うため、名前の最初の文字だけを移動するだけです。また、変数は int として宣言されていますが、これはおそらく意図したものではありません。char*lhchar*tempN

コピーしたい名前の長さをループし、文字ごとに割り当てることで(コードに最小限の変更を加えて)修正できます(現在行っているように最初の文字だけではなく)。または、strcpy (またはそのバリアントの 1 つ、参照についてはhttp://msdn.microsoft.com/en-us/library/kk6xf663%28v=vs.110%29.aspxを参照)を使用できます。

ちなみに、可能であれば、代わりに文字列を使用することをお勧めします。また、データをより緊密に結合すること、つまり、プレーヤーの {名前、ゴール、およびアシスト} を保持するプレーヤー構造体のリストを作成し、リストを再配置することを検討することもできますが、それは設計上の決定であると思います。君による。

于 2013-02-21T00:49:08.443 に答える
0
void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
{               /*  names is an array of pointers to char   */
    int lh, rh, i, tempG, tempA;
    char *tempN;     /* a pointer to one name */
    for(lh = 0; lh < size; lh++)
    {
            rh = lh;
            for(i = lh; i < size; i++)
            {
                    if(goals[i] > goals[rh])
                    {
                            rh = i;
                    }
            tempG = goals[lh];
            tempA = assists[lh];
            tempN = names[lh]; /* names[lh] is a pointer to the name in pos lh */
            goals[lh] = goals[rh];
            names[lh] = names[rh]; /* swap the pointers */
            assists[lh] = assists[rh];
            goals[rh] = tempG;
            names[rh] = tempN;  /* and not just the first letter */
            assists[rh] = tempA;
            }
    }

}
于 2013-02-21T00:54:01.740 に答える