0

私は C# を初めて使用します。成績文字 (A、B、C、D、F) を検証する TextBox に問題があります。現時点では、以下のコードは if ステートメントを実行し、else ステートメントではなく、条件に完全に一致する成績文字を入力した場合に実行します。[OK] ボタンをクリックした後に小文字にしてから大文字にしたとしてもです。正しい成績文字を入力すると、if をスキップして else ステートメントに進むはずですが、何かがおかしいのです。

    private void Button_Click(object sender, RoutedEventArgs e)
    {

        //automatically convert gradeLetter inputs to uppercase
        gradeLetter.Text = gradeLetter.Text.ToUpper();

        //check if gradeLetter entered is valid
        if (!string.IsNullOrWhiteSpace(gradeLetter.Text) || gradeLetter.Text != "A" || gradeLetter.Text != "B" || gradeLetter.Text != "C" || gradeLetter.Text != "D" || gradeLetter.Text != "F")
        {
            MessageBox.Show("Invalid grade letter or has an empty textbox!", "Caution!", MessageBoxButton.OK);
        }
        else
        {
            // switch statement to determine which 'gradeLetter' is being used 
            // and assign numerical numbers to 'gpa' to then be calculated.
            switch (gradeLetter.Text)
            {
                case "A": gradeW = 4.0;
                    break;
                case "B": gradeW = 3.0;
                    break;
                case "C": gradeW = 2.0;
                    break;
                case "D": gradeW = 1.0;
                    break;
                case "F": gradeW = 0.0;
                    break;
                default: // do nothing
                    break;
            }

            double result = (GPA += gradeW); //add to the gpa
            gCounter++; // increment the gpa entered
            result /= gCounter; // divide by the number of gpa entered
            result = Math.Round(result, 2, MidpointRounding.AwayFromZero); //round the result to two decimal places

            gpa.Text = result.ToString(); //convert result from int to string and display in 'gpa' TextBlock

            //append the input grade letters to 'gradeEntered' TextBlock
            gradeEntered.Text += gradeLetter.Text + System.Environment.NewLine;
       }
    }
4

3 に答える 3

4

多くの条件を使用する代わりに (少し読みにくくなります)、有効な成績文字を含む List を使用できます。

string gradeLetter = "A";

List<string> gradeLetters = new List<string> { "A", "B", "C", "D", "F" };

if (!gradeLetters.Contains(gradeLetter))
{
    // invalid grade letter
}

else
{
    // carry on
}

あなたのコード:

if (!string.IsNullOrWhiteSpace(gradeLetter.Text) || gradeLetter.Text != "A" || gradeLetter.Text != "B" || gradeLetter.Text != "C" || gradeLetter.Text != "D" || gradeLetter.Text != "F")

常に真になります。グレードが B だったとしましょう。それは に対してチェックしgradeLetter.Text != "A"、短絡し、"B" != "A" であるため true になります。

于 2014-02-07T03:17:02.583 に答える
2

現在の if ステートメントの問題は、有効な入力がまだ無効として表示されることです。入力が「B」の場合、「A」(ifステートメントにある)ではないことがわかります。これは、基準全体が真であることを意味します。

if ステートメントを次のように変更します。

if (string.IsNullOrWhiteSpace(gradeLetter.Text) || !(gradeLetter.Text == "A" || gradeLetter.Text == "B" || gradeLetter.Text == "C" || gradeLetter.Text == "D" || gradeLetter.Text == "F"))

これは基本的に「入力が空ですか、それとも入力が A、B、C、D、または F ではありませんか?」と尋ねます。

于 2014-02-07T03:16:11.237 に答える
2

Dictionary アプローチを使用することもできます。

gradeLetter.Text = gradeLetter.Text.ToUpper();
IDictionary<string, double> grades = new Dictionary<string, double>
{
    {"A", 4.0},
    {"B", 3.0},
    {"C", 2.0},
    {"D", 1.0},
    {"F", 0.0}
};

if (!grades.ContainsKey(gradeLetter.Text)){
    MessageBox.Show("Invalid grade letter or has an empty textbox!", "Caution!", MessageBoxButton.OK);
}
else{
    gradeW = grades[gradeLetter.Text];
    // other stuff
}
于 2014-02-07T16:00:32.007 に答える