Sunteți pe pagina 1din 12

CAPITOLUL 3 control

Implementarea structurilor de

IMPLEMENTAREA STRUCTURILOR DE CONTROL


3.1. Implementarea structurii secveniale 3.2. Implementarea structurii de decizie

3.3. Implementarea structurilor repetitive 3.4. Faciliti de ntrerupere a unei secvene

Algoritmul proiectat pentru rezolvarea unei anumite probleme trebuie implementat ntr-un limbaj de programare; prelucrarea datelor se realizeaz cu ajutorul instruciunilor. Instruciunea descrie un proces de prelucrare pe care un calculator l poate executa. O instruciune este o construcie valid (care respect sintaxa limbajului) urmat de ; . Ordinea n care se execut instruciunile unui program definete aa-numita structur de control a programului. Limbajele moderne sunt alctuite pe principiile programrii structurate. Conform lui C. Bohm i G. Jacobini, orice algoritm poate fi realizat prin combinarea a trei structuri fundamentale: structura secvenial; structura alternativ (de decizie, de selecie); structura repetitiv (ciclic).

3.1. IMPLEMENTAREA STRUCTURII SECVENIALE


Structura secvenial este o niruire de secvene de prelucrare (instruciuni), plasate una dup alta, n ordinea n care se dorete execuia acestora. Reprezentarea structurii secveniale cu ajutorul schemei logice ( figura 3.1.):
S1 S2

Reprezentarea structurii secveniale cu ajutorul pseudocodului:


instr1; instr2; . . . . .

Sn

Figura 3.1. Schema logic pentru structura secvenial Implementarea structurii secveniale se realizeaz cu ajutorul instruciunilor: Instruciunea vid Sintaxa: ; Instruciunea vid nu are nici un efect. Se utilizeaz n construcii n care se cere prezena unei instruciuni, dar nu se execut nimic (de obicei, n instruciunile repetitive). Exemple:
int . . int ; for { a; . . . . j; (;;)

41

CAPITOLUL 3 control . . . . }

Implementarea structurilor de

Instruciunea expresie Sintaxa: sau:

expresie; apel_funcie;

Exemple:
int b, a=9; double c; b=a+9; cout<<a; c=sqrt(a); clrcsr();//apelul funciei predefinite care terge ecranul; prototipul n headerul conio.h

Instruciunea compus (instruciunea bloc) Sintaxa: {


declaratii; instr1; instr2; . . . .

} ntr-un bloc se pot declara i variabile care pot fi accesate doar n corpul blocului. Instruciunea bloc este utilizat n locurile n care este necesar prezena unei singure instruciuni, ns procesul de calcul este mai complex, deci trebuie descris n mai multe secvene.

3.2. IMPLEMENTAREA STRUCTURII DE DECIZIE (ALTERNATIVE, DE SELECIE)


Reprezentarea prin schem logic i prin pseudocod a structurilor de decizie i repetitive sunt descrise n capitolul 1. Se vor prezenta n continure doar instruciunile care le implementeaz. Instruciunea if: Sintaxa: if (expresie) instruciune1; [ else instruciune2; ]

Ramura else este opional. La ntlnirea instruciunii if, se evalueaz expresie (care reprezint o condiie) din paranteze. Dac valoarea expresiei este 1 (condiia este ndeplinit) se execut instruciune1; dac valoarea expresiei este 0 (condiia nu este ndeplinit), se execut instruciune2. Deci, la un moment dat, se execut doar una dintre cele dou instruciuni: fie instruciune1, fie instruciune2. Dup execuia instruciunii if se trece la execuia instruciunii care urmeaz acesteia. Observaii:
1. 2. Instruciune1 i instruciune2 pot fi instruciuni compuse (blocuri), sau chiar alte instruciuni if

(if-uri imbricate). Deoarece instruciunea if testeaz valoarea numeric a expresiei (condiiei), este posibil prescurtarea: if (expresie), n loc de if (expresie != 0). 3. Deoarece ramura else a instruciunii if este opional, n cazul n care aceasta este omis din secvenele if-else imbricate, se produce o ambiguitate. De obicei, ramura else se asociaz ultimei instruciuni if. Exemplu:
if (n>0) if (a>b) z=a; else z=b; 42

CAPITOLUL 3 Implementarea structurilor de control 4. Pentru claritatea programelor surs se recomand alinierea instruciunilor prin utilizarea tabulatorului

orizontal. 5. Deseori, apare construcia:


if (expresie1) instruciune1; else if (expresie2) instruciune2; else if (expresie3) instruciune3; . . . . . . . . . else instruciune_n;

Aceeai construcie poate fi scris i astfel:


if (expresie1) instruciune1; else if (expresie2) instruciune2; else if (expresie3) instruciune3; . . . . .. . . . . . else instruciune_n;

Expresiile sunt evaluate n ordine; dac una dintre expresii are valoarea 1, se execut instruciunea corespunztoare i se termin ntreaga nlnuire. Ultima parte a lui else furnizeaz cazul cnd nici una dintre expresiile 1,2,. . ., n-1 nu are valoarea 1. 6. n cazul n care instruciunile din cadrul if-else sunt simple, se poate folosi operatorul condiional. Exerciii: 1. S se citeasc de la tastatur un numr real. Daca acesta se afl n intervalul [-1000, 1000], s se afiseze 1, dac nu, s se afiseze -1.
#include <iostream.h> void main() { double nr; cout<<Astept numar:; cin>>nr; int afis = (nr>= -1000 && nr <= 1000 ? 1 : -1); cout<<afis; /* int afis; if (nr >= -1000 && nr <= 10000) afis = 1; else afis= -1; cout<<afis; */ }

2. S se calculeze valoarea funciei f(x), tiind c x este un numr real introdus de la tastatur: - 6x + 20 , dac x [- , -7 ] f(x) = x + 30 , dac x (-7, 0] , dac x>0 x
#include <iostream.h> Sau: #include <math.h> void main() { double x,f;cout<<x=;cin>>x; if (x <= -7) f= -x* 6 +20; else if ( x<=0 ) f= x+30; else f=sqrt(x); cout<<f=<<f<<\n; } #include <iostream.h> #include <math.h> void main() { double x,f;cout<<x=;cin>>x; if (x <= 7) f= -x* 6 +20; if (x>=-7 && x<=0 ) f= x+30; if (x>0) f=sqrt(x); cout<<f=<<f<<\n; }

Uneori, construcia if-else este utilizat pentru a compara valoarea unei variabile cu diferite valori constante, ca n programul urmtor:

43

CAPITOLUL 3 control

Implementarea structurilor de

3. Se citete un caracter reprezentnd un operator aritmetic binar simplu. n funcie de caracterul citit, se afieaz numele operaiei pe care acesta o poate realiza.
#include <iostream.h> void main() { char oper; cout<<Introdu operator aritmetic, simplu, binar:; cin>>oper; if (oper == +) cout<<Operatorul de adunare!\n; else if (oper==- ) cout<<Operatorul de scadere!\n; else if (oper==* ) cout<<Operatorul de inmultire!\n; else if (oper==/ ) cout<<Operatorul de impartire!\n; else if (oper==% ) cout<<Operatorul rest!\n; else cout<<Operator ilegal!!!\n; }

Instruciunea switch n unele cazuri este necesar o decizie multipl special. Instruciunea switch permite acest lucru.

Reprezentare prin schema logic (figura 3.2): Reprezentare prin pseudocod: test_expresie
Dac expresie=expr_const_1 instruciune1; [ieire;] Altfel dac expresie=expr_const_2 instruciune2; [ieire;] Altfel dac expresie=expr_const_n-1 instruciune_n-1; [ieire;] Altfel instruciune_n;

