【问题标题】:Visual Basic Vending MachineVisual Basic 自动售货机
【发布时间】:2014-05-01 13:14:26
【问题描述】:

我已经开始使用 Visual Basic 编写自动售货机代码。它到目前为止有效,但我希望它在你买不起东西时提出错误消息。它仍然是相当基本的,还没有任何项目,但在我开始做其他事情之前希望这不会妨碍我。目前,“Then”语句出现错误,不知道如何解决。我再次对它很陌生,并提出任何建议。谢谢。

Public Class Form1

Private Sub BuyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuyButton.Click

    Dim Cost, Amount, Change As Decimal
    Dim Pennies, Pounds As Integer
    Dim msg As String

    Cost = Decimal.Parse(CostTextBox.Text)
    Amount = Decimal.Parse(AmountTextBox.Text)
    Change = (Amount - Cost) * 10

    Pounds = Change \ 10
    Change = Change Mod 10

    Pennies = Change \ 10
    Change = Change Mod 10

    If Change = "Your change is: -" Then

        msg = "You don't have enough Money"

    Else

        msg = "Your change is: " & Change & vbNewLine
        msg += "Pennies: " & Pounds & vbNewLine
        msg += "Pounds: " & Pennies & vbNewLine

    End If

    ChangeLabel.Text = msg

End Sub
End Class

我用过的解决方案: 公开课形式1

Private Sub BuyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuyButton.Click

    Dim Cost, Amount, Change As Decimal
    Dim Pennies, Pounds As Integer
    Dim msg As String

    Cost = Decimal.Parse(CostTextBox.Text)
    Amount = Decimal.Parse(AmountTextBox.Text)
    Change = (Amount - Cost)

    If Change < 0 Then

        msg = "You don't have enough Money"
        AmountTextBox.Text = Change + Cost

    Else

        AmountTextBox.Text = Change
        Pounds = Math.Floor(Change)
        Pennies = (Change - Pounds) * 100

        msg = "Your change is: " & Change.ToString("##.00") & Environment.NewLine
        msg += "Pounds: " & Pounds & vbNewLine
        msg += "Pennies: " & Pennies & vbNewLine

    End If
    ChangeLabel.Text = msg
End Sub

【问题讨论】:

  • 我已经尝试过了,但没有它现在只会显示消息。 If Change
  • If Change
  • 很抱歉,它仍然不起作用,它要么允许任何事情,要么什么都不做。
  • 好的,首先要做的是分解问题,在 if 语句之前使用 msgbox 来查看更改 MsgBox(change) 的值,以帮助我需要的不仅仅是“它不起作用”
  • 对不起,就像我说的那样,我对此很陌生。我在 If 语句之前放了一个 MsgBox(Change),显示更改的文本与以前保持一致,但无论输入什么数字,弹出框中的数字都显示为 0。 MsgBox(Change) If Change

标签: vb.net message


【解决方案1】:

首先,检查是否有足够的钱,检查零钱是否小于 0 - If Change &lt;0 Then ...。其次,您将Change 更改为Change = Change mod 10,因此最终您不会得到正确的结果。第三,更容易将 Change 设为整数。要获得最后两位零钱(便士),您应该使用Pennies=Change mod 100,要获得其他数字(英镑),您应该使用Pounds=Change\100。第四,您在创建消息时交换了英镑和便士。最后,如果有零钱,您只需将零钱分成英镑和便士。

Public Class Form1

Private Sub BuyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuyButton.Click

    Dim Amount, Change As Decimal
    Dim Cost, Pennies, Pounds As Integer
    Dim msg As String

    Cost = Decimal.Parse(CostTextBox.Text)
    Amount = Decimal.Parse(AmountTextBox.Text)
    Change = (Amount - Cost) * 100

    If Change < 0 Then

        msg = "You don't have enough Money"

    Else

        Pounds = Change \ 100
        Pennies = Change Mod 100
        msg = "Your change is: " & Change & vbNewLine
        msg += "Pounds: " & Pounds & vbNewLine
        msg += "Pennies: " & Pennies & vbNewLine

    End If

    ChangeLabel.Text = msg

