Sunteți pe pagina 1din 15

7.

Instruciuni

Instruciunile limbajului C pot fi instruciuni simple, a cror execuie nu presupune execuia


altor instruciuni sau instruciuni structurate, pentru execuia crora trebuie s fie executate
alte instruciuni interne lor (care pot fi de asemenea simple sau structurate).
Principalele instruciuni simple sunt: instruciunea expresie, instruciunea vid i
instruciunile de salt (break, continue, goto). Instruciunile structurate sunt:
instruciunea bloc, instruciuni de selecie (if, switch) i instruciuni repetitive (for,
while, do-while).

7.1 Instruciuni expresii i blocuri


Instruciunea expresie i instruciunea bloc sunt instruciuni eseniale ale limbajului C.
Instruciunea expresie este o generalizare a instruciunii de atribuire din limbajul algoritmic,
iar instruciunea bloc corespunde noiunii de secven de instruciuni a acestuia.
A) Instruciunea expresie
Instruciunea expresie este specific limbajului C, datorit modului particular de tratare a
operatorului de atribuire.
n capitolul de introducere n limbajul C s-a descris instruciunea de atribuire de
forma urmtoare:
variabil = expresie ;

Deoarece operatorul de atribuire poate apare n cadrul expresiilor limbajului C, construcia:


(1)
variabil = expresie
reprezint ea nsui o expresie, astfel nct instruciunea de atribuire este un caz particula al
unei instruciuni numite instruciunea expresie.
Sintaxa acestei instruciuni este urmtoarea:
instruciunea
expresie

expresie

Execuia unei instruciuni expresii se reduce la evaluarea expresiei asociate. n mod uzual
expresia asociat este reprezentat de o instruciune de atribuire sau de un apel de funcie, sau
de o operaie de incrementare/decrementare i deci evaluarea ei are i un efect lateral prin
modificarea valorii unei variabile (sau mai multe) din cadrul expresiei.
Exemple de instruciuni expresii:

x = sin(y) + z;
i++;
n = (u > v) ? u : v;
printf(Exemplu de instructiune expresie\n);

Observaie. Expresia reprezentat de construcia sintactic (1) se poate utiliza i n alte


instruciuni n afar de cele de atribuire. Trebuie avut ns grij n acest caz la eventualele
efecte laterale.
Exemple.
1) Instruciunea urmtoare datermin dac valoarea variabilei este_simetrica este 1 sau nu:
if (este_simetrica == 1)
printf(Matricea este simetrica\n);
else
printf(Matricea nu este simetrica\n);

2) Instruciune urmtoare reprezint o greeal, deoacere expresia condiional are


ntotdeauna valoarea 1:
if (este_simetrica = 1)
printf(Matricea este simetrica\n);
else
printf(Matricea nu este simetrica\n);

3) Secvena urmtoare evit ca citirea unui caracter de la tastatur s se efectueze ntr-o


instruciune distinct:
s = 0;
do {
printf(\nValoare: );
scanf(%f, &x);
s += x;
printf(\nMai sunt numere ? );
} while ((c = getch() == d);

B) Instruciunea bloc i instruciunea vid


Instruciunea bloc este utilizat de obicei n situaii n care sintaxa limbajului impune
prezena unei singure instruciuni, dar algoritmul problemei de rezolvat impune utulizarea
unei secvene de instruciuni. n acest caz, instruciunile ce formeaz secvena se ncadreaz
ntre acolade, ntreaga construcie comportndu-se din punct de vedere sintactic drept o
singur instruciune. n plus, un bloc poate conine definiia sau declaraia obiectelor ce sunt
locale acestuia:
bloc
{

}
declaraii/
definiii

instruciune

Se observ faptul c sintaxa limbajului permite scrierea unui bloc ce nu conine nici declaraii
i nici instruciuni. Blocul repectiv reprezint n acest caz un bloc vid. Blocurile vide sunt

