2010-09-24 60 views
1

我正在创建一个VB 2008更改计算器作为一项任务。该计划将使用支付的金额 - 应付金额计算总额(这工作正常)。之后,它将把这笔钱分解为美元,宿舍,硬币,镍币和硬币。我遇到的问题是,有时候便士,镍或者硬币的数量会是负数。例如$ 2.99 = 3美元和-1便士。VB更改计算器

解决

感谢的答复,这里是我能够做的工作与我有限的知识。

Option Explicit On 
Option Strict Off 
Option Infer Off 

Public Class frmMain 

    Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click 
     'Clear boxes 

     lblDollarsAmount.Text = String.Empty 
     lblQuartersAmount.Text = String.Empty 
     lblDimesAmount.Text = String.Empty 
     lblNickelsAmount.Text = String.Empty 
     lblPenniesAmount.Text = String.Empty 
     txtOwed.Text = String.Empty 
     txtPaid.Text = String.Empty 
     lblAmountDue.Text = String.Empty 
     txtOwed.Focus() 

    End Sub 

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click 
     'Close application' 
     Me.Close() 
    End Sub 

    Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click 
     ' Find Difference between Total Price and Total Received 
     lblAmountDue.Text = Val(txtPaid.Text) - Val(txtOwed.Text) 
     Dim intChangeAmount As Integer = lblAmountDue.Text * 100 

     'Declare Integers 
     Dim intDollarsBack As Integer 
     Dim intQuartersBack As Integer 
     Dim intDimesBack As Integer 
     Dim intNickelsBack As Integer 
     Dim intPenniesBack As Integer 

     ' Change Values 
     Const intDollarValue As Integer = 100 
     Const intQuarterValue As Integer = 25 
     Const intDimeValue As Integer = 10 
     Const intNickelValue As Integer = 5 
     Const intPennyValue As Integer = 1 

     'Dollars 
     intDollarsBack = CInt(Val(intChangeAmount \ intDollarValue)) 
     intChangeAmount = intChangeAmount - Val(Val(intDollarsBack) * intDollarValue) 
     lblDollarsAmount.Text = intDollarsBack.ToString 

     'Quarters 
     intQuartersBack = CInt(Val(intChangeAmount \ intQuarterValue)) 
     intChangeAmount = intChangeAmount - Val(Val(intQuartersBack) * intQuarterValue) 
     lblQuartersAmount.Text = intQuartersBack.ToString 

     'Dimes 
     intDimesBack = CInt(Val(intChangeAmount \ intDimeValue)) 
     intChangeAmount = intChangeAmount - Val(Val(intDimesBack) * intDimeValue) 
     lblDimesAmount.Text = intDimesBack.ToString 

     'Nickels 
     intNickelsBack = CInt(Val(intChangeAmount \ intNickelValue)) 
     intChangeAmount = intChangeAmount - Val(Val(intNickelsBack) * intNickelValue) 
     lblNickelsAmount.Text = intNickelsBack.ToString 

     'Pennies 
     intPenniesBack = CInt(Val(intChangeAmount \ intPennyValue)) 
     intChangeAmount = intChangeAmount - Val(Val(intPenniesBack) * intPennyValue) 
     lblPenniesAmount.Text = intPenniesBack.ToString 

    End Sub 
End Class 
+0

一般目的建议:将GUI与(业务)逻辑分开。您应该创建一个函数来计算给定*总价*和*总付费*的变化。由于您需要返回多个值(硬币,便士等),因此可以将它们放入类的字段(属性)中。 – 2010-09-25 01:13:04

+1

您是老师建议/强迫您使用type作为变量名称的前缀吗?如果你没有,那就不要。请参阅http://msdn.microsoft.com/en-us/library/ms229042.aspx指南。 – 2010-09-26 13:17:27

+0

我同意Tim Murphy:'intNickelsBack'和'dblChangeAmount'不是好的变量名,但'lblNickelsAmount'没问题。 – 2010-09-26 18:54:25

回答

0
Public Shared Function CalculateChange(ByVal dblDollarsPaid As Double, ByVal dblDollarsOwed As Double) 
    Dim intChangeCents As Integer 
    Dim change As New Change() 

    intChangeCents = CInt((dblDollarsPaid - dblDollarsOwed) * 100) 

    change.Dollars = intChangeCents \ 100 
    intChangeCents = intChangeCents Mod 100 

    change.Quarters = intChangeCents \ 25 
    intChangeCents = intChangeCents Mod 25 

    change.Dimes = intChangeCents \ 10 
    intChangeCents = intChangeCents Mod 10 

    change.Nickels = intChangeCents \ 5 
    intChangeCents = intChangeCents Mod 5 

    change.Pennies = intChangeCents 

    Return change 
End Function 

用法:

Dim c As Change 
c = CalculateChange(13.26, 2.99) 
Console.WriteLine("{0} dollars, {1} quarters, {2} dimes, {3} nickels and {4} pennies", _ 
        c.Dollars, c.Quarters, c.Dimes, c.Nickels, c.Pennies) 

