Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » break und continue in verschachtelten Schleifen

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
22.12.2004, 14:48 Uhr
Oliver
S2-Pixelgeneral


Hi,

ich habe eigentlich eine ganz simple Frage: Wie kann man aus verschachtelten Schleifen die obereren abbrechen bzw. den Schleifendurchlauf abbrechen (break, continue).

Z.B.


C++:
while(1)
{
    for(int i=0;i<20;++i)
        if(i==10)
            break;

}



Mit dem break soll die obere while-Schleife beendet werden. Zugegeben, ist in dem Fall ein sinnloses Beispiel. Aber wie kann man das machen? Gibt's noch einen eleganteren Weg als goto?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.12.2004, 14:52 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Goto ist nie ein eleganter weg

Entweder änderst du die Abbruchbedingung der while Schleife und setzt diese vor dem break oder du setzt einen Merker vor dem Break und machst nach der for Schleife ein erneutes break wenn dieser gesetzt ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.12.2004, 14:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


die antwort ist ganz einfach...
gar nicht

du kannst dir behelfen indem du ein goto verwendest (wurde hier schon mal diskutiert und ist einer der wenigen fälle wo man wenn auch mit schlechtem gewissen ein goto verwenden könnte) bzw eine extra funktion dafür schreibst... oder du verwendest z.b. ein flag das in der schleifenbedinung auch abgeprüft wird und das im fall des falles dann auf false gesetzt wird...


Bearbeitung:

argh ich kill den pirat


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 22.12.2004 um 14:53 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.12.2004, 15:10 Uhr
Oliver
S2-Pixelgeneral


Ich wollte ne Lottofunktion machen:


C++:
void GeneriereLottozahlen(char*lottozahlen)
{
    for(int i=0;i<6;++i)
    {
        while(1)
        {
        ocontinue:
            lottozahlen[i]=Rnd(49,1);
            for(int z=0;z<i;++z)
                if(lottozahlen[z]==lottozahlen[i])
                    goto ocontinue;
            break;
        }
    }
}



Sieht nicht sehr elegant aus...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 22.12.2004 um 15:16 Uhr von Oliver editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.12.2004, 15:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Also wie Windalf bemerkt, macht man das meist mit einem Flag...

Ich kann es mir aber nicht ganz verkneifen... Es geht auch ohne Flag/Funktion:

C++:
#include <iostream>
#include <string>

struct break_exception {
    int level;
    break_exception(int l) :level(l) { };
};


int main() {
    while(1) {
        try {
            for(int i=0; i<100; ++i) {
                try {
                    if (i==10) {
                        std::string brecher;
                        std::cerr<<"Was Du breaken ([n]ix [f]or [w]hile): ";
                        std::getline(std::cin, brecher);
                        switch(brecher[0]) {
                            case 'f': throw break_exception(1);
                            case 'w': throw break_exception(2);
                        }
                    }
                }
                catch(break_exception& be) {
                    if (--be.level>0) throw;
                    break;
                }
            }
        }
        catch(break_exception& be) {
            if (--be.level>0) throw;
            break;
        }
    }
}


Aber abgesehen von dem erhöhten Codierungsaufwand sind exceptions einfach zu teuer...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.12.2004, 15:22 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Oliver:
Ich wollte ne Lottofunktion machen:


C++:
void GeneriereLottozahlen(char*lottozahlen)
{
    for(int i=0;i<6;++i)
    {
        while(1)
        {
        ocontinue:
            lottozahlen[i]=Rnd(49,1);
            for(int z=0;z<i;++z)
                if(lottozahlen[z]==lottozahlen[i])
                    goto ocontinue;
            break;
        }
    }
}



Abgesehen davon, daß der Code sch... ist, kommst Du hier auch ganz ohne goto aus:

C++:
void GeneriereLottozahlen(char*lottozahlen)
{
    for(int i=0;i<6;++i)
    {
        while(1)
        {
            lottozahlen[i]=Rnd(49,1);
            for(int z=0;z<i;++z)
                if(lottozahlen[z]==lottozahlen[i])
                    continue;
            break;
        }
    }
}


Und da ich den Mund so voll nehme, von wegen Sch... und so:

C++:
int kugeln[49];
for(int i=0; i<49; ++i) kugeln[i]= i+1;
std::random_shuffle(kugeln, kugeln+49);
std::copy(kugeln, kugeln+6, std::back_inserter(lottozahlen));


