Sunteți pe pagina 1din 13

MODULUL 3

Instructiuni de control al modului de rulare a


programului

Instructiunile de control ale unui limbaj specifica ordinea in care sunt efectuate
operatiile. In acest modul ele sunt prezentate pe parcursul a trei lectii.

La sfarsitul parcurgerii acestui modul studentul va trebui


ƒ sa poata implementa decizii simple si complexe folosind instructiunile if si
switch
ƒ sa recunoasca ordinea corecta a deciziilor in instructiunile de decizie imbricate
ƒ sa poata programa cicluri cu instructiunile repetitive while, for si do-while
ƒ sa evite ciclurile infinite
ƒ sa inteleaga ciclurile imbricate

Organizarea materialului este următoarea:


ƒ prezentarea notiunilor teoretice de mai sus si a unui numar de exemple de
programe sau secvente de programe care puncteaza caracteristicile importante
ale notiunilor introduse si care faciliteaza o intelegere mai rapida a
materialului inclus.
ƒ o serie de exercitii (pe langa cele incluse la sfirsitul fiecarui modul) cu intentia
ca ele sa fie rezolvate in timp ce materialul teoretic este parcurs.
ƒ o lista de exercitii si probleme de programare care testeaza cunoasterea
notiunilor introduse de catre student. Mentionam ca aceste probleme nu sunt
ordonate dupa gradul lor de dificultate.
ƒ bibliografie recomandata.

Recomandam parcurgerea materialului in ordinea sa fireasca. De asemenea, va


recomandam ca atunci cand parcurgeti materialul sa rulati atat exemplele de programe
prezentate cat si scurte programe, scrise de dvs, similare celor date in exemple. Pentru
a invata un limbaj de programare cel mai bine este sa programezi direct in acel limbaj.

Timpul mediu necesar parcurgerii şi însuşirii noţiunilor teoretice, formării


deprinderilor practice de rezolvare şi dobândirii competenţelor anunţate este de
aproximativ 6-8 ore de studiu pentru fiecare lecţie.
Lectia 1
1.1 Instructiunea if

Sintaxa instructiunii if este urmatoarea:


if (expresie)
instructiune1
else
instructiune2
Intai expresie este evaluata. Daca este "adevarata" deci diferita de zero atunci se
executa instructiune1, daca este "falsa", adica este zero, se executa instructiune2.

Exemplu: Pentru a afisa valoarea absoluta a unui numar x scriem instructiunea:


if (x >= 0) abs = x;
else abs = -x;
printf("|x| = %f", abs);

De multe ori dorim ca cele doua alternative ale instructiunii if sa execute mai
mult de o instructiune. Pentru aceasta se foloseste instructiunea compusa (sau
instructiunea bloc). Instructiunea compusa este o lista de instructiuni inclusa intre { si
}. Ea este tratata ca o singura instructiune in C si poate fi folosita oriunde o singura
instructiune poate fi folosita. De exemplu, codul de mai sus poate fi scris si :

if(x>= 0)
{ printf("x este pozitiv\n");
abs = x;
}
else
{ printf("x este negativ\n");
abs = -x;
}
printf("|x| = %f", abs);

Exercitiu:
1) Ce se intampla daca este omis al doilea set de acolade, iar x = -7?
Dar daca x=7?
2) Aceleasi intrebari ca mai sus daca este omis primul set de acolade.

Uneori vrem ca una din alternativele instructiunii if sa nu execute


nimic. De exemplu: daca ploua imi iau umbrela daca nu ploua nu fac nimic. Pentru
aceasta instructiunea if are urmatoarea forma:
if (expresie)
instructiune
Expresie este evaluata. Daca este adevarata se executa instructiune, daca este falsa nu
se executa nimic, trecandu-se automat la instructiunea urmatoare instructiunii if.

Exemplu: Modificam programul comentarii.C care tipareste un bon de casa astfel


incat daca, costul total al produselor (fara TVA) depaseste 5 milioane lei (500 lei noi)
atunci se primeste o reducere de 10%. Se adauga urmatoarea instructiune dupa
afisarea pretului unui produs:
if(cost > 500)
{
cost = cost – cost * 0.1;
printf("Beneficiati de 10%% reducere");
}

Atentie! Omiterea acoladelor in acest caz face ca mesajul „Beneficiati de 10%


reducere” sa apara indiferent daca costul total este sau nu mai mare decat 500 lei noi.
Instructiunile ce se executa in cadrul unei instructiuni if pot fi orice
instructiune, inclusiv instructiuni if. Deci putem avea:
if(expresie1)
if(expresie2)
instructiune1
else instructiune2
else instructiune3
Aceasta este o instructiune if imbricata iar regula de asociere a else si if este: un else
se asociaza cu ultimul if care nu are else. In exemplul de mai sus primul else se
grupeaza cu al doilea if, iar al doilea else cu primul if.

