El programa que estoy tratando de escribir hipotéticamente será utilizado por una compañía de autobuses. La compañía tiene 18 autobuses y para cada autobús el usuario debe poder ingresar cuántas personas estaban en el autobús a través de cajas de entrada.

Si había más de 55 personas en el autobús, el autobús se clasifica como lleno. Cuando se han recopilado los datos de los 18 autobuses, se debe generar el número promedio de pasajeros por autobús junto con el número mínimo y máximo.

Esto es lo que he codificado hasta ahora:

Public Class FirstBus
  Dim passengers As Integer
  Dim TotalPassengers As Integer
  Dim bus As Integer
  Dim FullBus As Integer
  Dim min As Integer
  Dim max As Integer
  Dim average As Decimal

  Private Sub FirstBus_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    average = TotalPassengers / 18
    lblOutput.Text = "Average number of passengers = " & average & vbNewLine & "Maxium number of passengers = " & max & vbNewLine & "Minimum number of passengers = " & min
    bus = 1
    min = 1000
    max = 1
  End Sub

  Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    For i = 1 To 18
        passengers = InputBox("Enter the number of passengers on bus number " & bus)
        If passengers > 54 Then
            FullBus = FullBus + 1
        End If
        If passengers > max Then
            max = passengers
        ElseIf passengers < min Then
            min = passengers
        End If
        TotalPassengers = TotalPassengers + passengers
        bus = bus + 1
    Next i
  End Sub

El problema es que cuando ingreso los datos de los 18 buses, el promedio, el mínimo y el máximo se emiten como 0, necesito encontrar una forma de generarlos como el promedio real, mínimo y máximo

0
J Wilson 20 oct. 2017 a las 14:34

3 respuestas

La mejor respuesta

Debe inicializar antes de que se complete la lógica del botón y mostrar después de que se complete la lógica del botón.

Podría ver algo como esto:

Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    ' Reset variables
    TotalPassengers = 0
    bus = 0
    FullBus = 0
    min = 1000
    max = 0
    average = 0

    ' Get values
    For i = 1 To 18
        passengers = InputBox("Enter the number of passengers on bus number " & bus)
        If passengers > 54 Then
            FullBus = FullBus + 1
        End If
        If passengers > max Then
            max = passengers
        ElseIf passengers < min Then
            min = passengers
        End If
        TotalPassengers = TotalPassengers + passengers
        bus = bus + 1
    Next i

    ' Display values
    average = TotalPassengers / 18
    lblOutput.Text = "Average number of passengers = " & average & vbNewLine & "Maxium number of passengers = " & max & vbNewLine & "Minimum number of passengers = " & min
End Sub

La carga solo se ejecuta una vez cuando se carga el formulario.

0
the_lotus 20 oct. 2017 a las 12:02

No estás actualizando la lblOutput.Text al hacer clic en el botón.

Public Class FirstBus

    Dim passengers As Integer
    Dim TotalPassengers As Integer
    Dim bus As Integer
    Dim FullBus As Integer
    Dim min As Integer
    Dim max As Integer
    Dim average As Decimal

    Private Sub FirstBus_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        average = 0
        min = 1000
        max = 1
        lblOutput.Text = "Average number of passengers = " & average & vbNewLine & "Maxium number of passengers = " & max & vbNewLine & "Minimum number of passengers = " & min
    End Sub


    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click

    TotalPassengers = 0
    passengers = 0
    average = 0
    FullBus = 0
    bus = 1
    min = 1000
    max = 1
        For i = 1 To 18
            passengers = InputBox("Enter the number of passengers on bus number " & bus)
            If passengers > 54 Then
                FullBus = FullBus + 1
            End If
            If passengers > max Then
                max = passengers
            ElseIf passengers < min Then
                min = passengers
            End If
            TotalPassengers = TotalPassengers + passengers
            bus = bus + 1
        Next i
        average = TotalPassengers / 18
        lblOutput.Text = "Average number of passengers = " & average & vbNewLine & "Maxium number of passengers = " & max & vbNewLine & "Minimum number of passengers = " & min
    End Sub

End Class
0
ɐsɹǝʌ ǝɔıʌ 20 oct. 2017 a las 12:02

Puede mostrar todos los buses en DataGridView y actualizar sus datos allí.

Public Class Bus
    Public Property Number As String
    Public Property PassengersAmount As Integer
End Class

Luego cree una colección de autobuses y únala a DataGridView.
En la forma

Public Sub New()
    Me.InitializeComponents()

    Dim buses = Enumerable.Range(1, 18).
                           Select(Function(n) New Bus With { .Number = $"Number {n}"}).
                           ToList()

    ' Add DataGridView control in designer
    yourDataGridView.DataSource = buses   
End Sub

Cuando se abre el formulario, los pasajeros equivalen a la segunda columna de la vista de cuadrícula de datos.
Utilice los métodos LINQ para calcular los valores promedio, mínimo y máximo.
Tenga en cuenta que no necesita tener ninguna variable privada en la clase para esos valores

Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    Dim buses = DirectCast(yourDataGridView.DataSource, List(Of Bus))
    Dim amounts = buses.Select(Function(bus) bus.PassengersAmount).ToList()

    ' You can create three labels for every output value
    lblOutputAvg.Text = $"Average: {amounts.Avg()}"
    lblOutputMin.Text = $"Min: {amounts.Min()}"
    lblOutputMax.Text = $"Max: {amounts.Max()}"
End Sub
0
Fabio 20 oct. 2017 a las 12:32