0

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

这是我正在使用的结构:

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

2 回答 2

2

和:

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

您可能会使用x + 1when越界访问pass == 0

使用 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
          });
于 2015-01-04T22:46:28.127 回答
0

如果您真的不想使用 C++ 样式(vectorsstl,例如 std::sort),请尝试修改此行:

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

进入:

for (int x = 0; x < count - pass - 1; x++)

你必须了解不变量。您的排序算法保证在每一步pass中,您都对数组中的最后一个pass位置进行了排序。这就是-pass的来源。该-1是因为在此 for 循环中的每一步,您都将当前位置与下一个位置进行比较。

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

于 2015-01-04T23:31:34.860 回答