utilizate mai ales n etapa de dezvoltare i testare a programelor, ele putnd fi completate pe
msur ce s-a testat funcionalitatea unui program pn n momentul respectiv.
O alt situaie n care s-ar putea utiliza un bloc vid corespunde cazului cnd sintaxa
limbajului impune prezena unei instruciuni, dar n algoritmul de rezolvare al problemei nu
trebuie efectuat nici o aciune. n aceste cazuri este preferabil utilizarea instruciunii vide,
care se scrie mai simplu, deoarece nu conine dect caracterul ;.
instruciunea
;

vid

7.2 Instruciuni de selecie


Limbajul C conine dou instruciuni de selecie care permit selecia pentru execuie a unei
alternative din una sau mai multe secvene posibile: instruciunea if i instruciunea
switch.
A) Instruciunea de decizie (if)
Instruciunea if a fost prezentat n cadrul capitolului de introducere n limbajul C i toate
observaiile specificate acolo sunt valabile. Sintaxa instruciunii este:
instruciunea

if
if
else

expresie

instruciune

instruciune

La execuie, se evalueaz expresia condiional i n funcie de valoarea rezultat se execut


instruciunea imediat urmtoare (dac expresia este diferit de zero), sau cea care urmeaz
cuvntului else (dac expresia are valoarea zero); n cazul n care ramura else nu exist,
instruciunea if este inefectiv.
Cteva observaii suplimentare se impun n cazul n care fie pe alternativa if, fie pe
alternativa else exist tot o instruciune if. Ultimul caz nu implic nici un fel de confuzie
semantic, fiind des utilizat pentru selecia unei alternative din mai multe posibile. n unele
limbaje de programare, construcia else if reprezint chiar o instruciune distinct.
De exemplu, secvena urmtoare determin valoarea corect a variabilei z n funcie
valorile operanzilor x, y i a operatorului op de tip char:
if (op == +)
z = x + y;
else if (op == -)
z = x - y;
else if (op == *)
z = x * y;
else if (op == /)
z = x / y;

n primul caz (o instruciune if intern aflat pe alternativa if) pot exista confuzii
semantice doar din punctul de vedere al programatorului. De exemplu, n cazul unei
instruciuni de forma:
if (<expr1>)
if (<expr2>)
<instr1>;
else
<instr2>;

aparent exist o confuzie privind apartenena instruciunii <instr2>. n realitate,


compilatorul determin precis instruciunea if la care asociaz instruciunea intern
<instr2>.
Exemplul 7.1. Se consider dou numere reale, a i b, a < b. Se vor descrie n continuare
dou secvene n limbajul algoritmic. Prima secven contorizeaz cte numere dintr-un ir de
n numere reale se afl n intervalul (a, b] i cte n intervalul (b, +); a doua secven
contorizeaz numerele din intervalele (-, a] i (b, +).
Cazul I.
k1 k2 0
pentru i 1 la n execut
citete x
dac x > a atunci
dac x > b atunci
k2 k2 + 1
altfel
k1 k1 + 1

Cazul II.
k1 k2 0
pentru i 1 la n execut
citete x
dac x > a atunci
dac x > b atunci
k2 k2 + 1

altfel
k1 k1 + 1

Codificrile n limbajul C sunt:


int n, i, k1 = 0, k2 = 0;
float x;
/* Cazul I. */
for (i=0; i<n; i++) {

scanf(%f, &x);
if (x < a)
if (x < b)
k2++;
else
k1++;
}
/* Cazul II. */
for (i=0; i<n; i++) {
scanf(%f, &x);
if (x < a) {
if (x < b)
k2++;
}
else
k1++;
}

Dup cum se observ, problema apare la asocierea alternativei else. Semantica limbajului
este clar: instruciunea care apare dup cuvntul else se asociaz ntotdeauna ultimei
instruciuni if incomplete (care nu are alternativ else).
n concluzie, dac pe ramura else a unei instruciuni if se apeleaz tot o
instruciune if incomplet (fr ramur else), atunci aceasta fie trebuie ncadrat ntre
acolade (ca n exemplul precedent), fie trebuie s i se adauge o alternativ else inefectiv (o
instruciune vid pe aceast alternativ). De exemplu, cazul II anterior se mai poate scrie
astfel:
/* Cazul II. */
for (i=0; i<n; i++) {
scanf(%f, &x);
if (x < a)
if (x < b)
k2++;
else
;
else
k1++;
}

