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

C# WinForm学生成绩平均分计算除法功能异常求助

C# WinForm 成绩平均分计算除法问题排查与修复

问题描述

我正在开发一款用于计算学生成绩平均分的C# Windows Form项目,目前成绩求和功能正常(学生得分总和、总分总和可正常显示),但执行学生得分总和除以总分总和的除法计算时出现问题,现附上代码寻求错误排查帮助。

原代码

private void getaveragebutton_Click(object sender, EventArgs e)
{
    if (customTextboxes4.Texts == "" || customTextboxes5.Texts == "" || customTextboxes6.Texts == "" || customTextboxes7.Texts == "" || customTextboxes8.Texts == "" ||
        customTextboxes9.Texts == "" || customTextboxes10.Texts == "" || customTextboxes11.Texts == "" || customTextboxes12.Texts == "" || customTextboxes13.Texts == ""
        || customTextboxes15.Texts == "" || customTextboxes16.Texts == "" || customTextboxes17.Texts == "" || customTextboxes18.Texts == "" || customTextboxes19.Texts == "" ||
        customTextboxes20.Texts == "" || customTextboxes21.Texts == "" || customTextboxes22.Texts == "" || customTextboxes23.Texts == "" || customTextboxes24.Texts == "")
    {
        MessageBox.Show("Fill all the Boxes with Digits");
    }

    else
    {

        label4.Visible = true;
        label5.Visible = true;
        label7.Visible = true;
        label61.Visible = true;
        label28.Visible = true;
        label29.Visible = true;
        label30.Visible = true;
        label31.Visible = true;
        label45.Visible = true;
        label46.Visible = true;


        //short--test calculations

        //students short test score variables
        decimal a, b, c, d, e1, f, g, h, i, j;
        //students short test value variables
        decimal k, l, m, n, o, p, q, r, s, t;
        //st results variables
        decimal u, v;
        decimal r1st;
        decimal r2st;
        decimal results;

        //customboxes st score
        a = Decimal.Parse(customTextboxes4.Texts);
        b = Decimal.Parse(customTextboxes5.Texts);
        c = Decimal.Parse(customTextboxes6.Texts);
        d = Decimal.Parse(customTextboxes7.Texts);
        e1 = Decimal.Parse(customTextboxes8.Texts);
        f = Decimal.Parse(customTextboxes9.Texts);
        g = Decimal.Parse(customTextboxes10.Texts);
        h = Decimal.Parse(customTextboxes11.Texts);
        i = Decimal.Parse(customTextboxes12.Texts);
        j = Decimal.Parse(customTextboxes13.Texts);

        //custom boxes st values
        k = Decimal.Parse(customTextboxes15.Texts);
        l = Decimal.Parse(customTextboxes16.Texts);
        m = Decimal.Parse(customTextboxes17.Texts);
        n = Decimal.Parse(customTextboxes18.Texts);
        o = Decimal.Parse(customTextboxes19.Texts);
        p = Decimal.Parse(customTextboxes20.Texts);
        q = Decimal.Parse(customTextboxes21.Texts);
        r = Decimal.Parse(customTextboxes22.Texts);
        s = Decimal.Parse(customTextboxes23.Texts);
        t = Decimal.Parse(customTextboxes24.Texts);

        r1st = a + b + c + d + e1 + f + g + h + i + j;
        r2st = k + l + m + n + o + p + q + r + s + t;
        //st results variables definitions
        u = Decimal.Parse(label28.Text);
        v = Decimal.Parse(label29.Text);
       

        //st result


        label28.Text = r1st.ToString();
        label29.Text = r2st.ToString();
        results = u / v;
        label4.Text = results.ToString();
       
        return;
    }
}

错误排查

  • 核心逻辑顺序错误:代码先从label28和label29解析出u和v,之后才将新计算的r1st和r2st赋值给这两个标签。这意味着除法运算用的是标签的旧值(首次运行时可能是空值或默认初始值),而非刚算出的最新求和结果,直接导致平均分计算错误。
  • 未处理除以零异常:如果r2st(总分总和)为0,执行u/v会抛出DivideByZeroException,导致程序崩溃。
  • 输入验证不严谨:仅判断文本框是否为空,未验证输入是否为有效数字;使用Decimal.Parse直接解析,若输入非数字字符会抛出FormatException,缺乏容错性。
  • 代码冗余:逐个声明变量并解析文本框,重复代码过多,维护难度大。

修复方案及优化代码

private void getaveragebutton_Click(object sender, EventArgs e)
{
    // 分组存储需要验证的文本框,简化后续逻辑
    var scoreTextBoxes = new[] 
    { 
        customTextboxes4, customTextboxes5, customTextboxes6, customTextboxes7, customTextboxes8,
        customTextboxes9, customTextboxes10, customTextboxes11, customTextboxes12, customTextboxes13 
    };
    var totalTextBoxes = new[] 
    { 
        customTextboxes15, customTextboxes16, customTextboxes17, customTextboxes18, customTextboxes19,
        customTextboxes20, customTextboxes21, customTextboxes22, customTextboxes23, customTextboxes24 
    };

    // 验证所有输入是否为有效数字
    foreach (var textBox in scoreTextBoxes.Concat(totalTextBoxes))
    {
        if (!decimal.TryParse(textBox.Texts, out _))
        {
            MessageBox.Show("请在所有输入框中填写有效的数字");
            return;
        }
    }

    // 显示需要展示的标签
    label4.Visible = true;
    label5.Visible = true;
    label7.Visible = true;
    label61.Visible = true;
    label28.Visible = true;
    label29.Visible = true;
    label30.Visible = true;
    label31.Visible = true;
    label45.Visible = true;
    label46.Visible = true;

    // 批量解析输入值并计算总和
    decimal studentScoreSum = scoreTextBoxes.Sum(tb => decimal.Parse(tb.Texts));
    decimal totalScoreSum = totalTextBoxes.Sum(tb => decimal.Parse(tb.Texts));

    // 更新标签显示求和结果
    label28.Text = studentScoreSum.ToString();
    label29.Text = totalScoreSum.ToString();

    // 处理总分总和为0的情况,避免除以零异常
    if (totalScoreSum == 0)
    {
        MessageBox.Show("总分总和不能为0,无法计算平均分");
        label4.Text = "无效";
        return;
    }

    // 计算平均分并格式化显示(保留两位小数)
    decimal average = studentScoreSum / totalScoreSum;
    label4.Text = average.ToString("F2");
}

修复说明

  1. 修正逻辑顺序:直接使用计算出的studentScoreSum和totalScoreSum进行除法运算,跳过标签中转,确保用最新的求和结果计算平均分。
  2. 增强输入验证:用decimal.TryParse验证所有输入是否为有效数字,避免格式错误导致的异常。
  3. 异常防护:添加总分总和为0的判断,给出友好提示,防止程序崩溃。
  4. 简化代码:用数组存储文本框,结合LINQ的Sum方法批量计算总和,减少冗余代码,提升可读性和可维护性。
  5. 优化显示:用ToString("F2")格式化平均分,保留两位小数,符合成绩展示的常规需求。

内容的提问来源于stack exchange,提问作者Jose Angel Menendez Hernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:10:23