Sunteți pe pagina 1din 0

CAPITOLUL 3 Implementarea structurilor de control

49
3
3
.
.

IMPLEMENTAREA STRUCTURILOR DE CONTROL
3.1. Implementarea structurii 3.3. Implementarea structurilor
secveniale repetitive
3.2. Implementarea structurii de 3.4. Faciliti de ntrerupere a unei
decizie secvene


Algoritmul proiectat pentru rezolvarea unei anumite probleme, pentru a fi neles de ctre
calculator, 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.




















Figura 3.1. Schema logic pentru
structura secvenial
Reprezentarea structurii secveniale cu
ajutorul schemei logice ( figura 3.1.):
Reprezentarea structurii secveniale cu
ajutorul pseudocodului:

instr1;
instr2;
. . . . .
S1
S2
Sn
CAPITOLUL 3 Implementarea structurilor de control

50

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).

Exemplul 3.1.:
int a;
. . . . . .
int j;
;
for (;;)
{
. . . .
}

Instruciunea expresie
Sintaxa: <expresie>;
sau: <apel_funcie>;

Exemplul 3.2.:
int b, a=9;
double c;
b=a+9;
cout<<a;
c=sqrt(a);
clrcsr();//apelul funciei clrscr, care terge ecranul; prototip n conio.h

Instruciunea compus (instruciunea bloc)
Sintaxa: {
<declaratii>;
<instr1>;
<instr2>;<declaratii>;
. . . .
}

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. Ca urmare, ntregul grup de declaraii i instruciuni dintr-o instruciune compus,
va fi privit ca o singur instruciune.
3.2. IMPLEMENTAREA STRUCTURII DE DECIZIE
Structura de decizie este ntlnit sub i sub numele de structur condiional, alternativ
sau 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.
CAPITOLUL 3 Implementarea structurilor de control

51

Instruciunea if:
Sintaxa:




La ntlnirea instruciunii if, se evalueaz <expresie> (care reprezint o condiie). Dac
valoarea sa 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 urmtoare.

Observaii:
1. Instruciune1 i instruciune2 pot fi instruciuni compuse (blocuri), sau chiar alte
instruciuni if (if-uri imbricate).
2. 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. n aceste situaii, ramura
else se asociaz ultimei instruciuni if.

Exemplul 3.3.:
if (n>0)
if (a>b)
z=a;
else z=b;
4. Pentru claritatea programelor surs se recomand alinierea instruciunilor prin utilizarea
tabulatorului orizontal.
5. Deseori, apare construcia:











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.

Exerciiul 3.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. Pentru rezolvarea acestei probleme
poate fi folosit att operatorul condiional (capitolul 2.5.1.), ct i instruciunea if.
if (<expresie>)
<instruciune1>;
[ else
<instruciune2>; ]
Aceeai construcie poate fi scris:

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

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

CAPITOLUL 3 Implementarea structurilor de control

52

#include <iostream.h>
void main()
{
double nr; cout<<Astept numar:; cin>>nr;//citirea valorii variabilei nr
// variabilei afis i se atribuie valoarea expresiei n care se folosete operatorul ?:
int afis = (nr>= -1000 && nr <= 1000 ? 1 : -1); cout<<afis;
/* folosirea instruciunii if
int afis;
if (nr >= -1000 && nr <= 10000) afis = 1;
else afis = -1;
cout<<afis; */
}

Exerciiul 3.2.: S se calculeze valoarea funciei f(x), tiind c x este un numr real citit de la
tastatur:
- 6x + 20 , dac x [- , -7 ]
f(x) = x + 30 , dac x (-7, 0]
x , dac x>0

Se prezint dou variante de implementare. n prima variant se folosesc instruciuni if-
else imbricate. n a doua variant, se folosesc 3 instruciuni if. Pentru calculul valorii lui
x , a fost apelat funcia sqrt, din header-ul math.h.
















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

Exerciiul 3.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; }
#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;
}
Sau:
#include <iostream.h>
#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; }

CAPITOLUL 3 Implementarea structurilor de control

53

