Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Switch in Switch ... Verzweigung

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 <
000
10.04.2014, 21:33 Uhr
Ladykiller969



Hallo,

ich habe folgendes Problem:

Ich habe eine switch verzweigung, in der mehrere switch verzweigungen eingebaut sind wie auch schleifen.

habe nun aber folgendes problem sobald eine innere schleife oder switch verzweigung beendet wurde (default zb. letzte zeile) springt das Programm heraus.
Das ist soweit gut aber es gibt dann trotz alldem die Ausgabe (cout) aus die in der 1. Switch verzweigung steht.
Das sollte sie nicht, kann ich das irgendwie umgehen, ohne einen Sprungbefehl?

Bsp:

C++:
char ch....1
.
.
.
.

...............................................................

switch(ch....1)
{
     case('i'):
     {
           switch(ch....)
          {
           case('o'):
.
.
.
           }
.
.
.
     }
.
.
.
      default:
      {
          cout << ".........." << endl;  
      }
}


// das Problem das ich habe ist, ich will das der default text nur erscheint wenn ich in der ersten verzweigung bleibe. sollte ich jedoch in die innere verzweigung/schleife kommen sollte es ohne die default ausgabe beenden.

ich weiß das der sprungbefehl ginge, aber gibt es auch eine andere möglichkeit?
Da das Problem auch die Übersichtlichkeit wäre, da es sich um mehr als 30 schleifen und mehreren verzweigungen handelt, soweit funktioniert das alles nur leider das ende eben nicht.

Vielen Dank für antworten:

---
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 11.04.2014 um 06:20 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.04.2014, 06:34 Uhr
Hans
Library Walker
(Operator)


... ich weis nicht, ob ich Dein Problem richtig verstanden habe, aber hast Du am Ende der jeweilige case-Blöcke auch das notwendiege break; eingebaut?


C++:
#include <iostream>

using namespace std;

int main()
{
    char c, h;

    c = 'j';
    h = 'o';

    switch(c)
    {
        case('i'):
        {
            switch(h)
            {
                case('o'):
                cout << "o" << endl;  
                // ....
                break; // case ('o')
                
                case('p'):
                cout << "p" << endl;  
                // ....
                break; // case('p')
            } // switch (h)
            break;
        } // case ('i')    
        
        case ('j'):
        {   cout << "j" << endl;  
            break;
        } // case ('j')          
        
    default:
        {
            cout << ".........." << endl;  
        }
    } // switch(c)
    return 0;
} // main



Ich hab Deinen Beispielcode mal zu einem lauffähigen Programm ausgebaut; wenn Du in der Form, wie es hier jetzt steht, das break; nach der Zeile cout << "j" << endl; auskommentierst, dann bekommst Du auch die Ausgabe des default-Zweigs mit ausgegeben.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 11.04.2014 um 07:09 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.04.2014, 14:52 Uhr
Ladykiller969



habe die notwendigen case und breaks drinn nur default da braucht man ja kein break.
wenn ich zb. in der 3 Schleife stecke und alles war richtig und da hört die schleife auf, dann ist die letzte terminal anzeige trotzdem (auch bei richtigem ende) die Fehlerausgabe mit cout die ganz unten steht. jedoch muss die dort stehen falls die 1. schleife schon falsch ist, jedoch wird diese fehlerausgabe nach jedem schleifenende ausgegeben. was nicht sein soll.
sie soll nur für die erste schleife gültig sein.
So besser erklärt, sorry bin erst neu hier und in der materie erst seit ner woche ca.
mach ich c++ und die ganzen bücher die ich gekauft habe sagen nicht wirklich viel die bringen zwar grundwissen etc. bei aber wenn man was vertiefen will um zu sehen wo die grenze im jeweiligem kapitel liegt, ist so ein buch auch schon wieder schrott.


C++:
#include <iostream>

using namespace std;