instruciune1 break instruciune2 break

instruciune_n

Figura 3.2. Decizia multipl Se testeaz dac valoarea pentru expresie este una dintre constantele specificate (expr_const_1, expr_const_2, etc.) i se execut instruciunea de pe ramura corespunztoare. n schema logic test_expresie este una din condiiile: expresie=expr_const_1, expresie=expr_const_2, etc. Sintaxa: switch (expresie) { case expresie_const_1: instructiune_1; [break;] case expresie_const_2: instructiune_2; [break;] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . case expresie_const_n-1: instructiune_n-1; [break;]

44

CAPITOLUL 3 control

Implementarea structurilor de

[ default: instructiune_n; ] } Este evaluat expresie (expresie aritmetic), iar valoarea ei este comparat cu valoarea expresiilor constante 1, 2, etc. (expresii constante=expresii care nu conin variabile). n situaia n care valoarea expresie este egal cu valoarea expr_const_k, se execut instruciunea corespunztoare acelei ramuri (instruciune_k). Dac se ntlnete instruciunea break, parcurgerea este ntrerupt, deci se va trece la execuia primei instruciuni de dup switch. Dac nu este ntlnit instruciunea break, parcurgerea continu. Break-ul cauzeaz deci, ieirea imediat din switch. n cazul n care valoarea expresiei nu este gsit printre valorile expresiilor constante, se execut cazul marcat cu eticheta default (cnd acesta exist). Expresiile expresie, expresie_const_1, expresie_const_2,etc., trebuie s fie ntregi. n exemplul urmtor, ele sunt de tip char, dar o dat de tip char este convertit automat n tipul int. Exerciiu: S rescriem programul pentru problema 3, utiliznd instruciunea switch.
#include <iostream.h> void main() { char oper; cout<<Introdu operator aritmetic, simplu, binar:; cin>>oper; switch (oper) { case (+): cout<<Operatorul de adunare!\n; break; case (-): cout<<Operatorul de scadere!\n; break; case (*): cout<< Operatorul de inmultire!\n; break; case (/): cout<<Operatorul de impartire!\n; break; case (%): cout<<Operatorul rest!\n; break; default: cout<<Operator ilegal!\n; } }

3.3. IMPLEMENTAREA STRUCTURILOR REPETITIVE (CICLICE)


Exist dou categorii de instruciuni ciclice: cu test iniial i cu test final.

3.3.1. Implementarea structurilor ciclice cu test iniial


Structura ciclic cu test iniial este implementat prin instruciunile while i for. Instruciunea while Sintaxa: while (expresie) instructiune; La ntlnirea acestei instruciuni, se evalueaz expresie. Dac aceasta are valoarea 1 - sau diferit de 0 (condiie ndeplinit), se execut instruciune. Se revine apoi n punctul n care se evalueaz din nou

45

CAPITOLUL 3 control

Implementarea structurilor de

valoarea expresiei. Dac ea este tot 1, se repet instruciune, .a.m.d. Astfel, instruciunea (corpul ciclului) se repet att timp ct expresie are valoarea 1. n momentul n care expresie ia valoarea 0 (condiie nendeplinit), se iese din ciclu i se trece la urmtoarea instruciune de dup while. Observaii: 1. n cazul n care la prima evaluare a expresiei, aceasta are valoarea zero, corpul instruciunii while nu va fi executat niciodat. 2. Instruciune din corpul ciclului while poate fi compus (un bloc), sau o alt instruciune ciclic. 3. Este de dorit ca instruciunea din corpul ciclului while s modifice valoarea expresiei. Dac nu se realizeaz acest lucru, corpul instruciunii while se repet de un numr infinit de ori. Exemplu:
int a=7; while (a==7) cout<<Buna ziua!\n;

// ciclu infinit; se repet la infinit afiarea mesajului

