You are on page 1of 7

Lucrarea de laborator nr.

7
Tema: Instruciuni ciclice n limbajul C
Obiective
operatori i expresii relaionale;
operatori i expresii logice;
instructiuni de test: if, if-else;
instructiuni repetitive: do-while, while, for;
instruciunea: break.

7.1. Teme pentru studiu prealabil


Instruciuni repetitive n limbajul C. Bucle plasate.
Operatori i expresii condiionale n limbajul C.
7.2. Sarcina pentru soluionare
Pentru funcia Y = f(X), graful creia este prezentat pe fig. 7.1, de afiat la ecran valoarea lui
Y pentru = 0; 0,25; 0,5; ...; 19,75. Cerin suplimentar de obinut la ecran graficul funciei cu
mijloacele regimului textual.

Fig. 7.1. Graficul funciei Y = f(X)

7.3. Exemplu de soluionare a sarcinii


Metoda general de elaborare a algoritmului soluionrii
Din graficul funciei prezentat n fig.7.1 se vede c funcia este format din cinci perioade.
Astfel, programul poate s conin o bucl, care de 5 ori va ndeplini unele i aceleai calcule. La
fiecare iteraie trebuie s se ia n consideraie valorile variabilei x de la 0 pn la 3,75 cu pasul 0,25,
cu alte cuvinte, avem o bucl plasat. La fiecare iteraie a buclei incluse se calculeaz valoarea lui y
pentru x curent i se extrage rezultatul.
Analiza graficului prezentat arat c fiecare perioad este format din patru pri: pe
segmentul 0<=x<=1 graficul este o dreapt, pe segmentul

1<=x<=2 arc, pe segmentul

2<=x<=3 alt dreapt i segmentul 3<=x<=4 este descris iari de un arc. Prin urmare, n
1

bucla plasat trebuie s fie o ramificare, n care se calculeaz valoarea curent a valorii x i se
asigur calculul pentru primul, al doilea, al treilea i al patrulea caz.
Calcularea funciei pe segmentul 0-1
Pe acest segment, funcia este o dreapt. Formula dreptei: y=ax+b. Pentru acest caz, a=0,
b=1. Astfel, formula final pentru segmentul 0<=x<=1 este: y=0*x+1.
Calcularea funciei pe segmentul 1-2
Pe acest segment, funcia este o parte din cerc. Formula cercului: (x-x0)2+(y-y0)2=R2, unde
(x0, y0) coordonatele centrului
y

y0

R2

x x0

cercului, iar R raza. De aici

y poate fi gsit ca:

. n cazul nostru R=1, iar coordonatele centrului (2,1). La extragerea rdcinii

