17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Definirea si utilizarea de functii<br />

Un program bine scris este o colectie de functii relativ mici, dintre care unele vor fi<br />

reutilizate si <strong>în</strong> alte aplicatii asemãnãtoare.<br />

O functie nu trebuie sã depãseascã cam o paginã de text sursã (cca 50 linii) din mai<br />

multe motive: o functie nu trebuie sã realizeze roluri ce pot fi împãrtite <strong>în</strong>tre mai multe<br />

functii, o functie nu trebuie sã aibã prea multe argumente, o secventã prea lungã de<br />

cod sursã este mai greu de stãpânit.<br />

Programele reale totalizeazã sute si mii de linii sursã, deci numãrul de functii din<br />

aceste programe va fi mare, iar functiile trebuie sã comunice. Pe de altã parte,<br />

transmiterea de rezultate prin argumente pointer <strong>în</strong> C nu este cea mai simplã si nici cea<br />

mai sigurã solutie pentru programatorii <strong>în</strong>cepãtori. Solutia argumentelor referintã din<br />

C++ a fost preluatã si de unele compilatoare C pentru cã este simplã si sigurã.<br />

Stabilirea functiilor din componenta unui program este parte din activitatea de<br />

proiectare (elaborare) ce precede scrierea de cod. Vom schita prin exemple abordarea<br />

de sus <strong>în</strong> jos (‘top-down”) <strong>în</strong> proiectarea programelor, prin douã exemple nu foarte<br />

mari dar nici banale.<br />

Primul exemplu este un preprocesor pentru directive “define” <strong>în</strong>tr-o formã mult<br />

simplificatã. Acest program citeste un fisier cu un text sursã C care poate contine<br />

directive “define” si produce un alt fisier C fãrã directive “define”, dar cu macrosubstitutiile<br />

efectuate <strong>în</strong> text. O directivã “define” asociazã unui identificator un alt sir<br />

de caractere, care poate include si spatii. Exemplu:<br />

#define byte unsigned char<br />

Preprocesorul va <strong>în</strong>locui <strong>în</strong> textul sursã care urmeazã acestei directive identificatorul<br />

“byte” prin sirul “unsigned char”, indiferent de câte ori apare.<br />

Logica de lucru a programului propus poate fi descrisã astfel:<br />

repeta pentru fiecare linie din fisier<br />

daca este directiva define retine intr-un tabel cele doua siruri<br />

daca nu este directiva define atunci<br />

repeta pentru toata linia<br />

cauta urmatorul identificator<br />

daca este in tabelul de directive define atunci<br />

inlocuieste identificator prin sirul echivalent<br />

De remarcat cã algoritmul descris este mult mai eficient decât un algoritm care ar<br />

folosi functia de bibliotecã “strstr” pentru a cãuta fiecare identificator <strong>în</strong> textul sursã,<br />

deoarece nu orice sir este un identificator; un identificator este un sir format numai din<br />

litere si/sau cifre si care <strong>în</strong>cepe obligatoriu cu o literã.<br />

Rezultã ca ar fi utilã definirea unor functii pentru urmãtoarele operatii:<br />

- introducere si respectiv cãutare <strong>în</strong> tabelul cu identificatori si siruri echivalente (doi<br />

vectori de pointeri <strong>în</strong> implementarea propusã);<br />

- cãutarea urmãtorului identificator <strong>în</strong>cepând de la o adresã datã;<br />

- <strong>în</strong>locuirea unui subsir cu un alt sir la o adresã datã;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!