C语言结构体学生成绩程序:百分比与总分计算错误排查
问题分析与修复方案
核心问题:整数除法的精度丢失
你的代码中所有计算均使用整数类型(int),而C语言的整数除法会直接舍弃小数部分,仅保留整数商,这是导致百分比和总分计算异常的根本原因:
- 以数学百分比计算为例:
((x[i].math)/200)*100,若成绩为150,150/200的整数结果是0,乘以100后仍为0,完全不符合实际百分比。 - 总分百分比计算
((x[i].math)+(x[i].E)+(x[i].sc))/600同理,三门总分450的话,450/600整数结果为0,最终输出的total值完全错误。
额外逻辑问题:总分的计算意图混淆
你定义的total变量存在逻辑歧义:
- 如果是要计算三门成绩总分,代码里不应该除以600,直接求和即可。
- 如果是要计算总分占满分的百分比,当前的整数除法会导致结果只能是0或1(仅当总分≥600时为1),完全失去参考意义。
修复方案
方案1:使用浮点类型保留精度
将百分比和总分变量改为浮点类型,计算时强制转换整数为浮点型,避免精度丢失:
#include <stdio.h> struct student1{ char name[20]; int E, sc, math; }; int main(void) { // 改为float类型存储浮点结果 float per_m, per_E, per_sc, total; int i; struct student1 x[2]; for(i=0;i<2;i++) { printf("%d):\n", i+1); printf("Name:"); scanf("%s", x[i].name); printf("math:"); scanf("%d", &x[i].math); printf("english:"); scanf("%d", &x[i].E); printf("science:"); scanf("%d", &x[i].sc); printf("%s %d %d %d\n",x[i].name,x[i].math,x[i].E,x[i].sc); // 强制转换为浮点型后计算 per_m = ((float)x[i].math / 200) * 100; per_E = ((float)x[i].E / 200) * 100; per_sc = ((float)x[i].sc / 200) * 100; // 计算总分百分比(若要计算总分则去掉*100和/600) total = ((float)(x[i].math + x[i].E + x[i].sc) / 600) * 100; // 用%.2f控制小数位数输出 printf("percentages are: %.2f %.2f %.2f %.2f\n", per_m, per_E, per_sc, total); } return 0; }
方案2:先乘后除(保持整数类型)
如果希望结果为整数百分比,可以调整计算顺序,先乘以100再除以满分,避免提前做除法丢失小数部分:
// 计算部分修改为 per_m = (x[i].math * 100) / 200; per_E = (x[i].E * 100) / 200; per_sc = (x[i].sc * 100) / 200; // 总分百分比 total = ((x[i].math + x[i].E + x[i].sc) * 100) / 600;
内容的提问来源于stack exchange,提问作者Asmaa Magdy
相关产品推荐
相关产品推荐

