[C++] Uscita ciclo for

Messaggioda MisterK » 18/02/2017, 16:45

Ciao!

qualcuno saprebbe consigliarmi un modo furbo per uscire da un ciclo for interno così strutturato ?
for(...){

if(){

for(.....){

if(...){

}
}
}
}
Io voglio che non appena la seconda condizione di if viene soddisfatta si esca dal ciclo for annidato ma non da quello più esterno.
Zwei Dinge erfüllen das Gemüt mit immer neuer und zunehmender Bewunderung und Ehrfurcht, je öfter und anhaltender sich das Nachdenken damit beschäftigt: Der bestirnte Himmel über mir, und das moralische Gesetz in mir.
Immanuel Kant: Kritik der praktischen Vernunft - Kapitel 34
MisterK
Junior Member
Junior Member
 
Messaggio: 78 di 190
Iscritto il: 14/03/2015, 12:38

Re: [C++] Uscita ciclo for

Messaggioda studente-studente » 18/02/2017, 19:19

Non conosco il C++ ma non puoi usare un flag oppure un break come nel C?
studente-studente
Junior Member
Junior Member
 
Messaggio: 99 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C++] Uscita ciclo for

Messaggioda insideworld » 18/02/2017, 19:20

nel secondo campo del for puoi mettere
(condizione1)AND flag
questo flag va inizializzato a 1=vero,poi lo setti ad 1 all'interno del secondo if e,alla prossima iterazione il for non vedrà soddisfatta la sua condizione perchè ilflag è a zero.
se dopo l'if ci sono operazioni che non vuoi eseguire puoi usare i continue e passerà direttamente alla prossima iterazione del for che fallirà.
p.s. se riesci almeno a postare il secondo for e l'if te lo posso spiegare sicuramente meglio =)
Avatar utente
insideworld
Junior Member
Junior Member
 
Messaggio: 41 di 306
Iscritto il: 13/01/2017, 15:24

Re: [C++] Uscita ciclo for

Messaggioda apatriarca » 18/02/2017, 21:12

Esistono diversi metodi a seconda di cosa devi fare.

1. Il metodo più semplice si ha quando i due cicli sono alla fine del corpo di una funzione. In tal caso è sufficiente inserire un return. Questo metodo non è molto generico, ma è senza dubbio il più semplice e leggibile e se i due cicli sono abbastanza grossi potrebbe comunque essere una buona idea quella di farne una funzione separata.

2. Il secondo metodo fa uso di goto. Questa istruzione può portare ad un codice molto difficile da comprendere, ma se limitato a situazioni eccezionali come questa può essere utile per rendere il codice più leggibile.
Codice:
for (..) {
    // ...
    for (..) {
        // ...
        if (..) { goto esci_cicli; }
        // ...
    }
    // ...
}
esci_cicli:
// ...

L'istruzione goto permette di saltare da un punto ad un altro del codice. L'esecuzione salta infatti alla prima istruzione che segue l'etichetta dopo il goto. Una etichetta viene definita semplicemente scrivendo il nome seguito dai due punti. Puoi usare qualsiasi nome. Questa soluzione ha alcuni potenziali problemi legati alla gestione della memoria. Si tratta infatti di una diretta traduzione di una istruzione del compilatore e alcune funzionalità più avanzate del C++ potrebbero non funzionare correttamente quando viene usata. Se nel ciclo non fai nulla di particolare non dovrebbero esserci problemi. Una sua evoluzione è presente nel punto 4.

3. Puoi usare una variabile booleana come segue:
Codice:
bool esci_cicli = false;
for (..) {
    // ...
    for (..) {
        // ...
        if (..) { esci_cicli = true; break; }
        // ...
    }
    if (esci_cicli) { break; }
    // ...
}

Questa è anche la soluzione proposta dagli altri.

4. Puoi usare una eccezione. Questa soluzione è principalmente utile in situazioni in cui ci sono più cicli o vuoi uscire da una lunga sequenza di funzioni ricorsive. Si tratta di un abuso di questa funzionalità ed è in generale sconsigliata per casi come questo (è anche probabilmente la soluzione meno efficiente).
Codice:
try {
    for (..) {
        // ...
        for (..) {
            // ...
            if (..) { throw std::exception(); }
            // ...
        }
        // ...
    }
} catch (const std::exception &e) { }
// ...

Ignora questa soluzione nel tuo particolare caso.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4543 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C++] Uscita ciclo for

Messaggioda mide » 19/02/2017, 10:07

Dato che è un ciclo for, oltre ai metodi sopra suggeriti, potresti anche far esaurire il numero di cicli semplicemente impostando la variabile contatore al limite massimo. Esempio:
for(i=0; i<5; i++){
if(bla bla)
i=5; //e quindi uscirà subito dal ciclo
}
mide
Junior Member
Junior Member
 
Messaggio: 28 di 344
Iscritto il: 27/01/2017, 23:08

Re: [C++] Uscita ciclo for

Messaggioda vict85 » 19/02/2017, 11:31

mide ha scritto:Dato che è un ciclo for, oltre ai metodi sopra suggeriti, potresti anche far esaurire il numero di cicli semplicemente impostando la variabile contatore al limite massimo. Esempio:
for(i=0; i<5; i++){
if(bla bla)
i=5; //e quindi uscirà subito dal ciclo
}


Seppur sia un metodo che funzioni, è meno leggibile e può facilmente portare a bug (in particolare se non metti un break dopo l'if). Inoltre sconsiglio di usarlo con costanti numeriche che possano cambiare in futuro, perché dovresti ricordarti di cambiarla in due punti.
vict85
Moderatore
Moderatore
 
Messaggio: 9003 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Uscita ciclo for

Messaggioda mide » 19/02/2017, 12:55

E' vero, può portare a bug se non si sta attenti. Sicuramente non è il metodo migliore quando si hanno dei cicli annidati, come giustamente dici, ma lo trovo utile quando ho un unico ciclo con poche istruzioni.
mide
Junior Member
Junior Member
 
Messaggio: 29 di 344
Iscritto il: 27/01/2017, 23:08

Re: [C++] Uscita ciclo for

Messaggioda insideworld » 19/02/2017, 15:41

anche i goto è considerato una cattiva pratica di programmazione.
tutto dipende dal campo di applicazione, se ad esempio devo minimizzare l'occupazione di memoria delle variabili è meglio il codice di mide, il mio è un pò più "classico", il metodo con il goto potrebbe non essere visto bene in ambito accademico, ma può tornare utile in certi casi(poca memoria disponibile per il codice o casi particolari)
MisterK se ci dai qualche info in più possiamo suggerirti la soluzione migliore
Avatar utente
insideworld
Junior Member
Junior Member
 
Messaggio: 50 di 306
Iscritto il: 13/01/2017, 15:24

Re: [C++] Uscita ciclo for

Messaggioda apatriarca » 19/02/2017, 16:44

Questa è una delle poche situazioni in cui i goto sono usati e accettati, almeno al di fuori dell'ambito accademico in cui si tende un po' troppo al dogmatismo. Il metodo che fa uso della variabile booleana è quella normalmente consigliata in ambito accademico. Considerata la complessità di quel codice, estrarre i cicli in una funzione separata potrebbe aumentare la leggibilità.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4547 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: garson e 1 ospite