← Índex del curs Exercicis

Unitat 2. Control de Flux

Unitat Didàctica 2:

En aquesta unitat aprendràs:

Estructures de selecció: if-else, if-else-if i la sentència switch
Bucles: for (decrementant, ometent parts, anidats) i while
Salts de control: break, continue i etiquetes

Estructures de Control: Prendre decisions i repetir tasques

Els ordinadors són increïblement ràpids fent càlculs, però la seva veritable potència rau en la capacitat de prendre decisions segons certes condicions i de repetir tasques milers o milions de vegades sense cansar-se.

Per defecte, un programa s'executa seqüencialment: instrucció rere instrucció, de dalt a baix. Les estructures de control ens permeten trencar aquest flux lineal.

1. Sentències Condicionals: if-else i switch

if-else

La sentència bàsica per a prendre decisions és if. Si la condició booleana és certa (true), s'executa el bloc de codi associat; en cas contrari, es pot saltar o executar una branca alternativa amb else:

int edat = 18; if (edat >= 18) { println("Ets major d'edat."); } else { println("Ets menor d'edat."); }

Quan tenim múltiples camins possibles, podem encadenar sentències amb else if:

int nota = 85; if (nota >= 90) { println("Excel·lent"); } else if (nota >= 70) { println("Notable"); } else if (nota >= 50) { println("Aprovat"); } else { println("Suspès"); }

switch

Quan volem ramificar el flux d'execució d'un programa comparant el valor d'una variable o expressió amb múltiples valors possibles, la sentència switch ofereix una sintaxi molt més clara i neta que encadenar múltiples if-else if.

La diferència principal entre l'expressió switch i la sentència switch és que l'expressió switch retorna un valor, mentre que la sentència switch no retorna cap valor.

Observa en el següent stepper interactiu com el programa avalua la variable opcio, salta directament al cas coincident (case 2), executa la seva acció i immediatament continua després del switch

int opcio = 2; switch (opcio) { case 1 -> println("Nou joc"); case 2 -> println("Carregar partida"); case 3 -> println("Configuració"); default -> println("Opció no vàlida"); } println("Fi del menú");

Múltiples etiquetes en un sol case

Amb el enhanced switch és molt fàcil tractar diversos valors conjuntament separant-los per comes en una sola línia:

int dia = 6; switch (dia) { case 1, 2, 3, 4, 5 -> println("Dia feiner"); case 6, 7 -> println("Cap de setmana!"); default -> println("Dia no vàlid"); }

2. Estructures Repetitives: Els bucles for i while

Un bucle és una estructura que repeteix un conjunt d'instruccions mentre es compleixi una condició determinada. Cada repetició s'anomena iteració.

for

El bucle for s'utilitza habitualment quan sabem per endavant quantes vegades volem repetir un bloc de codi. Consta de tres parts separades per punt i coma:

Fes servir els controls interactius del stepper següent per avançar pas a pas. Observa com a cada iteració es comprova la condició, s'executa el cos i s'actualitza el comptador a la memòria:

int n = 5; for (int i = 0; i < n; i++) { print(i + " "); }

Bucle for decrementant

També podem comptar cap enrere començant des d'un valor superior i utilitzant l'operador de decrement i--:

for (int i = 5; i > 0; i--) { print(i + " "); } println("Llançament!");

Ometre parts en un bucle for

Totes les parts d'un for són opcionals. Podem ometre la inicialització o la modificació si la lògica del bucle depèn d'altres operacions o d'una lectura d'entrada:

println("Endevina el número secret:"); for (; Integer.parseInt(IO.readln()) != 6; ) { println("Segueix intentant-ho"); } println("L'has endevinat!");

Bucles for anidats

Podem posar un bucle dins d'un altre bucle (bucles niats o anidats). Per cada iteració del bucle exterior, el bucle interior s'executa completament des de l'inici fins al final:

for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { print(i + "," + j + " "); } println(); }

while

El bucle while comprova una condició abans d'executar el cos (pre-condició). S'utilitza quan no sabem exactament quantes iteracions caldrà fer, sinó que depenem d'un estat que canvia:

int i = 0; while (i < 5) { print(i + " "); i++; }

3. Salts de Control: break i continue

De vegades necessitem interrompre un bucle abans d'hora o saltar-nos una iteració concreta sense aturar tot el procés.

break

La sentència break finalitza immediatament el bucle més proper que l'envolta, transferint el control a la següent instrucció fora del bucle:

int i = 10; while (true) { print(i + " "); if (i == 5) { break; } i--; }

break en bucles niats

Quan tenim un bucle dins d'un altre (bucles niats), un break només atura el bucle intern on es troba, deixant que el bucle extern continuï la seva execució normal:

for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { print(j + " "); if (i == j) { break; } } println(); }

continue

A diferència de break, la sentència continue no atura el bucle, sinó que salta immediatament a la següent iteració (executant la part de modificació en un for):

int n = 5; for (int i = 0; i < n; i++) { if (i % 2 != 0) { continue; } print(i + " "); }

break i continue etiquetats

Per defecte, tant break com continue només afecten el bucle més immediat que els conté. Quan treballem amb bucles niats i volem aturar o continuar un bucle superior, podem associar-li una etiqueta (label) amb el format nom_etiqueta: for (...):

bucle_i: for (int i = 0; i < 3; i++) { bucle_j: for (int j = 0; j < 3; j++) { if (i == 1 && j == 1) { break bucle_i; } print(i + "," + j + " "); } println(); }

Exercicis Pràctics i Qüestionaris

Posa a prova el que has après completant els qüestionaris interactius auto-avaluables i els reptes de programació.

Exercicis