2010-08-25 3 views
1

Добрый день, я начинаю свои первые наработки в программировании и решил начать с VB.net, так как я могу бесплатно получить VS2010 через программу MS Dreamspark.Самый эффективный способ записи этой петли VB.Net

Я слежу за некоторыми базовыми учебниками онлайн, и теперь я пишу небольшую программу, которая запускает цикл, чтобы добавить все числа вместе между двумя введенными пользователем числами.

Ниже приведен код, который я написал:

Public Class Form1 
    Private Sub cmdAddNumbers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAddNumbers.Click 
    Dim NumberOne As Integer 
    Dim NumberTwo As Integer 
    Dim Result As Integer 
    Dim i As Integer 

    If Not IsNumeric(txtNumberOne.Text) Then 
     MsgBox("Please Enter A Valid Number For Number One") 
     txtNumberOne.Clear() 
     Exit Sub 
    ElseIf txtNumberOne.Text = 0 Then 
     MsgBox("Please Enter A Valid Number For Number One") 
     txtNumberOne.Clear() 
     Exit Sub 
    ElseIf txtNumberOne.Text > 0 And IsNumeric(txtNumberOne.Text) Then 
     NumberOne = txtNumberOne.Text 
    End If 

    If Not IsNumeric(txtNumberTwo.Text) Then 
     MsgBox("Please Enter A Valid Number For Number Two") 
     txtNumberTwo.Clear() 
     Exit Sub 
    ElseIf txtNumberTwo.Text < NumberOne Then 
     MsgBox("Please Enter A Valid Number For Number Two") 
     txtNumberTwo.Clear() 
     Exit Sub 
    ElseIf txtNumberTwo.Text > NumberOne And IsNumeric(txtNumberTwo.Text) Then 
     NumberTwo = txtNumberTwo.Text 
    End If 

    For i = NumberOne To NumberTwo 
     Result = Result + i 
    Next i 

    txtResult.Text = Result 
    txtNumberOne.Clear() 
    txtNumberTwo.Clear() 
    End Sub 
End Class 

Теперь мне интересно, если я написал наиболее ЭФФЕКТИВНЫЕ Если операторы для выполнения этого кода, или если они могут быть записаны любым проще с AND/OR заявления возможно, удалить некоторые из ElseIf.

Любое понимание очень ценится.

Спасибо,

Alex

ответ

1

насчет:

If Not IsNumeric(txtNumberOne.Text) Or txtNumberOne.Text <= 0 Then 
    MsgBox("Please Enter A Valid Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
Else 
    NumberOne = txtNumberOne.Text 
End If 

If Not IsNumeric(txtNumberTwo.Text) Or txtNumberTwo.Text < NumberOne Then 
    MsgBox("Please Enter A Valid Number For Number Two") 
    txtNumberTwo.Clear() 
    Exit Sub 
Else 
    NumberTwo = txtNumberTwo.Text 
End If 

Имейте в виду, что если NumberOne равно Textbox2.Text, NumberTwo никогда не назначается

0
If Not IsNumeric(txtNumberOne.Text) Then 
    MsgBox("Please Enter A Valid Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
ElseIf txtNumberOne.Text = 0 Then 
    MsgBox("Please Enter A Valid Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
ElseIf txtNumberOne.Text > 0 And IsNumeric(txtNumberOne.Text) Then 
    NumberOne = txtNumberOne.Text 
End If 

Третий Если завораживает. Мы знаем, что он должен быть IsNumeric, поскольку он прошел первый If, и мы знаем, что это не может быть 0, поскольку он прошел второй If. (Вы также не делаете никаких надбавок вообще, если это отрицательно)

Теперь, прошло некоторое время с тех пор, как я последний раз делал VB.Net, но я уверен, что он все еще имеет отличные строки между строками & целыми числами, что означает, что txtNumberOne.Text = 0 даже не компилируется.

А также, почему вы заставляете своих пользователей догадываться, что такое «действительный номер»?

Dim numberOne as Integer 
If IsNumeric(txtNumberOne.Text) Then 
    numberOne = CInt(txtNumberOne.Text) 
else 
    numberOne = -1; 
End If 

If numberOne < 1 
    MsgBox("Please Enter A Positive Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
End If 
+0

При строгом режиме выключается, он компилируется. Когда вы сравниваете строку с номером, один из них неявно преобразуется, так что сравнение выполняется, однако не уверен, что он делает преобразование, которое вы считаете ... – Guffa

2

Вы должны начать с проставлением Option Strict On в верхней части кода, чтобы заставить себя писать код без неявного преобразования между строками и числами. Примером ошибки в вашем коде является сравнение строкового значения txtNumberTwo.Text с числовым значением NumberOne; это не очевидно, если строка преобразуется в число, чтобы сравнение работало правильно, или если число преобразуется в строку, чтобы вместо этого было сопоставление строк.

Вы можете использовать метод Int32.TryParse разобрать каждый номер только один раз, а не три раза:

Dim numberOne As Integer 
Dim numberTwo As Integer 
Dim result As Integer 

If Not Int32.TryParse(txtNumberOne.Text, numberOne) Then 
    MsgBox("Please Enter A Valid Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
ElseIf numberOne <= 0 Then 
    MsgBox("Please Enter A Valid Number For Number One") 
    txtNumberOne.Clear() 
    Exit Sub 
End If 

If Not Int32.TryParse(txtNumberTwo.Text, numberTwo) Then 
    MsgBox("Please Enter A Valid Number For Number Two") 
    txtNumberTwo.Clear() 
    Exit Sub 
ElseIf numberTwo < numberOne Then 
    MsgBox("Please Enter A Valid Number For Number Two") 
    txtNumberTwo.Clear() 
    Exit Sub 
End If 

Ваш цикл не нужен. Вы можете вычислить сумму непосредственно:

Result = (numberOne + numberTwo) * (numberTwo + 1 - numberOne)/2 
0

я думаю, что лучшим решением для вас будет просто установить текстовые поля, чтобы иметь возможность принимать только цифры, таким образом, вы можете избежать всех проверок, если тексты числовой или нет, и только проверьте, больше ли оно больше нуля.

установить текстовые поля, чтобы принимать только цифры скопировать эту функцию:

Private Function TrapKey(ByVal KCode As String) As Boolean 
    If (KCode >= 48 And KCode <= 57) Or KCode = 8 Then 
     TrapKey = False 
    Else 
     TrapKey = True 
    End If 
    End Function 

и в нажатие клавиши случае текстовых полей добавить

e.Handled = TrapKey(Asc(e.KeyChar)) 
0
Dim doub As Double 
    If Not (Double.TryParse(txtNumberOne.Text, doub) AndAlso doub > 0) Then 
     MsgBox("Please Enter A Valid Number For Number One") 

     txtNumberOne.Clear() 
    Else 
     NumberOne = doub 
    End If 


    If Not (Double.TryParse(txtNumberTwo.Text, doub) AndAlso doub > 0) Then 
     MsgBox("Please Enter A Valid Number For Number Two") 

     txtNumberTwo.Clear() 
    Else 
     NumberTwo = doub 
    End If 

Я думаю, что это WAHT вы ищете для

Result = (NumberTwo * (NumberTwo + 1)/2) - ((NumberOne - 1) * (NumberOne)/2) 
Смежные вопросы