Hallo, ich befasse mich grade mit C und der Kommandozeile. Compilieren mache ich mit MinGW 3. Es soll ein Kaffeautomat Simulator werden. So weit, so Gut, bis auf Folgendes: Ich habe eine bestimmte Menge an Wechselgeld, einzeln nach Münzen sortiert, 10cnt, 20cnt, 50cnt, 1Eur, 2 Eur. Im Programmablauf errechne ich nach Münzeinwurf das Wechselgeld. Wie kann ich nun logisch bestimmen, welche Münzen als Wechselgeld ausgegeben werden? Sagen wir mal, ich habe 2 Euro eingeworfen, der Kaufpreis beträgt 50 Cent. Dann errechne ich das Wechselgeld, in Höhe von 1,50 Eur. Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden sind, und es sollen erst die größt mögliche Münze ausgegeben werden. Nicht das nur 10 Cent Münzen ausgegeben werden, obwohl noch 20 und 50 Cent Münzen vorhanden sind. Ich danke schon mal für die Hilfe. Gruß Toby
Klingt irgendwie nach Hausaufgabe. Ansonsten nach netter Spielerei, eine Uebungsaufgabe, die man am besten selbst loest.
> Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden > sind, > und es sollen erst die größt mögliche Münze ausgegeben werden. der letzte Teilsatz gibt doch schon die lösung vor
Tobias Tetzlaff schrieb: > Sagen wir mal, ich habe 2 Euro eingeworfen, > der Kaufpreis beträgt 50 Cent. > Dann errechne ich das Wechselgeld, in Höhe von 1,50 Eur. > > Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden > sind, > und es sollen erst die größt mögliche Münze ausgegeben werden. > Nicht das nur 10 Cent Münzen ausgegeben werden, obwohl noch 20 und 50 > Cent Münzen vorhanden sind. Wie würdest du das denn im realen Leben machen? Nach welcher Strategie gehst du denn vor?
Hallo, Hausaufgabe, na ja, nicht für mich! ;-) > Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden > sind, > und es sollen erst die größt mögliche Münze ausgegeben werden. der letzte Teilsatz gibt doch schon die lösung vor Ja, weiß ich ja auch schon, wie es machbar wäre, nur wie ich es schreiben soll, weiß ich noch nicht! Also, prüfen ob 50 Cent Münzen da sind, wenn ja, Ausgeben. Wenn Nein, dann prüfen ob 20 Cent da sind, wenn ja, sooft ausgeben, bis Rest kleiner ist, als 20 Cent. Ist dann ja 10 Cent. Prüfen ob 10 Cent da sind, wenn ja, Ausgeben, wenn Nein, hätte ich keinen Kaffee ausgeben dürfen! ;-) Gruß Toby
Hallo Karl Heinz, ich nehm immer erst das Klüngelgeld, damit ich nicht so ein dickes Porimone habe! ;-) Im Ernst, einen höher habe ich das schon geschrieben. Hat sich Zeitlich überschritten. Gruß Toby
Tobias Tetzlaff schrieb: > Also, prüfen ob 50 Cent Münzen da sind, wenn ja, Ausgeben. > Wenn Nein, dann prüfen ob 20 Cent da sind, wenn ja, sooft ausgeben, bis > Rest kleiner ist, als 20 Cent. Das lässt sich auch alles in einem Rutsch erledigen. die while-Schleife mit mehreren Bedingungen ist schon erfunden :-) Und der Rest sind dann einfach nur ein paar Subtraktionen, Additionen und Ausgabeanweisungen. Also nochmal die Frage: Wie steuerst du zb. ob und wieviele 20 Cent Münzen ausgegeben werden. Antwort: Du gibst solange 20 Cent Münzen her, solange (while) * noch Münzen im Vorrat sind UND * der auszugebende Betrag größer als 20 Cent ist oder in C
1 | Anzahl20Cent = 0; |
2 | while( Nr20Cent > 0 && Betrag >= 0.20 ) { |
3 | Nr20Cent--; // Jetzt ist eine Münze weniger im Vorrat |
4 | Anzahl20Cent++; // Dafür wird eine 20 Cent Münze mehr ausgegeben |
5 | Betrag -= 0.20; // und der auszugebende Betrag verringert sich um 20 Cent |
6 | }
|
Wobei es allerdings nicht so schalu ist, Geldbeträge in Gleitkomma darzustellen. Besser wäre es wenn Betrag nicht in Euro angegeben ist, sondern in Cent. Dann kann das eine int Variable sein und man hat keine Probleme mit Rechenungenauigkeiten in der 12 Nachkommastelle.
Gib jemandem eine Loesung, dann hilfst du ihm fuer den Moment. Bring ihn dazu die Loesung selbst zu finden, dann hilfst du ihm fuer's ganze Leben. Wirklich Leute, ich weiss ja, es gibt euch ein gutes Gefuehl zu helfen - aber manchmal ist die groesste Hilfe, nicht zu helfen.
Hallo Peter, Hallo Karl Heinz, Mit der while Funktion geht es nicht, da ich auswerten muss, wenn keine Geldstücke mehr zur Ausgabe bereit stehen. Das geht nur mit if / else. Ich klappere nun alle Geldstücke von groß nach klein durch. Außerden darf ich nicht sofort das Geld ausgeben, da, falls keine passenden Münzen vorhanden sind, das eingeworfene Geld wieder ausgeben muss. Daher das Wechselgeld_temp. Soviel zum Thema selbst lernen, Peter. if ( Cent >= Preis ) { Wechselgeld = Cent - Preis; Wechselgeld_temp = Cent - Preis; if ( (Wechsel_2Euro > 0) && (Wechselgeld_temp >= 200 ) ) { Anzahl_2Euro ++; // ausgegebene 2 Euro erhöhen Wechselgeld_temp -= 200; // Wechselgeld um 2 Euro verringern printf("Ihr Wechselgeld: %dx 2 Euro\n\r", Anzahl_2Euro); } else { printf("Fehler: Keine 2 Euro Stuecke Wechselgeld \n\r"); } if ( (Wechsel_1Euro > 0) && (Wechselgeld_temp >= 100 ) ) { Anzahl_1Euro ++; // ausgegebene 1 Euro erhöhen Wechselgeld_temp -= 100; // Wechselgeld um 1 Euro verringern printf("Ihr Wechselgeld: %dx 1 Euro\n\r", Anzahl_1Euro); } else { printf("Fehler: Keine 1 Euro Stuecke Wechselgeld \n\r"); } if ( (Wechsel_50cnt > 0) && (Wechselgeld_temp >= 50 ) ) { Anzahl_50Cent ++; // ausgegebene 50 Cent erhöhen Wechselgeld_temp -= 50; // Wechselgeld um 50 Cent verringern printf("Ihr Wechselgeld: %dx 50 Cent\n\r", Anzahl_50Cent); } else { printf("Fehler: Keine 50 Cent Stuecke Wechselgeld \n\r"); } if ( (Wechsel_20cnt > 0) && (Wechselgeld_temp >= 20 ) ) { Anzahl_20Cent ++; // ausgegebene 20 Cent erhöhen Wechselgeld_temp -= 20; // Wechselgeld um 20 Cent verringern printf("Ihr Wechselgeld: %dx 20 Cent\n\r", Anzahl_20Cent); } else { printf("Fehler: Keine 20 Cent Stuecke Wechselgeld \n\r"); } if ( (Wechsel_10cnt > 0) && (Wechselgeld_temp >= 10 ) ) { Anzahl_10Cent ++; // ausgegebene 10 Cent erhöhen Wechselgeld_temp -= 10; // Wechselgeld um 10 Cent verringern printf("Ihr Wechselgeld: %dx 10 Cent\n\r", Anzahl_10Cent); } else { printf("Fehler: Keine 10 Cent Stuecke Wechselgeld \n\r"); } }
naja wirklich schön ist der code nicht. warum muss es gleich ein fehler sein, wenn keine 2€ stücke vorhanden sind, wenn noch genug anderes kleingeld vorhanden ist, ist es ja kein Problem. Dann hast du noch ein problem wenn du mal sehr viel rausgeben musst (weil du ebend jetzt keine while schleife mehr ist). Es kann ja sein das du 4 2€ stücke rausgeben musst. Wenn du schon, wie es richtig ist mit Ganzzahlen rechnest, musst du ja nicht jedes geldstück einzeln berechnen, dafür gibt es dann div und mod. bei 9€ Wechselgeld anzahl an 2€ stücken = wechselgeld / 2 = 4 welchselgeld = wechselgeld % 2 = 1 1€ stücke = wechselgeld / 1 = 1 welchselgeld = wechselgeld % 1 usw.
nachtrag: es fehlt noch die beachtung ob auch genug kleingeld vorhanden ist
> Mit der while Funktion geht es nicht, while ist keine Funktion. > da ich auswerten muss, wenn keine Geldstücke mehr zur Ausgabe > bereit stehen. Das geht nur mit if / else. Warum? Du willst doch so lange Geldstücke ausgeben, wie welche vorhanden sind und ihre Summe nicht den Wechselbetrag übersteigt. Das macht man mit while, nicht mit if / else. > Ich klappere nun alle Geldstücke von groß nach klein durch. Genau. > Außerden darf ich nicht sofort das Geld ausgeben, da, falls keine > passenden Münzen vorhanden sind, das eingeworfene Geld wieder > ausgeben muss. Richtig. In deinem Code kommt keine Schleife vor. So klappt der Vorgang immer nur dann, wenn von jedem Geldstück-Typ maximal eines ausgegeben werden muß. Übrigens fehlt noch das Dekrementieren von Wechsel_*, wenn du das entsprechende Anzahl* inkrementierst.
Hallo, Übrigens fehlt noch das Dekrementieren von Wechsel_*, wenn du das entsprechende Anzahl* inkrementierst. Ich dekementiere nicht, da ich ja noch nicht weiß, ob genügend Wechselgeld vorhanden ist. Das wollte ich nach der Prüfung des Wechselgeldes machen. Mit den ganzen If's gehts aber auch nicht so, wie ich denke. Außerdem hat Peter recht, mit den Fehlern, die keine sind. Ich versuche es nun doch wieder mit der while "SCHLEIFE". Allerdings werden bei folgendem Bestand 2 Euro 10x 1 Euro 10x 50 Cent 0 x 20 Cent 10x 10 Cent 1 x 2 Euro Einwurf und 50 Cent Preis (Wechselgeld = 1,50 Euro) nur 1x 1 Euro 2x 20 Cent ausgegeben. Ist ja auch klar, da weder 50er noch 10er da sind. Nur wie und wo bekomme ich es nun in der while Schleife mit, das der Bestand bereits null ist? Hier nochmal die while Schleifen // Funktion zur Rückgabe von 2 Euro wird nie aufgerufen, da höchstens 2 Euro eingeworfen werden können // daher ist diese Funktion überflüssig while ( (Wechsel_2Euro > 0) && (Wechselgeld >= 200 ) ) { Wechsel_2Euro --; Anzahl_2Euro ++; Wechselgeld -= 200; } printf("Ihr Wechselgeld: %dx 2 Euro\n\r", Anzahl_2Euro); while ( (Wechsel_1Euro > 0) && (Wechselgeld >= 100 ) ) { Wechsel_1Euro --; Anzahl_1Euro ++; Wechselgeld -= 100; } printf("Ihr Wechselgeld: %dx 1 Euro\n\r", Anzahl_1Euro); while ( (Wechsel_50cnt > 0) && (Wechselgeld >= 50 ) ) { Wechsel_50cnt --; Anzahl_50Cent ++; Wechselgeld -= 50; } printf("Ihr Wechselgeld: %dx 50 Cent\n\r", Anzahl_50Cent); while ( (Wechsel_20cnt > 0) && (Wechselgeld >= 20 ) ) { Wechsel_20cnt --; Anzahl_20Cent ++; Wechselgeld -= 20; } printf("Ihr Wechselgeld: %dx 20 Cent\n\r", Anzahl_20Cent); while ( (Wechsel_10cnt > 0) && (Wechselgeld >= 10 ) ) { Wechsel_10cnt --; Anzahl_10Cent ++; Wechselgeld -= 10; } printf("Ihr Wechselgeld: %dx 10 Cent\n\r", Anzahl_10Cent); Hmm, habs schon: Nach den while's schaue ich, ob noch Wechselgeld da ist, also noch ausgegeben werden muss. Dadurch kann ich darauf reagieren, und das eingeworfene Geld zurück geben, und kein Getränk ausgeben. ... ... if ( Wechselgeld > 0 ) { printf("Fehler: Kein passendes Wechselgeld \n\r"); } Gruß Toby
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.