【问题标题】:Find average of all digits in string查找字符串中所有数字的平均值
【发布时间】:2016-01-27 05:22:01
【问题描述】:

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

这是我目前所能想到的

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。

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

【问题讨论】:

  • 啊,我已经在问题中写过了。 TextBox1 包含'"X13210AS"'

标签: vb.net string char string-function


【解决方案1】:

第一个问题是ASCII 转换。 "0" char 的值为 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

你会得到这个:

【讨论】:

    【解决方案2】:

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

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

    averageInt = averageInt / i
    

    循环结束后。

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

    【讨论】:

    • 所以根据我的理解,我必须把Asc(c - 48)?但这不起作用,当我将 - 48 放在转换之外时,我会变得更乱
    • 不,Asc(c) - 48,或者更清楚的是Asc(c) - Asc('0')。另请注意,我刚刚编辑了我的问题,指出平均计算的最后一步需要在循环之外进行。
    • 最后一个问题,对不起!但是为什么你把数字放在单引号里呢?当我这样做时,我最终得到了 cmets,单引号与 vb.net 中的双引号相同吗?
    • @IdkHowToCodeAtAll 单引号用于VB.Net中的字符书写,因此0是整数(值为0)但“0'”是字符(值为48)
    • 我是 C# 人...字符常量用单引号括起来。我猜在 VB.Net stackoverflow.com/questions/3374842/… 中它会是“0”C@
    【解决方案3】:

    使用regexList

    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 中整数的模式

    【讨论】:

      猜你喜欢
      • 2022-11-13
      • 1970-01-01
      • 2023-03-22
      • 2014-02-24
      • 2018-01-20
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多