C - 从数组(结构数组)中删除除平均成绩最高的 10 名学生之外的学生

标签 c arrays data-structures

大家好,感谢您花时间阅读本文。我正在练习 C,并且遇到了一个练习,我已经好几天都无法解决,无论我做什么。

练习表明我有两个结构StudentGrade。我要创建一个函数,它接受一组学生作为参数,并删除除平均成绩最高的 10 名学生之外的所有学生。有两个限制:我无法创建任何数组,并且无法对给定数组进行排序。

我尝试过的:我创建了一个 for 循环,从 0 迭代到 size-10 并一一删除学生从平均成绩最低的开始,所以最后,我剩下平均成绩最高的 10 名。

我有辅助功能:平均计算一名学生的平均成绩;

index_lowest查找要删除的学生的索引

函数top_students是执行练习所述操作的主要函数。

这是我的程序:

struct Grade {
    char subject_name[100];
    int grade;
};

struct Student {
    char name[20], surname[20];
    int no_of_grades;
    struct Grade grades[100];
};

double average(struct Student s) {
    int i;
    double avg = 0;
    for (i = 0; i < s.no_of_grades; i++) {
        avg += s.grades[i].grade;
    }
    return avg / s.no_of_grades;
}

int index_lowest(struct Student students[], int size) { // returns the index of the student with the lowest avg
    double min = average(students[0]);

    int i, mini = 0; // mini is the index we search for

    for (i = 0; i < size; i++) {
        if (average(students[i]) < min) {
            min = average(students[i]);
            mini = i;
        }
    }
    return mini;
}

void top_students(struct Student students[], int size) {
    int i, j;

    for (i = 0; i < (size - 10); i++) {
        int index = index_lowest(students, size);

        for (j = index; j < (size - 1); j++) {
            students[j] = students[j + 1];
        }
        size--;
    }
}

最佳答案

top_student 外循环的测试不正确:您在每次迭代时增加 i 并减少 size,因此您停止得太早.

这是简化版本:

void top_students(struct Student students[], int size) {
    while (size > 10) {
        for (int j = index_lowest(students, size); j < size - 1; j++) {
            students[j] = students[j + 1];
        }
        size--;
    }
}

另请注意,按值传递大型结构的效率很低。传递指针是更可取的。每次迭代仅计算一次 average() 也是可取的。

这是修改后的版本:

double average(const struct Student *s) {
    int i, n;
    double avg = 0.0;
    for (i = 0, n = s->no_of_grades; i < n; i++) {
        avg += s->grades[i].grade;
    }
    return avg / n;
}

int index_lowest(const struct Student students[], int size) {
    // returns the index of the student with the lowest avegare
    // in case of ties, return the last index for the lowest average
    double min = average(&students[0]);
    int i, mini = 0; // mini is the index we search for

    for (i = 1; i < size; i++) {
        double avg = average(&students[i]);
        if (avg <= min) {
            min = avg;
            mini = i;
        }
    }
    return mini;
}

关于C - 从数组(结构数组)中删除除平均成绩最高的 10 名学生之外的学生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248857/

相关文章:

c - 为什么 scanf() 会导致此代码中的无限循环?

c - GTK+ 中基于模板的 UI 的优点是什么

c - 来自变量名的指针

c# - 无法将当前 JSON 对象反序列化为类型“WindowsService1...需要 JSON 数组(例如 [1,2,3])才能正确反序列化

c - 无法初始化二维数组

c++ - 创建在 C++ 结构体中声明的数组 a[1] 的多个实例

java - Postfix 评估(小错误)

c# - 仅对一个条目使用字典

c - 在C中为结构的属性设置默认值

arrays - 在 Swift 5 中,如何高效地提取和使用多维数组中的元素?