2013-09-01 2 views
0

Я работаю над программой в Visual Basic, которая вводит пользовательский ввод как целое число от 1 до 99, а затем говорит, как использовать количество кварталов, копейки, никеля и пенни, которые вам нужно дополнить для этого количество. Моя проблема полностью симпатична, и мой алгоритм не работает, как я думал. Вот код, который делает фактическую математику, где переменные, используемые уже объявленнуюVisual Basic change maker program

Select Case Input 
    Case 25 to 99 
     numQuarters = Input/25 
     remainder = Input Mod 25 

     Select Case remainder 

      Case 10 to 24 
       numDimes = remainder/10 
       remainder = remainder mod 10 
       numNickles = remainder/5 
       remainder = remainder mod 5 

       numPennies = remainder 

Я собираюсь останавливаться на достигнутом, потому что это только часть кода, который дает мне неприятности. Когда я ввожу число от 88 до 99 (которое обрабатывается этой частью кода), цифры выглядят странно. Например, 88 дает мне 4 четверти, 1 копейку, 1 Nickle и 3 пенни. Я не совсем уверен, что происходит, но если кто-то может мне помочь, я был бы признателен.

+0

к сожалению о странном расстоянии в некоторых из кода, я печатаю это на iPhone – emufossum13

+0

является число монет объявлены как интегральные типы? Если нет, вам нужно усечь результат остатка/X (т. Е. 'NumDimes = Int (остаток/10)' и т. Д. И т. Д.) –

+0

помог ли мой ответ? .... –

ответ

0

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

Итак, после каждого раздела усечь его. Например:

numQuarters = Int(Input/25) 
remainder = Input Mod 25 

'or since you aren't working with fractional currencies you could use integral division operator '\': 
numQuarters = Input \ 25 

С 88 как вход будет, после этих строк, имеют numQuarters = 3 и остаток = 18

Во всяком случае, pehaps более гибкий способ, который не опирается на жестко прописанных заказов старшинства и может обрабатывать любые единицы вам нравится (центы, дробные доллары, что угодно), как:

Sub exampleUsage() 

    Dim denominations, change 
    Dim i As Long, txt 

    'basic UK coins, replace with whatever 
    'you can of course use pence as the unit, rather than pounds 
    denominations = Array(1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01) 
    change = ChaChing(3.78, denominations) 
    For i = 0 To UBound(denominations) 
     txt = txt & Format(denominations(i), "£0.00") & " x " & change(i) & " = " & Format(denominations(i) * change(i), "£0.00") & vbCrLf 
    Next i 
    MsgBox (txt) 

End Sub 

'denominations is a Vector of valid denominations of the amount 
'the return is a Vector, corresponding to denominations, of the amount of each denomination 
Public Function ChaChing(ByVal money As Double, denominations) 
    Dim change, i As Long 
    ReDim change(LBound(denominations) To UBound(denominations)) 
    For i = LBound(denominations) To UBound(denominations) 
     If money = 0 Then Exit For 'short-circuit 
     change(i) = Int(money/denominations(i)) 
     money = money - change(i) * denominations(i) 
    Next i 
    ChaChing = change 
End Function