我在Visual Basic中遇到了使用等级计算器的问题

时间:2014-12-08 22:29:15

标签: vb.net

 Public Class convertGrades
'Here is where I declare my variables
Dim numbergrade As Integer
Dim lettergrade As Char

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'This is an If/Else statement that allows the user to
    'convert their number grade into a letter grade
    txtNumberGrade.Text = numbergrade
    lblLetterGrade.Text = lettergrade

    If (numbergrade >= 90 Or numbergrade <= 100) Then
        lettergrade = "A"
    ElseIf (numbergrade >= 80 Or numbergrade <= 79) Then
        lettergrade = "B"
    ElseIf (numbergrade >= 70 Or numbergrade <= 89) Then
        lettergrade = "C"
    ElseIf (numbergrade >= 60 Or numbergrade <= 69) Then
        lettergrade = "D"
    ElseIf (numbergrade >= 50 Or numbergrade <= 59) Then
        lettergrade = "F"
    End If
    txtNumberGrade.Focus()
End Sub

这是我所拥有的确切代码,我使用的是Visual Basic 2012,并且无法将这些数字转换为字母等级。 VB说我没有错误但是当我运行它时,程序不会将数字转换成字母。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

你交换了B和C等级的高数字。此外,您可能希望AndAlso进行这些检查,而不是Or。虽然我在这里,作为一个好的程序设计,你应该把它抽象成一个单独的方法。最终结果:

Public Function LetterGradeFromScore(ByVal score As Integer) As Char
    If numbergrade >= 90 Then
         Return "A"c
    ElseIf numbergrade >= 80 AndAlso numbergrade <= 89 Then
        Return "B"c
    ElseIf numbergrade >= 70 AndAlso numbergrade <= 79 Then
        Return "C"c
    ElseIf numbergrade >= 60 AndAlso numbergrade <= 69 Then
        Return "D"c
    Else
        Return "F"c
    End If
End Function

'The only code that lives in this method is code that directly updates or responds to the UI
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click   
    txtNumberGrade.Text = numbergrade
    lblLetterGrade.Text = LetterGradeFromScore(numbergrade)
    txtNumberGrade.Focus()
End Sub

另一件事:VB.Net有一个非常好的Select Case语法可用于此:

Public Function LetterGradeFromScore(ByVal score As Integer) As Char
    Select Case score
        Case >= 90
            Return "A"c
        Case 80 to 89
            Return "B"c
        Case 70 to 79
            Return "C"c
        Case 60 to 69
            Return "D"c
        Case Else
           Return "F"c
    End Select
End Function

最后,您可以通过将其转换为一种表查找来避免像交换上面的数字以及改进代码这样的问题:

Public Function LetterGradeFromScore(ByVal score As Integer) As Char 

    'This could be a Shared Member somewhere, or even stored in a DB and populated on load
    Dim gradeMap As New SortedList(Of Integer, Char)(5)
    gradeMap.Add(90, "A"c)
    gradeMap.Add(80, "B"c)
    gradeMap.Add(70, "C"c)
    gradeMap.Add(60, "D"c)
    gradeMap.Add( 0, "F"c)

    Return gradeMap.Last(Function(m) m.Key < score).Value
End Function