In exemplul
if (i > 0)
if(x < 0)
printf("%f ", x + i);
else
printf("%f ", x - i);
else se asociaza cu al doilea if si deci
i) daca i = 2 si x = 3 se va afisa 1
ii) daca i = 2 si x = -5 se va afisa -3
iii) daca i = -2 nu se afiseaza nimic indiferent de valoarea lui x
Daca dorim schimbarea ordinii, adica else sa se asocieze cu primul if atunci se
folosesc acoladele:
if (i > 0)
{
if(x < 0)
printf("%f ", x + i);
}
else
printf("%f ", x - i);
si deci
i) daca i = 2 si x = 3 nu se afiseaza nimic
ii) daca i = 2 si x = -5 se va afisa -3
iii) daca i = -2 si x = 7 se afiseaza 9
iv) daca i = -2 si x = -10 se afiseaza -8
Desi instructiunea if ofera numai doua alternative, o succesiume
de instructiuni if se poate folosi pentru a alege una din mai multe
alternative. Sintaxa acestei secvente de instructiuni este:

if(expresie_1)
instructiune_1
else if(expresie_2)
instructiune_2
.............
else if(expresie_n)
instructiune_n
else instructiune

Expresiile sunt evaluate in ordine expresie_1, expresie_2, ... pana cand se gaseste una
adevarata si se executa instructiunea corespunzatoare acesteia. Daca nici o expresie nu
este adevarata se executa instructiune.

Exemplu:
if(n < 0)
printf("numar negativ");
else if(n > 100)
printf("numar mai mare decat 100");
else printf("0 <= numar <= 100");

1.2 Instructiunea switch

Sintaxa instructiunii switch este:


switch(expresie_intreaga)
{
case const_1: secventa_instr_1
break;
case const_2: secventa_instr_2
break;
...........................
case const_n: secventa_instr_n
break;
default: secventa_instr_default
}

Expresia expresie_intreaga trebuie sa fie de tip int sau sa poata fi convertita la tipul
int. Se evalueaza expresia si daca se gaseste o constanta egala cu valoarea expresiei
atunci se executa secventa de instructiuni asociata constantei pana cand se intalneste o
instructiune break. Daca nici o constanta nu este egala cu valoarea expresiei se
executa secventa_instr_default.

Exemplu: Programul urmator simuleaza un calculator foarte simplu:


calculator.C
#include <stdio.h>

main()
{
double x, y;
char op;
scanf("%lf %c %lf", &x, &op, &y);
switch(op)
{
case '+': printf("%f\n", x + y);
break;
case '-': printf("%f\n", x - y);
break;
case '*': printf("%f\n", x * y);
break;
case '/': if(y != 0)
printf("%f\n", x/y);
else
printf("Impartire la zero\n");
break;
default: printf("Operator incorect\n");
}
}

Alternativa default este optionala. Daca nici o constanta nu este egala cu


valoarea expresiei si nu exista nici o instructiune cu eticheta default atunci nici o
instructiune nu se executa. Instructiunea break este folosita pentru iesirea fortata
din instructiunea switch. Daca uitati sa scrieti o instructiune break atunci dupa
executarea secventei de instructiuni corespunzatoare uneia din constante calculatorul
va executa si urmatoarele secvente de instructiuni pana cand se intalneste o
instructiune break.

Exemplu: In secventa de program


int c;
switch(c)
{
case 1: printf("unu");
case 2: printf("doi");
}
1) daca c = 2 va tipari doi
2) daca c = 1 va tipari unudoi
pentru ca nu exista o instructiune break.

Este permis ca doua sau mai multe etichete case sa fie puse pentru aceeasi
secventa de instructiuni.

Exemplu:
switch(c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5': case '6': case '7': case '8':
case '9': printf("%c este cifra", c);
break;
case ' ':
case '\n':
case '\t': printf("%c este whitespace", c);
break;
default: printf("%c nu este nici cifra, nici whitespace", c);
}

Lectia 2
2.3 Instructiunea repetitiva while

Vrem sa scriem un program care afiseaza 10 numere introduse de utilizator.


Cum facem asta? Scriem 10 apelari ale functiei scanf si 10 apelari ale functiei printf?
Bineinteles ca nu. In C, ca si in alte limbaje de programare exista instructiuni care
permit repetarea unei instructiuni sau a unui bloc de instructiuni de un numar finit de
ori. O astfel de instructiune este instructiunea while. Programul se scrie:

while.C

#include <stdio.h>

main( )
{
int i = 1;
double numar;
while(i <= 10)
{
printf("Introduceti un numar:");
scanf("%lf", &numar);
printf("Ati introdus %f\n", numar);
i++;
}
}

Sintaxa instructiunii while este:


while(expresie)
instructiune
Expresia este calculata intai. Daca este "falsa" atunci nu se executa nimic. Daca este
"adevarata" atunci instructiunea (care poate fi simpla sau compusa) se executa.
Expresia este recalculata. Daca este "falsa" atunci instructiune while se termina, daca
este "adevarata" atunci se executa instructiunea dupa care procedeul se repeta.

Exemplu: Segmentul de program:


int j = 0;
while(j <= 6)
{
printf("%d", j);
j += 3;
}
va afisa 0 3 6

Exercitiu: 1) Ce afiseaza urmatorul program?


int i = 3;
while(i -- > 0)
printf("%d ", i);
2) Ce afiseaza urmatorul program?
int i = 3;
while (--i < 0)
printf("%d ", i);

Observatie: Daca valoarea expresiei este mereu adevarata atunci se intra intr-un ciclu
infinit iar executia programului nu se mai opreste (decat daca o oprim printr-o oprire
fortata).
Exemplu:
int n = 10;
while (n >= 5)
printf("%d ", n);
va tipari 10 la infinit. Chiar si:
int n = 10;
while (n >= 5)
{
printf("%d ", n);
n = n + 5;
}
va tipari 10 15 20 .... la infinit. Pe cand
int n = 10;
while (n >= 5)
{
printf("%d ", n);
n = 5;
}
va tipari 10 5 si se va opri.

Exercitii: 1) Scrieti un program care calculeaza suma 1 + 2 + ... + n unde n>=0 este
introdus de la tastatura.
2) Scrieti un program care calculeaza n!, adica 1 * 2 * 3 * ... * n unde n>0 este
introdus de la tastatura.

2.4 Instructiunea repetitiva do-while

Sintaxa instructiunii do-while este:

do
nu uitati ;
instructiune
while(expresie);

Instructiunea (simpla sau compusa) este executata intai apoi expresia este evaluata.
Daca expresia este falsa atunci instructiunea do-while se termina. Daca este adevarata
atunci instructiunea se executa si expresia este reevaluata. Daca expresia este falsa se
termina instructiunea do-while, daca este adevarata se reevalueaza expresia, iteratia
continuand pana cand expresia devine falsa.
Acelasi program care afiseaza 10 numere introduse de utilizator se poate scrie:

dowhile.C
#include <stdio.h>

main( )
{
int i = 0;
double numar;
do
{
printf("Introduceti un numar:");
scanf("%lf", &numar);
printf("Ati introdus %f\n",numar);
i++;
}
while(i < 10);
}

Diferenta dintre o instructiune while si una do-while este ca in cazul


instructiunii while expresia este evaluata inainte de executareainstructiunii pe cand in
cazul instructiunii do-while expresia este evaluata dupa ce instructiunea a fost
executata. Deci in cazul instructiunii do-while instructiunea se executa cel putin o
data.
Si in cazul instructiunii do-while poate sa apara ciclul infinit.

Exemplu:
int n = 3;
do
printf("%d", n);
while(n > 0);
va tipari 3 la infinit.
Lectia 3
3.1 Instructiunea for

Instructiunea for se foloseste pentru a executa o instructiune de un numar


definit de ori, ca alternativa a instructiunii while. De obicei exista o variabila de
control de a carei valoare depinde executarea repetata a instructiunii.
Sintaxa instructiunii for este:

for(initializare; conditie; modificare)


instructiune

Se executa intai instructiunea initializare si se testeaza conditia. Daca aceasta este


"falsa" atunci instructiunea for se termina. Daca este "adevarata" atunci se executa in
ordine instructiunea (simpla sau compusa) si apoi modificarea variabilei de control.
Se testeaza din nou conditia si procedeul se repeta pana cand conditia devine falsa.
Instructiunea for este echivalenta cu fragmentul de program:
initializare
while(conditie)
{
instructiune
modificare
}

Exemplu:
int n, sum = 0;
for(n = 1; n <= 10; n ++)
sum += n;
calculeaza suma 1 + 2 + ... + n si este echivalenta cu blocul de instructiuni:
int sum = 0;
int n = 1;
while (n <= 10)
{
sum += n;
n ++;
}

3.2 Instructiunile break si continue

Ati mai intalnit instructiunea break cand am prezentat instructiunea switch. Ea


determina terminarea celei mai interioare instructiuni while, do-while, for sau switch
care o contine. Sintaxa instructiunii break este:
break;
Instructiunea continue determina trecerea la urmatoarea iteratie in cea mai
interioara instructiune while, do-while sau for. Sintaxa instructiunii continue este:
continue;

Exemplu:
int contor = 1, numar;
printf("Introduceti cinci numere negative \n");
while (contor <= 5)
{
printf("numar = ");
scanf("%d", &numar);
if(numar > 0) break;
contor ++;
printf("%d\n",numar);
}
if(contor <= 5)
printf("EROARE");

