Programare esențială | Structuri de control
Bucle
„Instrucțiunile de buclă” nu sunt altceva decât automatizarea proceselor în mai mulți pași prin organizarea unor secvențe de acțiuni și gruparea părților care trebuie repetate. De asemenea, o parte centrală a programării, iterația (sau Looping) oferă computerelor o mare parte din puterea lor. Ele pot repeta o secvență de pași ori de câte ori este necesar, iar repetițiile adecvate ale unor pași simpli pot rezolva probleme complexe.
În termeni generali, există două tipuri de „tehnici de buclă”:
- „Bucle For”: sunt cele care se execută pentru un număr prescris de ori, controlat de un contor sau de un index.
- „Bucle While” și „Bucle de repetare”: se bazează pe inițierea și verificarea unei condiții logice. Condiția este testată la începutul sau la sfârșitul construcției buclei.
Să le analizăm:
1) Buclele For
În această structură de control, instrucțiunile sunt executate una după alta într-o ordine consecutivă pe o secvență de valori care este evaluată numai atunci când este inițiată „bucla For” (nu este niciodată reevaluată). În acest caz, numărul de iterații este fixat și cunoscut dinainte.
Dacă evaluarea condiției asupra unei variabile (care poate lua valori în cadrul unei secvențe specificate) are ca rezultat TRUE, una sau mai multe instrucțiuni vor fi executate secvențial peste acel șir de valori. Odată ce primul test al condiției este efectuat (și are ca rezultat TRUE), se execută instrucțiunea și condiția este evaluată din nou, parcurgând un proces iterativ. Secțiunea „variabilă în secvență” efectuează acest test pentru fiecare valoare din secvență până când acoperă ultimul element.
Dacă condiția nu este îndeplinită și rezultatul este FALSE (de exemplu, partea „variabilă în secvență” a terminat de parcurs toate elementele secvenței), bucla se încheie. Dacă testul condiției are rezultatul FALSE la prima iterație, „For Loop” nu se execută niciodată.
Sintaxa „Buclelor For” este:
Exemplu 1
Pentru a arăta cum funcționează „Buclele For”, mai întâi vom crea o secvență prin concatenarea diferitelor nume de fructe pentru a crea o listă (numită „fruit_list”):
Vom folosi această listă de fructe ca „secvență” într-o „buclă For” și vom face ca această „buclă For” să ruleze o instrucțiune o singură dată (imprimă numele fiecărei valori) pentru fiecare valoare furnizată în secvență (diferitele fructe din lista de fructe):
În acest fel, rezultatul „For Loop” este următorul:
## "Apple"
## "Kiwi"
## "Orange"
## "Banana"
OK, deci am tipărit numele fiecărei valori din listă. Nu e mare lucru, nu-i așa? Lucrul bun este că „Buclele For” pot fi folosite pentru a produce rezultate mai interesante. Aruncați o privire la următorul exemplu.
Exemplu 2
Ce se întâmplă dacă dorim să modificăm valori sau să efectuăm calcule secvențial? Puteți utiliza „For Loops” pentru a efectua operații matematice secvențial pe fiecare valoare a unui vector (elemente de același tip, care în acest caz vor fi numerice).
În acest exemplu, vom crea o secvență de numere (de la 1 la 10) și vom seta o „Buclă For” pentru a calcula și imprima rădăcina pătrată a fiecărei valori din această secvență:
În acest caz, rezultatul „Buclei For” este:
1
1.414214
1.732051
2
2.236068
2.449490
2.645751
2.828427
3
3.162278
Puteți utiliza orice tip de operator matematic asupra unei secvențe numerice și, după cum vom vedea mai târziu în acest articol, puteți face tot felul de combinații între diferite structuri de control pentru a ajunge la rezultate mai complexe.
2) Buclele While
În „Buclele While” se evaluează mai întâi o condiție, iar dacă rezultatul testării acelei condiții este TRUE, una sau mai multe instrucțiuni sunt executate în mod repetat până când acea condiție devine FALSE.
Spre deosebire de „If statements”, în care o condiție testată ca fiind TRUE execută o expresie o singură dată și se termină, „While Loops” sunt instrucțiuni iterative care execută o anumită expresie din nou și din nou până când condiția devine FALSE. Dacă condiția nu se dovedește niciodată a fi FALSE, „While Loop” va continua la nesfârșit, iar programul se va bloca. Invers, dacă testul condiției rezultă FALSE la începutul buclei, expresia nu va fi niciodată executată.
Sintaxa „While Loops” este:
Exemplu 1
Să vedem un exemplu. Mai întâi vom crea o variabilă (x) și îi vom atribui valoarea 1. Apoi vom seta o buclă „While Loop” pentru a testa iterativ o condiție asupra acelei variabile până când rezultatul testului de condiție este FALSE:
Acesta este modul în care funcționează: valoarea inițială a variabilei (x) este 1, astfel încât atunci când testăm condiția „este variabila (x) mai mică decât 10?”, rezultatul este evaluat la TRUE și expresia este executată, tipărind rezultatul variabilei (x), care în primul caz este 1. Dar apoi se întâmplă ceva: variabila (x) este incrementată cu 1 înainte de terminarea funcției, iar în următoarea iterație valoarea lui x va fi 2.
Această reașezare a variabilei este importantă pentru că în cele din urmă se va ajunge la condiția FALSE și la ieșirea din buclă (valoarea lui x = 10). Dacă nu se schimbă condițiile inițiale într-o buclă „While Loop” se va ajunge la o buclă infinită și la blocarea programului.
Output
1
2
3
4
5
6
7
8
9
Exemplu 2
Ai auzit de secvența Fibonacci? Aceasta este o serie de numere cu caracteristica că următorul număr din secvență se găsește prin însumarea celor două numere dinaintea sa: 0, 1, 1, 1, 2, 3, 5, 8, 13, 21,… Această secvență poate fi întâlnită în mai multe fenomene din natură și are diferite aplicații în finanțe, muzică, arhitectură și alte discipline.
Să o calculăm folosind o „Buclă While”.
În acest caz am setat o valoare maximă în serie ca și condiție de oprire, astfel încât bucla să tipărească seria Fibonacci doar pentru numere sub 100. Când un element al seriei (oricare ar fi el) devine mai mare de 100, ciclul buclei se termină.
0
1
1
2
3
5
8
13
21
34
55
89
Exemplu 3
O altă modalitate de a genera seria Fibonacci cu o „While Loop” este, în loc să setați valoarea maximă a seriei ca și condiție de oprire, să setați numărul de elemente ale seriei pe care doriți să le generați.
Acest „While Loop” adaugă următorul element al seriei la sfârșitul elementului anterior, până la atingerea unei condiții de oprire. În acest caz, atunci când seria ajunge la 10 elemente (indiferent de valori), bucla cylce se termină.
Output
0 1 1 2 3 5 8 13 21 34
3) Bucle de repetare
În strânsă legătură cu „While Loops”, „Repeat Loops” execută instrucțiuni iterativ, dar până la îndeplinirea unei condiții de oprire. În acest fel, declarațiile sunt executate cel puțin o dată, indiferent de rezultatul condiției, iar bucla iese din buclă doar atunci când o anumită condiție devine TRUE:
Sintaxa „buclelor de repetare” este următoarea: „Repeat Loop”:
„Buclele de repetare” folosesc „Break statements” ca o condiție de oprire. „Instrucțiunile de întrerupere” sunt combinate cu testarea unei condiții pentru a întrerupe ciclurile din cadrul buclelor, deoarece atunci când programul atinge o întrerupere, va trece controlul la instrucțiunea imediat după sfârșitul buclei (dacă există).
„Repeat Loops” va rula la nesfârșit dacă nu este îndeplinită condiția de întrerupere. Vedeți aceste 2 exemple
Exemplul 1
În primul rând creăm o variabilă (x) și îi atribuim valoarea 5. Apoi setăm o „Repeat Loop” pentru a imprima iterativ valoarea variabilei, modificăm valoarea variabilei (o mărim cu 1) și testăm o condiție asupra acelei variabile (dacă este egală cu 10) până când rezultatul testului de condiție este TRUE.
„Condiția de întrerupere” se declanșează atunci când variabila (x) ajunge la 10, iar bucla se încheie.
Succes
5
6
7
8
9
Exemplul 2
Acum să presupunem că producem o listă de numere aleatoare, pentru care nu cunoaștem ordinea sau secvența de generare.
În acest exemplu vom folosi o „buclă de repetare” pentru a genera o secvență de numere aleatoare distribuite normal (puteți genera numere aleatoare cu orice altă distribuție, noi doar am ales-o pe aceasta), și vom întrerupe secvența odată ce unul dintre aceste numere este mai mare decât 1. Deoarece nu știm care numere vor fi primele, nu știm cât de lungă va fi secvența: știm doar condiția de întrerupere.
În primul rând, folosim instrucțiunea „set.seed” pentru a fixa numerele aleatoare (generăm întotdeauna aceleași numere aleatoare) și pentru a face acest exemplu reproductibil.
Apoi inițiem „Repeat Loop” prin generarea unui număr aleatoriu distribuit normal, imprimându-l și verificând dacă acel număr este mai mare decât 1. Numai atunci când această condiție devine TRUE (ar putea fi cu primul număr generat, sau nu), ciclul buclei va trece la instrucțiunea break și se va încheia.
Output
-0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661
Acest lucru arată încă o dată importanța stabilirii unei condiții de întrerupere corespunzătoare. În caz contrar, va rezulta o buclă infinită.
Gânduri finale
Am văzut și explicat concepte în mod izolat, dar „Structurile de control” pot fi combinate oricum doriți: Buclele pot conține mai multe bucle interne; Condiționalele pot conține Bucle și Condiționale, opțiunile sunt infinite. (de fapt, când am analizat „Repeat Loops” am constatat că exemplele conțineau „If statements” imbricate).
Puteți dezvolta soluții avansate doar prin combinarea „Structurilor de control” pe care le-am explicat în acest articol. Așa cum a afirmat Minsky, putem ajunge la rezultate complexe ca urmare a interacțiunii unor componente mai simple. Structurile de control constituie blocurile de bază pentru procesele de luare a deciziilor în informatică. Ele schimbă fluxul programelor și ne permit să construim seturi complexe de instrucțiuni din blocuri de construcție mai simple.
Sfatul meu este: învățați despre ele.
Vă va ușura drumul către codare și înțelegerea programelor și vă va ajuta să găsiți noi modalități de rezolvare a problemelor.