Hoe ben je tot bovenstaande uitwerking gekomen? Was dit een gegeven voorbeeld of heb je dit zelf uitgewerkt?quote:Op zondag 20 december 2009 14:33 schreef adbeentjes het volgende:
(bijv. ¤634,33 = 1x500 + 0x200+ 1x100 +0x50 + 1x20 + 2x5+ 2x2+ 0x1+ 0x0,50 + 1x0,20 + 1x0,10 + 0x0,05 + 1x0.02+1x0,01)
Zelf 'uitgewerkt' dat is de zogenaamde bottum-up techniek, in delen oplossen van een 'groot' probleem.quote:Op zondag 20 december 2009 14:39 schreef HenryHill het volgende:
[..]
Hoe ben je tot bovenstaande uitwerking gekomen? Was dit een gegeven voorbeeld of heb je dit zelf uitgewerkt?
Immers, als je niet weet hoe je het probleem handmatig moet oplossen, dan hoef je al helemaal niet te proberen dit uit te leggen aan een computer
Ok, en nu als iemand met een briefje van 100 voor 64 euro wil afrekenen. Welke coupures krijgt de klant dan terug?quote:Op zondag 20 december 2009 14:44 schreef adbeentjes het volgende:
Idee
Klant moet betalen, bijv. ¤80.
Hij 'betaalt' met briefje van ¤100
Verschilfunctie 100-80=20 retour door kassier.
20 is 1x20 ivm rond getal...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | aantal = array[15] of int; // hoeveel van elke geldeenheid terug te geven (init. op 0!) i = 0; while (wisselbedrag != 0 && i < 15) { if (wisselbedrag >= valuta[i]) { wisselbedrag = wisselbedrag - valuta[i]; aantal[i] = aantal[i]+1; } else { i = i+1; } } for (i=0; i<15; i=i+1) { print(aantal[i] + " maal " + valuta[i] + "teruggeven."); } |
Lekker, vriend. In plaats dat je TS zelf na laat denken over zijn huiswerkquote:Op zondag 20 december 2009 14:48 schreef Thorír het volgende:
Ken VB niet, dus hier wat pseudocode:
Ik kan wel wat aflezen, maar ik ken dat programma niet, en voor een beginner is het zowat onmogelijk om dit te begrijpen,,, heeft u dit ook 'gemaakt' met tabellen? Sequentie, iteratie etc.?quote:Op zondag 20 december 2009 14:48 schreef Thorír het volgende:
Ken VB niet, dus hier wat pseudocode:
[ code verwijderd ]
Op dezelfde wijze; 100-64=36 euro retour door kassierquote:Op zondag 20 december 2009 14:48 schreef HenryHill het volgende:
[..]
Ok, en nu als iemand met een briefje van 100 voor 64 euro wil afrekenen. Welke coupures krijgt de klant dan terug?
Dan moet je bij de print [i] iets van row en en nog wat invoegen in die codequote:Op zondag 20 december 2009 14:50 schreef adbeentjes het volgende:
[..]
Ik kan wel wat aflezen, maar ik ken dat programma niet, en voor een beginner is het zowat onmogelijk om dit te begrijpen,,, heeft u dit ook 'gemaakt' met tabellen? Sequentie, iteratie etc.?
Ik snap het probleem wel, en hoe je het moet oplossen, maar ik snap niet hoe dit in kaart te brengen in Excel VBA, ik moet een algoritme schrijven, waarschijnlijk moet Excel dan 'het spelletje spelen' van de kassier,quote:Op zondag 20 december 2009 14:49 schreef HenryHill het volgende:
[..]
Lekker, vriend. In plaats dat je TS zelf na laat denken over zijn huiswerk
Ok, ben je met me eens dat de truc is om van het retourbedrag (in dit geval 36 euro) net zolang biljetten van 20 euro uit te betalen totdat je retourbedrag onder de 20 euro komt. Vervolgens ga je biljetten van 10 euro uitbetalen totdat het retourbedrag minder dan 10 euro is, etc.quote:Op zondag 20 december 2009 14:51 schreef adbeentjes het volgende:
[..]
Op dezelfde wijze; 100-64=36 euro retour door kassier
36 euro =
1x20
1x10
1x5
1x1
euro..
Zeer zeker mee eens... steeds weer volgens hetzelfde stramien.quote:Op zondag 20 december 2009 14:56 schreef HenryHill het volgende:
[..]
Ok, ben je met me eens dat de truc is om van het retourbedrag (in dit geval 36 euro) net zolang biljetten van 20 euro uit te betalen totdat je retourbedrag onder de 20 euro komt. Vervolgens ga je biljetten van 10 euro uitbetalen totdat het retourbedrag minder dan 10 euro is, etc.
Toch?
Ok, hoe had je dit voorgesteld in Excel?quote:Op zondag 20 december 2009 14:52 schreef adbeentjes het volgende:
[..]
Ik snap het probleem wel, en hoe je het moet oplossen, maar ik snap niet hoe dit in kaart te brengen in Excel VBA, ik moet een algoritme schrijven, waarschijnlijk moet Excel dan 'het spelletje spelen' van de kassier,
Hier loop ik vast, ik weet niet hoé. Voorheen was het een code schrijven net als hierboven, in excel vba, ..quote:Op zondag 20 december 2009 15:00 schreef HenryHill het volgende:
[..]
Ok, hoe had je dit voorgesteld in Excel?
Ik kan me voorstellen dat je twee cellen gebruikt, 1 voor het invullen van het te betalen bedrag en 1 voor hoeveel de klant geeft. Als uitvoer heb je dan een kolom met met onder elkaar de waardes van de coupures (500, 200, 100, etc.). De uitvoer van je programma komt dan in de kolom naast de coupures te staan.
Om de coupures uit te laten rekenen moet je op een knop drukken, deze start jouw VBA-code.
Zoiets?
Heb je in de vorige opdrachten wel eens cellen uit een Excel werkblad moeten lezen? Of pas je gewoon je programmacode aan als je met andere bedragen wilt werken?quote:Op zondag 20 december 2009 15:03 schreef adbeentjes het volgende:
[..]
Hier loop ik vast, ik weet niet hoé. Voorheen was het een code schrijven net als hierboven, in excel vba, ..
Altijd gewoon via "Marco opnemen" uiteindelijk kan je dan als het ware zelf de 'code' achterhalen via VBA.quote:Op zondag 20 december 2009 15:05 schreef HenryHill het volgende:
[..]
Heb je in de vorige opdrachten wel eens cellen uit een Excel werkblad moeten lezen? Of pas je gewoon je programmacode aan als je met andere bedragen wilt werken?
Ok, maar werd de invoer (in dit geval de bedragen) voor de vorige opdrachten ingelezen vanuit een werkblad, of werd de invoer ook in code gespecificeerd?quote:Op zondag 20 december 2009 15:07 schreef adbeentjes het volgende:
[..]
Altijd gewoon via "Marco opnemen" uiteindelijk kan je dan als het ware zelf de 'code' achterhalen via VBA.
Ja hoor, doe maar zoals je 't gewend bentquote:Ik heb nu een kolom
A1: te betalen
A2: klant geeft
Kan ik ook dit probleem oplossen via "Macro opnemen"?
quote:Op zondag 20 december 2009 15:10 schreef HenryHill het volgende:
[..]
Ok, maar werd de invoer (in dit geval de bedragen) voor de vorige opdrachten ingelezen vanuit een werkblad, of werd de invoer ook in code gespecificeerd?
[..]
Ja hoor, doe maar zoals je 't gewend bent
In welke versie van Excel werk je? (2003 of 2007, Nederlands of Engels?)quote:Op zondag 20 december 2009 15:12 schreef adbeentjes het volgende:
[..]
Geen idee hoe dus... dit is een 'apart' geval, opdrachten komen ook van een apart stencil. Ik heb gewoon de code voor VBA nodig, dus dat er ook schermpje verschijnt van"U betaalt, en u geeft" etc. Alleen weet ik niet hoe ik dat voor mekaar krijg, of iemand me daarbij wilt helpen. Het probleem zelf snap ik wel.
Ik gebruik voor VBA 2003 (ivm uitleg boek), heb ook 2007.quote:Op zondag 20 december 2009 15:16 schreef HenryHill het volgende:
[..]
In welke versie van Excel werk je? (2003 of 2007, Nederlands of Engels?)
1 2 3 | End Sub |
Tot hier GELUKT!, Doe nu ook in 2007. Ik kan nu een blokje, knopje 'tekenen', nietwaar>?quote:Op zondag 20 december 2009 15:23 schreef HenryHill het volgende:
Ik heb zelf alleen 2007 tot m'n beschikking, dus het is misschien het handigst als je deze gebruikt.
Probeer eens het volgende:
1. Ga naar het lint "Ontwikkelaars". Als je deze niet ziet, zoek dan in de Help (F1) het onderwerp "Macro's maken met Microsoft Visual Basic" en volg de daar omschreven stappen om VBA beschikbaar te maken.
2. Op het lint Ontwikkelaars, klik op "Invoegen" (binnen het onderdeel Besturingselementen) en selecteer de knop (linksboven). <wordt vervolgd>
Correct, zie bovenquote:Op zondag 20 december 2009 15:26 schreef adbeentjes het volgende:
[..]
Tot hier GELUKT!, Doe nu ook in 2007. Ik kan nu een blokje, knopje 'tekenen', nietwaar>?
1 2 3 4 5 6 7 8 9 | Rem Lees de waarden uit A1 en A2. Dim i1, i2 As Integer i1 = Range("A1") i2 = Range("A2") Rem Tel deze waardes bij elkaar op, en ken het resultaat toe aan cel A3 Range("A3").Value = i1 + i2 End Sub |
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | Dim check, pay, diff As Double Dim change As String check = Range("B1").Value pay = Range("B2").Value diff = pay - check MsgBox diff no500 = (diff - (diff Mod 500)) / 500 diff = diff - no500 * 500 If diff Mod 500 = 0 Then GoTo melding no200 = (diff - (diff Mod 200)) / 200 diff = diff - no200 * 200 If diff Mod 200 = 0 Then GoTo melding no100 = (diff - (diff Mod 100)) / 100 diff = diff - no100 * 100 If diff Mod 100 = 0 Then GoTo melding no50 = (diff - (diff Mod 50)) / 50 diff = diff - no50 * 50 If diff Mod 50 = 0 Then GoTo melding no20 = (diff - (diff Mod 20)) / 20 diff = diff - no20 * 20 If diff Mod 20 = 0 Then GoTo melding no10 = (diff - (diff Mod 10)) / 10 diff = diff - no10 * 10 If diff Mod 10 = 0 Then GoTo melding no5 = (diff - (diff Mod 5)) / 5 diff = diff - no5 * 5 If diff Mod 5 = 0 Then GoTo melding no2 = (diff - (diff Mod 2)) / 2 diff = diff - no2 * 2 If diff Mod 2 = 0 Then GoTo melding no1 = (diff - (diff Mod 1)) / 1 diff = diff - no1 * 1 If diff Mod 1 = 0 Then GoTo melding no050 = (diff - (diff Mod 0.5)) / 0.5 diff = diff - no050 * 0.5 If diff Mod 0.5 = 0 Then GoTo melding no020 = (diff - (diff Mod 0.2)) / 0.2 diff = diff - no020 * 0.2 If diff Mod 0.2 = 0 Then GoTo melding no010 = (diff - (diff Mod 0.1)) / 0.1 diff = diff - no010 * 0.1 If diff Mod 0.1 = 0 Then GoTo melding no005 = (diff - (diff Mod 0.05)) / 0.05 diff = diff - no005 * 0.05 If diff Mod 0.05 = 0 Then GoTo melding no002 = (diff - (diff Mod 0.02)) / 0.02 diff = diff - no002 * 0.02 If diff Mod 0.02 = 0 Then GoTo melding no001 = (diff - (diff Mod 0.01)) / 0.01 diff = diff - no001 * 0.01 melding: MsgBox no500 & " " & no200 & " " & no100 & " " & no50 & " " & no20 & " " & no10 & " " & no5 & " " & no2 & " " & no1 & " " & no050 & " " & no020 & " " & no010 & " " & no005 & " " & no002 & " " & no001 End Sub |
Very nice. Dan gaan we nu het werkblad opzetten voor de opdracht. Ik stel voor:quote:Op zondag 20 december 2009 15:33 schreef adbeentjes het volgende:
Het volgende:
30 bij A1 ingevuld
20 Bij A2 ingevuld
> Knop drukken
50 verschijnt in A3
Done;quote:Op zondag 20 december 2009 15:38 schreef HenryHill het volgende:
[..]
Very nice. Dan gaan we nu het werkblad opzetten voor de opdracht. Ik stel voor:
A1 bevat de tekst "Te betalen"
B1 wordt gebruikt om het te betalen bedrag in te zetten
A2 bevat de tekst "Klant geeft"
B2 wordt gebruikt om het gegeven bedrag in te zetten
B3 bevat de knop die onze subroutine BepaalBedrag aanroept
De cellen D1 t/m D14 bevatten de waarden van de coupures (500, 200, ... 0,01). De cellen E1 t/m E14 gaan het resultaat bevatten van onze code, nl. de aantallen coupures die moeten worden teruggegeven.
Ok, prima, dan houd ik dezelfde coupures aan als jij.quote:Op zondag 20 december 2009 15:46 schreef adbeentjes het volgende:
[..]
Done;
Alleen heb ik 15 coupures:
500
200
100
50
20
10
5
2
1
0,5
0,2
0,1
0,05
0,02
0,01
1 2 3 4 5 | Rem 1. Lees de 2 invoervelden en bepaal het bedrag retour bedragTeBetalen = Range("B1").Value Rem ...? |
"Rem" is een afkorting van "Remark", een opmerking dus. Het vertelt de VBA interpreter dat hij de rest van de regel kan negeren. Het wordt gebruikt om in je code uit te leggen wat je aan het doen bentquote:Op zondag 20 december 2009 15:54 schreef adbeentjes het volgende:
wat zijn de REM voor instructies, soort formules?
Je moet de REM's alleen gebruiken bij commentaarregels, niet bij je code.quote:misschien klopt dit:
Rem 2. bedragGegeven ---> zie cel B2
Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen
... zoiets?
Ja, je moet alleen nog die "Rem 3." weghalen, dan klopt het.quote:Op zondag 20 december 2009 16:07 schreef adbeentjes het volgende:
Zo dus:
Rem 1. Lees de 2 invoervelden en bepaal het bedrag retour.
bedragTeBetalen = Range("B1").Value
Rem 2. Lees getal wat ingevoerd is bij invoerveld KlantGeeft.
bedragGegeven = Range("B2").Value
Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen
Als je het fout doet, dan krijg je het meteen te horen van excel hoor.quote:???? Weet niet of alles precies getikt is zoals Excel het wilt. ????
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 (Logica moet hierzo komen). coupureAantal = 0 Rem Schrijf het resultaat weg Range("E" & coupureIndex).Value = coupureAantal Next |
Hmm, vreemd, ik heb net jouw tekst in mijn ding geplakt en dan werkt het.quote:Op zondag 20 december 2009 16:16 schreef adbeentjes het volgende:
Nee,
Krijg een foutmelding.
heb tot nu toe:
(...)
COMPILEERFOUT, B1
1 2 3 | End Sub |
quote:Op zondag 20 december 2009 16:32 schreef HenryHill het volgende:
[..]
Hmm, vreemd, ik heb net jouw tekst in mijn ding geplakt en dan werkt het.
Voor de zekerheid: je hebt dit tussen
[ code verwijderd ]
staan?
Ah, gelukkig maarquote:Op zondag 20 december 2009 16:34 schreef adbeentjes het volgende:
[..]
Dat had ik dus niet, dacht dat alles weg moest, nu heb ik het er wel bij staan, en hij doet het: er verschijnen allemaal 0-en
Ik snap wel zo'n beetje wat de code doet. Uiteindleijk moet er een waarde staan ipv de 0 (of weer 0) als uitgerekend is hoeveel de klant terug moet krijgen, zoals het voorbeeld.quote:Op zondag 20 december 2009 16:36 schreef HenryHill het volgende:
[..]
Ah, gelukkig maar
Snap je ook wat de code doet, of zijn er dingen tot nu toe niet helemaal duidelijk?
Precies.quote:Op zondag 20 december 2009 16:39 schreef adbeentjes het volgende:
[..]
Ik snap wel zo'n beetje wat de code doet. Uiteindleijk moet er een waarde staan ipv de 0 (of weer 0) als uitgerekend is hoeveel de klant terug moet krijgen, zoals het voorbeeld.
Vooruit dan maar, 't is ook al een heel middagvullend programma geworden ;)quote:Op zondag 20 december 2009 16:50 schreef adbeentjes het volgende:
Snap niet alle functies,
Ik weet wel dat we nog het een en ander moeten toevoegen, als ik bijv.
Te betalen: 120
Klant geeft: 200
invul, en daarna op de knop druk, gebeurt er nog niets, blijven nullen staan, het verschil moet nu dus berekend worden, en dan nog verdelen onder de cor.
1 2 3 4 5 6 7 8 | 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) |
Lol, je moet de vetgedrukte regel weghalen. Anders is het logisch dat 'ie elke keer '0' wegschrijft...quote:Op zondag 20 december 2009 17:00 schreef adbeentjes het volgende:
Rem Trek het bedrag wat dit aantal coupures voorstelt af van het bedrag dat we nog uit moeten keren.
bedragRetour = bedragRetour - (coupureAantal * coupure)
coupureAantal = 0
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 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 ![]() 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 ![]() Next i 'tekst box met te wisselen bedrag en hoe deze te wisselen MsgBox bedrag & ":-->" & change End Sub |
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: |