【问题标题】:C# Grade CalculatorC# 成绩计算器
【发布时间】:2017-03-01 18:08:29
【问题描述】:

我目前正在编写一个成绩计算器,它可以将 3 个考试成绩相加,并根据平均成绩给你一个字母成绩。到目前为止,除了一件事之外,我已经能够毫无问题地编写所有代码。在这个计算器中,我添加了一个复选框,如果选中该复选框,该复选框会降低最低成绩并平均取最高 2 分。我几周前才开始编程,不知道如何开始编码。我应该使用 if 语句还是循环?如果你们对消除不必要的代码或其他任何东西有任何提示,请随时指出。

 public frmGradeCalculator()
    {
        InitializeComponent();
    }




    private void chkDropLowest_CheckedChanged(object sender, EventArgs e)
    {


    }
    private void btnClear_Click(object sender, EventArgs e)
    {
        // Clear Text

        txtTest1.Clear();
        txtTest2.Clear();
        txtTest3.Clear();
        txtAverage.Clear();
        txtLetterGrade.Clear();

        // Set Focus

        txtTest1.Focus();
    }

    private void btnCalculate_Click(object sender, EventArgs e)
    {
        // Declare variables

        byte bytTest1;
        byte bytTest2;
        byte bytTest3;
        float fltAverage;
        string strLetterGrade = "F";

        // Convert to text

        if (byte.TryParse(txtTest1.Text, out bytTest1))
        {
        }
        else
        {
            MessageBox.Show("Invalid Number!",
                "Yancarlos Grade Calculator",
                MessageBoxButtons.OK,
                MessageBoxIcon.Exclamation);
            txtTest1.Focus();
            return;
        }

        if (byte.TryParse(txtTest2.Text, out bytTest2))
        {
        }
        else
        {
            MessageBox.Show("Invalid Number!",
                "Yancarlos Grade Calculator",
                MessageBoxButtons.OK,
                MessageBoxIcon.Exclamation);
            txtTest2.Focus();
            return;
        }
        if (byte.TryParse(txtTest3.Text, out bytTest3))
        {
        }
        else
        {
            MessageBox.Show("Invalid Number!",
                "Yancarlos Grade Calculator",
                MessageBoxButtons.OK,
                MessageBoxIcon.Exclamation);
            txtTest3.Focus();
            return;
        }

        // Formula 

        fltAverage = (bytTest1 + bytTest2 + bytTest3) / 3;

        if (fltAverage <= 59.9)
        {
            strLetterGrade = "F";
        }
        else if (fltAverage <= 63.9)
        {
            strLetterGrade = "D-";
        }
        else if (fltAverage <= 66.9)
        {
            strLetterGrade = "D";
        }
        else if (fltAverage <= 69.9)
        {
            strLetterGrade = "D+";
        }
        else if (fltAverage <= 73.9)
        {
            strLetterGrade = "C-";
        }
        else if (fltAverage <= 76.9)
        {
            strLetterGrade = "C";
        }
        else if (fltAverage <= 79.9)
        {
            strLetterGrade = "C+";
        }
        else if (fltAverage <= 83.9)
        {
            strLetterGrade = "B-";
        }
        else if (fltAverage <= 86.9)
        {
            strLetterGrade = "B";
        }
        else if (fltAverage <= 89.9)
        {
            strLetterGrade = "B+";
        }
        else if (fltAverage <= 93.9)
        {
            strLetterGrade = "A-";
        }
        else if (fltAverage <= 96.9)
        {
            strLetterGrade = "A";
        }
        else 
        {
            strLetterGrade = "A+";
        }



        // convert back to user

        txtAverage.Text = fltAverage.ToString("f1");
        txtLetterGrade.Text = strLetterGrade.ToString();

    }

    private void btnExit_Click(object sender, EventArgs e)
    {
        // Exit application

        Application.Exit();
    }

    private void frmGradeCalculator_Load(object sender, EventArgs e)
    {

    }
}

}

