Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Else-problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
07.03.2004, 16:57 Uhr
Cebinem



Hallo!!!
Ich hab ein Problem bei meinem Programm. Ich möchte ein Progamm (Win32-Konsolenanwendung),
das anzeigt, wenn man 1 eingibt, dass 1 der Buchstabe a ist und wenn man 2 eingibt, dass 2 der Buchstabe b ist.
Nur mit 1 funktioniert es bestens, aber mit 1 und 2 klappt es schon nicht mehr. Ich weiß, dass mein Quellcode auch einfacher zu schreiben wäre, damit er das gleiche tut. Aber so wie er ist, sollte er eigentlich funktionieren.
Wenn ich es kompiliere erscheint folgender Fehler:

error C2181: Ungueltiges 'else' ohne zugehoeriges 'if'

Komisch ist erstens nur, dass ein anderes Programm mit dem gleichen Quellcode (nur mit anderen Variablen- und
Konstantennamen bzw. anderen Werten) beim Kompielieren keinen Fehler anzeigt.
Zweitens ist komisch, dass das erste Programm trotz Fehlermeldung läuft, aber wenn ich 1 eingebe passiert
nichts und gebe ich nochmal 1 ein erscheint (im DOS-Fenster) "a" = 1 und eine Zeile darunter Keine gueltige Zahl.
Wenn ich 2 eingebe passiert auch nichts und gebe ich nochmal 2 ein erscheint "b" = 2. Dies liegt wahrscheinlich
an der falschen Platzierung von else (glaub ich).
Zur Veranschaulichung hab ich mal beide Programme (ohne und mit Fehlermeldung) aufgeschrieben.
Ich hab schon alles mögliche probiert, aber das 2. Programm zeigt immer einen Fehler an.

Hier noch ein paar Daten von mir:
- Betriebssystem: Windows XP Professional
- Compiler: DEV-C++ 4.9.8.0 (hab auch schon VC++ 6.0 ausprobiert, geht auch nicht)


DANKE schon im vorraus für jegliche Hilfe!!!!!!!!!!!!!!!!!!!!!!!!!

MFG
Cebinem

1. Programm (ohne Fehlermeldung)


C++:
#include <iostream>
using namespace std;
int main()

{
float Geschwindigkeit;
const float Limit = 30;
cout << "Bitte geben sie die Geschwindigkeit ein: " << endl;
cin >> Geschwindigkeit;
cout << "" << endl;
if (Geschwindigkeit > Limit)
{
  if (Geschwindigkeit > Limit + 20)
   cout << "Zu schnell gefahren. Verwarnung und geringe Geldstrafe." << endl;
  else
   cout << "Zu schnell gefahren." << endl;
}
else
  cout << "Nicht zu schnell gefahren." << endl;

cin.ignore();
cin.get();
return 0;
}




2. Programm (mit Fehlermeldung)


C++:
#include <iostream>
using namespace std;
int main()
{

float a, b;
const float BuchstabeA = 1;
const float BuchstabeB = 2;
cout << "Bitte Zahl eingeben: " << endl;
cin >> a;
cin >> b;
if (a == BuchstabeA)
  cout << "\"a\" = " << a <<" " << endl;
{
  if (b == BuchstabeB)
   cout << "\"b\" = " << b <<" " << endl;
  else
   cout << "Keine gueltige Zahl." << endl;
}
else // hier wird der Fehler (siehe oben) angezeigt
  cout << "Keine gueltige Zahl." << endl;
cin.ignore();
cin.get();
return 0;
}


--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.03.2004, 17:02 Uhr
Bruder Leif
dances with systems
(Operator)


Dem äußeren IF folgt eine einzelne Zeile, danach kommt erst ein Block. Und der wird so oder so ausgeführt, womit das IF-Statement beendet ist. Setz die Zeile mit dem cout << "\"a\"...usw. mit in den Block, dann klappts.
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.03.2004, 17:13 Uhr
Pablo
Supertux
(Operator)


Beim 2. Code ist logisch, dass das passiert. Denn du hast

C++:
if (a == BuchstabeA)
  cout << "\"a\" = " << a <<" " << endl;



Nach den Regeln der C++ Grammtik, ist cout << " .... den Block, dass ausgeführt wird, wenn a==BuchstabeA TRUE liefert.

