gpt4 book ai didi

c++ - 按字母顺序排列结构数组的问题。从 Z 到 A 有效,但不能从 A 到 Z

转载 作者:行者123 更新时间:2023-11-28 02:35:06 32 4
gpt4 key购买 nike

我目前正在寒假做一个小项目,遇到了一些问题。

这是我正在使用的结构:

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)

在 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);
}

最佳答案

与:

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

pass == 0 时,您可能会使用 x + 1 进行越界访问。

使用 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
});

关于c++ - 按字母顺序排列结构数组的问题。从 Z 到 A 有效,但不能从 A 到 Z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27771163/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com