我目前正在研究一個冬季休假的小項目,並遇到了一些問題。按字母順序排列結構數組的問題。作品從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);
}
在參考文獻中[這些解釋](http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp)有助於解釋您對std :: string'比較的理解嗎? –
您在該嵌套for循環中獲取索引超出範圍。無論您如何對數組進行排序,它都會導致未定義的行爲,因此在另一個嘗試中,即使從Z-A排序它們,您也可能會得到奇怪的輸出。 –