-
14. 12. 2012, 10:42 #1Mitglied
- Registriert seit
- Feb 2008
- Beiträge
- 440
- Danksagungen
- 2
Fehler bei Getränkeautomat in C
Halli hallo,
ich haben folgenden Code und bekomme immer diesen Fehler (anscheinend ist da aber kein Fehler zusehen?):
In function 'main':
32 error: expected ';' before '}' token (habe die Line markiert)
=== Build finished: 1 errors, 0 warnings ===
Kann mir da jemand von euch helfen?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); -std=c99; switch (choice) { case 1: costs = 1.85; printf("\nYou choose Coca Cola. Please insert 1.85$: "); break; case 2: costs = 1.45; LINE 32 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; }
Vielen Dank im vorraus!Geändert von Larius (14. 12. 2012 um 21:59 Uhr) Grund: Will was ausprobieren -> php auf code abgeändert.
-
14. 12. 2012, 11:24 #2
Re: Fehler bei Getränkeautomat in C
Das einzige was an dem Code nicht passt ist das -std=c99 in Zeile 24, wie auch immer das da hingekommen ist. Warum dein Compiler dann einen Fehler in Zeile 32 anzeigt weiß ich nicht.
-
14. 12. 2012, 11:27 #3Mitglied
- Registriert seit
- Apr 2011
- Beiträge
- 139
- Danksagungen
- 3
Re: Fehler bei Getränkeautomat in C
Ich Hoffe das ist ein Copy&Paste Error das -std=c99 sollte auf der Commandline nicht in den C Code.
hier willst du eine funktion namens int rufen welche ein parameter hat.
ich denke du willst hier ein cast machen. dann müsstest du das ganze sol machen
Abgesehen von denn zwei Sachen ist dein Programm syntaktisch Korrekt und sollte Kompilert werden können.PHP-Code:payed -= (int) (payed / dollars[i]) * dollars[i];
Generell würde ich dir jedoch raten das du das Programm so umgestalltest das es intern mit Cent rechnet. Das hätte den Vorteil das deine beträge Komplett in int speichern könntest und so die Rundungfehler vermeiden kannst welche double haben kann.
Ausserdem kann man sicher noch an einigen stellen Optimieren. So gibtst du oft werte in den printf aus welche du dannach ein zweites mal berechnest, im switch den betrag welchen du in "costs" speicherst und in der for schleife am ende. Das ist ineffektiv und kann dadürch verbessert werden das due denn Variablen inhalt ausgibst.
Wenn du ein fleiss Bienchen haben willst fällt dir sicher auch auf das die printf im switch sich nur durch den Getränke namen unterscheiden. denn könnstest du vielleicht auch in eine Variable (char array == String ) packen und das printf nur einmal nach den switch rufen.
-
14. 12. 2012, 11:59 #4
Re: Fehler bei Getränkeautomat in C
> hier willst du eine funktion namens int rufen welche ein parameter hat.
In C++ wäre das ist eine gültige Möglichkeit für einen Typecast. Das nennt sich function-style cast. In C ist das eigentlich nicht möglich.
> Generell würde ich dir jedoch raten das du das Programm so umgestalltest das es intern mit Cent rechnet.
> Das hätte den Vorteil das deine beträge Komplett in int speichern könntest und so die Rundungfehler vermeiden kannst welche double haben kann.
Das ist mir auch gerade aufgefallen. Wenn man zum Beispiel Coca Cola bestellt und 2 bezahlt, gibt es 1x10 und 4x1 als Rückgeld. Wenn man mit Gleitkommazahlen rechnet hat man immer Ungenauigkeiten.
Außerdem funktioniert der Platzhalter %lf bei printf nicht so richtig. Eigentlich sollte das mit C99 nichts ausmachen, aber bei mir gibt er für alle Zahlen 0.00 aus. Verwende lieber nur %f, das vermeidet Probleme.
-
14. 12. 2012, 12:00 #5Mitglied
(Threadstarter)
- Registriert seit
- Feb 2008
- Beiträge
- 440
- Danksagungen
- 2
Re: Fehler bei Getränkeautomat in C
Ich habs da einfach hingemacht, weil ich selber keine Ahung hatte ob es einen bestimmten Platz braucht^^ Habe es jedoch in den Einstellungen eingestellt aber wo muss es den in dem Code hin?
Ja Programm werde ich noch in Cent rechnen lassen.
Dann gibt er mir aberwarning: format '%f' expects type 'float *', but argument 2 has type 'double *' als Fehler aus obwohl es ja richtig ist?
Trotz alledem ist immernoch das Problem da wie zu Anfang xDGeändert von Metal_Rex (14. 12. 2012 um 12:10 Uhr)
-
14. 12. 2012, 19:42 #6
Re: Fehler bei Getränkeautomat in C
-std=c99 ist ein Compilerflag und gehört im Code überhaupt nirgends hin. Und auch wenn das nirgendwo im Code steht kommt immer noch ein Fehler in Zeile 32?Ich habs da einfach hingemacht, weil ich selber keine Ahung hatte ob es einen bestimmten Platz braucht^^ Habe es jedoch in den Einstellungen eingestellt aber wo muss es den in dem Code hin?
Das mit dem %lf bzw. %f ist mal wieder vom Compiler abhängig und vom verwendeten Standard und vor allem wie genau sich der Compiler an den Standard hält. Wenn dein Compiler lieber %lf will und die Zahlen richtig ausgegeben werden dann lass es so, ich wollte es nur erwähnen falls du damit mal Probleme hast. Eigentlich sollte %lf auch funktionieren mit C99, aber der gcc hat damit irgendwie ein Problem.
Welchen Compiler hast du denn?
-
14. 12. 2012, 20:17 #7Mitglied
(Threadstarter)
- Registriert seit
- Feb 2008
- Beiträge
- 440
- Danksagungen
- 2
Re: Fehler bei Getränkeautomat in C
Ich nutze Code Blocks mit gcc ist das dann? BIn mir aber selber unsicher welchen IDE ich nutzen soll. Daran kann es aber nicht liegen?
Ja trotzdessen kommt das Problem in Zeile 32. Vorallem ist es richtig.
-
14. 12. 2012, 22:07 #8Mitglied
- Registriert seit
- May 2007
- Beiträge
- 181
- Danksagungen
- 1
Re: Fehler bei Getränkeautomat in C
Kannst du das übersetzen?Code:// Getränkeautomat #include <stdio.h> #include <stdlib.h> int main() { //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 int i; //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$"); 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 (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; }
-
14. 12. 2012, 23:41 #9
Re: Fehler bei Getränkeautomat in C
Ich habe auch CodeBlocks mit (mingw) gcc. An der IDE liegt es wohl kaum, wenn dann an der Compilerversion. Aber wenn ich die Casts korrigiere lässt sich der Code problemlos kompilieren, sowohl mit dem mingw gcc unter Windows als auch mit dem gcc unter Linux.
Mir fällt dazu nicht mehr viel ein.
In Zeile 32 ist weit und breit keine geschweifte Klammer zu sehen, alle Semikolons sind da wo sie sein sollen, keine Ahnung was der Compiler will.
Eventuell hilft ein Compilerupdate. Ich bin zwar nicht davon überzeugt dass es hilft, aber das sind eben die Verzweiflungstipps, wenn sonst nichts hilft
(retry, restart, reinstall oder so ähnlich)
-
16. 12. 2012, 13:53 #10Mitglied
(Threadstarter)
- Registriert seit
- Feb 2008
- Beiträge
- 440
- Danksagungen
- 2
Re: Fehler bei Getränkeautomat in C
Mh i wie liefs gestern und heut nimmer
-


Zitieren

mehr lesen...







Google Glass: Offener Brief von...
Heute, 09:42 in gulli:news