2015-01-04 35 views
0

我目前正在研究一個冬季休假的小項目,並遇到了一些問題。按字母順序排列結構數組的問題。作品從Z到A但不從A到Z

這裏是我的工作的結構:

struct student{ 
string last_name; 
string first_name; 
double exams[NUM_EXAMS]; 
double average; 
char letter_grade; 
bool passed;}; 

我想按姓氏從A到字母順序排列到Z.這裏是按字母順序排列的功能以及它調用的交換功能:

void alphabetize(student class_list[], int count) 
{ 
    for (int pass = 0; pass < count; pass++) 
     for (int x = 0; x < count - pass; x++) 
      if (class_list[x].last_name < class_list[x + 1].last_name) 
       swap(class_list, x); 
} 

void swap(student class_list[], int x) 
{ 
    student temp[MAX_STUDENTS]; 

    temp[x] = class_list[x]; 
    class_list[x] = class_list[x + 1]; 
    class_list[x + 1] = temp[x]; 
} 

這將運行完全正常並按字母順序相反的順序結構的陣列從Z到A

這裏是原來輸出未排序:

Jones  John 87 66 92 88 83.25 B Pass 
    Smith  Peter 55 66 63 58 60.5 D Pass 
    Quest  Nicole 79 89 99 98 91.25 A Pass 
     Wu   Li 98 99 100 91 97 A Pass 
    West  Vincent 80 80 88 89 84.25 B Pass 
McCartin  Susan 80 90 100 85 88.75 B Pass 
Ibrahima  Shuhuru 45 65 54 60 56 F Fail 
    Burns Antoinette 90 90 90 90 90 A Pass 
     Ng Lawrence 100 100 90 76 91.5 A Pass 
Ziggler  Bertha 65 55 58 58 59 F Fail 
Ionella  Jean 100 100 100 100 100 A Pass 
    Vogler  Samuel 40 50 60 70 55 F Fail 
    Perry   Jim 67 87 76 54 71 C Pass 

,這裏是在按字母順序排列功能使用

if (class_list[x].last_name < class_list[x + 1].last_name) 

的輸出。

Ziggler  Bertha 65 55 58 58 59 F Fail 
     Wu   Li 98 99 100 91 97 A Pass 
    West  Vincent 80 80 88 89 84.25 B Pass 
    Vogler  Samuel 40 50 60 70 55 F Fail 
    Smith  Peter 55 66 63 58 60.5 D Pass 
    Quest  Nicole 79 89 99 98 91.25 A Pass 
    Perry   Jim 67 87 76 54 71 C Pass 
     Ng Lawrence 100 100 90 76 91.5 A Pass 
McCartin  Susan 80 90 100 85 88.75 B Pass 
    Jones  John 87 66 92 88 83.25 B Pass 
Ionella  Jean 100 100 100 100 100 A Pass 
Ibrahima  Shuhuru 45 65 54 60 56 F Fail 
    Burns Antoinette 90 90 90 90 90 A Pass 

如果我在按字母順序排列功能切換

if (class_list[x].last_name < class_list[x + 1].last_name) 

if (class_list[x].last_name > class_list[x + 1].last_name) 

我認爲這將解決這個問題,並從A對數組進行排序到Z,而不是Z到A.這是我得到的輸出:

    -6.27744e+066-6.27744e+066-6.27744e+066-6.27744e+066-6.2 
7744e+066 ═ Pass 
    Burns Antoinette 90 90 90 90 90 A Pass 
Ibrahima  Shuhuru 45 65 54 60 56 F Fail 
Ionella  Jean 100 100 100 100 100 A Pass 
    Jones  John 87 66 92 88 83.25 B Pass 
McCartin  Susan 80 90 100 85 88.75 B Pass 
     Ng Lawrence 100 100 90 76 91.5 A Pass 
    Perry   Jim 67 87 76 54 71 C Pass 
    Quest  Nicole 79 89 99 98 91.25 A Pass 
    Smith  Peter 55 66 63 58 60.5 D Pass 
    Vogler  Samuel 40 50 60 70 55 F Fail 
    West  Vincent 80 80 88 89 84.25 B Pass 
     Wu   Li 98 99 100 91 97 A Pass 

正如你所看到的,我現在錯過了這個列表中的最後一名學生,而輸出結果正在吐出這些數字。我不明白爲什麼它在反向工作,我不確定如何解決這個問題。任何建議將不勝感激!

編輯:感謝Jarod42我制定瞭解決我的問題。這是x + 1出界的問題。下面是我用來解決問題的代碼。它適用於我有的輸入文件,但我不確定它是否可以與其他文件一起工作。如果有人看到它的問題,請讓我知道。

void alphabetize(student class_list[], int count) 
{ 
    for (int pass = 0; pass < count; pass++) 
     for (int x = 0; x < count - pass; x++) 
      if (class_list[x].last_name > class_list[x + 1].last_name) 
       if (count > x + 1) 
        swap(class_list, x); 
} 
+0

在參考文獻中[這些解釋](http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp)有助於解釋您對std :: string'比較的理解嗎? –

+2

您在該嵌套for循環中獲取索引超出範圍。無論您如何對數組進行排序,它都會導致未定義的行爲,因此在另一個嘗試中,即使從Z-A排序它們,您也可能會得到奇怪的輸出。 –

回答

2

有了:

for (int x = 0; x < count - pass; x++) 
    if (class_list[x].last_name < class_list[x + 1].last_name) 

你可能有越界訪問與x + 1pass == 0

隨着STL,你可能根本就:

std::sort(std::begin(students), std::end(students), 
      [](const student& lhs, const student& rhs) { 
       return lhs.last_name < rhs.last_name; // and > for the other order 
      }); 
+1

爲了好玩:** [甚至沒有使用std :: vector](http://coliru.stacked-crooked.com/a/bcb8299e1b23ac92)** :) – sehe

+0

感謝您的快速回答!我同意這很可能是'x + 1'的一個越界問題。我剛剛開始使用C++,並且我不熟悉STL。我真的很喜歡用我老師上個學期學過的東西來解決這個問題。有什麼方法可以使用交換功能和某種失控保護來解決越界問題嗎? –

0

如果你真的不想使用C++風格(載體STL,例如的std ::排序),嘗試修改該行:

for (int x = 0; x < count - pass; x++) 

到:

for (int x = 0; x < count - pass - 1; x++) 

你必須明白不變。您的排序算法保證在每個步驟通過,您有最後位置在您的數組排序。那就是-pass來自哪裏。 -1是因爲在這個for循環中的每一步,您將當前位置與下一個位置進行比較。

不過,我強烈建議你使用的std ::矢量的std ::排序,除非你想教自己的排序算法。

+0

感謝您的回覆。我試圖用課堂上教授的內容來完成這個課程,而不是太快。我們還沒有結束** std :: vector **或** std :: sort **,而且部分任務要求我們編寫自己的alphabetize函數。我用我在底部提出的解決方案編輯了我的主帖。我很想聽聽你的想法。 **編輯**:我嘗試使用您建議的計數 - 傳球 - 1的代碼,這也適用。我編輯進我的主文章中的代碼與您建議的代碼之間的穩定性有任何不同嗎? –

+0

在功能方面,不,沒有區別。這是因爲count> x + 1 <=> x