B) Instruciunea switch
n mod uzual, instruciunile din cadrul unui bloc sunt executate n mod secvenial, ncepnd
cu prima instruciune a blocului. Instruciunea switch permite ca din cadrul instruciunilor
unui bloc, s se execute doar un grup, ncepnd cu o anumit instruciune specificat.
Sintaxa de utilizare a instruciunii switch este urmtoarea:
instruciunea
switch

switch

expresie

instruciune
etichetat

}
default

instruciune

unde, expresie este o expresie ntreag, iar instruciune etichetat


reprezint o instruciune a limbajului C care este precedat de o etichet, de forma urmtoare:
instruciune
etichetat

case

expresie
constant

instruciune

Se observ faptul c dup expresia condiional aferent instruciunii switch urmeaz un


bloc de intruciuni ce pot fi etichetate cu ajutorul unor expresii constante. Separarea
etichetelor de instruciune se face cu ajutorul caracterului :.
Observaie. Nu trebuie confundate instruciunile etichetate din cadrul blocului unei
instruciuni switch cu celelalte instruciuni etichetate ale unui program. Despre aceste
instruciuni, precum i despre instruciunea aferent goto se va discuta ntr-un paragraf
ulterior.
Execuia unei intruciuni se switch realizeaz astfel:
se evalueaz expresia condiional dintre paranteze;
se evaluaeaz pe rnd expresiile constante din etichetele instruciunilor din cadrul
blocului, pn cnd se determin prima expresie constant a crei valoare este egal
cu valoarea expresiei condiionale;
dac de determin o astfel de etichet, se execut instruciunile din cadrul blocului n
mod secvenial, ncepnd cu instruciunea ce are ataat eticheta respectiv;
n caz contrar, se execut instruciunea etichetat cu default, n cazul n care
eticheta default exist, sau instruciunea switch este inefectiv n caz contrar.
Exemplul 7.2. Programul urmtor calculeaz valoarea expresiei e = xn, pentru n numr
natural mai mic dect 5. El trebuie privit doar ca o exemplificare a funcionrii instruciunii,
nu drept o soluie eficient de evaluaare a expresiei xn.
#include <stdio.h>
int main () {
int n;
double x, y = 1;
printf(n = );
scanf(%d, &n);
printf(x = );
scanf(%lf, &xc);
switch (n) {
case 5:
y *= x;
case 4:
y *= x;
case 3:
y *= x;

case 2:
y *= x;
case 1:
y *= x;
}
printf(y = %lf\n, y);
return 0;
}

Observaii:
1) n cazul n care exist mai multe expresii constante care au aceeai valoare, se va selecta
instruciunea asociat primei etichete.
2) Este posibil ca o instruciune s aib asociate mai multe etichete, ceea ce face ca aceasta
s poat fi selectat prin mai multe valori.
Folosirea uzual a instruciunii switch este mpreun cu instruciunea break. n acest mod
se poate selecta pentru execuie o singur secven se instruciuni din mai multe posibile.
Instruciunea break este format doar din cuvtul cheie break i are ca efect
terminarea forat a instruciunii structurate n care ea apare. Din acest motiv, dac ultima
instruciune dintr-o secven este break, toate celelalte instruciuni din blocul instruciunii
switch nu se mai execut.
n concluzie, dac se dorete ca secvenele de instruciuni din cadrul instruciunii
switch s fie disjuncte (n mod asemntor instruciunii case din limbajul Pascal), se
adaug la sfritul fiecrei secvene (mai puin eventual la sfritul ultimei secvene) cte un
break. Astfel rezult alternative disjuncte la execuie.
Exemplul 7.3. Determinarea valorii unei funcii de dou variabile de forma urmtoare:

1 x 2 , n 1

1 sin( x), n 2
f ( x, n )
x
1 e , n 3
1 x , n 4

#include <stdio.h>
#include <math.h>
int main () {
int n, ok = 1;
double x, y;
printf(n = );
scanf(%d, &n);
printf(x = );
scanf(%lf, &x);
switch (n) {
case 1:
y = 1 + x * x;
break;
case 2:
y = 1 + sin(x);

break;
case 3:
y = 1 + exp(x);
break;
case 4:
y = 1 + sqrt(x);
break;
default:
ok = 0;
}
if (ok)
printf(y = %lf\n, y);
else
printf(Valoare incorecta pentru n\n);
return 0;
}

Observaie. Multe dintre construciile else-if (dar nu toate) pot fi transformate n


instruciuni switch. De exemplu, instruciunea if urmtoare care evalueaz o expresie
simpl:
if (op == +)
z = x + y;
else if (op == -)
z = x - y;
else if (op == *)
z = x * y;
else if (op == /)
z = x / y;

poate fi transformat cu uurin ntr-o instruciune switch. Aceast observaie nu este


valabila i pentru intruciunea urmtoare care transform un caracter al bazei 16 de
numeraie ntr-un numr zecimal:
if (c>=0 && c<= 9)
printf(%d, c-10);
else if (c>=a && c<= f)
printf(%d, c-a+10);
else if (c>=A && c<= F)
printf(%d, c-A+10);
else
printf(Caracter hexa incorect);

7.3 Instruciuni repetitive


Instruciunile repetitive sunt while, do-while i for, iar efectul lor const n execuia
repetat a unei instruciuni interne, n funcie de o anumit expresie cindiional.
Despre toate acestea s-a discutat n capitolul 3, toate observaiile i definiiile
sintactice fiind valabile i n acest paragraf. n continuare se vor discuta doar anumite aspecte
specifice.
Observaii.

1) Execuiile tuturor instruciunilor se termin n urma evalurii unei expresii condiionale.


n cazul instruciunilor while i for, testul se face naintea execuiei instruciunii
interioare, iar n cazul instruciunii do-while testul se face dup execuia acesteia.
2) n cazul instruciunilor cu test iniial, este posibil ca instruciunea intern s nu se execute
nici o dat, din acest motiv n cazul n care se dorete ca prelucrarea intern unei
instruciuni repetitive s se execute cel puin o dat, s se utilizeze instruciunea dowhile. De exemplu, n programul urmtor s-a utilizat o instruciune do-while pentru
determinarea sumei unor numere introduse de la tastatur, deoarece trebuie s existe cel
puin o operaie de citire:
#include <stdio.h>
#include <conio.h>
int main () {
int x, s = 0;
char c;
do {
printf(\nx = );
scanf(%d, &x);
s += x;
printf(Mai sunt numere ?);
c = getchar();
}
while (c != n);
printf(s = %d\n, s);
return 0;
}

3) Pentru ca o instruciune repetitiv s nu devin o bucl infinit, este necesar (dar nu i


suficient) ca n cadrul instruciunilor interne acesteia, valorile variabilelor ce apar n
expresia condiional s fie modificate. n unele cazuri, modificarea acestor valori se
poate face chiar n cadrul expresiilor laterale, prin anumite efacte laterale. De exemplu,
instruciunea urmtoare, sare n cadrul unei prelucrri a unui text toate caracterele de tip
spaiu (linie nou, tab, cracterul spaiu). Operaia de citire se efectueaz n cadrul
expresiei condiionale, iar instruciunea while nu are nici o alt instruciune intern.
while ((c=getchar()) &&
(c==\n ||
c==\t ||
c== ));

4) n cazul instruciunii for, expresia condiional poate lipsi, ceea ce nu se poate ntmpla
pentru celelalte dou instruciuni repetitive. Lipsa unei expresii condiionale n cadrul
instruciunii for este interpretat drept constanta 1. De exemplu, instruciunea:
for (;;)
instructiune
este interpretat ca o bucl infinit:
for (; 1 ;)
instructiune

Exemplul 7.4. Se consider un ir de n numere, x1, x2, , xn. S se ordoneze cresctor irul
de numere.
Descrierea algoritmului.
Se va prezenta o metod simpl de sortare (acesta este termenul consacrat pentru operaia de
ordonare a elementelor unui grup de elemente), numit sortarea prin numrare. Ideea acestei
metode se bazeaz pe urmtoarea observaie: elementul aflat pe poziia k n ir dup
terminarea operaiei de sortare este mai mare dect k-1 elemente din ir (aflate naintea lui).
Cu alte cuvinte, dac un element dintr-un ir este mai mare dect k elemente, atunci el se va
afla la sfrit pe poziia k+1.
n concluzie, pentru fiecare element din ir, se va determina numrul de elemente din
ir, fa de care el este mai mare ca valoare. Vom nota cu contor un tablou de numere ntregi
ce memoreaz aceste valori. n acest mod, poziia n ir a elementului xk dup sortare este
contork.
Determinarea valorilor contork se determin prin compararea perechilor de elemente
xI cu xj. Pentru a se elimina comparrile redondante, se vor compara doar perechile (xi, xj)
distincte. Descrierea algoritmului este urmtoarea (pentru simplitate, s-a utilizat notaia cu
indici n dou forme):
start
citeste n
pentru i 1 la n executa
citeste xi
contori 0

pentru i n la 2 pas -1 executa


pentru j i-1 la 1 pas -1 executa
daca xi < xj atunci
contorj contorj + 1
altfel
contori contori + 1

pentru i 1 la n executa
scrie x[contor[i]]

sfarsit

Analiza algoritmului.
Timpul de execuie al algoritmului este:
T = t1 + t2 + t3
Unde cei trei timpi corespund celor trei instruciuni for. Primul i ultimul se determin
simplu:
t1 = 1 + 3*n,
t2 = 1 + 2*n,
Pentru determinarea timpului t3, se observ faptul c timpul de execuie al instruciunii
interne if este tot timpul 2, deoarece se execut o singur incrementare a contorului,
indiferent de valorile lui x[i] i x[j]. Rezult:

n 1

n 1

i 1

i 1

t3 = 1 (2 (1 (i 1) * (2 2))) 1 (3 4 * (i 1)) = 2*n2-3*n+2


n final:
T = 2*n2+2*n+4,
adic
O(T) = O(n2)
Ceea ce face ca acest algoritm s nu fie foarte eficient, n ciuda simplitii sale. n literatura
de specialitate exist destul de muli algoritmi de sortare, unii dintre ei fiind destul de
eficieni.
Descrierea programului.
#include <stdio.h>
int main() {
int n, i, j, contor[20];
float x[20];
printf(\nIntroduceti n: );
scanf(%d, &n);
printf(\nIntroduceti elementele sirului: );
for (i=0; i<n; i++) {
scanf(%f, &x[i]);
contor[i] = 0;
}
for (i=n-1; i>=1; i--)
for (j=i-1; j>=0; j--)
if (x[i] < x[j])
contor[j]++;
else
contor[i]++;
printf(\nElementele sortate: );
for (i=0; i<n; i++)
printf(%f, x[contor[i]]);
return 0;
}

7.4 Instruciuni de salt


Instruciunile de salt permit ca execuia unui program s nu continue cu instruciunea
urmtoare celei curente, ci n alt loc din program, bine determinat. Principalele instruciuni de
salt sunt: instruciunea break, instruciunea continue, instruciunea goto i
instruciunea return.
Despre instruciunea return s-a discutat n cadrul capitolului referitor la fucii.
Efectul ei const n terminarea execuiei funciei apelate i continuarea execuiei programului
n funcia apelant, n locul imediat urmtor apelului. O dat cu ntoarcerea n funcia
apelant, are loc i refacerea contextului acesteia (refacerea valorilor curente ale variabilelor
locale i ale parametrilor formali nainte de apel) prin extragerea ultimului cadru din stiv.
Instruciunea continue este utilizat n cadrul blocurilor i are ca efect terminarea
forat a execuiei blocului respectiv: toate instrcuiunile din blocul curent ce urmeaz unei
instruciuni continue nu se mai execut. Sintaxa instruciuni continue const, ca i n
cazul instruciunii break doar din cuvntul cheie aferent.

Folosirea uzual a instruciunii continue este n cadrul blocurilor interne


instruciunilor repetitive. n acest mod, efectul ei const n terminarea forat a iteraiei
curente i trecerea la iteria urmtoare. De exemplu, funcia urmtoare calculeaz suma
elementelor pozitive ale unui ir de numere. La fiecare iteraie, instruciunea de atribuire nu
se mai execut n cazul numerelor negative:
float Suma1(int n, int v[]) {
int k, s = 0;
for (k=0; k<n; k++) {
if (v[k] < 0)
continue;
s += v[k];
}
return s;
}

Instruciunea break este utilizat n cadrul instruciunilor structurate, n special n cazul


instruciunilor repetitive i al instruciunii switch. Efectul ei este mai puternic dect cel al
instruciunii continue, deoerece foreaz terminarea execuiei ntregii instruciuni compuse,
nu doar pe cea a instruciunii bloc intern.
Utilizat n cadrul instruciunii switch, ea ncheie o alternativ disjunct; folosit n
cadrul instruciunilor repetitive, instruciunea continue are rolul de a termina procesul
iterativ de prelucrare.
Exemplul 7.5. Funcia urmtoare determin suma elementelor unui ir de numere terminat cu
zero. Valorile irului se citesc de la tastatur.
float Suma2() {
int x, s = 0;
while (1) {
printf(\nx = );
scanf(%d, &x);
if (x == 0)
break;
if (x < 0)
continue;
s += v[k];
}
return s;
}

Instruciunea goto este una dintre cele mai vechi instruciuni aprute n cadrul limbajelor
de programare de nivel nalt. Dezavantajul ei este acela c distruge caracterul structurat al
programelor, dar a fost pstrat n cadrul limbajului C din considerente istorice.
Orice program ce utilizeaz instruciunea goto se poate transforma ntr-un program
echivalent ce nu conine aceast instruciune. Modul de definire al limbajului C nu
ncurajeaz utilizarea acestei instruciuni, considerndu-se faptul c programatorul care
utilizeaz instruciunea goto este un slab programator.
instruciunea
goto

goto

etichet

unde etichet este o constant ntrege sau un identificator, reprezentnd eticheta unei
instruciuni.
Instruciunile unui program pot fi etichetate i nu trebuie confundate cu cele din
interiorul unei instruciuni switch. O etichet poat fi un numr ntreg sau un identificator i
preced instruciunea pe care o eticheteaz, fiind separat de aceasta prin caracterul :.
Efectul execuiei unei asemenea instruciuni const n continuarea execuiei
programului cu instruciunea care are eticheta specificat dup cuvntul cheie goto.
Un exemplu uzual de folosire al instruciunii goto este n cadrul instruciunilor
repetitive. Dac, de exemplu, exist dou instruciuni for imbricate, utilizarea instruciunii
break n cadrul instruciunii for interioare nu permite ntreruperea execuiei instruciunii
for exterioare. n acest caz se poate justifica utilizarea unei instruciuni goto.
Exemplul 7.6. Funcia urmtoare determin abaterea ptrat a valorilor elementelor dintr-o
matrice, presupunnd faptul c acestea sunt pozitive. n caz contrar, se determin poziia
primului element negativ. Variabile auxiliar k are rolul de a determina dac matricea conine
sau nu elemente negative
#define max 4
void AbatereMedie(int n, int m, int a[max][max]) {
int i, j, k, s = 0, s1 = 0;
for (i=0; i<n; i++)
for (j=0; j<m; j++) {
if (a[i][j] < 0) {
k = 1;
goto 100;
}
s += a[i][j];
}
med = s/(n*m);
for (i=0; i<n; i++)
for (j=0; j<m; j++)
s1 += (a[i][j]-med) * (a[i][j]-med);
100: if(k)
printf(Element negativ pe pozitia %d %d, i, j);
else
printf(s = %f, s1);
}

Observaii.
1) Nu este permis saltul n afara corpului funciei curente, ci doar n interiorul acesteia.
2) Saltul din interiorul unei instruciuni repetitive nspre exterior este n mod uzual
utilizat, variabilele de control ale instruciunii respective pstrndu-i valorile din
momentul saltului.
3) Saltul dinspre exteriorul unei instruciuni repetitive nspre interiorul acesteia nu este
indicat, deoarece variabilele de control ale acesteia pot avea valor alterate, ceea ce
poate conduce la erori n execuia programului.

7.5 Probleme