Bei dir kommt dann { ... } und ein else, aber dieses Else passt nicht mehr zu den if. Du hast die { Klammer nach der if-Anweisung an einer falschen Stellen.

--edit: Upss zu langsam........
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 07.03.2004 um 17:14 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.03.2004, 18:26 Uhr
Cebinem



Also, erstmal DANKE für die schnellen Antworten!!!!!!!!!!!!!!!!!!
Ich habe nun die Zeile:


C++:
cout << "\"a\" = " << a <<" " << endl;



ausgeschnitten und direkt über die Zeile:


C++:
if (b == BuchstabeB)



eingefügt und anschließend kompiliert.
Es hat zwar funktioniert (keine Fehlermeldung), aber wenn ich 1 eingebe erscheint wieder nichts
und wenn ich nochmal 1 eingebe erscheint wieder "a" = 1 und eine Zeile darunter auch
wieder Keine gueltige Zahl. Und wenn ich 2 eingebe passiert auch nichts und wenn
ich nochmal 2 eingebe erscheint nur Keine gueltige Zahl. Ich hab dann noch ein bisschen probiert, aber
nichts geht so, wie ich es beabsichtige.


Nun meine Fragen:

1.
Hab ich die falsche Zeile ausgeschnitten oder dann falsch eingefügt?
2.
Muss ich nach dem Ausschneiden noch eine Zeile hinzufügen?
3.
Könnt ihr mir genau sagen, welche Zeile ich wohin schreiben muss und welche Klammer weg muss
oder so...?

Es wäre sehr nett, wenn sich jemand mal die Zeit nehmen würde und den ganzen Quellcode (wie oben angegeben) so aufschreibt, dass er richtig funktioniert, weil ich sonst immer Zeile für Zeile meine Fehler angeben
muss und das ist sehr aufwendig.


Vielen DANK, dass ihr euch die Zeit nehmt, mir zu helfen!!!!!!!!!!!!!!!!!!!!

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.03.2004, 18:39 Uhr
Pablo
Supertux
(Operator)


Das passiert, weil du mit float arbeitest und auf Gleichheit kannst du nicht mit == prüfen.


C++:
#define EPSILON 0.001
#include <math.h>
int fcmp(float x, float y)
{
    return fabsf(x-y) < EPSILON; // oder auch fabs
}



Statt Sachen wie

C++:
if (a==BuchstabeA)


zu habe, mach folgendes:

C++:
if(fcmp(a, BuchstabeA))


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.03.2004, 16:41 Uhr
~Julian H.
Gast


Hi,

in deinen Code-Auszügen is mir aufgefallen das du die Bibliotheken net richtig eingefügt hast...ich bin mir allerdings nicht sicher..ich kenne es nur so:

du hast geschrieben:
#include <iostream>

ich kenne es so:
#include <iostream.h>


ioch weis net ob man es auch so schreiben kann wie du, nur ich kenne es anders..und ob es die Ursache für dein Problem ist weis ich auch net....

greez
Julian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.03.2004, 16:47 Uhr
Pablo
Supertux
(Operator)


@Julian

das von Cebinem war richtig, deine Version ist schon zu alt, und nein, das hat mit dem Problem gar nichts zu tun.

Nach den neuen Standard (glaub sogar nach C99) (muss) kann man
#include <iostream>
machen, da es einige Sachen geänder wurden, z.b. die Klasse string befindet sich heute im Namespace std und so; das gleiche gilt für cout, cin usw.

Das sollte nicht kompilierbar sein:

C++:
#include <iostream>
int main()
{
    cout << "Hello, Wold" << endl;
    return 0;
}



Mein g++ kann das nicht kompilieren.

C++:
#include <iostream>
int main()
{
    std::cout << "Hello, Wold" << std::endl;
    return 0;
}



Das wäre das richtige. Und das kann mein g++ kompilieren.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.03.2004 um 16:48 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.03.2004, 16:52 Uhr
KaraHead



@pablo wenn man es so schreibt:

C++:
#include <iostream>
using namespace std;
int main()
{
    cout<< "Hello, Wold" <<endl;
    return 0;
}


heißt es das man dann das std vor cout/endl weglassen kann???
Oder sollte man es trozdem hinschreiben???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.03.2004, 17:16 Uhr
Pablo
Supertux
(Operator)


Der Compiler sucht cout im normalen Namespace, findet aber nichst, aber weil du using namespace std; benutzt, sucht er im Namespace std und dort fidet er cout und benutzt dieses cout.

Die Antwort auf deine Frage ist ja, weil du using namespace std; benutzst. In meinem Beispiel ist diese Zeile aber nicht vorhanden.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.03.2004, 21:46 Uhr
Cebinem



An Pablo:

Also das mit


C++:
#define EPSILON 0.001
#include <math.h>
int fcmp(float x, float y)
{
    return fabsf(x-y) < EPSILON; // oder auch fabs
}



verstehe ich nicht so ganz. Ist dies hier nur ein allgemeines Beispiel oder bezieht es sich auf meinen Quellcode? Was ich auch nicht verstehe, ist was prüft hierbei ob 1 = "a" ist oder dass 2 = "b" ist?
Ich hab ja eigentlich bis jetzt immer mit if- und else-Anweisungen gearbeitet und es hat immer geklappt, nur weiß ich nicht, wo genau das if und das else hingehört, also ob es nun in den Block gehört oder nicht oder woanders hin? Muss jedes if auch ein else haben?
Ist #define nicht die ältere Lösung zur Definition von Konstanten, muss man da nicht besser const nehmen?
Wie übertrage ich das obige Beispiel auf mein Programm?
Du hast gesagt, dass wenn ich mit float arbeite und auf Gleichheit prüfe, dies nicht mit == geht.
Aber warum geht es dann bei dem 1. Programm (siehe oben)? Da hab ich das auch mit float gemacht.
Geht es wenn ich int oder ähnliches nehme?


Nur nochmal nebenbei:

Wenn ich


C++:
using namespace std;




benutze, muss ich dann unbedingt


C++:
std::



vor cout und cin und so setzen? Bis jetzt ging es immer, wenn ich using namespace std; genommen hab, ohne std::, aber macht das was bei anderen Namensbereichen oder so wenn ich using namespace std; nehme
und std:: weg lasse? Oder einfacher ausgedrückt: Muss ich immer beides nehmen ("using namespace std;" und "std::") oder geht auch nur using namespace std;?


Ich hoffe, ihr versteht meine vielen Fragen!!!!!!!!!!!
DANKE für alle Hilfe und Hinweise!!!!!!!!!!!!!!!!!!!!!!!!



MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: