sergej: if & else C++ Syntax

Hallo Ihr Menschen :-)

folgendes Problem : wenn ich bei folgendem Programmchen "j" eingebe, teilt dieses den eingegebenen Wert durch 2. Wenn ich "n" eingebe, schreibt er zwar das "Auf Wiedersehen" teilt aber dennoch durch 2 und gibt es aus.

Was mache ich falsch?

=====================================================================

#include <iostream.h>

int main ()
{

cout << "Bitte einen Wert eingeben ";
 int w;
 cin >> w;

cout << "Sie haben "" << w << "" eingegeben\n\n";

cout <<"Wollen Sie diesen Wert durch 2 teilen?\n";
 cout << "fuer ja bitte "j" eingeben, fuer nein "n" \n\n";

char auswahl;
 cin >> auswahl;

if (auswahl =='n')
  cout << "Auf Wiedersehen\n\n";

else (auswahl == 'j');
 cout << "Das Ergebnis ist " << w/2 <<"\n";

return 0;
}

=====================================================================

danke im voraus

S.K.

  1. Hoi,

    folgendes Problem : wenn ich bei folgendem Programmchen "j"
    eingebe, teilt dieses den eingegebenen Wert durch 2. Wenn ich "n"
    eingebe, schreibt er zwar das "Auf Wiedersehen" teilt aber dennoch
    durch 2 und gibt es aus.

    Was mache ich falsch?

    cout << "Bitte einen Wert eingeben ";

    du solltest std::cout schreiben, oder 'using namespace std' ueber
    'int main'.

    cin >> w;

    Fuer cin gilt dasselbe.

    cout << "Sie haben "" << w << "" eingegeben\n\n";

    statt '\n' wuerde ich std::endl benutzen, aber das ist wohl
    Geschmacksache.

    else (auswahl == 'j');

    Der Fehler liegt hier. Mach mal das Semikolon weg.

    Gruesse,
     c.j.k

    1. hi,

      wow... das war ne schnelle Antwort :-)

      Semikolon habe ich weggemacht, jetzt meckert der Compiler :

      =================================================================

      D:\CCD\Meine Programme\Übung\Übung1\übung1.cpp(23) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'cout'
      Fehler beim Ausführen von cl.exe.

      übung1.exe - 1 Fehler, 0 Warnung(en)

      ==================================================================

      .........

      char auswahl;
       cin >> auswahl;

      if (auswahl =='n')
        cout << "Auf Wiedersehen\n\n";

      else (auswahl == 'j') // hier sollte das ; ja weg
       cout << "Das Ergebnis ist " << w/2 <<"\n";

      ..........

      1. Hoi,

        =================================================================

        D:\CCD\Meine Programme\Übung\Übung1\übung1.cpp(23) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'cout'
        Fehler beim Ausführen von cl.exe.

        übung1.exe - 1 Fehler, 0 Warnung(en)

        ==================================================================

        Du weisst aber schon, dass...

        else (auswahl == 'j') // hier sollte das ; ja weg
        cout << "Das Ergebnis ist " << w/2 <<"\n";

        das entweder

        else
         cout << "Das Ergebnis ist " << w/2 <<"\n";

        oder

        else if(auswahl == 'j')
         cout << "Das Ergebnis ist " << w/2 <<"\n";

        heissen muss?

        BTW, es heisst

        #include <iostream>

        und das 'using namespace std' war kein Witz.

        Gruesse,
         c.j.k

        1. Ah, ok :-)

          Danke... Ich glaube ich hab es jetzt.

          Bis demnächst. Ich werde euch noch des Öffteren mit C++ quälen.
          8-) Also entspannt euch nicht . hhehe

          S.K.

  2. Hej Sergej,

    was hälst Du von Klammer, wenn etwas zusammenghören soll ;o)?

    if (auswahl =='n')
      cout << "Auf Wiedersehen\n\n";

    else {
        cout << "Das Ergebnis ist " << w/2 <<"\n";
    }

    oder
    ----

    else if ('j' == auswahl) {
        cout << "Das Ergebnis ist " << w/2 <<"\n";
    }

    Else heißt doch, daß alles was dahinter kommt nicht der if-Anweisung enstpricht und ohne Klammern wird nur (auswahl == 'j') ausgeführt (zwar nicht sinnvoll, aber wird trotzdem gemacht.

    Viel Spaß noch, beim lernen ;o),

    Marko

    1. Hoi,

      was hälst Du von Klammer, wenn etwas zusammenghören soll ;o)?

      Das ist in dem Fall nicht sinnvoll. Bloecke grenzen eine Abfolge von
      Befehlen ein, hier soll allerdings nur ein Befehl ausgefuehrt werden.

      Else heißt doch, daß alles was dahinter kommt nicht der
      if-Anweisung enstpricht und ohne Klammern wird nur (auswahl == 'j')
      ausgeführt (zwar nicht sinnvoll, aber wird trotzdem gemacht.

      Das ist leider falsch. In diesem Zusammenhang stimmt das, wegen des
      Semikolons direkt hinter dem 'else', aber generell ist das falsch. Die
      Definition sieht so aus:

      if(Expression)
       Block oder Befehl
      else
       Block oder Befehl

      Also

      if(1)
        irgendwas();
      else
       irgendwas();

      ist durchaus richtig und gueltig.

      Gruesse,
       c.j.k

      1. ist dann dieses nicht richtig?
        (gehet tuht das :-) ).

        =====================================================================

        char auswahl;
         cin >> auswahl;

        if (auswahl =='n')
          cout << "Auf Wiedersehen\n\n";

        else if ('j' == auswahl) {
            cout << "Das Ergebnis ist " << w/2 <<"\n";

        }

        =====================================================================

        1. Hoi,

          ist dann dieses nicht richtig?
          [...]

          Ja. Siehe </?m=55534&t=10018>

          Gruesse,
           c.j.k

        2. Hej Sergej,

          das wäre auch richtig, allerdings würde ein zusätzlicher else-Zweig sinnvoll sein, denn es kann ja mal vorkommen, daß man/frau auch etwas anderes als j/n eingibt.

          Marko

      2. Hej Christian,

        Das ist in dem Fall nicht sinnvoll. Bloecke grenzen eine Abfolge von
        Befehlen ein, hier soll allerdings nur ein Befehl ausgefuehrt werden.

        ich habe da so dunkel gewisse Programmierrichtlinien in Erinnerung:
        Ziel ist es möglichst leserlichen und nciht möglichst kurzen Code zu schreiben.
        Um Fehlern also vorzubeugen, sollte man einfach mal Blöcke verwenden.

        Das ist leider falsch. In diesem Zusammenhang stimmt das, wegen des
        Semikolons direkt hinter dem 'else', aber generell ist das falsch. Die
        Definition sieht so aus:

        Letzendlich habe ich Deine Zeilen nur in Worte gefaßt, aber ist auch ok, wenn Du su als falsch betitelst *lach*.

        Schöne Grüße aus dem Westen,
        Marko

        1. Hi Marko,

          ich habe da so dunkel gewisse Programmierrichtlinien in Erinnerung:
          Ziel ist es möglichst leserlichen und nciht möglichst kurzen Code zu schreiben.
          Um Fehlern also vorzubeugen, sollte man einfach mal Blöcke verwenden.

          genau deswegen sind Blöcke auch in diesem Fall sinnvoll. Falls wirklich ein Compiler den Stack sichert in dem Fall, und nicht erkennt, dass man das in dem Fall nicht braucht, ist der Overhead in der allermeisten Fällen zu vernachlässigen. Da gibt es sicher andere Stellen im Programm, bei denen man eher die Laufzeit optimieren kann.

          Grundsätzlich geht Wartbarkeit und Vermeidung von potentiellen Fehlerquellen vor dem letzten Quentchen Performance.

          Gruß,
          Martin

      3. Hallo,

        was hälst Du von Klammer, wenn etwas zusammenghören soll ;o)?

        Das ist in dem Fall nicht sinnvoll. Bloecke grenzen eine Abfolge von
        Befehlen ein, hier soll allerdings nur ein Befehl ausgefuehrt werden.

        Wobei Blöcke aber AFAIK zu noch etwas anderes dienen. Sie definieren einen neuen Gültigkeitsbereich (steinige mich jetzt nicht wegen der eventuell nicht 'normgerechten' Wortwahl).

        Dadurch können Blöcke auch ohne Verzweigungen oder Schleifen durchaus sinnvoll sein.
        Beispiel:

        char buf[100];

        machwasmit(buf);
        ...
        machnochwas(buf);

        {
        char buf[200];
        tuwasmit(buf);
        tunochwasmit(buf);
        }

        undweitermitoriginalem(buf);

        Je nach Compiler (und dessen Optimierungsvermögen) heißt das allerdings auch, daß Blöcke zusätzlichen Maschinencode bedeuten. Nämlich zumindest um den Stack(pointer) am Anfang des Blockes zu sichern, und diesen am Ende wieder herzustellen.

        Grüße
          Klaus

        1. Hoi,

          was hälst Du von Klammer, wenn etwas zusammenghören soll ;o)?

          Das ist in dem Fall nicht sinnvoll. Bloecke grenzen eine
          Abfolge von Befehlen ein, hier soll allerdings nur ein Befehl
          ausgefuehrt werden.

          Wobei Blöcke aber AFAIK zu noch etwas anderes dienen. Sie
          definieren einen neuen Gültigkeitsbereich (steinige mich jetzt
          nicht wegen der eventuell nicht 'normgerechten' Wortwahl).

          Ja, ganz genau. Und genau...

          [...]
          Je nach Compiler (und dessen Optimierungsvermögen) heißt das
          allerdings auch, daß Blöcke zusätzlichen Maschinencode bedeuten.
          Nämlich zumindest um den Stack(pointer) am Anfang des Blockes zu
          sichern, und diesen am Ende wieder herzustellen.

          ... deshalb halte ich die Block-um-jeden-Preis-Einstellung nicht fuer
          sinnvoll ;-)

          Gruesse,
           c.j.k