ptrate se obin dou valori pozitiv i negativ, n cazul nostru se utilizeaz numai semicercul de
jos, aa c trebuie s lum numai valoarea negativ. Formula final pentru segmentul 1<=x<=2
este: y=1-sqrt((1-(x-2)2).
Calcularea funciei pe segmentul 2-3
Pentru dreapta de pe acest segment, a=0, b=-1, formula final: y=0*x-1.
Calcularea funciei pe segmentul 3-4
Pe acest segment, funcia este o parte din cerc. La extragerea rdcinii ptrate, obinem
formula final pentru segmentul 3<=x<=4: y=-1+sqrt((1-(x-4)2), n cazul nostru se utilizeaz
numai semicercul de sus, astfel lum numai valoarea pozitiv.
Algoritmul de extragere a rezultatelor n forma grafic
La fiecare iteraie a buclei interioare, se obine o coordonat a graficului. Prin urmare, pentru
prezentarea rezultatului n forma grafic va fi comod a desfura graficul la 90 0 i n fiecare rnd al
ecranului de reprezentat valorile x, y i simbolul, care reprezint un punct al graficului, deplasarea
acestui simbol n rnd va fi proporional cu valoarea coordonatei. Pentru reprezentarea acestui
simbol la deplasare, coordonata se transform n numr ntreg (cu scara la mrimea rndului), acest
numr va fi numrul de lacune, care trebuie introduse n rnd naintea simbolului punct.
La fiecare perioad, funcia include 16 iteraii ale buclei plaste, astfel, pe ecran vor fi extrase
16 rnduri pentru o perioad. Ar fi raional dup afiarea fiecrei perioade (care integral se
ncadreaz pe ecran) de fcut o pauz n program pn la comanda operatorului de continuare.
Schema algoritmului este prezentat n fig. 7.2:

Fig.7.2. Schema bloc

Determinarea variabilelor programului


Pentru realizarea algoritmului, se vor utiliza urmtoarele variabile:
n parametrul buclei externe, pentru el este de ajuns un numr scurt ntreg:
short n;
3

x parametrul buclei interne i, totodat valoarea curent a abcisei graficului. Cu toate c precizia
lui nu e mare, se anun ca double, n corespundere cu stilul comun de programare n C:
double x;
y valoarea curent a ordonatei grafului:
double y;
h deplasarea n rnd a simbolului, care nseamn punctul graficului. ntruct deplasarea nu poate
depi 80 (lungimea irului pe ecran), pentru aceast variabil va fi de ajuns un numr scurt ntreg:
short h;
Elaborarea textului programului
Elaborarea programului ncepe cu antetul funciei principale:
int main(void)
n continuare, se deschide corpul funciei i se include declararea variabilelor.
Partea codat a programului ncepe n corespundere cu schema algoritmului (blocul 2)
operatorul antet al buclei externe:
for (n=0; n<5; n++) {
n corpul buclei se tiprete antetul tabelului (blocul 3) cu operatorii:
printf("|
X
|
Y
|\n");
printf("|------------|------------|\n");
Apoi se deschide bucla intern (bloc 4). Parametrul acestei bucle valoarea abcisei x ia
valorile de la 0 pn la 3,75 cu pasul 0,25:
for (x=0; x<4; x+=0.25) {
Blocul 5 din schema algoritmului (verific din ce segment face parte x ) se realizeaz cu
ajutorul instruciunii condiionale:
if (x<1)
n cazul ndeplinirii acestei condiii, valoarea variabilei y se calculeaz (blocul 8) conform
ecuaiei pentru prima dreapt:
y=0*x+1;
n caz contrar, blocul 6 din schema algoritmului se realizeaz cu operatorul condiional:
else if (x<2)
n caz de ndeplinire a condiiei, valoarea ordonatei se calculeaz (blocul 9) dup condiia
pentru semicerc:
y=1-sqrt(1-(x-2)*(x-2));
Funcia sqrt() este descris n fiierul math.h, deoarece acest fiier se include la nceputul
programului:
#include <math.h>
Pentru segmentul trei, se execut verificarea conform blocului 7:
4

else if (x<3)
n caz de adevr, se ndeplinete condiia pentru a doua dreapt (blocul 11):
y=7-2*x;
n caz contrar, are loc ptrunderea pe ultimul segment, calcularea ordonatei se realizeaz
conform blocului 10:
y=-1+sqrt(1-(x-4)*(x-4));
n bucla interioar, se fac calcule pentru o perioad a funciei, ns bucla extern se va repeta
de 5 ori. Valoarea real a abcisei cu calculul buclei externe alctuiete x+4n. Avnd calculat
abcisa i ordonata graficului, datele de ieire se afieaz (blocul 12). Mai nti de toate, se extrage
rndul tabelului:
printf("| %5.2lf | %10.7lf | ",x+n*4,y);
Specificarea formatului este ales n aa mod, ca valorile x i y s fie extrase n coloan.
Parametrii numerici specificai %lf trebuie s asigure prezentarea valorilor x i y cu o exactitate
suficient. Funcia printf() este descris n fiierul stdio.h, de aceea noi includem acest fiier la
nceputul programului:
#include <stdio.h>
Urmtorul pas extragerea n acelai rnd a punctului graficului. Dup extragerea rndului
tabelului, n rndul ecranului au rmas 57 de locuri semn goale. Pe acest spaiu urmeaz s
prezentm valorile y de la -1 pn la +1. Dac coeficientul scar ea valoarea 10, amplitudinea
graficului const din 20 locuri semn ndeajuns pentru ilustrarea prezentrii. Scalarea valorii
ordonatei se ndeplinete cu operatorul:
h=(y+1)*10;
(Valoarea aleas pentru coeficientul de scalare - 10 poate fi modificat la ajustare).
La realizarea ultimului operator, se pierde partea fracionar. ntruct printre funciile
bibliotecii limbajului C nu exist funcie de rotunjire exact, noi realizm o astfel de rotunjire
singuri:
if ((y+1)*10-h)>0.5) h++;
n continuare, n rndul ecranului se extrage (blocul 14-15) numrul necesar de lacune.
Valoarea h n bucl funcioneaz ca un contor de scdere.
for (; h>0; h--) printf(" ");
se afieaz simbolul '*' i are loc trecerea la rndul nou al ecranului:
printf("*\n");
Cu aceasta se finiseaz bucla interioar.
Dup ieirea din bucla intern, afim mesajul pentru operator:
printf("Activai tasta Enter...");
i se ateapt apsarea tastei:
getchar();
5

Cu aceasta se finiseaz bucla extern, apoi corpul funciei main().


Textul integral al programului este prezentat n fig. 7.3.

Fig. 7.3. Textul programului

Ajustarea programului
Pentru ajustarea programului prezentat, urmeaz a efectua urmtoarele etape:
verificarea organizrii corecte a buclelor externe i interne;
verificarea funcionrii corecte a condiiilor;
verificarea calculrii corecte a valorii ordonatei pe cele patru segmente;
de verificat afiarea corect a graficului pentru fiecare segment.
Rezultatele derulrii programului
Sunt prezentate numai o parte din rezultatele obinute la ecran dup derularea programului
(pentru o perioad a funciei). Celelalte rezultate se repet raportate fa de alte valori ale variabilei
x.

Fig. 7.4. Rezultatele furnizate de program

7.4. ntrebri, probleme i discuii


1. Cum se execut o instruciune repetitiv?
2. Ce reprezint o bucl plasat? Explicai particularitatea buclelor plasate.
3. Ce destinaie are instruciunea for?
4. S se tabeleze funcia f(x) pe intervalul [x1,x2] cu pasul x, dac:
a) f(x) = ln(x+2), x1 = -1, x2 = 1, h = 0,2;
20 3x 2 , x 4
b) f(x) =
, x1 = -4, x2 = 4, h = 0,2;
16 x / 3, x 4
5. Se d un ir de n numere ntregi. S se extrag subirul de dimensiune maxim, ordonat cresctor.
6. Este cunoscut numrul natural N. Determinai cea mai mare cifr i poziia ei n numr (N =
254.861, cea mai mare fiind cifra 8, poziia ei a patra din stnga).

You might also like