Instruciunea for n majoritatea limbajelor de programare de nivel nalt, instruciunea for implementeaz structura ciclic cu numr cunoscut de pai (vezi reprezentarea prin schema logic i pseudocod din capitolul 1). n limbajul C instruciunea for poate fi utilizat ntr-un mod mult mai flexibil. Reprezentare prin schema logic (figura 3.3.): evaluare expresie1 (particular iniializare contor) expresie2 1 instruciune evaluare expresie3 (particular incrementare contor) Figura 3.3. Structura ciclic cu test iniial Sintaxa: for (expresie1; expresie2; expresie3) instructiune; Nu este obligatorie prezena expresiilor, ci doar a instruciunilor vide. Exemplu: for ( ; expresie2; ) sau: for ( ; ; )
instructiune; instructiune;

Reprezentare n pseudocod:
evaluare expresie1 CT TIMP expresie2 REPET NCEPUT instruciune evaluare expresie3 SFRIT

3.3.2. Implementarea structurilor ciclice cu test final


Instruciunea do-while Sintaxa: do instructiune; while(expresie);

Se execut instruciune. Se evalueaz apoi expresie. Dac aceasta are valoarea 1, se execut instruciune. Se testeaz din nou valoarea expresiei. Se repet instruciune ct timp valoarea
46

CAPITOLUL 3 control

Implementarea structurilor de

expresiei este 1 (condiia este ndeplinit). n cazul instruciunii do-while, corpul ciclului se execut cel puin o dat. Exerciii: 1. Se citete cte un caracter, pn la ntlnirea caracterului @. Pentru fiecare caracter citit, s se afieze un mesaj care s indice dac s-a citit o liter mare, o liter mic, o cifr sau un alt caracter. S se afieze cte litere mari au fost introduse, cte litere mici, cte cifre i cte alte caractere. Se prezint trei modaliti de implementare (cu instruciunea while, cu instruciunea for i cu instruciunea do-while).
#include <iostream.h> #include <conio.h> void main() { char c; clrscr(); int lmic=0, lmare=0, lcif=0; int altcar=0; cout<<"Atept car.:"; cin>>c; while (c!='@'){ if (c>='A' && c<='Z') { cout<<"Lit. mare!\n"; lmare++; } else if (c>='a' && c<='z') { cout<<"Lit. mic!\n"; lmica++; } else if (c>='0' && c<='9') { cout<<"Cifr!\n"; lcif++; } else { cout<<"Alt car.!\n"; altcar++; } cout<<"Atept car.:";cin>>c; } cout<<"Ai introdus \n"; cout<<lmare<<" litere mari, "; cout<<lmic<<" litere mici\n"; cout<<lcif<<" cifre i \n"; cout<<altcar<<" alte carctere\n"; #include <iostream.h> #include <conio.h> void main() { char c;clrscr(); intlmic=0,lmare=0,lcif=0;int altcar=0; cout<<"Atept caract.:"; cin>>c; for( ; c!='@'; ){

Observaii legate de implementare Variabila c (tip char) memoreaz caracterul introdus la un moment dat, de la tastatur. Variabilele ntregi lmic, lmare, lcif i altcar sunt utilizate pe post de contor pentru litere mari, mici, cifre, respectiv alte caractere. Aciunea care se repet ct timp caracterul citit este diferit de constanta caracter '@' const din mai multe aciuni simple: citirea unui caracter (cu afiarea n prealabil a mesajului "Atept car.:"; testarea caracterului citit (operatorii relaionali pot fi aplicai datelor de tip char). Ca urmare, aciunea din corpul instructiunii while a fost implementat printr-o instruciune bloc. Tot instruciuni bloc au fost utilizate pe fiecare ramur a instruciunii if (afiare mesaj referitor la caracter i incrementare contor).

Pentru implementarea aceluiai algoritm se poate utiliza instruciunea for. n cadrul acesteia, expresie1 i expresie3 lipsesc, ns prezena instruciunilor vide este obligatorie.

// corp identic
} cout<<"Ai introdus \n"; cout<<lmare<<" litere mari, "; cout<<lmic<<" litere mici\n"; cout<<lcif<<" cifre i \n"; cout<<altcar<<" alte carctere\n"; getch(); }

