C# 成绩计算器

C# Grade Calculator

我目前正在编写一个成绩计算器,它可以添加 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)
    {

    }
}

}

计算平均值时试一试:

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;
}

为了回答关于是使用循环还是 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;
}

你似乎已经解决了一般逻辑,所以我会把它留给你。

为了兴趣,我已经重构了你的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;
}