【问题讨论】:

    标签: c# calculator


    【解决方案1】:

    要回答您关于使用循环还是 if 语句的具体问题,所有复选框控件都有一个 Checked 属性可供您检查。

    if(chkDropLowest.Checked)
    {
           //Calculate average without the lowest test
    }
    

    就设计而言,我建议您不要为特定按钮分配太多功能。相反,我会创建一个从该按钮调用的新方法(这样,如果您将来决定使用新控件,您会很安全)

    例子:

    private string CalculateLetterGrade(byte test1, byte test2, byte test3)
    {
         string letterGrade;
    
         if(chkDropLowest.Checked)
         { 
              //Drop lowest test then calculate average
         }
         else
         {
              //Use all tests then calculate average
         }
    
         //Determine the string for the letter grade, then return it
    
         return letterGrade;
    }
    

    您似乎已经制定了平均逻辑,所以我将其留给您。

    【讨论】:

    • 感谢关于不要为一个按钮分配太多功能的建议,我会记住这一点。
    【解决方案2】:

    在计算平均值时试一试:

    double totalScore = bytTest1 + bytTest2 + bytTest3;
    double lowest = Math.Min(Math.Min(bytTest1, bytTest2), bytTest3);
    if (chkDropLowest.IsChecked == true)
    {
        // Drop the lowest test
        fltAverage = (totalScore - lowest) / 2;
    }
    else
    {
        // Include all three tests
        fltAverage = (totalScore) / 3;
    }
    

    【讨论】:

    • 感谢完美!感谢您的帮助。
    • 你打赌。正如其他人所提到的,考虑将这些“功能”分解为他们自己的方法。即,CalculateScore(List&lt;double&gt; scores, bool dropLowest) 方法。
    【解决方案3】:

    只是为了兴趣,我重构了你的btnCalculate_Click。这解决了您的问题,但我已经发布了更多内容,以便您可以查看更简洁地解决您的问题的代码,并且可能会给您一些语法来查看。

    private void btnCalculate_Click(object sender, EventArgs e)
    {
        Func<TextBox, double?> parseTextBox = tb =>
        {
            double value;
            if (!double.TryParse(tb.Text, out value))
            {
                MessageBox.Show("Invalid Number!",
                    "Yancarlos Grade Calculator",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);
                tb.Focus();
                return null;
            }
            return value;
        };
    
        double?[] tests =
        (
            from tb in new[] { txtTest3, txtTest2, txtTest1, }
            let result = parseTextBox(tb)
            orderby result descending
            select result
        ).ToArray();
    
        if (tests.Any(t => t == null))
        {
            return;
        }
    
        double average =
            tests
                .Take(3 - (checkBox1.Checked ? 1 : 0))
                .Average()
                .Value;
    
        var grades = new[]
        {
            new { Score = 59.9, Grade = "F" },
            new { Score = 63.9, Grade = "D-" },
            new { Score = 66.9, Grade = "D" },
            new { Score = 69.9, Grade = "D+" },
            new { Score = 73.9, Grade = "C-" },
            new { Score = 76.9, Grade = "C" },
            new { Score = 79.9, Grade = "C+" },
            new { Score = 83.9, Grade = "B-" },
            new { Score = 86.9, Grade = "B" },
            new { Score = 89.9, Grade = "B+" },
            new { Score = 93.9, Grade = "A-" },
            new { Score = 96.9, Grade = "A" },
            new { Score = 100.0, Grade = "A+" },
        };
    
        string grade =
            grades
                .Where(g => g.Score >= average)
                .Select(g => g.Grade)
                .First();
    
        txtAverage.Text = average.ToString("f1");
        txtLetterGrade.Text = grade;
    }
    

    【讨论】:

    • 这段代码看起来很棒!我很感激帮助我还有很多东西要学习所以一些我不熟悉的代码。我会保留这个并在我学到更多东西时回头看看它,然后去啊哈!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多