2012-03-03 9 views
0

私はC++の本を使っていますが、私は挑戦の質問の1つにちょっと残っています。私はポインタについて学んでいます。この特定の問題では、学生の名前の文字列とスコアの倍数で構造体の配列(ポインタを使用)をソートする必要があります。並べ替えの後、構造のデータメンバーはまだ明らかに一致する必要があります(つまり、正しい名前は依然としてスコアと一致する必要があります)。C++の選択構造の配列を並べ替える

これは私の問題がある場所です。これまでのところ、昇順でスコアを並べ替えるようにしていますが、その名前はすべて混乱します。なぜ私はまだ完全にポインタを理解するために働いていると、それらを使用する方法を把握することができませんでした。私はバブルの並べ替えを正しく行うことができますが、選択したソートではなく、スコアで名前を保持します。どんな助けでも大歓迎です。ここで

は、私が持っている機能は、選択ソートのためにある:

void selection_sort(Student *ptr, int size) // selection sort - having some problems 
{ 
    int start, 
    min_index, 
    min_value; 

    for (start = 0; start < (size - 1); start++) { 
    min_index = start; 
    min_value = (ptr+start)->score; 
    for (int index = start+1; index < size; index++) { 
     if ((ptr+index)->score < min_value) { 
    min_value = (ptr+index)->score; 
    min_index = index; 
     } 
    } 
    // the following line is where, i think, the problem is, but i haven't 
    // been able to figure out the solution, despite trying numerous approaches 
    *(ptr+min_index) = *(ptr+start); 
    (ptr+start)->score = min_value; 
    } 
} 

だから、私が持っているものです。私はまだアルゴリズムを分類するのには大したことではないし、これは私には全く新しいものなので、恐ろしいことではないと思う。もしこれらの分野に精通している人が私を正しい方向に向けることができたら、それはすばらしいでしょう。この行は、データを上書きするようだが、彼らがあるべきとしてそれらを交換しないで

*(ptr+min_index) = *(ptr+start); 

+0

C++では、関数の引数としてポインタとサイズを渡しません。代わりに、標準コンテナ(ベクトルなど)を使用し、開始イテレータと終了イテレータを渡します。 –

答えて

4

まず最初に1つのヒントをご紹介します。*(ptr+min_index)の代わりにptr[min_index]を使用すると、同じ効果が得られます。私はこのバージョンがもっと自然だと信じています。

第2 - あなたの問題。 ptr[min_index]ptr[start]を入れ替えるのではなく、一方の値を他方の値にコピーするのではなく、

*(ptr+min_index) = *(ptr+start); 
(ptr+start)->score = min_value; 

書き込みこの:

Student temp = ptr[start]; 
ptr[min_index] = ptr[start]; 
ptr[start] = temp; 

それとも、単にスワップ機能を使用してC++を使用している場合:

std::swap(ptr[min_index], ptr[start]); 

は、なぜあなたは何をするのではなく、交換する必要があるの代わりに、ある 現在やっている?まあ、ptr[min_index]のすべてのフィールドをptr [開始]に割り当てることができるようにする必要があります。

これが役に立ちます。 C++での

+0

ああ...それが値が上書きされた理由です。ありがとう。また、あなたは正しい、ptr [インデックス]ははるかに良く見えます。 – nik

1

私は

そしてもう一つ...あなたが標準ライブラリでのmemcpy関数を使うべきだと思います。

0

最初のレッスン:C++では、我々は演算子のオーバーロードを持っているので、このような行:あなたの学生クラスは彼のメンバーの属性のいずれかのポインタを持っている場合

*(ptr+min_index) = *(ptr+start); 

が意味を持つことができます。

スワップを使用する必要があります。