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.
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
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.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/dd319646%28v=vs.85%29.aspx
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.
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.
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.