Как рассчитать минимальное изменение монет для транзакции? - PullRequest
0 голосов
/ 04 февраля 2011

Привет всем. У меня вопрос. Я работаю в Visual Basic Express и должен рассчитать изменение от транзакции.

Теперь какой код я бы использовал? У меня это частично работает, но начинает немного сбивать с толку.

Спасибо.

Для вас, ребята, которые хотели больше информации:

Скажем, у меня есть один доллар, и я иду в магазин, чтобы что-то купить. Я должен попросить пользователя указать сумму, которую он потратил, а затем рассчитать изменение и распечатать на экране.

Тогда я должен использовать наименьшее количество четвертей, центов, копеек и копеек и выводить его на экран.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

7 голосов
/ 04 февраля 2011

Я собираюсь выйти на конечность и предположить, что ОП говорит об изменении, как о деньгах, возвращенных из транзакции.

Если это так, то это, вероятно, домашняя работа, так что псевдокодтолько.

Самый простой способ сделать это с первой попытки заключается в следующем.Пусть cost будет стоимостью транзакции, а tendered будет суммой денег, переданных (как в центах), и давайте далее предположим, что в вашей экономике есть только долларовые купюры, кварталы и копейки (чтобы мой код был меньше).

change = tendered - cost

if change < 0:
    print "Pay up some more cash, cheapskate!"
    stop

dollars = 0
quarters = 0
cents = 0

while change >= 100:
    dollars = dollars + 1
    change = change - 100

while change >= 25:
    quarters = quarters + 1
    change = change - 25

while change >= 1:
    cents = cents + 1
    change = change - 1

print dollars " dollar(s), " quarters " quarter(s), and " cents " cent(s)."

Теперь это, без сомнения, можно сделать более эффективным с использованием операторов деления по модулю, но я оставляю это как упражнение для читателя.


Я предлагаю сестьс карандашом и бумажкой со следующими колонками (для передачи более десяти долларов за покупку за два с половиной доллара):

tendered      cost    change   dollars  quarters     cents
--------  --------  --------  --------  --------  --------
    1000       293

и пробежите код в своей голове, используя текущие значения из бумаги и записывая новые значения, где они меняются.

Это очень поможет вашему пониманию.


В ответ на ваше обновление:

У меня есть один доллар, и я иду в магазин, чтобы что-то купить.Я должен попросить пользователя указать сумму, которую он потратил, а затем рассчитать изменение и распечатать на экране.Тогда я должен использовать наименьшее количество четвертей, центов, никелей и копеек, а затем распечатать его на экране.

Это удивительно похоже на то, что у меня было выше:

tendered = 100
input cost
cost = int (cost * 100)
change = tendered - cost
if change < 0:
    print "Pay up some more cash, cheapskate!"
    stop
print "Change is ", (format "$9.99", change / 100)

quarters = 0, dimes = 0, nickels = 0, pennies = 0

while change >= 25:
    quarters = quarters + 1
    change = change - 25

while change >= 10:
    dimes = dimes + 1
    change = change - 10

while change >= 5:
    nickels = nickels + 1
    change = change - 5

while change >= 1:
    pennies = pennies + 1
    change = change - 1

print quarters, " quarters"
print dimes   , " dimes"
print nickels , " quarters"
print pennies , " pennies"
2 голосов
/ 04 февраля 2013

Более «продвинутым» способом автоматизации процесса будет:

Private Function CalculateChange(ByVal dAmount As Decimal) As Decimal()
    Dim arrNotesAvailable() As Decimal = {200D, 100D, 50D, 20D, 10D, 5D, 2D, 1D, 0.5D, 0.2D, 0.1D, 0.05D, 0.02D, 0.01D}
    Dim arrChangeAmounts(arrNotesAvailable.Length - 1) As Decimal

    For iIndex As Integer = 0 To arrNotesAvailable.Length - 1
        arrChangeAmounts(iIndex) = dAmount \ arrNotesAvailable(iIndex)
        dAmount = dAmount Mod arrNotesAvailable(iIndex)
    Next

    Return arrChangeAmounts
End Function

Это автоматически вернет массив, заполненный точными суммами каждой единицы, подлежащей выдаче.