End Sub
End Class

【讨论】:

  • 感谢您提供完整的答案,这不适用于最后消息中的便士。它显示为 0,也就是说输入的 anmouts 使用 00.90,例如 90p。这附近有吗?
  • 哦,我没有检查你计算英镑和便士的逻辑。我编辑了答案,它现在应该可以工作了。
  • 那是因为你设置了Pennies = Change Mod 10 然后再除以10。执行Mod 后,您将得到以 10 为单位的变化,因此您必须乘以 10。除以 10 后,您得到的数字小于 1,而从 DecimalInt 的隐式转换会将其舍入。
  • 谢谢,我将 \100 更改为 \10,因为它在“Your Change is:”行中创建了一个很大的数字。里面仍然有 1 太多的 0,我用 \1 尝试过,但它并没有改变它。有什么帮助吗?
  • 我的错,应该是 *100,而不是 *1000。我编辑了答案。
【解决方案2】:

如果我是你,我会考虑精简一下。停止除以 10 再乘以 10 - 这对您的事业没有帮助。去做这样的事情。

Dim Cost, Amount, Change As Decimal
    Dim Pennies, Pounds As Integer
    Dim msg As String

    Cost = Decimal.Parse(CostTextBox.Text)
    Amount = Decimal.Parse(AmountTextBox.Text)
    Change = (Amount - Cost)  --Work in pounds

    If Change < 0 Then

        msg = "You don't have enough Money"

    Else

        Pounds = Math.Floor(Change)
        Pennies = (Change - Pounds) * 100  --Multiply pounds by 100 to get pence

        --Environment.NewLine is the preferred way to insert a newline which will
        --always be correct for the environment.
        msg = "Your change is: " & Change.ToString("##.00") & Environment.NewLine --Note the .ToString("##.00") - this tells VB to convert the number to a string and show two decimal places
        msg += "Pounds: " & Pounds.ToString() & Environment.NewLine
        msg += "Pennies: " & Pennies.ToString() & Environment.NewLine

    End If

    ChangeLabel.Text = msg

不惜一切代价避免隐式转换。是的,Pounds = Change / 10 有效,但它是一种隐含的缩小范围,可能无法按照您的预期工作。我们在这里使用Math.Floor 的原因是因为我们想要小数的整数部分,这就是Math.Floor 所做的 - 为您提供等于或小于所提供值的最大整数。

还要注意Change.ToString 的使用——所有内在类型都派生自超类型Object,这意味着它们实现了ToString 方法。这将为您提供对象值的显式转换字符串表示形式,您可以通过提供掩码(括号中的"##.00#"bit)对其应用格式设置。 Have a look at the MSDNpage on the subject 了解有关将自定义格式应用于字符串的更多信息。

【讨论】:

  • 感谢您的帮助。
  • 不用担心。处理字符串和数字是任何编程的基础,因此值得花时间从头开始。避免隐式转换,我向您保证,您将来会为自己省去很多麻烦!
  • 另外,请注意,如果有人在文本框中输入“xyz”,您的例行程序会很麻烦——请始终检查您的输入并拒绝错误数据。垃圾数据输入 = 垃圾数据输出,如果你幸运的话!
  • 感谢您的帮助,如果您能帮我解决这个问题,我会非常高兴。 stackoverflow.com/questions/23410436/…
【解决方案3】:
If Change = "Your change is: -" Then

更改值应该等于一个值,而不是一个字符串,这需要更改为类似

If change &lt; 0 Then

通常当我使用&amp; 操作符时,我不太确定 =+ 版本是否有效(我从未尝试过)

msg = msg &  "Pennies: " & Pounds & vbNewLine
msg = msg & "Pounds: " & Pennies & vbNewLine

【讨论】:

猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多