Währungsrechner funktioniert nicht.
-
Hallo und willkommen,
Ich hab mal eine Frage. Ich bin noch Anfänger in C und soll ein Programm schreiben, dass einen Betrag in Euro in eine von drei anderen Währungen umrechnet.
Ich hab das soweit auch fertig, aber wenn ich es starte kommt nach der ersten Eingabe ein Windows-Fenster mit folgender Meldung "waehrungsrechner.exe funktioniert nicht mehr"
Hier ist der Quellcode:
#include <stdio.h> int main(void) { double x, y, aUSD = 1.0660, bJPY = 131.5960, cCNY = 6.8075; int z; printf("Geben Sie bitte einen Geldbetrag in Euro (EUR) ein:\n"); scanf("%f\n", x); printf("In welche Waehrung soll der Geldbetrag umgerechnet werden?\n 1: US Dollar (USD)\n 2: Japanische Yen (JPY)\n 3: Chinesische Renminbi Yuan (CNY)\n"); scanf("%d\n", z); switch(z) { case 1: y = x*aUSD; break; case 2: y = x*bJPY; break; case 3: y = cCNY; break; } printf("In der ausgewaehlten Waehrung lautet der Geldbetrag:%f\n", y); return 0; }
Danke im Vorraus
-
Ich würde das "\n" in deinem scanf() Befehl entfernen, bei mir hat zu Problemen gesorgt.
-
1. Falscher formatspecifier für double
2. Dein Absturz kommt daher, dass du scanf den Wert der Variable und nicht ihre Adresse übergibst (mit &)@TocToc int main(void) ist die Funktion die beim Start des Programms aufgerufen wird. void, da keine Kommandozeilenargumente verarbeitet werden.
-
@imbajanox: Aktiviere die Warnungen von deinem Compiler (möglichst hhe Stufe) und beachte auch die Warnungen.
Behandele diese wie Fehler und beseitige deren Ursache.Denn diese Fehler kann der Compiler erkennen.
TocToc schrieb:
Ich würde das "\n" in deinem scanf() Befehl entfernen, bei mir hat zu Problemen gesorgt.
Das \n im Formatspecifier bedeutet nur, dass Whitespace überlesen werden.
Ein Leerzeichen bedeutet dasselbe.Außer bei %c und %[ werden führende Whitespace immer überlesen.
-
DirkB schrieb:
TocToc schrieb:
Ich würde das "\n" in deinem scanf() Befehl entfernen, bei mir hat zu Problemen gesorgt.
Das \n im Formatspecifier bedeutet nur, dass Whitespace überlesen werden.
Ein Leerzeichen bedeutet dasselbe.Außer bei %c und %[ werden führende Whitespace immer überlesen.
Es führt hier aber zu einem Verhalten, das höchstwahrscheinlich nicht beabsichtigt ist. Denn das scanf wird nun so lange lesen (und ggf. dabei blockieren), bis es ein nicht-Whitespace vorfindet.
-
Was währe denn der richtige formatspecifier für double ?
-
%lf
https://www.google.de/search?q=formatspecifier+double+c
erster Treffer
-
Die Formatspcifier setzen sich aus verschiedenen Angaben zusammen.
double
ist so gesehen ein longfloat
.
-
1. Fehler /n in der scanf Funktion. scanf ist eine formatierte Eingabefunktion, ergo einen Zeilenvorschub zu wollen ist nonsens, abgesehen dieser dank der Funktion selbst mit schon mit integriert ist.
2. Fehler, dein scanf schreibt den Wert irgendwo hin aber nicht in die Adresse die für die Variable x genutzt wird, Stichwort Adressoperator &
3. Fehler, du gibst in deinem letztem printf Befehl deinen double Wert als float aus, was an sich funktioniert, aber deine Mantisse und Charaktersierung kürzt, wodurch unsinnige Werte bei raus kommen, hier müsste ein %lf stehen oder du definierst alle Variablen dazu im float Format:)
4. Fehler der mir dadurch auch noch aufgefallen ist, das du den Fehler auch im scanf bei der Eingabe machst. Du speicherst bei x ein float wert in eine double Variable, --> falsche Charakteristik und falsche Mantisse, irgend ein Wert den du nicht haben möchtest
5. Fehler Adressoperator fehlt auch bei z
und da würde ich als Formatierung auch eher zu %i greifen, wobei das bei Pc-Rechner egal wäre, halt geschmackssache
Nur noch so als Tipp %.2lf im letzten printf bewirkt das dein Wert nur auf 2 Nackommastellen ausgegeben wird. Macht sich bei Geldbeträgen vlt. besser
-
Der Formatspezifizierer für double (und float!) bei printf ist "%f", nicht "%lf". Die Formatstrings von scanf und printf sind nicht gleich.
Viel schwerer wiegt aber der Fehler, hier überhaupt Fließkommazahlen zu benutzen. Absolut kontraproduktiv für gequantelte Größen wie Geld, da die auszeichnende Eigenschaft von Fließkommazahlen ist, eben nicht diese Eigenschaft zu haben (zumindest soweit dies im Computer möglich ist). Insbesondere schwerwiegend, da es in diesem konkreten Beispiel auf hohe Genauigkeit ankommt.
-
Zu 3.:
Das ist falsch!%f gilt bei
printf
fürfloat
unddouble
%lf ist erst seit C11 erlaubt, wurde vorher aber akzeptiert.
Das liegt daran, dass
printf
eine Funktion mit variabler Argumenteliste ist. Da werden bei Fließkommazahlen mindestensdouble
-Werte übergeben. Bei Ganzzahlwerten mindestensint
.Bei Geldbeträgen rechnet man besser Ganzzahlig in Cent, um Rundungsfehler zu vermeiden.
Der Rest wurde schon geschrieben.
-
Ich hab mich nochmal schlau gemacht und entschuldige mich zu meinem Fehler zu meinem 3. Standpunkt. Das kam dann wohl zu meiner Angewohnheit auch dort %lf zu benutzen, was nun ja auch nicht falsch wäre aber trotzdem falsch von mir argumentiert wurde.
Den Standpunkt zum Theme Geld und Fließkommazahlen hatte ich bewusst außenvor gelassen, da das lernziel eher die Formatierte Ein jnd Ausgabr sein soll und es schwer wird Geldbeträge in int Werten zu behandeln, wenn Division oder Multiplikation dazu kommen
-
Wenn du mit Geldbeträgen arbeitest und rechnest, verwende nie
float
oderdouble
, weil sie zu Rechenfehler führen, z.b. 1/3 ist in double nicht representierbar, somit 1/3 von 10 € zu rechnen wird dazu führen, dass irgendwelche centbeträge verloren gehen.Du musst mit Fixkommazahlen arbeiten oder gleich mit Integers.
int x = 300; // 3.00 euro int y = 30; // 30 cents x+y == 330; // 3.30 euro
-
Bei
scanf("%d\n", z);
den Adressoperator nicht vergessen:
scanf("%d\n", &z);
Beim Einlesen von Strings kannst du den weglassen, bei anderen
Variablentypen nicht