Forum: PC-Programmierung C++ If und else.


von intel (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

; 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.

von Peter II (Gast)


Lesenswert?

if ((Zahl1 > Zahl2) && (Zahl1 > Zahl3));
das ; ist zu viel.

> cout << "Die größte Zahl ist: "; Zahl2;
was willst du damit ausdrücken?

von user (Gast)


Lesenswert?

lass das ";" hinter dem if weg, da gehört keins hin

von g457 (Gast)


Lesenswert?

> 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

von intel (Gast)


Lesenswert?

Ja danke es hat geklappt.

Danke für die Hilfe...

von Jan (Gast)


Lesenswert?

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();
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Jan (Gast)


Lesenswert?

Ahhh vielen dank :)
hätte mir eigentlich noch einfallen müssen :)
Naja man lernt besser aus Fehlern...
Vielen dank jetzt klappt es :)

von intel (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von intel (Gast)


Lesenswert?

Danke das klingt gut. Ich werde das mal ausprobieren. Jetzt bleibt nur 
noch meine Frage mit der Schleife.

von hth (Gast)


Lesenswert?

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

von intel (Gast)


Lesenswert?

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

von Räuber (Gast)


Lesenswert?

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.

von abc123 (Gast)


Lesenswert?

>  if (flag == "e");
Doppelte Anführungszeichen -->String
Einfache ... -->Char

von Räuber (Gast)


Lesenswert?

Entschuldigung, ich nehme das mit "exit" wieder zurück!
system ("exit");  ist korrekt!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Räuber (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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 );

von intel (Gast)


Lesenswert?

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.

von intel (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.