C语言用struct结构体统计学生成绩、取最优小测并解决输入异常问题
问题定位与修复方案
直接原因(输入人数后直接终止)
原代码的for循环存在语法错误,录入学生、输出学生的循环写法均为for(i=0,i<n; i++;):for语句的三个表达式需要用分号分隔,且第三个表达式后不需要额外分号,语法错误直接触发程序崩溃终止。正确写法应为for(i=0; i<n; i++)。
其他需要修复的错误
- 结构体成员定义错误:
ID被定义为int ID[100]整型数组,不符合单条学生信息存储单个学号的需求,应改为int ID; - 输入格式符错误:读取字符串类型的学生姓名
name时使用了%d格式符,应改为%s,且char数组名本身是地址无需加取地址符& - printf格式串缺失占位符:所有打印小测成绩的
printf语句未添加%d占位符,例如printf("Best quiz mark is: \n",quiz1);应改为printf("Best quiz mark is: %d\n",quiz1); - else分支逻辑错误:comparison函数的else分支没有加花括号,导致
quiz_best = quiz3;语句无论判断条件是否成立都会执行,逻辑错误 - 循环嵌套逻辑错误:输出所有学生信息的for循环嵌套在录入学生信息的for循环内部,且两个循环共用变量
i,会覆盖外层循环的计数,导致录入逻辑完全混乱,应将输出循环移到录入循环外部 - 函数返回值未接收:调用comparison函数后没有接收返回的最高小测成绩,导致输出的
quiz_best为未初始化的垃圾值 - 冗余声明:main函数开头的
struct student_profile;是无意义的冗余声明,可以删除
修复后完整代码
#include <stdio.h> struct student_profile { char name[100]; int ID; int Final; int mid; int attendance; int assignment; int quiz1; int quiz2; int quiz3; int total_score; // 新增总分字段用于后续排名 } s[100]; int comparison(int quiz1, int quiz2, int quiz3) { int quiz_best; if (quiz1>quiz2 && quiz1>quiz3) { printf("Best quiz mark is: %d\n",quiz1); quiz_best = quiz1; } else if (quiz2>quiz1 && quiz2>quiz3) { printf("Best quiz mark is: %d\n",quiz2); quiz_best = quiz2; } else { printf("Best quiz mark is: %d\n",quiz3); quiz_best = quiz3; } return quiz_best; } int main() { int i,n,quiz_best; printf("Number of the student: \n"); scanf("%d",&n); // 录入学生信息 for(i=0; i<n; i++) { printf("\nStudent No: %d\n",i+1); printf("Name: "); scanf("%s", s[i].name); printf("ID: "); scanf("%d",&s[i].ID); printf("Final: "); scanf("%d",&s[i].Final); printf("mid: "); scanf("%d",&s[i].mid); printf("attendance: "); scanf("%d",&s[i].attendance); printf("assignment: "); scanf("%d",&s[i].assignment); printf("quiz1: "); scanf("%d",&s[i].quiz1); printf("quiz2: "); scanf("%d",&s[i].quiz2); printf("quiz3: "); scanf("%d",&s[i].quiz3); // 计算最高小测成绩和总分 quiz_best = comparison(s[i].quiz1, s[i].quiz2, s[i].quiz3); s[i].total_score = s[i].Final + s[i].mid + s[i].attendance + s[i].assignment + quiz_best; } // 输出所有学生信息 printf("\n========== Students Informations ==========\n"); for(i=0; i<n; i++) { printf("\nStudent No: %d\n",i+1); printf("Name: %s\n",s[i].name); printf("ID: %d\n",s[i].ID); printf("Final: %d\n",s[i].Final); printf("mid: %d\n",s[i].mid); printf("attendance: %d\n",s[i].attendance); printf("assignment: %d\n",s[i].assignment); printf("quiz1: %d\n",s[i].quiz1); printf("quiz2: %d\n",s[i].quiz2); printf("quiz3: %d\n",s[i].quiz3); printf("Total score: %d\n", s[i].total_score); } return 0; }
内容的提问来源于stack exchange,提问作者sun
相关产品推荐
相关产品推荐

