PDA

View Full Version : aiuto su cicli annidati for [JAVA]


michelev83
20-11-2003, 20:41
chi mi spiega bene come funziona questo programma?

for (int r = 1; r <= n; r++) { // r e' la riga
for (int c = 1; c <= r; c++) // c e' la colonna
System.out.print("*");
System.out.println();

ri
20-11-2003, 20:45
assumendo che al fondo ci sia una parentesi graffa, disegna un triangolo rettangolo con i cateti di lato n

michelev83
20-11-2003, 20:46
si lo so:(
ma nn capisco come funziona....

ri
20-11-2003, 20:54
come non capisci?

primo for: è un semplice ciclo che parte da 1 arriva fino ad n; è un ciclo sulle righe che verranno stampate
secondo for: viene eseguito ad ogni loop sul primo for; parte da 1 e arriva fino al valore di r; stampa c=r asterischi; al termine del for si fa una println per andare a capo...

sinceramente non vedo nulla di strano é_è

PGI
21-11-2003, 01:08
Originariamente inviato da michelev83
chi mi spiega bene come funziona questo programma?

for (int r = 1; r <= n; r++) { // r e' la riga
for (int c = 1; c <= r; c++) // c e' la colonna
System.out.print("*");
}
System.out.println();
}



Come ha detto ri, c'è un primo ciclo for che incrementa un numero "r" di 1, finchè r non diventa uguale a "n".

Il secondo ciclo (interno al primo) incrementa "c" di 1 finchè c non diventa uguale a "r".

L'alternativa alla spiegazione di ri è quello che con fatica mi accingo a fare :D (ma che dimostra che c'è dello straordinario in quelle due righe di codice, soprattutto per le dita del programmatore :D)

Supponiamo di far "girare" quel pezzo di codice con "n = 5":


1° passaggio (del primo ciclo "for")

r=1: (ciclo "esterno")
r(1) <= n (5) -> vero, esegue il blocco del ciclo "esterno" che a sua volta contiene un altro ciclo:
c=1: (ciclo "interno", 1° passaggio)
c (1) <= r (1) -> vero, esegue il blocco del ciclo "interno"
il ciclo interno stampa ->"*"
c=2: (sempre ciclo "interno", 2° passaggio)
c(2) <= r(1) -> falso, il ciclo interno si ferma, il "controllo" passa la ciclo esterno.
il ciclo esterno stampa->"nuova linea"

2° passaggio( del primo ciclo);

r=2: (esterno)
r(2) <= n(5) -> vero, esegue il blocco del ciclo esterno...
c=1: (interno, 1° passaggio)
c(1) <= r(2) -> vero, esegue il "suo" blocco:
il ciclo interno stampa ->"*"
c=2: (interno, 2° passaggio)
c(2) <= r(2) -> vero, esegue il blocco:
il ciclo interno stampa ->"*"
c=3: (interno, 3° passaggio)
c(3) <= r(2) -> falso, il ciclo interno si ferma...
il ciclo esterno stampa ->"nuova linea"

3° passaggio (sempre del primo ciclo for)

r=3: (esterno)
r(3) <= n(5) -> vero, esegue il blocco del ciclo "esterno", che contiene il ciclo interno
c=1: (interno, 1° passaggio)
c(1) <= r(3) -> vero, allora....
il ciclo interno stampa ->"*"
c=2: (interno, 2° passaggio)
c(2) <=r(3) -> vero...
"*"
c=3: (interno, 3°)
c(3) <= r(3) -> vero...
"*"
c=4: (interno 4°)
c(4) <= r(3) -> falso...esce dal ciclo interno
il ciclo esterno stampa ->"nuova linea"

4° passaggio, ciclo for esterno:

r=4: (esterno)
r(4) <= n(5) vero...
c=1: (interno, 1°)
c(1) <= r(4) -> vero...
"*"
c=2: (interno, 2°)
c(2) <= r(4) -> vero...
"*"
c=3: (interno, 3°)
c(3) <= r(4) -> vero...
"*"
c=4: (interno, 4°)
c(4) <= r(4) -> vero...
"*"
c=5: (interno, 5°)
c(5) <= r(4) -> falso!...fine ciclo interno.
il ciclo esterno stampa ->"nuova linea"

5° passaggio del ciclo for esterno:

r=5:
r(5) <= n(5) -> vero...
c=1 (interno, 1°)
c(1) <= r(5) vero...
"*"
c=2 (interno, 2°)
c(2) <= r(5) vero...
"*"
c=3 (interno, 3°)
c(3) <= r(5) vero...
"*"
c=4 (interno, 4°)
c(4) <= r(5) vero...
"*"
c=5 (interno, 5°)
c(5) <= r(5), vero...
"*"
c=6 (interno, 6°)
c(6) <= r(5), falso!...esce dal ciclo interno...
il ciclo esterno stampa ->"nuova linea"

6° passaggio del ciclo esterno:

r=6:
r(6) <= n(5) falso!, il ciclo esterno non esegue il suo blocco (e quindi non esegue il ciclo interno) e la faccenda finisce.

Il risultato a video è:

*
**
***
****
*****

michelev83
23-11-2003, 17:09
grazie! adesso ho capito benissimo!