Capitolul 2: LecțiiRepetiții (while)
În programare, vom avea nevoie să repetăm instrucțiuni, poate pentru că nu vrem să repetăm cod, sau pentru că nu știm de câte ori trebuie repetat. Toate limbajele de programare cu care am lucrat au instrucțiuni speciale pentru asta. De obicei, sunt două instrucțiuni, folosite fiecare în situații diferite:
Atunci când nu știm de câte ori trebuie repetat, îi spun eu cu număr necunoscut de pași.
Atunci când se știe cumva numărul de repetiții, cu număr cunoscut de pași.
În această lecție, vom învăța despre instrucțiunea while
, care seamănă cu if
, în sensul că primește o condiție care poate fi adevărată sau falsă. Dacă acea condiție este adevărată, se execută blocul de instrucțiuni imediat următor. Dacă este falsă, se sare la instrucțiunea de după.
while(canMove()) { move() } turnRight()Exemplu cu „while”
Cum funcționează codul alăturat:
Se evaluează
canMove()
de la linia1
. Dacă este adevărat,se execută blocul de instrucțiuni, adică efectiv
canMove()
de la linia2
Se revine la
canMove()
de la linia1
Când condiția devine falsă, sau a fost falsă de la început, se sare direct la
turnRight()
O testare a unei condiții și execuția blocului se numește iterație. Toate iterațiile împreună sunt numite de către profesorii de programare români buclă, de la englezescul loop. Nu e nevoie să cunoști acești termeni, decât dacă trebuie să te evalueze un profesor mai bătrân.
While și variabile
Cum condiția de la while
acceptă orice poate produce un boolean, inclusiv o variabilă care ține un boolean. Hai să ne uităm la un exemplu:
var free = canMove() while(free) { move() } turnRight()Exemplu cu variabilå
Cei mai repeziți dintre noi ar putea spune că rezultatul este identic cu ce am avut mai sus. Punând cele două versiuni în codul în lecția 3 din aplicație (despre while), vom constata că prima variantă face miorița să meargă până la capătul culoarului, în timp ce a doua dă eroare.
Să ne reamintim ce am scris despre variabile la lecția trecută:
Putem pune în dreapta inclusiv instrucțiuni care produc valori, precum
canMove()
de la Miorița, care produce un boolean.
Valoarea produsă va fi pusă în memorie la momentul în care se evaluează.
Altfel spus: Se evaluează canMove()
de la linia 1
, care poate fi adevărat sau fals, iar acea valoare de adevărat sau fals se pune în memorie, nu tot ce avem în dreapta. Mergând programul mai departe, vom vedea că nu se mai evaluează niciodată, chiar dacă poziția în stână a Mioriței s-a schimbat. Așadar, free
va rămâne == true
mereu, deci se va executa mereu blocul lui while. La un moment dat îi cerem să meargă în față, dar a ajuns la marginea stânei și nu mai poate.
Dacă vrem neapărat să folosim variabile, putem să schimbăm valoarea din memorie de la acea variabilă.
var free = canMove() while(free) { move() free = canMove() } turnRight()
Acum, la linia 5
îi dăm variabilei free
noua valoare produsă de funcția canMove()
de la linia 5
. Chiar dacă folosim aceeași instrucțiune, valoarea pe care o produce poate să difere, pentru că s-au schimbat condițiile.
break
și continue
E posibil să avem nevoie să oprim execuția unei iterații, sau chiar a întregii bucle. Pentru asta, vom folosi instrucțiunile continue
, respectiv break
. Beneficiem de faptul că într-un bloc de instrucțiuni putem folosi orice instrucțiune, inclusiv if
-uri care au la rândul lor blocuri. De aceea, vom vedea aceste instrucțiuni în blocul unui if
sau else
.
while(true) { move() free = canMove() if (!free) { break; } } // break sare aici
// continue sare aici while(true) { move() free = canMove() if (!free) { continue; } }