Wechselgeld 5 besten Kombinationen
-
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
Danke für eure Antworten!
@hustbaer & @Wade1234 Rekursion ist natürlich eine gute Idee, würde ich aber gerne umgehen!Darfst du gerne. Es ist bloss in diesem Fall vermutlich einfacher.
-
@hustbaer
Definitiv. Habe mich auch dazu entschieden, es rekursiv zu erstellen. Allerdings habe ich damit noch nicht so viel gearbeitet und tue mich damit etwas schwer.
-
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
@Wade1234 dein 2. Vorschlag hört sich an wie Brute Force... wäre eine super Idee!
Und zu Not nehme ich dann die Rekursion!es ist auch brute-force. wie du unter https://www.c-plusplus.net/forum/topic/350091/1-bis-100-centbeträge-möglichkeiten-kombinationen-algorithmus/32 sehen kannst, funktioniert es aber deutlich schneller als rekursion. 3 min wartezeit gehen sicherlich noch, aber manchmal lohnt sich eben auch der aufwand, es nicht rekursiv zu programmieren.
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
@TGGC sagte in Wechselgeld 5 besten Kombinationen:
printf("%i", geldwert[i] / 100)
Das habe ich schon versucht... geht leider nicht, ab dem geldwert=50 entsteht eine 0 bei der Ausgabe...
logisch. 50 / 100 ist ja auch 0 Rest 50, was du bedeutet, dass im geldbetrag 50 eben keine 100 vorkommen.
-
@Wade1234
Okay, dann werde ich den Aufwand betreiben. Ist für mich vom Ding her auch einfacher, weil ich nicht wüsste, wie ich das rekursiv darstellen soll.Hättest du einen Vorschlag, wie ich die Geldwerte besser darstellen könnte?
-
Du kennst doch schon den Modulo-Operator
%
(den du bei der Variablenrest
benutzt):printf("%d€ %d Cent", wert / 100, wert % 100);
-
@Th69
Stimmt, danke. Stand auf dem Schlauch... manchmal sieht man den Wald vor lauter Bäumen nicht.
-
@Wade1234 sagte in Wechselgeld 5 besten Kombinationen:
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
@Wade1234 dein 2. Vorschlag hört sich an wie Brute Force... wäre eine super Idee!
Und zu Not nehme ich dann die Rekursion!es ist auch brute-force. wie du unter https://www.c-plusplus.net/forum/topic/350091/1-bis-100-centbeträge-möglichkeiten-kombinationen-algorithmus/32 sehen kannst, funktioniert es aber deutlich schneller als rekursion. 3 min wartezeit gehen sicherlich noch, aber manchmal lohnt sich eben auch der aufwand, es nicht rekursiv zu programmieren.
Ist es echt nötig hier jemanden der Lernen möchte einen extrem schlechten Code zu verlinken? Vor allem wo der nachweislich bei etwas Nachdenken in 3 Zeilen rekursiv und performanter programmierbar war?
-
@codinglea es ist nur manchmal einfacher, manchmal geht es ohne rekursion auch gar nicht, z.b. beim schach oder so.
eine möglichkeit könnte so aussehen:
enum //konstanten für die positionen im array { E500, //0 E200, //1 E100, //etc. E50, E20, E10, E5, E2, E1, C50, C20, C10, C5, C2, C1, ANZAHL_GELDWERTE //entspricht immer der anzahl der elemente im enum }; void Geldwerte(int geldbetrag, int geldwerte[], int wertanzahl[]) { int i; //am anfang immer die abbruchbedingung, hier: der geldbetrag aufgebraucht bzw. //er lässt sich nicht durch den kleinsten wert teilen, du kannst sie aber in diesem fall auch weglassen //es ist also mehr zur veranschaulichung, dass du es eine abbruchbedingung geben könnte. if(geldbetrag < geldwerte[ANZAHL_GELDWERTE - 1]) { return; } //die abbruchbedingung ist nicht erfüllt, also wird weiter gerechnet for(i = 0; i < ANZAHL_GELDWERTE; i++) { if(geldbetrag >= geldwerte[i]) //der geldbetrag kann durch mindestens einen zusätzlichen geldwert repräsentiert werden. { wertanzahl[i] = wertanzahl[i] + 1; //anzahl der geldwerte erhöhen geldbetrag = geldbetrag - geldwerte[i]; //restbetrag berechnen Geldwerte(geldbetrag, geldwerte, wertanzahl); //funktion erneut aufrufen break; //schleife beenden } } }
-
@TGGC sagte in Wechselgeld 5 besten Kombinationen:
@Wade1234 sagte in Wechselgeld 5 besten Kombinationen:
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
@Wade1234 dein 2. Vorschlag hört sich an wie Brute Force... wäre eine super Idee!
Und zu Not nehme ich dann die Rekursion!es ist auch brute-force. wie du unter https://www.c-plusplus.net/forum/topic/350091/1-bis-100-centbeträge-möglichkeiten-kombinationen-algorithmus/32 sehen kannst, funktioniert es aber deutlich schneller als rekursion. 3 min wartezeit gehen sicherlich noch, aber manchmal lohnt sich eben auch der aufwand, es nicht rekursiv zu programmieren.
Ist es echt nötig hier jemanden der Lernen möchte einen extrem schlechten Code zu verlinken? Vor allem wo der nachweislich bei etwas Nachdenken in 3 Zeilen rekursiv und performanter programmierbar war?
ja es ist nötig, die unterschiede zwischen iterativer (schnell aber aufwändig zu programmieren) und rekursiver (langsam aber relativ einfach zu programmieren) lösungsfindung aufzuzeigen. oder schämst du dich für das schlechte beispiel, das du da abgeliefert hattest?
-
@codinglea sagte in Wechselgeld 5 besten Kombinationen:
Allerdings habe ich damit noch nicht so viel gearbeitet und tue mich damit etwas schwer.
Verständlich. Aber deswegen ist es ja auch eine gute Übung
-
@Wade1234
Ich habe deinen Vorschlag angepasst. Doch leider wird mir das ausgespuckt:
error: too few arguments to function 'werte' in Zeile 70#include <stdio.h> #include <stdlib.h> int werte(int betrag, int geldwert[], int geldbetrag[]) { int i; if(betrag < geldwert[i-1]) { return; } for(i=0; i<15; i++) { if(betrag >= geldwert[i]) { geldbetrag[i]= geldbetrag[i]+1; betrag = betrag - geldwert[i]; werte(betrag, geldwert[i], geldbetrag[i]); break; } } } int main() { int geldwert[15] = {50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1}; int x; int betrag; int rest; float gbetrag; int geldbetrag[15]; printf("Geben Sie einen Betrag zwischen 0.01 & 100000.00 ein: "); // Abfrage Geldbetrag scanf("%f", &gbetrag); betrag = gbetrag*100.0001; // Geldbetrag anpassen an das Array (Geldwert) // bestes Ergebnis (geringste Anzahl an Scheinen und Muenzen) printf("\nDie beste Kombination lautet: \n"); geldbetrag[0] = betrag / geldwert[0]; rest = betrag % geldwert[0]; printf("%d Mal %d Euro %d Cent\n", geldbetrag[0], geldwert[0]/100, geldwert[0]%100); for(x=1; x<15; x++) { geldbetrag[x] = rest / geldwert[x]; rest = rest % geldwert[x]; printf("%d Mal %d Euro %d Cent\n", geldbetrag[x], geldwert[x]/100, geldwert[x]%100); // Ausgabe wie viele Scheine oder Muenzen von dem jeweiligen Muenzwert benoetigt werden } printf("\n"); // 4 weitere Kombinationen mit der geringsten Anzahl printf("\nDie 4 weiteren besten Kombinationen lauten: \n"); printf("%i", werte(5)); return 0; }
-
- wie viele parameter übernimmt die funktion laut zeile 4 und wie viele parameter übergibst du in zeile 70?
- wo werden die ergebnisse (bzw. DAS ergebnis) gespeichert?
nicht immer nur einfach alles kopieren! das hat bei karl theodor zu guttenberg nicht funktioniert und bei dir funktioniert es auch nicht. das war ein beispiel zur erläuterung von rekursion, keine lösung.
-
@Wade1234
- Upps, nur 3.
- im
geldbetrag[i]
oder nicht? Zumindest wollte ich es da speichern
Nein, das war mir klar. Daher habe ich es auch etwas umgeschrieben und meine Variablen verwendet.
-
@codinglea richtig und was möchtest du in zeile 70 ausgeben?
-
@Wade1234
dengeldbetrag[i]
... klappt aber leider nicht, wenn ich es in dermain
versuche mit :
printf("%i", geldbetrag[i])
-
@codinglea du weißt schon, dass i gar nicht definiert ist, oder?
-
@Wade1234
Ja, deswegen verstehe ich es ja auch nicht. ich habe i doch in der Funktion int werte(int betrag, int geldwert[], int geldbetrag[]) definiert... selbst wenn ich i nochmal in dermain
definiere, ändert es nichts.
-
@codinglea wenn du es in werte definierst, ist es auch nur dort definiert. außerdem ist i in werte gar nicht initialisiert, sodass du in zeile 8 auf ungültige bereiche zugreifst. lies dir doch mal die meldungen vom compiler durch.
-
@Wade1234
Arbeite so gut wie immer nur in dermain
und weiß daher nicht, wie ich das machen soll.
Ich google mal ein bisschen und probier aus, danke.
-
@Wade1234 sagte in Wechselgeld 5 besten Kombinationen:
ja es ist nötig, die unterschiede zwischen iterativer (schnell aber aufwändig zu programmieren) und rekursiver (langsam aber relativ einfach zu programmieren) lösungsfindung aufzuzeigen. oder schämst du dich für das schlechte beispiel, das du da abgeliefert hattest?
Nein, ist es nicht, weil dein Code unabhängig von rekursiv und iterativ Kacke ist. Es gibt in beiden Varianten gute Lösungen und deine ist einfach nur schlecht!