M3 - Programació estructurada / Continguts UF1: La sentència for
La sentència for
En algunes situacions especials ja es coneix, a priori, la quantitat exacta de vegades que caldrà repetir un determinat codi. En tal cas és útil disposar d’un mecanisme que representi de manera clara la declaració d’una variable de control de tipus comptador, l’especificació de fins on s’ha de comptar, i que al final de cada iteració incrementi o disminueixi el seu valor de manera automàtica, en lloc d’haver de fer-ho nosaltres.
Automatitzar aquest darrer punt és molt important, ja que evita que per un oblit no es faci i s’acabi generant un bucle infinit.
Sintaxi i estructura
La sintaxi d’aquesta sentència en llenguatge Java és una mica més complexa, ja que hi intervenen molts factors. Cal especificar tres apartats especials separats per punt i coma (;):
for (inicialització comptador ; expressió booleana ; increment comptador) {
Instruccions per executar dins del bucle
}
Exemple:
for (int i = 0; i<10; i++) {
........
}
La descripció de cada apartat és la següent:
- Inicialització comptador: es tracta de la inicialització d’una variable de tipus numèric que servirà com a comptador. És exactament igual que assignar un valor a una variable qualsevol (identificador = valorInicial). Si es vol, es permet declarar la variable alhora que s’inicialitza (tipus identificador = valorInicial).
- Expressió booleana: es tracta de la condició lògica que indica si cal fer una nova iteració o no, igual que en la resta d’estructures de repetició.
- Increment: es tracta d’una instrucció que modifica el valor del comptador, normalment una assignació. Aquesta instrucció s’executa automàticament al final de cada iteració. Tot i el seu nom, tant pot ser un increment com una disminució del valor.
Bucles imbricats
Quan utilitzem bucles és molt freqüent la imbricació, que consisteix en incloure un bucle dins d'un altre, com es veu a la imatge:
En fer això es multiplica el nombre de vegades que s'executa el bloc d'instruccions dels bucles interns. Els bucles imbricats poden trobar-se relacionats quan els valors de les variables dels bucles més externs intervenen en el control de la iteració d'un bucle intern, o independents, quan no n'hi ha cap relació entre ells, sent el nombre d'iteracions d'un bucle aliè als valors de les variables utilitzades a l'altre bucle.
Bucles independents
Quan els bucles imbricats no depenen uns dels altres per determinar el nombre d'iteracions, s'anomenen bucles imbricats independents.
for (int i = 1; i < 5; i++) {
System.out.println("Bucle extern, i: " + i);
for (int j = 1; j < 4; j++) {
System.out.println(" Bucle intern, j: " + j);
}
}
El bucle extern, controlat per la variable i realitzarà quatre iteracions. Mentre el bucle extern està a la seva primera iteració (i val 1), el bucle intern realitza tres iteracions. Durant la segona iteració del bucle extern (i val 2), el bucle intern realitza altres tres iteracions, i així per a cada iteració del bucle extern.
En aquest cas la sortida que obtindrem serà:
Bucle extern, i: 1 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3 Bucle extern, i: 2 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3 Bucle extern, i: 3 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3 Bucle extern, i: 4 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3
Bucles dependents
Pot donar-se el cas que el nombre d'iteracions d'un bucle intern no sigui independent de l'execució dels bucles externs i depengui de la seva variable de control. En aquest cas s'anomenen bucles imbricats dependents.
Per exemple:
for (int i = 1; i < 5; i++) {
System.out.println("Bucle extern, i: " + i);
for (int j = 1; j <= i; j++) {
System.out.println(" Bucle intern, j: " + j);
}
}
- Durant la primera iteració del bucle extern (i val 1), el bucle intern realitza una sola iteració.
- A la segona iteració del bucle extern (i val 2), el bucle intern realitza dues iteracions.
- .....
La sortida del programa seria la següent:
Bucle extern, i: 1 Bucle intern, j: 1 Bucle extern, i: 2 Bucle intern, j: 1 Bucle intern, j: 2 Bucle extern, i: 3 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3 Bucle extern, i: 4 Bucle intern, j: 1 Bucle intern, j: 2 Bucle intern, j: 3 Bucle intern, j: 4