Sunteți pe pagina 1din 10

PROGRAMARE 1

LUCRAREA NR. 4

Lucrarea de laborator nr. 4 TABLOURI I FUNCII.


1. Declaraia / definiia unui tablou Tabloul este o mulime ordonat de elemente la care ne putem referi cu ajutorul unor indici. Orice tablou are un nume, iar tipul comun al elementelor este tipul tabloului. n limbajul C exist doar tablouri unidimensionale. Tablourile multidimensionale sunt considerate tot tablouri unidimensionale n care fiecare element este la rndul su un tablou. Declaraia unui tablou unidimensional este de forma: T nume[dim]; unde : T nume dim este unul din tipurile existente qin limbaj este numele tabloului este o valoare constant care reprezint numrul de elemente din tablou.

Orice declaraie de tablou se termin cu ;. Dup declarare, dac nu au fost iniializate, elementele tabloului au valori nedefinite. La definirea unui tablou se aloc o zon de memorie necesar pentru a memora elementele tabloului. La primul element ne vom referi prin nume[0], la al doilea prin nume[1]...la ultimul prin nume[dim-1], deci indicele de parcurgere a tabloului variaz intre 0 i dim-1. Determinarea numrului de octei rezervai tabloul identificat prin nume se face prin utilizarea expresiei: sizeof(nume) Rezultatul acestei expresii trebuie s coincid cu valoarea dat de expresia: dim * sizeof(T) Exemplu 1. Definirea unui tablou unidimensional cu 10 elemente de tip ntreg cu semn al crui nume este a. Int a[10]; 1

PROGRAMARE 1

LUCRAREA NR. 4

Pentru acest tablou se vor rezerva, la compilare, 10*sizeof(int) octei. sizeof(a) va avea acelai rezultat. Se pot declara mai multe tablouri cu acelai tip de elemente pe aceeai linie, caz n care se folosete separatorul virgul. Exemplu 2. Definirea a trei tablouri cu elemente de tip real simplu (float). float a[15], b[5], vector[20]; i n cazul definirii tablourilor se recomand definirea unui singur tablou pe o linie pentru a da posibilitatea inserrii de comentarii pentru buna documentare a programului. Tablourile care au ca elemente alte tablouri sunt de fapt tablouri multidimensionale, astfel definiia: double mat[2][3]; este un tablou cu dou elemente, n care fiecare element este un tablou de trei elemente de tip real dublu. (Gndii-v c acest tablou este o matrice cu dou linii, iar fiecare linie are trei elemente de tip real dublu). Pentru cazul general T nume[dim1][dim2]...[dimn]; unde nume este numele unui tablou cu dim1 elemente, n care fiecare din cele dim1 este un tablou cu dim2 elemente, n care fiecare din cele dim2 elemente este un tablou ..., iar T este tipul elementelor din tablou de dimensiune dimn.

2. Funcii
2.1. Antetul unei funcii O funcie este o entitate care prelucreaz informaie ntr-un program. Pentru o funcie putem construi urmtoare diagram:

PROGRAMARE 1

LUCRAREA NR. 4

Date de intrare

Funcie

Date de ieire

tip_f

numeFunctie (tip1 nume1, tip2 nume2, ..., tipn numen) Antet, interfa
Figura 1. Diagrama asociat unei funcii

Astfel putem privi funcia (identificat prin numeFunctie) ca o cutie care conine un mecanism care prelucreaz informaiile primite la intrare, numite i date de intrare. Lista cu tipul i, eventual, numele asociate fiecrei date de intrare sunt indicat n antetul funciei, ntre paranteze, dup numele funciei (nscris cu verde n Figura 1). Lista cu tipul i numele informaiilor de la intrare se mai numete i lista cu parametri formali pentru funcie. O funcie poate primi la intrare una sau mai multe informaii sau nicio informaie. La ieire, funcia furnizeaz rezultatul prelucrrilor. n antetul funciei se specific doar tipul informaiei care "iese" din funcie (tip_f nscris cu rou n Figura 1). La ieire funcia poate furniza cel mult o informaie. Tipul informaiei furnizate de funcie n exterior d tipul funciei. n cazurile n care fie funcia nu primete informaii din exterior (lista de parametri este vid), fie funcia nu furnizeaz informaii n exterior se specific acest lucru prin folosirea cuvntului cheie void. Observaie: o funcie nu poate furniza n exterior un tablou, deci nu poate avea tipul tablou. Exemplu 3. a) antetul unei funcii al crui nume este suma i care primete din exterior dou informaii de tip real dublu i furnizeaz n exterior un rezultat de tip ntreg: int suma(double a, double b)

PROGRAMARE 1

LUCRAREA NR. 4

b) antetul unei funcii al crui nume este lama i care nu primete nici o informaie din exterior i furnizeaz n exterior un rezultat de tip char: char lama(void) c) antetul unei funcii al crui nume este citesteVector i care primete din exterior dou informaii una referitoare la un ntreg cu semn i cealalt referitoare la un tablou de reali dubli i nu furnizeaz n exterior niciun rezultat: void citesteVector(int n, double a[]) 2.2. Declaraia (prototipul) unei funcii Declaraia unei funcii se gsete ntr-un fiier header (sau antet) i este compus din antetul funciei (Figura 1) urmat de semnul de caracterul ;. Prototipul unei funcii nu "spune" cum prelucraz funcia informaiile primite, ci indic numai legaturile sale cu exteriorul. Exemplu 4. Prototipurile funciilor din Exemplu 3. sunt: a) int suma(double a, double b); b) char lama(void); c) void citesteVector(int n, double a[]); 2.3. Definiia unei funcii Definiia unei funcii se va gsi ntotdeauna ntr-un fiier cu cod surs i este format din antetul funciei urmat de un bloc n care se gsete algoritmul, exprimat n limbajul de programare C, care descrie modul n care funcia realizeaz prelucrrile informaiei primite din exterior. Blocul ncepe ntotdeauna cu caracterul { i se ncheie cu }. Variabilele (de orice tip) definite n interiorul unei funcii sunt locale funciei respective i nu sunt recunoscute n afara funciei, iar modificrile fcute asupra variabile din interiorul funciei, ct i asupra parametrilor de intrare se vor pierde la ieirea din funcie. De aceea, rezultatul pe care funcia trebuie s-l trimit n exterior trebuie returnat prin folosirea instruciunii return. Forma general a aceste instruciuni este: return expresie; Observaie: modificrile fcute asupra elementelor unui tablou se pstreaz i dup ieirea din funcie.

PROGRAMARE 1

LUCRAREA NR. 4

Exemplu 5. Dac funcia cu prototipul din Exemplu 4.a). trebuie s calculeze partea ntreag a sumei celor doi reali primii care parametri de intrare atunci definiia respectivei funcii este: int suma(double a, double b) { int s; s = floor(a+b); return s; } n exemplul dat mai sus partea scris cu rou reprezint blocul (sau corpul funciei), iar floor este o funcie care calculeaz aproximarea prin lips a unui real (funcie existent n biblioteca matematic). Observaie: nu putem avea acelai nume pentru o funcie i pentru o variabil.

Pentru rezolvarea corect a problemelor ce urmeaz v rog s citii cu atenie fiecare enun de la nceput pn la sfrit. Rezolvrile se fac folosind proiecte i fr variabile globale. TEMA 1
Problema 1.1. S se scrie un program care citete de la tastatur un numr ntreg n i dou seturi de cte n elemente de tip ntreg, fiecare set fiind stocat ntr-un tablou unidimensional cu maxim 30 de elemente, afieaz cele dou tablouri, calculeaz tabloul (vectorul) sum i afieaz vectorul rezultat. Rezolvarea trebuie s conin funcii scrise pentru: citirea de la tastatur a unui vector, afiarea pe monitor a unui vector, calculul vectorului sum. (se scrie funcie pentru citirea unui vector, care se apeleaz n aceast problem de dou ori). Observaie: problema se bazeaz pe exemplele de la curs. Problema 1.2. S se scrie un program care citete de la tastatur un tablou de maximum 20 de numere ntregi, determin maximul, minimul, media aritmetic i media geometric i 5

PROGRAMARE 1

LUCRAREA NR. 4

afieaz rezultatele. Pentru media geometric se va folosi funcia pow (al crui prototip este: double pow(double x, double y); /* returneaz x la puterea y */ i se gsete n MATH.H. Se vor scrie funcii adecvate pentru citirea unui vector, scrierea unui vector, calcularea maximului dintre elementele unui vector, calcularea minimului dintre elementele unui vector, calcularea mediei aritmetice a valorilor elementelor unui vector, calcularea mediei geometrice a valorilor elementelor unui vector. Problema 1.3. S se scrie un program care citete de la tastatur un tablou de maximum 30 de numere ntregi, afieaz pe monitor vectorul citit, ordoneaz elementele vectorului cresctor prin metoda bulelor i afieaz rezultatul pe monitor. Se vor scrie funcii pentru citirea unui vector de numere ntregi, scrierea unui vector de numere ntregi i ordonare prin metoda bulelor. Schema logic a programului care ordoneaz cresctor un vector este dat n Figura 2, iar schema logic a funciei pentru sortarea prin metoda bulelor este dat n Figura 3.

START

Citeste n

CitesteVector D.I.: a, n D.E.:-

AfiseazaVector D.I.: a, n D.E.: SorteazaVector D.I.: a, n D.E.: AfiseazaVector D.I.: a, n D.E.: STOP

Figura 2. Schema logic a programului de ordonare (sortare) n sens cresctor a elementelor unui vector

PROGRAMARE 1
SorteazaVector D.I.: a, n D. E.: Limita pn la care se face parcurgerea vectorului lim <- n-1 1 ok <- 0 ncepe parcurgerea vectorului i <- 0

LUCRAREA NR. 4

Variabila ok indic dac s-au fcut interschimbri la parcurgerea vectorului ok = 0, dac nu sunt interschimbri (vectorul este sortat) ok = 1, dac sunt interschimbri la parcurgerea vectorului

NU

i < lim NU

DA

Compararea a dou elemente alturate lund n considerare valoarea lor DA

lim <- lim - 1 NU DA

ai>ai+1

ok = 1

aux <- ai ai <- ai+1 ai+1 <- aux ok <- 1

Return

Trecerea la urmtorul element din vector i <- i+1

Figura 3. Schema logic a funcie de sortare n sens cresctor a elementelor unui vector (folosete sortarea prin metoda bulelor)

TEMA 2
Problema 2.1. n urma unor msurtori fcute n cadrul unui experiment rezult un ir de n date experimentale (de tip real) care se memoreaz ntr-un vector (tablou unidimensional) x. Prelucrarea acestor date experimentale nseamn: a. calcularea valorii medii cu formula
xm = 1 n 1 xi n i =0

b. calcularea abaterii medii ptratice cu formula:

PROGRAMARE 1

LUCRAREA NR. 4

xp =

(x x ) n(n 1)
i =0 i m

n 1

c. afiarea numrului de componente care nu depesc valoarea medie d. crearea unui alt vector y cu elementele din x mai mari dect valoarea medie i afiarea vectorului y cu cte 5 elemente pe o linie. S se scrie un program pentru a putea prelucra datele experimentale obinute. Pentru rezolvarea problemei se vor folosi funcii pentru: 1. citirea unui ir de numere cu prototipul: void citesteRVector(double a[], int n); 2. afiarea unui ir de numere cu prototipul: void scrieRVector(double a[], int n); 3. fiecare din cele 4 tipuri de prelucrri (cte o funcie pentru fiecare prelucrare). Aceste funcii vor returna rezultatul calculat, scrierea rezultatului pe monitori fcndu-se n funcia main. Pentru punctul d se vor scrie dou funcii: una pentru crearea vectorului y avnd ca date de intrare vectorul x, numrul de elemente din x i vectorul y i ca date de ieire numrul de elemente din y i cea de a doua pentru scrierea unui vector cu cte 5 elemente pe o linie. Prototipurile funciilor se vor gsi ntr-un fiier header dup modelul dat la curs. Problema 2.2. Se citete de la tastatur un numr natural n (n cel mult egal cu 100) i un ir de n numere ntregi.. irul de numere se memoreaz ntr-un tablou. S se afieze elementele distincte. Exemplu: n irul 2 2 5 4 5 1 2 elementele distincte sunt 2 5 4 1. Se vor scrie funcii pentru: 1. citirea unui ir de numere cu prototipul (de la problema anterioar): void citireIVector(int a[], int n); // funcia returneaz numrul de elemente efectiv citite 2. afiarea unui ir de numere cu prototipul (de la problema anterioar): void afisareIVector(int a[], int n); 3. determinarea irului cu elemente distincte cu prototipul:

PROGRAMARE 1

LUCRAREA NR. 4

int distinct(int a[], int b[], int n); // funcia are ca parametri de intrare irul iniial (a), irul final (cu elemente distincte b) i numrul de elemente din irul iniial n i returneaz numrul de elemente din irul final. 4. funcie care verific dac un element se gsete sau nu ntr-un vector. Funcia returneaz valoarea 1 dac elementul se gsete n vector i 0 n caz contrar. Prototipul funciei este: int gasit(int a[], int n, int el); n care a este vectorul n care se caut, n numrul de elemente din aceste vector i el este elementul care se caut. Prototipurile funciilor se vor gsi ntr-un fiier header dup modelul dat la curs. Problema 2.3. n cadrul unui laborator de analize medicale se fac msurtori care privesc modul n care evolueaz n timp concentraia unei anumite componente n proba de laborator analizat. Pentru aceasta se noteaz pe o fi concentraia i momentul de timp corespunztor (considernd momentul de nceput al analizei ca moment zero). Se obin astfel dou iruri de valori: (i) irul cu valorile momentelor de timp i (ii) irul cu valorile concentraiilor la aceste momente de timp. Se cere s se scrie un program care citete cele dou iruri de valori (care sunt numere reale) i afieaz coeficienii dreptei de regresie sau afieaz un mesaj corespunztor dac acetia nu pot fi calculai. Dreapta de regresie valoarea expresiei
E =
n 1 i =0

x = a * t + b are proprietatea c pentru punctele din plan

(x

a t i b)

este minim, unde n este numrul de msurtori fcute. Coeficienii a i b se determin prin rezolvarea sistemului:
n 1 n 1 ( ) (x i ) + = n a b t i i =0 i =0 n 1 n 1 a (t i ) + b (t i t i ) = i =0 i =0

(t
i =0

n 1

xi )

Pentru rezolvarea problemei se vor scrie urmtoarele funcii: a. funcie pentru citirea unui vector b. funcie pentru afiarea unui vector (Aceste dou funcii sunt cele scrise pentru rezolvarea problemei 1) 9

PROGRAMARE 1

LUCRAREA NR. 4

c. funcie pentru rezolvarea unui sistem de dou ecuaii cu dou necunoscute. Aceast funcie are doi parametri: un tablou cu 6 elemente coninnd coeficienii celor dou ecuaii; un tablou cu dou elemente coninnd soluiile sistemului i returneaz rezultatul: 1 dac sistemul este compatibil determinat 2 dac sistemul este compatibil nedeterminat 3 dac sistemul este incompatibil d. funcie care calculeaz produsul scalar a doi vectori a i b. Funcia are ca pearametri cei doi vectori i numrul de elemente al unui vector i returneaz valoarea produsului scalar. Pentru calculul sumei valorilor elementelor unui vector folosind funcia produs scalar unul din vectori va fi un vector iniializat cu uniti. Observaie: Toate sumele se vor calcula folosind funcia produs scalar. Prototipurile funciilor se vor gsi ntr-un fiier header dup modelul dat la curs.

10