Hallo auch, ich habe eine einfache Anwendung mit C++ geschrieben. Allerdings kann ich die Fehlermeldungen die beim Debugging auftreten nicht ganz zuordnen. Das ist meine Anwendung: #include "iostream" #include <conio.h> using namespace std; int main() { float Zahl1, Zahl2, Zahl3 ; cout << "Gebe die erste Zahl ein: "; cin >> Zahl1; cout << endl; cout << "Gebe die zweite Zahl ein: "; cin >> Zahl2; cout << endl; cout << "Gebe die dritte Zahl ein: "; cin >> Zahl3; cout << endl; if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3)); { cout << "Die größte Zahl ist: ";Zahl1; } else { if ((Zahl2 > Zahl1) && (Zahl2 > Zahl3)); { cout << "Die größte Zahl ist: "; Zahl2; } else { cout << "Die gößte Zahl ist: "; Zahl3; } } getch(); return 0; } Das sind die Fehler die er beim debuggen meldet: 1>------ Erstellen gestartet: Projekt: Finde Extremwerte, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>Finde Extremwerte.cpp 1>c:\users\[......]\finde extremwerte\finde extremwerte\finde extremwerte.cpp(21) : warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt? 1>c:\users\[....]\finde extremwerte\finde extremwerte\finde extremwerte.cpp(24) : error C2181: Ungültiges 'else' ohne zugehöriges 'if' 1>c:\users\[...]\finde extremwerte\finde extremwerte\finde extremwerte.cpp(27) : warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt? 1>c:\users\[...]\finde extremwerte\finde extremwerte\finde extremwerte.cpp(30) : error C2181: Ungültiges 'else' ohne zugehöriges 'if' 1>Das Buildprotokoll wurde unter "file://c:\Users\[.....]\Desktop\Finde Extremwerte\Finde Extremwerte\Debug\BuildLog.htm" gespeichert. 1>Finde Extremwerte - 2 Fehler, 2 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==== Nur leider weiß ich nicht was hier falsch sein soll.
; sind in C++ wichtig. Allerdings sollte man es auch nicht übertreiben! Die Syntax eines if lautet if( Bedingungsuasdruck) abhängige Anweisung man beachte, dass zum if selber kein ; gehört! Der ; gehört zur abhängigen Anweisung. Und speziell nach dem Teil '(Bedingungsausdruck) kommt kein ; Das hier
1 | if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3)); |
fasst der COmpiler daher nach C++ Syntax auf als
1 | if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3)) |
2 | ;
|
das heisst: die Anweisung, die vom if abhängig ist, besteht nur aus einem ; Und das ist zulässig, denn das ist die leere Anweisung. Und genau das sagt dir auch der Compiler.
if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3));
das ; ist zu viel.
> cout << "Die größte Zahl ist: "; Zahl2;
was willst du damit ausdrücken?
> warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies > beabsichtigt? > cout << "Die größte Zahl ist: ";Zahl1; ^ (bei den anderen couts analog) > error C2181: Ungültiges 'else' ohne zugehöriges 'if' > if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3)); ^ (beim anderen if/else analog) HTH
evtl, kann mir ja auch jemand helfen: bei mir sagt er 1>------ Erstellen gestartet: Projekt: Tag1, Konfiguration: Debug Win32 ------ 1> Tag1.cpp 1>c:\users\jan\documents\visual studio 2010\projects\tag3\tag1\tag1.cpp(19): error C2181: Ungültiges 'else' ohne zugehöriges 'if' ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ========== heir der code, finde den fehler eifnach nicht. #include "stdafx.h" #include <iostream> using namespace std; int main() { enum {dreieck = 1, kreis}; double pi = 3.14159265; int choice, a, b, c; cout << "\nwählen Sie den zu berrecneten Flächeninhalt: \n" << "1 fuer dreieck\n" << "2 fuer kreis\n"; cin >> choice; if (choice == dreieck) cout << "geben sie die Seite ein: "; cin >> a; cout << "\ngeben sie die Hoehe ein: "; cin >> b; cout << "\nder Flaecheninahlt des dreiecks ist: " << a*b/2 << "Flaecheneinheiten gross"; else cout << "geben Sie den Radius ein: "; cin >> a; cout << "\nDer Flaecheninhalt vom Kreis ist: " << pi*(a*a) << "Flächeninhalte groß"; cin.get(); main(); }
Jan schrieb: > if (choice == dreieck) > cout << "geben sie die Seite ein: "; > cin >> a; > cout << "\ngeben sie die Hoehe ein: "; > cin >> b; > cout << "\nder Flaecheninahlt des dreiecks ist: " << a*b/2 << Rücke den Code korrekt ein und Du siehst, wo das Problem liegt:
1 | if (choice == dreieck) |
2 | cout << "geben sie die Seite ein: "; |
3 | cin >> a; |
4 | cout << "\ngeben sie die Hoehe ein: "; |
5 | cin >> b; |
6 | cout << "\nder Flaecheninahlt des dreiecks ist: " << a*b/2 << |
Genau. Auf if folgt genau eine Anweisung. Oder ein Anweisungsblock, und der wird in geschweiften Klammern geschrieben.
Jan schrieb: > heir der code, finde den fehler eifnach nicht. Die Syntax von C lautet if( Bedingungsausdruck ) Anweisung Da steht: 1 Anweisung! Nicht steht da aber: soviele, wie du magst > if (choice == dreieck) > cout << "geben sie die Seite ein: "; Hier, an dieser Stelle ist die 1 Anweisung, die vom if abhängt bereits aufgebraucht. Die nächsten Anweisungen > cin >> a; > cout << "\ngeben sie die Hoehe ein: "; > cin >> b; > .... stehen alle nicht mehr unter der Kontrolle vom if. Das if ist bereits da oben mit der einen Anweisung abgeschlossen worden > cout << "\nder Flaecheninahlt des dreiecks ist: " << a*b/2 << > "Flaecheneinheiten gross"; > else und da das if bereits fertig ist und dahinter schon neue Anweisungen kamen, hängt das else in der Luft. Aber: Abhilfe ist nahe. In C kann man beliebig viele Anweisungen in einen { } Block einschliessen. Und dieser komplette Block gilt dann als 1 Anweisung. Perfekt für if( ..... ) { Anweisung Anweisung Anweisung } else { Anweisung Anweisung } und da nach dem if damit nur 1 Anweisung kommt, nämlich der Block, hängt dann auch das else nicht mehr in der Luft, sondern gehört zum (aus seiner Sicht) unmittelbar davor stehenden if
Ahhh vielen dank :) hätte mir eigentlich noch einfallen müssen :) Naja man lernt besser aus Fehlern... Vielen dank jetzt klappt es :)
Hallo zusammen, ich habe da noch eine zwei Fragen. Ich habe meine Anwendung (der erste Beitrag) noch mal ein bisschen erweitert und verbessert. Man kann jetzt auswählen ob man den größten oder kleinsten Wert ausgegeben haben möchte. In dem man zu Beginn "k" = kleinster Wert oder "h" = höchster Wert eingibt. Ich würde es gerne jetzt noch so haben das die Anwendung wieder zum Anfang zurück kehrt nach dem das Ergebnis angezeigt wurde. Und nur mit einer Eingabe wie Null beendet werden kann. Ich weiß das dass mit einer "do while" Schleife klappt. Aber ich weiß nicht genau wie ich das angehen soll. Meine andere Frage betrifft die Sonderzeichen. Die Anwendung zeigt mir im Moment keine Sonderzeichen an (z.B. ö) sonder ersetzt sie durch andere Zeichen. Ich habe ein bisl google durch sucht und habe gelesen das man sie einbinden muss. Ist das korrekt und wenn ja wie mache ich das?
intel schrieb: > Die Anwendung zeigt mir im Moment keine Sonderzeichen an (z.B. ö) sonder > ersetzt sie durch andere Zeichen. Das ist eine Konsolapplikation, die die in der Konsole aktive Zeichencodierung ("Codepage") nutzt. Wenn Du in Deiner IDE aber Umlaute eingibst, dann werden diese in einer anderen Zeichencodierung in Dein Programm eingesetzt. Die Konsole arbeitet standardmäßig mit CP850 (das ist im Prinzip der alte "DOS"-Zeichensatz), Deine IDE und andere Windows-Programme auch arbeitet mit CP1252 (ANSI). Wenn Du im Konsolfenster nicht den vorgegebenen Pixelfont nutzt, sondern eine Truetype-Schrift (Lucida Console oder Consolas), dann kannst Du die verwendete Codepage vorher umschalten: Im Konsolfenster direkt: c:\>set console cp select=1252 c:\>meinprogramm.exe Da Du vermutlich zur Doppelklickfraktion gehörst, und Dein Programm nicht über die Konsole aufrufst, wirst Du einen anderen Weg beschreiten müssen, und das geht mit der Win32-API-Funktion SetConsoleOutputCP. Die rufst Du in Deinem Programm auf, bevor Du irgendwelche Ausgaben machst, und schon funktionierts. Allerdings nicht bei Verwendung des Pixelfonts, der standardmäßig im Konsolenfenster aktiv ist, der kann nur CP850 darstellen. Wenn Du das unbedingt verwenden willst, musst Du eine der Zeichenkodierungsumwandlungsfunktionen verwenden, die die Win32-API zur Verfügung stellt, da bietet sich CharToOemBuff an. http://msdn.microsoft.com/en-us/library/windows/desktop/ms686036%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/dd319646%28v=vs.85%29.aspx
Danke das klingt gut. Ich werde das mal ausprobieren. Jetzt bleibt nur noch meine Frage mit der Schleife.
intel schrieb: > Ich würde es gerne jetzt noch so haben das die Anwendung wieder zum > Anfang zurück kehrt nach dem das Ergebnis angezeigt wurde. Und nur mit > einer Eingabe wie Null beendet werden kann. > Ich weiß das dass mit einer "do while" Schleife klappt. Aber ich weiß > nicht genau wie ich das angehen soll. Keine Ahnung ob ich es richtig verstanden habe.
1 | int Eingabe; |
2 | |
3 | do
|
4 | {
|
5 | Eingabe einlesen |
6 | Eingabe verarbeiten (ohne den Wert zu ändern) |
7 | } while(Eingabe!=0); |
oder so ähnlich. hth
Ja so in der Art habe ich mir das vorgestellt. :) Das mit der Schleife habe ich jetzt hinbekommen. Allerdings kommt jetzt eine Fehlermeldung die ich nicht einordnen kann. ich habe folgendes geschrieben: if (flag == "e"); { system ("exit"); } else { cout << "Falsche Eingabe!"; } Hierzu kommt folgende Fehlermeldung: Fehler 1 error C2446: '==': Keine Konvertierung von 'const char *' in 'int' c:\users\[...]\desktop\finde extremwerte\finde extremwerte\finde extremwerte.cpp 104 Fehler 2 error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen c:\users\[...]\desktop\finde extremwerte\finde extremwerte\finde extremwerte.cpp 104
Du liest bitte noch mal das was Karl Heinz oben über "if" und "Semikolon" geschrieben hat. Anschchliessend überlegst Du Dir bitte, ob das "exit" eine Zeichenkette oder ein Argument ist.
Entschuldigung, ich nehme das mit "exit" wieder zurück! system ("exit"); ist korrekt!
intel schrieb: > system ("exit"); Und was um alles in der Welt soll das bewirken? Um ein Programm zu beenden, reicht es, main() zu verlassen. Was mit einer einfachen /return/-Anweisung erzielt wird.
Wenn ich mit einem einfachen return also main() verlasse, werden da dann auch alle belegten Ressourcen wieder freigegeben? Bei Exit denke ich, dass sich dann das OS darum kümmert, z.B. den Speicher aufräumen.
Selbstverständlich. Das ist unter jedem Betriebssystem so. Per system "exit" aufzurufen, bringt in dieser Hinsicht exakt gar nichts, weil system nämlich einen neuen Prozess startet, und "exit" von diesem ausgeführt wird.
Rufus Τ. Firefly schrieb: > intel schrieb: >> system ("exit"); > > Und was um alles in der Welt soll das bewirken? > > Um ein Programm zu beenden, reicht es, main() zu verlassen. Was mit > einer einfachen /return/-Anweisung erzielt wird. Wobei man sagen sollte, das es für sein Problem eine ganz einfache saubere Lösung ohne Ausstieg durch return oder exit gibt. Und die ist wirklich trivial, daher sollte er sie auch suchen. Seinen Fähigkeiten eine Schleife zu bilden wird es zu gute kommen.
> Ja so in der Art habe ich mir das vorgestellt. :)
Und warum machst du es dann nicht "so in der Art"?
(hth's Lösung ist nahe drann, aber nur nahe. Dein 'so in der Art' Lösung
ist viel simpler. Nur tun musst du es.
Wie lange soll die Schleife laufen?
do {
....
} while( welche Bedingung muss erfüllt sein,
damit noch ein Durchlauf kommt );
Karl Heinz Buchegger schrieb: > Wie lange soll die Schleife laufen? > > do { > > .... > > } while( welche Bedingung muss erfüllt sein, > damit noch ein Durchlauf kommt ); ich habe die Schleife jetzt so geschrieben. do { switch(flag) { case 'h': cout << "Gebe die erste Zahl ein: "; cin >> Zahl1; cout << endl; cout << "Gebe die zweite Zahl ein: "; cin >> Zahl2; cout << endl; cout << "Gebe die dritte Zahl ein: "; cin >> Zahl3; cout << endl; if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3)) { cout << "Die größte Zahl ist: " << Zahl1; } else { if ((Zahl2 > Zahl1) && (Zahl2 > Zahl3)) { cout << "Die größte Zahl ist: " << Zahl2; } else { cout << "Die gößte Zahl ist: " << Zahl3; } } break; case 'k': cout << "Gebe die erste Zahl ein: "; cin >> Zahl1; cout << endl; cout << "Gebe die zweite Zahl ein: "; cin >> Zahl2; cout << endl; cout << "Gebe die dritte Zahl ein: "; cin >> Zahl3; cout << endl; if ((Zahl1 < Zahl2) && (Zahl1 < Zahl3)) { cout << "Die kleinste Zahl ist: " << Zahl1; } else { if ((Zahl2 < Zahl1) && (Zahl2 < Zahl3)) { cout << "Die kleinste Zahl ist: " << Zahl2; } else { cout << "Die kleinste Zahl ist: " << Zahl3; } } break; default: cout << "Falsche Eingabe!!"; cout << "Bitte nur (h) oder (k) eingeben!"; break; } cout << endl; cout << endl; cout << "Was soll Angegeben werden?"; cout << endl; cout <<"Der kleinste Wert (k), der höchste Wert (h)oder (e)für verlassen!"; cout << endl; cin >> flag; system ("cls"); } while ((flag == 'k') || (flag == 'h')); Das klappt ach alles so wie ich es mit vorgestellt habe. Mit "Exit" wollte ich eigentlich nur erreichen, dass die Anwendung komplett geschlossen wird. Da die Konsole sich auch schließt wenn man Exit eingibt. Aber es geht nicht. Denn ich muss am Ende trotzdem noch mal Enter drücken um die Anwendung zu schließen.
Hallo Leute ich habe jetzt alles so hinbekommen wie ich es wollte. Damit das Programm nach der Schleife einfach beendet wird habe ich einfach "getch ()" weggenommen. Da er ja auf keine Eingabe mehr wartet schließt er einfach die Konsole. Hätte mir auch früher einfallen sollen. Das mit den Sonderzeichen habe ich wie folgt gelöst. Der Befehl heißt: \xHex-Zahl\ Also wenn man das Wort "Höchstwert" schreiben möchte. Schreibt man einfach "H\x99\chstwert" << 99 = ö Und es geht alles. Vielen Dank für die ganze Hilfe von euch. Gruß Intel
intel schrieb: > Das mit den Sonderzeichen habe ich wie folgt gelöst. Das ist keine Lösung, sondern Frickelei. Wie man es richtig macht, habe ich Dir geschildert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.