Break in cicli annidati
Supponiamo di avere una matrice a di dimensioni mxn. Voglio le coordinate del primo elemento nullo. Potrei fare:
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
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
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.
io per il momento sono andato di "ignoranza"... è proprio da evitare secondo te?
[code]
i=10;
j=10;
[code]
[code]
i=10;
j=10;
[code]
Non ho capito che cosa dovrebbe fare quel codice..
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.
EDIT : volendo funzionerebbe anche senza flag, ma ripetendo la condizione.
"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
Suppongo che nella tua soluzione n sia minore o uguale a 10. Puoi seguire una delle seguenti strade:
Immagino sia possibile farlo anche in altri modi, ma suppongo siano sufficienti per ora.
// 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.