Как я могу проверить VB, консольное приложение, пользовательский ввод, чтобы убедиться, что они ввели правильный номер? - PullRequest
0 голосов
/ 02 февраля 2012

Vb не является моим языком выбора, но я должен сделать это для школы, и мне не очень легко работать с документацией VB.Я просто создаю очень простое консольное приложение, которое принимает пользовательский ввод: градусы в градусах Цельсия и конвертирует его в градусы Фаренгейта.Я хочу убедиться, что если пользователь просто нажмет ввод, не введя градусы в градусах Цельсия, тогда оператор if else поймает и напишет, чтобы ввести градус Цельсия снова.Вот что я попробовал:

Module Module1
'Chapter 2:     Celcius to Fahrenheit
'Programmer:    Scott McPherson
'Date:          February 2, 2012
'Purpose:       To Convert User Input Celcius to Output Fahrenheit
'
'Declaration
    Dim decCelcius As Decimal = 0
    Dim decFahrenheit As Decimal = 0

Sub Main()
    'Input in Celcius
    Console.Write("Enter the degrees in Celsius: ")

    Console.WriteLine()
    If CDec(Console.ReadLine()) <> 0 Then
        decCelcius = CDec(Console.ReadLine())
        decFahrenheit = 1.8 * decCelcius + 32
    Else
        Console.WriteLine("Don't make me ask again! ENTER THE DEGREES IN CELSIUS: ")
        decCelcius = CDec(Console.ReadLine())
        decFahrenheit = 1.8 * decCelcius + 32
    End If
    Console.WriteLine()
    Console.WriteLine("Degrees in Fahrenheit = " & decFahrenheit)
    Console.Read()
End Sub

End Module

Как мне заставить это работать?

1 Ответ

1 голос
/ 02 февраля 2012

Самая большая проблема с вашим текущим методом проверки ввода состоит в том, что оператор CDec не возвращает ошибку, когда преобразование завершается неудачно. Вы компенсируете это, проверяя, было ли введенное значение преобразовано в 0, но это означает, что вы увидите грубое сообщение об ошибке, если они введут 0, что на самом деле является действительным значением температуры!

Таким образом, вместо оператора CDec вы, вероятно, захотите переключиться на использование Decimal.TryParse метода , который имеет преимущество, заключающееся в отделении успеха / неудачи от фактического преобразованного значения.

Простая перегрузка этого метода принимает только два параметра: строковое значение, которое вы хотите преобразовать (в вашем случае, как возвращено методом Console.ReadLine()) и ссылку (в терминах VB.NET). , значение, которое передается ByRef) в переменную типа Decimal, которая будет заполнена результатом преобразования, если оно прошло успешно. Функция возвращает значение Boolean, которое указывает на успех или неудачу.

Вы могли бы избежать использования этой простой перегрузки, но, вероятно, «лучше» использовать несколько более сложную версию , потому что она позволяет вам указать культуру, которая будет использоваться при попытке проанализировать указанное значение. Поскольку некоторые культуры используют точки (.) в качестве десятичного разделителя, а другие используют запятую (,), это необходимо для применения, не зависящего от культуры. Это может быть слишком перспективным в вашем случае, однако. : -)

Помимо исправления этой непосредственной проблемы, было бы также лучше заменить ваши операторы If / Else If на цикл While. Таким образом, он будет работать снова и снова, пока пользователю не удастся ввести правильный номер. Это не только дает пользователю столько возможностей, сколько ему нужно, но и избавляет вас от необходимости дублировать код внутри обоих блоков If.

...