Anеще более продвинутое решение:

    Private Function CalculateChange(ByVal dAmount As Decimal) As Decimal()
    Dim arrNotesAvailable() As Decimal = {200D, 100D, 50D, 20D, 10D, 5D, 2D, 1D, 0.5D, 0.2D, 0.1D, 0.05D}
    Dim arrChangeAmounts(arrNotesAvailable.Length - 1) As Decimal

    For iIndex As Integer = 0 To arrNotesAvailable.Length - 2
        arrChangeAmounts(iIndex) = (dAmount * 100) \ (arrNotesAvailable(iIndex) * 100)
        dAmount = dAmount Mod arrNotesAvailable(iIndex)
    Next

    arrChangeAmounts(arrNotesAvailable.Length - 1) = Math.Ceiling((dAmount * 100) / (arrNotesAvailable(arrNotesAvailable.Length - 1) * 100))

    Return arrChangeAmounts
End Function

Это сократит количество банкнот и монет, необходимых для второй последней указанной единицы, а затем «заполнит» остаток наименьшей единицей валюты.Для тех стран, которые не торгуют единицами до 1 (1 цент или 1 иена).В нашей стране мы торгуем до 5 центов.

0 голосов
/ 02 декабря 2015

Просто сделал Назначение как это. enter image description here Открытый класс Form1 Имя: Аарон Холидей Класс: IME 211 Цель: изменить Calc

Dim Owed As Double
Dim Tend As Double
Dim Change As Double
Dim _20D As Integer
Dim _10D As Integer
Dim _5D As Integer
Dim _1D As Integer
Dim _25C As Integer
Dim _10C As Integer
Dim _5C As Integer
Dim _1C As Integer

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    Close()
End Sub

Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    'Clear Due Amounts
    txtOwed.Text = ""
    txtTend.Text = ""
    lblChange.Text = ""
    'Clear Dollar Amounts
    lbl20D.Text = ""
    lbl10D.Text = ""
    lbl5D.Text = ""
    lbl1D.Text = ""
    'Clear Cents Amounts
    lbl25C.Text = ""
    lbl10C.Text = ""
    lbl5C.Text = ""
    lbl1C.Text = ""

    txtOwed.Focus()

End Sub

Private Sub btnRing_Click(sender As Object, e As EventArgs) Handles btnRing.Click
    'Check to see if Empty
    If ((txtOwed.Text) = Nothing) Then
        lblChange.Text = ("Error")
        MessageBox.Show("Please Enter Amount Owed")
        Exit Sub
    End If

    If ((txtTend.Text) = Nothing) Then
        lblChange.Text = ("Error")
        MessageBox.Show("Please Enter Amount Tendered")
        Exit Sub
    End If

    'Set Dim Values
    Owed = txtOwed.Text
    Tend = txtTend.Text

    'Calculate Change due
    Change = (Tend - Owed)
    lblChange.Text = Change.ToString("C2")

    'Check if they paid enough
    If ((lblChange.Text) < 0) Then
        lblChange.Text = ("Pay Up!")
        MessageBox.Show("Please Pay full Amount!")
        Exit Sub
    End If


    'Set Dim Values
    _20D = 0 '$20
    _10D = 0 '$10
    _5D = 0 '$5
    _1D = 0 '$1
    _25C = 0 '$0.25
    _10C = 0 '$0.10
    _5C = 0 '$0.05
    _1C = 0 '$0.01

    'Find Amounts of Each 
    Do While Change >= 20
        _20D = _20D + 1
        Change = Change - 20
    Loop
    'Display $20s
    lbl20D.Text = _20D

    '================================================

    Do While Change >= 10
        _10D = _10D + 1
        Change = Change - 10
    Loop
    'Display $10s
    lbl10D.Text = _10D

    '================================================

    Do While Change >= 5
        _5D = _5D + 1
        Change = Change - 5
    Loop
    'Display $5s
    lbl5D.Text = _5D

    '================================================

    Do While Change >= 1
        _1D = _1D + 1
        Change = Change - 1
    Loop
    'Display $1s
    lbl1D.Text = _1D

    '================================================

    Do While Change >= 0.25
        _25C = _25C + 1
        Change = Change - 0.25
    Loop
    'Display $0.25s
    lbl25C.Text = _25C

    '================================================

    Do While Change >= 0.1
        _10C = _10C + 1
        Change = Change - 0.1
    Loop
    'Display $0.10s
    lbl10C.Text = _10C

    '================================================

    Do While Change >= 0.05
        _5C = _5C + 1
        Change = Change - 0.05
    Loop
    'Display $0.05s
    lbl5C.Text = _5C

    '================================================

    Do While Change >= 0.01
        _1C = _1C + 1
        Change = Change - 0.01
    Loop
    'Display $0.01s
    lbl1C.Text = _1C

    'Display Thank you
    If ((lblChange.Text) >= 0) Then
        MessageBox.Show("Thank you, Come Again")
    End If
End Sub
End Class
...