Documente Academic
Documente Profesional
Documente Cultură
Curs C
Curs C
PROGRAMAREA CALCULATOARELOR
Florentina MOCRIENCO
Daniela VLDOIU
2006
TEHNOLOGIA INFORMAIEI
Programarea calculatoarelor
Florentina MOCRIENCO
Dana VLDOIU
2006
2006
Ministerul Educaiei i Cercetrii Proiectul pentru nvmntul Rural Nici o parte a acestei lucrri nu poate fi reprodus fr acordul scris al Ministerului Educaiei i Cercetrii
Cuprins
CUPRINS
Unitatea de nvare Nr. 1 ................................................................................................. 1 DEFINIREA NOIUNILOR DE ALGORITM, PROGRAM I LIMBAJ DE PROGRAMARE Obiectivele Unitii de nvare 1 ..................................................................................... 1 1.1 Noiunea de algoritm ................................................................................................... 1 1.2 Propietile algoritmilor .............................................................................................. 4 1.3 Programe i limbaje de programare........................................................................... 8 1.3.1 Evoluia limbajelor de programare ................................................................ 9 1.3.2 Etapele realizrii programelor ...................................................................... 16 Rspunsurile corecte la testele de autoevaluare.......................................................... 20 Bibliografie....................................................................................................................... 20 Lucrarea de verificare Nr. 1, notat de tutore ............................................................... 21 Unitatea de nvare Nr. 2 ............................................................................................... 22 PRINCIPIILE PROGRAMRII STRUCTURATE Obiectivele Unitii de nvare 2 ................................................................................... 22 2.1 Reprezentarea algoritmilor ....................................................................................... 22 2.2 Elemente de programare structurat ....................................................................... 26 2.3 Structuri de control utilizate n programarea structurat ...................................... 29 2.3.1 Secvena sau structura liniar ...................................................................... 29 2.3.2 Decizia sau structura alternativ .................................................................. 32 2.3.3 Ciclul sau structura repetitiv ....................................................................... 36 Rspunsuri corecte la testele de autoevaluare............................................................. 42 Bibliografie....................................................................................................................... 42 Lucrarea de verificare Nr. 2, notat de tutore ............................................................... 43 Unitatea de nvare Nr. 3 ............................................................................................... 44 STRUCTURA PROGRAMELOR N LIMBAJUL C. TIPURI DE DATE, OPERATORI I EXPRESII Obiectivele Unitii de nvare 3 ................................................................................... 44 3.1 Privire de ansamblu asupra limbajului C................................................................. 44 3.2 Structura programelor n limbajul C ........................................................................ 46 3.3 Variabile, tipuri de variabile i declarare ................................................................. 51 3.4 Constante ................................................................................................................... 54 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg.............................. 57 3.6 Operatori n C............................................................................................................. 60 3.6.1 Operatorul de atribuire ................................................................................. 60 3.6.2 Operatori aritmetici....................................................................................... 61 3.6.3 Operatori relaionali i logici ......................................................................... 65 3.6.4 Operatori de atribuire compus.................................................................... 67 3.6.5 Operatorul de conversie explicit (cast) ....................................................... 68 3.6.6 Operatorul sizeof.......................................................................................... 68 3.6.7 Operatorul virgul (,) .................................................................................. 69
Proiectul pentru nvmntul Rural
Cuprins
3.6.8 Operatorul condiional (?) .............................................................................69 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ...........72 Bibliografie .......................................................................................................................72 Lucrarea de verificare Nr. 3, notat de tutore................................................................73 Unitatea de nvare Nr. 4 ...............................................................................................76 CITIREA I SCRIEREA DATELOR Obiectivele Unitii de nvare 4 ....................................................................................76 4.1 Noiuni introductive ...................................................................................................76 4.2 Funcia de scriere cu format .....................................................................................77 4.3 Funcia de citire cu format ........................................................................................81 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ...........86 Bibliografie .......................................................................................................................87 Lucrarea de verificare Nr. 4, notat de tutore................................................................87 Unitatea de nvare Nr. 5 ...............................................................................................89 INSTRUCIUNILE LIMBAJULUI C / C++ Obiectivele Unitii de nvare 5 ....................................................................................89 5.1 Instruciunea expresie ...............................................................................................89 5.2 Instruciunea compus ..............................................................................................90 5.3 Instruciunea if ..........................................................................................................90 5.4 Instruciunea switch ..................................................................................................93 5.5 Instruciunea break ....................................................................................................94 5.6 Instruciunea while.....................................................................................................94 5.7 Instruciunea do-while ...............................................................................................95 5.8 Instruciunea for.........................................................................................................97 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru............................100 Bibliografie .....................................................................................................................100 Lucrarea de verificare nr.5, notat de tutore ...............................................................101 Unitatea de nvare Nr. 6 .............................................................................................103 TABLOURI Obiectivele Unitii de nvare 6 ..................................................................................103 6.1 Tablouri unidimensionale........................................................................................104 6.2 Pointeri......................................................................................................................111 6.3 iruri de caractere ...................................................................................................115 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii .........121 Bibliografie .....................................................................................................................121 Lucrarea de verificare Nr. 6, notat de tutore..............................................................122
ii
Cuprins
Unitatea de nvare Nr. 7 ............................................................................................. 123 FIIERE N LIMBAJUL C++ Obiectivele Unitii de nvare 7 ................................................................................. 123 7.1 Declararea fiierelor ................................................................................................ 123 7.2 Deschiderea fiierelor ............................................................................................. 124 7.3 Citirea datelor dintr-un fiier .................................................................................. 125 7.4 Scrierea datelor ntr-un fiier.................................................................................. 126 7.5 Operaii de test ........................................................................................................ 126 7.6 nchiderea unui fiier............................................................................................... 127 Rspunsuri corecte la testele de autoevaluare........................................................... 129 Bibliografie..................................................................................................................... 130 Lucrarea de verificare nr. 7, notat de tutore ........................................................ 130 Unitatea de nvare Nr. 8 ............................................................................................. 132 FUNCII Obiectivele Unitii de nvare 8 ................................................................................. 132 8.1 Funcii nerecursive.................................................................................................. 132 8.1.1 Definirea unei funcii ............................................................................................... 133 8.1.2 Declararea funciilor................................................................................................ 134 8.1.3 Apelul funciilor ....................................................................................................... 135 8.1.4 Variabile globale i variabile locale ......................................................................... 140 8.2 Funcii recursive...................................................................................................... 145 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru ........................... 153 Bibliografie..................................................................................................................... 155 Lucrarea de verificare Nr. 8, notat de tutore ............................................................. 156 ANEXE Laboratorul 1.................................................................................................................. 159 Laboratorul 2.................................................................................................................. 168 Laboratorul 3.................................................................................................................. 171 Laboratorul 4.................................................................................................................. 176 Laboratorul 5.................................................................................................................. 183 Laboratorul 6.................................................................................................................. 189 Laboratorul 7.................................................................................................................. 194 BIBLIOGRAFIE............................................................................................................... 201
iii
Introducere
INTRODUCERE
Manualul de Programarea calculatoarelor este structurat astfel nct s ofere cursanilor cunotinele necesare pentru a fi capabili s neleag i s foloseasc un limbaj de programare n scopul rezolvrii unor probleme cu ajutorul calculatorului. n elaborarea acestuia s-a urmrit abordarea ct mai complet i mai adecvat a tematicii cuprinse n programele colare ale disciplinelor de profil din nvmntul preuniversitar pentru a oferi cursanilor posibilitatea de a preda aceste discipline la orice nivel. Noiunile sunt prezentate gradat, punndu-se accent pe nelegerea i aplicarea acestora n practic. Se recomand ca n procesul de predare nvare, activitatea s fie orientat pe probleme: analiza unor situaii practice (generale sau specifice unui anumit domeniu), identificarea fluxului informaional, elaborarea unui model algoritmic de rezolvare, implementarea i testarea rezolvrii cu ajutorul limbajului de programare C i C++. Datorit caracterului pregnant aplicativ al disciplinei, se recomand desfurarea orelor ntr-o sal dotat cu un numr suficient de sisteme de calcul, astfel nct pe un sistem de calcul s lucreze cel mult doi cursani. Evaluarea activitii cursanilor se va face att pe baza activitii practice desfurate n timpul semestrului (sarcini de lucru, rezolvarea de probleme n laborator i teme de cas), ct i prin susinerea unui examen final. Bibliografia de baz va cuprinde manuale, culegeri de probleme, programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar, resurse WWW.
Obiectivele modulului
Dup studiul modulului Programarea calculatoarelor, vei reui s:
programare n rezolvarea problemelor. Exprimai un mod de gndire creativ, n structurarea i rezolvarea problemelor. V formai obisnuinele de a recurge la concepte i metode informatice de tip algoritmic specifice n abordarea unei varieti de probleme. Avei capacitatea de a nelege i folosi elementele de baz ale limbajului de programare C i C++. Avei abilitatea de a rezolva probleme complexe prin organizarea corespunztoare a programelor sub forma de proiect. Manifestai iniiativ i disponibilitatea de a aborda sarcini variate. V adaptai abilitile pedagogice la domeniul specific Programrii calculatoarelor.
Proiectul pentru nvmntul Rural
iv
Introducere
Modulul Programarea calculatoarelor, este integrat domeniului Tehnologia Informaiei i face parte din categora disciplinelor opionale de specialitate studiate n semestrul al III lea. Din totalul de 56 de ore destinat modulului, 75% din ore sunt alocate aplicaiilor practice.
Unitatea de nvare este o parte component a modulului de studiu, care are urmtoarele caracteristici: Integreaz competene specifice Determin formarea unui anumit comportament al cursantului, generat prin integrarea unor competene specifice Este unitar din punct de vedere tematic Se desfoar n mod sistematic Se finalizeaz prin evaluare.
Modulul este structurat pe urmtoarele opt uniti de nvare: DEFINIREA NOIUNILOR DE ALGORITM, PROGRAM I LIMBAJ DE PROGRAMARE PRINCIPIILE PROGRAMRII STRUCTURATE STRUCTURA PROGRAMELOR N LIMBAJUL C. TIPURI DE DATE, OPERATORI I EXPRESII CITIREA I SCRIEREA DATELOR INSTRUCIUNILE LIMBAJULUI C / C++ TABLOURI FIIERE N LIMBAJUL C++ FUNCII
Construirea competenelor
Pentru fiecare unitate de nvare din acest modul, am construit cteva competene din perspectiva competenelor generale vizate de domeniul de studiu. Formarea lor este urmrit sistematic, pe parcursul fiecrei uniti de nvare, iar pentru a determina gradul de formare a competenelor specifice, la sfritul fiecrei uniti de nvare sunt prevzute lucrri de evaluare. Coninuturile sunt informaiile de diverse tipuri, transmise prin intermediul textului tiprit, al bibliografiei recomandate, al altor forme de transmitere precum Internet-ul, casete audiu sau video, CD-uri. Coninuturile acestui modul au fost alese astfel nct s rspund competenelor specifice anterior formulate.
Construirea coninuturilor
Introducere
Tem de reflecie Identificai cu ajutorul cuprinsului unitile de nvare ale modulului, apoi citii titlurile i obiectivele fiecrei uniti. Cursurile destinate Proiectului pentru nvmntul Rural au forme grafice asemntoare. Astfel, pe fiecare pagin, n partea dreapt a fost prevzut un spaiu alb care are un rol dublu, i anume:
vi
Introducere
Exist sarcini de lucru care necesit un rspuns. Pentru acestea am lsat un spaiu n care putei scrie. Dac acest spaiu este prea mic n comparaie cu necesitile, atunci rspunsurile se pot da pe foi de hrtie, care pot fi ataate ulterior cursului. Este util s rspunzi cu consecven la ntrebrile formulate, imediat dup ce ai parcurs coninuturile tematice. n acest fel, i este mult mai uor s sintetizai materia parcurs i s te pregtiti pentru a rspunde la sarcinile de lucru, la lucrrile de verificare notate de tutore, precum i la evaluarea final. Dac avei neclariti n legtur cu sarcinile de lucru propuse, poi folosi sugestiile de rezolvare ale acestora, care se afl la sfritul fiecrei uniti de nvare. Pentru a identifica mai uor rspunsurile, am numerotat sarcinile de lucru ale fiecrei uniti de nvare cu numere succesive. Atenie! Este recomandat s se pstreze legtura cu tutorele, cruia s i adresezi ntrebri, la una din ntlniri prevzute prin program. n fiecare secven a unitilor de nvare sunt formulate unul sau mai multe Sarcini de lucru. Ele sunt anunate prin simboluri i titluri specifice ca n exemplul urmtor.
Sarcin de lucru Enumer minim 3 uniti de nvare cuprinse n acest curs. Folosete spaiul liber de mai jos pentru rspuns.
Rspunsurile la aceste sarcini de lucru se gsesc la sfritul unitii de nvare respective, n seciunea Indicaii i rspunsuri i sunt asociate simbolului alturat.
vii
Introducere
Pentru modulul Programarea calculatoarelor, evaluarea are dou componente: evaluarea continu i evaluarea final. Evaluarea continu este o modalitate de apreciere a activitii cursantului, pe parcursul ntregului semestru. Evaluarea continu va fi fcut n principal pe baza Lucrrilor de verificare notate de tutore. Aceste teste se gsesc la sfritul fiecreia dintre unitile de nvare ale modulului i sunt anunate n cuprins. Prin lucrarea de verificare este evaluat gradul de ndeplinire a competenelor specifice fiecrei unitii de nvare. Pentru fiecare item de evaluare, sunt precizate modul n care trebuie formulat rspunsul i baremul de notare. Lucrrile de evaluare, rezolvate individual, vor fi transmise tutorelui n modul i la datele anunate la nceputul semestrului.
Atenie! Notele obinute prin transformarea punctajelor n note de la 1 la 10, n urma corectrii acestor lucrri de verificare, reprezint o parte important a evalurii continue.
Tem de reflecie Identificai cel puin trei lucrri de verificare - notate de tutore, pe care va trebui s le rezolvai. Folosii spaiul liber de mai jos, pentru a nota paginile la care se gsesc aceste lucrri.
O alt parte a evalurii continue provine din aprecierea activitii de-a lungul semestrului i din timpul ntlnirilor cu tutorele. Pentru aceasta, vor conta: respectarea calendarului de lucru, calitatea ntrebrilor formulate, modul n care colaborai cu tutorele, alte aspecte, dup caz. Pentru acest curs, forma de evaluare final este examenul. Evaluarea final i evaluarea continu contribuie fiecare la stabilirea notei pentru acest modul. n fixarea notei finale, evaluarea continu are ponderea de 60% din not, iar evaluarea final are ponderea de 40%. Nota minim pentru promovarea acestui modul este 5. viii
Proiectul pentru nvmntul Rural
Introducere
Evaluarea pe parcurs apreciaz activitatea desfurat de cursani n cadrul laboratorului (rezolvare de probleme) i modul de rezolvare a temelor de cas, repartizate uniform pe durata semestrului. Fiecare dintre aceste doua subcomponente are pondere de 30% n cadrul notei finale. Evaluarea final se realizeaz sub form de examen scris. Criteriile de evaluare utilizate sunt: corectitudinea i claritatea elaborrii algoritmului, folosirea corect i eficient a elementelor limbajului de programare, utilizarea unui stil adecvat de implementare, corectitudinea funcionrii aplicaiei, diversitatea i completitudinea metodelor de testare a funcionrii aplicaiei folosite.
Atenie! Pstreaz legtura cu tutorele pentru a obine alte indicaii sau precizri. Mult succes!
ix
Cuprins
Obiectivele Unitii de nvare 1 1.1 Noiunea de algoritm 1.2 Propietile algoritmilor 1.3 Programe i limbaje de programare 1.3.1 Evoluia limbajelor de programare 1.3.2 Etapele realizrii programelor Rspunsurile corecte la testele de autoevaluare Bibliografie Lucrarea de verificare Nr. 1, notat de tutore
Pagina
1 1 4 8 9 16 20 20 21
1.1
Noiunea de algoritm
Algoritmul este o noiune matematic foarte veche. Cuvntul algoritm este de origine arab. El deriv din numele matematicianului Abu Jafar Mohammed bn Ms al Horezmi care a scris o carte celebr intitulat Kitab al jabr wal - muquabala. Din titlul acestei cri provine cuvntul algebr. Termenul algorism era folosit n evul mediu cu nelesul de proces al efecturii operaiilor aritmetice cu ajutorul cifrelor arabe. Se presupune c din asocierea cuvntului algorism cu domeniul lui de referin, aritmetica, a rezultat termenul algoritm. ncepnd cu anul 1950, n toate manualele de specialitate, cuvntul algoritm era frecvent asociat cu procesul de aflare a celui mai mare divizor comun a dou numere naturale, aa
numitul algoritmul lui Euclid. De asemenea, regulile operaiilor aritmetice sunt denumite algoritmi de efectuare a operaiilor respective. Noiunea de algoritm nu are o definiie matematic. n aceeai situaie se afl i alte noiuni din matematic, cum ar fi noiunea de mulime. Prin algoritm se accept s se neleag un sistem de calcule, care, pentru o anumit clas de probleme, din condiiile iniiale ale problemei permite s se obin soluia problemei respective, cu ajutorul unui ir finit i ordonat de operaii univoc determinate, efectuate mecanic, fr aportul creator al omului. Un algoritm este compus din unul sau mai muli pai, un pas reprezentnd efectuarea unei singure operaii din irul celor care alctuiesc algoritmul.
Tabelul 1.2 Algoritmul se ncheie n momentul obinerii restului zero: rezultatul n acest caz este 6.
1.
naturale, mai puin zero (N* x N*). Aceast propietate este cunoscut i sub numele de universalitate. 3. Eficacitatea. Executarea unui algoritm urmrete ntotdeauna obinerea unui anumit rezultat. Pentru aceasta nu este suficient ca aciunile algoritmului s fie bine determinate, ci trebuie ca pentru orice sistem de date iniiale, numrul de aciuni (pai)ce trebuie executate s fie finit. De aceea, aceast propietate poart denumirea i de finitudine. La exemplele de algoritmi prezentate anterior s-a artat c numrul de pai corespunztori unui sistem oarecare de date iniiale este finit. Se poate spune, n concluzie, c un algoritm reprezint o secven finit de operaii, ordonat i complet definit, care, pornind de la o anumit valoare sau o mulime de valori ca date de intrare, produce o anumit valoare sau mulime de valori ca date de ieire.
Exemplul 1.2
S considerm o problem banal, din coala primar: Un dreptunghi are baza de 2,75 i nlimea de 1,4 uniti. Care sunt aria i perimetrul dreptunghiului? Enunul de mai sus furnizeaz persoanei care rezolv problema urmtoarele informaii: o o o o se are n vedere un dreptunghi; baza dreptunghiului este de 2,75 uniti; inlimea dreptunghiului este de 1,4 uniti; se cer aria i perimetrul dreptunghiului.
Definirea noiunilor de algoritm, program i limbaj de programare Vom considera c sistemul care rezolv problema primete pe un anumit "suport de intrare" (de exemplu pe o hrtie, n cazul omului, sau de la tastatur, n cazul calculatorului) dou numere reale, despre care noi tim c sunt baza i nlimea unui dreptunghi, dar el nu tie. Numim aceste numere date de intrare, deoarece ele sunt introduse de noi n sistem. Vom considera, de asemenea, c rezultatele obinute vor trebui scrise de sistem pe un alt suport, care poate fi citit de ctre om (de exemplu pe o hrtie sau pe un ecran), i le vom numi date de ieire, deoarece ele sunt transmise de sistem ctre exteriorul su. Pentru a "rezolva problema", sistemul trebuie s preia datele de intrare (fr s cunoasc semnificaia lor n problem), s verifice dac sunt valabile i s le nregistreze n memorie. Asupra lor trebuie s aplice apoi nite operaii de calcul, pe baza crora s obin rezultatele cerute. Aceste rezultate vor fi i ele nregistrate n memorie, atunci cnd sunt obinute. n fine, rezultatele trebuie transmise n exterior sub forma de date de ieire. Iat succesiunea de instruciuni care trebuie executate de ctre sistem pentru a rezolva problema dat: 1. Citete de pe suportul de intrare un numr real i nregistreaz-l n memorie ca valoare a variabilei b. 2. Citete de pe suportul de intrare un numr real i nregistreaz-l n memorie ca valoare a variabilei i. 3. Dac valoarea b este nul sau negativ sau dac valoarea i este nul sau negativ - atunci scrie pe suportul de ieire textul "datele de intrare sunt greite" si oprete executarea programului; - altfel treci la pasul urmtor. 4. nmulete valoarea b cu valoarea i i nregistreaz n memorie ca valoare a variabilei A. 5. Adun valoarea b cu valoarea i i nregistreaz rezultatul ca valoare a variabilei d. 6. nmulete valoarea d cu 2 i nregistreaz rezultatul ca valoare a variabilei p. 7. Scrie pe suportul de ieire textul "aria dreptunghiului este" urmat de valoarea variabilei A. 8. Scrie pe suportul de iesire textul "perimetrul dreptunghiului este " urmat de valoarea variabilei p. 9. Oprete executarea programului. Se observ imediat c, pentru a executa aceste instruciuni, sistemul nu trebuie s cunoasc problema, ci doar s "tie" modul n care se realizeaz fiecare operaie cuprins n ele: citire de pe suportul de intrare, scriere pe suportul de ieire, comparaie, memorare (nregistrare n memorie), nmulire, adunare, oprirea execuiei. Remarcm, de asemenea, c n aceste instructiuni se opereaz cu nite numere sau texte care nu au pentru sistem nici o alt semnificaie. Astfel de "materiale supuse prelucrarii" care nu au pentru sistem nici o alt semnificaie se numesc date, iar ansamblul tuturor instruciunilor (comenzilor) care trebuie executate astfel nct, pornind de la datele de intrare, s se obin datele de ieire, se numeste algoritm. Dac algoritmul se execut de ctre un calculator, fiecare dat (de intrare, de ieire sau rezultat intermediar) este nregistrat n memoria intern a acestuia la o anumit adres care este un numr. n consecin, instruciunea 1, de exemplu, ar fi trebuit scris astfel: Citete de pe suportul de intrare un numr real i nregistreaz-l n memorie la adresa 1724. La fel ar fi trebuit s procedm i cu celelalte date, fie ele de intrare, de ieire sau auxiliare. Evident c, pentru om, o astfel de notaie este foarte incomod. Din aceast cauz, n algoritmi i n programe se prefer s se foloseasc pentru indicarea locului n care se gsesc datele n memorie nite nume simbolice, numite variabile. Conversia acestor nume de variabile n adrese de memorie este una din sarcinile care revin compilatorului, atunci cnd genereaz programul binar. Este deci bine s reinem c, din punctul de vedere al compilatorului, variabilele sunt nume date adreselor de memorie la care sunt plasate anumite date.
Se obinuiete, de asemenea, ca instruciunile cuprinse n algoritm s fie scrise ntr-o form mai compact, reinnd numai cuvintele cheie i numele variabilelor i eliminnd cuvintele de prisos. Se obinuiete, de asemenea, ca operaiile aritmetice s fie scrise sub form de formule matematice i nu prin cuvinte. Procednd astfel, algoritmul de mai sus poate fi scris sub forma: 1. Citete b; 2. Citete i; 6
Proiectul pentru nvmntul Rural
3. Dac b<=0 atunci Scrie "datele de intrare sunt greite"; Stop; 4. Calculeaz A= b*i; 5. Calculeaz d=b+i; 6. Calculeaz p=d*2; 7. Scrie "aria dreptunghiului este " A; 8. Scrie "perimetrul dreptunghiului este " p; 9. Stop. Este evident c citirea se face de pe suportul de intrare i c datele citite se nregistreaz n memorie. Prin simbolul '<=' s-a notat operaia de comparaie "mai mic sau egal". Prin simbolul '=' s-a notat operaia de atribuire, prin care variabilei din partea stnga i se atribuie (i se d) valoarea din partea dreapta, iar prin simbolul '*' s-a notat operaia de nmulire. O observaie important este c algoritmul prezentat aici poate fi folosit oricnd este necesar s se calculeze aria i perimetrul unui dreptunghi, avnd ca date de intrare baza dreptunghiului i nlimea acestuia. Setul de date de intrare este constituit, n acest caz, din dou numere reale pozitive. Caracterul universal al algoritmului const n faptul c el poate fi aplicat oricrui astfel de set de date.
1.3
Avantajele utilizrii limbajelor de nivel nalt constau n: naturalee apropierea lor de limbajele naturale i/sau limbajul matematic; uurina de nelegere i utilizare; portabilitate posibilitatea ca acelai program s fie executat cu modificri minime pe calculatoare de tipuri diferite; eficiena n scriere, datorit facilitilor de definire de noi tipuri i structuri de date, operaii, etc.
Limbaje procedurale neprocedurale Cele dou tipuri de limbaje, procedurale i neprocedurale, se difereniaz prin nivelul de organizare (structurare) a unui program. Limbajele neprocedurale sunt concepute pentru a gndi un program la nivel de instruciune, pe cnd cele procedurale, oblig programatorul s conceap programe la nivel de bloc. ntr-un limbaj procedural (numit i limbaj structurat), programele sunt scrise instruciune cu instruciune, dar ele sunt organizate logic n blocuri (grupuri de instruciuni) ce realizeaz o aciune bine determinat. n general, un bloc are un punct de intrare i un punct de ieire nu mai multe. Un limbaj procedural ofer posibilitatea utilizrii unui nivel ridicat de concepere a unui program i duce la realizarea de programe coerente i protejate la erori. Prin contrast, limbajele neprocedurale nu favorizeaz programatorul n a se desprinde de nivelul instruciune i duc deseori la programe greu de controlat mai ales n cazul programelor de dimensiuni mari. Limbajele neprocedurale sunt nc preferate de unii utilizatori datorit timpului foarte scurt ct decurge nvarea i utlizarea lor. Limbaje orientate Din punctul de vedere al aplicabilitii unui limbaj, limbajele pot fi orientate pe o anumit problem sau concepute pentru soluionarea oricrui tip de problem limbaje de uz general sau altfel spus, neorientate pe o problem. Limbajele orientate prezint un grad nalt de specificitate, pe cnd un limbaj neorientat reprezint un cadru general ce permite introducerea de ctre utilizator a conceptelor i prelucrrilor dorite. Deci, diferena esenial dintre cele dou tipuri de limbaje o constitue nivelul conceptual definit. Cele specializate posed deja integral suportul necesar i permit programatorului s se concentreze la ansamblul problemei, pe cnd cele nespecializate las n sarcina programatorului manevrarea nivelelor inferioare ale problemei. Limbaje concurente Un limbaj concurent permite definirea de procese (prelucrri) paralele, execuia sa fiind ramificat la un anumit moment de timp. Prin contrast, limbajele neconcurente (majoritatea limbajelor) au o desfurare liniar, fiind activ un singur proces la un moment dat. Procesele concurente presupun n mod obligatoriu un sistem multi-tasking ce poate gestiona mai multe sarcini la un moment dat. Limbaje de nivel sczut. Aceast categorie de limbaje are un reprezentant autoritar, i anume: limbajul de asamblare. Diferenierile care se pot face pentru limbajele de nivel sczut sunt urmtoarele: a) dup tipul de main; Regulile respectate de versiunile limbajului de asamblare sunt: - o nou versiune o include complet pe cea anterioar, - versiunea nou ofer funcii suplimentare i le realizeaz pe cele vechi mai rapid. b) dup mediul de programare oferit. Aspectul unui limbaj poate fi schimbat radical de mediul de programare oferit. Pentru limbajul de asamblare exist mai multe implementri disponibile, ncepnd cu pachete ce opereaz n mod linie i culminnd cu medii integrate n care toate operaiile se pot declana de la un acelai pupitru de comand. Nu sunt luate n considerare dect aceste medii integrate (denumite generic medii Turbo), dintre care se detaeaz Turbo Asamblorul firmei Borland TASM.
10
Limbaje de nivel nalt neorientate. BASIC A fost creat n 1964 la Darmooth College (S.U.A.). Denumirea sa provine de la iniialele cuvintelor Beginners Allpurpose Symbolic Instruction Code (Cod de instruciuni simbolice, de uz general, destinat nceptorilor). Are urmtoarele caracteristici fundamentale: simplu de nvat; instruciunile sale sunt cuvinte din limba englez sau prescurtri ale acestora; neorientat pe un anumit tip de problem; permite construirea de aplicaii; este un limbaj nestructurat, ceea ce i permite s fie uor nvat. Deoarece a cunoscut o larg rspndire, au fost implementate noi versiuni de Basic: GW-BASIC, QUICK BASIC, TURBO BASIC, VISUAL BASIC (Basic for Windows). FORTRAN Limbajul Fortran este decanul de vrst al limbajelor de larg folosin. A aprut n 1956 i i datoreaz numele prescurtrii cuvintelor: FORmula TRANslation (Traducere de formule). Iniial reprezenta un limbaj orientat pe calcule tiinifice, avnd definite concepte precum: matrice, funcii trigonometrice, numere reale n dubl precizie. Versiunile ulterioare care au cunoscut o mare popularitate au extins posibilitile limbajului trasformndu-l ntr-un limbaj eficient, de uz general.n prezent exist pentru IBM-PC dou implementri mai importante ale limbajului: Microsoft Fortran, Fortran for Windows. Dei nu poate fi considerat depit din punct de vedere conceptual (este un limbaj algoritmic structurat) este neindicat folosirea lui datorit absenei unor medii de programare performante i pentru c tendina actual i este defavorabil. PASCAL Conceptualizat n anul 1970 de ctre Niklaus Wirth, limbajul PASCAL poart numele matematicianului i filosofului BLAISE PASCAL, n semn de recunoatere a meritelor sale n teoretizarea mainilor de calcul. Creat dup acumularea de cunotiine temeinice n tiina limbajelor formale, din confruntarea cu probleme concrete ale programrii, limbajul PASCAL a constituit la vremea respectiv un limbaj modern, meninndu-se ca atare i n prezent, datorit faptului c posed o solid baz conceptual. Limbajul PASCAL a introdus n versiunea sa iniial noiunea de programare structurat i ulterior noiunile de date (structuri) dinamice, date (structuri) definite de utilizator. n prezent standardul implementrilor PASCAL cuprinde urmtoarele elemente: programare structurat de tip algoritmic; definirea de noi funcii sau proceduri; tipuri de date definibile de ctre utilizator; structuri de date dinamice; adresri indirecte ale datelor; recursivitate; rutine complete de intrare / ieire; funcii de conversie a datelor din ASCII n format intern i invers; set complet de funcii matematice; funcii elementare de grafic 2D; posibilitatea inserrii direct n surs a instruciunilor n limbaj de asamblare; posibilitatea definirii de overlay-uri pentru program. Versiunile standard ale implementrilor PASCAL sunt cele oferite de Microsoft i Borland, cu avantaj pentru cele din urm (BORLAND PASCAL 7.0).
11
Limbajul C Acest limbaj de programare, cu cel mai scurt nume, a fost creat n 1971 de ctre Dennis Ritchie i Brian Kernigham pentru dezvoltarea sistemului de operare UNIX. Principalele caracteristici ale limbajului sunt: limbaj structurat de nivel nalt; posed concepte de nivel sczut, ceea ce permite exploatarea portabil a caracteristicilor intime unei maini; rutine de conversie a datelor foarte evoluate; tipuri de date definibile de ctre utilizator; gestionarea elaborat a datelor de tip dinamic; definirea de noi funcii; adresri indirecte ale datelor, variabilelor (pointeri); recursivitate; set complet de funcii matematice; funcii pentru realizarea de grafic elementar 2D; funcii de apel servicii DOS; posibilitatea definirii de overlay-uri pentru un program; concizie deosebit a limbajului. Pentru versiunile standard ale implementrilor limbajului C exist medii de programare ce aparin firmelor: Microsoft produsul QUICK C i firmei Borland produsele BORLAND C.
Limbajul ADA A fost creat special pentru a gestiona totalitatea aplicaiilor dezvoltate i utilizate de N.A.S.A. Noutatea limbajului (de tip structurat, algoritmic) o constitue concurena, deci posibilitatea lansrii de procese paralele (sincronizate interactiv n finalul execuiei lor) . Saltul calitativ este evident i deschide un nou domeniu n programare, dar nu pentru IBM-PC. Versiunile implementrilor limbajului ADA pe IBM-PC nu posed tocmai acest parte de concuren, reducnd limbajul la un simplu limbaj structurat de uz general. Deci, ADA este un limbaj ultramodern din punct de vedere teoretic, dar ineficient din punct de vedere practic pentru IBM-PC-uri. Limbaje orientate pe gestiunea bazelor de date Necesitile actuale n practica utilizrii calculatoarelor se ndreapt cu precdere spre gestionarea bazelor de date de mari dimensiuni. O explicaie a acestei orientri e dat de faptul c o baz de date reprezint o informaie, iar cel ce deine informaii complete i rapide ntr-o anumit problem este indiscutabil cu un pas naintea celorlali. Concurena din domeniul economic poate fi numit pe bun dreptate o btlie informaional. ntr-un sistem de gestionare a bazelor de date (S.G.B.D.) de tip clasic datele sunt gestionate prin intermediul unei structuri, organizat ierarhic, la un nivel de organizare logic. Tendina modern n exploatarea bazelor de date const n deplasarea interesului ctre bazele de date relaionale. Diferena esenial const n definirea unui nivel logic suplimentar ntre datele gestionate. Acestea nu mai sunt privite ca simple fie izolate ntre ele ci pot fi analizate pe baza legturilor (relaiilor) ce exist ntre ele. Spre deosebire de S.G.B.D. urile clasice, un mediu relaional presupune ca cerin minimal posibilitatea manipulrii datelor prin intermediul conexiunilor logice stabilite. Pentru aceasta exist
12
definit (i impus ca standard unanim recunoscut) limbajul de interogare SQL (Structured Query Language limbaj de cereri structurate). S.G.B.D. uri clasice. dBASE III Cel mai rspndit sistem de gestiune a bazelor de date este dBASE, n diversele lui versiuni. El poate fi considerat un BASIC al bazelor de date. La momentul apariiei a constituit o adevrat revoluie n domeniul S.G.B.D.-urilor. Cele mai importante implementri ale sale sunt: dBASE III Plus i dBASE IV. COBOL A fost creat n 1950 i reprezenta singura posibilitate de gestionare a unei baze de date. Reprezint n primul rnd un limbaj de programare special conceput pentru informatica de gestiune. Dac facem o comparaie, sugestiv, COBOL este echivalentul FORTRAN-ului pentru sistemele de gestiune a bazelor de date (din punct de vedere istoric i al performanelor). Limbajul este considerat greoi i inflexibil, iar pentru crearea unui program foarte simplu e nevoie de scrierea unui adevrat eseu. Singurul avantaj real al COBOL-ului este portabilitatea sa ridicat. FOXBASE Sistemul dBASE a incintat firmele productoare de soft, datorit popularitii sale i pe de alt parte a calitilor sczute ale implementrilor originale furnizate de firma Ashton-Tate. Au aprut noi implementri ale limbajului care au ncercat s furnizeze unelte profesionale pe baza acestui suport conceptual. Versiunile FOXBASE 2.10 i FOXBASE PRO se constitue n medii performante att pentru programatori ct i pentru utilizatori. S.G.B.D. uri relaionale ORACLE Se poate afirma fr teama de a grei c ORACLE reprezint cel mai performant S.G.B.D. disponibil la momentul actual. Pe lng faptul c posed avantajele unui mediu de tip relaional, ORACLE este gndit ca un sistem exhaustiv pentru rezolvarea problemelor de utilizare sau programare. Limbajul intern folosit este SQL Plus i este permis conectarea cu alte limbaje externe evoluate (orientate ctre C) . Putem meniona: vitez de lucru foarte bun; exploatare interactiv la nivel SQL; limitri de lucru greu sau imposibil de atins (maxim 65535 caractere ntr-un cmp, numr nelimitat de cmpuri, de nregistrri) ; exploatare eficient a spaiului pe disc (memorarea cmpurilor n format variabil) . Oracle este implementat pe majoritatea tipurilor de computere mari, ceea ce ofer portabilitatea aplicaiilor, dar mai ales posibilitatea conectrii la calculatoare puternice. PARADOX Reprezint un S.G.B.D. cu adevrat profesional. El ndeplinete toate cerinele unui produs cu adevrat modern i performant i anume: interactivitate foarte bun; vitez de lucru mare; servicii i auxiliare; limbaj de programare evoluat (PAL Paradox Application Language) , dotat cu compilator.
13
Alte limbaje orientate Limbaje orientate pe calcul matematic simbolic Specialitii din domeniul cercetrii matematice au la dispoziie unelte de lucru extrem de utile pentru eliminarea calculului matematic rutinier. n acest scop au fost create limbaje de programare care pot recunoate i rezolva formule sau ecuaii matematice complexe. Expresiile manevrate pot conine operaii algebrice elementare, operatori de derivare, de integrare, operatori difereniali care sunt recunoscui de sistem ca atare. n plus sunt oferite instruciuni absolut necesare pentru a controla un program. Cele mai importante produse de acest gen sunt REDUCE, SYMNON, MATHCAD, MATHEMATICA, MATHLAB. Limbaje orientate pe programarea inteligenei artificiale Acest tip de limbaje difer esenial de cele algoritmice. Modalitatea de programare este descriptiv i are intenia declarat de simulare a raionamentului uman. Pentru rezolvarea unei probleme sunt furnizate seturile de reguli i informaii necesare, iar apoi se descrie n ce const problema ca atare. Limbajul este capabil s opereze deduciile (deciziile) necesare pentru a rezolva problema ntr-un caz particular ce apare n practic. Aadar, aceste limbaje descriu problema de rezolvat (n termenii deduciilor logice) pe cnd limbajele de tip algoritmic descriu metoda de rezolvare a problemei. Domeniile de aplicabilitate pentru limbajele de programare a inteligenei artificiale sunt cu predilecie: realizarea de sisteme expert (programe ce nlocuiesc experii umani), computerizarea procesului de producie, robotic, tratarea limbajelor naturale. Cele mai importante limbaje de acest tip sunt: PROLOG (PROgramming in LOGic) creat n 1973 i implementat pe PC-uri abia n 1986 de firma Borland sub forma Turbo-Prolog. LISP (LISt Processing language) conceput n 1976 i implementat pe PC-uri de firma Microsoft sub forma MuLISP.
14
15
n prima etap are loc analiza problemei. Rolul analizei const n elaborarea unui enun complet i precis al problemei, cae s in seama de condiiile concrete de realizare i execuie a programului. Enunul trebuie s evidenieze ceea ce urmeaz s realizeze programul, adic funciile programului. n acest scop este necesar s se identifice informaiile de prelucrat (datele de intrare) i rezultatele cerute (datele de ieire) ale programului. Pentru referirea la datele de intrare i de ieire se folosesc variabile de intrare i respectiv de ieire. Ele furnizeaz notaii simbolice pentru date. Tot n aceast etap se stabilesc reprezentrile i organizarea datelor de intrare i de ieire pe suporturile externe de informaie. Acestea pot fi impuse prin enunul iniial al problemeisau pot fi definite de ctre utilizator. Rezultatul primei etape este specificaia programului. Exemplul 1.3 Pentru exemplificarea acestei etape, se consider urmtoarea problem: Fiind dai coeficienii unei ecuaii de gradul doi, a, b i c, de tip real, s se calculeze (dac exist!) rdcinile reale ale acesteia. n caz contrar, s se dea un mesaj corespunztor. 1) mrimi de intrare: a, b, c; mrimi de ieire: x1, x2; 2) funcia: calculeaz rdcinile reale ale ecuaiei: a*x2 + b*x + c = 0 dac exist sau afieaz mesajul Ecuaia nu are rdcini reale sau Nu este o ecuaie de gradul doi, n cazul cnd a = 0; 3) organizarea i reprezentarea datelor de intrare i ieire pe suportul extern: datele se introduc de la tastatur i rezultatele se afieaz pe display (monitor). II Determinarea algoritmului de rezolvare a problemei
Scopul acestei etape este elaborarea unui algoritm care s realizeze funciile programului. Programatorul trebuie s conceap o list de comenzi care s descrie secvena de operaii care va fi executat de calculator pentru soluionarea problemei. Un calculator devine funcional dac este programat, adic i se spune n cele mai mici amnunte ce s fac. Acest lucru se realizeaz prin program.n sens general, un program 16
Proiectul pentru nvmntul Rural
reprezint descrierea unui algoritm ntr-o form interpretabil (neleas) de ctre calculator. El rezult din codificarea algoritmului ntr-un limbaj de programare. Gsirea algoritmului constituie de cele mai multe ori cea mai grea etap a procesului programrii. Pentru obinerea algoritmului sunt necesare cunotine din matematic, discipline tiinifice i tehnice. Studiul algoritmilor constituie un domeniu clar delimitat n aria larg a tiinei calculatoarelor. n general, dezvoltarea algoritmului se realizeaz iteativ, trecndu-l prin mai multe niveluri de detaliere. Acest mod de detaliere pas cu pas este denumit proiectarea descendent, sugernd faptul c se trece treptat de la o reprezenteare general, abstract, a rezolvrii problemei la o prezentare detaliat a sa. Problemele simple conduc la un singur algoritm compact, codificat ntr-o singur unitate e program. n exemplul prezentat anterior, algoritmul poate fi explicat foarte simplu: Dac a = 0, atunci afieaz mesajul Nu este o ecuaie de gradul doi altfel dac = b2 4*a*c >=0, atunci calculeaz b+ b x1 = i x 2 = , apoi afieaz valorile lor, 2a 2a altfel afieaz mesajul Ecuaia nu are rdcini reale Problemele complexe i de dimensiuni mari sunt descompuse din punct de vedere logic n subprobleme (pri) mai simple, corelate, care pot fi tratate separat, devenind ele nsele probleme de rezolvat. Programul rezultat din codificarea unui astfel de algoritm va fi organizat ca un sistem de module program. Prin modularizare se simplific nu numai procesul de dezvoltare i verificare a algoritmului, ci i procesul de codificare, depanare i testare a programelor. Totodat, modularizarea uureaz modificarea programului i descgide posibilitatea refolosirii unitilor de program componente. III Codificarea algoritmului
Dup elaborare, algoritmul este codificat cu ajutorul unui limbaj de programare, obinndu-se astfel programul care l implementeaz. Limbajul utilizat este ales n conformitate cu specificul problemei, cu particularitile sistemului de calcul pe care urmeaz s fie executat programul i, desigur, cu experiena programatorului. Codificarea algoritmului este nlesnit de utilizarea unor simboluri i reguli speciale, precum schemele logice (organigrame) sau limbajul pseudocod. IV Testarea i validarea programului
Programul astfel obinut trebuie verificat n scopul eliminrii erorilor de sintax i al celor de logic. Chiar dac n urma execuiei programului se obin rezultate, adic s-au eliminat erorile de sintax, aceasta nu nseamn c acesta este corect, adic realizeaz fiunciile specificate. Programul poate conine erori de logic, pentru eliminarea crora trebuie
Proiectul pentru nvmntul Rural
17
executat de mai multe ori, folosindu-se seturi de date stabilite pe baza unor criterii considerate ca fiind adecvate problemei. Sintaxa si semantica limbajelor de programare Fiecare limbaj de programare, ca orice alt limbaj, se caracterizeaz prin anumite reguli de scriere corect, numite reguli de sintax. Orice instruciune a limbajului are o form i o semnificaie. Sintaxa se refer numai la forma instruciunii, n timp ce semnificaia este de domeniul semanticii. Semantica se refer la modul n care trebuie interpretat instruciunea respectiv. Este evident c, atunci cnd se concepe un program, este necesar s se acorde atenie att sintacticii, ct i semanticii. Dac ntr-un program nu sunt respectare regulile de sintax, compilatorul sesizeaz anomaliile i le semnaleaz sub forma unor mesaje de erori de sintax. n astfel de situaii, codul de octei al programului respectiv nu va mai fi generat. Programatorul trebuie s remedieze erorile de sintax semnalate i s cear repetarea compilrii. Acest procedeu se repet, pn cnd nu vor mai fi constatate erori de sintax. Faptul c un program nu mai conine erori de sintax, deci este corect sintactic, nu nseamn ns c el este corect i sub aspectul realizrii sarcinii pentru care a fost conceput. Aa cum un text scris ntr-o limb natural (n limba romn, de exemplu) poate fi corect gramatical, dar s exprime concepii greite, un program poate fi corect sintactic, dar s descrie un set de date i/sau un algoritm care nu corespund problemei rezolvate i deci nu permit obinerea soluiei corecte. Aceast situaie nu mai poate fi sesizat de compilator, ci este n ntregime pe rspunderea programatorului.
Activitatea de dezvoltare a unui program nu se ncheie n momentul validrii programului. Din acel moment ncepe etapa de ntreinere, care, spre deosebire de celelate etape, este nelimitat. n aceast etap sunt efectuate modificri ale programului, fie n scopul corectrii unor erori identificate n cursul utilizrii sale, fie pentru a-l adapta unor cerine noi. n aceast etap are o mare importan documentaia programului; aceasta faciliteaz att modificrile ulterioare, ct i nelegerea sa de ctre alte persoane dect cele care l-au creat.
18
2. Dac ntr-un program nu sunt respectate . .compilatorul descoper anomaliile, indicndu-le sub forma unor ...
3. n cadrul etapei de ............... sunt efectuate modificri ale programului, fie n scopul corectrii unor erori identificate n cursul utilizrii sale, fie pentru implementarea unor cerine noi.
5. Trecerea treptat de la o reprezenteare general, abstract, a rezolvrii problemei la o prezentare detaliat a sa poart denumirea de .
19
Vezi U1.2 Propietile algoritmilor pag. 12 Vezi U1.2 Propietile algoritmilor pag. 12 Vezi U1.2 Propietile algoritmilor pag. 12 Vezi U1.2 Propietile algoritmilor pag. 12 Vezi U1.2 Propietile algoritmilor pag. 12
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Editura Radial, Galati, 1998. 2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic Cap.2 Programe. Algoritmi. Elemente de programare structurat, Editura Didactic i Pedagogic, Bucureti, 1995. 3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura Niculescu, Bucureti, 2003. 4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar 20
Proiectul pentru nvmntul Rural
2. Descriei sub forma unui algoritm descompunerea unui numr n factori primi.
3. Explicai de ce sunt necesare limbajele orientate pe gestiunea bazelor de date, dnd cteva exemple.
4. Enumerai avantajele utilizrii limbajelor de nivel nalt i dai cteva exemple de astfel de limbaje de programare:
21
Obiectivele Unitii de nvare 2 ....................................................................................22 2.1 Reprezentarea algoritmilor........................................................................................22 2.2 Elemente de programare structurat .......................................................................26 2.3 Structuri de control utilizate n programarea structurat .......................................29 2.3.1 Secvena sau structura liniar ......................................................................29 2.3.2 Decizia sau structura alternativ ..................................................................32 2.3.3 Ciclul sau structura repetitiv .......................................................................36 Rspunsuri corecte la testele de autoevaluare .............................................................42 Bibliografie .......................................................................................................................42 Lucrarea de verificare Nr. 2, notat de tutore................................................................43
Identificai cele trei structuri de baz ale programrii Reprezentai diveri algoritmi n pseudocod Explicai principiile programrii structurate n procesul de elaborare a algoritmilor Comparai diversele metode de reprezentare ale algoritmilor
2.1
Reprezentarea algoritmilor
Limbajul natural nu permite o descriere suficient de riguroas a algoritmilor, air, pe de alt pate, o dat ce complexitatea algoritmilor crete, crete i complexitatea descrierilor n limbaj natural. De aceea, pentru reprezentarea algoritmilor se folosesc diferite forme de reprezentare caracteristice, n fapt limbajele specializate. n general, notaia folosit pentru reprezentarea algoritmilor trebuie s satisfac urmtoarele cerine: 1. S permit exprimarea ct mai natural a raionamentelor umane, s fie uor de nvat i de folosit; 2. S reflecte caracteristicile limbajelor de programare de nivel nalt pentru a uura codificarea algoritmilor.
22
Formele convenionale cele mai folosite n reprezentarea algoritmilor sunt: schemele logice sau organigramele limbajele pseudocod. Principala calitate a acestora este posibilitatea de a evidenia cu claritate fluxul controlului algoritmilor, adic succesiunile posibile ale aciunilor. Astfel, schemele logice utilizeaz pentru aceasta sgei de legtur ntre diversele forme geometrice care simbolizeaz diversele tipuri de aciuni, n timp ce limbajele pseudocod folosesc cuvinte cheie, adic nite cuvinte cu neles prestabilit ce identific operaia care se execut, i cteva reguli simple de aliniere a textului scris. n continuare sunt prezentate blocurile ce pot intra n componena unei scheme logice. Blocul delimitator are forma unei elipse alungite. El se folosete pentru a marca nceputul sau sfritul schemei logice. Dac blocul este folosit la nceputul schemei logice, atunci n interiorul su se scrie cuvntul START, iar dac blocul este folosit la sfritul schemei logice, atunci n interiorul su se scrie cuvntul STOP. Figura 2.1 conine blocul delimitator folosit n cele dou situaii.
Fig. 2.1 Blocul de intrare / ieire are forma unui paralelogram. Acest bloc se folosete la introducerea datelor n calcule i afiarea rezultatelor. De obicei, datele de intrare ale unei probleme se introduc iniial, cu ajutorul tastaturii, ntr-o zon de memorie numit zon tampon. De aici ele sunt preluate de program. Aceast operaie de preluare a datelor dintr-o zon tampon se numete operaie de citire. Datele preluate din zona tampon sunt introduse n memoria intern a calculatorului. Aceast operaie se precizeaz n schemele logice prin cuvntul CITESTE. n figura 2.2. apare o comand de citire. Aceast comand cere s se citeasc valorile variabilelor a i b i s se introduc aceste valori n memoria intern.
Fig. 2.2 Operaia de preluare a valorilor unor variabile din memoria intern i afiarea lor pe ecranul calculatorului se numete operaie de scriere. De aceea, aceast operaie se precizeaz n schemele logice prin cuvntul SCRIE. n figura 2.2. apare o comand de scriere. Aceast comand cere s se scrie valoarea variabilei x pe ecranul monitorului.
23
Blocul de calcul se folosete pentru a preciza calculele care se fac. n blocurile de acest tip apar comenzi de forma: v=e unde v este o variabil, iar e este o expresie de tip compatibil cu v. La ntlnirea comenzii v=e se determin valoarea expresiei e, se convertete, dac este cazul, valoarea lui e la o valoare de tipul lui v i se atribuie aceast valoare variabilei v. Figura 2.3. conine mai multe blocuri de calcul. Aici am presupus c toate variabilele sunt de tip numeric. n primul bloc se atribuie variabilei s valoarea 2. Al doilea bloc conine expresia c+3. Aici am presupus c c are o valoare numeric rezultat dintr-o operaie anterioar. Valoarea expresiei se convertete, dac este cazul, la o valoare de tipul lui a i se atribuie lui a. n al treilea bloc apare expresia b+3. Valoarea acestei expresii se atribuie lui b. Prin urmare, dup execuia acestei comenzi, valoarea lui b se mrete cu 3. Aadar, semnul = care apare n blocurile de calcul nu trebuie confundat cu semnul = din matematic, pentru c se ajunge la ceva fr sens. n fine, n ultimul bloc se cere s se atribuie lui m valoarea 2.3. Dac m este o variabil de tip ntreg, atunci numrul 2.3 este convertit la numrul ntreg 2 i apoi este atribuit variabilei m.
Fig. 2.3 Blocul de decizie are forma unui romb. n interiorul su se scrie o condiie care determin ramificarea calculelor. Figura 1.4. conine un asemenea bloc. Condiia din blocul de decizie se citete ca o propoziie interogativ. Astfel, n cazul din figura 1.4. citim: Este y egal cu x ? Dac rspunsul la aceast ntrebare este da, atunci se iese din blocul de decizie pe ramura pe care este scris cuvntul DA. Dimpotriv, dac rspunsul la ntrebarea de mai nainte este nu, atunci se iese din blocul de decizie pe ramura pe care este scris cuvntul NU.
Fig. 2.4 Semnul = care apare n blocul de decizie are sens de comparaie. El nu se va confunda cu semnul = din blocurile de calcul. Pentru scrierea condiiilor se mai folosesc i celelalte semne de comparaie din matematic: <, , >, i . Blocul conector are form de cerc. El se folosete pentru a conecta diferite secvene ale unei scheme logice.
24
Exemplul 2.1
n finalul acestei seciuni, prezentm o schem logic care conine toate blocurile pe care le-am descris nainte. Este vorba de schema logic de rezolvare a ecuaiei a.x+b=0 cu a i b numere reale. Evident, dac a=0 i b=0, atunci ecuaia este satisfcut de orice x. Prin urmare, n acest caz ecuaia are o infinitate de soluii. Dac a = 0 i b 0, atunci apare o incompatibilitate. n fine, dac a 0, atunci ecuaia are o singur soluie: x = -b/a, pentru orice b. Schema logic de rezolvare a problemei apare n figura 2.5. Aa cum observm, blocurile schemei logice sunt conectate ntre ele prin linii prevzute cu sgei. Aceste sgei indic ordinea de parcurgere a blocurilor.
Fig. 2.5 Schema logic de rezolvare a ecuaiei a.x+b=0 conine o comand pentru citirea datelor. Aceast comand cere s se citeasc valorile variabilelor a i b. Pe baza acestei scheme putem alctui un program care s rezolve o ecuaie de forma ax+b=0 pentru orice valori ale lui a i b. n primul bloc de decizie din schema logic apare condiia a=0. Evident, condiia a=0 poate fi adevrat sau fals. Dac condiia a=0 este adevrat, atunci din blocul de decizie se iese pe ramura pe care este scris cuvntul DA, iar dac condiia a=0 nu este adevrat, atunci din blocul de decizie se iese pe ramura pe care este scris cuvntul NU. Desigur, i condiia b=0 care apare n cellalt bloc de decizie al schemei logice determin ramificarea calculelor ntr-un fel sau altul. n fine, s mai observm c n blocul de calcul apare scris x = -b/a. Evident, x = -b/a nu este o condiie. Acum se cere s se determine valoarea lui -b/a i s se atribuie valoarea calculat lui x. Schema logic pe care o analizm conine trei drumuri care pornesc de la START i se ncheie la STOP. De aceea, pentru verificarea schemei trebuie s considerm trei seturi de date care ne conduc pe drumurile respective.
25
Facem nti verificarea schemei pentru a=2 i b=-8. Prin urmare, dorim s rezolvm ecuaia 2x-8=0. Pe schema logic parcurgem paii urmtori: START CITESTE a, b a=0 ? x=-b/a SCRIE x STOP a=2, b=-8 2=0 ? NU x=4 x=4
Considerm acum cazul n care a=0 i b=-6. Aadar, este vorba de ecuaia 0x - 6=0. Acum avem o incompatibilitate. Pe schema logic parcurgem paii urmtori: START CITESTE a, b a=0, b=-6 a=0 ? 0=0 ? DA b=0 ? -6=0 ? NU SCRIE "INCOMPATIBILITATE" STOP
INCOMPATIBILITATE
n fine, considerm cazul n care a=0 i b=0. Aadar, este vorba de ecuaia 0x+0=0. Este vorba de o nedeterminare. Pe schema logic parcurgem paii urmtori: START CITESTE a, b a=0, b=0 a=0 ? 0=0 ? DA b=0 ? 0=0 ? DA SCRIE "NEDETERMINARE" NEDETERMINARE STOP Schema pe care am prezentat-o aici este foarte simpl. De aceea, a fost posibil s o verificm cu seturi de date corespunztoare tuturor drumurilor care duc de la START la STOP. Majoritatea problemelor reale au scheme logice complexe. n asemenea situaii numrul de drumuri care duc de la START la STOP este foarte mare. De aceea, nu se poate face o verificare exhaustiv a acestor scheme logice.
26
Un program structurat este constituit din uniti funcionale bine conturate, ierarhizate conform naturii intrinseci a problemei. Programarea structurat este o metod independent de limbajul de programare, ea acionnd la nivelul stilului de lucru. n ce const de fapt programarea structurat? Programarea structurat reprezint o maniere de concepere a programelor potrivit unor reguli bine stabilite, utiliznd un anumit set, redus, de tipuri de structuri de control. O structur de control nseamn o combinaie de operaii utilizat n scrierea algoritmilor. Scopul programrii structurate este elaborarea unor programe uor de scris, de depanat i de modificat (actualizat) n caz de necesitate. Programele obinute sunt clare, ordonate, inteligibile, fr salturi i reveniri. Programarea structurat permite ca programele s poat fi scrise n limbaj pseudocod, limbaj independent de main, apropiat de cel natural, convertibil n orice limbaj de programare. Prin programarea n mod logic i clar a structurilor de control admise, programarea structurat permite abordarea eficient a funciilor de orice grad de dificultate. Programarea structurat are la baz o justificare matematic, furnizat de Boehm i Jacopini i cunoscut ca teorema de structur care precizeaz c orice algoritm avnd o intrare i o ieire, adic un singur punct de nceput i un singur punct de terminare a execuiei poate fi reprezentat ca o combinaie de trei structuri de control: 1. Secvena sau structura liniar succesiunea de dou sau mai multe operaii; 2. Decizia sau structura alternativ alegerea unei operaii dintre dou alternative posibile; 3. Ciclul sau structura repetitiv cu test iniial repetarea unei operaii atta timp ct o anumit condiie este ndeplinit. Programarea structurat admite i utilizarea altor structuri de control, cum sunt: 4. Selecia permite o alegere ntre mai mult de dou alternative; 5. Ciclul cu test final; 6. Ciclul cu contor. Ultimele dou structuri de control reprezint variante ale structurii referit n general ca structura repetitiv.
27
de la o instruciune la alta. Ulterior, Dijkstra mpreun cu ali cercettori n domeniul informaticii au conceput o teorie coerent a programrii structurate, conform creia la conceperea unui program, este recomandabil s se respecte urmtoarele principii: 1. Teorema de structur: orice program poate fi ntocmit folosind numai trei structuri de control fundamentale: structura secvenial, structura alternativ i structura repetitiv. 2. La conceperea programelor se recomand s se aplice tehnica de elaborare descendent (n englez Top-Down), numit i tehnica rafinrilor succesive. 3. Domeniile de valabilitate (de vizibilitate) ale variabilelor i structurilor de date trebuie s fie limitate.
28
A1
A2
An
Figura 2.5
Exemplul 2.2
Se citesc dou numere ntregi a i b. S se interschimbe coninutul celor dou variabile i s se afieze noile lor valori. La prima vedere am fi tentai s scriem secvena urmtoare: intregi a,b citete a, b ab ba scrie a,b
Proiectul pentru nvmntul Rural
29
Aceast secven este greit. Atunci cnd variabilei a i se atribuie valoarea variabilei b, coninutul variabilei a se pierde. S presupunem c am citit a = 3 i b = 4. Prin atribuirea a b , coninutul lui a va fi 4, iar a lui b va fi tot 4. Prin atribuirea b a coninutul celor dou variabile va fi acelai. Din acest motiv, n urma execuiei acestui algoritm se va tipri 4 i 4. Pentru a corecta aceast greeal, trebuie folosit o variabil auxiliar, aux, de acelai tip ca a i b, care va permite interschimbarea corect a valorilor celor dou variabile. Secvena corect de atribuiri este urmtoarea: aux a ab b aux n acest mod, coninutul variabilei a se salveaz n variabila auxiliar aux, deci nu se pierde la a doua atribuire. Pentru valorile 3 i 4 presupuse ca citite pentru a i b, vom avea n ordine: lui aux I se atribuie valoarea 3; lui a i se atribuie valoarea 4; lui b i se atribuie valoarea 3; n continuare este prezentat algoritmul sub form de schem logic i pseudocod ntregi a, b, aux citete a,b aux=a a=b b=aux scrie a,b stop Aceeai problem poate fi rezolvat i fr a folosi o variabil auxiliar, dar numai n cazul interschimbrii de valori numerice, deoarece se vor folosi operaiile de adunare i scdere. ntregi a, b citete a,b a=a+b b=a-b a=a-b scrie a,b stop Pentru valorile citite ale lui a i b algoritmul funcioneaz astfel: lui a i se atribuie valoarea 3+4=7; lui b i se atribuie valoarea 7-4=3; lui a i se atribuie valoarea 7-3=4; se tiprete a=4 i b=3, rezultat corect.
START
Citete a,b
aux=a
a=b
b=aux
Scrie a,b
30
2. Perimetrul unui ptrat este egal cu latura altui ptrat. tiind c suma perimetrelor este x, s se calculeze ariile celor dou ptrate.
3. Fiind date trei numere ntregi a, b ,c, s se interschimbe valorile celor trei numere, astfel: b, c, a (a primete valoarea lui b, b pe a lui c i c ia valoarea lui a); c, a, b (a primete valoarea lui c, b pe a lui a i c ia valoarea lui b); c, b, a (se inverseaz ordinea variabilelor).
4. Se dau patru numere a, b, c, d reale. S se permute valorile acestor variabile astfel nct la tiprire ele s aib valorile rezultate din permutrile lor circulare , la stnga, respectiv la dreapta, cu o poziie: b, c, d, a d, a, b, c
5. S se calculeze aria unui triunghi, cunoscndu-se una din laturile sale i nlimea corespunztoare.
True DA
Condiie
False NU
True DA
Condiie
False NU
Figura 2.7
n limbaj natural, pentru schema logic din partea stng, execuia poate fi descris astfel: se evalueaz condiia; dac rezultatul este adevrat, se execut secvena A; n caz contrar, se execut secvena B n limbaj pseudocod, structura alternativ este descris astfel: dac condiie atunci secvena A altfel secvena B Pentru cea de-a doua schem, reprezentnd decizia cu varianta unei ci nule, una din ramurile structurii nu conine nici o instruciune. n limbaj natural, execuia poate fi descris astfel: se evalueaz condiia; dac rezultatul este adevrat, se execut secvena A; n caz contrar, se continu execuia programului. n pseudocod, execuia se descrie astfel: dac condiie atunci secvena A
Exemplul 2.3
Se citesc dou numere reale a i b. S se afieze cel mai mare dintre ele. Rezolvarea acestei probleme este foarte simpl, i anume: real a, b 32
Proiectul pentru nvmntul Rural
Exemplul 2.4
Complicm puin problema. S se afieze valoarea maxim dintre trei numere reale citite de la tastatur. O posibilitate de rezolvare a problemei, reprezentat n pseudocod, este: real a, b, c, max citete a, b, c dac a>b i a>c atunci max=a altfel dac b>c atunci max=b altfel max=c scrie max stop Se observ folosirea a dou structuri alternative pentru rezolvarea problemei, a doua dintre ele fiind inclus ntr-una din ramurile de decizie ale structurii, i anume pe cea corespunztoare neverificrii condiiei testate. Se folosesc trei variabile reale corespunztoare celor trei numere citite (a, b i c) i o variabil pentru pstrarea valorii maxime, tot real, max. Dac a este mai mare dect celelalte dou numere b i c, atunci valoarea maxim va fi a, altfel ea trebuie cutat ntre celelalte dou valori; dac b este mai mare dect c, atunci b este maxim, altfel maximul va fi c.
Exemplul 2.5
S se realizeze schema logic pentru evaluarea expresiei:
33
Exemplul 2.6
Un exemplu de problem la care se folosete cea de-a doua variant a schemei logice pentru structura alternativ este: S se determine valoarea absolut a numrului real x, citit de la tastatur. Rezolvare: real x citete x dac x<0 atunci x=-x scrie x
2. S se scrie algoritmul de rezolvare a urmtoarei probleme: acum este ora h1, minutul m1 i secunda s1. Ct va fi ceasul peste h2 ore, m2 minute i s2 secunde? Rezultatul va fi reprezentat tot n ore, minute i secunde.
34
4. S se determine valoarea urmtoarei expresii, unde a, b i x sunt numere reale date: 2 x + 3 daca a b > 0 E ( x ) = x 3 2 x + 7 daca a b < 0 x 2 5 daca a b = 0
5. Dndu-se a, b i c, coeficienii unei ecuaii de gradul doi, s se determine semnul rdcinilor ecuaiei, dac exist, fr a se rezolva ecuaia (innd cont de valorile lui , P i S).
35
Exprimarea n pseudocod a acestei structuri este: cat_timp condiie execut secvena A Aceast structur mai este cunoscut ca structura de tip WHILE DO
Figura 2.8 Observaie Figura 2.8 Atunci cnd condiia este fals de la nceput, secvena A nu se execut niciodat; n acest caz numrul de iteraii este zero (adic de cte ori a fost executat secvena A).
Exemplul 2.7
S se calculeze xn, unde x este un numr real, iar n un numr natural. real x, putere ntreg n, i citete x, n i=1 putere = 1 cat_timp i<=n execut putere =putere * i i = i+1 scrie putere stop Variabila putere este folosit pentru a pstra puterea i a lui x, i fiind o variabil ntreag ce numr puterea la care este ridicat x, fiind denumit variabil de tip contor.
36
Ciclul cu test final sau structura repetitiv condiionat posterior Execuia presupune parcurgerea urmtoarelor etape: se execut secvena A se evalueaz condiia; dac rezultatul este fals, se continu cu primul pas; n caz contrar, se ncheie execuia ciclului. pseudocod a acestei
secvena A pn_cnd condiie Aceast structur mai este cunoscut ca structura de tip REPEAT UNTIL Observaie Deoarece testarea condiie se face la sfrit, secvena se execut cel puin o dat (numrul de iteraii este mai mare dect zero)
Condiie
DA
True
Figura 2.9
Exemplul 2.8
S se calculeze n! (factorialul numrului n, adic n!=1*2*...*n). Pentru a rezolva acaeast problem sunt necesare variabilele de tip ntreg n, citit de la tastatur, i, variabil necesar contorizrii pailor efectuai n calcularea produsului i variabila fact, care va memora valoarea produsului calculat. intregi n, i, fact citete n i=1 fact=1 repet fact=fact*i i=i+1 pn_cnd i>n scrie fact stop
37
Exemplul 2.9
S se calculeze suma primelor n numere naturale. Pentru rezolvarea acestei probleme, sunt necesare variabilele intregi n, i, s, primele dou variabile avnd aceeai semnificaie ca la problema precedent, iar s este variabila necesar pstrrii valorii sumei numerelor naturale de la 1 la n. intregi n, i, s citete n i=1 s=0 repet s=s+i i=i+1 pn_cnd i>n scrie s stop S probm funcionalitatea algoritmului pentru n=3: i ia valoarea 1 iar s ia valoarea 0; (se iniializeaz cu aceste valori) i se adaug la vechea valoare a lui s s=0+1=1 i crete cu o unitate (se incrementeaz) i=1+1=2 se compar i cu n; deoarece i este mai mic dect n, se trece la repetarea celor doi pai; i se adaug la vechea valoare a lui s s=1+2=3 i crete cu o unitate (se incrementeaz) i=2+1=3 se compar i cu n; deoarece i nu este mai mare dect n, se trece la repetarea celor doi pai; i se adaug la vechea valoare a lui s s=3+3=6 i crete cu o unitate (se incrementeaz) i=3+1=4 i este mai mare dect n, deci se oprete execuia ciclrii, se tiprete valoarea sumei s i algoritmul se ncheie. Observaie Dac se compar aceast problem cu precedenta, se observ o asemnare n rezolvarea lor, i anume o parte de iniializare a variabilelor i o ciclare pentru calculul celor dou valori: factorial, respectiv suma. Diferenele constau n valorile de iniializare a factorialului (1, deoarece se calculeaz un produs), respectiv a sumei (s=0) i operaiile de calcul a celor dou variabile; nmulire, respectiv adunare.
Exemplul 2.10
n primul capitol a fost prezentat, n limbaj natural, algoritmul de mprire a dou numere naturale prin scderi repetate. Iat cum se poate scrie n pseudocod acest algoritm: intregi a, b, cat 38
Proiectul pentru nvmntul Rural
citete a, b cat=0 ct_timp a>=b execut a=a-b cat=cat+1 scrie cat=, cat, rest=,a stop Pentru rezolvarea acestei probleme a fost ales ciclul cu test iniial deoarece el va da rezultatul corect i pentru cazul cnd a<b, caz n care catul va fi zero, iar restul a. Ciclul cu contor sau structura repetitiv cu numr cunoscut de pai (iteraii) Aceast structur repetitiv este folosit n cazurile n care este cunoscut numrul de iteraii ale structurii i modul n care se modific o variabil ce controleaz execuia acestuia, denumit contor. Exprimarea n pseudocod a acestei structuri este: pentru contor=vi, vf, pas execut secvena A vi, vf reprezint valorile iniiale, respectiv finale ale variabilei contor, iar pas este valoarea cu care se modific contor la terminarea execuiei secvenei A; dac nu este precizat nici o valoare pentru pas, aceasta este implicit 1. Aceast structur este echivalent cu: contor=vi ct_timp contor<=vf execut secvena A contor=contor+pas
Exemplul 2.11
S se calculeze suma primelor n numere naturale, folosind ciclul cu contor. Algoritmul a fost explicat n cadrul exemplului 2.8. Rezolvarea n acest caz este: ........... citete n s=0 pentru i=1, n execut s=s+i scrie s .......... Se observ n acest caz c, n cadrul structurii repetitive nu mai apare operaia de incrementare a variabilei contor i, aceasta fiind inclus n
Proiectul pentru nvmntul Rural
39
execuia instruciunii. Selecia: reprezint calculul unei expresii, i n funcie de rezultatul acesteia, algoritmul va continua pe una din ramurile posibile. Expresia trebuie sa fie definit ntr-un tip de date cu valori finite. expresie c1: secventa_1; c2: secventa_2; cn: secventa_n; rest: secventa_rest; endcase; Modul de utilizare a seleciei va fi prezentat ulterior, n cadrul prezentrii instruciunilor limbajului C. Pseudocod: case
2. Se citete un ir de numere naturale pn la introducerea valorii zero. S se determine media aritmetic a numerelor pare introduse i produsul numerelor impare.
3. Se citete un ir de numere naturale pn la introducerea valorii zero. S se determine suma numerelor de pe poziiile pare (suma dintre al doiea, al patrulea, etc) i produsul numerelor de pe poziiile impare (produsul dintre primul, al treilea, al cincilea, etc).
40
4. S se determine valoarea urmtoarelor expresii, unde n este un numr natural dat: 1 1 1 E1 = + ++ 1 2 2 3 n(n + 1) 2 4 2n E2 = + ++ (2n 1)(2n + 1) 1 3 3 5
5. Dndu-se a, b i c, coeficienii unei ecuaii de gradul doi, s se calculeze: n S n = x1n + x 2 , unde n este un numr natural dat, fr a se rezolva ecuaia (innd cont de valorile lui P i S).
41
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Editura Radial, Galati, 1998. 2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic Cap.2 Programe. Algoritmi. Elemente de programare structurat, Editura Didactic i Pedagogic, Bucureti, 1995. 3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura Niculescu, Bucureti, 2003. 4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar
42
43
Obiectivele Unitii de nvare 3 ....................................................................................44 3.1 Privire de ansamblu asupra limbajului C .................................................................44 3.2 Structura programelor n limbajul C.........................................................................46 3.3 Variabile, tipuri de variabile i declarare..................................................................51 3.4 Constante ...................................................................................................................54 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg ..............................57 3.6 Operatori n C .............................................................................................................60 3.6.1 Operatorul de atribuire..................................................................................60 3.6.2 Operatori aritmetici .......................................................................................61 3.6.3 Operatori relaionali i logici .........................................................................65 3.6.4 Operatori de atribuire compus ....................................................................67 3.6.5 Operatorul de conversie explicit (cast) .......................................................68 3.6.6 Operatorul sizeof ..........................................................................................68 3.6.7 Operatorul virgul (,) ...................................................................................69 3.6.8 Operatorul condiional (?) .............................................................................69 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ...........72 Bibliografie .......................................................................................................................72 Lucrarea de verificare Nr. 3, notat de tutore................................................................73
3.1
Etapa iniiala de dezvoltare a limbajului de programare C a avut loc n cadrul laboratoarelor AT&T Bell ntre anii 1969 i 1973. Dup spusele lui Dennis Ritchie, cea mai creativ perioad a avut loc n 1972. A fost denumit C deoarece multe din caracteristicile sale au fost derivate din limbajul de programare B.
44
Sunt multe legende despre originea limbajului C i legtura sa cu sistemul de operare Unix, cum ar fi: Dezvoltarea limbajului C a fost rezultatul dorinei programatorilor de a juca un joc de tipul Asteroids. Acetia l jucau pe calculatorul principal al companiei, dar din lipsa de resurse i datorit faptului c acesta trebuia s suporte mai mult de 100 de utilizatori, Thompson i Ritchie, nemulumii de controlul pe care l aveau asupra navei n ncercarea de a evita asteroizii, au decis s porteze jocul pe un PDP-7, nefolosit, din birou. Dar aceast main nu avea un sistem de operare, aa c au hotrt s scrie unul. Au decis ca eventual s porteze acest sistem de operare pe mainile PDP-11 pe care acetia le foloseau n birou, dar era o munc destul de dificil avnd n vedere c totul era scris n limbaj de asamblare. Aa c au decis s foloseasc un limbaj portabil de nivel nalt astfel nct sistemul de operare s poat fi portat cu uurin de pe un computer pe altul. Au ncercat folosind limbajul de programare B, dar i lipseau unele din funcionalitile care ar fi fcut facil folosirea unor caracteristici avansate a mainii PDP-11. Astfel, a aprut un nou limbaj de programare, numit C. Justificarea pentru obinerea primului computer care a fost utilizat pentru dezvoltarea sistemului de operare Unix a fost acela de a crea un sistem pentru a automatiza completarea autorizaiilor. Prima versiune a sistemului de operare Unix a fost scris n limbaj de asamblare. Mai trziu, limbajul de programare C a fost folosit pentru a rescrie sitemul de operare.
ncepnd cu anul 1973, limbajul de programare C a devenit destul de robust, astfel nct mare parte a kernelului Unix, scris iniial n limbaj de asamblare pentru PDP 11/20, a fost rescris n C. Acesta a fost unul din primele kernele ale unui sistem de operare scris ntr-un limbaj de programare, altul dect limbajul de asamblare. ncercri anterioare au fost pentru scrierea sistemului Multics (scris n PL/I) i TRIPOS (scris n BCPL). K&R C n 1978, Dennis Rithie i Brian Kernighan au publicat prima ediie a crii Limbajul de programare C (eng. The C Programming Language). Aceast carte, cunoscut n cercul programatorilor sub numele K&R, a servit pentru muli ani ca un mijloc de informare asupra specificaiilor limbajului C. Versiunea limbajului C descris este cunoscut sub numele K&R C. K&R C este adesea considerat limbajul de baz pe care orice compilator C trebuie s-l suporte. Pentru muli ani, chiar i dup introducerea standardului ANSI C, a fost considerat ca fiind cel mai mic numitor comun pe care programatorii n C trebuie s-l respecte atunci cnd se vorbete de portabiliitate maxim, deoarece nu toate compilatoarele sunt scrise nc s suporte standardul ANSI C, iar o secven de cod scris n K&R C respect i ANSI C. ANSI C i ISO C La sfritul anilor 1970, C a nceput s nlocuiasc limbajul BASIC devenind cel mai utilizat limbaj de programare. n anii 1980 a fost adptat si de calculatoarele IBM PC, popularitatea acestuia ncepnd s creasc semnificativ. n acest timp, Bjarne Stroustrup mpreun cu ali colegi de la Bell Labs au nceput s adauge limbajului C caracteristici ale programrii orientate pe obiecte. Limbajul rezultat a fost denumit C++ i este cel mai popular limbaj de programare pe sistemele de operare Microsoft Windows; totui C-ul rmne cel mai popular limbaj de programare n Unix. Alt limbaj de programare dezvoltat n acea vreme se numete Objective-C care adaug de asemenea C-ului caracteristici ale programrii orientate pe obiecte. Dei nu la fel de popular ca C++, Obejective-C este folosit pentru dezvoltarea aplicaiilor pe ce folosesc interfaa Cocoa a sistemului de operare Mac OS X.
45
n 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a stabili specificaiile unui limbaj C standard. Dup un proces ndelungat, standardul a fost terminat n 1989 i ratificat ca ANSI X3.159-1989 "Programming Language C". Aceast versiune a limbajului ne este cunoscut sub numele ANSI C. n 1990, standardul ANSI C (cu mici modificri) a fost adoptat de International Organization for Standardization (ISO) ca ISO/IEC 9899:1990. Una din intele procesului de standardizare ANSI C a fost acela de a produce un superset al K&R C, ncorpornd multe dintre caracteristicile neoficiale introduse secvenial. Totui, comitetul pentru standardizare a introdus cteva caracteristici noi, cum ar fi prototipul funciilor (mprumutat din C++) i un preprocesor mult mai capabil. ANSI C este suportat de marea majoritate a compilatoarelor folosite astzi. Mare parte din codul C scris acum este bazat pe ANSI C. Orice program scris exclusiv n standardul C este garantat s funcioneze corect pe orice platform cu o implementare C conform. Totui, multe programe sunt scrise astfel nct aceste vor putea fi compilate numai pe anumite platforme, sau folosind un anumit compilator, deoarece (i) se folosesc biblioteci non-standard, de exemplu pentru interfaa grafic, (ii) unele compilatoare ce nu respect standardul ANSI C, deci i urmaii lor n mod implicit sau (iii) bazarea pe dimensiunea unui anumit tip de date pe anumite platforme. Limbajul C est singurul limbaj de programare structurat care permite un control rigurosal hardwareuluii al perifericelor (facilitate oferit de limbajele de asamblare). Limbajul C a fost folosit iniial pentru scrierea programelor de sistem (sisteme de operare, editare, compilatoare, etc), dar o dat cu creterea popularitii lui, programatorii au nceput s-l foloseasc i la scrierea programelor de aplicaii datorit n special eficienei i portabilitii crescute a unor astfel de programe. Datorit calitilor sale incontestabile, limbajul C a devenit limbajul de baz i pentru programarea aplicaiilor de tip real.
46
O prim observaie important pe care trebuie s o facem este aceea c orice programn C este compus dintr-o serie de entiti numite funcii. O funcie, pentru a o deosebi de un cuvnt cheie oarecareal limbajului, se noteaz cu numele funciei, urmat de o pereche de paranteze rotunde: nume_funcie(); Funciile pot fi apelate att n cadrul expresiilor, ct i independent. Funcia main() este aceea ctre care sistemul de operare transfer controlul atunci cnd se lanseaz n execuie programul; fiecare program conine cel puin o funcie, i anume funcia main. Cel mai simplu program n C este urmtorul: Exemplul 3.1 main() { } Acest program nu realizeaz nimic. Se remarc funcia main, urmat de o pereche de paranteze rotunde, ce indic c aceasta este o funcie; ntre cele dou paranteze pot fi parametri formali, atunci cnd e nevoie. Se mai observ existena unei perechi de acolade ce ncadreaz corpul funciei, care n aceast situaie este instruciunea vid. Aceste paranteze se utilizeaz i pentru delimitarea altor blocuri ntlnite de exemplu n structurile iterative sau deczionale. Un program foarte simplu, care are ca rezultat afiarea textului Invatam limbajul C, este urmtorul: Exemplul 3.2 #include <stdio.h> main() { printf(Invatam limbajul C); } Pentru a realiza operaii de citire/scriere, limbajul C este nzestrat cu funcii specifice, n acest caz fiind folosit funcia printf, ce are un singur parametru, i anume textul ce va fi tiprit, cuprins ntre ghililmele. Se observ c acest program ncepe cu o prim linie de program, #include <stdio.h>, a crei semnificaie este urmtoarea: pentru ca o funcie s fie apelat (printf()), compilatorul trebuie s gseasc anumite informaii despre ea (prototipul su, care va fi explicat ulterior). Aceste informaii se gsesc ntr-un fiier, n acest caz numele lui este stdio.h. Extensia (h) este dat de faptul c un astfel de fiier este considerat de tip header (antet). Prototipurile funciilor care pot fi apelate n cadrul limbajului se gsesc grupate n fiiere de tip header; mai multe funcii nrudite au prototipurile grupate ntr-un astfel de fiier (de exemplu, cele de citire/scriere).
47
n procesul de transformare a textului surs n program executabil exist o etap care se execut naintea compilrii, i anume preprocesarea. n aceast etap fiierul header este inclus n textul surs. Linia de program: printf(Invatam limbajul C); formeaz o instruciune i ea este obligatoriu terminat cu semnul ;. Trebuie fcut observaia c spaiil albe (blank, tab, newline) sunt invizibile pentru compilator. Astfel, programul mai putea fi scris i aa: main(){printf(Invatam limbajul C);} Modul de scriere a programului folosit n exemplul anterior face ca acesta s devin mai uor de citit i de interpretat. n figura 3.1 este prezentat o sintez a celor prezentate pn acum. numele funciei parantezele pot include semn de terminare a unei instruciuni main() { printf(Invatam limbajul C); } instruciune
Programul poate conine comentarii, care pot fi plasate oriunde n text. Exist dou moduri de introducere a comentariilor: ntre perechile de caractere /* i */. Un astfel de comentariu poate ocupa mai multe linii ale programului surs. Exemplu: /*acesta este un comentariu.*/ n cazul n care dorim s scriem un comentariu pe o singur linie surs, tastm dou caractere /. De exemplu, o linie poate conine: printf(un text); //acesta este un comentariu. Comentariul ncepe dup cele dou caractere// i se termin o dat cu sfritul de linie.
48
Funcia printf() din acest exemplu este o funcie sistem, adic nu este creat de programator, care permite afiarea la consol (display) a constantelor, variabilelor i caracterelor. S observm modul de folosire al acestei funcii i n alte exemple. Considerm urmtorul program: Exemplul 3.3 main() { printf(Acesta este numarul sapte: %d,7); } n urma lansrii n execuie a programului, la consol va aprea: Acesta este numarul sapte: 7 n acest caz funcia printf() are dou argumente separate prin virgul, i anume un ir de caractere ncadrat ntre ghilimele i valoarea ntreag 7. Simbolul %d permite transferarea parametrului din dreapta virgulei valoarea 7 n stnga virgulei, alturi de irul de caractere. Acesta reprezint unul din formatele specifice utilizate de funcia printf(), i anume acela pentru scrierea numerelor ntregi. Pentru a nelege i mai bine modul de lucru al funciei printf(), s mai considerm un exemplu: Exemplul 3.4 main() { printf(%s este student in anul %d \n la facultatea ta., Mihai, 3); } n urma execuiei programului, se va afia: Mihai este student in anul 3 la facultatea ta. Aceasta nseamn c funcia printf() a nlocuit simbolul %s cu irul de caractere Mihai i simbolul %d cu numrul ntreg 3. Simbolul \n reprezint caracterul newline i are efect de carriage return and linefeed rnd nou i de la capt. Acesta este motivul c textul a fost afiat pe dou rnduri, dei el a fost scris n program ntr-un singur rnd. El formeaz o aa-numit secven escape. S considerm nc un exemplu de program:
49
Exemplul 3.5 main() { printf(Litera %c se gseste in cuvantul %s,h, Mihai); printf(pe pozitia %d.,3); } Dup executarea programului, se va afia: Litera h se gseste in cuvantul Mihai pe pozitia 3. Se observ c scrierea textului se face pe un singur rnd, cu toate c n program sunt dou linii de instruciuni. Aici heste caracter i se scrie cu formatul %c. Caracterele se delimiteaz de simbolul apostrof, iar irurile de caractere de ctre ghilimele. Din punct de vedere sintactic, un program scris n limbajul C este o secven de caractere ASCII. Este alctuit din elemente lexicale separate prin spaii: cuvinte cheie cu rol bine determinat n cadrul limbajului i care nu pot fi folosite n alt context. Exemplu for pentru instruciunea repetitiv cu contor; identificatori se folosesc pentru a denumi variabilele, funciile, etc. Se formeaz cu ajutorul literelor mari i mici, caracterul _ i cifrele de la 0 la 9. Un identificator trebuie s nceap cu o liter. Limbajul C face diferenierea dintre caracterele mari i mici. De exemplu, putem avea dou variabile cu numele Suma, respectiv suma; constante; operatori.
50
51
Limbajul C are cinci tipuri de date fundamentale, i anume: caracter: char ntreg: int real n virgul mobil, simpl precizie: float real n virgul mobil, dubl precizie: double tip de variabil neprecizat sau inexistent: void Modul de memorare a acestor tipuri de date depinde de tipul calculatorului i de varianta de implementare a limbajului C. Modul de implementare al lor poate fi modificat prin utilizarea unor declaraii suplimentare, cum ar fi: signed cu semn unsigned fr semn long lung short scurt Apelnd la o reprezentare uzual a limbajului C pe echipamentele PC, compatibile IBM sub sistemul de operare MS-DOS, tipurile de date definite de standardul ANSI i recunoscute de limbaj au reprezentarea dat n urmtorul tabel: Reprezentare Rang n bii char 8 -128 127 unsigned char 8 0 255 signed char 8 -128 127 int 16 -32768 32767 unsigned int 16 0 65535 signed int 16 -32768 32767 short int 16 -32768 32767 unsigned short int 16 0 65535 signed short int 16 -32768 - 32767 long int 32 -2 147 483 648 2 147 483 647 unsigned long int 32 0 4 294 967 295 signed long int 32 -2 147 483 648 2 147 483 647 float 32 10-17 - 1017 (6 digii precizie) double 64 10-308 - 10308 (10 digii precizie) long double 80 15 digii precizie Tabelul 3.1 Exemple de declaraii de variabile: int i, j, n; short int si; unsigned int ui; double balanta, profit; float time; S considerm un exemplu de program ce utilizeaz mai multe tipuri de variabile. Tip
53
Exemplul 3.7 main() { int n; float v; char ch; v=2.53; n=65; ch=A; printf(Caracterul %c are codul ASCII %d,ch, n); printf( si o frecventa de aparitie de %f %.,v); } n urma execuiei acestui program se va afia: Caracterul A are codul ASCII 65 si o frecventa de aparitie de 2.530000 %.
54
3.4 Constante
Exist mai multe tipuri de constante, dintre care acum se vor prezenta numai cele corespunztoare tipurilor predefinite. Constante ntregi Aceste constante se clasific astfel: zecimale n baza 10. Exemple: 23, 2314, 759. octale n baza 8. O constant n baza 8 se declar precedat de un 0 nesemnificativ. Exemplu:0523 se reine numrul ntreg 523(8). hexazecimale n baza 16. Acestea sunt precedate de 0X sau 0x. Exemplu: pentru 0X1A2 se memoreaz 1A2(16), iar pentru 0x1a2 se va memora 1a2(16). O constant ntreag poate lua valori ntre 0 i 4 294 967 295. Atenie! O constant ntreag este ntotdeauna pozitiv! n cazul n care se folosete semnul - (de exemplu -321) se consider c aceasta este o expresie constant, -fiind un operator unar Memorarea constantelor ntregi se face dup un mecanism implicit, adic fr intervenia programatorului, sau unul explicit. Mecanismul implicit const n alegerea tipului ntreg n funcie de valoare. Astfel, pentru constante ntregi zecimale: pentru valori ntre 0 i 32767 tipul int; pentru valori ntre 32768 i 2 147 483 647 tipul long int; pentru valori ntre 2 147 483 648 i 4 294 967 295 tipul unsigned long int; pentru valori peste 4 294 967 296 se reine o valoare trunchiat. Mecanismul explicit const n a fora ca o anumit constant s fie memorat aa cum o dorim prin adugarea unui sufix. Dac dorim ca o constant s fie memorat n tipul long, ea trebuie urmat de l sau L. De asemenea, dac dorim ca ea s fie de tip unsigned, aceasta trebuie s fie urmat de u sau U. Se pot folosi simultan l i u sau literele mari corespunztoare, indiferent ordinea. De exemplu, 123LU este o constant ce va fi memorat n tipul unsigned long, altfel ea ar fi fost memorat n tipul int. Constante caracter Acestea se reprezint ntre dou caractere apostrof (). Exemple: A, 1, a. Pentru memorarea lor se ytiliyeay[ tipul char, memorndu-sede fapt codul ASCII al caracterului respectiv. De exemplu, pentru 1 se memoreaz valoarea 49, iar pentru A, valoarea 65. Constantele caracter se mai pot declara i sub forma secvenelor escape. O astfel de secven ncepe prin caracterul \ (backslash). De exemplu, caracterul a are codul ASCII 97 10=141 8=61 16. Printr-o secven escape, constanta se introduce prin codul su ntr-una din
Proiectul pentru nvmntul Rural
55
bazele 8 sau 16: \141 sau \x61. Se observ c, atunci cnd este folosit baza 16, codul este precedat de caracterul x. Secvenele escape sunt utile pentru definirea caracterelor negrafice, cum ar fi caracterul newline, care are codul ASCII 1010 i care poate fi declarat sub forma \12 sau \xa. Pentru anumite caractere, exist notaii speciale sub form de secven escape. caracterul newline, amintit mai devreme, se poate scrie i \n. Alte exemple utilizate pentru secvenele escape: backslash: \\, \134, \x5c; apostrof: \, \47, \x27; bel: \a, \7, \x7; cr: \r, \15, \xd. Se admit i constante cu dou caractere, ca de exemplu AB. O astfel de constant este memorat utiliznd tipul int, cu observaia c primul caracter este memorat n al doilea octet, iar al doilea caracter n primul octet.. Constante reale Exemple de constante reale: -33.25, 2., 0.3, sau -3.75E-11(=-3.75*10-11). Constantele reale sunt memorate implicit utiliznd tipul double. i n acest caz se poate fora memorarea lor sub tipul float, dac se adaug sufixul f sau F, sau sub tipul long double, dac se adaug sufixul l sau L. 187.5 se memoreaz sub forma double; 187.5f se memoreaz sub forma float; 187.5L se memoreaz sub forma long double. Declararea constantelor Forma general a declarrii unei constante este alctuit din cuvntul const, urmat de tipul constantei (opional) tip, numele dat constantei nume i valoarea atribuit acesteia: const [tip] nume = valoare; Dac tipul constantei tip lipsete, atunci aceasta este implicit de tip int. Iat cteva exemple de declarare a constantelor: const int numar=15; constant ntreag denumit numar cu valoarea 15 const numar=15; la fel ca mai sus const float pi=3.14; constant de tip float, denumit pi i cu valoarea 3.14 Dac, de exemplu, n ultimul exemplu ar lipsi cuvntul const, asta ar nsemna c este o declarare de variabil de tip float, iniializat cu valoarea 3.14. Prezena modificatorului const determin protecia la modificare a variabilei pi. Cu alte cuvinte, pi este o variabil, are spaiu rezervat de memorie, dar reine o valoare ce nu poate fi modificat. Cuvntul cheie const este denumit modificator, pentru c are rolul de a modifica un enun, care iniial avea alt sens. 56
Proiectul pentru nvmntul Rural
Atenie! Limbajul C conine o serie de constante predefinite, foarte des utilizate n practic. Ele se gsesc m biblioteca math.h. Printre cele mai importante constante, se gsesc: numrul pi M_PI i derivate ale acestuia: M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI; numrul lui Euler, notat matematic cu simbolul e M_E; radical de ordinul doi din 2 M_SQRT2. Alte valori constante predefinite se gsesc n biblioteca limits.h, i anume cele care definesc limitele superioare i inferioare pe care le pot lua tipurile de date folosite n C. Iat cteva exemple: INT_MAX, INT_MIN, LONG_MAX, LONG_MIN, SGRT_MAX, SHRT_MIN, UINT_MAX, ULONG_MAX. Constantele iruri de caractere Aceste constante se scriu ntre ghilimele, iar la sfritul irului compilatorul adaug automat terminatorul de ir \0; aadar pentru memorarea unui ir se aloc un spaiu mai mare cu un octet dect lungimea irului. Un exemplu de ir constant: Exemplu de sir. n cadrul acestora se pot folosi secvee escape, precum: Mesaj sonor \a urmat de \n trecerea la o linie noua. Afiarea acestui text ntr-o instruciune de tiprire va avea ca efect producerea unui mic sunet (BELL) corespunztor secvenei escape \a i scrierea textului pe dou rnduri, datorit secvenei escape \n. Tipul enumerare Se folosete pentru a realiza o utilizare comod i sugestiv a valorilor folosite. El declar constante simbolice crora li se asociaz valori numerice ntregi. Declararea unui tip enumerare are sintaxa: enum nume_tip (lista_constante_simbolice); Compilatorul asociaz valoarea implicit zero pentru prima valoare enumerat, n cazul n care nu este specificat o anumit valoare. Pentru urmtoarele elemente din lista constantelor, valoarea lor va fi mrit cu o unitate fa de valoarea din poziia anterioar, dac nu este specificat o alt valoare. Exemplul 3.8 Se va exemplifica folosirea acestui tip enumerare prin mai multe declaraii echivalente: enum culori (rosu, galben, verde); enum culori (rosu, galben=1, verde); enum culori (rosu=0, galben, verde=2); alt valoare.
Proiectul pentru nvmntul Rural
57
Exemplul 3.9 Este definit tipul logic ca tip enumerare (Limbajul C nu are implementat acest tip de variabile, spre deosebire de alte limbaje de programare, ca de exemplu limbajul Pascal). enum boolean (false, true); Pentru false se d valoarea zero, iar pentru true se d valoarea unu. Exemplul 3.10 Un alt exemplu de definire a unei enumerri: enum timp (ieri, azi=3, maine=5); n acest caz ieri este iniializat cu valoarea zero, azi cu valoarea 3, iar maine cu valoarea 5. enum timp (ieri, azi=3, maine=azi); Este posibil ca dou constante s fie iniializate cu aceeai valoare (3 n acest caz).
58
tan()
sunt definite in biblioteca <math.h>. Toate aceste funcii, cu excepia lui "pow()" au un argument de tip "double" i returneaz o valoare de tip "double". Functia "pow()" are dou argumente de tip "double" i returneaza o valoare de tip "double".
f ( x ) = x 5 + ln (x )
Pentru rezolvarea acestui exerciiu se vor folosi dou variabile reale x i f; se vor folosi de asemenea dou funcii din cadrul bibliotecii matematice math.h. n figura 3.2 este artat programul scris n mediul BORLANDC FOR WINDOWS, mpreun cu rezultatul afiat.
Figura 3.2
59
R 2 h
3
5. Adevrat / Fals: pentru variabilele de tip logic, ce pot lua valorile true sau false, limbajul C are definit tipul de variabile boolean.
60
3.6 Operatori n C
Limbajul C este foarte dotat n materie de operatori, acordnd operatorilor mai mult importan dect majoritatea limbajelor de programare. C definete patruclase de operatori: aritmetici, relaionali, logici i pe bii. n plus, C mai dispune de anumii operatori speciali pentru anumite operaii.
61
float x; c=a; n=3; k=d; x=c+n; Dup prima atribuire caracterul c devine egal cu a. n urma celei de-a doua atribuiri n devine egal cu 3. La a treia atribuire k devine egal cu 100, deoarece expresia din membrul drept d, de tip caracter este convertit la un tip ntreg, avnd valoarea codului ASCII al caracterului respectiv. Dup ultima atribuire x devine egal tot cu 100, deoarece rezultatul adunrii dintre un operand de tip ntreg i unul de tip caracter se convertete n ntreg. Variabila c, iniial egal cu a, convertit n ntreg devine egal cu codul su ASCII, adic 97, care se adun cu 3, valoarea variabilei n. Rezultatul este deci 100. Din acest exemplu se poate observa c limbajul C permite operaii ntre operanzi de tipuri diferite, fcnd conversia tipului mai mic ca dimensiune n tipul corespunztor celeilalte variabile. Exemplul 3.13 Un exemplu de atribuire multipl: int x, y; float z; z=x=y=3; Dup evaluare, y reine valoarea 3, x devine egal cu y, adic tot 3, iar z reine valoarea 3.0, fcndu-se i conversia de la tipul ntreg la cel real.
Exemplul 3.14 Folosirea operatorilor aritmetici: int i, j, n; float x; // n=10*4-7; i=9/2; j=n%i; x=n; x=x%i; n urma primei atribuiri, n devine egal cu 33. La a doua atribuire, i va fi egal cu ctul mpririi ntregi a lui 9 la 2, adic 4. La a treia operaie, j devine egal cu restul mpririi ntregi a lui n la i,adic 1. La ultima operaie de atribuire se obine eroare, deoarece operatorul % este definit doar pentru numere ntregi. Exemplul 3.15 Un exemplu care arat obinerea unor rezultate diferite pentru aceleai calcule, datorit tipului diferit de variabile crora li se atribuie expresia respectiv: int i; float x; i=9./2; x=9./2; Valoarea expresiei din dreapta este n ambele cazuri egal cu 4.5. n cazul primei atribuiri ea este convertit la tipul ntreg, corespunztor variabilei i. Prin urmare, i devine egal cu 4, prin trunchiere. La cea de-a doua atribuire, x primete valoarea 4.5. n concluzie, rezultatul este convertit la tipul variabilei din membrul stng al atribuirii. Exemplul 3.16 n operaiile cu constante conteaz dac ele sunt de tip ntreg sau real: int i; i=3/2+9/2; i=3./2+9./2; Dup prima atribuire, i devine egal cu 5 (3/2=1, 9/2=4, 1+4=5), iar dup cea de+a doua atribuire i devine egal cu 6 (3./2=1.5, 9/2=4.5, 1.5+4.5=6).
63
n cazul n care o expresie aritmetic are operanzi de mai multe tipuri, regula general este: se convertete unul din operanzi ctre tipul celuilalt, care poate reine rezultatul. Iat paii efectuai n ordine de ctre calculator: I. 1. Orice operand de tip char este convertit ctre tipul int; 2. Orice operand de tip unsigned char este convertit ctre tipul int; 3. Orice operand de tip short este convertit ctre tipul int; II. Dac un operand este de tipul long double, atunci i cellalt operand se convertete ctre acest tip; III. Dac un operand este de tipul double, atunci i cellalt operand se convertete ctre acest tip; IV. Dac un operand este de tipul float, atunci i cellalt operand se convertete ctre acest tip; V. Dac un operand este de tipul unsigned long, atunci i cellalt operand se convertete ctre acest tip; VI. Dac un operand este de tipul long, atunci i cellalt operand se convertete ctre acest tip. Dup execuia acestor pai, cei doi operanzi sunt de acelai tip, iar rezultatul va fi de tipul comun lor. Exemplul 3.17 Fie declaraia: int a=10; Atunci expresia 4*a/3 este de tip int i la evaluare se obine 13 (4*10=40, 40/3=13 mprire ntreag). n aceleai condiii, expresia 4*(a/3) are ca rezultat valoarea 12. Mai nti se calculeaz a/3 , rezultnd valoarea 3; apoi se efectueaz 4*3=12. Acesta este un exemplu din care se poate observa c o expresie n C nu este acelai lucru cu o expresie matematic. Fie declaraia: float a=10; Atunci expresia 4*a/3 este de tip float i la evaluare se obine 13.3333 (4*10=40, numr real 40/3=13.3333 mprire real). Operatori de incrementare i decrementare Limbajul C include doi operatori utili, care n general nu apar n alte limbaje de programare, i anume operatorii de incrementare i de decrementare, ++, respectiv --. Operatorul ++ adaug o unitate la operand, iar scade o unitate din operand. Cu alte cuvinte x=x+1; este echivalent cu iar x=x-1; este echivalent cu x--; Att operatorul de incrementare, ct i cel de decrementare pot precede prefixa sau urma postfixa operandul. De exemplu, x=x+1; poate fi scris ca x++; sau ++x; x++;
64
Exist totui diferene ntre formele de prefix sau postfix la utilizarea acestor operatori ntr-o expresie. Cnd operatorul de incrementare sau de decrementare i precede operandul, C execut opearia de incrementare sau de decrementare nainte de a folosi operandul respectiv n expresie. Dac operatorul succede operandului, C calculeaz valoarea operandului nainte de a o incrementa sau decrementa. De exemplu, x=10; y=++x; stabilete valoarea lui y la 11. Dac ns codul se scrie astfel: x=10; y=x++; atunci valoarea lui y va fi egal cu 10. Indiferent de procedeu, x va fi egal cu 11; diferena const n modul n care se ajunge la aceast valoare. Majoritatea compilatoarelor de C genereaz coduri obiect foarte rapide i eficiente pentru operaiile de incrementare sau decrementare, coduri mai performante dect cele folosite de o instruciune obinuit de atribuire. Din acest motiv este bine s folosii aceti operatori ori de cte ori avei posibilitatea. Precedena sau ordinea prioritii operatorilor aritmetici este: cel mai prioritar cel mai puin prioritar ++ -- (minus unar) */% +-
Operatorii cu aceeai proritate sunt evaluai de ctre compilator de la stnga la dreapta. Se pot folosi paranteze rotunde pentru a modifica ordinea evalurii. Exemplul 3.18 main() { int n=0; printf(Numar=%d\n, n); printf(Numar=%d\n, n++); printf(Numar=%d\n, n); } n urma executrii acestui program se va afia: Numar=0 Numar=0 Numar=1 aceasta deoarece la prima afiare variabila n are valoarea zero, la a doua afiare n are la nceput aceeai valoare, zero, dup care se face
Proiectul pentru nvmntul Rural
65
incrementarea acesteia, n devenind egal cu 1; la ultima afiare va fi tiprit noua valoare a lui n, adic 1. Dac vom scrie acelai program dup cum urmeaz, execuia va fi diferit: main() { int n=0; printf(Numar=%d\n, n); printf(Numar=%d\n, ++n); printf(Numar=%d\n, n); } La executarea acestui program se va afia: Numar=0 Numar=1 Numar=1 Diferena apare la cea de-a doua afiare, cnd se face mai nti incrementarea variabilei n preincrementare urmat de afiarea ei. Operatorul de decrementare (--) lucreaz n mod similar.
Operatori relaionali Operator > >= < <= == != Aciune Mai mare dect Mai mare sau egal Mai mic Mai mic sau egal Egal Diferit Operatori logici Operator && || ! Aciune I AND SAU OR negare NOT Tabelul 3.3 Att operatorii relaionali, ct i cei logici au o prioritate mai redus dect operatorii aritmetici. O expresie de forma 7>3+5 este evaluat ca i cum ar fi fost scris 7>(3+5); reultatul este Fals, adic zero. ntr-o expresie se pot combina mai multe operaii, ca n exemplul urmtor: 10>5 && !(9<5) || 3<=5 Rezultatul acestei expresii este Adevrat (mai nti se evalueaz paranteza 9<5 fals - , apoi aceasta este negat, rezultnd adevrat; din 5&&1 rezultnd de asemenea 1, adic Adevrat; 3<=5 este tot Adevrat, 1||1este Adevrat; ultima evaluare este 10>1, deci Adevrat). Precedena relativ a operatorilor relaionali i logici este: cel mai prioritar ! > >= < <= == != && ||
Toate expresiile relaionale i logice dau un rezultat egal fie cu zero, fie cu 1 (fals sau adevrat). main() { int n; n=100;
Proiectul pentru nvmntul Rural
67
printf(%d>10 da rezultatul %d\n, n, n>10); printf(%d==100 da rezultatul %d\n, n, n==100); printf(%d<=10 da rezultatul %d\n, n, n<=10); printf(%d>10 || %d<50 da rezultatul %d\n, n, n>10 || n<50); } n urma executrii acestui program se va afia: 100>10 da rezultatul 1 100==100 da rezultatul 1 100<=10 da rezultatul 0 100>10 || 100<50 da rezultatul 1
Exist 10 combinaii posibile permise operatorilor de atribuire compus, i anume 5 combinaii cu operatori aritmetici: += -= *= /= %= i 5 combinaii cu operatori pe bii: |= &= ^= <<= >>= Folosirea operatorului de atribuire compus determin o execuie a instruciunii mult mai rapid, deoarece procesorul, cunoscnd c primul operand i rezultatul au aceeai locaie de memorie, folosete un numr mai mic de operaii, avnd nevoie de un timp de execuie mai mic dect atribuirea n cazul general. Exemplul 3.25 a) Folosirea operatorului de aflare a restului mpririi: int i=16, j=5; i%=j; Valoarea variabilei i devine 1. b) Folosirea operatorului de deplasare pe bii: int i=3, j=4; 68
Proiectul pentru nvmntul Rural
i<<=j; Valoarea variabilei i devine 48. c) Folosirea operatorului de deplasare la dreapta pe bii i apoi a operatorului aritmetic de adunare: int a=3, b=5,c; a += b >>= c = 2; Valoarea variabilei a se determin astfel: mai nti lui c i se atribuie valoarea 2, dup care b devine 1 (5/2/2); a va primi n final valoarea 4 (3+1).
69
octei, urmtorul program: float f; printf(%d ,sizeof (f)); printf(%d ,sizeof (int)); va afia numerele 8 i 2.
n ansamblu, expresia este de tipul lui Exp2 sau al lui Exp3, n funcie de cea care se evalueaz i produce valoarea corespunztoare expresiei evaluate. Exemplul 3.29 Pentru un numr real x, citit de la tastatur, s se afieze valoarea absolut a acestuia (modulul). #include <stdio.h> void main() { float x; printf(x=); scanf(%f,&x); printf(%f, x>=0? x: -x); } ntreaga expresie condiional a fost scris ca un parametru pentru printf(). Se testeaz dac x este mai mare sau egal cu zero i n cazul n care condiia este ndeplinit, se evalueaz x, a doua expresie; n cazul n care x este negativ, se evalueaz x, a treia expresie; se va tipri valoarea expresiei evaluate. Exemplul 3.30 Fie declaraiile: double x, y, aux; Expresia: x > y ? (aux=x: x=y, y=aux) : y; are ca efect ordonarea variabilelor x i y n ordine cresctoare. Ca rezultat se obine cea mai mare valoare dintre cele dou variabile.
2. Rescriei instruciunile urmtoare folosind operatorul postdecrementare sau operatorul de atribuire compus: numar=numar+1; poz=poz-1; pas=pas*3; 3. Expresiile urmtoare sunt adevrate sau false? a) 1>2; c) 1= =2; b) a<b; d) 3= =3; 4. Este corect fcut comentariul urmtor? /*Acesta este /*un comentariu care ocup /*mai multe rnduri */ 5. Scopul operatorului condiional este: a) alege dintre dou valori pe cea mai mare; b) decide dac dou valori sunt egale: c) alege alternativ una din dou valori; d) alege una din dou valori n funcie de o condiie
de
preincrementare,
72
4) A
Testul de autoevaluare 3.2 : Rspunsuri corecte: 1 a, b, d Vezi U3.3 Variabile, tipuri de variabile i declarare 2A Vezi U3.3 Variabile, tipuri de variabile i declarare 34 Vezi U3.3 Variabile, tipuri de variabile i declarare 4 -32768, 32767 Vezi U3.3 Variabile, tipuri de variabile i declarare 5F Vezi U3.3 Variabile, tipuri de variabile i declarare Testul de autoevaluare 3.3
1 a, b, d, e; Vezi U3. 4 Constante pag 54 2 math.h Vezi U3. 4 Constante pag 54 x 4 3 x , lg x, sin(a+b), 2 x + e Vezi U 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg pag 57 4 sin(5*x*x) , sqrt(a*a+b*b+c*c), pow(3, x-2), M_PI*R*R*h/3 Vezi U 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg pag 57 5F Vezi U3. 4 Constante pag 54 Testul de autoevaluare 3.4 1 a, c 2 ++numar; poz--; pas*=3; 3 F, A, F, F 4 Nu 5d Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60
BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Cap.2 Tipuri de date, Editura Radial, Galati, 1998. 2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic Cap.17 Structura programelor n limbajul C. Tipuri de date, operatori i expresii, Editura Didactic i Pedagogic, Bucureti, 1995.
73
3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura Niculescu, Bucureti, 2003. 4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar 5. Herbert Schildt, C manual complet Cap1 C, vedere de ansamblu, Cap2 Expresii C, Editura Teora, 2000 6. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele C si C++. 7. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum si pentru alte limbaje. 8. http://www.snippets.org exemple de programe scrise in limbajul C.
a) x=12; y=14; b) x=9; y=7; c) x=7; y=14; 5. Care dintre urmtoarele atribuiri sunt corecte? int a, b; float d; char c; a) c=5; b) d=a%b; c) a=d/3; d) a=(d<c); e) d=sqrt(a+b);
d) e)
6. Care dintre expresiile urmtoare sunt incorecte, tiind c operanzii care intervin sunt de tip ntreg? a) (a!=b) && (c<b) b) a+-3+b c) a-a/b (a-3) d) ! (a<b) e) b+%a 7. Care din urmtoarele afirmaii sunt adevrate? a) Un algoritm se execut de un numr finit de ori pentru orice set de date de intrare. b) Un algoritm prelucreaz numai datele de intrare, fr obinerea unor date intermediare. c) La analiza enunului unei probleme sunt identificate datele de intrare i cele de ieire. 8. tiind c x este o variabil folosit pentru citirea mai multor numere ntregi, cum va fi declarat aceasta? a) integer x; b) x=int; c) int x; d) char x; 9. tiind c variabila n va fi utilizat ntr-un program pentru a reine un numr ntreg cu maxim 10 cifre, care va fi varianta corect pentru declararea sa? a) int n; b) unsigned long n; c) unsigned n; d) long n;
75
Obiectivele Unitii de nvare 4 ....................................................................................76 4.1 Noiuni introductive ...................................................................................................76 4.2 Funcia de scriere cu format .....................................................................................77 4.3 Funcia de citire cu format ........................................................................................81 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ..........86 Bibliografie .......................................................................................................................87 Lucrarea de verificare Nr. 4, notat de tutore............................................................... 87
Identificai diferitele tipuri de formate ale variabilelor n operaiile de citire/scriere Comparai diversele metode de citire/scriere Efectuai operaii de citire/scriere pentru diverse tipuri de variabile
4.1
Noiuni introductive
S definim, mai nti, o noiune foarte des ntlnit n limbajul C, i anume cea de stream. Stream-ul reprezint un concept abstract ce definete orice flux de date de la o surs la o destinaie. Atunci cnd sursa este memoria intern, iar destinaia este un fiier oarecare, se spune c este un stream de ieire (pe scurt, ieire sau scriere). Atunci cnd sursa este un fiier oarecare, iar destinaia este memoria intern, se spune c este un stream de intrare (pe scurt, intrare sau citire). Un caz aparte de ieire este acela n care datele sunt scrise pe monitor, situaie n care fiierul poart o denumire standard: stdout, dup cum un caz aparte de intrare este acela n care datele se preiau de la tastatur fiier standard numit stdin. Cele dou fiiere (stdout i stdin) sunt atribuite automat oricrui program scris n C. De asemenea, ele sunt deschise automat la lansarea n execuie a programului i nchise atunci cnd execuia se termin. Din acest motiv, operaiile de intrare/ieire efectuate cu ajutorul lor poart denumirea de intrri/ieiri standard.
76
Aceste fiiere sunt privite ca fiiere de caractere (fiiere text), de aceea sunt necesare anumite conversii. n memoria intern, datele au o anumit reprezentare (float, int). Pentru a putea fi vizualizate (scrise pe monitor) este necesar conversia lor n iruri de caractere. Invers, la citire se introduc iruri de caractere, iar acestea trebuie convertite ctre tipul sub care se memoreaz. Conversiile se efectueaz sub controlul unor formate specifice. Prototipurile funciilor de citire/scriere standard se gsesc n biblioteca stdio.h (standard input/output).
4.2
n plus se pot folosi urmtoarele prefixe: l cu d, i, u, o, x, X urmeaz s afieze o dat de tip long; cu f, e, E, g urmeaz s afieze o dat de tip double;
Proiectul pentru nvmntul Rural
77
h cu d, i, u, o, x, X urmeaz s afieze o dat de tip short; L cu f, e, E, g urmeaz s afieze o dat de tip long double; De exemplu, %ld va afia o dat de tip long int, iar %hu va afia o dat de tip short unsignet int. Comenzile de format pot avea modificatori care specific dimensiunea cmpului, precizia, precum i un flag (indicator) pentru alinierea la stnga. Un ntreg plasat ntre simbolul procentului i comanda de format se comport ca un specificator al dimensiunii minime de cmp, care adaug datelor de ieire un numr de cmpuri libere sau zerouri, pentru a asigura lungimea minim. Dac irul sau numrul afiat este mai mare dect lungimea minim, atunci va fi afiat integral. Bordarea prestabilit se execut cu spaii. Pentru valori numerice, dac se dorete bordarea cu zerouri, se insereaz un zero naintea specificatorului dimensiunii de cmp. De exemplu, cmanda %05d nseamn zerouri naintea unui numr cu mai puin de cinci cifre. Exemplul 4.1 n urma executrii urmtorului program: main() { int num; num=12345; printf(%d\n, num); printf(%3d\n, num); printf(%10d\n, num); printf(%03d\n, num); printf(%010d\n, num); } vor rezulta urmtoarele modaliti de scriere a valorii numerelor: 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 0 0 0 0 0 1 2 3 4 5 Efectul modificatorului de precizie depinde de tipul comenzii de format pe care o determin. Pentru a insera un modificator de precizie se adaug un punct zecimal, urmat de precizia dorit, dup specificatorul dimensiunii de cmp. Pentru formatele e, E i f modificatorul de precizie determin numrul de cifre dup virgul. De exemplu, comanda %10.4f afieaz un numr de cel mult 10 cifre, cu 4 cifre dup virgul. Cnd este folosit specificatorul g sau G, precizia determin numrul maxim de cifre semnificative afiate. 78
Cnd modificatorul de precizie se aplic numerelor ntregi, acesta indic numrul minim de cifre ce vor fi afiate. Cnd modificatorul de precizie se aplic irurilor de caractere, numrul care urmeaz dup punct indic lungimea maxim a cmpului. De exemplu, comanda %5.7s afieaz un ir care are minimum cinci caractere lungime, dar nu mai mult de apte. Dac irul este mai lung dect lungimea maxim, caracterele din final sunt omise. Exemplul 4.2 main() { printf(%.4f\n,12.1234567); printf(%3.8d\n, 1000); printf(%10.8d\n,1000); printf(%10.15s\n, Acesta este un text); printf(%10.15s\n, PROGRAM); printf(%3.1d\n,1000); } n urma execuiei acestui program, se va afia: 1 2 3 . 1 2 3 5 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 A c e s t a e s t e u n P R O G R A M 1 0 0 0 Toate datele de ieire, n mod implicit, sunt aliniate la dreapta, adic, dac limea cmpului este mai mare dect datele afiate, datele se plaseaz lng marginea din dreapta a cmpului. Se poate fora alinierea la stnga a informaiei prin plasarea unui semn - imediat dup simbolul procentului. De exemplu, comanda %-10.2f aliniaz la stnga, ntr-un cmp de 10 caractere, un numr n virgul mobil cu dou cifre dup virgul. Exemplul 4.3 Acest exemplu scoate n eviden diversele faciliti oferite de funcia printf() referitoare la diversele formate ale afirii. main() { float val; val=10.12304; printf(%8.1f%8.1f\n, 12.3,525.7); printf(%-8.1f%-8.1f\n, 12.3,525.7); printf(%f\n, val); printf(%5.2f\n, val);
Proiectul pentru nvmntul Rural
79
printf(%10f\n, val); printf(%012f\n, val); printf(%-10f\n, val); printf(%-012f\n, val); } n urma executrii acestui program, rezultatele vor fi afiate astfel: 1 2 1 2 . 5 1 0 . 1 2 3 1 0 . 1 2 1 0 . 1 2 0 0 0 1 0 . 1 0 . 1 2 3 1 0 . 1 2 3 . 5 5 2 5 0 4 0 3 1 0 0 0 2 4 4 5 2 5 . 7 . 7
4 0 3 0 4 0 0 0 0 0 0
80
4.3
n acest program, pe lng funcia scanf(), mai apar dou alte elemente noi: - operatorul de multiplicare (*) - operatorul adres (&). Pentru moment trebuie reinut faptul foarte important c funcia scanf() cere utilizarea simbolului adres - & - naintea numelui fiecrei variabile. Specificare formatelor pentru funcia scanf() este similar, cu mici excepii, cu cea pentru funcia printf(); de exemplu, nu sunt acceptate formatele %i i %g. Funcia scanf() poate accepta, n acelai timp, mai multe intrri de date de tipuri diferite. Exemplul 4.5 main() { int ev; float timp; char poz; printf(Introduceti poz, ev,timp: ) scanf(%c %d %f, &poz, &ev, &timp); printf(Evenimentul %c are numarul %d,poz,ev); printf( si a avut loc la %f timp.,timp); } Valori i spaii introduse de utilizator
12.30
poz ev
timp
12.30
Figura 4.1
82
n urma execuiei acestui program se va putea afia, n funcie de valorile introduse: Introduceti poz, ev,timp: M 5 12.30 Evenimentul M are numarul 5 si a avut loc la 12.30. Variabilele poz, ev, timp au fost introduse de la consol. Separarea lor corect la introducere se poate face numai prin spaiu (blank), return sau tab, orice alt separator (linie, virgul) nerealiznd aceast separare. Se pot introduce datele i separate prin (;) dac n funcia scanf() se specific aceasta n mod expres (ntre simbolurile de formate se va pune (;)). n figura 4.1 se explic cum lucreaz funcia scanf(). Specificatorul de format precizeaz modul n care se interpreteaz datele de intrare i are forma general: %[*] [latime] [h | l | L] tip_conversie Caracterul % marcheaz nceputul unui specificator de format; Caracterul * are rolul de a determina citirea cmpului de intrare cu specificatorul de format din care face parte, fr ca aceast valoare s fie memorat; cmpul citit astfel nu este numratn cadrul valorii ntoarse de funcia scanf() latime precizeaz numrul maxim de octei din cmpul de intrare care vor fi citii; tip_conversie indic natura conversiei. Principiul de execuie a funciei scanf() Se analizeaz cele dou iruri de caractere, i anume irul transmis ca parametru funciei i irul de caractere pe care l tastm. Pentru fiecare din ele ne imaginm o sgeat (pointer) care indic unul din caracterele irului. Iniial, pentru fiecare din iruri, sgeata indicprimul caracter. n cadrul irului parametru, un caracter poate fi: I. un caracter oarecare, care nu este alb i nu este %; II. caracterul este alb; III. caracterul este %. I Se testeaz existena n irul de intrare a caracterului respectiv (de exemplu, dac caracterul este 3, se testeaz existena n irul de intrare a acestui caracter -3-). Exist dou posibiliti: n irul de intrare este gsit acest caracter, caz n care pointerul sgeata avanseaz n ambele iruri cu cte un caracter; nu este gsit acest caracter n irul de intrare, caz n care citirea este ntrerupt, iar funcia returneaz numrul de cmpuri citite i convertite pn n acel moment. II Pointerul indic n irul parametru un caracter alb. Se analizeaz caracterul indicat n irul de intrare, existnd de asemenea dou posibiliti:
83