 
		 
			 
			
			
			
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double Rem 1. Lees de 2 invoervelden en bepaal het bedrag retour bedragTeBetalen = Range("B1").Value bedragGegeven = Range("B2").Value bedragRetour = bedragGegeven - bedragTeBetalen Rem Loop nu over alle beschikbare coupures heen... Dim coupureIndex, coupureAantal As Integer Dim coupure As Double For coupureIndex = 1 To 15 Rem Lees het bedrag voor deze coupure in coupure = Range("D" & coupureIndex).Value Rem Bepaal het maximaal aantal coupures dat we kunnen uitgeven zonder bedragRetour te overschrijden. coupureAantal = 0 While ((coupureAantal + 1) * coupure) <= bedragRetour coupureAantal = coupureAantal + 1 Wend Rem Trek het bedrag wat dit aantal coupures voorstelt af van het bedrag dat we nog uit moeten keren. bedragRetour = bedragRetour - (coupureAantal * coupure) Rem Schrijf het resultaat weg Range("E" & coupureIndex).Value = coupureAantal Next End Sub | 
 
			 
			
			
			 
			 
			
			
			| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 200 0 100 0 50 1 20 1 10 1 5 1 2 2 1 0 0.5 0 0.2 0 0.1 0 0.05 1 0.02 2 0.01 0 | 
 
			 
			
			
			| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Dim check, pay, diff As Double Dim change As String Dim flappen As Integer 'te betalen = check 'geld gegeven = pay 'diff = wisselgeld 'bedrag is totale hoeveelheid wisselgeld check = Range("B1").Value pay = Range("B2").Value diff = pay - check bedrag = diff 'lijst met coupures myArray = Array(500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01) change = "" 'loop door elke coupure For i = 0 To 14 'als te geven wisselgeld 0 is dan is loopje klaar If diff = 0 Then Exit For 'het aantal coupures van de betreffende waarde bepalen (int maakt er een geheel getal van) 'myArray  is het i-de item van de eerder aangemaakte array flappen = Int(diff / myArray  ) 'tekstregel maken met het aantalcoupures en het type change = change & flappen & "x" & myArray  & " " 'oevrgebleven bedrag berekenen dat nog gewisseld moet worden, afronden op 2 decimalen om rekenfouten te voorkomen diff = Round((diff - flappen * myArray  ), 2) Next i 'tekst box met te wisselen bedrag en hoe deze te wisselen MsgBox bedrag & ":-->" & change End Sub | 
 staat voor {i} maar dan met ronde haken ipv accolades
 staat voor {i} maar dan met ronde haken ipv accolades   
 
											 
			 
			
			
			Zou het niet nog mooier zijn als je ipv de 0 to 14 loop even de lengte van de array bepaald en dan de for loop tot de lengte van de array laat lopen, dan kan de gebruiker in het geval van hyperinflatie ook nog makkelijk de briefjes van 1000, 2000, 5000 en 10.000 euro invoegen zonder dat deze de for while loop moet veranderen.quote:Op maandag 21 december 2009 11:01 schreef Deetch het volgende:
Deze werk wel. uitleg staat in de regels achter '
[ code verwijderd ]
oh ja het informatie tekentjestaat voor {i} maar dan met ronde haken ipv accolades

 
											 
			 
			
			
			 
			 
			
			
			 
			 
			
			
			Vandaar ook het afronden elke keer naar 2 decimalen. Opdracht van TS was om een algoritme te schrijven.quote:Op maandag 21 december 2009 12:33 schreef ralfie het volgende:
zonder vba veeel makkelijker
http://spreadsheets.google.com/ccc?key=0AqF4qrW2Q0b1dGx4UHBVR0tPRkRZUWxRdlcwOEY4Snc&hl=en
Enige gekke is dat de rest() / mod() of hoe je het ook wil noemen met de decimalen een kleine afwijking heeft, waardoor je het terug te betalen bedrag met 0.1 cent moet verhogen anders geeft ie een cent te weinig terug... Is zowel in google als in excel, dus...
vervang "For i = 1 To 14" door "For i = 1 To Ubound(myArray)"quote:Op maandag 21 december 2009 11:07 schreef Basp1 het volgende:
[..]
Zou het niet nog mooier zijn als je ipv de 0 to 14 loop even de lengte van de array bepaald en dan de for loop tot de lengte van de array laat lopen, dan kan de gebruiker in het geval van hyperinflatie ook nog makkelijk de briefjes van 1000, 2000, 5000 en 10.000 euro invoegen zonder dat deze de for while loop moet veranderen.
 
			 
			
			
			Dat is geen oplossing, dat is een workaround (en ik vermoed dat, naarmate het aantal iteraties van je algoritme toeneemt, je nog wel meer dan 1 cent kwijt zult raken)quote:Op maandag 21 december 2009 12:33 schreef ralfie het volgende:
Enige gekke is dat de rest() / mod() of hoe je het ook wil noemen met de decimalen een kleine afwijking heeft, waardoor je het terug te betalen bedrag met 0.1 cent moet verhogen anders geeft ie een cent te weinig terug... Is zowel in google als in excel, dus...

|  | 

| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |