我目前正在寒假做一个小项目,遇到了一些问题。
这是我正在使用的结构:
struct student{
string last_name;
string first_name;
double exams[NUM_EXAMS];
double average;
char letter_grade;
bool passed;};
我正在尝试按姓氏从 A 到 Z 进行字母排序。这是Alphabetize 函数以及它调用的交换函数:
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)
在Alphabetize函数中
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);
}