Instruciunea switch
n unele cazuri este necesar o decizie multipl, special. n limbajul C, instruciunea switch
implementeaz o astfel de structur de comutare sau de selecie.































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;]
[ default: <instructiune_n>; ]
}

Este evaluat <expresie>, iar valoarea ei este comparat cu valorile expresiilor constante
specificate prin <expr_const_1>, <expr_const_2>, etc., pn la ntlnirea primei
egaliti (de exemplu, <expresie>=<expresie_const_k>). n aceast situaie se execut
instruciunea corespunztoare acelei ramuri (<instruciune_k>). Dac se ntlnete
Reprezentare prin schema logic (figura 3.2):
Reprezentare prin pseudocod:



Dac expresie=expr_const_1
instruciune1;
[ieire;]
Altfel dac expr=expr_const_2
instruciune2;
[ieire;]




Altfel dac
expresie=expr_const_n-1
instruciune_n-1;
[ieire;]
Altfel instruciune_n;
DA
DA
DA
Figura 3.2. Decizia multipl
NU
NU
evaluare
expresie
exp=exp_cst_1
exp=exp_cst_2
exp=exp_cst_n-1
secvena1
secvena2
secvena n-1
NU
secvena n
ieire
ieire
ieire
CAPITOLUL 3 Implementarea structurilor de control

54

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.
Valoarea <expresie> joac rolul de comutator sau selector

Exerciiul 3.4.: S rescriem programul pentru problema 3.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 STRUCTURII REPETITIVE

Aa cum s-a artat n capitolul 1, exist dou categorii de structuri repetitive (ciclice): cu test
iniial i cu test final. Structura ciclic cu test iniial este implementat prin instruciunile
while i for. Structura ciclic cu test final este implementat prin instruciunea
do-while.
3.3.1. IMPLEMENTAREA STRUCTURII REPETITIVE CU TEST INIIAL
Instruciunea while
Sintaxa:
while (<expresie>)
<instructiune>;
CAPITOLUL 3 Implementarea structurilor de control

55

La ntlnirea instruciunii while, 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 valoarea expresiei. Dac ea este tot 1, se repet
<instruciune>, .a.m.d. Astfel, <instruciune> (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.

Exemplul 3.4.:
int a=7;
while (a==7) //ciclu infinit; se repet la infinit afiarea mesajului
cout<<Buna ziua!\n;

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.



















Sintaxa:
for ([<expresie1>]; [<expresie2>]; [<expresie3>])
<instructiune>;

Aa cum se observ, prezena expresiilor nu este obligatorie; este obligatorie doar prezena
instruciunilor vide.
Reprezentare n pseudocod:


evaluare expr1
CT TIMP expr
REPET
NCEPUT
instruciune
evaluare expr3
SFRIT
0
evaluare expresie1
(particular - iniializare contor)
instruciune
expresie2
evaluare expresie3
(particular - incrementare contor)
1
Reprezentare prin schema logic (figura 3.3.):
Figura 3.3. Structura ciclic cu test iniial
CAPITOLUL 3 Implementarea structurilor de control

56

Exemplul 3.5.:



3.3.2. IMPLEMENTAREA STRUCTURII REPETITIVE CU TEST FINAL
Instruciunea do-while

Sintaxa:
do <instructiune>;
while(<expresie>);

Se execut <instruciune>. Se evalueaz apoi <expresie>. Dac aceasta are valoarea 1
(condiie ndeplinit), se execut <instruciune>. Se testeaz din nou valoarea expresiei.
Se repet <instruciune> ct timp valoarea expresiei este 1 (condiia este ndeplinit).
Spre deosebire de instruciunea while, n cazul instruciunii do-while, corpul ciclului se
execut cel puin o dat.

Exerciiul 3.5.: 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).




























for ( ; <expresie2>; ) sau: for ( ; ; )
<instructiune>; <instructiune>;

#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";lmic++; }
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 caractere\n";
getch();
}
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 pentru contorizarea
(numrarea) literelor mari, mici, a
cifrelor, respectiv a altor 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 (afiarea
mesajului referitor la caracter i
incrementarea contorului).
CAPITOLUL 3 Implementarea structurilor de control

