C语言中结构体内部marks数组排序失效问题求助
问题分析与解决
核心问题
你想要对每个学生的marks[]数组内部的三门成绩进行升序排序,但当前代码的sort函数存在两个致命错误,导致排序无效:
- 未初始化的变量
m:在比较if (s[i].marks[m] > s[j].marks[m])时,m没有被赋值,访问的是随机内存位置的数组元素,逻辑完全错误。 - 错误的排序逻辑:当前代码是在交换整个学生结构体,而不是对单个学生的
marks数组内部元素进行排序。
另外,你的需求明确要求按百分比排序学生,这和“对每个学生的成绩数组排序”是两个不同的需求,下面会同时处理这两个要求。
修正后的代码
#include <stdio.h> #include <stdlib.h> struct student{ char name[10]; int rollno; int marks[3]; // 三门科目成绩数组 int totalMarks; float percent; }; void calculate(struct student s[10], int n) { int i, m; for (i = 0; i < n; i++) { s[i].totalMarks = 0; s[i].percent = 0.0; for (m = 0; m < 3; m++) { s[i].totalMarks += s[i].marks[m]; } s[i].percent = s[i].totalMarks / 3.0; } } void display(struct student s[10], int n) { int i, m; for (i = 0; i < n; i++) { printf("Student's Name: %s\n", s[i].name); printf("Student's Rollno: %d\n", s[i].rollno); for (m = 0; m < 3; m++) { printf("Subject %d Marks: %d\n", m+1, s[i].marks[m]); } printf("Total Marks: %d\n", s[i].totalMarks); printf("Total Percent: %.2f\n", s[i].percent); printf("\n"); } } // 对单个学生的marks数组进行升序排序 void sort_marks_per_student(struct student *s) { int i, j, temp; // 冒泡排序实现数组内部升序 for (i = 0; i < 2; i++) { for (j = 0; j < 2 - i; j++) { if (s->marks[j] > s->marks[j+1]) { temp = s->marks[j]; s->marks[j] = s->marks[j+1]; s->marks[j+1] = temp; } } } } // 按百分比对学生进行升序排序(符合需求要求) void sort_students_by_percent(struct student s[10], int n) { int i, j; struct student temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (s[j].percent > s[j+1].percent) { temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } } } } // 整合排序逻辑:先给每个学生排序成绩,再按百分比排序学生 void sort(struct student s[10], int n) { int i; // 遍历每个学生,对其成绩数组内部排序 for (i = 0; i < n; i++) { sort_marks_per_student(&s[i]); } // 按百分比对学生整体排序 sort_students_by_percent(s, n); // 输出排序后的结果 printf("\n排序后的学生信息(成绩内部升序+按百分比升序):\n"); for (i = 0; i < n; i++) { printf("Student's Name: %s\n", s[i].name); printf("Student's Rollno: %d\n", s[i].rollno); for (int m = 0; m < 3; m++) { printf("%d ", s[i].marks[m]); } printf("\nTotal Marks: %d\n", s[i].totalMarks); printf("Total Percent: %.2f\n", s[i].percent); printf("\n"); } } // 实现题目给定的accept函数 void accept(struct student s[10], int n) { int i, m; for (i = 0; i < n; i++) { printf("\nEnter student's name: "); scanf("%s", s[i].name); printf("Enter student's rollno: "); scanf("%d", &s[i].rollno); for (m = 0; m < 3; m++) { printf("Enter Subject %d marks: ", m + 1); scanf("%d", &s[i].marks[m]); } printf("\n"); } } int main() { struct student s[10]; int n; printf("Enter the number of students: "); scanf("%d", &n); // 使用给定的accept函数接收输入 accept(s, n); calculate(s, n); printf("\n学生原始信息:\n"); display(s, n); printf("\n开始排序...\n"); sort(s, n); printf("\n"); }
关键修正说明
- 拆分排序逻辑:新增
sort_marks_per_student函数专门处理单个学生的成绩数组排序,sort_students_by_percent处理学生按百分比排序,职责更清晰。 - 修复变量问题:所有循环变量均提前初始化,避免访问随机内存。
- 符合函数原型:实现了题目要求的
accept函数,替换了main函数中的输入逻辑,代码结构更规范。
内容的提问来源于stack exchange,提问作者ayushkadbe
相关产品推荐
相关产品推荐

