Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
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ã;