O alt variant de implementare poate fi urmtoarea, n care i iniializarea variabilelor contor se realizeaz n cadrul expresiei expresie1.
int lmic, lmare, lcif, altcar; for(lmare=0, lmic=0, lcif=0, altcar=0; c!='@'; ){

// corp identic
}

47

CAPITOLUL 3 control

Implementarea structurilor de

Variant de implementare care utilizeaz instruciunea do-while:


int lmic=0, lmare=0, lcif=0; int altcar=0; cout<<"Atept caract.:";cin>>c; do {

//corp do-while
} while (c!='@'); cout<<"Ai introdus \n";

//. . .
2.

S se calculeze suma i produsul primelor n numere naturale, n fiind introdus de la tastatur. Se vor exemplifica modalitile de implementare cu ajutorul instruciunilor do-while, while, i for. (Se observ c: S =

k , P =
k =1

k ).
k =1

Pentru a ilustra multiplele posibiliti oferite de instruciunea for, prezentm variantele // varianta1
int S=0, P=1, k; for (k=1; k<=n; k++){ S+=k; P*=k; } cout<<"P="<<P<<"\tS="; cout<<S<<'\n';

cout<<"n="; int n; cin>>n; int S=0, P=1, k=1; while (k <= n){ S+=k; P*=k; k++; } cout<<"P="<<P<<"\tS="<<S<<'\n';

cout<<"n="; int n; cin>>n; int S=0, P=1, k=1; do{ S+=k; P*=k; k++; } while (k <= n); cout<<"P="<<P<<"\tS="<<S<<'\n';

// varianta2
int S=0, P=1; for (int k=1; k<=n; k++){ S+=k; P*=k; } cout<<"P="<<P<<"\tS="; cout<<S<<'\n';

// varianta3
for (int S=0, P=1, k=1; k<=n; k++){ S+=k; P*=k; } cout<<"P="<<P<<"\tS="<<cout<<S<<'\n';

// varianta4
for (int S=0, P=1, k=1; k<=n; S+=k, P*=k, k++) ; cout<<"P="<<P<<"\tS="<<cout<<S<<'\n';

3. S se citeasc un ir de numere reale, pn la ntlnirea numrului 900. S se afieze maximul numerelor citite. #include <iostream.h>
void main() {double n; cout<<"Introdu nr:"; cin>>n; double max=n; while (n!=900) { if (n>=max) max=n; cout<<"Introdu nr:"; cin>>n; } cout<<"Max ir este:"<<max<<'\n'; }

Se presupune c primul element din irul de numere are valoarea maxim. Se memoreaz valoarea sa n variabila max. Se parcurge apoi irul, comparndu-se valoarea fiecrui element cu valoarea variabilei max. n cazul n care se gsete un element cu o valoare mai mare dect a variabilei max, se reine noua valoare (max=n).

4. S se afieze literele mari ale alfabetului i codurile aferente acestora n ordine cresctoare, iar literele mici i codurile aferente n ordine descresctoare. Afiarea se va face cu pauz dup fiecare ecran.
48

CAPITOLUL 3 control

Implementarea structurilor de

#include <iostream.h> #include <conio.h> #define DIM_PAG 22 //dimensiunea paginii (numarul de randuri de pe o pagina) void main() {clrscr(); cout<<"LITERELE MARI:\n";int nr_lin=0; // nr_lin este contorul de linii de pe un for (char LitMare='A'; LitMare<='Z'; LitMare++){ if (nr_lin==DIM_PAG){ cout<<"Apasa o tasta...."; getch(); clrscr(); nr_lin=0;} cout<<"Litera "<<LitMare<<" cu codul ASCII "<<(int)LitMare<<'\n';

