【发布时间】:2015-01-04 22:38:26
【问题描述】:
我目前正在寒假做一个小项目,但遇到了一些问题。
这是我正在使用的结构:
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)
在Alphabetize函数中。
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);
}
【问题讨论】:
-
参考文献中的these explanations能否解释你对
std::string比较的理解? -
在嵌套的 for 循环中,您的索引超出了范围。无论您尝试如何对数组进行排序,它都会导致未定义的行为,因此在另一次尝试中,即使从 Z-A 对它们进行排序,您也可能会得到奇怪的输出。
标签: c++ arrays function struct alphabetized