7.1.

S se scrie programul pentru rezolvarea problemei 2.6.

7.2.

S se scrie programul pentru determinarea valorii y = xn, pentru un numr real pozitiv x
i un numr ntreg pozitiv n efectund un numr minim de operaii de nmulire i
ridicare la ptrat.

7.3.

Se consider un circuit electric format numai din rezistoare, avnd structura prezentat
n figura urmtoare: r11
r1m
r21

r2m

rn1

rnm

Valorile rezistenelor sunt specificate ntr-o matrice R, elementul rij reprezentnd


rezistena a j-a de pe latura i. S se scrie un program care s determine rezistena
echivalent a circuitului.
7.4.

Cunoscndu-se valorile rezistenelor R1, R2, ..., Rn, dintr-un circuit electric, s se
determine rezistena echivalent a circuitului urmtor:
R1
R2

Rn-k

R3

Rn-k+1

Rn

Prima latur a circuitului are o rezisten, a doua are dou rezistene, la fiecare latur
numrul de rezistene crete cu una fa de latura precedent. Pentru ultima latur aceast
regul nu mai este valabil, ea coninnd restul rezistenelor neluate n considerare.
7.5.

Fiind dat un numr real x0 i un numr real pozitiv subunitar eps, s se scrie un
program care s calculeze valoarea funciei f(x)=sin(x) n punctul x0, cu o precizie eps,
folosind dezvoltarea n serie de puteri a funcie:
sin(x) = x - x3/(3!) + x5/(5!) - x7/(7!) + ...

7.6.

S se scrie algoritmul i programul pentru ordonarea cresctoare unui ir de numere


reale folosind metoda interschimbrii (metoda bulelor). Principiul metodei const n
compararea n mod repetat a valorilor termenilor adiaceni: n cazul n care xi > xi+1, se
interschimb ntre ele cele dou valori. Operaia de sortare se ncheie n momentul n
care nu mai sunt termeni adiaceni ce trebuie interschimbai.

7.7.

S se determine timpul mediu de execuie al algoritmului de la problema precedent.

7.8.

S se elaboreze un algoritm i un program cu un numr minim de interschimbri care


s rearanjeze toate elementele dintr-un ir de numere astfel nct toate numerele

negative s le precead pe cele pozitive (elementele nu trebuie sortate complet, ci doar


separate n numere negative i pozitive).
7.9.

Se consider c de la terminalul standard de intrare se introduce un ir de caractere


(terminat cu caracterul ENTER) care reprezint un apel de funcie conform sintaxei
limbajului C:
nume funcie ( list parametri )
unde list parametri este o secven de zero sau mai muli parametri de apel separai
prin virgul. Se consider pentru simplitate c nu exist spaii libere n cadrul unui apel
de funcie. S se scrie un program care citete un asemenea apel de funcie i afieaz
apoi numele funciei i parametrii de apel.

7.10. Se consider c de la terminalul standard de intrare se introduce un ir de caractere


(terminat de caracterul ENTER) care reprezint o operaie elementar aritmetic de
forma urmtoare:
operand1 operator operand2
unde operand1 i operand2 sunt constante ntregi pozitive, iar operator poate fi
unul dintre caracterele: + sau *, reprezentnd operaiile aritmetice de adunare i
nmulire. Se consider pentru simplitate c o asemeea expresie nu conine spaiilibere.
S se scrie un program care:
a) Testeaz dac expresia citit este corect din punct de vedere sintactic;
b) n caz afirmativ, afieaz pe terminalul standard de ieire valoarea expresiei dup
evaluare.
7.11. S se modifice programul de la problema 7.10, astfel nct s permit existena
spaiilor libere ntre operanzi i operatori.
7.12. S se scrie un program, care citete de la tastatur forma analitic a unei funcii simple,
de variabil X i afieaz derivata acesteia. Funcia poate conine cele patru operaii
aritmetice, +, -, * i /, ridicarea la putere ** i eventual perechi de paranteze rotunde.
De exemplu, pentru intrarea:
5*X**3+2*X**2+5/(X**2)
Se va afia urmtoarea expresie:
15*X**2+4*X-10/(X**3)

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