Benötige eure Hilfe mit meiner kleinen Übung...Schleifen (if & while)
-
Hallo zusammen
Nach längerem habe ich endlich wieder etwas Zeit gefunden, mit C weiterzumachen.Bin also noch nicht sehr erfahren damit. Nun zu meinem kleinen Problem:
Ich bearbeite gerade ein kleines Tutorial (http://www.c-howto.de/tutorial-schleifen-uebung.html) indem ein Getränkeautomat programmiert werden soll.
Der Benutzer hat die Auswahl zwischen drei Getränken. Er wählt ein Getränk, gibt die Menge an und wird dann zur Zahlung aufgefordert (für diejenigen, die dem Link nicht gefolgt sind).
Meine Version des Programms sieht folgendermaßen aus (noch nicht vollendet):
/* Getränkeautomat v.03, Übung zum Kapitel Schleifen */ int main(){ //Auswahlmenü des Automaten >> int auswahl,anzahl; double preis,einwurf,gesamteinwurf=0,fehltnoch=0,gesamtbetrag=0; printf("\nGetraenke Automat v0.3"); printf("\n\nWaehlen Sie ihr Getraenk aus:\n1) Wasser (0,50 Euro)\n2) Limonade (1,00 Euro)\n3) Bier (2,00 Euro)"); printf("\n\n\nGeben Sie 1, 2 oder 3 ein: "); //Eingabe der Auswahl >> scanf("%i",&auswahl); printf("\nWie viele Flaschen möchten Sie haben: "); scanf("%i",&anzahl); //Bearbeiten der Auswahl und Getränkeausgabe >> switch(auswahl){ case 1: preis=0.50; break; case 2: preis=1.00; break; case 3: preis=2.00; break; } gesamtbetrag=preis*anzahl; printf("\n\nBitte werfen Sie %.2lf€ ein!\nEinwurf: ",gesamtbetrag); scanf("%.2lf",&einwurf); if(einwurf==gesamtbetrag){ printf("\n\nBitte entnehmen Sie Ihre Getränke.\nVielen Dank!"); } else{ gesamteinwurf+=einwurf; while(gesamteinwurf!=gesamtbetrag){ fehltnoch=gesamtbetrag-einwurf; printf("\nEs fehlen noch %.2lf€!\nBitte noch %.2lf€ einwerfen: ",fehltnoch); scanf("%.2lf",&einwurf); gesamteinwurf+=einwurf; } printf("\n\nBitte entnehmen Sie Ihre Getränke.\nVielen Dank!"); } return 0; }
Nun habe ich, für einen ersten Testdurchlauf, als Menge 1 gewählt und ging davon aus, dass er nach der if - Anweisung (Zeile 26) das Programm beendet, da die Bedingung ja erfüllt ist.
Dies geschieht jedoch nicht, denn das Programm bleibt in einer Endlosschleife.
Hat jemand ne Idee wo nun der Fehler liegt?
Danke schonmal im Voraus für eure Hilfe
-
Aktivier die höchste Warnstufe in Deinem Compiler. Mein Compiler bemängelt einige Deiner Formatstrings.
Wenn Du dann auch Warnungen angezeigt bekommst: erstmal beheben und nochmal versuchen.
-
Jepp, definitiv falscher Formatstring.
PS: Was soll passieren, wenn zuviel eingeworfen wird? "Es fehlen noch -0.50€!"?
-
scanf hat keine precision, das "%.2lf" ist also falsch.
-
Vielen Dank für eure schnellen Antworten.
Die Warnungen des Compilers waren, weil ich "#include<stdio.h>" vergessen habe.Und scanf habe ich auch behoben.
@ oenone: Wie oben beschrieben, es ist noch nicht vollendet. Es sollte ein erster Testlauf sein um momentane Fehler zu erkennen und zu beheben. Nun kann es weiter ausgebaut werden
Habe noch ne Frage zu Schleifen:
Welche möglichkeiten habe ich folgendes zu formulieren bzw. ist das so zulässig?
z.B. if(x!=1 || x!=2 || x!=3)...
Dürfen mehrere Bedingungen in der Klammer stehen (nicht nur beim if)?
-
RobInTheHood schrieb:
Habe noch ne Frage zu Schleifen:
Das sind in diesem Fall Ausdrücke.
RobInTheHood schrieb:
z.B. if(x!=1 || x!=2 || x!=3)...
Ja, das geht.
Allerdings ist der Ausdruck relativ sinnfrei, da das Ergebnis immer wahr ist.RobInTheHood schrieb:
Dürfen mehrere Bedingungen in der Klammer stehen (nicht nur beim if)?
Beim if darf jeder gültige Ausdruck stehen.
Und die Vergleichsoperatoren und logischen Verküpfungen werden auch nicht anders gehandhabt als die arithmetischen Operatoren wie + - * /
Dabei kommt es allerdings auf die Rangfolge an (es gibt da mehr als Punkt vor Strichrechnung)
-
Der Test von Fließkommazahlen auf Gleichheit geht meist nicht gut, da viele Zahlen nicht exakt darstellbar sind.
(Im Dezimalsystem ist das z.B. 1/3 Im Zahlenformat des Rechners sind es andere)
Zudem sind die signifikanten Stellen begrenzt.Dazu kommen dann noch Rundungsfehlern.
Darum ist es meist besser (gerade bei Geldbeträgen) mit Ganzzahlen zu rechnen (z.B in Cent).
-
Nur ein Tipp: Im C-Howto wird zwar anfängerfreundlich erklärt, allerdings ist dies nicht überall so gut gelungen. Es gibt auch einige Mängel (Ich habe am Anfang selbst damit gelernt)