In C exista doua tipuri de instructiuni de control a fluxului de rulare si ar putea fi
etichetate ca "structuri alternative" si "structuri repetitive".
Ce fac acestea ? Instructiuni alternative verifica o conditie si in functie de aceasta
ruleaza un bloc de instructiuni sau altul. Instructiunile repetitive, dupa cum le spune
si numele, ruleaza un bloc de instructiuni pana cand apare conditia de oprire a repetarii.
Ca si in cazul functiilor, mai multe instructiuni pot forma un bloc folosind acoladele.
1. Instructiunea IFAceasta instructiune permite ramificarea programului in functie de valoarea conditiei.
sintaxa acesteia este:
if( Conditie )
executa cod1;
else
executa cod2;
Cum functioneaza ? Blocul "Conditie" este evaluat si daca acesta ia valoarea True este
executat codul 1. In caz contrar (Conditia ia valoarea False) este executat codul 2.
De mentionat 2 idei:
a. else nu e obligatoriu sa apara;
b. se pot executa mai multe instructiuni pentru fiecare din cazuri cu conditia ca acestea
sa fie tinute in interiorul unui bloc determinat de { si }.
Sa vedem si un exemplu concret:
if( 1 == 1 )
printf("Adevarat");
else
printf("Fals");
In exemplul de mai sus se evalueaza expresia 1 == 1 care intotdeauna va returna True, deci
blocul dat ca exemplu intotdeauna va afisa "Adevarat". Daca am inlocui 1 == 1 cu 1 == 0
conditia va deveni Falsa la fiecare rulare, deci de fiecare data blocul respectiv
va afisa "Fals".
Pentru a putea fi folosita in practica, instructiunea if permite utilizarea variabilelor.
Adica, putem avea int a = 1; si int b = 2; care apoi sa le evaluam. Daca expresia dintre
paranteze va fi de forma if( a == b ) rezultatul va fi "False" pentru ca a = 1 si b = 2
ceea ce e fals. In schimb daca expresia ar fi de forma if( a != b ) rezultatul va fi "True".
De ce ? Pentru ca a nu este egal cu b iar expresia va returna "True" daca a nu este egal
cu b ( operatorul != ).
Trebuie mentionat ca functia if poate fi folosita doar in cazul numerelor. In cazul sirurilor
se folosesc functii specializate despre care voi vorbi intr-o lectie care urmeaza.
Pentru a complica putin treburile, e bine de stiut ca instructiunea if permite si expresii
compuse, adica 2 sau mai multe expresii legate intre ele prin operatorii logici && (si)
respectiv || (sau). Cum putem folosi asta ? Simplu, dau un exemplu mai jos care va ajuta
sa intelegeti:
int a,b,c;
a = 1;
b = 2;
c = 3;
if( a == 1 && b b && b < c ){
printf("Am facut un SI logic intre rezultatele expresiilor a > b si b < c\n.");
printf("Prima returneaza False.\n");
printf("A doua returneaza True.\n");
printf("Rezultatul e False pentru ca SI logic aplicat pe True si False e False.\n");
printf("Adica textul de aici nu va fi afisat niciodata ;-) .\n");
}
Instructiunea IF accepta de asemenea si "inlantuiri". Adica, aplicam un IF iar in cazul in care
conditia rezultata este False, punem un else care foloseste mai departe un alt IF. Cel mai bine
se intelege printr-un exemplu:
if( conditie )
puts("Conditia ia valoarea True");
else if( conditie2 )
puts("Conditia 1 a luat valoarea False, iar conditie2 True");
else
puts("Conditia 1 si Conditia 2 au luat valoarea False");
Simplu, nu ? Dar ganditi-va ce ar iesi daca am avea de verificat 10 conditii. Pentru cazuri
mai complexe, s-a creat instructiunea switch.
2. Instructiunea switch functioneaza identic cu instructiunea IF cu diferenta ca
aceasta permite mai multe alternative. IF permite doar 2 alternative (True sau False).
Switch ne permite sa declaram mai multe alternative si sa asociem cate o actiune
pentru fiecare. Sintaxa este de felul urmator:
switch( expresie ){
case constanta1: instructiune1;break;
case constanta2: instructiune2;break;
...
case constantaN: instructiuneN;break;
default: instructiuneDefault;
}
Ce inseamna asta ? Se verifica expresia data ca parametru instructiunii switch iar apoi
rezultatul este comparat pe rand cu fiecare caz specificat. Daca expresia are valoarea
constantei nr. 1, se executa instructiune1 iar apoi se iasa din structura de control
(instructiunea break obliga iesirea). Daca expresia nu se valideaza se trece la
urmatorul caz si asa mai departe pana cand se termina cazurile. Daca expresia nu corespunde
nici unui caz specificat se executa instructiunea data la cazul "default". Acesta poate
lipsi dar nu este recomandat. Dupa ce instructiunea switch si-a facut treaba programul
este executat mai departe.
3. Instructiunea repetitiva WHILEFoarte des veti avea nevoie sa folositi acelasi bloc de cod de mai multe ori cu mici
diferente. In loc sa scrieti acelasi cod de 100 de ori, puteti folosi o instructiune
repetitiva (bucla) while.
Instructiunea are urmatoarea forma:
while( expresie ){
codul care trebuie executat
}
Adica, la intrarea in bucla while este evaluata expresia. Daca aceasta are valoarea True,
se executa codul. In caz contrar se trece la instructiunea urmatoare.
Bun, sa facem un mic cod care va afisa toate numerele de la 1 la 100 cu ajutorul buclei
while:
int i = 0; // Aici declaram variabila i de tip int si o initializam cu valoarea 0;
while( i < 100 ){
printf("Valoarea lui i este %d\n",i);
i++;
}
Ce am facut mai sus ? Am declarat o variabila i si am initializat-o cu valoarea 0. Apoi
am folosit-o in expresia din cadrul instructiunii while sub forma i<100 (adica valoarea
variabilei i este mai mica decat 100). Odata inceputa bucla while, i va avea valoarea 0.
La prima evaluarea a expresiei i va fi inlocuit cu 0 (valoarea actuala a lui i). 0<100
va returna True, deci codul va fi executat. La urmatoarea evaluare i va avea valoarea 1
pentru ca la iesirea din codul while se incrementeaza valoarea lui i. Deci, expresia
se va transforma din 0<100 in 1<100 care este, din nou, True. Codul va fi executat pana
cand i va lua valoarea 100, adica de 100 de ori si de cate ori va fi executat codul
noi vom vedea pe ecram "Valoarea lui i este %d" unde %d este valoarea actuala.
Cand i va lua valoarea 100, expresia va deveni 100<100 care este fals iar bucla se va
opri si va fi executata urmatoarea instructiune.
Pentru cei carora le place sa se complice putin, bucla de mai sus poate fi scrisa si sub
forma:
int i=0;
while( i++ < 100 )
printf("Valoarea lui i este %d\n",i);
4. Instructiunea FORO instructiune repetitiva mai simpla este FOR. Aceasta se aseamana foarte mult
cu instructiunea WHILE, cu diferenta ca initializarea, expresia validata si modificarea
variabilei de control sunt facute intr-o singura linie. Se utilizeaza in felul urmator:
for( expresie1 ; expresie2 ; expresie3 ){
cod care trebuie executat
}
Asta s-ar traduce in felul urmator:
expresie1 este evaluata la initializarea functiei;
expresie2 verifica conditia de rularea a codului;
expresie3 modifica valorile verificate de expresie2.
Un exemplu concret si foarte utilizat ar fi urmatorul:
for( i=0 ; i<100 ; i++ )
printf("Valoarea lui i este %d\n",i);
In cazul de fata, i este initializat cu valoarea 0 (expresie1), cat timp valoarea lui i
este mai mica decat 100 este rulat blocul corespunzator instructiunii (expresie2) si la
fiecare rulare i este incrementat (expresie3).
5. Instructiunea DO-WHILEAceasta instructiune este foarte asemanatoare cu instructiunea WHILE cu diferenta ca
blocul corespunzator instructiunii este executat cel putin o data. Este folosita in felul
urmator:
do{
cod care trebuie executat
} while (expresie)
Adica, codul va fi rulat si abia apoi va fi evaluata expresia si se va decide daca se
va rula din nou codul sau nu.
Cam asta ar fi lectia despre instructiunile de control. Sper ca ati inteles. In caz contrar
va astept cu intrebari.
Ar mai fi de mentionat urmatoarele:
1. In fiecare caz, puteti da frau liber imaginatiei si fiecare expresie care este
evaluata poate fi rezultatul utilizarii operatorilor logici && (SI) respectiv || (SAU).
2. In cazul instructiunilor repetitive (bucle) aveti grija ca intotdeauna sa existe o
cale de iesire. In caz contrar va veti alege cu o bucla infinita care va bloca
aplicatia sau intreg sistemul.
3. Have fun ! Si asta-i cea mai importanta