va afisa pe rand -2 -9 EROARE daca ati introdus de la tastatura -2 -9 3.


Daca se inlocuieste instructiunea break cu instructiunea continue atunci introducand
-2 -9 3 se asteapta introducerea altui numar (unui numar negativ) si executia
programului se termina numai dupa ce se introduc exact 5 numere negative.

EXERCITII SI PROBLEME PROPUSE

1. Scrieti instructiunea while echivalenta cu urmatoarea instructiune for:

i. char c;
ii. for (c = 'A'; c < 'Z' ; c++)
iii. if (c == 'C')
iv. puts("limbajul C");
v. else printf("%c", c);

2. Ce este afisat, daca se presupun declaratiile int i,j;?

for(i=1; i<=10; i++)


if(i<5 && i!=2)
puts("x");

for(i=2; (i<=10) &&(i%2!=0); i++)


printf("%d\n", i );

for (i=1; i<5; i+=2)


for (j=1; j<5; j++)
printf("%d\n", i*j );

3. Scrieti un program pentru rezolvarea ecuatiilor de gradul doi. Programul


intreaba utilizatorul daca doreste sa rezolve o ecuatie. Utilizatorul va tasta 1
daca da si 0 sau alt numar daca doreste sa se opreasca.
4. Scrieti un program care citeste si calculeaza suma patratelor unor numere
pozitive pana cand o valoare 0 sau negativa este introdusa.

5. Ce afiseaza urmatoarea secventa de program?


int a = 2;
if (a < 0)
puts("S");
else if ( a == 0)
puts("M");
else puts("L");
Dar daca avem int a = -37; ? Sau daca int a = 0;?

6. Ce afiseaza urmatoarea secventa de program?


int x = 2;
printf("Start\n");
if (x <= 3)
if (x != 0)
printf("al doilea if\n");
else
printf("else");
printf("Sfirsit\n");

printf("Start din nou\n");


if (x > 3)
if (x != 0)
printf("al doilea if\n");
else
printf("else");
printf("Sfirsit din nou\n");

7. Scrieti un sir de instructiuni if imbricate care clasifica un intreg intr-una din


urmatoarele categorii si afiseaza un mesaj corespunzator.
n < 0 sau (n ≥ 0 si n <= 100 ) sau n > 100

8. Ce afiseaza urmatoarele secvente de program?


a. int x = 10;
while (x > 0)
{
printf("%d\n", x);
x = x - 3;
}

b. int x = 10;
do
{
printf("%d\n", x);
x = x - 3;
}while (x > 0);

c. int x = -42;
do
{
printf("%d\n", x);
x = x - 3;
}while (x > 0);

9. Ce afiseaza urmatoarele secvente de program?


a. int contor;
for (contor = 1; contor < 5; contor++)
printf("%d ", 2*contor);

b. int n;
for (n = 10; n > 0; n = n - 2)
{
printf("n = ");
printf("%d\n", n);
}

c. double d;
for (d = 2; d > 0; d = d - 0.5)
printf("%.2f ", d);
10. Ce afiseaza urmatoarea instructiune for? Identificati legatura dintre valoarea
lui n si valoarea variabilei log.
int n = 1024;
int log = 0;
int i;
for (i = 1; i < n; i = i * 2)
log ++;
printf("%d %d\n", log);

11. Scrieti un program care program care verifica daca un numar intreg pozitiv
mai mare decat 1 este prim. (n este prim daca nu se imparte exact la nici un
numar intreg pozitiv diferit de 1 si n).

12. Scrieti un program care tipareste cifrele unui intreg pozitiv dat in ordine
inversa. Exemplu: daca numarul este 3497 atunci se va afisa 7943.

13. Scrieti un program care program care verifica daca un an este bisect. (Un an
bisect este un an care este divizibil cu 4 dar nu cu 100, exceptie facand anii
divizibili cu 400 care sunt bisecti).

14. Scrieti un program care cere utilizatorului sa introduca o luna (1=ianuarie,


2=februarie, etc.) si tipareste numarul de zile din luna. Pentru februarie va
tipari "28 sau 29 de zile".

15. Scrieti un program care va tipari al n-lea element al sirului lui Fibonacci:
f n = f n - 1 + f n - 2 daca n > 2 si f 1 = f 2 = 1 iar n este introdus de la tastatura.
Bibliografie recomandata:

1. Daniela Joita, Programare procedurala, Editura Universitatii Titu Maiorescu,


2008
2. Brian Kernighan si Denis Ritchie, "Limbajul C", Editura TEORA, 1998-2004
3. Clint Hicks, "Utilizare C", Editura TEORA, 1996
4. Manual electronic: Bruce Eckel, Thinking in C

S-ar putea să vă placă și