Unitat Didàctica 2:
En aquesta unitat aprendràs:
if-else, if-else-if i la sentència switchfor (decrementant, ometent parts, anidats) i whilebreak, continue i etiquetesEls 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.
if-elseLa 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");
}
switchQuan 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ú");
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");
}
Un bucle és una estructura que repeteix un conjunt d'instruccions mentre es compleixi una condició determinada. Cada repetició s'anomena iteració.
forEl 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:
int i = 0).true, el cos s'executa; si és false, el bucle s'acaba.i++ / i--).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 + " ");
}
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!");
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!");
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();
}
whileEl 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++;
}
De vegades necessitem interrompre un bucle abans d'hora o saltar-nos una iteració concreta sense aturar tot el procés.
breakLa 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--;
}
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();
}
continueA 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 + " ");
}
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();
}
Posa a prova el que has après completant els qüestionaris interactius auto-avaluables i els reptes de programació.