大家好,感谢您花时间阅读本文。我正在练习 C,并且遇到了一个练习,我已经好几天都无法解决,无论我做什么。
练习表明我有两个结构Student
和Grade
。我要创建一个函数,它接受一组学生作为参数,并删除除平均成绩最高的 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/