ecran

// conversia explicita (int)LitMare permite afisarea codului ASCII al caracterului


nr_lin++; } cout<<"LITERELE MICI:\n"; for (char LitMica='z'; LitMica>='a'; LitMica--){ if (nr_lin==DIM_PAG){ cout<<"Apasa o tasta...."; getch(); clrscr(); nr_lin=0;} cout<<"Litera "<<LitMica<<" cu codul ASCII "<<(int)LitMica<<'\n'; nr_lin++; } } 5.

S se scrie un program care realizeaz conversia numrului N ntreg, din baza 10 ntr-o alt baz de numeraie, b<10 (N i b citite de la tastatur). Conversia unui numr ntreg din baza 10 n baza b se realizeaz prin mpriri succesive la b i memorarea resturilor, n ordine invers. De exemplu: 547:8=68 rest 3; 68:8=8 rest 4; 8:8=1 rest 0; 1:8=0 rest 1 547 10 = 1043 8
#include <iostream.h> void main() { int nrcif=0,N,b,rest,Nv,p=1; long Nnou=0; cout<<"\nIntroduceti baza<10, b=";cin>>b; cout<<"Introduceti numarul in baza 10, nr=";cin>>N; Nv=N; while(N!=0) { rest=N%b; N/=b; cout<<"nr="<<N<<'\n'; cout<<"rest="<<rest<<'\n'; nrcif++; Nnou+=rest*p; p*=10; cout<<"Nr. nou="<<Nnou<<'\n'; } cout<<"Numarul de cifre este "<<nrcif<<'\n'; cout<<"Nr. in baza 10 "<<Nv; cout<<" convertit in baza "<<b<<" este "<<Nnou<<'\n'; }

6.

S se calculeze seria urmtoare cu o eroare mai mic dect EPS (EPS introdus de la tastatur): 1+

, x [0,1], x citit de la tastatur. Vom aduna la sum nc un termen ct timp diferena dintre suma calculat la pasul curent i cea calculat la pasul anterior este mai mare sau egal cu EPS.
#include <iostream.h> #include <conio.h> #include <math.h> void main() { double T,S,S1;long k;k=1;T=1;S=T;double x; cout<<"x="; cin>>x;

xk k k =1