int main()
{
    char c, h;

    c = 'j';
    h = 'o';

    switch(c)
    {
        case('i'):
        {
            switch(h)
            {
                case('o'):
                cout << "o" << endl;  
                // ....
                break; // case ('o')
                
                case('p'):
                cout << "p" << endl;  
                // ....
                break; // case('p')
            } // switch (h)
            break;
        } // case ('i')    
        
        case ('j'):
        {   cout << "j" << endl;  
            break;
        } // case ('j')          
        
    default:
        {
            cout << ".........." << endl;  
        }
    } // switch(c)

//fehlerausgabe bei falscher eingabe oder schleifenausbruch
cout << "Fehler!" << endl;

// diese Anzeige soll nur erscheinen wenn die innere schleife/verzweigung nicht ausgeführt wird. Momentan ist das Problem das sie immer mit Ausgegeben wird, auch wenn die innere Schleif/Verzweigung ausgeführt wurden. was ja Logisch ist weil es von der ersten Switch Verzweigung die endausgabe ist, aber ich wollte das diese endausgabe nur erscheint wenn mann nicht in die innere Schleife oder Verzweigung kommt.

    return 0;
} // main



So in etwa, sieht es aus.
bei falscher eingabe erscheint die fehlerausgabe bei allen anderen sollte sie nicht erscheinen auch nicht am ende.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.04.2014, 16:09 Uhr
Tommix



Hallo,
Du könntest ein flag

C++:
bool ok = true;


einführen, das in den default-Zweigen, also wenn die Eingabe ungültig war auf false gesetzt wird und dann

C++:
if (!ok)
{
    cout << "Fehler!" << endl;
}


Oder auch umgekehrt bool err = false, falls Dir das logischer erscheint.

Gruss,
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.04.2014, 18:36 Uhr
Ladykiller969



Danke danke ich probier das gleich mal aus.

hätte noch eine Frage passt zwar nicht zum Thema, aber eventuell ist es nicht zu schwer für euch.

Folgendes habe momentan das buch durch (C++ für spieleprogrammierer von Heiko Kalista Auflage 4)
fand es nicht schlecht aber trotzdem auch nicht so extrem gut wie alle beschrieben.

jetzt stehe ich an der stelle wo mir das wissen und das eigene nicht mehr reicht,
auch sinnloses herumprobieren ist auf dauer manchmal deprimierend weil man oft einfach keine Lösung weis und auch nciht immer weis wie man es formulieren sollte.

Gibt es ein Buch das ihr empfehlen könnt, muss nicht speziell auf Spieleprogrammierung sein?
Ein freund sagte mir nur das C++ so einfacher zu lernen ist.
ich will aber ein buch was mir zb. nicht über 30 seiten ein Thema erklärt was mit in wenigen Sätzen verständlich erklären kann, wie bei diesem buch.
Wenn ihr versteht.

Des weiteren hatte ich auch vor eventuell ein ILS Fernstudium zu belegen für 15 Monate,
nur davon raten wiederum viele ab.

jetzt bin ich an einem Punkt ob ich falsch angefangen habe oder es trotzdem richtig war.

und weis nicht welchen weg man weitergehen sollte Fernstudium oder alleine über Bücher,
klar Fernstudium ist teurer aber darum geht es mir erstmal nicht.

würde mich über jede Antwort und Erfahrung freuen .

Bin 26 und kenne mich recht gut mit linux (Debian) und windows aus, und hatte anfang des jahres dann C++ angefangen.
Am Anfang eigentlich ohne Grund nur zum Zeitvetreib, mittlerweile zieht es mich aber magnetisch an und ich will unbedingt mal etwas großes alleine schaffen damit nur fehlt mir da momentan zu viel wissen.
Und momentan zieht es mich mehr in Richtung Games (Strategie-Aufbau),
aber das weis ich selbst ist ein sehr langer weg........ aber erstmal das vergessen das dauert noch lange bis dahin.
(Nur mal Wunschdenken- Realität sieht wieder anders aus XD)

Dieser Post wurde am 11.04.2014 um 18:38 Uhr von Ladykiller969 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.04.2014, 01:44 Uhr
Hans
Library Walker
(Operator)


Hi,

als erstes mal: Was hier in dem Beispielcode behandelt wird, sind NUR Verzweigungen, aber keine Schleifen. Schleifen sind die Konstrukte zur Wiederholung von Anweisungen, also:

