Estoy tratando de encontrar el recuento de dígitos, el dígito más bajo, el dígito más alto y el promedio de todos los dígitos en una cadena.

Esto es lo que se me ocurrió hasta ahora

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim i As Integer = 0
        Dim minimumInt As Integer
        Dim maximumInt As Integer
        Dim averageInt As Single
        For Each c As Char In TextBox1.Text
            If Char.IsDigit(c) Then
                i = i + 1
                If (Asc(c) < minimumInt) Then
                    minimumInt = Asc(c)
                ElseIf (Asc(c) > maximumInt) Then
                    maximumInt = Asc(c)
                End If
                averageInt = averageInt + Asc(c)
                averageInt = averageInt / i
            End If
        Next
        MessageBox.Show("Total Digits: " & i & ControlChars.CrLf & "Average Number: " & averageInt & ControlChars.CrLf & "Minimum Number: " & minimumInt & ControlChars.CrLf & "Maximum Number: " & maximumInt)
    End Sub
End Class

Creo que el problema está relacionado con la conversión de caracteres a enteros.

Por ejemplo, cuando TextBox1 contiene "X13210AS", obtengo esto http://i.imgur.com/5aaOWC0.png

Cuando debería obtener un promedio de 1.4 y el dígito más alto 3.

¿Alguna idea sobre cómo solucionar esto mientras sigo usando la mayor parte de mi código?

1
IdkHowToCodeAtAll 27 ene. 2016 a las 08:22

3 respuestas

La mejor respuesta

El primer problema es con la conversión ASCII. El carácter "0" tiene un valor de 48.

El segundo problema es el promedio, que debe hacerse después de obtener todos los números en lugar de cada ciclo. ¡Y cuidado con la división por 0!

Para hacerlo bien, debe hacer esto:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim i As Integer = 0
        Dim minimumInt As Integer
        Dim maximumInt As Integer
        Dim averageInt As Single
        Dim intVal As Integer 'only use this
        For Each c As Char In TextBox1.Text
            If Char.IsDigit(c) Then
                i = i + 1
                intVal = Asc(c) - 48 'count this once, note -48 here is to convert ASCII rep to integer value
                If (intVal < minimumInt) Then
                    minimumInt = intVal
                ElseIf (intVal > maximumInt) Then
                    maximumInt = intVal
                End If
                averageInt += intVal
            End If
        Next
        If i <> 0 Then 'beware of 0
            averageInt = averageInt / i `put this outside
        End If
        MessageBox.Show("Total Digits: " & i & ControlChars.CrLf & "Average Number: " & averageInt & ControlChars.CrLf & "Minimum Number: " & minimumInt & ControlChars.CrLf & "Maximum Number: " & maximumInt)
    End Sub
End Class

Y obtendrás esto:

enter image description here

1
Ian 27 ene. 2016 a las 05:35

Usando regex y Lista

Imports System.Text.RegularExpressions

Puedes hacerlo de una manera sencilla

TextBox1.Text = "X13210AS"
Dim lstnums As List(Of Integer) = Regex.Replace(TextBox1.Text, "[^\d]", ""). _
                                  Select(Function(x) Val(x)).ToList
Dim maxnum, minnum As Integer
Dim avg As Double

maxnum = lstnums.Max()
minnum = lstnums.Min()
avg = lstnums.Average
MessageBox.Show("Total Digits: " & Val(lstnums.Count) & ControlChars.CrLf & "Average Number: " & avg & ControlChars.CrLf & "Minimum Number: " & minnum & ControlChars.CrLf & "Maximum Number: " & maxnum)

[^\d] es el patrón para hacer coincidir el entero en Textbox1

0
Vivek S. 27 ene. 2016 a las 06:19

Asc(c) devuelve el valor ASCII del carácter de dígito, por ejemplo, '0' tiene un valor ASCII de 48.

Suponiendo que su objetivo es ignorar los que no son dígitos y promediar el resto, casi obtendrá el promedio correcto de su ajuste para 0 = 48, 1 = 49, etc. Necesita hacer este paso

averageInt = averageInt / i

Después de que termine el ciclo.

Su valor mínimo es 0 porque mínimoInt comienza como 0. Comience con mínimoInt = Asc ('9') o un valor alto similar.

0
Eric J. 27 ene. 2016 a las 05:32