我的代码中使用的两个结构,一个是嵌套的
struct Class
{
std::string name;
int units;
char grade;
};
struct Student
{
std::string name;
int id;
int num;
double gpa;
Class classes[20];
};
我试图找出一种方法,按照ID {1}}数组的顺序按升序排序。all_students[100]
数组中的结构。我的想法是,开始计算位置1,然后将其与前一个元素进行比较。如果它小于前一个元素,那么我将有一个类型为Student
的临时数组来等同于它,那么在all_students
数组中切换它们就好了。但是,当我打印结果时,其中一个元素最终成为垃圾编号,而不是按顺序。这是针对大学的中级C ++课程,我们不允许使用指针或向量,因为他还没有教过我们这个。任何不明确的事情都可以随意问我。
基于ID
对结构进行排序的功能void sort_id(Student all_students[100], const int SIZE)
{
Student temporary[1];
int counter = 1;
while (counter < SIZE + 1)
{
if (all_students[counter].id < all_students[counter - 1].id)
{
temporary[0] = all_students[counter];
all_students[counter] = all_students[counter - 1];
all_students[counter - 1] = temporary[0];
counter = 1;
}
counter++;
}
display(all_students, SIZE);
}
答案 0 :(得分:2)
您的代码存在一些问题:
以下解决方案使用insertion sort对学生数组进行排序,它为您的排序算法提供了更快的替代方案。请注意,插入排序仅适用于足够小或几乎排序的数组。
void sort_id(Student* all_students, int size)
{
Student temporary;
int i = 1;
while(i < size) // Read my note below.
{
temporary = all_students[i];
int j = i - 1;
while(j >= 0 && temporary.id < all_students[j].id)
{
all_students[j+1] = all_students[j]
j--;
}
all_students[j+1] = temporary;
i++;
}
display(all_students, size);
}
注意:外部while循环也可以使用for循环完成,如下所示:
for(int i = 1; i < size; i++)
{
// rest of the code ...
}
通常,当您事先知道将完成多少次迭代时,会使用for循环。在这种情况下,我们知道外部循环将从0
迭代到size - 1
。内循环是一个循环,因为我们不知道它什么时候会停止。
答案 1 :(得分:1)
您的学生数组范围为0,99。允许计数器从1到100。
我假设SIZE为100(在这种情况下,您可能应该将数组计数也设置为SIZE而不是100中的硬编码,如果这不仅仅是为我们键入示例的工件)。 / p>
你可以用任何一种方式进行while循环,
while(counter < SIZE)
并在0或
上启动计数器while (counter < SIZE+1)
并在1上启动计数器,但如果你执行后者,则需要从数组下标中减去1。我相信这就是为什么规范(基于我的观察)是从0开始。
编辑:我不是downvoter!另外,只是另一个快速评论,没有理由让你的临时数组。只是Student temporary;
答案 2 :(得分:1)
我忽略了这样一个事实:我允许循环访问一个元素,而不是实际拥有的数组。这就是为什么我得到垃圾,因为循环访问不存在的数据。
我通过更改while (counter < SIZE + 1)
来解决此问题
致:while (counter < SIZE )
然后为了解决第二个关于排序的问题,我需要确保循环在开关后从头开始再次启动,以防需要再次使用较低的元素进行切换。所以我在continue;
counter = 1