57


















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
}

Variant de implementare care utilizeaz instruciunea do-while:










Exerciiul 3.6.: 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
while, do-while i for. (Se observ c: S =

=
n
k
k
1
, P =

=
n
k
k
1
). Variabilele P i S vor fi
utilizate pentru memorarea valorii produsului, respectiv sumei, iar k - variabil contor - pentru
numrarea numrului de repetri a aciunii (implementat printr-o instruciune bloc).










#include <iostream.h>
#include <conio.h>
void main()
{ char c;clrscr();
int lmic=0,lmare=0,lcif=0;
int altcar=0;
cout<<"Atept caract.:"; cin>>c;
for( ; c!='@'; ){
// corp identic
}
cout<<"Ai introdus \n";
cout<<lmare<<" litere mari, ";
cout<<lmic<<" litere mici\n";
cout<<lcif<<" cifre i \n";
cout<<altcar<<" alte caractere\n";
getch(); }
Pentru implementarea aceluiai
algoritm se poate utiliza instruciunea
for. n cadrul acesteia,
<expresie1> i <expresie3>
lipsesc, ns prezena instruciunilor
vide este obligatorie.

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";
//. . .
#include <iostream.h>
void main()
{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';
}
#include <iostream.h>
void main()
{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';
}
CAPITOLUL 3 Implementarea structurilor de control

58

Pentru a ilustra multiplele posibiliti oferite de instruciunea for, prezentm i variantele
urmtoare de implementare (s-a rescris doar secvena care calculeaz i afieaz suma i
produsul):






















Exerciiul 3.7.: S se citeasc un ir de numere reale, pn la ntlnirea numrului 900. S se
afieze maximul numerelor citite.














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










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

/* varianta2 - declararea i iniializarea
variabilei k n cadrul expresie1*/
int S=0, P=1;
for (int k=1; k<=n; k++){
S+=k; P*=k;
}
cout<<"P="<<P<<"\tS=";
cout<<S<<'\n';

// varianta3 - declararea i iniializarea variabilelor k, P i S n cadrul expresie1
for (int S=0, P=1, k=1; k<=n; k++){
S+=k; P*=k;
}
cout<<"P="<<P<<"\tS="<<cout<<S<<'\n';

// varianta4 - calculul S, P i incrementare contor n cadrul expresie3
// instruciune din corpul for este vid
for (int S=0, P=1, k=1; k<=n; S+=k, P*=k, k++)
;
cout<<"P="<<P<<"\tS="<<cout<<S<<'\n';

#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).
#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 ecran
for (char LitMare='A'; LitMare<='Z'; LitMare++){
if (nr_lin==DIM_PAG){
CAPITOLUL 3 Implementarea structurilor de control

59















Exerciiul 3.9.: 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';
}

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

=1 k
k
k
x
, 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;
double EPS; cout<<"Precizie="; cin>>EPS;
//T=termenul general la pasul curent; S=suma la pasul curent; S1=suma la pasul anterior
do {
S1=S;k++;T=pow(x,k)/k;//funcia pow(x, k), aflat n <math.h> calculeaz x
k

S+=T; // cout<<k<<" "<<T<<" "<<S<<'\n';getch();
} while (fabs(S-S1)>=EPS);
cout<<"Nr termeni="<<k<<" T="<<T<<" S="<<S<<'\n'; }
cout<<"Apasa o tasta...."; getch(); clrscr(); nr_lin=0;}
cout<<"Litera "<<LitMare<<" cod ASCII "<<(int)LitMare<<'\n';
// 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<<" cod ASCII "<<(int)LitMica<<'\n';
nr_lin++;
}
}
CAPITOLUL 3 Implementarea structurilor de control

60

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 cadrul instruciunilor ciclice. n plus, instruciunea break poate fi folosit n
cadrul instruciunii 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 instruciunea care
urmeaz instructiunii ciclice. Astfel, se ntrerupe repetarea corpului instruciunii ciclice,
indiferent de valoarea expresiei care exprim condiia de test.
Prezena instruciunii break n cadrul instruciunii switch: n situaia n care s-a ajuns la o
valoare a unei expresiii 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 break cauzeaz deci, ieirea imediat din switch.