// T= termenul general de la pasul curent; S=suma la pasul curent; S1=suma la pasul anterior
do { S1=S;k=k+1;T=pow(x,k)/k; //funcia pow(x, k), aflat n <math.h> calculeaz x k S=S+T; // cout<<k<<" "<<T<<" "<<S<<'\n';getch(); } while ((S-S1)>=EPS); 49

CAPITOLUL 3 control cout<<"Nr termeni="<<k<<"

Implementarea structurilor de T="<<T<<" S="<<S<<'\n'; }

3.4. FACILITI DE NTRERUPERE A UNEI SECVENE


Pentru o mai mare flexibilitate (tratarea excepiilor care pot apare n procesul de prelucrare), n limbajul C se utilizeaz instruciunile break i continue. Ambele instruciuni sunt utilizate n instruciunile ciclice. n plus, instruciunea break poate fi folosit n instruciunea switch. Instruciunea break Aa cum se observ din figura 3.4., utilizat n cadrul instruciunilor ciclice, instruciunea break "foreaz" ieirea din acestea. Fr a se mai testa valoarea expresiei (condiia) care determin repetarea corpului instruciunii ciclice, se continu execuia cu instructiunea care urmeaz instructiunii ciclice. Astfel, se ntrerupe repetarea corpului instruciunii ciclice, indiferent de valoarea condiiei de test. Utilizarea n cadrul instruciunii switch: n situaia n care s-a ajuns la o valoare a unei expresiei constante egal cu cea a expresiei aritmetice, se execut instruciunea corespunztoare acelei ramuri. Dac se ntlnete instruciunea break, parcurgerea este ntrerupt (nu se mai compar valoarea expresiei aritmetice cu urmtoarele constante), deci se va trece la execuia primei instruciuni de dup switch. Dac nu este ntlnit break, parcurgerea continu. Instruciunea breakl cauzeaz deci, ieirea imediat din switch.

Instruciunea continue ntlnirea instruciunii continue (figura 3.4.) determin ignorarea instruciunilor care o urmeaz n corpul instruciunii ciclice i reluarea execuiei cu testarea valorii expresiei care determin repetarea sau nu a corpului ciclului.

Exemplu: S revenim la programul realizat pentru problema 1, care folosete instruciunea dowhile. Dac primul caracter citit este chiar caracterul @, se realizeaz testarea acestuia; ca urmare, se afieaz mesajul "Alt car.!" i se incrementeaz valoarea contorului altcar. Dac nu se dorete ca acest caracter s fie testat i numrat, n corpul instruciunii do while putem face un test suplimentar.
int lmic=0,lmare=0,lcif=0,altcar=0;cout<<"Atept caract.:";cin>>c; do { if (c == '@') break; //ieire din do while

//corp do-while
} while (c!='@'); cout<<"Ai introdus \n"; //. . . while (expresie1){ instructiune1; instructiune2; if (expresie2) break; else continue; instructiune3; do{ instructiune1; instructiune2; if (expresie2) break; else continue; instructiune3; } while (expresie1);

for (expr1; expr2; expr3)){ instructiune1; instructiune2; if (expresie2) break; else continue; instructiune3;

} Figura 3.4. Modul de utilizare a instruciunilor break i continue


50

NTREBRI I EXERCIII

CAPITOLUL 3 control

Implementarea structurilor de

Chestiuni teoretice 1. Care sunt instruciunile care implementeaz n limbajul C structura condiional? 2. Care sunt instruciunile care implementeaz n limbajul C structura secvenial? 3. Care sunt instruciunile care implementeaz n limbajul C structura repetitiv cu test iniial? Chestiuni practice 1. 2. 3. 4. S se implementeze programele cu exemplele prezentate. S se scrie programele pentru exerciiile rezolvate care au fost prezentate. S se implementeze algoritmii proiectai pentru problemele 1-7 din capitolul 1. S se calculeze aria unui triunghi, cunoscndu-se mrimea laturilor sale. Numerele care reprezint mrimile laturilor vor fi introduse de utilizator. Se va testa mai nti dac cele 3 numere reprezentnd mrimea laturilor pot forma un triunghi ( a <= b+c, b <= c+d, c <= a+b). 5. S se rescrie urmtoarea secven, folosind o singur instruciune if.
if (n<0) if (n>=90) if (x!=0) int b= n/x;

4. Care sunt instruciunile care implementeaz n limbajul C structura repetitiv cu test final? 5. Ce deosebiri sunt ntre instruciunea while i instruciunea do-while? 6. Pornind de la sintaxa instruciunii for, stabilii echivalena ntre aceasta i instruciunile while i do-while.

6. S se citeasc un numar natural n. S se scrie un program care afieaz dac numrul n citit reprezint sau nu, un an bisect (anii biseci sunt multipli de 4, exceptnd multiplii de 100, dar incluznd multiplii de 400). 7. S se gseasc toate numerele de dou cifre care satisfac relaia:

