将结构分配给另一个结构会导致垃圾

时间:2015-05-04 23:17:40

标签: c++ arrays struct

我的代码中使用的两个结构,一个是嵌套的

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

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  1. 您不需要创建一个大小为1的数组来用作临时变量。
  2. 你的计数器范围从1到100,你将超出界限:100的数组索引范围从0到99.
  3. 以下解决方案使用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