Problem mit Kontrollstruktur
-
wildtobias schrieb:
..., also wie man den Code dann umschreibt.
Halte dich an den Standard. (z.B. wegen main())
Nutze Funktionen.
Formatier deinen Quelltext vernünftig.
Wenn du schon Fließkommazahlen nimmst, dann nimm double.
Bei Berechnungen, bei denen es um Geld geht, rechne besser ganzzahlig in Cent. Das vermeidet Rundungsfehler.
-
Zumindestens ist erstmal schon die o.g. Zeile falsch:
scanf ("%s",&zinsenrechner);
Schaue dir die Formatspezifizierer von scanf mal an und dann prüfe, welche der dort genannten auf den Typ von zinsenrechner passen.
-
Ich habe jetzt mal eine Zeit gegooglet und "%s" kann man schreiben. Es soll ja nur EINE Taste / Buchstabe gespeichert werden.
Außerdem bekomme ich einen illegal chracter ' ' Fehler. in Zeile 55 und 65.
Genaueres folgt gleich
-
wildtobias schrieb:
Ich habe jetzt mal eine Zeit gegooglet und "%s" kann man schreiben. Es soll ja nur EINE Taste / Buchstabe gespeichert werden.
Hm.. diese Logik ist köstlich.
%s liest einen String ein, %c einen Buchstaben!
-
wildtobias schrieb:
Ich habe jetzt mal eine Zeit gegooglet und "%s" kann man schreiben. Es soll ja nur EINE Taste / Buchstabe gespeichert werden.
Ja, nee ist klar.
wildtobias schrieb:
Außerdem bekomme ich einen illegal chracter ' ' Fehler. in Zeile 55 und 65.
Dann schau dir mal dein Listing oben an, da kann man das gut sehen. Da aber in Zeile 54 und 63.
-
Also erstmal Vielen Dank für die Hilfe.
Soweit funktioniert das Programm, allerdings ist es (noch) nicht sauber formatiert und die Rechenergebnisse stimmen nicht.
Ich hab noch das ein oder andere Defizit was das Rechnen mit Fließkomma und integer in einer Rechenaufgabe angeht...
Aber wie gesagt das Programm läuft so durch die switch - Schleifen wie es soll und darum ging es mir in erster Linie.Vielen Dank nochmal an alle die mir geholfen haben
-
wildtobias schrieb:
switch - Schleifen
Alter Schwede...
-
Du musst auch unbedingt an deiner Einrückung arbeiten. Man rückt ein, um die Struktur des Programms lesbarer zu machen. Um zu sehen, wann Schleifen/Verzweigungen anfangen und wann sie aufhören. Bei dir ist das überhaupt nicht möglich. Im Gegenteil, die völlig willkürliche Einrückung steht der Lesbarkeit sogar im Weg. Schau dir hier mal ein paar Beispiele an:
-
Wie gesagt ich bin noch am Anfang und finde mich grade in das Thema rein...
Auch am Einrücken werde ich arbeiten.Zuvor habe ich allerdings noch eine Frage:
Und zwar gibt mir mein Programm beim compielen die Fehlermeldung
"Error:proj0001.cpp(15,1):Illegal character ' ' (0x1)"Kann mir bitte jemand helfen?
- Was bedeutet der Fehler?
- Wodurch wird er verursacht
- Wie kann man das Problem beheben/in Zukunft vermeiden.
Vielen Dank für eure Hilfe im Vorrauschar rechnerwahl, taschenrechner, time; float kapital, z,tage, monate, jahre; float zinsen, zinssatz,tzinsen,mzinsen, jzinsen; float tzs,mzs,jzs; float tkap,mkap,jkap; printf("Rechner starten? (Y) Yes (N) No\n"); scanf("%s", &taschenrechner); switch (taschenrechner) { case 'Y': case 'y': printf("Zinsrechner (z),\n Zinssatzrechner(s),\n Kapitalrechner (k)\n"); scanf("%s", &rechnerwahl);
-
Da hat sich das Zeichen mit dem Wert 1 irgendwie in deinen Quelltext geschummelt.
Kannst du bei deinem Beispiel in Zeile 9 sehen.Wenn dein Editor einen HEXmodus hat, kannst du es damit sehen.
Wenn dein Editor das Ersetzen von Steuerzeichen beherscht, kannst du das damit entfernen.
Oder:
Wenn Zeile 15 eine Leerzeile ist: einfach löschen und mit Return neu anlegen.
Sonst alle Leerzeichen zwischen dem Zeilenanfang und ersten Buchstaben/Zeichen löschen und mit vorhergehender Zeile verbinden. Danch Leerzeichen wieder einfügen.Und:
beiscanf("%s", &taschenrechner);
steht das %s für einen String. Bei einem String kommt immer noch das abschließende '\0' dazu. Du brauchst also an der Stelle ein Array. Sonst nimm %c.
Großer Unterschied zwischen char und char[]
Und2:
Vergiss float, nimm double!
-
Super, das mit dem Zeilen löschen hat funktioniert.
Allerdings beendet sich das Programm an der Stelle, an der ausgesucht wird, ob der Rechner benutzt werden soll oder nicht:printf("Rechner starten? (Y) Yes (N) No\n"); scanf("%c", &taschenrechner); switch (taschenrechner) { case 'Y': case 'y': printf("Zinsrechner (z),\n Zinssatzrechner(s),\n Kapitalrechner (k)\n"); scanf("%c", &rechnerwahl); switch (rechnerwahl) {
Also das Programm startet also nicht richtig, wenn man das so ausdrücken kann.
-
Im Eingabepuffer steht dann noch das '\n'
Mach nach dem scanf
int c; // int c, nicht char c. Bzw. an den Anfang der Funktion. while ((c = getchar()) != EOF && c != '\n');
aus den FAQ
-
Also das funktioniert jetzt fast.
Jetzt kann ich aussuchen, ob ich den Rechner starten will oder nicht. Dann kann ich noch den Rechner aussuchen (Zinsen, Zinssatz, Kapital) und die Beträge eingeben, aber sobald ich Tage, Monate oder Jahre aussuchen will bricht das Programm ab und beendet sich.
Den Code von eben habe ich auch schon an verschiedenen Stellen eingesetzt aber immer mit dem selben Ergebniss.
Sorry wenn das hier so aus artet :S
-
Sorry, die Glaskugel ist auf der Arbeit, daher kann ich jetzt nicht sehen wie dein Programm aktuell aussieht.
-
Na ich weiß nicht ob du das wirklich sehen willst...
Aber es nützt ja nix.
*edit
Sorry wegen der Formatierung, im Forum sieht das etas anders aus als.#include <stdio.h> #include <conio.h> int main (void) { char rechnerwahl, taschenrechner, time; float kapital, z,tage, monate, jahre; float zinsen, zinssatz,tzinsen,mzinsen, jzinsen; float tzs,mzs,jzs; float tkap,mkap,jkap; printf("Rechner starten? (Y) Yes (N) No\n"); scanf("%c", &taschenrechner); int c; // int c, nicht char c. Bzw. an den Anfang der Funktion. while ((c = getchar()) != EOF && c != '\n'); switch (taschenrechner) { case 'Y': case 'y': printf("Zinsrechner (z),\n Zinssatzrechner(s),\n Kapitalrechner (k)\n"); scanf("%c", &rechnerwahl); switch (rechnerwahl) { //------------------Zinsen------------------------\\ case 'z': case 'Z': printf("Der Zinsrechner\n"); printf("\n Geben Sie Ihr Kapital als Ganzzahl ein: "); scanf ("%f", &kapital); printf("\n Geben Sie den Zinssatz als Ganzzahl ein: "); scanf ("%f", &z); zinsen = z/100.0; printf("Möchten Sie Tage (t) Monate(m) oder Jahre (j) wissen?\n"); scanf("%c", &time); switch (time) { case 't': case 'T': printf("Geben Sie die Tage ein: "); scanf("%f", &tage); tzinsen = kapital*zinsen*tage/360; printf("\nZinsen in Euro pro Tag: %f",tzinsen); break; case 'm': case 'M': printf("Geben Sie die Monate ein"); scanf("%f", &monate); mzinsen = kapital*zinsen*monate/12; printf("\n Zinsen in Euro pro Monat: %f",mzinsen); break; case 'j': case 'J': printf("Geben Sie die Jahre ein"); scanf("%f", &jahre); jzinsen = kapital*zinsen*jahre; printf("\n Zinsen in Euro pro Jahr: %f",jzinsen); break; } getch(); return (0); //-------------------Zinsen------------------------\\ //-------------------Zinssatz------------------------\\ case 's': case 'S': printf("Der Zinssatzrechner\n"); printf("\n Geben Sie den Zinssatz als Ganzzahl ein: "); scanf ("%f", &zinssatz); zinsen = z/100.0; printf("\n Geben Sie ihr Kapital als Ganzzahl ein: "); scanf ("%f", &kapital); printf("Möchten Sie Tage (t) Monate(m) oder Jahre (j) wissen?"); scanf("%c", &time); switch (time) { case 't': case 'T': printf("Geben Sie die Tage ein: "); scanf("%f", &tage); tzs = zinsen*36000/(kapital*tage); printf("\n Tageszinssatz: %f",tzs); break; case 'm': case 'M': printf("Geben Sie die Monate ein"); scanf("%f", &monate); mzs = zinsen*1200/(kapital*monate); printf("\n Monatszinssatz: %f",mzs); break; case 'j': case 'J': printf("Geben Sie die Jahre ein"); scanf("%f", &jahre); jzs = zinsen*100/(kapital*jahre); printf("\n Jahresszinssatz: %f",jzs); break; } getch(); return (0); //-------------------Zinssatz------------------------\\ //-------------------Kapital------------------------\\ case 'k': case 'K': printf("Der Kapitalrechner\n"); printf("\n Geben Sie den die Zinsen als Ganzzahl ein: "); scanf ("%f", &zinsen); printf("\n Geben Sie den Zinssatz als Ganzzahl ein: "); scanf ("%f", &z); zinssatz = z/100.0; printf("Möchten Sie Tage (t) Monate(m) oder Jahre (j) wissen?"); scanf("%c", &time); switch (time) { case 't': case 'T': printf("Geben Sie die Tage ein: "); scanf("%f", &tage); tkap = zinssatz*36000/zinsen*tage; printf("\nKapital in Euro pro Tag: %f",tkap); break; case 'm': case 'M': printf("Geben Sie die Monate ein"); scanf("%f", &monate); mkap = zinssatz*1200/(zinsen*monate); printf("\n Kapital in Euro pro Monat: %f",mkap); break; case 'j': case 'J': printf("Geben Sie die Jahre ein"); scanf("%f", &jahre); jkap = zinssatz*100/(zinsen*jahre); printf("\n Zinsen in Euro pro Jahr: %f",jkap); break; } getch(); return (0); //-------------------Kapital------------------------\\ } } }
-
Naja, disese
while ((c = getchar()) != EOF && c != '\n');
gehört natürlich nach jedemscanf("%c")
Bei den Einrückungen nimmst du besser Leerzeichen statt Tabulator.
-
Also vielen Dank für eure Hilfe, aber es will nicht so wie ich. Vielleicht bekomme ich es die Tage oder so doch noch hin.
Trotzdem Vielen Dank für die Tipps.
-
DirkB schrieb:
Bei den Einrückungen nimmst du besser Leerzeichen statt Tabulator.
Ansichtssache.
-
_matze schrieb:
Ansichtssache.
Genau, das sieht bescheiden aus.
Welche Tabweite soll er den nehmen? 2, 4, 8
Wenn es portabel sein soll, sieht das nur mit Leerzeichen gut aus.
-
DirkB schrieb:
_matze schrieb:
Ansichtssache.
Genau, das sieht bescheiden aus.
Welche Tabweite soll er den nehmen? 2, 4, 8
Wenn es portabel sein soll, sieht das nur mit Leerzeichen gut aus.
Unter Portabilität verstehe ich hier, dass ich meinen Code zu meinem Kollegen schleppen kann, und der da - anders als ich - 'ne Tabweite von 4 eingestellt hat und den Code so lesen kann, wie er es gerne möchte und gewohnt ist.
Aber das Thema hatten wir ja schon öfter mal, und wir sollten lieber nicht wieder seitenlang darüber diskutieren. Ich weiß gar nicht, warum ich davon angefangen habe.