Сумма чисел с ЗАЦИКЛИВАНИЕМ

#vb.net #while-loop

#vb.net #во время цикла

Вопрос:

Итак, для моего класса я пытаюсь написать код, который суммирует числа от 1 до 10. Например, если пользователь введет 3, эта программа добавит 1 2 3 и окончательный ответ был бы 6…….Я пытаюсь сделать это с помощью цикла, а также с помощью отображения, которое дает ответ.

это код, который у меня есть до сих пор……..

 Option Strict On

Public Class frmSumOfNumbers


    Private Sub btnEnterNumbers_Click(sender As Object, e As EventArgs) Handles btnEnterNumbers.Click


        'For loop from 0 to counter -1
        InputBox("Enter A Positive integer value", "Input needed", "10")

    End Sub

    Function Validation(ByVal PositiveNumber As Double, ByRef Result As Double) As Boolean

        If PositiveNumber > -1 Then
            Result = CDbl(PositiveNumber)
        Else
            'pop message box and return false if not positive
            MessageBox.Show("Please enter positive numbers only")
            Return False

        End If


    End Function

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        ' Closes the program
        Close()

    End Sub
End Class
  

Комментарии:

1. В чем ваш вопрос?

2. Вы не считываете значение, возвращаемое InputBox . PositiveNumber и Result появляются из ниоткуда. Цикла нет.

Ответ №1:

Ваша первая проблема заключается в предоставлении места для сбора входных значений от пользователя. Взгляните на функцию InputBox https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.interaction.inputbox?view=netframework-4.8

Обратите внимание, что возвращает строку. Мы можем получить входные данные от пользователя, предоставив строковую переменную.

 Dim UserInput As String
UserInput = InputBox("Enter A Positive integer value", "Input needed", "10")
  

Но это значение исчезнет, как только мы достигнем End Sub! Если мы используем переменную уровня формы для сбора значений, переменная будет существовать до тех пор, пока форма открыта. Другим преимуществом переменной уровня формы (уровня класса) является то, что она может быть отображена любым методом из.

Мы можем использовать переменную коллекции, такую как массив или список. Поскольку мы не уверены, сколько чисел введет пользователь, давайте использовать список. С массивом нам пришлось бы использовать ReDim Preserve каждый раз, когда мы получали новое число для изменения размера массива. Это не обязательно для списка. Смотрите https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netcore-3.1

На уровне формы…

 Private IntegerList as New List(Of Integer)
  

Но у нас есть строковая переменная от пользователя. Здесь появляется ваш код проверки. Нам нужно передать то, что пользователь ввел в поле ввода (помните, что InputBox возвращает строку), поэтому тип данных аргумента в строке. Мы хотим вернуть целое число, чтобы тип данных функции был целым. За любым оператором возврата в функции должно следовать целое значение.

Я использовал целое число.Попробуйте проанализировать, было ли введенное число числом, а затем я проверил, является ли число положительным. Смотрите документы https://learn.microsoft.com/en-us/dotnet/api/system.int32.tryparse?view=netcore-3.1

Если пользовательский ввод проходит проверку, то число добавляется в список, в противном случае отображается сообщение.

Чтобы сложить список, вы можете .Net framework выполняет цикл за кулисами с помощью .Метод суммы списка или вы можете использовать для каждого цикла, чтобы сделать это самостоятельно. Тот же результат.

 Private IntegerList As New List(Of Integer)

Private Sub AddANumber_Click(sender As Object, e As EventArgs) Handles AddANumber.Click
    Dim UserInput = InputBox("Enter A Positive integer value", "Input needed", "10")
    Dim RetVal = Validation(UserInput)
    If RetVal > -1 Then
        IntegerList.Add(RetVal)
    Else
        MessageBox.Show("Please enter positive numbers only")
    End If
End Sub

Function Validation(ByVal UserInput As String) As Integer
    Dim ReturnInteger As Integer
    If Integer.TryParse(UserInput, ReturnInteger) AndAlso ReturnInteger > -1 Then
        Return ReturnInteger
    Else
        Return -1
    End If
End Function

Private Sub DisplayTotal_Click(sender As Object, e As EventArgs) Handles DisplayTotal.Click
    Dim Total = IntegerList.Sum
    MessageBox.Show($"The Total is {Total}")
    Dim LoopTotal As Integer
    For Each i In IntegerList
        LoopTotal  = i
    Next
    MessageBox.Show($"The LoopTotal is {LoopTotal}")
End Sub
  

Примечание: Строки, которым предшествует символ $, называются интерполированными строками. Вы можете выполнить поиск по этому термину, чтобы узнать, как они работают.