Übungsprogramm macht Probleme
-
Tagchen, ich bin es mal wieder.
Ich schreibe gerade ein kleines Übungsprogramm.Es soll über die Konsole laufen und eine ganz einfache Prozentrechnung mit einer unbekannten Zahl durchführen.
Leider sind meine C Kenntnisse wirklich sehr bescheiden, deshalb wird so einiges nicht optimal sein. Aber ich wollte halt was fertigbringen, bevor ich ein halbes Buch durchgelesen habe.
Es gab jetzt beim kompilieren einen ganzen Haufen Fehler und Warnungen.
Einige Fehler oder Warnungen verstehe ich überhaupt nicht. Das Meiste habe ich selbst schon entfernt, es waren oft Flüchtigkeitsfehler oder Sachen, die ich vergessen hatte (ach, da muss ein ; hin?), aber nun bin ich relativ am Ende angekommen und weiß nicht weiter.
Ich würde mich sehr darüber freuen, wenn mir jemand mal ein wenig helfen könnte.
Bitte aber nicht gleich den ganzen Code umwerfen. Ich weiß, es wird dutzende Möglichkeiten geben, das einfacher, schlanker und besser zu machen, aber ich wollte es einfach mit meinen momentanen Kenntnissen schaffen.Danke schonmal!
//Prozentrechnung #include <stdio.h> //keine Ahnung, ob ich mehr brauche. int main () //für diese Zeile zeigt er mir an: fatal error: Internal error: 'Access violation' at 0x0040f0f7. { int auswahl (); //hier sollte die Auswahlfunktion starten, um zu bestimmen, was gerechnet werden soll. { Label1:; //goto-Punkt, um das Programm erneut zu starten. //Gerade frag ich mich, ob ein erneutes deklarieren der Variablen bei jedem "neu berechnen" überhaupt gut ist. //soll ich Label1 besser ein bisschen weiter runter schieben, die Variabeln erstmal "leer" erzeugen //und nach Label1 auf 0 setzen? int ausw = 0; //nötig für die auswahl int gw = 0; //Grundwert-Variable int pw = 0; //Prozentwert-Variable int ps = 0; //Prozentsatz-Variable printf("Was soll berechnet werden?\n\n\n\n Prozentwert: 1\n Prozentsatz: 2\n Grundwert: 3\n"); scanf("%d",&ausw); //Warnung für diese Zeile: warning #2030: '=' used in a conditional expression. if (ausw = 1) { printf("Berechnung des Prozentwertes.\n\n"); printf("Bitte geben sie den Grundwert ein.\n\n"); scanf("%d",&gw); printf("Bitte geben sie den Prozentsatz ein.\n\n"); scanf("%d",&ps); pw = ps * gw / 100; printf("Der Prozentwert beträgt: %d.\n\n",pw); Label2:; //Wieder ein goto-Punkt. An diesem wird die Variable ausw auf 0 gesetzt und es kommt zu einer erneuten // Entscheidung mit Hilfe von ausw. Ist das überhaupt so korrekt oder soll ich ne zweite Variable für // diese Abfrage nehmen? ausw = 0; printf("Weiterrechnen oder beenden?\n\n\n"); //warning #2030: '=' used in a conditional expression. printf("Weiterrechnen: 1\n\n"); printf("Beenden: 2\n\n"); scanf("%d",&ausw); //warning #2030: '=' used in a conditional expression. if (ausw = 1) goto Label1; //Wenn weitergerechnet werden soll, springt man zurück auf den Anfang // des Programms. else if (ausw = 2) //Ansonsten springt man auf einen NOCH NICHT EINGERICHTETEN goto Label3; // goto-Punkt, der das Programm mit einer Verabschiedung beenden soll. else printf("Bitte geben sie eine Zahl zwischen 1 und 2 ein.\n\n"); //Bei ner Fehlerhaften Eingabe warning #2030: '=' used in a conditional expression. //geht es von Vorne los. goto Label2; //warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'. } //warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'. else if (ausw = 2) //hier das Gleiche für den Prozentsatz. warning #2233: Insufficient number of arguments to 'printf' according to the format string. printf("Berechnung des Prozentsatzes.\n\n"); printf("Bitte geben sie den Grundwert ein.\n\n"); scanf("%d",gw); printf("Bitte geben sie den Prozentwert ein.\n\n"); scanf("%d",pw); //Fehlermeldung: error #2157: Unrecognized statement. error #2001: Syntax error: expected ';' but found 'if'. ps = pw * 100 / gw; //warning #2030: '=' used in a conditional expression. printf("Der Prozensatz beträgt %d %.\n\n"); //warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'. goto Label2; //warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'. else if (ausw = 3) //und hier für den Grundwert. printf("Berechnung des Grundwertes.\n\n"); //warning #2233: Insufficient number of arguments to 'printf' according to the format string. printf("Bitte geben sie den Prozentwert ein.\n\n"); scanf("%d",pw); printf("Bitte geben sie den Prozentsatz ein.\n\n"); scanf("%d",ps); //error #2157: Unrecognized statement. gw = pw * 100 / ps; //error #2001: Syntax error: expected ';' but found 'printf'. printf("Der Grundwert beträgt %d. \n\n"); goto Label2; else //und hier haben wir das letzte Stück der anfänglichen Abfrage. //sofern eine fehlerhafte Eingabe kommt, kommt man wieder an den Anfang zurück. printf("Bitte geben sie eine Zahl zwischen 1 und 3 ein."); goto Label1; } return 0; }
-
Kopiere doch bitte die Warnungen und Fehlermeldungen ebenfalls hier her, hmm?
Edit: Spontan fällt mir auf, dass deine if/elseif/else nur durch Einrückungen getrennt sind, das funktioniert in C nicht. Du musst den ganzen Code mit { und } umklammern:
if ( ... ) { statement1; statemten2; ... } else if ( ... ) { <- wichtig ... } <- wichtig else if ( ... ) { ... } else { ... }
MfG SideWinder
-
Jo mach ich gleich. Aber erst werde ich deinen Rat beherzigen und den Code entsprechend abändern. Dann verschwindet eventuell eh einiges an Fehlern.
Zu deinem Rat an sich: Na Super! Da googlet man rum, liest Tipps und Anleitungen und dann findet man keine einzige verdammte Quelle, die korrekte Synthax angibt?
Das mit den geschweiften Klammern kam mir auch nur logisch vor, aber man ist ja Anfänger und macht nach, was man liest...*grummel*Schonmal vielen Dank, ich werde das im Laufe des Tages entsprechend ändern!
-
Also euer Spamschutz ist ja mehr als merkwürdig. Ich kann Aufgaben lösen, wie ich will. Abschicken darf ich den Kram dann immer noch nicht.
Ok, dann halt eingeloggt.
Habe deinen Rat befolgt und so gut wie alle Fehler sind dadurch verschwunden.
Übrig blieben nur WARNUNGEN, ein völlig logischer Fehler (Label3 ist noch nirgendwo eingesetzt, das kommt noch) und der zu Anfang erwähnte Fehler in der 5. Zeile.c(23): warning #2030: '=' used in a conditional expression.
c(40): warning #2030: '=' used in a conditional expression.
c(44): warning #2030: '=' used in a conditional expression.
c(54): warning #2030: '=' used in a conditional expression.
c(56): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'.
c(58): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'.
c(60): warning #2233: Insufficient number of arguments to 'printf' according to the format string.
c(66): warning #2030: '=' used in a conditional expression.
c(68): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'.
c(70): warning #2234: Argument 2 to 'scanf' does not match the format string; expected 'int *' but found 'int'.
c(73): warning #2233: Insufficient number of arguments to 'printf' according to the format string.
c(44): error #2147: Undefined label 'Label3'.
c(5): fatal error: Internal error: 'Access violation' at 0x0040f0f7.
-
Auf den ersten Blick fällt mir folgendes auf:
if (ausw = 1)
du meinst wohl eher
if (ausw == 1)
da "=" eine Zuweisung und "==" ein Verglich ist
(Das erklärt schonmal die ersten 4 Warnungen)MfG Chris_
Edit:
Mit scanf kenn ich mich nicht so aus, aber versuch malscanf("%d",&gw);
statt
scanf("%d",gw);
Edit No. 2:
Bei printf musst du als Parameter den einzusetzenden Wert übergeben.
-
Chris_ schrieb:
Auf den ersten Blick fällt mir folgendes auf:
if (ausw = 1)
du meinst wohl eher
if (ausw == 1)
da "=" eine Zuweisung und "==" ein Verglich ist
(Das erklärt schonmal die ersten 4 Warnungen)MfG Chris_
Edit:
Mit scanf kenn ich mich nicht so aus, aber versuch malscanf("%d",&gw);
statt
scanf("%d",gw);
Bis hierhin umgesetzt, danke!
Chris_ schrieb:
Edit No. 2:
Bei printf musst du als Parameter den einzusetzenden Wert übergeben.Meinst du so?
printf("Der Prozensatz beträgt %d,&ps %.\n\n");
statt
printf("Der Prozensatz beträgt %d %.\n\n");
-
IMHO müsste es so aussehen:
printf("Der Prozensatz beträgt %d\n\n",ps);
Es werden also die Platzhalter der Reihe nach durch die hinter dem String
angegebenen Werte ersetzt.
Aber bevor ich hier noch etwas falsches sage,
schau dir lieber diesen Link an:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Weiter unten auf der Seite stehen auch Beispiele.MfG Chris_
-
int main () { int auswahl (); { Label1:;
Darf ich mal fragen was das werden soll? Und goto's ?
-
Das mit
int auswahl ()
ist sicherlich nicht optimal, aber:
bierdosenhalter schrieb:
Leider sind meine C Kenntnisse wirklich sehr bescheiden, deshalb wird so einiges nicht optimal sein.
Und über diese goto's lässt sich ja streiten
MfG Chris_
-
Da bin ich wieder!
Danke für die Hilfe bei Printf, hab jetzt wirklich nur noch den zu vernachlässigen Fehler mit Label3 und den Fatal Error.c(5): fatal error: Internal error: 'Access violation' at 0x0040f0f7.
Ansonsten ist alles ok.
int main () { int auswahl (); { Label1:;
Darf ich mal fragen was das werden soll? Und goto's ?
Äh keine Ahnung was das werden soll. Muss das nicht so sein?
Ich dachte, ich brauch ne allgemeine Startfunktion und dann Unterfunktionen für jede weitere, beliebig oft wiederholbare Aktion des Programms. Dass hier alles in einen Topf geschmissen wurde und in die Funktion "Auswahl" jetzt auch alle Berechnungen reingeschmissen habe, ist vielleicht nicht optimal.
Allgemein macht mir die Strukturierung noch große Probleme. Könnte auch daran liegen, dass ich C noch nicht gut "spreche". Was die gotos angeht: Ich weiß, das kann ich durch Verschachtelungen lösen und gotos sind (aus welchem Grund auch immer, ich weiß es nicht) nicht gern gesehen.Ich fand es für dieses Übungsprogramm recht praktisch, weil ich Punkte hatte, an denen ich immer wieder vorbeikam. Weiterrechnen? Gut! goto Label 1. Nein? Ok, Tschüss und nach Label 3. Label 2 hätte ich mir auch sparen können, indem ich nur bestimmte Eingaben zulassen würde, aber damit kenne ich mich noch nicht aus.
-
Sqwan schrieb:
int main () { int auswahl (); { Label1:;
Darf ich mal fragen was das werden soll? Und goto's ?
Das frag ich mich aber auch! Les erstmal dein Buch.
int main () { int auswahl (); { Label1:;
Also ich weis nicht ob das nach ANSI-C erlaubt ist. Ich meine eine Funktion in einer Funktion. Schreib doch lieber
int auswahl () { //... } int main { auswahl(); return 0; }
Auf Gotos würde ich persönlich verzichten - ich nutze diese möglichkeit nie. Das ist wohl eher was für Assemblerprogrammierer. Und Assembler wird heute eigentlich nur noch benutzt um bei großen Programmen(z.B. Spielen) zu langsame Funktionen zu tunen, oder um ein eigenes Betriebssystem zu schreiben(siehe anderes Forum )
Also weg damit! Lieber Rekursion anwenden. Das bedeutet das eine Funktion sich selbst aufruft. Statt goto Label1; Lieber auswahl(); Die anderen Labels würde ich an deiner Stelle durch andere Unterfunktionen ersetzten, die vor der Funktion Auswahl definiert werden!!! An deiner Stelle würde ich erstmal richtig C lernen bevor man Fragen stellt die nicht unbedingt sein müssten. Außerdem noch ein Tipp: Lern am besten noch C++. Ist moderner, objektorientiert und ist einfacher. Zum beispiel wird ausscanf("%d",&ps);
cin >> ps;
Und aus
printf("Der Prozensatz beträgt %d\n\n",ps);
wird
cout << "Der Prozensatz beträgt " << ps << endl;
Ist aber nur ne Idee. Also lies dein Buch weiter und lern ordentlich C.
Jonas