xy =( x +y ) 2
8. S se citeasc un ir de numere reale, pn la ntlnirea numarului 800 i s se afieze valoarea minim introdus, suma i produsul elementelor irului. 9. Scriei un program care s verifice inegalitatea 1/(n+1) < ln[(n+1)/n] < 1/n, unde n este un numr natural pozitiv, introdus de la tastatur. 10. Fie funcia e x 3 , x [0, 1) S se calculeze f(x), x citit de la tastatur. f(x)= sinx+cosx , x [1, 2) 0,9ln(x+3) , x [2, 100] 11. S se scrie un program care calculeaz i afieaz maximul a 3 numere reale (a, b i c) citite de la tastatur. 12. S se scrie un program care calculeaz i afieaz minimul a 3 numere reale (a, b i c) citite de la tastatur. 13. S se citeasc 2 caractere care reprezint 2 litere mari. S se afieze caracterele citite n ordine alfabetic. 14. S se citeasc 3 caractere care reprezint 3 litere mici. S se afieze caracterele citite n ordine alfabetic. 15. S se scrie un program care citete o cifr. n funcie de valoarea ei, s se fac urmtorul calcul: dac cifra este 3, 5 sau 7 s se afieze ptratul valorii numerice a cifrei; dac cifra este 2, 4 sau 6 s se afieze cubul valorii numerice a cifrei; dac cifra este 0 sau 1 s se afieze mesajul "Valori mici"; altfel., s se afieze mesajul "Caz ignorat!". 16. Fie irul lui Fibonacci, definit astfel: f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n cazul n care n>1. S se scrie un program care implementeaz algoritmul de calcul al irului Fibonacci. 17. S se calculeze valoarea polinomului Cebev de ordin n ntr-un punct x dat, cunoscnd relaia: T 0 (x)=1, T 1 (x)=x i T k +1 (x) - 2xT k (x) + T k 1 (x) = 0 18. S se citeasc cte 2 numere ntregi, pn la ntlnirea perechii (0, 0). Pentru fiecare pereche de numere, s se calculeze i s se afieze cel mai mare divizor comun.

51

CAPITOLUL 3 control

Implementarea structurilor de

19. Se citesc cte 3 numere reale, pn la ntlnirea numerelor 9, 9, 9. Pentru fiecare triplet de numere citit, s se afieze maximul. 20. Se citete cte un caracter pn la ntlnirea caracterului @. S se afieze numrul literelor mari, numarul literelor mici i numrul cifrelor citite; care este cea mai mare (lexicografic) liter mare, liter mic i cifr introdus. 21. Se citesc cte 2 numere ntregi, pn la ntlnirea perechii de numere 9, 9. Pentru fiecare pereche de numere citite, s se afieze cel mai mare divizor comun al acestora. 22. S se calculeze suma seriei 1 + x 3 /3 - x 5 /5 + x 7 /7 - cu o eroare mai mic dect epsilon (epsilon citit de la tastatur). S se afieze i numrul de termeni ai sumei. 23. S se citeasc un numr ntreg format din 4 cifre (abcd). S se calculeze i s se afieze valoarea expresiei reale: 4*a + b/20 -c + 1/d. 24. S se scrie un program care afieaz literele mari ale alfabetului n ordine cresctoare, iar literele mici - n ordine descresctoare. 25. S se scrie un program care genereaz toate numerele perfecte pn la o limit dat, LIM. Un numr perfect este egal cu suma divizorilor lui, inclusiv 1 (exemplu: 6=1+2+3). 26. S se calculeze valoarea sumei urmatoare, cu o eroare EPS mai mic de 0.0001: S=1+(x+1)/ 2! + (x+2)/ 3! + (x+3)/ 3! + ... , unde 0<=x<=1, x citit de la tastatur. 27. S se genereze toate numerele naturale de 3 cifre pentru care cifra sutelor este egal cu suma cifrelor zecilor i unitilor. 28. S se citeasc cte un numr ntreg, pn la ntlnirea numrului 90. Pentru fiecare numar s se afieze un mesaj care indic dac numrul este pozitiv sau negativ. S se afieze cel mai mic numr din ir. 29. S se genereze toate numerele naturale de 3 cifre pentru care cifra zecilor este egal cu diferena cifrelor sutelor i unitilor. 30. S se calculeze suma: (1 + 2!) / (2 + 3!) - (2+3!) / (3+4!) + (3+4!) / (4+5!) - .....

52