1

我正在尝试查找字符串中所有数字的位数、最低位数、最高位数和平均值。

这是我到目前为止所能想到的

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

我相信这个问题涉及将字符转换为整数。

例如,当 TextBox1 包含“X13210AS”时,我得到这个 http://i.imgur.com/5aaOWC0.png

当我应该得到平均 1.4 和最高数字 3 时。

关于如何在仍然使用我的大部分代码的同时解决这个问题的任何想法?

4

3 回答 3

1

第一个问题是ASCII转换。“0”字符的值为 48。

第二个问题是你的平均,这应该在你得到所有数字而不是每个循环之后完成。并注意除以0!

为了让它正确,你必须这样做:

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

你会得到这个:

在此处输入图像描述

于 2016-01-27T05:35:45.213 回答
0

Asc(c)返回数字字符的 ASCII 值,例如 '0' 的 ASCII 值为 48。

假设您的目标是忽略非数字并平均其余部分,您几乎可以得到正确的平均值,调整为 0 = 48、1 = 49 等。您需要执行此步骤

averageInt = averageInt / i

循环完成后。

您的最小值为 0,因为 minimumInt 从 0 开始。以 minimumInt = Asc('9') 或类似的高值开始。

于 2016-01-27T05:28:36.963 回答
0

使用正则表达式列表

Imports System.Text.RegularExpressions

你可以用简单的方式做到这一点

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]是匹配整数的模式Textbox1

于 2016-01-27T06:10:22.297 回答