![]() |
C Hilfe bei Getränkeautomat
Guten Tag,
ich bin gerade an einer Aufgabe einen Getränkeautomaten in C zu schreiben. Dabei habe ich jetzt aber mal eine Frage bezüglich der Umsetzung. Ich möchte gerne, dass er immer das größtmögliche Geldstück/schein ausgibt. Heißt wenn die Cola 1,50 kostet und wir 10€ ihm geben, sollten 4x2€ und ein 0,50€ als Wechselgeld rauskommen. Die Berechnung ist ja kein Problem aber mir fehlt der Ansatz zur Ausgabe mit den Geldstücken. Erstmal sollen nur Einwürfe mit größe als 10€ möglich sein. Das einzige was mir so in den Sinn käme wäre ein switchcase mit jedem erdenklichen Betrag zu machen =D PHP-Code:
Schonmal danke im vorraus! |
int x = auszugebenesGeld / 10:
Danach steht in x die Anzahl der auszugebenen 10€-Scheine. So kann man es auch mit den übrigen Geldbeträgen machen. |
Ich glaube du verstehst da was falsch oder? Ich möchte ja keine 10€ nur ausgeben sondern eben 0,01 0,02 0,05 0,10 0,20 0,50 1,00 2,00 10,00 20,00 50,00... Stücke und Scheine ausgeben, wobei er immer das höchstmögliche ausgeben soll. Also wenn die Cola 1€ kostet und man 2€ einschmeißt sollen nicht 2x0,50€ kommen sondern 1€
|
Du musst mit dem Modulo-Operator arbeiten und vom größten Geldstück/-schein bis zum kleinsten runtergehen und das ausgegebene subtrahieren.
10€ gegeben und 1,50€ kostet die Coke. erg = 10 - 1,50 // erg = 8,50 e1 = 8,50 / 2 // e1 = 4 --> da der Rest einfach verworfen wird vom System rest = erg % 2 // e1 = 0,50 --> das ist der Betrag mit dem du weiter rechnen musst kannst ja als nächstes zuerst prüfen ob rest >= nächstKleinereMünze (in diesem Fall 1€) erspart eventuell Rechenleistung |
Genau das wird passieren wenn du die Idee von Your_Conscience nimmst.
Du hast, um bei deinem Beispiel zu bleiben, 1.50€ für eine Cola und 10€ reingesteckt. Also teilst du durch die nächst kleinere Ausgabemöglichkeit (ausgehend vom eingeworfenen Betrag), da ja keine größere Summe bzw die gleiche Summe ausgegeben willst als eingworfen wurde. 1. int rueckgeld=8.5/2 int rueckgeld=4 =>4x 2€ werden ausgegeben. 2. int rueckgeld = 0.5/1 int rueckgeld = 0 =>0x 1€ werden ausgegeben 3. int rueckgeld = 0.5/0.5 int rueckgeld =1 => 1x 50 Cent werden ausgegeben. Macht genau: 4x 2€ und 1x 50 Cent EDIT: Der Wurm war schneller ;) |
Am besten du speicherst dir die Werte vorher in ein Array ab.
Hier mal eine flüchtige Lösung von mir, ich habe dein Programm aus praktischen Gründen mal etwas umstrukturiert. |
ich würdes es anders machen
rückgeld - 2= ergebnis größer null --> ausgabe und zurück rückgeld- 1= ergebnis größer null |
Viele Wege führen nach Rom...^^
Um zu wissen, bei welcher Münze/Schein du anfangen sollst, kannst du dem ganzen voran eine if-else-Anweisung geben, die überprüft ob Restgeld >= 500€ wenn nicht, dann überprüfe ob Restgeld >= 200€, ... |
Zitat:
sagt das aus, das der payed und payed2 zusammenlegt? 51 error: 'for' loop initial declarations are only allowed in C99 mode| 51 note: use option -std=c99 or -std=gnu99 to compile your code| 53 error: expected expression before 'int'| 54 error: expected expression before 'int'| Der möchte das Programm nicht starten. Letzteres versteh ich auch nicht ganz. Das ist doch eine for-Schleife? Was genau passiert dann? |
line 41 bedeutet einfach das payed = payed + payed2 ist.
Der "Fehler" in Zeile 51 ist, dass in der Schleife int i deklariert wird, was ab dem C99 Standard erlaubt ist. Dein Compiler ist auf C89 eingestellt. Die Lösung für das "Problem" findest du hier: use option -std=c99 or -std=gnu99 to compile your code| |
Bezieht sich die Frage auf grundlegendes Wissen über Schleifen oder auf ein spezielles Bsp.?
|
Die Bedingungen in der Klammer versteh ich nicht so ganz.
Code:
(int i = 11; i >= 0; i--) Code:
int i; und die Verbindung zwischen dollars und Zahlen ist mir irgendwie unerklärlich. Woher weiß jetzt das Programm, dass es 2€ nehmen muss statt 0,50€? if (payed >= dollars[i]) { |
Zitat:
"i >= 0;" die Schleife läuft so lange, wie i größer oder gleich 0 ist, erst wenn i < 0 bricht sie ab "i--" ist das Gleiche wie "i = i - 1", dadurch wird vom i bei jeden Schleifendurchlauf 1 subtrahiert, i bekommt also die Werte 11, 10, 9, ... Zitat:
Wird die Variable vor der Schleife deklariert, ist sie dem Programm auch noch nach dieser bekannt. Beim obigen Beispiel ist sie nur in der Schleife bekannt. In diesem Programm macht es von der Funktion her aber keinen Unterschied. Zitat:
Code:
double dollars[12] = {0.01, 0.05, 0.10, 0.25, 0.50, 1, //Münzen Also: dollars[0], dollars[1], ..., dollars[11] Diese Variablen erhalten die Werte in den Klammer dahinter in der angegebenen Reihenfolge. Das ergibt: dollars[0] = 0.01 dollars[1] = 0.05 ... dollars[11] = 100 Wäre i z.B. 5 und man würde auf dollars[i] zugreifen, würde man das 6. dollars ansprechen, also den Wert 1. Das "erste" Element ist das "nullte". Da i am Anfang 11 ist, wird in der Schleife zuerst überprüft, ob played >= 100 ist. |
Zitat:
|
Es müsste in Codeblocks einen Menüpunkt geben in dem du das einstellen kannst. Wo dieser genau zu finden ist kann ich dir nicht sagen, da ich CB selber nicht benutze.
|
Okay.
Ist C99 das aktuellste? Ist es unüblich diese zu mischen? Zudem verstehe ich jetzt diese beiden Fehler nicht: 31 warning: zero-length ms_printf format string 32 error: expected ';' before '}' token |
Zitat:
"Mischen", ist nicht das richtige Wort. Es geht darum, einen Standard auszuwählen, entsprechend der Funktionalitäten die man braucht und sich dann daran zu halten. Für die anderen Punkte wäre der Code in den Zeilen nützlich. |
Ist der Code von Your_Conscience aber der hat keine Zeilen also der Teil:
Code:
switch(choice) { Code:
case 3: costs = 1.20; |
Das mit dem Fehler kann so nicht sein. Ich habe den Code gerade aus seinem Post kopiert und eingefügt. Bei mir funktioniert der Code.
Ich habe nur in den Zeilen: printf("%d x %10.02lf$\n", (int)(payed / dollars[i]), dollars[i]); payed -= (int)(payed / dollars[i]) * dollars[i]; Klammern um int gesetzt. Da hast du vermutlich etwas falsch abgetippt oder kopiert. |
Also das mit -std=c99 scheint nur zu funktionieren wenn ich es im Projekt unter den Optionen festlege. Wenn ich es aber so in den Text reinschreibe funktioniert es nicht. Also ich werd aus den Dingern nicht schlau xD
Nungut, es lag an den () für int nun aber wieder weitere Fehler :D: In function 'main': 32 error: expected ';' before '}' token === Build finished: 1 errors, 0 warnings === aber da ist doch alles richtig O.o PHP-Code:
|
Ich kann leider auch nichts finden. Die Fehlermeldung erscheint aber meistens, wenn ein fehlendes schließendes Segment, wie ein Semikolon oder eine KlammerZu oder ein schließendes Anführungszeichen fehlt.
Hast du es vor dem kompilieren gespeichert und dann neu ausgeführt oder verwendest du vllt noch den alten Code (bei Visual Studio möglich)? |
Ja habe gespeichert. Inwiefern den alten Code?
Wie kann man die Datei nochmal mit der Console kompilieren, vieleicht liegts ja daran? |
Zitat:
|
Wow ich habs geschafft :D Es läuft! ^^
Das war die Hilfe: [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] Er hat nachdem ich -std=c99 in den optionen hinzugefügt hatte es nicht mehr als Fehler erkannt in wirklichkeit war es abe nicht richtig und ich habe es umgeschrieben nach: PHP-Code:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.