Macht das gleiche wie Deine Funktion, nur schneller und wesentlich kürzer.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 22.12.2004 um 15:23 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.12.2004, 16:04 Uhr
Oliver
S2-Pixelgeneral


Also der code



C++:
void GeneriereLottozahlen(char*lottozahlen)
{
    for(int i=0;i<6;++i)
    {
        while(1)
        {
            lottozahlen[i]=Rnd(49,1);
            for(int z=0;z<i;++z)
                if(lottozahlen[z]==lottozahlen[i])
                    continue;
            break;
        }
    }
}



ist doch etwas anders. Hier wird doch mit dem continue der Durchlauf der For-Schleife abgebrochen und nicht der der while-Schleife, was eigentlich gemacht werden soll, damit doppelte Zahlen ausgeschlossen werden können oder?

Und den 2. Code bekomm ich nicht zum kompilieren . Was mache ich da falsch?


C++:
#pragma warning(disable: 4786)


#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;




int main()
{
    int kugeln[49];
    char lottozahlen[6];
    for(int i=0; i<49; ++i) kugeln[i]= i+1;
    random_shuffle(kugeln, kugeln+49);
    copy(kugeln, kugeln+6, back_inserter(lottozahlen));




    cin.get();
    return 0;
}





Code:
c:\programme\microsoft visual studio\vc98\include\iterator(77) : error C2039: 'value_type' : is not a member of '`global namespace''
        C:\Dokumente und Einstellungen\Oliver\Desktop\Oliver\C++\Konsolenversuch\code.cpp(20) : see reference to class template instantiation 'std::back_insert_iterator<char [6]>' being compiled
c:\programme\microsoft visual studio\vc98\include\iterator(77) : error C2146: syntax error : missing ';' before identifier 'value_type'
        C:\Dokumente und Einstellungen\Oliver\Desktop\Oliver\C++\Konsolenversuch\code.cpp(20) : see reference to class template instantiation 'std::back_insert_iterator<char [6]>' being compiled
c:\programme\microsoft visual studio\vc98\include\iterator(77) : error C2868: 'value_type' : illegal syntax for using-declaration; expected qualified-name
        C:\Dokumente und Einstellungen\Oliver\Desktop\Oliver\C++\Konsolenversuch\code.cpp(20) : see reference to class template instantiation 'std::back_insert_iterator<char [6]>' being compiled


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.12.2004, 16:13 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Oliver:
Also der code



C++:
void GeneriereLottozahlen(char*lottozahlen)
{
    for(int i=0;i<6;++i)
    {
        while(1)
        {
            lottozahlen[i]=Rnd(49,1);
            for(int z=0;z<i;++z)
                if(lottozahlen[z]==lottozahlen[i])
                    continue;
            break;
        }
    }
}



ist doch etwas anders. Hier wird doch mit dem continue der Durchlauf der For-Schleife abgebrochen und nicht der der while-Schleife, was eigentlich gemacht werden soll, damit doppelte Zahlen ausgeschlossen werden können oder?


Oh, sorry, stimmt.


Zitat von Oliver:

Und den 2. Code bekomm ich nicht zum kompilieren . Was mache ich da falsch?



Nix. Ich bin heute wohl nicht ganz bei mir:
back_inserter tut natürlich nur mit Containern. Machs einfach über ne for Schleife:


C++:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;

int main()
{
    int kugeln[49];
    char lottozahlen[6];
    for(int i=0; i<49; ++i) kugeln[i]= i+1;
    random_shuffle(kugeln, kugeln+49);
    for(int i=0; i<6; ++i) lottozahlen[i] = kugeln[i];
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.12.2004, 16:31 Uhr
Oliver
S2-Pixelgeneral


Ok thx erstmal

Aber geht das wirklich schneller, wenn da 49 Arrayelemente hin und her geschoben werden?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.12.2004, 16:51 Uhr
virtual
Sexiest Bit alive
(Operator)


random_shuffle macht in obigen Beispiel genau 48 vertauschoperationen und aufrufe an random. Die Anzahl der Schleifendurchläufe bei deinem Code ist nicht vorhersagbar. Ich denke mal, speziell bei 6 aus 49 wirst Du weniger operationen im Schnitt ausführen, in seltnen Fällen mehr. Bei 40 aus 49 wäre aber Dein algorithmus schon äußerst ungünstig...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
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: