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:
// Getränkeautomat
#include <stdio.h> #include <stdlib.h>
int main() {
//Getränkeliste printf("\n Our drinks:"); printf("\n--------------------------"); printf("\n1) Coca Cola 1.85$"); printf("\n2) Ice Tea 1.45$"); printf("\n3) Water 1.20$");
//Getränkeauswahl int choice; float drink1, drink2, drink3;
printf("\n\n\nPlease choose your drink: "); scanf("%d", &choice);
switch(choice) {
case 1: do{ printf("\nYou choose Coca Cola. Please insert 1.85$: "); //Kann man das $ Zeichen hinter die Eingabe bekommen? scanf("%f", &drink1);
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
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
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.
Code:
// Getränkeautomat
#include <stdio.h>
#include <stdlib.h>
int main() {
//Getränkeliste
printf("\n Our drinks:");
printf("\n--------------------------");
printf("\n1) Coca Cola 1.85$");
printf("\n2) Ice Tea 1.45$");
printf("\n3) Water 1.20$");
//Getränkeauswahl
int choice;
double costs, payed, payed2;
double dollars[12] = {0.01, 0.05, 0.10, 0.25, 0.50, 1, //Münzen
2, 5, 10, 20, 50, 100} ; //Scheine, keine 1$ Note
printf("\n\n\nPlease choose your drink: ");
scanf("%d", &choice);
switch (choice) {
case 1:
costs = 1.85;
printf("\nYou choose Coca Cola. Please insert 1.85$: ");
break;
case 2:
costs = 1.45;
printf("\nYou choose Ice Tea. Please insert 1.45$: ");
break;
case 3:
costs = 1.20;
printf("\nYou choose Water. Please insert 1.20$: ");
break;
default:
printf("\nYou choose nothing. See you!");
exit(0);
}
scanf("%lf", &payed);
while (payed < costs) {
printf("Please insert more money (%2.2lf$ left): ", costs - payed);
scanf("%lf", &payed2);
payed += payed2;
}
printf("\nYou insert: %2.2lf\nYour change: %.2lf\n", payed, payed - costs);
if (payed > costs) {
printf("Take:\n");
payed -= costs; //in payed steht ab jetzt nur noch das verbleibende Wechselgeld
for (int i = 11; i >= 0; i--) {
if (payed >= dollars[i]) {
printf("%d x %10.02lf$\n", int(payed / dollars[i]), dollars[i]);
payed -= int(payed / dollars[i]) * dollars[i];
}
}
}
return 0;
}
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.
Code:
// Getränkeautomat
#include <stdio.h>
#include <stdlib.h>
int main() {
//Getränkeliste
printf("\n Our drinks:");
printf("\n--------------------------");
printf("\n1) Coca Cola 1.85$");
printf("\n2) Ice Tea 1.45$");
printf("\n3) Water 1.20$");
//Getränkeauswahl
int choice;
double costs, payed, payed2;
double dollars[12] = {0.01, 0.05, 0.10, 0.25, 0.50, 1, //Münzen
2, 5, 10, 20, 50, 100} ; //Scheine, keine 1$ Note
printf("\n\n\nPlease choose your drink: ");
scanf("%d", &choice);
switch (choice) {
case 1:
costs = 1.85;
printf("\nYou choose Coca Cola. Please insert 1.85$: ");
break;
case 2:
costs = 1.45;
printf("\nYou choose Ice Tea. Please insert 1.45$: ");
break;
case 3:
costs = 1.20;
printf("\nYou choose Water. Please insert 1.20$: ");
break;
default:
printf("\nYou choose nothing. See you!");
exit(0);
}
scanf("%lf", &payed);
while (payed < costs) {
printf("Please insert more money (%2.2lf$ left): ", costs - payed);
scanf("%lf", &payed2);
payed += payed2;
}
printf("\nYou insert: %2.2lf\nYour change: %.2lf\n", payed, payed - costs);
if (payed > costs) {
printf("Take:\n");
payed -= costs; //in payed steht ab jetzt nur noch das verbleibende Wechselgeld
for (int i = 11; i >= 0; i--) {
if (payed >= dollars[i]) {
printf("%d x %10.02lf$\n", int(payed / dollars[i]), dollars[i]);
payed -= int(payed / dollars[i]) * dollars[i];
}
}
}
return 0;
}
line 41 payed += payed2;
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?
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€, ...
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|
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
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|
Kann man das komplett für immer im Compiler änder oder woran liegt es das es kein C99 standard ist? Ich nutze CodeBlocks
Die Bedingungen in der Klammer versteh ich nicht so ganz.
Code:
(int i = 11; i >= 0; i--)
heißt 11 durchläufe? Warum? Das i wird als int gespeichert und das wird abgerufen wenn i größer gleich 0 ist?
Code:
int i;
(i = 11; i >= 0; i--)
wäre das selbe?
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]) {
Die Bedingungen in der Klammer versteh ich nicht so ganz.
Code:
(int i = 11; i >= 0; i--)
"int i = 11;" bedeutet, dass die Variable i als int deklariert und mit 11 initialisiert wird
"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:
Zitat von Metal_Rex
Code:
int i;
(i = 11; i >= 0; i--)
wäre das selbe?
Nicht ganz.
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:
Zitat von Metal_Rex
die Verbindung zwischen dollars und Zahlen ist mir irgendwie unerklärlich. Woher weiß jetzt das Programm, dass es 2€ nehmen muss statt 0,50€?
Schau mal ganz oben im Code, da habe ich ein Array deklariert.
Das erstellt 12 Variablen mit dem Namen dollars, die über einen Index [] angesprochen werden.
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.
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.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
Ist C99 das aktuellste? Ist es unüblich diese zu mischen?
Der aktuellste C-Standard ist soweit ich weiß C11.
"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.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
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.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
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 :
In function 'main':
32 error: expected ';' before '}' token
=== Build finished: 1 errors, 0 warnings ===
aber da ist doch alles richtig O.o
PHP-Code:
// Getränkeautomat
#include <stdio.h> #include <stdlib.h>
int main() {
//Getränkeliste printf("\n Our drinks:"); printf("\n--------------------------"); printf("\n1) Coca Cola 1.85$"); printf("\n2) Ice Tea 1.45$"); printf("\n3) Water 1.20$");
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)?
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:
int i; for (i = 0; i<10; i++) { printf("i is %d\n", i); }