Самый эффективный способ написать этот цикл VB.Net - PullRequest
1 голос
/ 25 августа 2010

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

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

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

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

Теперь мне интересно, написал ли я наиболее эффективные операторы If для выполнения этого кода или их можно написать проще с помощью операторов AND / OR, чтобы, возможно, удалить некоторые из ElseIf.

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

Спасибо,

Alex

Ответы [ 5 ]

2 голосов
/ 25 августа 2010

Вы должны начать с размещения 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
1 голос
/ 25 августа 2010

Как насчет:

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 голосов
/ 25 августа 2010
    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

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

  Result = (NumberTwo * (NumberTwo + 1) / 2) - ((NumberOne - 1) * (NumberOne) / 2)
0 голосов
/ 25 августа 2010

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

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

  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 голосов
/ 25 августа 2010
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 лишний.Мы знаем, что это должен быть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...