Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按字母顺序排列结构数组的问题。从Z到A工作,但不是从A到Z_C++_Arrays_Function_Struct_Alphabetized - Fatal编程技术网

C++ 按字母顺序排列结构数组的问题。从Z到A工作,但不是从A到Z

C++ 按字母顺序排列结构数组的问题。从Z到A工作,但不是从A到Z,c++,arrays,function,struct,alphabetized,C++,Arrays,Function,Struct,Alphabetized,我目前正在寒假期间做一个小项目,遇到了一些问题 下面是我正在使用的结构: 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

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

下面是我正在使用的结构:

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];
}
下面是使用

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);
}
void字母顺序(学生班级列表[],整数计数)
{
for(int pass=0;pass类列表[x+1]。姓氏)
如果(计数>x+1)
交换(类别列表,x);
}
带有:

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

如果您真的不想使用C++风格(<强>向量和<强> STL,例如STD::Road),请尝试修改这行:

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

for(int x=0;x
你必须理解不变量。您的排序算法保证在每一步通过,您都会对数组中的最后一个通过位置进行排序。这就是通行证的来源。这个-1是因为在这个for循环中的每一步,您都将当前位置与下一个位置进行比较


但是,我强烈建议您使用std::vectorstd::sort,除非您试图自学排序算法。

参考资料中是否有助于解释您对
std::string
比较的理解?在嵌套for循环中,索引超出了范围。无论您如何尝试对数组排序,它都会导致未定义的行为,因此在另一次尝试中,即使从Z-A对它们进行排序,您也可能会得到奇怪的输出!我同意这很可能是“x+1”的越界问题。我刚开始用C++,我不熟悉STL。我真的很想用我老师上学期所讲的内容来处理这个问题。有什么方法可以让我使用交换函数和某种类型的故障保护来解决越界问题吗?谢谢你的回答。我正试图用课堂上教给我的东西来完成这个项目,不要走得太快。我们还没有讨论过std::vector或std::sort,部分赋值要求我们编写自己的字母排序函数。我用我在底部提出的解决方案编辑了我的主要帖子。我很想听听你的想法。编辑:我尝试使用你建议的count-pass-1代码,效果也不错。我在我的主要帖子中编辑的代码和你建议的代码在稳定性方面有什么区别吗?在功能方面,没有,没有区别。这是因为count>x+1xvoid 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)
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
          });
for (int x = 0; x < count - pass; x++)
for (int x = 0; x < count - pass - 1; x++)