Break in cicli annidati

kobeilprofeta
Supponiamo di avere una matrice a di dimensioni mxn. Voglio le coordinate del primo elemento nullo. Potrei fare:
int i,j;
int tmp1,tmp2;
for (i=0;i<m;i++)
   for (j=0;j<n;j++)
        if (a[i][j]==0)
       {
             tmp1=i;
             tmp2=j;
       }

e così avrei memorizzato le coordinate.
Se invece non volessi usare i due tmp, e quindi salvare il valore in i,j... come dovrei fare?
Se metto un break mi esce solo dal ciclo più interno... grazie

Risposte
apatriarca
Potresti usare un goto, ma è spesso meglio evitare. In alternativa puoi utilizzare un qualche tipo di flag che setti quando incontri il primo elemento non nullo e lo usi per uscire dai cicli.

kobeilprofeta
io per il momento sono andato di "ignoranza"... è proprio da evitare secondo te?
[code]
i=10;
j=10;
[code]

apatriarca
Non ho capito che cosa dovrebbe fare quel codice..

_Fra116
Io userei un flag e metterei due break condizionali in entrambi i cicli for ... cosi dovrebbe funzionare !

EDIT : volendo funzionerebbe anche senza flag, ma ripetendo la condizione.

kobeilprofeta
"apatriarca":
Non ho capito che cosa dovrebbe fare quel codice..

io facevo
for (i=0;i<n;i++)
   for (j=0;j<n;j++)
     if (a[i][j]==0)
       {
          tmp1=i;
          tmp2=j;
          i=10;
          j=10;
        }

per uscire dal doppio ciclo


Però se voglio evitare di usare i tmp non posso

apatriarca
Suppongo che nella tua soluzione n sia minore o uguale a 10. Puoi seguire una delle seguenti strade:
// Soluzione 1
for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
        if (a[i][j] == 0) { goto fineciclo; }
    }
}
fineciclo:
/* .. codice post ciclo .. */

// Soluzione 2
i = j = 0;
while (i < n && a[i][j] != 0) {
    if (++j >= n) {
        j = 0;
        ++i;
    }
}

// Soluzione 3 (se non puoi usare bool va bene anche un int inizializzato in modo opportuno)
bool running = true;
for (i = 0; i < n && running; ++i) {
    for (j = 0; j < n; ++j) {
        if (a[i][j] == 0) {
            running = false;
            break;
        }
    }
}

Immagino sia possibile farlo anche in altri modi, ma suppongo siano sufficienti per ora.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.