Instruciunea continue
ntlnirea instruciunii continue n cadrul instruciunilor ciclice, (figura 3.4.) determin
ignorarea instruciunilor urmtoare acesteia, din corpul instruciunii repetitive i reluarea
execuiei cu testarea valorii expresiei (care reprezint condiia de test) care determin
repetarea sau nu a corpului ciclului.

Exemplul 3.5.: S revenim la programul realizat pentru problema 1, care folosete
instruciunea do-while. 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 terminator s fie testat i numrat,
n corpul instruciunii do-while putem introduce 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";
//. . .

do{
<instructiune1>;
<instructiune2>;
if (<expresie2>)
break;
else
continue;
<instructiune3>;
} while (<expresie1>);
while (expresie1){
<instructiune1>;
<instructiune2>;
if (<expresie2>)
break;
else
continue;
<instructiune3>;
}
CAPITOLUL 3 Implementarea structurilor de control

61















3.5. NTREBRI I PROBLEME

NTREBRI

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?
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.

PROBLEME

1. S se scrie programele pentru exerciiile rezolvate care au fost prezentate.
2. S se implementeze algoritmii proiectai pentru problemele 1-7 din capitolul 1.
3. 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).
4. S se rescrie urmtoarea secven, folosind o singur instruciune if.
if (n<0)
if (n>=90)
if (x!=0)
int b= n/x;
5. 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).
6. S se gseasc toate numerele de dou cifre care satisfac relaia:
7. 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.
2
) ( y x xy + =
for
(<exp1>;<exp2>;<exp3>)){
<instructiune1>;
<instructiune2>;
if (<expresie2>)
break;
else
continue;
<instructiune3>;
Figura 3.4. Modul de utilizare a
instruciunilor break i continue
Exemplul 3.6.:
S se urmreasc rezultatele execuiei
urmtorului program.

void main()
{ int k;
for(k = 1;k < 15;k++){
if (k == 8) break;
cout<<"k="<<k<<'\n'; }
for(k = 1;k < 15;k++){
if (k == 8) continue;
cout<<"k="<<k<<'\n;
}
}
CAPITOLUL 3 Implementarea structurilor de control

62

8. 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.
9. Fie funcia
e
3 x
, x[0, 1)
f(x)= sinx+cosx , x[1, 2)
0,9ln(x+3) , x[2, 100]
10. S se scrie un program care calculeaz i afieaz maximul a 3 numere reale (a, b i c)
citite de la tastatur.
11. S se scrie un program care calculeaz i afieaz minimul a 3 numere reale (a, b i c)
citite de la tastatur.
12. S se citeasc 2 caractere care reprezint 2 litere mari. S se afieze caracterele citite n
ordine alfabetic.
13. S se citeasc 3 caractere care reprezint 3 litere mici. S se afieze caracterele citite n
ordine alfabetic.
14. 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!".
15. Fie irul lui Fibonacci, definit astfel:f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) pentru n>1.
S se scrie un program care implementeaz algoritmul de calcul al irului Fibonacci.
16. 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
1 + k
(x) - 2xT
k
(x) + T
1 k
(x) = 0
17. 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.
18. Se citesc cte 3 numere reale, pn la ntlnirea numerelor 9, 9, 9. Pentru fiecare triplet de
numere citit, s se afieze maximul.
19. 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.
20. 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.
21. 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.
22. 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.
23. S se scrie un program care afieaz literele mari ale alfabetului n ordine cresctoare, iar
literele mici - n ordine descresctoare.
24. 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).
25. 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.
26. S se genereze toate numerele naturale de 3 cifre pentru care cifra sutelor este egal cu
suma cifrelor zecilor i unitilor.
27. 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.
28. S se genereze toate numerele naturale de 3 cifre pentru care cifra zecilor este egal cu
diferena cifrelor sutelor i unitilor.
29. S se calculeze suma: (1 + 2!) / (2 + 3!) - (2+3!) / (3+4!) + (3+4!) / (4+5!) - .....
S se calculeze f(x), x citit de la tastatur.

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