You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:14:52