C++:
for (...)
    // tue irgendwas

while (...)
    // tue irgendwas

do
    // tue irgendwas
while(...);



Dann noch mal zu dem Programbeispiel: ich finde es gerade bei solchen komplizierteren Verzweigungsbäumen immer ganz praktisch, wenn ich nach der schliessenden Klammer auch sehe, welchen Block sie genau abschliesst. Deshalb hab ich das in den Kommentaren dahinter geschrieben.
Zur Terminologie: Der innere Block (bzw. die innere Verzweigung) ist in diesem Beispiel jene, die mit switch(h) eingeleitet wird. Die andere, die mit switch(c) anfängt, ist der äussere Block.
Wenn ich Deine Logik richtig verstehe, dann gehört Deine Fehlermeldung als default Zweig in den inneren Block, d.h. vor der abschliessenden Klammer von switch(h), also so:

C++:
////////////////////////////////////////////////////////////////////////////////////
    switch(c) // äusserer Anweisungsblock
    {
        case('i'):
        {
            switch(h)  // innerer Anweisungsblock
            {
                case('o'):
                cout << "o" << endl;  
                // ....
                break; // case ('o')
                
                case('p'):
                cout << "p" << endl;  
                // ....
                break; // case('p')

              /* Hier gehört die Fehlermeldung hin, wenn keines der cases zutrifft,
                 die in diesem inneren Block überprüft werden.
              */

              default:
                 cout << "Fehler!" << endl;  
            } // switch (h) - hier ist der innere Anweisungsblock zu Ende  

            break; // verzweigt zum Ende des switch-Blocks, weil die zutreffende
                   // Bedingung vollständig bearbeitet wurde.
        } // case ('i')
        
        case ('j'):
        {   cout << "j" << endl;  
            break;
        } // case ('j')          
        
    default:
        {
            cout << ".........." << endl;  
        }
    } // switch(c) - hier ist der äussere Anweisungsblock zu Ende; Nachfolgende
      //             Anweisungen haben mit der Auswahllogik nichts mehr zu tun.



Die Stelle, wo Du sie im Posting 002 hingeschrieben hast, ist jene, an der alle Verzweigungen abgearbeitet sind, also die nachfolgende Anweisung. Deshalb wird sie da auch immer ausgeführt.


Was die Bücher angeht: Das von Kallista kenn ich nicht, also kann ich dazu nichts sagen. Ich empfehle hier meisstens den Breymann. Das Buch ist sehr umfangreich, weil es nicht nur die Sprache selbst vermittelt, sondern auch diverse weiterführende Theman behandelt, mit denen man es früher oder später zu tun bekommt. D.h. es verschafft einem einen Überblick darüber, auf dem man aufbauen kann, um sie bei Bedarf mit anderen Büchern zu vertiefen.
Die Bücher von Jürgen Wolf sollen auch ganz brauchbar sein, wie hier mal irgendwo zu lesen war. Ich kann sie aber nicht beurteilen. Ein anderer Kollege aus diesem Forum hat mal die Bücher von Scott Meyers empfohlen, wenn ich mich nicht irre. Und schliesslich wäre da noch der Herr Stroustrup zu nennen, der Erfinder von C++.
Aber am besten ist es immer, erst mal in eine Bibliothek zu gehen, und sich die Bücher dort anzusehen, und die interessantesten auszuleihen um zu Hause in Ruhe feststellen zu können, womit man am besten klar kommt. - Wenn man dann das optimale Buch gefunden hat, kann man es immer noch kaufen.
Wenn Du mit der Einführung durch bist, oder auch parallel dazu, wirst Du irgendwann ein Buch aus der Kategorie "Algorithmen und Datenstrukturen" zumindst teilweise durcharbeiten müssen, etwa "Algorithmen in C++" von Robert Sedgewick oder "Softwaretechnik in C/C++" von Rolf Isernhagen, was inzwischen nur noch in Bibliotheken zu haben ist. Wenn Du dann immer noch dabei bist, nimmst du Dir die englische "Game Programming Gems"-Reihe vor...
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 12.04.2014 um 01:50 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: