2010-09-24 4 views
1

Je crée une calculatrice de changement VB 2008 en tant qu'affectation. Le programme consiste à utiliser le montant payé - le montant dû pour calculer le total (cela fonctionne bien). Après cela, il faut décomposer ce montant en dollars, en quarts, en dimes, en nickels et en penny. Le problème que j'ai est que parfois la quantité de penny, de nickels ou de dimes sera un nombre négatif. Par exemple 2,99 $ = 3 Dollars et -1 Pennies.VB Change Calulator

SOLVED

Merci aux réponses, voici ce que j'ai pu faire le travail avec mes connaissances limitées.

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

Un conseil général: séparez l'interface graphique de la logique (métier). Vous devez créer une fonction qui calcule la modification pour un * prix total * et * total payé *. Puisque vous devez renvoyer plusieurs valeurs (dimes, pennies, etc.), vous pouvez les placer dans les champs (propriétés) d'une classe. –

+1

Est-ce que votre professeur vous suggère/vous oblige à utiliser le type comme préfixe pour les noms de variables? Si vous n'avez pas alors ne le faites pas. Voir pour http://msdn.microsoft.com/en-us/library/ms229042.aspx conseils. –

+0

Je suis d'accord avec Tim Murphy: 'intNickelsBack' et' dblChangeAmount' ne sont pas de bons noms de variables, mais 'lblNickelsAmount' est correct. –

Répondre

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 

Utilisation:

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) 

\ est l'opérateur de division entière, par exemple, 5 \ 2 est 2, pas 2,5.

La structure Change est de Alex Essilfie's answer.

+0

Merci. \ était la solution dont j'avais besoin. – BlueBeast

+0

Par ailleurs, le premier résultat d'une recherche Google pour * division visuel entier .net base * est le (http://discuss.techinterview.org/default.asp?dotnet.12.155890.2) [réponse] à la question . Voilà comment je savais comment le faire. –

1

Dans votre exemple de 2,99 $, regardez où vous calculez inDollarsBack. Vous obtenez évidemment une valeur de 3, quand vous avez besoin de 2. Sans le donner, pensez à des raisons possibles pour diviser 2,99 par 1 produirait une valeur de 3.

+0

Merci, ça a du sens, c'est arrondi. Je dois laisser tomber la décimale ...... mais comment je fais ça? – BlueBeast

+0

Modifier: consultez cette liste des fonctions mathématiques: http://msdn.microsoft.com/en-us/library/system.math_members%28v=VS.71%29.aspx – Larsenal

+0

Merci de me pointer dans la bonne direction. J'ai trouvé un moyen de sortir ... mais il doit y avoir un moyen plus facile. Posté au bas de OP. – BlueBeast

1

Vous pouvez utiliser la calculatrice de changement suivante, puis mettre à jour le 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

que ma réponse Dans la mesure où est semblable à Tim Murphy's, je pense que celui-ci est en avant plus droit et vous n'avez pas besoin de 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

Belle solution. Cependant, je ne comprends pas votre point de ne pas avoir besoin de mettre à jour l'interface utilisateur. Vous mettez à jour l'interface utilisateur avec des appels à Console.WriteLine(). –

0

Tout simplement, c'est ici. Pour résoudre la modification négative, supprimez toutes les options sauf Explicit

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