if bedingung (mehrere bedingungen)
-
Hi,
fange gerade wieder an mich in C einzulernen und bin gleich mal auf ein nerviges Problem gestoßen.Ich schaffe es nicht in einer if Bedingung mehrere Bedingungen zu verwenden.
Das die Bedingungen innerhalb der if mit || oder && etc getrennt werden ist mir klarAber wenn ich zum Beispiel alle Euro Münzen akzeptieren möchte(werte wie 0.3 oder 3
damit nicht)
if(einwurf==0.1,0.2,0.5,1,2)
ausführen
else
ungültiger einwurf
continueklappt das nicht, auch die lange variante mit if(einwurf==0.1 && einwurf==0.2 etc) nicht, da er die 0.1 werte nicht zu akzeptieren scheint.
Was er jedoch akzeptiert ist if(einwurf==1 && einwurf==2), aber damit hab ich die cent münzen nicht drin.kann mir da jemand helfen, wie ich solche mehrfach bedingungen am besten einbaue?
-
Nenn mal eine Zahl, die sowohl 0.1 und auch 0.2 ist.
Die erste Version,
if(einwurf==0.1,0.2,0.5,1,2)
, ist totaler Unsinn, wie dir hoffentlich bewusst ist. Falls nicht: Schnapp dir mal ein gutes Grundlagenbuch. Programmieren ist nicht das Aneinanderreihen zufälliger Zeichen, bis es compiliert. Du musst von jedem Zeichen genau wissen, wo und warum du es setzt. Hier weißt du offensichtlich nicht, was ein Komma macht.Allgemein ist eine Fließkommazahl der wohl ungeeignetste Basisdatentyp für Geldbeträge. Eine anfängerfreundliche, funktionierende Lösung wäre, mit Ganzzahlen (integer) in Cent zu rechnen.
-
SeppJ schrieb:
Nenn mal eine Zahl, die sowohl 0.1 und auch 0.2 ist.
Wenn (einwurf == 1 && einwurf == 2) funktioniert, dann ist das doch eine Kleinigkeit
-
Bashar schrieb:
SeppJ schrieb:
Nenn mal eine Zahl, die sowohl 0.1 und auch 0.2 ist.
Wenn (einwurf == 1 && einwurf == 2) funktioniert, dann ist das doch eine Kleinigkeit
Naja (einwurf == 0.1 && einwurf == 1 && einwurf == 2) funktioniert nicht, desshalb komm ich ja nicht weiter, hm.
Un das die Komma anneinandersetzung nicht geht war mir schon klar, dahingegen wollt ich eher eine lösung womit ich sagen wir mal 7 werte in die if bedingung setzen kann ohne das sie wie hier grade dann 7 "einwurf == x" beinhaltet.
-
Nun Du hast es immer noch nicht ...
Was kann eingeworfen worden sein?
1Euro oder 2Euro oder 50Cent ...
-
10cent, 20cent, 50cent, 1euro, 2euro sollen eingeworfen werden können.
Habe den fehler schon einschränken können
if(einwurf==0.1 || einwurf==0.2 || einwurf== 0.5 || einwurf==2)0.5 und 2 (und 1) funktionieren.
0.1 und 0.2 nichtwas jetzt für mich gar keinen sinn mehr macht, denn warum funktioniert 0.5 aber 0.1 nicht...?
-
Ich weiß ja nicht, woher die Variable einwurf ihre Werte hat, aber wahrscheinlich liegt es daran, dass 0.1 und 0.2 keine exakte Gleitkommadarstellung haben (im Gegensatz zu 0.5, 1 und 2.) Vielleicht solltest du den ganzen Entwurf mal so überarbeiten, dass mit Ganzzahlen gearbeitet wird.
-
die einwurf variable wird kurz davor mit 0 initialisiert als float, bekommt also keine werte vorher
und dann eingelesen vom benutzer mit float TypWie würde ich das ganze denn nur mit ganzen zahlen schreiben bei .x werten?
-
Allgemein ist eine Fließkommazahl der wohl ungeeignetste Basisdatentyp für Geldbeträge. Eine anfängerfreundliche, funktionierende Lösung wäre, mit Ganzzahlen (integer) in Cent zu rechnen.
-
na klar kann ich das mit 10,20 cent und 1euro=100 cent, 2 euro=200 cent machen, aber das is doch umständlich...?
Was gibts es denn für einen grund warum es nicht mit gleitkommazahlen geht,
wenn es bei anderen programmen nie probleme beim einlesen von .x zahlen gibt?
-
wenn du mit real zahlen machen willst, würde ich >= verwenden
real bzw. Gleitpunktzahlen nie auf Gleichheit prüfen, das klappt in den wenigsten Fällen. (Kannte mal nen Spezialisten, der hat immer den Wert eines Temperaturfühlers mit == abgefragt)
-
Hawkaru schrieb:
die einwurf variable wird kurz davor mit 0 initialisiert als float, bekommt also keine werte vorher
und dann eingelesen vom benutzer mit float TypTja, genau das ist das Problem. Quick-Fix:
- Du vergleichst mit float-Konstanten:
einwurf == 0.1f
ODER - Du deklarierst einwurf als double.
Beim nächsten Mal gleich mit int.
- Du vergleichst mit float-Konstanten:
-
Bashar schrieb:
Hawkaru schrieb:
die einwurf variable wird kurz davor mit 0 initialisiert als float, bekommt also keine werte vorher
und dann eingelesen vom benutzer mit float TypTja, genau das ist das Problem. Quick-Fix:
- Du vergleichst mit float-Konstanten:
einwurf == 0.1f
ODER - Du deklarierst einwurf als double.
Beim nächsten Mal gleich mit int.
Hah, danke das 1) hat geklappt
das 2) mit double macht keinen unterschied, erkennt sie trotzdem nicht.Und mit int geht das natürlich aber dann würd ich ja nie mehr mit gleitkommazahlen arbeiten
Abschlussfrage, wenn ich das richtig verstanden habe, kein problem mit gleitkommazahlen zu arbeiten solange ich sie nicht durch Gleicheit wie == oder != abfrage?
- Du vergleichst mit float-Konstanten:
-
Hawkaru schrieb:
Und mit int geht das natürlich aber dann würd ich ja nie mehr mit gleitkommazahlen arbeiten
Na und? Gleitkommazahlen sind hier nicht der richtige Datentyp und in vielen anderen Fällen auch nicht. Man muss nicht immer alles benutzen, bloß weil es das gibt.
Abschlussfrage, wenn ich das richtig verstanden habe, kein problem mit gleitkommazahlen zu arbeiten solange ich sie nicht durch Gleicheit wie == oder != abfrage?
Wichtige Feststellung: Gleitkommazahl ist nicht das, was man umgangssprachlich "Kommazahl" nennt. Gleitkommazahlen sind die Computerannäherung an das Kontinuum. Das heißt, sie finden vor allem in der Numerik und Computerphysik ihre Anwendung. Geld hingegen ist eine diskrete Größe, also vom Verhalten her quasi das Gegenteil von einer kontinuierlichen Größe. Daher sind Gleitkommazahlen derart ungeeignet für Finanzberechnungen.
Lass dich nicht täuschen von der Ähnlichkeit in der Darstellung. Klar, Geld kann man als Kommazahl schreiben und die Gleitkommazahlen ebenfalls. Aber zu denken, dass sie deswegen miteinander verwandt wären, ist ein Trugschluss. Solche Modellierungprobleme werden dir noch öfters begegnen. Viele Anfängeraufgaben beinhalten den Umgang mit Daten, die auf den ersten Blick wie etwas anderes aussehen. Bekannte Beispiele sind Telefonnummern, Postleitzahlen und Kontonummern, die zwar auf den ersten Blick wie Zahlen aussehen, aber in Wirklichkeit Ziffernfolgen sind. Solche Beispiele gibt es zuhauf. Du musst da drauf achten, wie eine Größe sich verhält, wenn du den richtigen Datentyp wählen möchtest, nicht, wie sie auf Papier geschrieben aussieht.
-
Vielen Dank an alle für die gute und schnelle Hilfe.
und danke für den wichtigen Hinweis Sepp
-
Ich liebe das gute alte Cobol. Das hat für sowas pic 9999999v99. und das V steht für das Komma und da wird genau gearbeitet - schon mit cobol 68 (aus dem Jahre 1968). Habs selbst hier mit dem Hercules und mvs 3.8 am Laufen. Ist für monetäre Programme, wie Pferdeverwaltung mit Abrechnung Stallkosten ideal.
-
Jo, und in C gibts dafür int und long long. Da wird ebenso genau gearbeitet, aber weniger Speicher gebraucht und schneller gerechnet.
-
Hab mal spaßeshalber das auf ner realen Z/OS ausprobiert - Original
Cobol-68 Lademodul - Format spielt beim Rechnen (5.000.000 Durchläufe
einer Addition keine Rolle - nicht messbar auf heutigen Maschinen.08.55.28 JOB28311 ---- FRIDAY, 20 SEP 2013 ----
08.55.28 JOB28311 IRR010I USERID QSCHAE IS ASSIGNED TO THIS JOB.
08.55.28 JOB28311 ICH70001I QSCHAE LAST ACCESS AT 07:59:25 ON FRIDAY, SEPTEM
08.55.28 JOB28311 $HASP373 QSCHAECP STARTED - INIT 3 - CLASS A - SYS AOK1
08.55.28 JOB28311 IEF403I QSCHAECP - STARTED - TIME=08.55.28
08.55.28 JOB28311 +BEGINN CPUTEST
08.55.28 JOB28311 +ZAEHLEN BINAER
08.55.28 JOB28311 +BINAER FERTIG
08.55.28 JOB28311 +ZAEHLEN GEPACKT
08.55.28 JOB28311 +ZAEHLEN GEPACKT FERTIG
08.55.28 JOB28311 +ZAEHLEN UNGEPACKT
08.55.28 JOB28311 +ZAEHLEN UNGEPACKT FERTIG
08.55.28 JOB28311 +CPU-TEST BEENDET