\为整数除法,例如操作者5 \ 2是2,而不是2.5。

Change结构是从Alex Essilfie's answer

+0

谢谢。 \是我需要的解决方案。 – BlueBeast 2010-09-27 02:20:16

+0

顺便说一下,Google搜索* visual basic .net整数除法*的第一个结果是[answer](http://discuss.techinterview.org/default.asp?dotnet.12.155890.2) 。这就是我知道如何去做的。 – 2010-09-27 10:31:45

1

在你的例子$ 2.99,看看你在哪里计算inDollarsBack。当你需要2时,你显然会得到3的值。没有放弃它,想想为什么用2.99除以1将产生值3的可能原因。

+0

谢谢,这很有道理.....它是四舍五入的。我需要放下小数点......但我该怎么做? – BlueBeast 2010-09-24 23:40:15

+0

编辑:看看这个数学函数列表:http://msdn.microsoft.com/en-us/library/system.math_members%28v=VS.71%29.aspx – Larsenal 2010-09-25 00:05:50

+0

感谢您指出我在正确的方向。我想出了一条出路......但必须有一个更简单的方法。发布在OP的底部。 – BlueBeast 2010-09-25 00:12:24

1

您可以使用以下更改计算器,然后更新UI。

Imports System.Collections.Generic 
Imports System.Linq 
Imports Microsoft.VisualBasic 

Public Class ChangeCalculator 

    Private denominations As List(Of Denomination) 

    Public Sub New() 

     Me.denominations = New List(Of Denomination) 

     With Me.denominations 

      .Add(New Denomination With {.Value = 1D}) 
      .Add(New Denomination With {.Value = 0.25D}) 
      .Add(New Denomination With {.Value = 0.1D}) 
      .Add(New Denomination With {.Value = 0.05D}) 
      .Add(New Denomination With {.Value = 0.01D}) 

     End With 

    End Sub 

    Public Sub Calculate(ByVal change As Decimal) 

     Me.ResetDenominationUnits() 

     Dim remainingChange = change 

     For Each denomination In (From d In Me.denominations 
            Order By d.Value Descending 
           ) 

      If remainingChange > denomination.Value Then 

       denomination.Units = CInt(
        Conversion.Int(remainingChange/denomination.Value) 
       ) 
       remainingChange -= denomination.Value * denomination.Units 

      End If 

     Next 

    End Sub 

    Public ReadOnly Property Dollars As Integer 
     Get 
      Return Me.GetUnits(1D) 
     End Get 
    End Property 

    Public ReadOnly Property Quarters As Integer 
     Get 
      Return Me.GetUnits(0.25D) 
     End Get 
    End Property 

    Public ReadOnly Property Dimes As Integer 
     Get 
      Return Me.GetUnits(0.1D) 
     End Get 
    End Property 

    Public ReadOnly Property Nickels As Integer 
     Get 
      Return Me.GetUnits(0.05D) 
     End Get 
    End Property 

    Public ReadOnly Property Pennies As Integer 
     Get 
      Return Me.GetUnits(0.01D) 
     End Get 
    End Property 

    Private Function GetUnits(ByVal denomination As Decimal) As Integer 
     Return (From d In Me.denominations 
       Where d.Value = denomination 
       ).Single().Units 
    End Function 

    Private Sub ResetDenominationUnits() 

     For Each denomination In Me.denominations 
      denomination.Units = 0 
     Next 

    End Sub 

End Class 

Public Class Denomination 

    Public Property Value As Decimal 
    Public Property Units As Integer 

End Class 
1

因为我的答案是类似Tim Murphy's,我觉得这个人的更直接,你不需要update the UI

Module Module1 

    Sub Main() 
     Console.WriteLine("Enter the amount of change or type EXIT to close.") 
     Dim input = Console.ReadLine 
     Do While input.ToUpper.Trim <> "EXIT" 
      Dim c = GetChange(CDec(Val(input))) 
      Console.WriteLine("{0} dollars, {1} quarters, {2} dimes, {3} nickels and {4} pennies", _ 
           c.Dollars, c.Quarters, c.Dimes, c.Nickels, c.Pennies) 

      Console.WriteLine(vbCrLf & vbCrLf & "Enter the amount of change or type EXIT to quit.") 
      input = Console.ReadLine 
     Loop 
    End Sub 

    Public Function GetChange(ByVal change As Decimal) As Change 
     Dim denominations = New Decimal() {1D, 0.25D, 0.1D, 0.05D, 0.01D} 
     Dim c(4) As Integer 


     For i = 0 To denominations.Length - 1 
      If change >= denominations(i) Then 
       c(i) = CInt(Conversion.Int(change/denominations(i))) 
       change -= (c(i) * denominations(i)) 
      End If 
     Next 

     Dim r As New Change 
     With r 
      .Dollars = c(0) 
      .Quarters = c(1) 
      .Dimes = c(2) 
      .Nickels = c(3) 
      .Pennies = c(4) 
     End With 

     Return r 
    End Function 

    Public Structure Change 
     Dim _dollars As Integer 
     Dim _quarters As Integer 
     Dim _nickels As Integer 
     Dim _dimes As Integer 
     Dim _pennies As Integer 

     Public Property Dollars() As Integer 
      Get 
       Return _dollars 
      End Get 
      Set(ByVal value As Integer) 
       _dollars = value 
      End Set 
     End Property 

     Public Property Quarters() As Integer 
      Get 
       Return _quarters 
      End Get 
      Set(ByVal value As Integer) 
       _quarters = value 
      End Set 
     End Property 

     Public Property Dimes() As Integer 
      Get 
       Return _dimes 
      End Get 
      Set(ByVal value As Integer) 
       _dimes = value 
      End Set 
     End Property 

     Public Property Nickels() As Integer 
      Get 
       Return _nickels 
      End Get 
      Set(ByVal value As Integer) 
       _nickels = value 
      End Set 
     End Property 

     Public Property Pennies() As Integer 
      Get 
       Return _pennies 
      End Get 
      Set(ByVal value As Integer) 
       _pennies = value 
      End Set 
     End Property 
    End Structure 

End Module 
+0

很好的解决方案。但是,我不明白你不需要更新UI的意义。您正在通过调用Console.WriteLine()更新UI。 – 2010-09-27 08:24:22

0

很简单,就在这里。要解决负面变化,请删除除显式外的所有选项

Option Explicit On 

Public Class frmMoneyChange 
    Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click 

     lblFivesAmount.Text = String.Empty 
     lblTensAmount.Text = String.Empty 
     lblDollarsAmount.Text = String.Empty 
     lblQuartersAmount.Text = String.Empty 
     lblDimesAmount.Text = String.Empty 
     lblNickelsAmount.Text = String.Empty 
     lblPenniesAmount.Text = String.Empty 
     txtOwed.Text = String.Empty 
     txtPaid.Text = String.Empty 
     lblAmountDue.Text = String.Empty 
     txtOwed.Focus() 

    End Sub 

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click 

     Me.Close() 
    End Sub 

    Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click 


     Dim decChangeAmount As Decimal 
     Dim intDollarsBack As Integer 
     Dim intQuartersBack As Integer 
     Dim intDimesBack As Integer 
     Dim intNickelsBack As Integer 
     Dim intPenniesBack As Integer 
     Dim decPaid As Decimal 
     Dim decOwed As Decimal 

     Const intFiveDollarValue As Integer = 5 
     Const intTenDollarValue As Integer = 10 
     Const intDollarValue As Integer = 1 
     Const decQuarterValue As Decimal = 0.25 
     Const decDimeValue As Decimal = 0.1 
     Const decNickelValue As Decimal = 0.05 
     Const decPennyValue As Decimal = 0.01 



     decOwed = Convert.ToDecimal(txtOwed.Text) 
     decPaid = Convert.ToDecimal(txtPaid.Text) 
     decChangeAmount = decPaid - decOwed 
     lblAmountDue.Text = decChangeAmount.ToString("C") 

     'Ten Dollars 
     intDollarsBack = (decChangeAmount * 100 \ intTenDollarValue * 100) 
     decChangeAmount = decChangeAmount - (intDollarsBack) * intTenDollarValue 
     lblTensAmount.Text = intDollarsBack.ToString 

     'Five Dollars 
     intDollarsBack = (decChangeAmount * 100 \ intFiveDollarValue * 100) 
     decChangeAmount = decChangeAmount - (intDollarsBack) * intFiveDollarValue 
     lblFivesAmount.Text = intDollarsBack.ToString 

     'Dollars 
     intDollarsBack = (decChangeAmount * 100 \ intDollarValue * 100) 
     decChangeAmount = decChangeAmount - (intDollarsBack) * intDollarValue 
     lblDollarsAmount.Text = intDollarsBack.ToString 

     'Quarters 
     intQuartersBack = (decChangeAmount * 100 \ decQuarterValue * 100) 
     decChangeAmount = decChangeAmount - (intQuartersBack) * decQuarterValue 
     lblQuartersAmount.Text = intQuartersBack.ToString() 

     'Dimes 
     intDimesBack = (decChangeAmount * 100 \ decDimeValue * 100) 
     decChangeAmount = decChangeAmount - (intDimesBack) * decDimeValue 
     lblDimesAmount.Text = intDimesBack.ToString 

     'Nickels 
     intNickelsBack = (decChangeAmount * 100 \ decNickelValue * 100) 
     decChangeAmount = decChangeAmount - (intNickelsBack) * decNickelValue 
     lblNickelsAmount.Text = intNickelsBack.ToString 

     'Pennies 
     intPenniesBack = (decChangeAmount * 100 \ decPennyValue * 100) 
     decChangeAmount = decChangeAmount - (intPenniesBack) * decPennyValue 
     lblPenniesAmount.Text = intPenniesBack.ToString 

    End Sub 

End Class