Sunteți pe pagina 1din 214

2006

Program postuniversitar de conversie profesional


pentru cadrele didactice din mediul rural
PROGRAMAREA CALCULATOARELOR
Florentina MOCRIENCO Daniela VLDOIU
Specializarea TEHNOLOGIA INFORMAIEI
Forma de nvmnt ID - semestrul III
Ministerul Educaiei i Cercetrii
Proiectul pentru nvmntul Rural










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







































ISBN 10 973-0-04555-0;
ISBN 13 978-973-0-04555-0.
Cuprins
Proiectul pentru nvmntul Rural i

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
Cuprins
ii Proiectul pentru nvmntul Rural
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

Cuprins
Proiectul pentru nvmntul Rural iii

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

Introducere
iv Proiectul pentru nvmntul Rural

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:

Identificai rolul entitilor algoritm, program i limbaj de
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.

Introducere
Proiectul pentru nvmntul Rural v
Structurarea modulului pe uniti de nvare



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



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.


Stabilirea
unitilor de
nvare
Construirea
competenelor
Construirea
coninuturilor
Introducere
vi Proiectul pentru nvmntul Rural
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:

1. adnotrile nscrise aici (elemente grafice sau de text) atrag atenia i
te ajut la identificarea sau consolidarea unor informaii importante;
2. spaiul alb poate fi folosit pentru notie, completri, observaii.


Atenie!

Folosete spaiul alb! El are rolul de a te ajuta n nvare.

Coninuturile sunt ntrerupte din loc n loc de diverse sarcini de lucru.
Sarcinile de lucru sunt cuprinse n chenar i sunt anunate prin titluri
specifice i prin imagini sugestive.
De exemplu, n chenarul de mai jos este formulat o sarcin de lucru.


Tem de reflecie

Indetific sarcinile de lucru formulate anterior. Ce rol crezi c au n
aceast parte introductiv?
Folosete spaiul liber de mai jos pentru rspuns.

















Folosete
spaiul alb
pentru
notie!
Spaiu
pentru
rspuns
Introducere
Proiectul pentru nvmntul Rural vii
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.






Introducere
viii Proiectul pentru nvmntul Rural
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.

Cum se face
evaluarea?
Introducere
Proiectul pentru nvmntul Rural ix

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!



Recitete introducerea pentru fixarea noiunilor!



Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 1

Unitatea de nvare Nr. 1

DEFINIREA NOIUNILOR DE ALGORITM, PROGRAM I LIMBAJ DE
PROGRAMARE


Cuprins Pagina

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


Obiectivele Unitii de nvare 1

Dup parcurgerea acestei uniti de nvare vei fi capabili s:

Definii noiunile de algoritm, program i limbaj de programare
Identificai principalele etape de rezolvare a unei probleme
Reprezentai diveri algoritmi n pseudocod
Explicai principiile programrii structurate n procesul de elaborare a
algoritmilor
Identificai principalele etape de implementare n limbaj de programare a unui algoritm


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
Definirea noiunilor de algoritm, program i limbaj de programare
2 Proiectul pentru nvmntul Rural
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.


Exemplul 1.1

a. Algoritmul mpririi ntregi a dou numere naturale

Se tie c mprirea ntreag a dou numere const din efectuarea unor
scderi succesive, pn cnd desczutul devine mai mic dect scztorul.
Pentru fiecare scdere care se efectueaz, desczutul este rezultatul
scderii precedente, iar scztorul este mpritorul. Rezultatul ultimei
scderi efectuate este tocmai restul mpririi celor dou numere, iar
numrul de scderi efectuate reprezint ctul mpririi.

Paii acestui algoritm sunt constituii de operaiile de scdere i de
operaiile de comparare a desczutului cu scztorul. Este evident c irul
acestor operaii este finit, deoarece desczutul se micoreaz cu fiecare
nou scdere, n timp ce scztorul rmne neschimbat.

Fie, de exemplu, numerele 23 i 7. Paii algoritmului care duc la aflarea
ctului i restului mpririi sunt prezentai n tabelul 1.1.

Operaia Pasul Numrul scderii
scdere 23-7 = 16 1
comparare 16<7 nu -
scdere 16-7 = 9 2
comparare 9<7 nu -
scdere
9-7 = 2 3
comparare 2<7 da
(desczutul este mai mic dect scztorul)
-

Tabelul 1.1

Numrul de scderi efectuate este 3, iar rezultatul ultimei scderi
efectuate este 2, deci ctul mpririi numrului 23 prin 7 este 3, iar restul
este 2.


Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 3
b. Algoritmul lui Euclid


Acest algoritm se folosete pentru obinerea celui mai mare divizor comun
a dou numere naturale. Notm cele dou numere naturale a i b.
Algoritmul const din efectuarea unui ir de mpriri ntregi pn cnd se
obine un rest nul. Pentru fiecare mprire care se efectueaz, mpritorul
este restul mpririi precedente, iar dempritul este mpritorul din
mprirea precedent. mpritorul din ultima mprire efectuat constituie
cel mai mare divizor comun al celor dou numere.

Paii acestui algoritm sunt constituii din operaiile de mprire i de
verificare a anulrii restului. Deoarece restul unei mpriri este mai mic
dect mpritorul, irul de resturi al mpririlor succesive este strict
descresctor, astfel c numrul de mpriri din algoritm este finit.

Fie, de exemplu, numerele 78 i 30. Paii algoritmului care conduc la
aflarea celui mai mare divizor comun al acestor numere sunt prezentai n
tabelulu 1.2.

Pasul Operaia
78: 30 = 2 rest 18 mprire
18=0 ? nu verificare
30: 18 =1 rest 12 mprire
12 = 0 ? nu verificare
18: 12 = 1 rest 6 mprire
6 = 0 ? nu verificare
12: 6 =2 rest 0 mprire
0 = 0 ? da verificare

Tabelul 1.2

Algoritmul se ncheie n momentul obinerii restului zero: rezultatul n acest
caz este 6.


Definirea noiunilor de algoritm, program i limbaj de programare
4 Proiectul pentru nvmntul Rural

Test de autoevaluare 1.1

Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

Adevrat / Fals

1. Noiunea de algoritm a aprut odat cu apariia primelor calculatoare personale. A/F


2. Termenul de algoritm se poate defini n termeni matematici foarte exaci. A/F


3. n cazul algoritmului de mprire prin scderi repetate, numrul de scderi efectuate va
reprezenta, n final, ctul mpririi. A/F


4. Aplicnd algoritmul lui Euclid pentru numerele 84 i 20, vor fi efectuate 2 mpriri. A/F


5. Algoritmul lui Euclid nu se poate aplica dac primul numr este mai mic dect al doilea.
A/F



Variantele corecte de rspuns se afl la pagina 20.


1.2 Propietile algoritmilor

Un algoritm trebuie s aib urmtoarele trei propieti fundamentale,
numite i propietile de baz ale algoritmilor:

1. Claritatea. Orice algoritm trebuie s fie caracterizat printr-o
descriere precis, riguroas, fr ambiguiti a tuturor aciunilor ce
urmeaz a fi executate. Un algoritm, datorit caracterului su de
automatism, trebuie s precizeze n mod univoc toate etapele de calcul pe
care le va urma executantul algoritmului (omul sau maina). De aceea,
aceast propietate este denumit uneori i unicitate.
2. Generalitatea. Un algoritm este util dac rezolv nu numai o
problem paticular, concret, ci o ntreag clas de probleme
asemntoare. Aceasta nseamn c un algoritm trebuie s se aplice la o
mulime de sisteme de date iniiale. Aceast mulime poart numele de
domeniu de aplicabilitate al algoritmului.

De exemplu, algoritmul lui Euclid se poate aplica la orice pereche de
numere naturale strict pozitive. Vom spune deci c domeniul de
aplicabilitate al algoritmului lui Euclid este mulimea perechilor de numere
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 5
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 se are n vedere un dreptunghi;
o baza dreptunghiului este de 2,75 uniti;
o inlimea dreptunghiului este de 1,4 uniti;
o se cer aria i perimetrul dreptunghiului.
Enunul nu conine dect o descriere a problemei, nu i modul n care ea
trebuie rezolvat.

Remarcm c persoana care rezolv aceast problem trebuie s aib o serie de cunotine: ce este un
dreptunghi, ce sunt baza i nlimea dreptunghiului, care sunt formulele de calcul pentru aria i perimetrul
dreptunghiului, care sunt unitile de msur i relaiile dintre ele. Pe baza acestor cunotine, persoana
respectiv deduce c:
- 2,75 i 1,4 sunt de fapt msurile bazei i respectiv nlimii dreptunghiului, exprimate n uniti dimensionale
de lungime;
- aria se poate calcula aplicnd formula arie = baza * nlime (unde '*' este operatorul de nmulire);
- perimetrul se poate calcula cu formula perimetru = (baza +nlime)*2;
Dac am dori ca i calculatorul s rezolve aceast problem la fel cum o face omul, ar trebui s aib
aceleai cunotine, ceea ce se ncearc acum s se realizeze n cadrul sistemelor de inteligen artificial
prin sisteme de programe adecvate acestui scop. Calculatorul n sine este ns o simpl "main", care
poate executa fidel, rapid i bine nite comenzi, dar nu nelege ceea ce face.
ntreaga responsabilitate a rezolvrii problemei revine celui care ntocmete "programul", care trebuie s
stabileasc succesiunea de instructiuni (comenzi) pe care trebuie s le execute calculatorul pentru a rezolva
problema. S vedem deci cum am putea concepe o succesiune de instruciuni, a crei executare de ctre
sistem (fie acesta un om sau o main) s conduc de la ce "se d" la ce "se cere" n problema de mai sus,
fr a fi necesar ca sistemul s cunoasc problema sau, cu att mai mult, s o neleag.

Definirea noiunilor de algoritm, program i limbaj de programare
6 Proiectul pentru nvmntul Rural
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;
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 7
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.

Test de autoevaluare 1.2

Completai spaiile libere din urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80


1. Un algoritm trebuie s precizeze n mod toate etapele de calcul ce vor fi
executate


2. Propietate algoritmului numit claritate mai este cunoscut i cu denumirea
......................


3. Propietate unui algoritm de a rezolva o ntreag clas de probleme asemntoare se
numete


4. Mulimea sistemelor de date iniiale se numete ......................................


5. Numrul de pai ce trebuie s fie executai ntr-un algoritm trebuie s fie .....................,
iar aceast propietate poart denumirea de .......................


Variantele corecte de rspuns se afl la pagina 20.
Definirea noiunilor de algoritm, program i limbaj de programare
8 Proiectul pentru nvmntul Rural
1.3 Programe i limbaje de programare

Calculatoarele reprezint un instrument de lucru din ce n ce mai
rspndit, cu o gam de aplicaii extrem de cuprinztoare, cum ar fi
finanele, comerul, industria de toate tipurile, cercetarea tiinific,
medicina, educaia, sisteme de comunicaii, etc.

Orice calculator are dou pri principale, i anume hardware-ul i
software-ul, primul referindu-se la totalitatea componentelor electronice,
iar cel de-al doilea la totalitatea programelor disponibile ntr-un sistem de
calcul.

Calculatorului i se pot furniza instruciuni prin apsarea tastelor
funcionale, dar el nu poate fi folosit la o vitez corespunztoare dac
instruciunile nu i sunt furnizate rapid, pe msura execuiei lor. Pentru a
face posibil acest lucru, n memorie, alturi de date, se plaseaz i
instrucunile, codificate numeric. n funcionarea sa, calculatorul repet
urmtorul ciclu de lucru:
Unitatea central extrage din memorie urmtoarea instruciune;
Unitatea de comand decodific instruciunea i o transform n
semnale electronice;
Ca rspuns la aceste semnale electronice, instruciunea va fi
executat de ctre unitatea aritmetic, cu sau fr implicarea
memoriei sau a unui dispozitiv periferic;
Se reia lucrul de la primul pas.

Astfel se pot executa automat, la viteza de lucru a procesorului, chiar i
secvene lungi de instruciuni, o astfel de secven numindu-se program.

La nceput, calculatoarele erau programate cu ajutorul codului main
(adic instruciunile le erau furnizate direct n form numeric), dar foarte
repede au fost evideniate mai multe neajunsuri ale acestei metode:
datorit naturii primitive a instruciunilor n cod main, folosirea
acestora eara greoaie i genera multe erori;
programele scrise n cod main erau prea greu de neles i de
modificat;
programarea reprezenta o activitate consumatoare de timp i
costisitoare; era necesar ca s se poat folosi acelai program pe
sisteme de calcul diferite portabilitate, ceea ce nu era posibil n
cazul unui program scris n cod main, care era specific unui anumit
tip de calculator i nu putea fi executat pe nici un altul.
A aprut astfel problema folosirii unui limbaj natural, cum ar fi limba
englez, dar i acaest metod s-a dovedit a fi nepotrivit, astfel nct, n
final, a fost ales un compromis ntre lizibilitatea i generalitatea limbii
englezei precizia i modul direct de adresare al codului main, astfel
lund natere limbajele de programare de nivel nalt.

Limbajele de programare de nivel nalt sunt limbaje independente de
calculatorul care le execut programele, spre deosebire de programele de
nivel cobort cod main sau limbaje de asamblare care sunt specifice
tipului de calculator.

Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 9
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.

1.3.1 Evoluia limbajelor de programare

Un limbaj de programare este un sistem de convenii adoptate pentru
realizarea unei comunicri ntre programator i calculator. Limbajele
folosite pentru programarea unui calculator sunt extrem de asemntoare
limbajelor naturale. Ele sunt compuse din:
cuvinte (rezervate);
punctuaie;
propoziii i fraze;
reguli sintactice etc.
Aa cum pentru nsuirea unei limbi strine trebuie nvate cuvintele
acesteia i regulile cu care pot fi manevrate, tot aa pentru nsuirea unui
limbaj de programare trebuie studiate cuvintele i semnele care l compun
mpreun mpreun cu regulile de manevrare a lor.


Nivele ale limbajelor de programare

Nivelul unui limbaj este apreciat prin poziia pe care o ocup pe scara constituit de limbajul
recunoscut de microprocesor (limbaj main) i limbajul natural al programatorului (limba romn,
limba englez ).

Un limbaj de nivel sczut este foarte apropiat de main, el manipuleaz cu elemente de nivel
hardware, fizic, cum ar fi: registru, microprocesor, locaie de memorie, port de intrare / ieire, etc.

Un limbaj de nivel nalt sau foarte nalt manipuleaz cu concepte apropiate de limbajul natural,
concepte de nivel logic, cum ar fi: colecie de date, nume de operaie (sort, writeln, open), variabile,
constante (asemntoare ca neles cu cele din matematic).

Cu ajutorul unui limbaj de nivel nalt programatorul se face mult mai uor neles de ctre
calculator. Uneori o singur limie de program scris cu un astfel de limbaj poate echivala cu sute
de linii de program scrise n limbaj main. Deci din punct de vedere al reducerii timpului de
realizare a unui program i al siguranei n funcionare (absena erorilor de programare)este de
preferat un limbaj de nivel ct mai ridicat (nalt sau foarte nalt). n schimb, pe msur ce limbajul
are un nivel mai ridicat, execuia programului conceput cu ajutorul su va fi mai lent, dect a unui
program ce realizeaz aceleai operaii dar este scris n limbaj de asamblare.

O alt diferen esenial ntre cele dou tipuri de limbaje o reprezint portabilitatea, adic
posibilitatea transferrii programelor pe un alt tip de main dect cea pe care au fost construite.
Din acest punct de vedere limbajul de asamblare este neportabil, deoarece el este specific
microprocesorului. Programele realizate pe un tip de main trebuie rescrise integral pentru noul
tip de main, folosind un nou set de instruciuni care deobicei difer foarte mult. Lucrurile stau
altfel cu programele concepute cu ajutorul unui limbaj de nivel nalt, deoarece acestea sunt
detaate de main. ntre un astfel de program i calculator se interpune compilatorul (sau
interpretorul) care rezolv corect transformarea fiierului-surs n fiier-executabil.
Definirea noiunilor de algoritm, program i limbaj de programare
10 Proiectul pentru nvmntul Rural

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.

Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 11
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).

Definirea noiunilor de algoritm, program i limbaj de programare
12 Proiectul pentru nvmntul Rural
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
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 13
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.

Definirea noiunilor de algoritm, program i limbaj de programare
14 Proiectul pentru nvmntul Rural
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.
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 15

Test de autoevaluare 1.3

Alegei varianta corect pentru urmtoarele ntrebri. Rspunsul la fiecare ntrebare
valoreaz 20 de puncte. Punctaj minim: 80

1. Care din urmtoarele caracteristici nu reprezint o caracteristic a utilizrii limbajelor de
nivel nalt
a. naturalee
b. portabilitate
c. instruciuni codificate numeric
d. uurin n scriere

2. ntr-un limbaj concurent se pot defini procese.., execuia sa fiind ramificat la
un anumit moment de timp
a. liniare
b. speciale
c. paralele
d. analitice

3. Noiunea de programare structurat a fost introdus n cadrul limbajului de programare:
a. Fortran
b. Paradox
c. Cobol
d. Pascal

4. Care din urmtoarele limbaje nu reprezint un limbaj orientat pe gestiunea bazelor de
date?
a. Foxbase
b. Paradox
c. ADA
d. Cobol

5. Limbajele descriu problema de rezolvat, adic n termenii deduciilor
logice
a. Limbaje orientate pe programarea inteligenei artificiale
b. Limbaje concurente
c. Limbaje orientate pe calcul matematic simbolic
d. Limbajele de programare de nivel nalt


Variantele corecte de rspuns se afl la pagina 20.
Definirea noiunilor de algoritm, program i limbaj de programare
16 Proiectul pentru nvmntul Rural

1.3.2 Etapele realizrii programelor

Procesul de rezolvare a unei probleme ncepe cu specificarea acesteia i
se ncheie cu obinerea unui program concret i corect.

Etapele procesului de programare

I Specificarea problemei

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*x
2
+ 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
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 17
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 = b
2
4*a*c >=0, atunci calculeaz

a
b
x
2
1
+
= i
a
b
x
2
2

= , apoi afieaz valorile lor,
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
Definirea noiunilor de algoritm, program i limbaj de programare
18 Proiectul pentru nvmntul Rural
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.


Test de autoevaluare 1.4

Completai spaiile libere din urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

1. Prima etap a procesului de rezolvare a unei probleme este ............................ avnd ca
rezultat .....................................



Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 19
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.




4. Codificarea algoritmului se face cu ajutorul .......................................... .




5. Trecerea treptat de la o reprezenteare general, abstract, a rezolvrii problemei la o
prezentare detaliat a sa poart denumirea de .





Variantele corecte de rspuns se afl la pagina 20.







Sarcina de lucru 1.1

Prezint n maxim 500 de cuvinte un eseu despre modul n care
presupunei c vor evolua limbajele de programare a calculatoarelor n
viitorul apropiat
Acest eseu va fi notat cu maxim 20 de puncte. 5 puncte vor fi acordate
pentru corectitudinea exprimrii, 10 puncte pentru argumentare i 5
puncte pentru inventivitate.





Definirea noiunilor de algoritm, program i limbaj de programare
20 Proiectul pentru nvmntul Rural
Rspunsurile corecte la testele de autoevaluare

Testul de autoevaluare 1.1

Rspunsuri corecte:
1 F Vezi U1.1 Noiunea de algoritm pag. 8
2 F Vezi U1.1 Noiunea de algoritm pag. 8
3 A Vezi U1.1 Noiunea de algoritm pag. 8
4 A Vezi U1.1 Noiunea de algoritm pag. 8
5 F Vezi U1.1 Noiunea de algoritm pag. 8

Testul de autoevaluare 1.2
:
Rspunsuri corecte:
1 univoc Vezi U1.2 Propietile algoritmilor pag. 12
2 unicitate Vezi U1.2 Propietile algoritmilor pag. 12
3 generalitate Vezi U1.2 Propietile algoritmilor pag. 12
4 domeniu de aplicabilitate al algoritmului Vezi U1.2 Propietile algoritmilor pag. 12
5 finit, finitudine sau eficacitate Vezi U1.2 Propietile algoritmilor pag. 12

Testul de autoevaluare 1.3

1 c U 1.3 Programe i limbaje de programare pag 17
2 c U 1.3 Programe i limbaje de programare pag 17
3 d U 1.3 Programe i limbaje de programare pag 17
4 c U 1.3 Programe i limbaje de programare pag 17
5 a U 1.3 Programe i limbaje de programare pag 17

Testul de autoevaluare 1.4

1 analiza problemei, specificaia problemei Vezi U1.3.2 Etapele realizrii programelor pag. 26
2 regulile de sintax, mesaje de erori de sintax Vezi U1.3.2 Etapele realizrii programelor
pag. 26
3 ntreinere Vezi U1.3.2 Etapele realizrii programelor pag. 26
4 limbajelor de programare Vezi U1.3.2 Etapele realizrii programelor pag. 26

5 proiectare descendent Vezi U1.3.2 Etapele realizrii programelor pag. 26




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
Definirea noiunilor de algoritm, program i limbaj de programare
Proiectul pentru nvmntul Rural 21

Lucrarea de verificare Nr. 1, notat de tutore

Rspundei la urmtoarele ntrebri. Acestea trebuie s fie scurte (cteva rnduri) i clare.
Fiecare ntrebare valoreaz 20 puncte. Primii 20 puncte din oficiu. Punctajul maxim al
testului este de 100 puncte


1. Dai exemplu de un algoritm de rezolvare a unei anumite
activiti din viaa cotidian (ex. pregtirea micului dejun).




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:








Principiile programrii structurate
22 Proiectul pentru nvmntul Rural

Unitatea de nvare Nr. 2

PRINCIPIILE PROGRAMRII STRUCTURATE


Cuprins Pagina

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




Obiectivele Unitii de nvare 2

Dup parcurgerea acestei uniti de nvare vei fi capabili s:

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.

Principiile programrii structurate
Proiectul pentru nvmntul Rural 23
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.
Principiile programrii structurate
24 Proiectul pentru nvmntul Rural
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.
Principiile programrii structurate
Proiectul pentru nvmntul Rural 25

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.

Principiile programrii structurate
26 Proiectul pentru nvmntul Rural
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=2, b=-8
a=0 ? 2=0 ? NU
x=-b/a x=4
SCRIE x x=4
STOP
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" INCOMPATIBILITATE
STOP
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.

2.2 Elemente de programare structurat

La sfritul anilor 60, datorit dezvoltrii vertiginoase a prelucrrilor de date cu calculatorul, s-au
putut aborda i rezolva probleme din ce n ce mai complexe. Programele mari, corespunztoare
acestor probleme s-au complicat n aa msur nct au devenit foarte greu accesibile chiar i
pentru autorii lor. nelegerea, depanarea i modificarea unor astfel de programe prezint uneori
dificulti de nenlturat. n acea criz a software-ului s-a ivit natural ntrebarea: Se poate elabora
o metodologie general de realizare n mod sistematic, disciplinat a unor programe elegante? Ca
rspuns la aceast ntrebare s-a nscut metoda programrii structurate.

Principiile programrii structurate
Proiectul pentru nvmntul Rural 27
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.



Principiile de baz ale programrii structurate

Programarea structurat este o orientare n conceperea i alctuirea programelor, avnd ca
obiectiv o mai bun gestionare a complexitii acestora, innd cont de particularitile gndirii
umane.
Se tie c programul are la baz un algoritm, iar acesta poate fi reprezentat printr-o schem
logic. n cazul programelor complexe (care sunt necesare n rezolvarea majoritii problemelor
reale), numrul de instruciuni este foarte mare i, deci, schema logic poate conine legturi foarte
complicate ntre aceste instruciuni. S-a constatat ns c omul nu poate stpni mintal structuri de
complexitate ridicat. La un moment dat, aceast deficien a minii umane a devenit o piedic
major n dezvoltarea programrii, avnd drept consecin c programele complexe erau greu de
conceput i, mai ales, greu de depanat. Devenise necesar s se gseasc o cale de a pune de
acord necesitatea de a se elabora programe mari i complexe, cu particularitatea minii umane de
a opera numai cu structuri simple.
La originea programrii structurate st un articol al lui E. W. Dijkstra, aprut n anul 1968 i
intitulat "Go To Considered Harmful" n care se arta c, pentru a reduce complexitatea
programelor i a uura nelegerea acestora, este preferabil s se elimine din programe
instrucunea GOTO (mergi la...) prin care, n limbajele de programare procedurale, se indic saltul
Principiile programrii structurate
28 Proiectul pentru nvmntul Rural
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.


Test de autoevaluare 2.1

Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

Adevrat / Fals

1. Programarea structurat este o metod independent de limbajul de programare. A/F


2. Reprezentarea unui algoritm se poate face doar printr-un program realizat ntr-un limbaj
de programare. A/F


3. Teorema de structur afirm c orice program poate fi ntocmit folosind numai trei
structuri de control fundamentale: structura secvenial, structura alternativ i structura
repetitiv. A/F


4. Un algoritm nu poate fi reprezentat doar prin schem logic. A/F


5. n elaborarea programelor este recomandat tehnica de elaborare descendent (top -
down). A/F


Variantele corecte de rspuns se afl la pagina 42.

Principiile programrii structurate
Proiectul pentru nvmntul Rural 29
2.3 Structuri de control utilizate n programarea structurat

n continuare, sunt descrise structurile de control utilizate n programarea
structurat, folosindu-se, n paralel, reprezentarea cu ajutorul schemelor
logice i reprezentarea prin pseudocod. Pentru a evita posibile confuzii s-
au folosit numai notaii n limba romn (exceptnd structura de selecie),
dei programatorii experimentai schieaz algoritmii n pseudocod
folosind termeni din limba englez, de multe ori acetia fiind identici cu
cuvintele cheie ale limbajului care urmeaz a fi utilizat. Pseudocodul ofer
libertatea folosirii notaiilor considerate ca fiind cele mai sugestive (de
exemplu citete/read, scrie/write, etc).


2.3.1 Secvena sau structura liniar

Reprezint o succesiune de comenzi care conine o
transformare de date. Structura liniar este alctuit din
operaii de citire/scriere, operaii de atribuire sau apelurile unor
funcii definite anterior.

A
1
, A
2
, , A
n
reprezint diverse operaii ce vor fi executate n
aceast ordine, bine determinat, ca de exemplu:
o atribuire: x 0 sau
M sin(x)
a a + 3
o operaii de citire/scriere
citeste a, b, c
scrie x1, x2









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
a b
b a
scrie a,b

Figura 2.5
A
1

A
2

A
n

Principiile programrii structurate
30 Proiectul pentru nvmntul Rural
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
a b
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.

Figura 2.6
START
Citete a,b
aux=a
a=b
b=aux
Scrie a,b
STOP
Principiile programrii structurate
Proiectul pentru nvmntul Rural 31
Test de autoevaluare 2.2


Scriei algoritmul de rezolvare a urmtoarelor probleme; putei folosi reprezentarea
algoritmilor prin scheme logice sau pseudocod. Rezolvarea fiecrei probleme valoreaz
20 de puncte. Punctaj minim: 80

1. Un melc se deplaseaz cu viteza v km/sptmn. De ct timp (n ore) are nevoie
melcul pentru a strbate distana d dat n metri.





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.




Variantele corecte de rspuns i indicaii de rezolvare se afl la pagina 42.
Principiile programrii structurate
32 Proiectul pentru nvmntul Rural
2.3.2 Decizia sau structura alternativ

Reprezint alegerea unei operaii sau a unei secvene dintre dou
alternative posibile. n figura 2.7 sunt prezentate cele dou variante
posibile ale structurii alternative.



Figura 2.7
Condiie
A
B
True False
DA NU
Condiie
A
True False
DA NU


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

Principiile programrii structurate
Proiectul pentru nvmntul Rural 33
citete a, b
dac a>b atunci
scrie a
altfel
scrie b
stop

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:
E=

>
=
<
0 ,
0 ,
0 ,
2
1
2
2
c B
c B A
c B A
A

Schema logic a acestei probleme se afl la capitolul de Anexe,
Laboratorul 1.

Principiile programrii structurate
34 Proiectul pentru nvmntul Rural
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



Test de autoevaluare 2.3

Scriei algoritmul de rezolvare a urmtoarelor probleme; putei folosi reprezentarea
algoritmilor prin scheme logice sau pseudocod. Rezolvarea fiecrei probleme valoreaz 20
de puncte. Punctaj minim: 80

1. Se d sistemul de 2 ecuaii cu 2 necunoscute x i y, iar a, b, c, d, p i q sunt parametri
reali (coeficienii necunoscutelor i termenii liberi):

= +
= +
q dy cx
p by ax

S se scrie algoritmul de rezolvare a sistemului de ecuaii.







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.








3. Dndu-se trei valori ntregi a, b i c, s se afieze valorile lor n ordine cresctoare.



Principiile programrii structurate
Proiectul pentru nvmntul Rural 35





4. S se determine valoarea urmtoarei expresii, unde a, b i x sunt numere reale date:
( )

=
< +
> +
=
0 5
0 7 2
0 3 2
2
3
b a daca x
b a daca x x
b a daca x
x E








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).









Variantele corecte de rspuns se afl la pag 42.

Principiile programrii structurate
36 Proiectul pentru nvmntul Rural
2.3.3 Ciclul sau structura repetitiv

De multe ori este necesar repetarea unor operaii, n funcie de anumite
condiii.

Ciclul cu test iniial sau structura repetitiv condiionat anterior

Execuia presupune parcurgerea urmtoarelor etape:
se evalueaz condiia;
dac rezultatul este adevrat, se
execut secvena A, dup care se trece din
nou la evaluarea condiiei;
n caz contrar, se ncheie execuia
ciclului.

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 x
n
, 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.





Condiie
A
True
False
DA
NU
Principiile programrii structurate
Proiectul pentru nvmntul Rural 37
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.

Exprimarea n pseudocod a acestei
structuri este:

repet
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)
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




Condiie
A
True
False
DA
NU
Principiile programrii structurate
38 Proiectul pentru nvmntul Rural

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


Principiile programrii structurate
Proiectul pentru nvmntul Rural 39
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

Principiile programrii structurate
40 Proiectul pentru nvmntul Rural
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.

Pseudocod: case 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.

Test de autoevaluare 2.4

Scriei algoritmul de rezolvare a urmtoarelor probleme; putei folosi reprezentarea
algoritmilor prin scheme logice sau pseudocod. Rezolvarea fiecrei probleme valoreaz
20 de puncte. Punctaj minim: 80

1. S se scrie algoritmul pentru calcularea sumei primelor n numere naturale impare, unde
n este un numr natural strict pozitiv, dat.







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).






Principiile programrii structurate
Proiectul pentru nvmntul Rural 41
4. S se determine valoarea urmtoarelor expresii, unde n este un numr natural dat:
( )
( )( ) 1 2 1 2
2
5 3
4
3 1
2
1
1
3 2
1
2 1
1
2
1
+
+ +

=
+
+ +

=
n n
n
E
n n
E










5. Dndu-se a, b i c, coeficienii unei ecuaii de gradul doi, s se calculeze:
n n
n
x x S
2 1
+ = ,
unde n este un numr natural dat, fr a se rezolva ecuaia (innd cont de valorile lui P i
S).










Variantele corecte de rspuns se afl la pag. 42.

Principiile programrii structurate
42 Proiectul pentru nvmntul Rural

Rspunsuri corecte la testele de autoevaluare

Testul de autoevaluare 2.1
:
Rspunsuri corecte:
1 A Vezi U2. 2 Elemente de programare structurat pag. 39
2 F Vezi U2. 2 Elemente de programare structurat pag. 40
3 A Vezi U2. 2 Elemente de programare structurat pag..40
4 F Vezi U2. 2 Elemente de programare structurat pag. 39
5 A Vezi U2. 2 Elemente de programare structurat pag. 40

Rspunsurile corecte la testele de autoevaluare 2.2, 2.3 i 2.4 se afl n Anexe, Laboratorul 1.






















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


Principiile programrii structurate
Proiectul pentru nvmntul Rural 43
Lucrarea de verificare Nr. 2, notat de tutore

Rezolvai urmtoarele probleme. Acestea trebuie s fie reprezentate prin scheme logice
sau pseudocod. Fiecareproblem valoreaz 10 puncte. Primii 10 puncte din oficiu.
Punctajul maxim al testului este de 100 puncte.

1. Se dau 4 numere reale a, b, c i d.
a) S se efectueze permutarea circular la dreapta cu o poziie a
valorilor irului de numere, astfel nct la afiarea valorilor acestora s
fie tiprite n ordinea d, a, b, c;
b) S se efectueze permutarea circular la stnga cu o poziie a
valorilor irului de numere, astfel nct la afiarea valorilor acestora s
fie tiprite n ordinea b, c, d, a,;
c) S se inverseze irul de numere, adic s li se interschimbe valorile
astfel nct la afiarea lor s se afieze d, c, b, a.
Se va folosi o singur variabil auxiliar.

2. Se consider dou unghiuri A i B, fiecare msurat n grade, minute i secunde. S se
scrie un algoritm care permite calcularea sumei i diferenei celor dou unghiuri, rezultatul
afindu-se n aceeai form (grade, minute i secunde) . Se presupune c unghiul A este
mai mare sau egal dect unghiul B.

3. S se determine cea mai mare i cea mai mic valoare dintr-un ir de 4 numere reale
citite de la tastatur.

4. Se dau 4 numere ntregi a, b, c, i d. S se afieze valorile acestora n ordine
descresctoare.

5. Se citete un ir de numere reale de la tastatur, pn la introducerea valorii zero. S
se determine cte dintre ele, mprite la un numr dat k dau un rest egal cu r. (k i r se
citesc i ele de la tastatur).

6. Se d un ir de n numere naturale. S se determine media aritmetic a numerelor
multiple de 3 care se afl n irul dat.

7. Se d un ir de n numere naturale. S se afieze numerele prime din ir i s se
determine numrul acestora (un numr este prim dac se divide doar cu 1 i cu el nsi).

8. S se afieze numerele prime mai mici sau egale dect un numr natural n dat

9. S se determine numrul prim cel mai apropiat de un numr n dat.


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
44 Proiectul pentru nvmntul Rural

Unitatea de nvare Nr. 3

STRUCTURA PROGRAMELOR N LIMBAJUL C. TIPURI DE DATE,
OPERATORI I EXPRESII


Cuprins Pagina

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

Obiectivele Unitii de nvare 3

Dup parcurgerea acestei uniti de nvare vei fi capabili s:
Identificai diferitele tipuri de variabile
Declarai tipuri simple de variabile i constante
Reprezentai diverse espresii folosind operatorii aritmetici, logici i
relaionali
Exemplificai folosirea operatorilor pentru diverse tipuri de variabile




3.1 Privire de ansamblu asupra limbajului C
nceputurile limbajului de programare C
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.
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 45
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.
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
46 Proiectul pentru nvmntul Rural
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 hardware-
uluii 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.


3.2 Structura programelor n limbajul C

n orice activitate de programare, prima aciune ntreprins de programator
este scrierea programului cu ajutorul unui editor, n conformitate cu regulile
sintactice i semantice corespunztoare limbajului ales. Se elaboreaz
astfel aa-numitul program surs, care trebuie s parcurg o serie de
etape pentru a fi executat:
etapa de compilare, care are la rndul ei dou componente:
rezolvarea directivelor ctre preprocesor prin expandarea
n codul surs a unor forme reduse determinate de aceste
directive (dac exist);
transpunerea programului surs n program obiect, apt
de a fi executat de main;
etapa de link-editare, care presupune legarea programului obiect
obinut mai sus cu bibliotecile de sistem i transformarea lui ntr-un
program executabil;
etapa de lansare n execuie.

Modul n care se execut aceste aciuni este specific tipului de calculator
i de sistem de operare care conine limbajul de programare. n cele ce
urmeaz vor fi prezentate problemele generale de programare pentru
elaborarea programului surs, probleme valabile indiferent de maina pe
care se lucreaz.

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 47
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).



Structura programelor n limbajul C. Tipuri de date, operatori i expresii
48 Proiectul pentru nvmntul Rural
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.

Figura 3.1

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.

main()
{
printf(Invatam limbajul C);
}

numele funciei
parantezele pot include
semn de terminare
a unei instruciuni
instruciune
paranteze pentru
delimitarea corpului
program constituit din
funcia numit main()
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 49
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:


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
50 Proiectul pentru nvmntul Rural

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.

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 51

Test de autoevaluare 3.1

Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

Adevrat / Fals

1. Urmtoarea linie de program realizeaz tiprirea mesajului amplasat ntre ghilimele:
//printf(Acesta este un text\n);


2. Prototipurile funciilor care pot fi apelate n cadrul limbajului se gsesc grupate n fiiere
de tip header


3. Pentru fiecare din urmtorii identificatori indicai dac definirea lor este corect (A) sau
nu (F):
1) a&b 5) Aa
2) ab_x 6) Barbu
3) 2c3d 7) f1()
4) patru 8) xn


4. Urmtorii identificatori fac referire la aceeai variabi:
Ab ab


5. Orice program scris n limbajul C este compus dintr-o serie de entiti numite funcii.


Variantele corecte de rspuns se afl la pag. 72.
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
52 Proiectul pentru nvmntul Rural

3. 3 Variabile, tipuri de variabile i declarare

Variabilele reprezint spaii n memoria calculatorului avnd acelai rol n
timp, dar care pot conine vaori diferite la momente diferite de timp. n
legtur cu ele se ridic urmtoarele ntrebri:
ce fel de variabile recunoate programul?
cum sunt memorate aceste date n calculator?


S revenim la exemplul 3.3. Cifra 7, preluat i afiat de funcia printf(),
este o valoare ntreag constant. S rescriem acest program utiliznd o
variabil n locul acestei constante


Exemplul 3.6

main()
{
int num;
num=7;
printf(Acesta este numarul sapte: %d,num);
}
n urma execuiei programului, la consol va apreaacelai mesaj:
Acesta este numarul sapte: 7
dar programul conine cteva elemente noi, i anume:
instruciunea int num; prin care este declaratdrept ntreg
variabila num; deci num este numele variabilei, iar int este tipul ei
(ntreg);
instruciunea num=7; are ca rezultat atribuirea valorii 7
variabilei num. Astfel operatorul = este operatorul de atribuire.
n aceast situaie, modul de lucru al instruciunii printf() din instruciunea
urmtoare este clar: va afia valoarea variabilei num, care este 7.

Aciunea de declarare a variabilelor este obligatorie n limbajul C.
Declararea const n precizarea tipului variabilei int i a numelui su
num. Mai multe variabile de acelai tip pot fi declarate n aceeai linie de
program, de exemplu:
int num1, num2, num3;
Numele unei variabile poate fi format dintr-unul sau mai multe caractere
alfanumerice mpreun cu caracterul _, ncepnd cu o liter i avnd cel
mult 31 de caractere.

Exemple
Corect Incorect
num1 1num
suma_n suma n
a1b2 a#2

Declaraia variabilelor determin compilatorul s le aloce un spaiu
corespunztor de memorare.


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 53
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:

Tip Reprezentare
n bii
Rang
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
- 10
17
(6 digii precizie)
double 64 10
-308
- 10
308
(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.

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
54 Proiectul pentru nvmntul Rural
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
%.


Test de autoevaluare 3.2

Rspundei la urmtoarele ntrebri. Fiecare rspuns valoreaz 20 de puncte. Punctaj
minim: 80

1. Care din aceste instruciuni scrise n limbajul C sunt corecte?
a) int n; c) double float d;
b) char c1; d) unsigned char lit;


2. Adevrat sau fals: dou variabile pot fi declarate n aceeai instruciune.


3. Tipul de date float ocup de ........ ori mai mult memorie dect tipul de date char.


4. Tipul de date int poate lua valori de la ................ la..................


5. Adevrat sau fals: tipul de date long poate lucra cu numere doar de dou ori mai mari
dect tipul de date int.


Variantele corecte de rspuns se afl la pag. 72.


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 55

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
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
56 Proiectul pentru nvmntul Rural
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 10
10
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.
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 57

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.


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
58 Proiectul pentru nvmntul Rural


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).


3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg


Nu exist funcii matematice implicite (n compilatorul C), ci acestea sunt
descrise in biblioteci. De exemplu, funciile

sqrt() calculeaz rdcina ptrat a unui numr i are sintaxa:
double sqrt(double x);

pow() funcia putere x
y
(calculeaz x la puterea y) cu sintaxa:
double pow(double x, double y);

exp() funcia e
x
cu sintaxa:
double exp(double x);

log() funcia logaritm natural ln(x), avnd sintaxa:
double log(double x);

log10() funcia logaritm n baza 10 lg(x), avnd sintaxa:
double log10(double x);

sin() funcia trigonometric sinus, cu sintaxa:
double sin(double x);

cos() funcia trigonometric cosinus, cu sintaxa:
double cos(double x);



Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 59
tan() funcia trigonometric sinus, cu sintaxa:
double tan(double x);


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".



Exemplul 3.11


S se evalueze, pentru x=3, valoarea funciei:

( ) ( ) x x x f ln
5
+ =

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



Structura programelor n limbajul C. Tipuri de date, operatori i expresii
60 Proiectul pentru nvmntul Rural

Test de autoevaluare 3.3

Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte.
Punctaj minim: 80

1. Care din declaraiile urmtoare sunt corecte?
a) const int a=5; d) const float a=d;
b) const a=6; e) const int a=1.5;
c) const int a; f) const char c=1;

2. Principalele constante matematice predefinite, cum este de exemplu numrul pi, se
gsesc n biblioteca de funcii ...................

3. S se reprezinte matematic expresiile scrise n C:
a) pow(x,4); c) sin (a+b);
b) log10(x); d) sqrt (2*x) + exp(x);

4. S se reprezinte cu ajutorul funciilor matematice definite n C expresiile:
) 5 sin(
2
x
2
3
x

2 2 2
c b a + +
3
2
h R


5. Adevrat / Fals: pentru variabilele de tip logic, ce pot lua valorile true sau false, limbajul
C are definit tipul de variabile boolean.



Variantele corecte de rspuns se afl la pag. 72.


Sarcina de lucru 3.1

Prezint n maxim 500 de cuvinte un eseu despre modul n care
presupunei c se vor putea folosi diversele tipuri de variabile i de
constante n rezolvarea problemelor de programare.
Acest eseu va fi notat cu maxim 20 de puncte. 5 puncte vor fi
acordate pentru corectitudinea exprimrii, 10 puncte pentru
argumentare i 5 puncte pentru inventivitate.


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 61
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.


3.6.1 Operatorul de atribuire

n C, operatorul de atribuire poate fi folosit n interiorul oricrei expresii
valide n C, ceea ce nu este valabil n majoritatea limbajelor de
programare(de exemplu Pascal, BASIC, Fortran). Forma general a unui
operator de atribuire este:

nume_variabila=expresie

unde expresie poate fi ceva la fel de simplu ca o constant sau complicat,
conform cerinelor de programare. Destinaia, sau membrul stng al
atribuirii trebuie s fie o variabil sau un pointer, nu funcie sau constant.
Acesta mai este ntlnit i sub denumirea de lvalue orice obiect care
poate fi inserat n partea stng a unei declaraii de atribuire. Din
considerente practice, lvalue este asimilat cu variabil. Expresia din
partea dreapt a unei atribuiri poart denumirea de rvalue, referindu-se
pur i simplu la valoarea unei expresii.

Principiul de execuie este urmtorul:
se evalueaz expresia;
variabilei nume_variabila i se atribuie valoarea obinut, fcndu-
se conversia necesar, dac este cazul.

Atribuirea multipl

C permite atribuirea aceleiai valori mai multor variabile, folosind mai
multe atribuiri n cadrul aceleiai declaraii. De exemplu, urmtorul
fragment de program atribuie lui a, b i c valoarea zero:
a=b=c=0;
Forma general a unei atribuiri multiple este:

v1=v2= . =vn=expresie;

unde v1, v2, .,vn sunt variabile (lvalue) care se pot modifica.


Exemplul 3.12


S examinm cteva exemple de declaraii i atribuiri simple:

char c;
int n,k;

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
62 Proiectul pentru nvmntul Rural
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.


3.6.2 Operatori aritmetici

Limbajul C dispune de operatorii pentru cele patru operaii aritmetice de
baz, operatorul modulo, precum i de operatorii de incrementare i
decrementare. Operatorii pot folosi att numere ntregi, ct i numere
reale, cu excepia operatorului modulo, care poate lucra numai cu numere
ntregi.

Se folosesc urmtoarele simboluri:
o pentru operatori binari:
+ adunare
- scdere
* nmulire
/ mprire
% operaia modulo restul mpririi a 2 numere ntregi.
o pentru operatori unari:
+ plus unar (pstrarea semnului)
- unar
++ incrementare
-- decrementare.

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 63

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).




Structura programelor n limbajul C. Tipuri de date, operatori i expresii
64 Proiectul pentru nvmntul Rural
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 x++;
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;



Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 65
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 ++ --
- (minus unar)
* / %
cel mai puin prioritar + -

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

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
66 Proiectul pentru nvmntul Rural
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.


3.6.3 Operatori relaionali i logici

n denumirea de operator relaional, cuvntul relaional se refer la
relaiile care se pot stabili ntre diverse valori. n denumirea de operator
logic, termenul logic se refer la modurile n care se pot lega aceste
relaii existente. Deoarece operatorii relaionali i logici sunt adesea folosii
mpreun, astfel vor fi prezentai n continuare.

Noiunile logice de adevrat sau fals stau la baza conceptelor de operatori
relaionalii logici. n C, orice valoare diferit de zero poate fi adevrat.
Fals este sinonim cu zero. Expresiile care folosesc operatori relaionali i
logici returneaz valoarea zero pentru fals i 1 pentru adevrat.

n tabelul 3.2 sunt prezentai operatorii logici, folosindu-se valorile 1 i 0
pentru valorile de adevr ale operatorilor logici.

p q p&&q p||q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
Tabelul 3.2

Tabelul 3.3 conine operatorii relaionali i logici, mpreun cu semnificaia
lor.

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 67

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 !
> >= < <=
== !=
&&
cel mai puin prioritar ||


Exemplul 3.19

Toate expresiile relaionale i logice dau un rezultat egal fie cu zero, fie cu
1 (fals sau adevrat).

main()
{
int n;
n=100;

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
68 Proiectul pentru nvmntul Rural
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


3.6.4 Operatori de atribuire compus

Exist o form alternativ a declaraiei de atribuire, cunoscut i sub
numele de scurttura C C shorthand, care simplific codificarea unei
anumite operaiuni de atribuire, i anume o expresie de forma:

var = var operator expresie;

poate fi scris astfel:

var operator = expresie;

De exemplu, x=x+10; poate fi scris x + = 10;
x=x-102; poate fi scris x - = 102;

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;

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 69
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).


3.6.5 Operatorul de conversie explicit (cast)

Anumite expresii pot fi forate s fie de un anumit tip, folosind operatorul
cast, ce are forma:

(tip) expresie

unde tip este un tip valid de date recunoscut de C. Este necesar
folosirea cast-ului atunci cnd se dorete folosirea unui alt tip de date
dect cel implicit.


Exemplul 3.26

a) Expresia :

float a,n;
......................
a=(int) sqrt(n);

determin partea ntreag a lui radical din n.

b) dac a,b sunt dou numere ntregi i se dorete obinerea rezultatului
netrunchiat al mpririi lor, se poate folosi expresia:

(double) a/b;


3.6.7 Operatorul sizeof

Acesta este un operator unar activ la compilare, care calculeaz lungimea
n octei a variabilei sau a specificatorului de tip, ncadrat ntre paranteze,
pe care l precede. Sintaxa este:

sizeof (expresie)


Exemplul 3.27

Presupunnd c ntregii au 2 octei i variabilele n virgul mobil au 8


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
70 Proiectul pentru nvmntul Rural
octei, urmtorul program:

float f;
printf(%d ,sizeof (f));
printf(%d ,sizeof (int));

va afia numerele 8 i 2.


3.6.7 Operatorul virgul (,)

Opreratorul virgul este folosit pentru evaluarea succesiv a mai multor
expresii. Partea stng a operatorului virgul este considerat ntotdeauna
de tip void, aceasta determinnd ca expresia din partea dreapt s
determine valoarea total a ntregii expresii separate prin virgul. De
exemplu,

x = (y=3, y+1);

mai nti atribuie lui y valaorea 3 i apoi lui x valoarea 4.

n linii mari, virgula determin o secven de operaii. Cnd este folosit n
membrul drept al unei atribuiri, valoarea atribuit reprezint valoarea
ultimei expresii a listei separate prin virgul.


Exemplul 3.28

Fie declaraiile:
int a = 1, b = 5; float c;
Expresia: c = a = b+1, a = c+2, b = b+1; se evalueaz astfel:
se evalueaz atribuirea multipl, rezultnd pentru a
valoarea 6, apoi c devine tot 6 (b+1);
a devine 8 (c+2);
b primete valoarea 6.

Expresia (n ansamblul ei) este de tip int i produce valoarea 6,
corespunztoare ultimei atribuiri efectuate.


3.6.8 Operatorul condiional (?)

Limbajul C conine un operator foarte puternic i comod de folosit, care
nlocuiete instruciunea corespunztoare structurii alternative if.
Operatorul ternar ? are forma general:
Exp1 ? Exp2: Exp3;
unde Exp1, Exp2 i Exp3 sunt expresii.

Principiul de execuie este urmtorul:
se evalueaz Exp1;
dac rezultatul acestei evaluri este diferit de zero, se
evalueaz Exp2, iar Exp3 este ignorat;

Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 71
altfel se evalueaz Exp3, iar Exp2 este ignorat.

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.


Test de autoevaluare 3.4

Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte.
Punctaj minim: 80


1. Care din urmtorii sunt operatori aritmetici?
a) +
b) &
c) %
d) <
a,c


Structura programelor n limbajul C. Tipuri de date, operatori i expresii
72 Proiectul pentru nvmntul Rural
2. Rescriei instruciunile urmtoare folosind operatorul de preincrementare,
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


Variantele corecte de rspuns se afl la pag. 72
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 73
Rspunsuri corecte la testele de autoevaluare

Testul de autoevaluare 3.1

Rspunsuri corecte:
1 F Vezi U3.2 Structura programelor n limbajul C pag. 46
2 A Vezi U3.2 Structura programelor n limbajul C pag. 46
3 1)F 2) A 3) F 4) A 5) A 6) A 7) F 8) A
Vezi U3.2 Structura programelor n limbajul C pag. 46
4 F Vezi U3.2 Structura programelor n limbajul C pag. 46
5 A Vezi U3.2 Structura programelor n limbajul C pag. 46

Testul de autoevaluare 3.2
:
Rspunsuri corecte:
1 a, b, d Vezi U3.3 Variabile, tipuri de variabile i declarare pag. 51
2 A Vezi U3.3 Variabile, tipuri de variabile i declarare pag. 51
3 4 Vezi U3.3 Variabile, tipuri de variabile i declarare pag. 51
4 -32768, 32767 Vezi U3.3 Variabile, tipuri de variabile i declarare pag. 51
5 F Vezi U3.3 Variabile, tipuri de variabile i declarare pag. 51

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
3 x
4
, lg x, sin(a+b),
x
e x + 2 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
5 F Vezi U3. 4 Constante pag 54

Testul de autoevaluare 3.4

1 a, c Vezi U3.6 Operatori n C pag. 60
2 ++numar;
poz--; Vezi U3.6 Operatori n C pag. 60
pas*=3;

3 F, A, F, F Vezi U3.6 Operatori n C pag. 60
4 Nu Vezi U3.6 Operatori n C pag. 60
5 d 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.
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
74 Proiectul pentru nvmntul Rural
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.


Lucrarea de verificare Nr. 3, notat de tutore

Rspundei la urmtoarele ntrebri. Acestea trebuie s fie scurte(2, 3 rnduri)i clare.
Fiecare ntrebare valoreaz 10 puncte. Primii 10 puncte din oficiu. Punctajul maxim al
testului este de 100 puncte.


1. Care din urmtoarele declaraii sunt corecte?
a) int ab=25;
b) int a+b;
c) float s1;
d) char 1ab;
e) int d.p;


2. Care din urmtoarele expresii logice au valoarea 1?
a=5; b=3; c=1; d=3;
a) (a<b)||c
b) ((b==d)&&c) || (a>=b)
c) c && (d>b)
d) (a>b) || !(d<a)
e) (a==b) && c


3. Fie atribuirile, unde x i y sunt variabile
reale
x=3; y=2;
x=x*y+x+y;
y=x*x-21;
x=sqrt(y);
y=y/10;
n final, x i y vor avea valorile:
a) x=11; y=100;
b) x=10; y=10;
c) x=10; y=11;
d) x=100; y=11;
e) x=11; y=10;


4. Fie atribuirile, unde x i y sunt variabile
reale:
x=4; y=5;
x+=y;
y=sqrt(x);
x+=y;
y=y*2+8;
x=y/2;

n final, x i y vor avea valorile:
Structura programelor n limbajul C. Tipuri de date, operatori i expresii
Proiectul pentru nvmntul Rural 75
a) x=12; y=14;
b) x=9; y=7;
c) x=7; y=14;
d) x=30; y=60;
e) x=14; y=28;
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);


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;

Citirea i scrierea datelor
76 Proiectul pentru nvmntul Rural

Unitatea de nvare Nr. 4

CITIREA I SCRIEREA DATELOR


Cuprins Pagina

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


Obiectivele Unitii de nvare 4

Dup parcurgerea acestei uniti de nvare vei fi capabili s:

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.
Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 77
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 Funcia de scriere cu format

Pentru a scrie pe monitor stdout se utilizeaz funcia printf(), care a
mai fost utilizat n cteva exemple din capitolul anterior. Forma general
a acestei funcii este:

int printf (const char *format[, expresie
1
, expresie
2
, ]);
irul indicat de ctre format conine dou categorii de articole. Prima
include caractere care urmeaz a fi afiate pe ecran. Cea de-a doua
include comenzi de formatare care definesc modul de afiare a
argumentelor. O comand de formatare este alctuit dintr-un simbol
procent %, urmat de codul formatului. Comenzile de formatare sunt
prezentate n tabelul 4.1. Numrul de comenzi de format trebuie s
coincid cu acela al argumentelor, iar comenzile i argumentele se succed
n ordine. De exemplu, urmtorul apel al funciei printf():

printf(Azi este %d %s, %d., 5, ianuarie, 2007);

afieaz pe ecran Azi este 5 ianuarie, 2007.

Cod Format
%c caracter
%d ntreg zecimal cu semn
%i ntreg zecimal cu semn
%e numr real, notaie tiinific (e mic)
%E numr real, notaie tiinific (E mare)
%f numr real, notaie zecimal
%g numr real, cea mai scurt reprezentare dintre %f i %e
%G numr real, cea mai scurt reprezentare dintre %f i %E
%o numr octal, ntreg, fr semn
%s ir de caractere
%u ntreg zecimal fr semn
%x numr hexazecimal, ntreg, fr semn, litere mici
%X numr hexazecimal, ntreg, fr semn, litere mari
%p afieaz un pointer (adres)
%% afieaz simbolul %
Tabelul 4.1

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;
Citirea i scrierea datelor
78 Proiectul pentru nvmntul Rural
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.


Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 79
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);


Citirea i scrierea datelor
80 Proiectul pentru nvmntul Rural
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 . 5 5 2 5 . 7
1 2 . 5 5 2 5 . 7
1 0 . 1 2 3 0 4 0
1 0 . 1 2
1 0 . 1 2 3 0 4 0
0 0 0 1 0 . 1 2 3 0 4 0
1 0 . 1 2 3 0 4 0
1 0 . 1 2 3 0 4 0 0 0 0


Testul de autoevaluare 4.1

Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

Adevrat / Fals
Fie declaraia i iniializarea: int a; a=-12;
1. Instruciunea printf(a=%10.7d\n,a);
tiprete a=bb-0000012 (prin b am notat spaiul).


2. Instruciunea printf(a=%10.7i\n,a);
nu are acelai efect cu instruciunea de la ntrebarea 1.


3. Instruciunea printf(a=%x\n,a);
tiprete valoarea lui a reprezentat n baza opt.


4. Instruciunea printf(a=%3.7i\n,a);
tiprete a=-0000012


5. Instruciunea printf(a=%o\n,a); tiprete a=fff4



Variantele corecte de rspuns se afl la pag. 85.


Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 81
4.3 Funcia de citire cu format

Funcia de citire cu format este funcia scanf(). Ea are sintaxa:
int scanf (const char *format [, adresa_var1,adresa_var2,]);
i realizeaz urmtoarele:
citete o secven de cmpuri de intrare, caracter cu caracter,
pn la terminarea introducerii cmpurilor i apsarea tastei Enter;
formateaz fiecare cmp conform formatului specificat de
argumentul char *format , iar din caracterele citite se calculeaz valori
numerice sau literale, conform tipului fiecrei variabile;
valorile astfel construite sunt stocate la adresele variabilelor
specificate ca argumente.

Ordinea formatelor variabilelor trebuie s fie aceeai cu cea din lista
adreselor variabilelor n care se face citirea. Argumentele folosite sunt:
format constant de tip ir de caractere specificnd formatul n
care vor fi citite caracterele de la intrare;
lista adreselor variabilelor este format din adresele variabilelor,
separate prin spaii.

Fiecare variabil trebuie corelat cu un format specific. Indiferent de
formatul folosit, la ntlnirea unui spaiu n introducerea datelor este
terminat citirea variabilei.

Atenie! Citirea, cu ajutorul funciei scanf(), a irurilor de caractere care
conin spaii este imposibil.


Atenie! n cazul n care formatul specificat este necorespunztor,
rezultatul obinut este neprevzut; nu este semnalat nici un fel de eroare
n acest caz.


Exemplul 4.4

main()
{
float ani, zile;
printf(Scrieti varsta in ani: );
scanf(%f,&ani);
zile=ani*365;
printf(Aveti varste de %.1f zile.,zile);
}
n urma interaciunii programului cu operatorul, la consol ar putea aprea
urmtoarele:
Scrieti varsta inani: 42.5
Aveti varste de 15512.5 zile.

Numrul 42.5 este introdus de ctre operator de la tastatur dup apariia
la consol a mesajului
Scrieti varsta inani:

Citirea i scrierea datelor
82 Proiectul pentru nvmntul Rural
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);
}

Figura 4.1


12.30
Valori i spaii introduse de utilizator
M 5 12.30
scanf(%c %d %f,&poz, &ev, &timp);
M
5
poz
ev
timp
Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 83
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:
Citirea i scrierea datelor
84 Proiectul pentru nvmntul Rural
este caracter alb; atunci se sare peste acesta i peste
eventualele caractere albe care urmeaz; n irul parametru
pointerul va indica primul caracter care nu este alb, iar n cel de
intrare la fel;
caracterul indicat de pointer n irul de intrare nu este alb;
pointerul din irul de intrare rmne nemodificat, iar cel din irul
parametru va avansa pn la primul caracter care nu este alb.

III Pointerul indic caracterul %; n acest caz se testeaz dac
secvena urmtoare ndeplinete condiiile de sintax ale unui specificator
de format, iar n caz c acestea nu sunt ndeplinite, caracterul % este
tratat ca unul oarecare. Altfel, se procedeaz n mod diferit n funcie de ce
avem de citit:
avem de citit un caracter c ; se citete caracterul
respectiv i se memoreaz codul su, indiferent dac este alb sau
nu. n irul parametru pointerul va indica primul caracter care nu
corespunde specificatorului de format, iar n cel de intrare,
caracterul urmtor;
avem de citit o valoare numeric (ntreag sau real).
Dac pointerul indic n irul de intrare un caracter alb, acesta
este srit, ca i urmtoarele caractere albe, pn cnd este ntlnit
un caracter diferit de caracterul alb. Se citete din irul de intrare,
caracter cu caracter, pn cnd este ndeplinit una din condiiile:
o se ntlnete un caracter care nu poate fi convertit ctre
tipul respectiv (alb, o liter, etc.);
o au fost citite un numr de caractere egal cu cel precizat de
lime.

n continuare se convertete irul citit ctre o variabil a crei adres a
fost indicat. Dup citire, n irul parametru, pointerul va idica primul
caracter care urmeaz specificatorului de format, iar n cel de intrare
primul caracter nu a fost convertit. Punctul care indic prezena
zecimalelor este un caracter care se numr. Citirea se ntrerupe dac nu
a fost citit i convertit nici un caracter.


Exemplul 4.6

Fie declaraiile : int a,b;
Atunci:
scanf(%d, &a); citete variabila a;
scanf(%1d, &a); citete prima cifr a numrului tastat;
variabila a va reine valoarea 3 dac a fost tastat 357;
scanf(%1d %*1d %1d, &a, &b); citete prima i a
treia cifr a numrului tastat; variabila a va reine valoarea 3, iar b
valoarea 7 dac a fost tastat 357, cifra 5 este citit, dar nu este memorat;


Exemplul 4.7

Fie declaraiile : char a,b; Atunci:
scanf(%c, &a); citete variabila a;


Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 85
scanf (%c %c,&a, &b); dac s-a tastat ebbbt
unde b reprezint un blank atunci a va reine caracterul e, iar b
caracterul t, deoarece cele dou formate de citire au fost separate prin
spaiu;
scanf (%c%c,&a, &b); dac s-a tastat ebbbt unde b
reprezint un blank atunci a va reine caracterul e, iar b caracterul b,
blank, deoarece cele dou formate de citire nu au fost separate prin
spaiu;
scanf (2%c,&a); dac s-a tastat 23, atunci a va reine
caracterul 3, deoarece 2 este caracterul ateptat; dac s-a tastat 32,
atunci a nu se citete, deoarece 2 este caracterul ateptat, nu 3.


Testul de autoevaluare 4.2

Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte.
Punctaj minim: 80

1. Fie declaraia: int n; long double x; char s[100];
Care din secvenele urmtoare sunt corecte pentru citirea variabilelor?
a) scanf(%i %s %lg, &n, &s, &x);
b) scanf(%d %s %Lg, &n, &s, &x);
c) scanf(%d %s %Lg, &n, s, &x);
d) scanf(%d %c %lf, &n, &s, &x);
e) scanf(%d % , &n, &s, &x);


2. S se citeasc i tipreasc cte o variabil din fiecare tip cunoscut..




3. Fie declaraiile: char a,b; int c; float d; Se consider instruciunea:
scanf( %c%3d%c 12 %f, &a, &c, &b, &d);
Ce valori vor reine variabilele a, b, c, d dac se citete:
bbabb123412-41.7
a123b412-41.7




4. Fie declaraia char s[20]; Care din declaraiile urmtoare citesc corect un ir de
caractere?
a. scanf(%c,s);
b. scanf(%c,&s);
c. scanf(%s,s);
d. scanf(%s,&s);
e. scanf(%,s);
f. scanf(,s);

Citirea i scrierea datelor
86 Proiectul pentru nvmntul Rural
5. Fie declaraia: int a, b, c;
Ce se ntmpl dac folosind pentru citire apelul:
scanf(%2d%3d%4d, &a, &b, &c);
se va introduce secvena de intrare 123456? Care va fi valoarea variabilelor dup aceast
introducere?




Variantele corecte de rspuns se afl la pag. 85.


n Laboratorul 3 din Anexe vei descoperi i alte modaliti de citire a
datelor, specifice anumitor tipuri de variabile sau mediului de programare
C++.
Rspunsuri corecte la testele de autoevaluare

Testul de autoevaluare 4.1

Rspunsuri corecte:
1 A Vezi U4.2 Funcia de scriere cu format pag. 77
2 F Vezi U4.2 Funcia de scriere cu format pag. 77
3 F Vezi U4.2 Funcia de scriere cu format pag. 77
4 A Vezi U4.2 Funcia de scriere cu format pag. 77
5 F Vezi U4.2 Funcia de scriere cu format pag. 77

Testul de autoevaluare 4.2
:
Rspunsuri corecte:
1 b i c Vezi U4. 3 Funcia de citire cu format pag. 81
2 Vezi U4. 3 Funcia de scriere cu format pag. 81

3. Fie declaraiile: char a,b; int c; float d; Se consider instruciunea:
scanf( %c%3d%c 12 %f, &a, &c, &b, &d);
Ce valori vor reine variabilele a, b, c, d dac se citete:
bbabb123412-41.7
a123b412-41.7

Primul caracter din irul parametru este blank, deci alb. n irul de intrare pointerul marcheaz un
un blank, deci, n irul parametru pointerul va marca caracterul %, iar n cel de intrare caracterul a.
Dup caracterul % urmeaz caracterul c, deci va fi citit un caracter, i anume a, ce va fi atribuit
variabilei cu acelai nume. n irul parametru, pointerul marcheaz caracterul % , iar n cel de
intrare pointerul marcheaz b blank. Se analizeaz dac exist un specificator de format, condiie
ndeplinit - %3d condiie care solicit citirea unui ntreg de maxim 3 cifre. n irul de intrare se
trece peste caracterele albe, pointerul marcnd caracterul 1. Se citeasc i urmtoarele 2 caractere:
2 i 3, deci variabilei c i se va atribui valoarea 123. n irul parametru, pointerul indic caracterul %,
iar n cel de intrare, caracterul 4.. Dup % urmeaz un specificator de format - %c deci variabila
b va reine codul caracterului 4. n irul parametru, pointerul trece peste caracterul alb, ajungnd la
caracterele 1, apoi 2. Se compar aceste caractere cu cele din irul de intrare, care sunt de
asemenea 1 i apoi 2. Citirea continu; n irul parametru se trece peste blank i se ajunge la un
nou specificator de format - %f iar n irul de intrare se gsesc caracterele 4 1 . i 7, deci
rezultatul va fi convertit ctre numrul real -41.7, ce va fi reinut de variabila d. Citirea se ncheie,
fiind citite corect 4 valori
Citirea i scrierea datelor
Proiectul pentru nvmntul Rural 87

n cel de-al doilea caz vor rezulta valorile:
a=a c=123 b= (blank) d nu mai este citit de ce?

4. c i d Vezi U4. 3 Funcia de scriere cu format pag. 39

5. scanf(%2d%3d%4d, &a, &b, &c);
a=12 b=345 c=6

Testul de autoevaluare 4.3

1. F Vezi Laboratorul 3
2. b Vezi Laboratorul 3
3. d Vezi Laboratorul 3
4. iostream.h Vezi Laboratorul 3
5. 9, respectiv 5 Programul determin valoarea maxim dintre cele trei numere citite.





BIBLIOGRAFIE

1. Dorin Stoilescu, Manual de C/C++ - Cap.3 Intrri/Ieiri standard, 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.
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 Cap.8 Operaii de intrare/ieire pentru
consol, 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.


Lucrarea de verificare Nr. 4, notat de tutore

Rspundei la urmtoarele ntrebri. Acestea trebuie s fie scurte i
clare. Fiecare ntrebare valoreaz 10 puncte. Primii 20 puncte din oficiu.
Punctajul maxim al testului este de 100 puncte.


1. Care este singura funcie care trebuie s fie coninut de toate
programele scrise n C/C++?
Citirea i scrierea datelor
88 Proiectul pentru nvmntul Rural
a. start()
b. system()
c. main()
d. program()


2. Ce semn de punctuaie este folosit pentru a semnaliza nceputul i sfritul unei
secvene de program?
a. { }
b. -> and <-
c. BEGIN and END
d. ( and )

3. Care este semnul de punctuaie cu care se termin cele mai multe linii de program
C/C++?
a. .
b. ;
c. :
d. '

4. Care din urmtoarele rnduri reprezint un comentariu corect?
a. */ Comentariu */
b. ** Comentariu **
c. /* Comentariu */
d. { Comentariu }

5. Care cuvnt din urmtoarele nu reprezint un tip corect de variabile?
a. float
b. real
c. int
d. double

6. Care din urmtoarele reprezint varianta corect a operatorului de comparare a
egalitii a dou variabile?
a. :=
b. =
c. equal
d. ==

7. Scriei un program care s citeasc de la tastatur valoarea temperaturii de afar (un
numr ntreg) i s afieze mesajul Este frig! dac este o temperatur negativ, Este
placut azi afar dac temperatura este mai mic dect 20
o
C, respectiv Este o zi torida!
dac temperatura depete ultima valoare. Se va folosi operatorul condiional.

8. Scriei un program care calculeaz i afieaz retribuia unui salariat n funcie de grupa
de vechime n care se afl. Exist 3 grupe de vechime (1, 2, i 3). Retribuia se calculeaz
cu relaia:
retribuie=salariu +spor
Sporul depinde de grupa de vechime i este egal respectiv cu 150, 250, 350. Grupa de
vechime i salariul se introduc de la tastatur. Programul va folosi operatorul condiional.

Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 89

Unitatea de nvare nr. 5

INSTRUCIUNILE LIMBAJULUI C / C++


Cuprins Pagina

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


Obiectivele Unitii de nvare 5

Dup studiul acestei uniti de nvare, vei reui

Identificarea formelor generale ale instruciunilor limbajului C /
C ++
Cunoaterea efectului instruciunilor limbajului
Utilizarea adecvat n aplicaii a instruciunilor limbajului
Implementarea algoritmilor n mediul de programare C/C++,
cu ajutorul instruciunilor limbajului


5.1 Instruciunea expresie

Forma general:

expresie;

Efect:
Se evalueaz expresia.

Exemplul 5.1


i++; // se incrementeaz postfixat valoarea variabilei i
a*=10; // se multiplic cu 10 valoarea variabilei a
getchar(); // se citete un caracter

Instruciunile Limbajului C / C++
90 Proiectul pentru nvmntul Rural
Observaii:
expresie poate fi vid. Instruciunea devine instruciunea vid ;
orice instruciune n C / C++ se termin cu ;
este permis folosirea oricrei expresii sintactic corecte, chiar i
atunci cnd instruciunea nu genereaz nici un efect.


Exemplul 5.2

3*( 7-4);


5.2 Instruciunea compus

Forma general:

{
declaraii
instruciune1;
instruciune2;
...
instruciune n;
}
Efect:
Se execut n ordine instruciunile specificate.

Observaii:
Utilizarea instruciunilor compuse este necesar atunci cnd
sintaxa permite executara unei instruciuni ( if, for, do-while, while)
care efectueaz mai multe operaii.
Declaraiile care apar ntr-o instruciune compus sunt locale
instruciunii. Mai exact, ele sunt valabile numai n corpul instruciunii
compuse, din momentul declarrii lor pn la sfritul instruciunii.


5.3 Instruciunea if

Forma general:

if ( expresie) instruciune1
else instruciune2

Efect:
Se evalueaz expresia
Dac valoarea expresiei este diferit de 0, se execut instruciune1,
altfel se execut instruciune2.

Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 91


Exemplul 5.3

if (x) cout<<x<< nu este zero ;
else cout<<x<<este zero;

Observaii:
expresie se ncadreaz ntre paranteze rotunde;
ramura else poate s lipseasc dac instruciune2 este vid.


Exemplul 5.4

S se calculeze maximul dintre a i b, unde a i b sunt dou variabile ntregi.

# include <iostream.h>
void main()
{
int a,b, max;
cout<< a= cin>>a;
cout<< b= cin>>b;
max=a;
if (max<b) max=b;
cout<< maximul este<<max;
}


Exemplul 5.5

Se citesc a,b,c coeficienii reali ai ecuaiei de gradul II ax
2
+ bx+c=0. Se cere s se
scrie un program care s rezolve ecuaia.

Varianta 1:

# include <iostream.h>
# include <math.h>
# include <conio.h>

main()
{ flota a,b,c,d;
cout<<a=; cin>>a;
cout<<b=; cin>>b;
cout<<c=; cin>>c;
if (a)
{ d=b*b-4*a*c;
if (d>=0) { cout<<x1=<<(-b+sqrt(d))/(2*a));
cout<<x2=<<(-b-sqrt(d))/(2*a));}
else cout <<x1 si x2 nu sunt reale;
}
else if (b) cout<<x=<<(-c/b);
else if(c==0) cout<<infinitate de soluii;
else cout<< ecuaia nu are soluii;
}



Instruciunile Limbajului C / C++
92 Proiectul pentru nvmntul Rural

Observaii:
1. funcia rdacin ptrat sqrt() are prototipul n math.h;
2. clrscr() are prototipul n conio.h i are funcia de tergere
3. varianta 2 a programului folosete operatorii condiionali ? :

O alt variant de rezolvare a acestei probleme este prezentat n
laboratorul corespunztor acestui capitol.


Test de autoevaluare 5.1



Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul
pentru fiecare cerin valoreaz 25 de puncte. Punctaj minim: 75.

1. Care din urmtoarele secvene de instruciuni atribuie variabilei reale k cea mai
mare dintre valorile variabilelor a i b sau valoarea lor comun, dac acestea sunt
egale:
a) if (a<=b) k=a; else k=b;
b) if (a<=b) k=b; else k=a;
c) if ( a==b) k=a; else if (b>a) k=b;
d) k=a; if (k<b) k=b;

2. Se consider secvena de program:
x=1;
if ( ! (a<b) || !(a<=c) if (b>=c) cout <<(-x); else if (b<c) cout<<x;
Pentru care dintre tripletele de valori ale variabilelor a,b,c se va afia valoarea 1?

a) a=3, b=2, c=4
b) a=2, b=3, c=4
c) a=4, c=3, c=2
d) a=2, b=4, c=3

3. Dac a i b sunt variabile de tip int, iar x i z sunt variabile de tip float, stabilii care
dintre secvenele de instruciuni sunt corecte:
a) b=0; if (a>b) b=a/2;
b) a=8; b=10;
c) a:=5; b:=5; if (a==b) x=y;

4. Care dintre instruciunile urmtoare sunt incorecte sintactic, tiind c operanzii care
intervin sunt de tip ntreg?
a) if ( abs(3==3) cout<< ok;
b) if ( a%3=b) cout<< zz;
c) if ( (b+a)/2) cout<< yy;
d) if (!1) cout<<hm;


Variantele corecte de rspuns se afl la pag. 99.

Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 93
5.4 Instruciunea switch

Forma general:

switch (expresie)
{
case constanta
1
: secvena instruciuni
1

case constanta
2
: secvena instruciuni
2

...
case constanta
n
: secvena instruciuni
n

default: secvena instruciuni
n+1

}

Efect:
Se evalueaz expresie;
Se compar succesiv valoarea ei cu valorile expresiilor constante
care eticheteaz alternativele case.
Dac se ntlnete o alternativ case etichetat cu valoarea
expresiei, atunci se execut secvena de instruciuni
corespunztoare i toate secvenele de dup aceasta, pn la
ntlnirea instruciunii break sau pn la sfritul instruciunii switch.
Dac nici una dintre valorile etichetelor alternative case nu coincide
cu valoarea expresiei, atunci se execut secvena de instruciuni de
pe ramura default.


Exemplul 5.6

switch (x)
{
case *: a*=b; break;
case /: a/=b; break;
case +: a+=b; break;
case -: a-=b; break;
default: cout << eroare!;
}

n funcie de valoarea variabilei char c (*, /, +, -) vom efectua operaia
corespunztoare ntre variabilele a i b. Dac variabila c are orice alt
valoare, vom da mesajul eroare!

Observaii:

Expresia se ncadreaz obligatoriu ntre paranteze rotunde.
Dac secvena de instruciuni
n+1
este vid, ramura default poate
lipsi.
Instruciunea switch este o generalizare a lui if. Spre deosebire de
instruciunea if, care permite selectarea unei alternative din maxim
dou posibile, switch permite selectarea unei alternative din
maximum n+1 posibile.



Instruciunile Limbajului C / C++
94 Proiectul pentru nvmntul Rural
5.5 Instruciunea break

Forma general:

break;

Efect:
Determin ieirea necondiionat din instruciunea switch, while, for
sau do-while n care apare.


5.6 Instruciunea while

Forma general:

while (expresie)
instruciune

Efect:
1. se evalueaz expresie;
2. dac valoarea expresiei este 0, se iese din instruciunea while,
altfel, dac valoarea este diferit de 0, se execut instruciune i
apoi se revine la pasul 1.


Exemplul 5.7

S calculm rsturnatul numrului natural n. Ex: rsturnatul lui 821 este
128.

1 x=0; // n x obin rsturnatul lui n
2 while (n)
{
3 x=x*10+n%10; // adaug ultima cifr din n la x
4 n/=10; // elimin ultima cifr din n
}

Linia Efect n x
1 Se iniializeaz x cu 0 821 0
2 Se testeaz dac n este diferit de 0 821 0
3 Se adaug la x ultima cifr a lui n 821 1
4 Se elimin ultima cifr din n 82 1
2 Se testeaz dac n este diferit de 0 82 1
3 Se adaug la x ultima cifr a lui n 82 12
4 Se elimin ultima cifr din n 8 12
2 Se testeaz dac n este diferit de 0 8 12
3 Se adaug la x ultima cifr a lui n 8 128
4 Se elimin ultima cifr din n 0 128
2 Se testeaz dac n este diferit de 0; se iese
din while
0 128


Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 95
Observaii:
instruciunea se execut repetat ct timp valoarea expresiei este
nenul.
Dac expresia are de la nceput valoarea 0, instruciune nu se
execut nici macar o dat.
Sintaxa permite executarea n while a unei singure instruciuni, prin
urmare, atunci cnd este necesar efectuarea mai multor operaii,
acestea se grupeaz ntr-o instruciune compus.



Sarcin de lucru 5.1

Scrie un program C/C++ care s calculeze x
n
, unde n este un numr
natural i x un numr real.
Barem:







Indicaie:

x
0
=1
x
n
= x * x ** x=x*(x * x ** x)

de n ori de n-1 ori

Varianta corect de rspuns se afl la pag. 99.

5.7 Instruciunea do- while

Forma general:

do
instruciune
while (expresie)
Efect:
1. se execut instruciune;
2. se evalueaz expresie;
3. dac valoarea expresiei este 0, se iese din instruciunea repetitiv;
dac valoarea expresiei este diferit de 0, atunci se revine la pasul
1.



declaraii corecte 10 puncte
citirea corect a valorilor variabilelor 10 puncte
calculul corect al puterii 50 puncte
utilizarea corect a instruciunii while 10 puncte
afiarea corect a rezultatului 10 puncte
din oficiu 10 puncte
total 100 puncte
Instruciunile Limbajului C / C++
96 Proiectul pentru nvmntul Rural

Exemplul 5.8

S numrm cifrele numrului natural memorat n variabila n. Ex: n=1663
are k=4 cifre.
k=0; // n k obin numrul de cifre
do
{
n/=10; // elimin ultima cifr a lui n
k++; // numr cifra
} while (n); // repet algoritmul ct timp n are cifre

Observaii:
instruciunea do-while execut instruciunea specificat cel puin o
dat, chiar dac de la nceput valoarea expresiei este 0, deoarece
evaluarea expresiei se face dup executarea instruciunii.

Sarcina de lucru 5.2

Se consider urmtorul program:

#include< iostream.h>
void main()
{
int a,b, nr=0, i;
cout<< a=;cin>>a;
cout<< b=;cin>>b;
i=a;
while (i<=b) { if (i%2==0) nr++; i++;
cout<<nr=<<nr;}

a) Ce va afia pe ecran pentru a=5 i b=8?
b) Scrie un program echivalent, care s utilizeze instruciunea do-while.
c) Care este efectul acestui program?

Barem:





Variantele corecte de rspuns se afl la pag. 99.


5.8 Instruciunea for

Forma general:

for ( expresie iniializare; expresie continuare; expresie reiniializare)
instruciune


a) 10 puncte
b) 30 puncte
c) 10 puncte
total 50 puncte
Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 97
Efect:
1. se evalueaz expresia de iniializare;
2. se evalueaz expresia de continuare;
3. daca valoarea expresiei de continuare este 0, se iese din
instruciunea repetitiv for; dac valoarea expresiei de continuare
este diferit de 0, atunci se execut instruciune, se evalueaz
expresia de reiniializare i se revine la pasul 2.

Observaii:
instruciunea for este o instruciune repetitiv, ca i while i do-
while;
ea poate fi simulat cu ajutorul instruciunii while astfel:



Exemplul 5.9

S se calculeze factorialul numrului natural n.
n!= 1 2 3 n

fact=1;
for(i=1;i<=n;i++) fact*=i; // n fact voi obine produsul

pentru n=4

i fact
1 1*1=1
2 1*2=2
3 2*3=6
4 4*6=24

for( expr1; expr2;expr3)
i nstruci une
expr1;
whi l e (expr2)
{
i nstruci une;
expr3;
}
while ( expresie)
i nstruci une
for ( ; expresi e ; )
i nstruci une
Whi l e (1) i nstruci une
for ( ; ; )
i nstruci une
Instruciunile Limbajului C / C++
98 Proiectul pentru nvmntul Rural

Test de autoevaluare 5.2

Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul
pentru fiecare cerin valoreaz 25 de puncte. Punctaj minim: 75.

1.Ce valoare va avea variabila x dup executarea instruciunilor urmtoare?

x=4;
while(x<7) x+=2;
for(i=1;i<=x;i++) x+=1;

a) 4 b) 16 c) 10 d) 8 e)9 f) x are o valoare necontrolat datorit instruciunii
for.

2.Ce se obine n urma rulrii secvenei urmtoare:

cin>>n;
cif=2;
for(int i=3;i<=n;i++) // I declarat local in instructiunea for
{ cif*=i;
while(cif%10==0) cif/=10;
cif%=10;
}
cout<<cif;
a) calculeaz ultima cifr a lui n!
b) calculeaz ultima cifr nenul a lui n!
c) Calculeaz n!
d) Determin numrul de cifre a lui n!

3.Care va fi valoarea variabilei p dup execuia secvenei:

p=1;
for(i=1;i<=n;i++)
{ s=0;
for(j=1;j<=i; j++) s+=j;
p*=s;
}
a) 180 b) 18 c) 9 d) 216 e)1

4.Pentru afiarea numerelor naturale 1,2,n , unde n este dat, propun urmtoarele
secvene de program:

a) for(i=1;i<=n;i++); cout<<i;
b) for(i=1;i<=n;i++) cout<<i;

Care din afirmaiile de mai jos este adevrat?
i) nici una din secvene nu ndeplinete cerina problemei.
ii) Ambele secvene ndeplinesc cerina problemei
iii) Secvena a) conine erori de sintax
Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 99
iv) Secvena b) ndeplinete cerina problemei
v) Numai secvena a) ndeplinete cerina problemei

Variantele corecte de rspuns se afl la pag. 99.



Exemplul 5.11

irul Fibonacci

Fie irul 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... . Fie n un numr natural citit de
la tastatur. S se scrie un program care afieaz cel de-al n-lea termen
din irul lui Fibonacci.


Observ c pentru a calcula un termen Fibonacci am nevoie de doi termeni
precedeni. Voi folosi variabilele f0, f1, f2; n f0 i f1 voi reine doi termeni
consecutivi din ir i n f2 voi calcula termenul urmtor f2=f1+f0. La iteraia
i a ciclului for voi calcula al i-lea termen Fibonacci.

#include<iostream.h>
void main()
{ int i, n, f0, f1, f2;
cin>>n;
f0=1; f1=1; //iniializarea primilor doi termeni
for ( i=2;i<=n;i++)
{ f2=f1+f0; // calculez termenul curent
f0=f1; /* reiniializez variabilele care definesc doi termeni
f1=f2; consecutivi n ir */
}
cout<< cel de-al<<n<< termen Fibonacci este<< f2;
}

Instruciunile Limbajului C / C++
100 Proiectul pentru nvmntul Rural

Rspunsuri corecte la testele de autoevaluare, sarcinile de
lucru

Test de autoevaluare 5.1

Rspunsuri corecte: Vezi U5.3 Instruciunea if
1. b), d)
2. b)
3. a), b)
4. b), d)

Test de autoevaluare 5.2 Vezi U5.8 Instruciunea for
1. f)
2. b)
3. b)
4. iii), iv)

Soluiile sarcinilor de lucru 5.1 i 5.2, ca i a problemelor propuse pentru laboratorul corespunztor
se gsesc n cadrul laboratorului 4.







Bibliografie

1. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu,
Editura Polirom, Iai, 2002.
2. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++
pentru liceu, Cap 2 Instruciunile limbajului C / C++, Editura Polirom,
Iai, 2005
3. Cormen, Thomas, Introduction in Algorithms, Cap 1 Fundamente
Matematice, The Massachussets Institute of Technology, 1990.

Instruciunile Limbajului C / C++
Proiectul pentru nvmntul Rural 101
Lucrarea de verificare Nr. 5, notat de tutore



Rezolv aplicaiile de mai jos.
Barem de notare:



















Punctaj minim: 70 puncte.

1. Se consider urmtorul algoritm:
k=1;
while(n<=1000)
{ n*=2;
k++;
}
cout<<k;

Care este cea mai mare valoare posibil pentru variabila n astfel nct algoritmul s
afieze valoarea 5?

a) 10 b)3 c)6 d)7 e)1 f)12


2. Dac a i b sunt variabile de tip int, stabilete care din urmtoarele structuri repetitive
sunt ciclri infinite:
a) a=10; b=0;
do{
a--;b++;
}while (a!=b);
b) a=1; b=5;
while(a+b<=10)
{ a=a+2; b=b-2;}
c) a=0; b==10;
while((a<=10)&&(b>=0))
{ b++;a++;}

d) a=0; b=10;
while ((a<=10)||(b>=0)
{b++;a++;}


Aplicaia 1 10 puncte
Aplicaia 2 15puncte
Aplicaia 3 15 puncte
Aplicaia 4 15 puncte
Aplicaia 5 15 puncte
5 puncte declaraii corecte
5 puncte cutarea secvenei 13 n numr
5 puncte afiarea rezultatului
Aplicaia 6 15 puncte
5 puncte declaraii corecte
5 puncte verificarea respectrii regulilor de
construire a sirului
5 puncte afiarea rezultatului
Aplicaia 7 15 puncte
5 puncte declaraii corecte
5 puncte determinarea divizorilor care sunt primi
5 puncte afiarea rezultatului
Total 100 puncte
Instruciunile Limbajului C / C++
102 Proiectul pentru nvmntul Rural
3. Fie programul:
#include<iostream.h>
void main()
{ int a,b,u,aux;
cin>>a>>b;
if(a<b) {aux=a;a=b;b=aux;}
u=0;
while(a>=b) {u++;a-=b;}
cout <<u;
}
Pentru a=2572 i b=13 programul va afia:
a) 11 b)91 c)197 d)13 e)199

4. Alegei varianta corect dac n (natural) este par:
unsigned int n;
a) if(n>0) if(n%2) cout<<n par;
b) if(n>0) if(n/2==0) cout<<n par;
c) if(n>0) if(n/2) cout<<n par;
d) if(n>0) if(!(n%2)) cout<<n par;

5. Se d un numr natural n. S se scrie un program C/ C++ care s determine dac
numrul conine n scrierea lui secvena 13. Ex: numrul 171310 conine secvena 13, iar
numrul 171032 nu conine secvena 13.





6. Se citesc de la tastatur numere ntregi pn la introducerea numrului 0. S se
verifice printr-un program dac numerele introduse se succed nti cresctor i apoi
descresctor ( ) sau nti descresctor i apoi cresctor ( ).
Proprietatea trebuie s fie ndeplinit pe ntreaga niruire de numere. Ex: pentru sirul 1, 5,
8, 9,11,21, 15, 13, 10,3, 0 proprietatea este ndeplinit. Nu i pentru irul 3, 5, 6, 11, 10, 8,
13, 15, 0.





7. S se scrie un program care citete de la tastatur un numr natural n i tiprete toi
divizorii lui care sunt numere prime. Ex: pentru n=70, se vor tipri 1, 2, 5 i 7.






Tablouri
Proiectul pentru nvmntul Rural 103

Unitatea de nvare Nr. 6

TABLOURI



Cuprins Pagina

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



Obiectivele Unitii de nvare 6

Dup parcurgerea acestei uniti de nvare vei fi capabili s:

Identificai diferitele tipuri de variabile structurate
Comparai operaiile cu pointeri cu celelalte tipuri de operaii
Efectuai diverse operaii cu variabile de tip tablou
Efectuai diverse operaii cu variabile de tip ir de caractere
Alegei tipul de variabil potrivit rezolvrii unei probleme


Tipurile de date descrise anterior sunt tipuri simple. Pe baza acestora se
pot construi tipuri derivate: tablouri, structuri i fiiere

Un tablou (array) este un ansamblu de variabile de acelai tip la care se
face referire folosindu-se un acelai nume. Un anume elemant dintr-un
tablou este indicat prin intermediul unui indice (index). n C, toate
tablourile sunt alctuite din locaii de memorie nvecinate. Adresa de
memorie cea mai mic corespunde primului element, iar adresa cea mai
mare corespunde ultimului element. Tablourile pot avea de la una la mai
multe dimensiuni. Tabloul cel mai des folosit n C este irul string, care
este un tablou de caractere care se ncheie cu un zero. Acest mod de a
privi irurile confer limbajului C mai mult putere i eficien fa de alte
limbaje.

n cadrul limbajului C, tablourile i pointerii sunt legai printr-o relaie
strns, abordarea tablourilor necesitnd elemente de adresare, deci
referire la pointeri.

Tablouri
104 Proiectul pentru nvmntul Rural
6.1 Tablouri unidimensionale

n C, tablourile unidimensionale sunt alctuite dintr-un grup de elemente
de acelai tip (numit tip de baz) i referite printr-un nume comun.
Variabilele de tip tablou se definesc astfel:
tip_de_baza nume_var[dimensiune];
unde tip_de_baza reprezint tipul tabloului, adic al fiecrui element
inclus n tablou, iar dimensiune definete numrul de elemente coninute
n tablou.
Un element al tabloului este accesat folosind ca index poziia elementului,
astfel tabloul_meu[6] va referi al aptelea element al tabloului tabloul_meu.
Atenie! n C, "numerotarea" elementelor tablourilor ncepe cu poziia 0,
astfel, dac avem definiia:
int tabloul_meu[100];
primul element al tabloului va fi tabloul_meu[0], iar ultimul
tabloul_meu[99].
Tablourile sunt stocate n memorie la locaii consecutive, un tablou
ocupnd o zon contigu de memorie, cu primul element al tabloului aflat
la adresa mai mica.
Atentie! O problem legat de tablouri este c n C nu se face nici o
verificare legat de "marginile" tabloului, astfel c se pot accesa greit
elemente din afara tabloului. De exemplu, pentru definia:
int tabloul_meu[100];
dac accesm tabloul_meu[105] nu se va semnala nici o eroare,
returnndu-se valoarea de la o locaie de memorie aflat la o distan de 5
locaii fa de sfritul tabloului, fapt ce va duce la comportri "bizare" ale
programului. Aceeai situae, dar fa de nceputul tabloului, se ntmpl
la accesarea tabloul_meu[-5].
Prelucrrile de tablouri se implementeaz de obicei prin structuri repetitive
for, deoarece se cunoate aprioric numrul de iteraii.


Exemplul 6.1


n urma executrii urmtorului program:

main()
{int a[20], n, i, min, max;
printf(Introduceti dimensiunea tabloului:);

Tablouri
Proiectul pentru nvmntul Rural 105
scanf(%d, &n);
for (i=0; i<n; i++)
{printf(a[%d]=, i);
scanf(%d, &a[i]);
}
min=max=a[0];
for (i=1; i<n; i++)
if (a[i]>max)
max=a[i];
else
if (a[i]<min)
min=a[i];
printf(minim=%d\tmaxim=%d\n, min,max);}

se vor determina valorile minime i maxime dintr-un vector (tablou
unidimensional) cu n componente. Mai nti este citit valoarea lui n i
apoi sunt citite componentele vectorului cu ajutorul unei instruciuni for. Se
iniializeaz cele dou variabile min i max, corespunztoare celor dou
valori cerute, cu primul element al vectorului, a[0]. n continuare, fiecare
element al vectorului a[i] este comparat mai nti cu valoarea maxim
curent; dac este mai mare dect aceasta, variabila max i schimb
valoarea max=a[i]; - , n caz contrar acesta este comparat cu valoarea
minim curent; dac este mai mic dect aceasta, variabila min i
schimb valoarea min=a[i];


Exemplul 6.2

Se citete un ir de n numere naturale de la tastatur i un alt numr
natural x. Se afl acest numr printre componentele vectorului? n caz
afirmativ, de cte ori a fost gsit? S se afieze un mesaj corespunztor
fiecrei situaii.

main()
{unsigned int a[20], n, i, f, x;
printf(Introduceti dimensiunea tabloului:);
scanf(%ud, &n);
for (i=0; i<n; i++)
{printf(a[%ud]=, i);
scanf(%ud, &a[i]);
}
printf(x=);
scanf(%ud, &x);
f=0;
for (i=0; i<n; i++)
if (a[i]==x)
f++;
if (f==0)
printf(numarul %ud nu se afla in vector\n, x);
else
printf(numarul %ud se afla in vector, aparand de
%ud ori\n, x,f);}

Tablouri
106 Proiectul pentru nvmntul Rural
Iniializarea tablourilor se face prin semnul = dup declaraia tabloului,
urmat de o list de valori iniiale, separate prin virgule, care se include
ntre acolade. De exemplu:

int a[4]={1,2,3,4};
char s[5]={a, b, c, d, \0};

Dac lista de valori iniiale cuprinde mai puine date dect dimensiunea
declarat a tabloului, celelalte valori se iniializeaz cu zero. De exemplu,
n urma declaraiei:

int a[20]={1,-2,3,-4,5};

elementele a[4], a[5], ,a[19], vor conine valoarea zero.

n cazul unui tablou iniializat, se poate omite dimensiunea, caz n care ea
este calculat implicit de ctre compilator, dup numrul de elemente din
lista de iniializare. De exemplu, declaraia:

float z[]={1.0, 2.7, -3.3, 4.0, -5.5};

indic faptul c z este un tablou de numere reale, cu 5 elemente,
iniializate cu elementele din list.


Exemplul 6.3

Un exemplu de aplicaie foarte des ntlnit este urmtoarea: s se
ordoneze componentele vectorului n ordine cresctoare. Exist mai muli
algoritmi de sortare, dintre care se pot aminti: sortarea prin interschimbare,
sortarea prin selecia valorii minime sau maxime, sortarea prin numrare,
sortarea prin inserie sau bubble sort.

Algoritmul de sortare prin interschimbare este unul din cei mai simpli
algoritmi de sortare, dar nu i cel mai eficient. Acesta are la baz
urmtoarea metod de sortare: fiecare element din vector a[i], 0<=i<n-1,
este comparat cu toate elementele situate n vector dup el, a[j], i<j<n;n
cazul n care cele dou elemente nu sunt n ordinea dorit, acestea se vor
interschimba.

main()
{int a[20], n, i, j, aux;
....................................
for (i=0; i<n-1; i++)
for (j=i+1, j<n; j++)
if (a[i]>a[j])
{aux=a[i];
a[i]=a[j];
a[j]=aux;
}
.
}

Tablouri
Proiectul pentru nvmntul Rural 107

Dac vectorul a coninea la nceput elementele: 7, 2, 9, 1, 3, iat civa
pai din execuia algoritmului:

i=0, j=1 este a[0]>a[1]? da, deci se vor interschimba primele 2 elemente:
a devine: 2, 7, 9, 1, 3
i=0, j=2 este a[0]>a[2]? nu, deci nu se ntmpl nimic;
i=0, j=3 este a[0]>a[3]? da, deci se vor interschimba elementele a[0] i
a[3]:
a devine: 1, 7, 9, 2, 3
i=0, j=4 este a[0]>a[4]? nu, deci nu se ntmpl nimic;

Se trece la urmtoarea valoare pentru i, deoarece for-ul pentru j s-a
terminat:

i=1, j=2 este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=1, j=3 este a[1]>a[3]? da, deci se vor interschimba elementele a[1] i
a[3]:
a devine: 1, 2, 9, 7, 3
..
n final, componentele vectorului vor fi: 1, 2, 3, 7, 9

O metod de sortare mai eficient i foarte des folosit este bubble sort,
sau sortarea prin metoda bulelor. Aceast metod presupune parcurgerea
vectorului i compararea elementelor alturate (a[i] i a[i+1]); dac ele nu
respect ordinea dorit, i vor interschimba valorile. Vectorul va fi parcurs
de attea ori, pn cnd va fi sortat, adic nu se va mai efectua nici o
interschimbare de valori. n acest scop va fi folosit o variabil de tip
ntreg, care s in minte dac s-au mai efectuat interschimbri.
Secvena de algoritm corespunztoare este:

main()
{int a[20], n, i, aux, gata=0;
....................................
while (!gata)
{
gata=1;
for (i=0; i<n-1; i++)
if (a[i]>a[i+1])
{aux=a[i];
a[i]=a[i+1];
a[i+1]=aux;
gata=0;
}
}
.
}

Dac vectorul a coninea la nceput aceleai elemente: 7, 2, 9, 1, 3, iat
civa pai din execuia algoritmului:
gata=0,
atta timp ct gata este zero:
Tablouri
108 Proiectul pentru nvmntul Rural
gata =1
i=0 este a[0]>a[1]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 2, 7, 9, 1, 3
i=1 este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=2 este a[2]>a[3]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 7, 1, 9, 3
i=3 este a[3]>a[4]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 7, 1, 3, 9
Se reia structura while, deoarece gata este zero:
gata =1
i=0 este a[0]>a[1]? nu, deci nu se ntmpl nimic;
i=1 este a[1]>a[2]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 2, 1, 7, 3, 9
i=2 este a[2]>a[3]? da, deci se interschimb cele dou valori
i gata rmne zero; a devine: 2, 1, 3, 7, 9,
i=3 este a[3]>a[4]? nu, deci nu se ntmpl nimic;
Se reia structura while, deoarece gata este zero:
gata =1
i=0 este a[0]>a[1]? da, deci se interschimb cele dou valori
i gata devine zero; a devine: 1, 2, 3, 7, 9
i=1 este a[1]>a[2]? nu, deci nu se ntmpl nimic;
i=2 este a[2]>a[3]? nu, deci nu se ntmpl nimic;
i=3 este a[3]>a[4]? nu, deci nu se ntmpl nimic;
Se reia structura while, deoarece gata este zero:
gata =1
Se mai parcurge o dat vectorul, dar nu se mai efectueaz nici o
intershimbare, cci acesta este ordonat cresctor. Condiia de meninere
n structura repetitiv nu mai este ndeplinit i algoritmul se ncheie.


Exemplul 6.4

Se consider un vector cu n componente numere ntregi, ordonate
cresctor i un numr ntreg x. S se determine dac acest numr se afl
printre componentele vectorului, iar n caz afirmativ, poziia sa n vector.

Pentru acest exemplu s-ar putea folosi ca metod de rezolvare algoritmul
prezentat n cazul exemplului 6.2, dar nu ar fi o metod eficient,
deoarece nu se ine cont de faptul c vectorul este deja ordonat cresctor;
prin urmare, cnd numrul x este comparat cu un element din vector a[i],
se pot lua mai multe decizii; dac numrul x este egal cu a[i], atunci se
poate spune c numrul se afl n vector pe poziia i; dac x este mai mic
dect a[i], se poate deduce c acesta se poate afla pe poziiile mai mici
dect i, respectiv pe poziiile mai mari dect i, n caz contrar.

n Laboratorul 5 este prezentat algoritmul cutrii binare, care rspunde
cerinelor acestei probleme.


Tablouri
Proiectul pentru nvmntul Rural 109

Testul de autoevaluare 6.1

Scriei algoritmul de rezolvare a urmtoarelor probleme; putei folosi reprezentarea
algoritmilor prin scheme logice sau pseudocod. Apoi implementai algoritmul n
limbajC/C++ Rezolvarea fiecrei probleme valoreaz 20 de puncte. Punctaj minim: 80

1. Se consider n numere ntregi reinute ntr-un vector v. (1<n<=50). S se determine cel
mai mic numr pozitiv din vector i cel mai mare numr negativ coninut de vector. n cazul
n care una din valori nu poate fi determinat, s se dea un mesaj corespunztor.
Exemplu: n=8; v={4, -7, 9, 8, -3, 2, 10, -5}, atunci min_poz=2, max_neg=-3







2. Se citete un ir de numere ntregi pn la introducerea valorii zero. S se formeze doi
vectori: unul cu numerele pare introduse, iar cellalt cu cele impare. S se afieze
coninuturile celor doi vectori.
Exemplu: numerele introduse sunt: 7, -5, 8, 1, 2, -6, 3, 0
cei doi vectori vor fi: a[0]=8, a[1]=2, a[2]=-6
b[0]=7, b[1]=-5], b[2]=1, b[3]=3







3. Se citete un numr natural de maxim 10 cifre. S se introduc cifrele numrului ntr-un
vector.
Exemplu: dac n= 725943 atunci v[0]=3, v[1]=4, v[2]=9, v[3]=5, v[4]=5, v[5]=2 i v[6]=7.







4. Pentru vectorul obinut la problema anterioar, s se permute circular la dreapta cu o
poziie componentele vectorului, pn cnd acesta revine la forma iniial.
Exemplu: v={3, 4, 9, 5, 2, 7} vor rezulta pe rnd:
v={7, 3, 4, 9, 5, 2}
v={2, 7, 3, 4, 9, 5}

v={3, 4, 9, 5, 2, 7}



Tablouri
110 Proiectul pentru nvmntul Rural




5. Se dau n (1<n<=100) numere naturale reinute ntr-un vector. S se ordoneze cresctor
componentele pare ale vectorului, cele impare rmnnd pe locul lor.
Exemplu: n=8; v={4, 7, 14, 8, 3, 2, 10, 5} dup prelucrare, va deveni:
v={2, 7, 4, 8, 3, 10, 14, 5}







Indicaii i rspunsuri la pag. 120

Tablouri
Proiectul pentru nvmntul Rural 111
6.2 Pointeri

Pointerii sunt variabile care conin (sunt capabile s conin) adresele
unor altor variabile sau obiecte, deci practic adrese de memorie.
Dimensiunil pointerilor (ci octei ocup) depind de main, de
implementarea limbajului, etc. n general, acest aspect trebuie luat n
consideraie doar din punct de vedere al portabilitii programelor; un
program bun nu trebuie s depind de dimensiunile concrete ale
pointerilor i, n general, s funcioneze corect pe orice implementare a
limbajului care respect standardul ANSI.

Un pointer este asociat unui tip de variabile: exist pointeri ctre char, int,
float etc. Dac T este un tip de date standard sau definit de utilizator, un
pointer ctre tipul T se declar prin:
T *p;
Iat cteva exemple de declaraii de pointeri:
int *pi; float *pf;
char *pc;
ceea ce nseamn c pi este un pointer ctre ntreg, pf este un pointer
ctre float (real), iar pc unul ctre caracter. Se pot declara mai muli
pointeri pe acelai rnd, mpreun cu variabile de acelai tip, fiecare
variabil de tip pointer trebuind s fie precedat de simbolul *:
char *pc, c, *pa, a;
n aceast situaie, pc i pa sunt pointeri la char, iar a i c sunt variabile
de tip char.

Pentru variabilele de tip pointer exist doi operatori specifici, i anume:
operatorul de refereniere & sau de adresare
operatorul de derefereniere * sau de indirectare.

Operatorul de adresare & se aplic unei variabile, furniznd adresa
variabilei. Dac variabila este de tip T, atunci operatorul & ntoarce tipul de
date T*, adic pointer ctre T. Astfel, operatorul & este un prim mod i cel
mai important de a obine adrese de variabile sau obiecte.

Urmtoarea secven de program:
char *pc, c;
pc=&c;
determin ca, n urma atribuirii, pc s conin adresa variabilei c.

Accesul la o variabil (obiect) prin intermediul pointerilor se face cu
operatorul de indirectare *. Dac p este un pointer de tip T*, atunci *p
este prin definiie obiectul de tip T, aflat la adresa p.

n exemplul de mai sus, *pc este variabila de tip char, aflat la adresa pc,
adic tocmai variabila c. Avem astfel dou moduri de acces la variabila c:
prin specificarea numelui ei i prin intermediul pointerului pc, care a fost
poziionat pe c.

Cei doi operatori, & i * sunt operatori inveri: dac x este de tip T1 i px
este de tip T2*, atunci *(&x) este identic cu x i &(*px) este identic cu px.
n concluzie:
Tablouri
112 Proiectul pentru nvmntul Rural
pointerii reprezint adrese ale unor zone de memorie;
putem avea acces la acele zone prin operatorul *;
dimensiunea i semnificaia unei zone indicate de un
pointer depinde de tipul pointerului.

Observaie: dac pointerul p indic o variabil x, atunci expresia *p poate
aprea n orice context n care este permis apariia lui x.


Exemplul 6.5

Iat un exemplu n care un pointer indic obiecte diferite pe parcursul
execuiei programului:

main()
{
int i=1, j=5, *p=&i;
*p=2;
(*(p=&j))++;
printf(i=%d j=%d\n,i ,j);
}

Se declar variabilele ntregi i i j, iniializate cu 1, respectiv 5, i o
variabil p de tip pointer ctre int, iniializat cu adresa lui i. Prin
intermediul lui p, se atribuie practic lui i valoarea 2 (*p=2;) i apoi se
atribuie lui p adresa lui j, dup care se incrementeaz coninutul lui p,
adic variabila j. Astfel programul va tipri:i=2 j=6.


Exemplul 6.6

S analizm programul de mai jos:

#include <stdio.h>
main()
{
int a=59;
printf(a are adresa %p si continutul %d\n,&a, a);
int *adr1=&a;
printf(adr1 are adresa %p si continutul %p\n,&adr1,
adr1);
int **adr2=&adr1;
printf(Variabila adr1 are adresa %p si continutul
%p\n,&adr2, adr2);
printf(%p %p %p %d, &adr2, adr2, *adr2, **adr2);
}

Se declar o variabil a, de tip int, care reine numrul 59. Se tipresc
adresa i coninutul variabilei a.

Se declar o variabil adr1, de tip int*, care reine adresa variabilei a. Se
tipresc adresa i coninutul variabilei adr1.


Tablouri
Proiectul pentru nvmntul Rural 113
Se declar o variabil adr2, de tip int**, (capabil s rein adrese de
variabile ce rein adrese de variabile de tip int) care reine adresa
variabilei adr1. Se tipresc adresa i coninutul variabilei adr2.


Figura 6.1

Se poate observa c, utiliznd exclusiv coninutul variabilei adr2, se poate
adresa indirect, cu dou nivele de indirectare, coninutul variabilei a.
Indirectarea s-a fcut dup schema:


a adr1 adr2

n C++ este posibil inializarea pointerilor prin alocarea unei zone de
memorie, folosind operatorul new. Sintaxa pentru folosirea acestui
operator este:
tip_ptr=new tip; fr precizarea valorii iniiale;
tip_ptr=new tip(valoare); cu precizarea valorii
iniiale;
tip_ptr=new tip[dim]; pentru alocarea a dim elemente;

De exemplu, alocarea memoriei pentru un vector cu 10 componente
numere ntregi se face astfel:
int *v=new int[10];
Eliminarea variabilelor dinamice se face cu ajutorul operatorului delete.
Acesta este complementarul operatorului new i are sintaxa:
delete tip;
De exemplu, tergerea memoriei alocate pentru vectorul v cu 10
componente numere ntregi, din exemplul precedent, se face astfel:
delete v;

a

adresa a
adresa
adr1
Tablouri
114 Proiectul pentru nvmntul Rural

Testul de autoevaluare 6.2

Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de
puncte. Punctaj minim: 80

1. Care din urmtoarele declaraii reprezint o declarare corect a unui pointer?
A. int x;
B. int &x;
C. ptr x;
D. int *x;

2. Care din urmtoarele reprezint adresa de memorie a unei variabile ntregi a?
A. *a;
B. a;
C. &a;
D. address(a);


3. Care din urmtoarele determin adresa memoriei unui pointer a?
A. a;
B. *a;
C. &a;
D. address(a);


4. Care din urmtoarele determin valoarea pstrat de un pointer a?
A. a;
B. val(a);
C. *a;
D. &a;


5. Care din urmtorii termeni este cel care indic rezervarea spaiului de memorie necesar
unei variabile?
A. new
B. malloc
C. create
D. value



6.3 iruri de caractere

Cele mai des ntlnite utilizri ale tablourilor unidimensionale n limbajul C
sunt irurile de caractere, din cauz c n C nu exist prevzut tipul de
date ir de caractere. Pentru memorarea irurilor se utilizeaz tablouri cu
tipul de baz char, care au pe ultima poziie, ca marc de sfrit a irului,
caracterul \0.

Tablouri
Proiectul pentru nvmntul Rural 115
Pe lng necesitatea de a defini un ir de caractere ca i tablou de
caractere, n prelucrarea irurilor se utilizeaz deseori tipul pointer la
caracter. De exemplu:


char sir[30]; /* tablou de 30 de caractere */
char *psir; /* pointer la caracter */
Astfel, sir este o variabil de tipul tablou de caractere pentru care se
rezerv un spaiu de memorie de 30 de octei, n timp ce psir este un
pointer la caracter care poate primi ca valoare adresa unui caracter (n
particular, adresa primului element dintr-un ir de caractere). Trebuie
reinut c ori de cte ori se lucreaz cu variabile iruri de caractere ntr-un
program, trebuie s existe fie o definiie de forma celei prezentate pentru
variabila sir, prin care se rezerv static (n timpul compilrii), spaiul de
memorie necesar variabilei, fie s se aloce dinamic memoria necesar.
Neexistnd tipul ir de caractere, n C nu sunt prezeni nici operatorii
pentru iruri. n schimb, biblioteca standard conine numeroase funcii
pentru prelucrarea irurilor de caractere. O parte a funciilor pentru
citirea/scrierea irurilor, declarate n fiierul antet stdio.h, le-am prezentat
n Unitatea de nvare 4. n continuare, trecem n revist funciile pentru
compararea, copierea, concatenarea irurilor, .a.m.d. Acestea sunt
declarate n fiierul string.h. Ele primesc adresele irurilor prelucrate, prin
intermediul parametrilor de tipul pointer la caracter.
int strcmp(char *s1, char *s2);
Efect: compar irurile s1 i s2 i returneaz o valoare negativ, dac
irul s1 este mai mic dect irul s2, 0 dac s1 este egal cu s2, i o valoare
pozitiv dac s1 este mai mare dect s2. Compararea irurilor este fcut
din punct de vedere lexicografic, adic liter cu liter, pn cnd 2
caractere sunt diferite sau se termin unul din ele. De exemplu, irul
Anca este mai mare dect Ana.


Exemplul 6.8

Precizai relaia de ordine dintre dou cuvinte (iruri de caractere care nu
conin caractere albe), cuvinte citite de la tastatur.

#include <string.h>
#include <iostream.h>
void main()
{
char s1[100],s2[100];
int p;
cout<<Introduceti primul sir: ; cin>>s1;
cout<<Introduceti al doilea sir: ; cin>>s2;
p=strcmp(s1,s2);
if (p<0) cout<<s1<s2;
else

Tablouri
116 Proiectul pentru nvmntul Rural
if (p>0) cout<<s1>s2;
else cout<<s1=s2;
}

O alt funcie care compar dou iruri de caractere, dar numai pentru
primele n caractere, este:
int strncmp(char *s1, char *s2, int n);
Efect: identic cu strcmp, dar se compar irurile s1 i s2 pentru cel mult
n caractere.
Urmtoarele dou funcii se folosesc pentru copierea unui ir denumit
surs s ntr-un ir destinaie d:
char *strcpy(char *d, char *s);
Efect: copiaz irul surs s n irul destinae d i returneaz adresa irului
destinaie. Copierea se termin dup ce a fost copiat caracterul \0
char *strncpy(char *d, char *s, int n);
Efect: copiaz maxim n caractere de la sursa s la destinaia d i
returneaz adresa irului destinaie.


Exemplul 6.9

Un exemplu de folosire a celor dou funcii este urmtorul, n care trebuie
remarcat c este necesar punerea pe ultima poziie a caracterului \0 n
cazul funciei ce copiaz primele n caractere:

#include <string.h>
#include <iostream.h>
void main()
{
char s1[100]=sirul copiat,s2[100]=sirul destinatie;
strcpy(s2,s1);
cout<<s2<<endl;
strncpy(s2, s1, 5);
s2[5]=\0;
cout<<s2<<endl;
}

O funcie util n lucrul cu irurile de caractere
int strlen(char *s);
Efect: returneaz lungimea irului fr a numra caracterul terminator
(\0).



Tablouri
Proiectul pentru nvmntul Rural 117
Exemplul 6.10

Urmtorul program citete un ir de caractere afieaz lungimea lui:

#include <string.h>
#include <iostream.h>
void main()
{
char s[100];
cin.get(s,100);
cout<<sirul <<s<< are <<strlen(s)<< caractere<<endl;
}
Urmtoarele dou funcii sunt folosite pentru a concatena (a aduga la
sfritul primuui ir pe al doilea) dou iruri de caractere.
char *strcat(char *d, char *s);
Efect: concateneaz cele dou iruri i returneaz adresa irului rezultat.
char *strncat(char *d, char *s, int n);
Efect: concateneaz cel mult n caractere din irul surs s la irul
destinaie d i returneaz adresa irului rezultat.

Exemplul 6.11

Un exemplu de folosire a funciilor de concatenare este urmtorul:

#include <string.h>
#include <iostream.h>
void main()
{
char s1[100]=Astazi ,s2[100]=invatam;
strcat(s1,s2);
cout<<s1<<endl;
strncpy(s1, s2, 5);
s2[5]=\0;
cout<<s2<<endl;
}

Funcia strchr() are rolul de a cuta caracterul c n irul s i are forma:
char *strchr(const char *s, int c);
Cutarea se face de la stnga la dreapta i, n cazul n care caracterul
este gsit, funcia returneaz un pointer al primei apariii a caracterului c
n irul s, iar n caz contrar, funcia returneaz pointerul nul.




Tablouri
118 Proiectul pentru nvmntul Rural
Exemplul 6.12

Un exemplu de folosire a funciei de cutare a unui caracter ntr-un ir
este urmtorul:

#include <string.h>
#include <iostream.h>
void main()
{
char *p=;
p=strchr(Acesta este un test, );
cout<<p<<endl;
}

n urma execuiei acestui program, se va afia este un test.
Funcia strstr() are rolul de a cuta subirul s2 n irul s1 i are forma:
char *strstr(const char *s1, const char *s2);
Cutarea se face de la stnga la dreapta i, n cazul n care subirul s2
este gsit, funcia returneaz un pointer al primei apariii a acestuia n irul
s1, iar n caz contrar, funcia returneaz pointerul nul.


Exemplul 6.13

Un exemplu de folosire a funciei de cutare a unui subir ntr-un ir este
urmtorul:

#include <string.h>
#include <iostream.h>
void main()
{
char *p=;
p=strchr(Acesta este un exemplu,este);
cout<<p<<endl;}

n urma execuiei acestui program, se va afia este un exemplu.


Exemplul 6.14

Un alt exemplu de folosire a funciei de cutare a unui caracter ntr-un ir
este urmtorul: s se determine poziia primei apariii a unui caracter ntr-
un ir de caractere

#include <string.h>
#include <iostream.h>
void main()
{
char s[50]= Acesta este un test;
p= (Acesta este un test, );
cout<< strchr (s,t)-s<<endl;
}



Tablouri
Proiectul pentru nvmntul Rural 119
Acest program va afia valoarea 4, corespunztoare poziiei primei apariii
a caracterului t n irul s.

Testul de autoevaluare 6.4


Alegei varianta (variantele) corect pentru urmtoarele ntrebri. Fiecare ntrebare
valoreaz 20 de puncte. Punctaj minim: 80


1. Considerm declaraia:
char *c, a[100], b[100];
S se determine care dintre expresiile urmtoare sunt corecte:
A. a=sir de caractere;
B. c=strcat(a,b);
C. (a<=b &&b!=c);
D. c++;
E. a=strchr(exercitii, );
F. c=strcpy(a,b);




2. Fie secvena de instruciuni:
strcpy(a,calculator);
strcpy(b,lat);
p=strstr(a,b);
tiind c a i b sunt variabile de tip ir de caractere, ce reine p?
A. 6
B. 7
C. lat
A. lator




3. Fie declaraiile:
char a[50];unsigned int i;
tiind c irul de caractere a se termin cu caracterul punct, care din secvenele de mai
jos este echivalent cu funcia strlen()?:
a) i=0;
while (a[i++]!=.) {}
cout<<i;
b) i=0;
while (a[i++]==.) {}
cout<<i;
c) i=0;
if (a[i]==.) cout<<i;
d) if (a[i]!=.) cout<<i;

Tablouri
120 Proiectul pentru nvmntul Rural



4. Care din urmtoarele afirmaii sunt adevrate?
A. Tipul char* permite manipularea irurilor de caractere;
B. Lungimea efectiv a unui ir de caractere s se poate obine prin apelul
strlen(s);
C. strcpy() este o funcie ce extrage un anumit subir dintr-un ir dat;
D. Un ir vid este acela care conine doar blankuri.





5. Operaia de alipire a dou iruri de caractere poart numele de , iar funcia care
caut un caracter dat ntr-un ir de caractere se numete ....






Variantele corecte de rspuns se afl la pag. 120.
Tablouri
Proiectul pentru nvmntul Rural 121
Rspunsuri corecte la testele de autoevaluare

Testul de autoevaluare 6.1

Rezolvri i indicaii de rezolvare a problemelor vei gsi n Laboratorul 5


Testul de autoevaluare 6.2
:
Rspunsuri corecte:
1 D Vezi U6. 2 Pointeri pag. 110
2 C Vezi U6. 2 Pointeri pag. 110
3 A Vezi U6. 2 Pointeri pag. 110
4 C Vezi U6. 2 Pointeri pag. 110
5 A Vezi U6. 2 Pointeri pag. 110

Testul de autoevaluare 6.3 i variantele corecte de rspuns corespunztoare se gsesc n
cadrul Laboratorului 5

Testul de autoevaluare 6.4

1 B, D,F; U 6.3 iruri de caractere pag 114
2 A U 6.3 iruri de caractere pag 114
3 a U 6.3 iruri de caractere pag 114
4 A, B U 6.3 iruri de caractere pag 114
5 concatenare, strchr U 6.3 iruri de caractere pag 114




BIBLIOGRAFIE

1. Dorin Stoilescu, Manual de C/C++ - Cap.7 Tablouri i pointeri, 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.20 Tablouri i pointeri, 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
5. Herbert Schildt, C manual complet Cap.4 Tablouri i iruri, Cap.5 Pointeri,
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.
Tablouri
122 Proiectul pentru nvmntul Rural


Lucrarea de verificare Nr. 6, notat de tutore

Rezolv aplicaiile de mai jos.
Barem de notare:

















Punctaj minim: 70 puncte.

1. Ce valori vor fi afiate n urma rulrii urmtorului program?

#include <iostream.h>
void main()
{ int a[11],I;
for(i=1;i<=10;i++)
a[i]=i-1;
cout<<a[2]<< ;
cout<<a[a[2]]<< ;
cout<<a[a[a[3]]]<< ;
cout<<a[a[2]+a[3]]<< ;
}





a) 2 1 1 3
b) 1 0 0 3
c) 1 0 0 2
d) 3 8 4 0


2. Alegei varianta corect a instruciunilor care conduc la deplasarea cu o
poziie spre stnga a tuturor elementelor tabloului a ncepnd cu cel situat pe
poziia p+1, n vederea tergerii elementului de pe poziia p.

a) for (i=p+1;i<=n;i++) a[i]=a[i-1];
b) for (i=p;i<n;i++) a[i]=a[i+1];

c) for (i=n;i>p;i--) a[i-1]=a[i];
d) for (i=n;i>=p;i--) a[i+1]=a[i];





3. Se consider urmtorul program:

Aplicaia 1 10 puncte
Aplicaia 2 15puncte
Aplicaia 3 15 puncte
Aplicaia 4 15 puncte
Aplicaia 5 15 puncte
5 puncte declaraii i citiri corecte
5 puncte aflarea celui mai mare divizor comun a 2
numere
5 puncte afiarea rezultatului
Aplicaia 6 15 puncte
5 puncte declaraii corecte
5 puncte determinarea numrului de vocale dintr-
un cuvnt
5 puncte afiarea rezultatului
Aplicaia 7 15 puncte
5 puncte declaraii corecte
5 puncte eliminarea spaiilor n plus dintre cuvinte
5 puncte afiarea rezultatului
Total 100 puncte
Tablouri
Proiectul pentru nvmntul Rural 123
#include <iostream.h>
#include <string.h>

void main()
{ char s[20],t[20];
cout<<s=;cin.get(s,20);
cin.get();
cout<<t=;cin.get(t,20);
while (s[0]==t[0] && strlen(s)!=0) &&
strlen(t)!=0)
{strcpy(s,s+1);
strcpy(t,t+1);}
if (strlen(s)==0 && strlen(t)==0)
cout<<DA;
else cout<<NU;
}

Determinai ce face acest program:
a) afieaz DA dac irurile s i t au lungimi egale sau NU n caz contrar;
b) afieaz DA dac irurile s i t sunt identice sau NU n caz contrar;
c) afieaz DA dac primul caracter din irul s este egal cu primul caracter din
irul t sau NU n caz contrar;
d) afieaz DA dac irurile s i t au lungimi nenule sau NU n caz contrar;


4. Fie s un ir de caractere. Care din urmtoarele secvene elimin spaiile de
la nceputul irului s:
a) char *p=s;
while (*p== ) p++;
strcpy(s,p);

b) char *p=s;
while (*p!= ) p++;
strcpy(s,p);

c) char *p=s;
while (*p== ) p++;
strcpy(s,p-1);

d) char *p=s;
while (*p!= ) p++;
strcpy(s,p+1);

5. Fie doi vectori a i b formai din n, respectiv m numere ntregi nenule
(m,n<=50). Scriei un program care citete, pe rnd, numrul de elemente i
valorile din vectorul a, respectiv b, i afieaz valorile din vectorul a care
sunt prime cu toate valorile din vectorul b. Dou numere ntregi sunt prime
ntre ele dac cel mai mare divizor comun al lor este 1.
Exemplu: Fie n=6, a=(77, 35, 55, 15, 121) i m=3, b=(18, 20, 10). Se vor afia
numerele 77, 121.


6. S se determine cuvintele ce conin 3 vocale dintr-un ir de caractere s dat.


7. ntr-un ir de caractere s cuvintele sunt separate de unul sau mai multe
spaii. S se elimine spaiile n plus din irul s.
Fiiere n limbajul C++
124 Proiectul pentru nvmntul Rural

Unitatea de nvare nr. 7

FIIERE N LIMBAJUL C++


Cuprins Pagina

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


Obiectivele Unitii de nvare 7

Dup studiul acestei uniti de nvare, vei reui

Identificarea modurilor de declarare, deschidere i nchidere a
fiierelor
Cunoaterea modalitilor de citire / scriere a datelor din / n fiiere
i a operaiilor de test
Utilizarea adecvat n aplicaii a fiierelor


7.1 Declararea fiierelor

Un fiier este o colecie de date de acelai tip, memorate pe suport extern.
Fiierele pot fi clasificate dup coninutul lor n:
- fiiere text: conin o secven de caractere ASCII structurate pe linii:
- fiiere binare: conin o secven de octei, fr o structur predefinit.

Ne vom ocupa n continuare numai de fiierele text.

Operaiile de intrare / ieire n limbajul C++ au folosit pn acum stream-
urile cin i cout, care sunt asociate automat tastaturii, respectiv ecranului.
Pentru ca un program s poat citi informaii dintr+un fiier, respectiv s
scrie informaii intr+un fiier, trebuie s asociem fiierul respectiv unui
stream de intrare ieire.
n fiierul fstream.h sunt declarate clasele ifstream (input file stream),
ofstream (output file stream) i fstream.
Pentru a folosi ntr+un program operaii de intrare-ieire folosind fiiere
trebuie s declarm variabile de tipulrile ifstream, ofstream, fstream.
Fiiere n limbajul C++
Proiectul pentru nvmntul Rural 125


Exemplul 7.1

ifstream f1; // am declarat un stream de intrare numit f1
ofstream f2; // am declarat un stream de ieire numit f2
fstream h; // am declarat un stream de intrare-ieire numit h

Observaii:

1. f1, f2, h sunt variabile de tip fiier ( obiecte de tip clas).

7.2 Deschiderea fiierelor

Pentru a folosi streamul declarat anterior, va trebui s-l deschidem. La
deschidere, se asociaz stream-ului un fiier fizic i, eventual, se
precizeaz modul de deschidere, care determin operaiile permise cu
fiierul respectiv.
Deschiderea se poate realiza n dou moduri:
1) dup declarare, prin apelul funciei - membru open() , preciznd ca
parametri un ir de caractere, care repezint specificatorul fiierului
fizic i, eventual, modul de deschidere.


Exemplul 7.2

ifstream f1; // am declarat un stream de intrare numit f1
f1.open(date.txt); // l-am dechis asociindu-i fiierul fizic date.txt

2) la declarare, specificnd dup numele stream-ului care se declar
numai parametrii corespunztori funciei open, ncadrai ntre
paranteze.


Exemplul 7.3

ifstream f1( date.txt);

Observaie:
Se deduce c fiierul date.txt se afl pe hard-disc n directorul curent.


Exemplul 7.4

ofstream f2; // am declarat un stream de ieire f2
f2.open(c:\\dana\\date.out); /* l-am asociat lui date.out, care se afl
pe discul C:, n directorul dana */

Observaie:





Fiiere n limbajul C++
126 Proiectul pentru nvmntul Rural
Nu am specificat nici un mod de deschidere; deci se deschide implicit ( se
creeaz un fiier vid cu numele date, n care se vor face numai operaii
de scriere.


Exemplul 7.5

fstream f3; // am declarat un stream f3
f3.open (info.in, ios::in); //l-am asociat fiierului info.in

Observaie:

Deoarece tipul fstream nu are asociat un mod de deschidere implicit, f3 a
fost deschis cu modul ios::in, ca fiier de intrare (numai pentru operaii de
citire).


Exemplul 7.6

fstream f4( info.out, ios::out); /*am declarat un stream f4 pe care
l-am asociat fiierului info.out.*/

Observaie:

Modul de deschidere specificat este ios::out, ceea ce nseamn c fiierul
este a fost deschis pentru operaii de scriere.


Exemplul 7.7

fstream f5( info.ad, ios::app); /*am declarat un stream f5 pe care
l-am asociat fiierului info.ad.*/
Observaie:

Modul de deschidere specificat este ios::app (append), ceea ce nseamn
c deschidem fiierul ca fiier de ieire, pentru adugare de informaii la
sfrit.

7.3 Citirea datelor dintr-un fiier

Dup deschiderea fiierului ca fiier de intrare se pot realiza operaii de
citire. n acest scop se poate utiliza operatorul de citire >>, sau pot fi
utilizate funcii-membru specifice.



Fiiere n limbajul C++
Proiectul pentru nvmntul Rural 127

Exemplul 7.8

ifstream f1(aplicatie.in);
char c;
f1>>c; // am citit primul caracter din fiierul f1.

Observaie:

Operatorul >> ignor caracterele albe ( spaiu, tab, enter).


Exemplul 7.9

ifstream f1(aplicatie.in);
char c;
f1.get(c); /* am citit primul caracter din fiierul f1, indiferent
dac este sau nu character alb, folosind funcia get()*/


7.4 Scrierea datelor ntr-un fiier

Dup deschiderea fiierului ca fiier de ieire, se pot realiza operaii de
scrierefolosind operatorul de scriere <<.


Exemplul 7.10

ofstream f2(aplicatie.out);
f2<< aplicatia mea;


7.5 Operaii de test

Detectarea sfritului de fiier

La deschiderea unui fiier se creeaz un pointer de fiier, care indic
poziia curent n stream. Orice operaie de citire determin deplasarea
pointerului de citire n stream-ul de intrare, respectiv orice operaie de
scriere determin deplasarea pointerului de scriere n stream-ul de ieire.
Pentru a testa dac pointerul de fiier a ajuns la sfritul fiierului putem
utiliza funcia membr eof() (end of file sfrit de fiier). Funcia eof()
returneaz o valoare 0 dac nu am ajuns la sfritul fiierului, respectiv o
valoare diferit de 0 dac am ajuns la sfrit.

Observaii:
1. Exist funcia membru care testeaz reuita unei operaii de intrare
ieire: good() returmeaz o valoare diferit de 0 dac operaia
s-a efectuat cu succes i 0 n caz contrar..



Fiiere n limbajul C++
128 Proiectul pentru nvmntul Rural
2. Pentru a afla anticipat ce caracter urmeaz n fiierul de intrare
(fr a-l extrage din stream) putem utiliza funcia membru peek(),
care returneaz urmtorul caracter din stream.


Exemplul 7.11

Voi determina frecvena unui caracter c n fiierul text.in.

ifstream fisier(text.in);
char c, car;
int x=0;
cin>>c; // in c retin caracterul a carui frecventa o determin
while (! fisier.eof())
{fisier.get(car); // citesc un caracter din fisier
if(car==c) x++;} // si daca este egal cu c incrementez x
cout<< frecventa lui<<car<< in fisier este<< x;


Sarcin de lucru 7.1

Scrie secvena de program care numr toate caracterele existente ntr-un fiier.

Barem:






Varianta corect de rspuns se afl la pag. 130.


7.6 nchiderea unui fiier

Dup realizarea tuturor operaiilor cu un fiier, acesta trebuie nchis.
nchiderea acestuia se realizeaz prin apelarea funciei-membru close().


Exemplul 7.12

f1.close();

Observaie:
Operaia de nchidere este obligatorie, mai ales pentru fiiere de ieire.
Dac nu se nchide fiierul de ieire, exist riscul de a pierde informaii.


declaraii corecte 10 puncte
citirea corect din fiier 10 puncte
Numrarea caracterelor din fiier 20 puncte
afiarea corect a rezultatului 10 puncte
total 50 puncte

Fiiere n limbajul C++
Proiectul pentru nvmntul Rural 129
Test de autoevaluare 7.1

Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele dou teste.
Rspunsul pentru fiecare cerin valoreaz 20 de puncte.

1. Se consider urmtorul program:
#include <fstream.h>
#include<string.h>
void main()
fstream fisier;
char c;
fisier.open(test.txt,ios::in);
while (f>>c) cout<<c<< ;
fisier.close();
}
Dac fiierul test.txt are urmtorul coninut: 187 abc 6 7 8 gg 5 90, ce se va afia pe
ecran dup executarea programului?

a) 187 abc 6 7 8 gg 5 90
b) 1 8 7 a b c 6 7 8 g g 5 9 0
c) 187abc678gg590
d) 187 ab c67 8gg 5 90

2. Stabilete care dintre urmtoarele secvente de program adaug la sfritul fiierului
test.txt o linie nou care s conin irul ultima linie.

a)
fstream f;
f.open(test.txt, ios::in);
f<<ultima linie;
f.close();

b)
fstream f;
f.open(test.txt, ios::app);
f<<ultima linie<<endl;
f.close();
c)
fstream f;
f.open(test.txt, ios::app);
f<<endl<<ultima linie;
f.close();

d)
fstream f;
f.open(test.txt, ios::out);
f<<endl<<ultima linie;
f.close();


Exemplul 7.15


n fiierul NUMERE.TXT se afl numere naturale din intervalul [0,5000],
separate prin spaii. Voi creea fiierul PARE.TXT care s conin doar
valorile pare din fiierul NUMERE.TXT, cte o valoare pe linie.

( variant Bacalaureat 2000)

#include<fstream.h> void main()

Fiiere n limbajul C++
130 Proiectul pentru nvmntul Rural
{
int x;
ifstream f("NUMERE.TXT");
ofstream g("PARE.TXT");
while(!f.eof())
{ f>>x;
if((x%2)==0) g<<x<<endl; }
f.close();
g.close();
}






/* se citete cte un numr din stream-
ul f att timp ct nu s-a ajuns la
sfritul fiierului f, apoi se verific
dac num[rul e par i n caz afirmativ
se scrie n stream-ul g */


Figura 7.2




Rspunsuri corecte la tema de reflexie i la testul de
autoevaluare

Tem de reflexie 7.1

Vezi Laboratorul 6, pag.190
Se tastez ENTER dup ultimul cuvnt. Se salveaz modificarea operat i apoi se
ruleaz fiierul surs care va folosi noul test.txt.


Fiiere n limbajul C++
Proiectul pentru nvmntul Rural 131
Test de autoevaluare 7.1

1. b) Vezi U7.2, pag 124, U7.3, pag 125, U7.6, pag. 127
2. c) Vezi U7.2, pag 124, U7.3, pag 125, U7.6, pag. 127


Bibliografie

4. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu,
Editura Polirom, Iai, 2002.
5. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++
pentru liceu, Cap 3 Fiiere , Editura Polirom, Iai, 2005



Lucrarea de verificare Nr. 7, notat de tutore

Rezolv aplicaiile de mai jos.
Barem de notare:



Punctaj minim: 75 puncte.

1. Un fiier text conine numere ntregi dispuse pe mai multe linii. Se cere nlocuirea n
fiier a tututor apariiilor unui numr x cu un alt numr y, unde x i y sunt citite de la
tastatur. Realizeaz un program care permite efectuarea acestei modificri asupra
coninutului fiierului.





Aplicaia 1
25 puncte 5 puncte - declaraii corecte
5 puncte deschideri nchideri corecte de fiiere
10 puncte nlocuirea tuturor apariiilor numrului x cu y
5 puncte - redenumirea fiierului
Aplicaia 2
25 puncte 5 puncte - declaraii corecte
5 puncte deschidere nchidere corect de fiiere
10 puncte determinarea numrului lips
5 puncte afiarea numrului
Aplicaia 3
25 puncte 5 puncte - declaraii corecte
5 puncte deschidere nchidere corect de fiier
10 puncte verificarea proprietii impuse de regul
dat
5 puncte afiarea numrului maxim
Aplicaia 4
25 puncte 5 puncte - declaraii corecte
5 puncte deschidere nchidere corect de fiiere
10 puncte verificarea coninutului fiierelor
5 puncte afiarea rezultatului testrii
Total 100 puncte
Fiiere n limbajul C++
132 Proiectul pentru nvmntul Rural
2. n fiierul lipsa.in exist dispuse pe fiecare linie cte un numr din irul primelor n
(n<100) numere naturale nenule. Excepie face un singur numr care a fost omis. Scrie un
program care determin numrul lips.
Ex: lipsa.in conine 4 1 3 5 si se va afia 2




3. n fiierul numar.in exist pe prima linie un ir cresctor de numere naturale. Citirea din
fiier a unui nou numr este condiionat de obinerea, ca sum de termeni distinci din
fiier, a unui ir de numere consecutive ncepnd cu 1. Determin care este numrul
maxim care se poate obine respectnd regula dat.
Ex: numar.in conine 1, 2, 4, 10, 13, 132, 562, 1200. Se va afia 7, deoarece citirea din
fiier se ncheie odat cu citirea numrului 10. Valoarea 8 nu se poate forma ca sum de
termeni preluai din fiier. Algoritmul verific valorile i valideaz 1, 2, 3(1+2), 4, 5(1+4),
6(2+4), 7(1+2+4).





4. Scrie un program care s testeze dac dou fiiere ale cror nume este cunoscut sunt
identice.





Funcii
Proiectul pentru nvmntul Rural 133
Unitatea de nvare nr. 8

FUNCII



Cuprins Pagina

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, ......................................................... 153
Bibliografie..................................................................................................................... 155
Lucrarea de verificare Nr. 8, notat de tutore ............................................................. 156



Obiectivele Unitii de nvare 8

Dup studiul acestei uniti de nvare, vei reui

s defineti propriile funcii;
s declari corect o fiuncie;
s recunoti tipurile principale de variabile i de parametri;
s apelezi corect o funcie;
s compari i s recunoti funciile recursive i funciile iterative;




8.1 Funcii nerecursive

n limbajul C / C++, subprogramele se numesc funii. Ele reprezint un
element fundamental al limbajului. Aa cum stii, orice program C / C++
este contituit dintr-o succesiune de funcii, dintre care una este fun.
principal, denumit main().
La lansarea n execuie a unui program C / C++ este apelat funcia
main(). Pn acum. n cadrul ei am apelat numai funcii Standard ale
limbajului, precum clrscr(), sqrt(), get(), etc.

n acest capitol vei nva cum s descrii propriile tale funcii, numite n
continuare funcii utilizator.
Funcii
134 Proiectul pentru nvmntul Rural


Atenie!

ntr-un program C / C++ toate prelucrrile sunt organizate sub forma unei
ierarhii de apeluri de funcii, baza ierarhiei fiind funcia principal main().

Pentru a dezvolta i utiliza funcii proprii este necesar s cunoti cum se
definesc, cum se declar i cum se apeleaz funciile.


8.1.1 Definirea unei funcii

n definiia unei funcii ntlnim un antet care conine numele funciei,
tipul rezultatului returnat de funcie i lista parametrilor funciei i un bloc
de instruciuni, care descrie prelucrrile efectuate de funcie.

Forma general a definiiei unei funcii este:

tip nume(lista parametrilor formali) // antetul funciei

{
declaratii variabile locale
instructiuni // blocul
funciei
}

unde:
tip este tipul rezultatului returnat de funcie;
nume este numele funciei;
lista parametrilor formali este alctuit din una sau mai multe declaraii
de parametri cu care funcia opereaz, separate prin virgul. Aceast list
poate fi vid. Parametrii formali se numesc astfel deoarece cu ajutorul lor
voi descrie n mod formal operaiile care se vor efectua cu datele
transmise de programul apelant.


Exemplul 8.1

void suma(int x, int y)
{
cout<<x+y=<<x+y;
}

Observaii:
1. funcia suma are tipul void, adic nu ntoarce un rezultat;
2. parametrii formali sunt de tip intreg.
3. funcia afieaz suma celor dou numere transmite ca parametri de
programul apelant.




Funcii
Proiectul pentru nvmntul Rural 135

Exemplul 8.2

int suma(int x, int y)
{ int i,s;
s=x
for(i=1;i<=y; i++) s++;
return s;
}

Observaii:
1. funcia suma are tipul intreg i calculeaz suma a dou numere intregi,
transmite ca parametri de programul apelant;
2. variabilele i i s sunt declarate n blocul funciei i se numesc variabile
locale;
3. n blocul funciei intervine instruciunea return. Ea returneaz
programului apelant valoarea variabilei s.


8.1.2 Declararea funciilor

Compilatorul C / C++ va fi informat de existena funciei i a formatului
acesteia odat cu declaraia funciei.
Forma general a declaraiei funciei este:

tip nume( lista parametrilor);


Atenie!

Declaraia unei funcii este alctuit din antetul funciei urmat de caracterul
;, nu de blocul de instruciuni al funciei. De aceea, declaraia funciei se
mai numete i prototip.

Este necesar ca naintea oricrui apel de funcie s apar fie definiia
funciei, fie declaraia funciei.


Atenie!

Un program C / C++ poate conine pentru a funcie o singur definiie, dar
oricte declaraii.


Exemplul 8.3

double sqrt(double);


Observaii:
1. funcia sqrt() are tipul double i returneaz radicalul valorii primite ca
parametru;
2. are prototipul n math.h.




Funcii
136 Proiectul pentru nvmntul Rural


Exemplul 8.4

float calcul(int x, int v[10]);

Observaii:
1. funcia calcul() are tipul real, are doi parametri: unul de tip int i un
tablou de 10 valori de tip int;
2. n declaraia funciei calcul() este specificat numele parametrilor, nu
doar tipul acestora.



Test de autoevaluare 8.1


Stabilete valoarea de adevr a urmtoarelor afirmaii prin ncercuirea literelor A sau F,
corespunztoare valorilor de adevarat sau fals. Rspunsul pentru fiecare cerin
valoreaz 20 de puncte. Punctaj minim: 80.


A F 1) ntr-un program toate prelucrrile sunt organizate sub forma unei ierarhii de
apeluri de funcii, baza ierarhiei fiind funcia principal main().

A F 2) Definiia unei funcii se mai numete i prototip.

A F 3) n definiia unei funcii se ntlnesc antetul i blocul de instruciuni al funciei.

A F 4) Lista parametrilor formali este alctuit din una sau mai multe declaraii de
parametri cu care funcia opereaz, separate prin virgul.

A- F 5) Orice apel de funcie este succedat fie de definiia funciei, fie de declaraia
acesteia.


Rspunsurile corecte se gsesc la pag. 153.


8.1.3 Apelul funciilor

Apelul unei funcii se poate face n dou moduri:

- ntr-o instruciune de apel: nume(lista parametrilor actuali);
- ca operand ntr-o expresie: v= nume(lista parametrilor actuali);

unde:
- nume este numele funciei;

Funcii
Proiectul pentru nvmntul Rural 137
- lista parametrilor actuali este format dintr-o succesiune de expresii,
separate prin virgul.
La apelul unei funcii, valorile parametrilor actuali sunt atribuite, n ordine,
parametrilor formali corespunztori.

Atenie!

Parametrii actuali trebuie s corespund cu parametrii formali ca numr,
ordine i tip.



Exemplul 8.5

Fie declaraiile de variabile:

float ma;
int a,b;

Voi putea atribui variabilei ma valoarea mediei aritmetice a numerelor a i
b, apelnd funcia suma() calculat la exemplul 1.2, astfel:

ma= suma(a,b)/2;

Observaii:
1. valoarea parametrului actual a nlocuiete parametrul formal x, iar
valoarea parametrului actual b nlocuiete valoarea parametrului formal
y.

Ce se ntmpl cu parametrii actuali? Unde sunt memorate valorile
lor?

Funciile folosesc o zon de memorie numit stiv (snack) care
funcioneaz pe principiul ultimul intrat este primal ieit (last input, first
output) LIFO.
La apelarea unei funcii, se aloc spaiul de memorie pe stiv pentru
valorile parametrilor actuali. Se realizeaz astfel transferul prin valoare al
parametrilor. La terminarea execuiei funciei, zona de memorie alocat pe
stiv se elibereaz.


Atenie!

Deoarece zona de memorie alocat pentru parametri se elibereaz,
valorile modificate n funcie se pierd.




Funcii
138 Proiectul pentru nvmntul Rural


Exemplul 8.6

Consider funcia care afieaz valorile a doi parametri intregi x i y:

void afisare(int x, inty)
{
cout<<x=<<x;
cout<< y=<<y<<endl;
x++;
y++;
}

Mai consider declaraiile de variabile:

int a=10, b=75;

Voi constata c secvena de instruciuni:

cout<<a=<<a;
cout<< b=<<b<<endl;
afisare(a,b);
cout<<a=<<a;
cout<< b=<<b<<endl;

afieaz pe ecran:

a=10 b=75
x=10 y=75
a=10 b=75

fr a se ine cont de modificrile valorilor parametrilor x i y n cadrul
funciei.

Tem de reflecie 8.1

Scrie o nou analogie (maxim 300 cuvinte) prin care s ilustrezi transferul parametrilor prin
valoare. Se noteaz cu 10 puncte ingeniozitatea ideii, cu 10 puncte coerena n exprimare
i se acord 30 puncte expunerii analogiei. Punctaj minim: 30.







Funcii
Proiectul pentru nvmntul Rural 139
Dac vreau ca la ieirea din funcie s se pstreze valorile modificate ale
parametrilor, nu voi transmite ca parametrii expresii ale cror valori s fie
copiate pe stiv, ci voi transmite adresele variabilelor ale cror valori dorim
s le modificm. Utilizez astfel transmiterea prin adres sau prin referin.


Exemplul 8.7

Voi considera funcia din exemplul trecut care afieaz valorile a doi
parametri intregi x i y i voi schimba modul de transmitere parametri:

Transmiterea parametrilor se face prin adres, folosind operatorul &.

void afisare(int &x, int &y)
{
cout<<x=<<x;
cout<< y=<<y<<endl;
x++;
y++;
}

consider aceleai declaraiile de variabile:

int a=10, b=75;

Dar acum voi constata c secvena de instruciuni:

cout<<a=<<a;
cout<< b=<<b<<endl;
afisare(a,b);
cout<<a=<<a;
cout<< b=<<b<<endl;

afieaz pe ecran:

a=10 b=75
x=10 y=75
a=11 b=76


Test de autoevaluare 8.2

Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul
pentru fiecare cerin valoreaz 20 de puncte. Punctaj minim: 80.

1. Ce se afieaz n urma executrii urmtorului program?

#include<iostream.h>
int a;

Funcii
140 Proiectul pentru nvmntul Rural
void f1(int a)
{a=20; cout<<a;}
void f2(int &a)
{a=30; cout<<a;}
void main()
{int a=10;
f1(a);cout<<a;
f2(a);cout<<a;
}

a) 10 10 20 30
b) 20 10 30 10
c) 20 10 30 30
d) 20 20 30 30

2. Indicai care dintre urmtoarele antete de funcii sunt corecte sintactic:

a) int f1(int y)
b) int f2(int x,y)
c) iostream f3
d) float f4(char c)
e) double f5(int x, float y)

3. Indicai care dintre funciile urmtoare returneaz media aritmetic dintre ctul i restul
la mprirea a dou numere ntregi:
a)
int medie(int x,y)
{ return (x/y+x%y)/2;}

b)
float medie(int x, int y)
{ float med;
med=x/y+x%y;
return med/2;}

c)
float medie(int x, int y)
{ return x/y+x%y;}

4. Fie funcia:

void interschimbare(char a, char & b)
{
char aux;
aux=a; a=b; b=aux;
}

Dac x i z sunt dou variabile de tip char ce memoreaz valorile 1 respectiv 2, ce
valori se vor afia dup executarea secvenei de instruciuni:

interschimbare(x,y);
cout<<x<< <<z;


Funcii
Proiectul pentru nvmntul Rural 141
a) 1 2
b) 2 1
c) 2 2
d) 1 1

5. Cte erori va produce execuia programului urmtor:

#include<iostream.h>
#include< math.h>
int radical(int p, int q)
{ return (sqrt(p*q);}
void main()
{cout<<radical(1,2);}

a) 1
b) 2
c) 3
d) 4
e) nici una


Rspunsurile corecte se gsesc la pag. 153

8.1.4 Variabile locale i variabile globale

Pentru a face diferena ntre cele dou categorii de variabile trebuie s
analizm urmtoarele caracteristici ale lor:
- poziia declaraiei variabilei;
- clasa de memorare ( segmentul de date al programului, pe stiv yona
de memorie n care este alocat variabila);
- durata de via ( timpul n care variabilei i se aloc o zon de memorie).
- domeniul de vizibilitate ( zone ale programului care vd variabile, deci o
pot utiliza.

Variabile locale Variabile globale
Poziie
Sunt declarate n blocul unei
funcii
Sunt declarate n exteriorul
oricrei funcii
Clas de memorare Zon de memorie: pe stiv
Zon de memorie: n segmentul
de date al programului. Memoria
alocat fiind automat iniializat
cu 0.
Durata de via
Memoria rmne alocat
pn la sfritul execuiei
blocului n care a fost
declarat variabila.
Memoria rmne alocat pn la
sfritul execuiei programului.
Domeniul de vizibilitate
Sunt vizibile numai n blocul
n care au fost declarate.
Sunt vizibile din momentul
declarrii pn la sfritul
programului n toate funciile
acestuia, chiar i n alte fiiere
surs, cu excepia cazurilor de
omonimie
1
.

1
Cazurile de omonimie i regula de omonimie nu sunt obiect de studiu n cadrul acestui manual. Omonimia
poate fi studiat din alte cri de specialiate npreun cu operatorul de rezoluie ::.
Funcii
142 Proiectul pentru nvmntul Rural

Exemplul 8.8


int n, x[50]; // x si n sunt variabile globale

void citire (int n, int x[50])
{
int i; // i este locala functiei citire()
for(i=1;i<=n;i++) cin>>x[i];}


Test de autoevaluare 8.3

Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul
pentru fiecare cerin valoreaz 20 de puncte. Punctaj minim: 80.

1. Stabilete care dintre urmtoarele funcii ntorc poziia primei valori strict pozitive din
tabloul unidimensional v, care conine numere ntregi, sau 0 dac nu conine nici un numr
pozitiv.
a)
int p(int v[11], int n)
{ int i,x;
x=0;
for(i=1;i<=n;i++) if (v[i]>0)x=i;
return x;
}

b)
int p(int v[11], int n)
{ int x;
x=0;
while (v[x]<=0) x++;
return x;
}

c)
int p(int v[11], int n)
{ int x;
x=0;
while ((v[x+1]<=0)&&(x<=n-1)) x++;
return x+1;
}

d)
int p(int v[11], int n)
{ int i;
for(i=1;i<=n;i++) if (v[i]>0) return i;
return 0;
}

2. Se consider urmtoarea funcie:

int testare( char &s)
{
int i,j,p;
i=0;
j=strlen(s)-1;p=1;
while
()


{
if(s[i]!=s[j]) p=0;
i++;
j--;
}
return p;
}

Stabilete cu care dintre expresiile de mai jos trebuie nlocuite spaiile punctate astfel nct
funcia s ntoarc 1, dac irul s este palindrom, sau 0 dac irul s nu este palindrom.

Funcii
Proiectul pentru nvmntul Rural 143

a) i<strlen(s)/2 -1
b) (i<=j)&&(p==1)
c) (i!=j)&&(p==1)
d) i<(strlen(s) -1)/2

3.Ce se afieaz n urma executrii urmtorului program?

#include<iostream.h>
int a,b;
void calcul (int &x, int &y)
{int a;
a=x+y;
y+=a;
x+=b;
}
void main()
{a=10; b=100;
calcul(a,b);
cout<<a<< <<b;}





a) 10 110
b) 220 110
c) 110 110
d) 220 210




4. Consider x o variabil ntreag a crei valoare este 2. Ce valoare va avea x dup apelul
f(x,x)?

void f(int x, int &y)
{ y+=x; x+=y;}

a) 2 b)6 c) 8 d)4


5. Care dintre urmtoarele funcii returneaz cel mai mare numr natural p cu proprietatea
c 2
p
<=n.

a)
int f(int n)
{int p=0; a=1;
while(e<=n) { p++;a*=2;}
return p;}

b)
int f(int n)
{int p=0; a=1;
while(e<=n) { p++;a*=2;}
return p-1;}

c)
int f(int n)
{
int p=0; a=1;
while(e<n) { p++;a*=2;}
return p;
}



Rspunsurile corecte se gsesc la pag. 153.


Sarcin de lucru 8.1

Funcii
144 Proiectul pentru nvmntul Rural
Considerm un vector cu n (n<101) componente numere naturale mai mici sau egale cu
30000. Scrie un program care calculeaz i afieaz suma componentelor prime.
Folosete pentru acesta o funcie pentru citirea vectorului i o funcie care verific dac un
numr e prim.
Ex:
Pentru n=5 i numerele 1 4 7 33 5 se afieaz 13.

Barem:










Soluia se gsete la pag. 153.

Sarcin de lucru 8.2

Considerm un vector a=( a[1],a[2], a[3],...a[n]) cu n (n<21) componente numere naturale
cu cel mult 9 cifre. Scrie un program care calculeaz i afieaz suma: 3
a[1]
+3
a[2]
++3
a[n]
.
Vei folosi pentru aceasta:
- o funcie pentru citirea vectorului a;
- o funcie pentru calcularea 3
a[i]
;
- o funcie pentru calculul sumei a dou numere naturale.
Ex:
Pentru n=3 si vectorul: 2 1 3 , se va afisa 39.

Barem:










Soluia se gsete la pag. 153.

Exemplul 8. 11


Consider un vector cu n (n<50) componente ntregi. Voi verifica, printr-un
program, dac acest vector reprezint o mulime.
Ex:
declaraii corecte de variabile 15 puncte
funciei pentru citirea vectorului 25 puncte
funciei pentru verificarea numerelor prime 25 puncte
calcularea sumei 20 puncte
afiarea corect a rezultatului 15 puncte
total 100 puncte
declaraii corecte de variabile 15 puncte
funcie pentru citirea vectorului a 20 puncte
funcie pentru calcularea 3
a[i]
; 25 puncte
funcie pentru calculul sumei a dou numere
naturale
30 puncte
afiarea corect a rezultatului 10 puncte
total 100 puncte

Funcii
Proiectul pentru nvmntul Rural 145
Pentru n=5 si vectorul: 3 2 1 3, se va afisa Nu este multime!

Pentru a verifica dac un vector este mulime trebuie s testez dac exist
elemente care se repet. Pentru a verifica mai uor acest lucru, voi ordona
vectorul prin metoda bulelor.
Voi folosi o funie pentru citirea componentelor vectorului i o alta pentru
testarea propriu-zis.

#include<iostream.h>
int n, x[50];

void citire (int n, int x[50])
{
int i;
for(i=1;i<=n;i++) cin>>x[i];}

void testare(int n, int x[50])
{
int sem,I,aux;
//aplic bubblesort pentru sortarea componentelor vectorului
do
{sem =1;
for (i=1;i<n;i++) if(x[i]<x[i+1])
{ aux=x[i];x[i]=x[i+1];x[i+1]=aux; sem=0;}
} while (!sem);
/* testez dac exist elemente care se repet;
pentru aceasta compar dou cte dou componente ale vectorului*/
sem=1;
for (i=1;i<n;i++) if(x[i]==x[i+1]) sem=0;
if(sem)cout<<Este multime!;
else cout<<Nu este multime!;
}

void main()
{
cout<<n=;cin>>n;
citire(n,x);
testare(n,x);




Sarcin de lucru 8.3

Se dau dou mulimi A i B, ale cror elemente sunt literele mici ale alfabetului englez.
Scrie un program care determin numrul de elemente ale mulimilor AUB i AB, folosind
o funie perntru citirea elementelor unei mulimi i cte o funcie care returneaz cardinalul
unei mulimi pentru fiecare din operaii ( U , ).
Ex: pentru mulimea A={ c, m, p, r, z} i mulimea B={ a, b, c, d, p ,z} se va afia: 8 3.

Funcii
146 Proiectul pentru nvmntul Rural
Barem:










Soluia se gsete la pag. 153.

8.2 Funcii recursive

O funcie este recursiv dac ea se autoapeleaz. Adic dac apelul su
apare cnd subprogramul este activ. Ea se poate apela fie direct, n
blocul propriu de instruciuni, fie indirect prin apelul n cadrul altor funcii.

Voi analiza nti recursivitatea direct.

Orice autoapelul genereaz o nou activare a aceleiai funcii, care
presupune execuia instruciunilor, ncepnd cu prima instruciune a
funciei i pn la autoapel, cnd se activeaz din nou funcia .a.m.d.
Se poate observa c exist posibilitatea ca partea de nceput a funciei s
se execute de o infinitate de ori. Pentru evitarea acestei situaii este
obligatoriu ca autoapelul s fie legat de ndeplinirea unei condiii. Cnd
condiia de autoapel nu se mai ndeplinete , irul activrilor funciei se
ntrerupe i se vor executa secvenele rmase de efectuat din funciile
activate anterior, n ordine invers.

Propun spre studiu un exemplu matematic simplu: produsul a dou
numere naturale. Dac doresc s construiesc o funcie care s se
autoapeleze, trebuie s-i gasesc un mod recursiv de definire a operaiei
de nmulire a dou numere.

b daca a=1
produs(a,b)=a*b=a+a+a++a=(a-1)*b+b=
b+produs(a-1,b),daca a>1
b ori

Cum pot scrie funcia recursiv care implementeaz acest algoritm?

Consider declaraiile de variabile:
int a,b;

long produs(int a, int b)
{
if(a==1) return b;
else return b+produs( a-1,b)
}

declaraii corecte de variabile 5 puncte
funcie pentru citirea vectorului 25 puncte
funcie pentru determinarea cardinalului reuniunii

; 25 puncte
funcie pentru determinarea cardinalul interseciei

; 25 puncte
apelul corect al funciilor 10 puncte
afiarea corect a rezultatului 10 puncte
total 100 puncte
Funcii
Proiectul pentru nvmntul Rural 147
Pentru apelul produs(3,2), s urmrim valorile parametrilor la fiecare
autoapel.


Figura 8.1


Exemplul 8. 12

Voi scrie un program care citete de la tastatur un numr natural n i apeleaz o
funcie recursiv care returneaz valoarea produsului:
p(n)=1*3*5*(2n+1).

Dac n=0, se va afia p(0)=1, adic 2*0+1, iar dac n=3, se va afisa
p(3)=105, adic 1*3*5*7.

#include<iostream.h>
long p(long x)
{ if(x) return;
else return 1;
}
void main()
{ long n;
do{
cout<<n=;cin>>n;}while(n>=0);
cout<<p(n);
}

Funcii
148 Proiectul pentru nvmntul Rural

Observaii:
1. condiia de ieire din funcie este:x=0. Funcia returneaz valoarea 1
dac x=0.
2. definirea recursiv a funciei este dat de formula (2*x+1)*p(x-1), unde
p(x-1) autoapelul.

Atenie!


Activarea unei funcii recursive presupune, la fel ca n cazul uneia
iterative, alocarea pe stiv a variabilelor locale, a parametrilor i a adresei
de revenire.
Datorit acestui lucru, o soluie recursiv este eficient numai dac
adncimea recursivitii un este mare.
Tem de reflecie 8.2

Analizeaz urmtorul algoritm i rspunde cerinelor de mai jos. Fiecare rspuns corect
valoreaz 30 puncte. Punctaj minim: 70. Se acord 10 puncte din oficiu.

#include<iostream.h>
int s(int a,int b)
{ if(!b) return a;
else return s(++a,--b);}
void main()
{int a,b;
cin>>a>>b;
cout<<s(a,b);}
a) Ce realizeaz programul de mai sus?
b) Justificai rspunsul de la punctul a) prin construirea unui tabel al evoluiei
variabileor pe parcursul apelurilor.
c) Scrie forma iterativ a algoritmului propus la punctul a).







Rspunsurile corecte se gsesc la pag. 153.


Exemplul 8. 13

irul lui Fibonaci

i-l aminteti? Este 1 , 1, 2, 3, 5, 8,13, 21, 34, 55, 89, ...


Funcii
Proiectul pentru nvmntul Rural 149
Voi construi o funcie recursiv care calculeaz i returneaz al n-lea
element din acest ir.

mi construiesc recurena:

1, daca n=1 si n=2
fib(n) =
f(n-1)+f(n-2), daca n>2

Funcia recursiv este:

int fib(int n)
{
if (n==1) return 1;
else if(n==2) return 1;
else return fib(n-1)+fib(n-2);
}

Pentru n=6 avem:

fib(6)=fib(5)+fib(4)=
fib(4)+fib(3)+fib(4)=
.
.
.
=1+1+1+1+1+1+1+1=8
Sarcin de lucru 8.4

Scrie un program prin care se citete numrul n natural de la tastatur. Programul trebuie
s apeleze o funcie recursiv, care returneaz valoarea sumei:
S(n)= 2+5+8++( 2+3*n).
Ex: pentru n=3, se va afisa valoarea 26, adica s(3)=2+5+8+11.

Barem:















Soluia se gsete la pag. 153.
definiia recursiv 40 puncte
calculul sumei cerute 15 puncte
corectitudine sintactic a funciei recursive 15 puncte
apelul corect al funciei 15 puncte
afiarea corect a rezultatului 15 puncte
total 100 puncte
Funcii
150 Proiectul pentru nvmntul Rural


Exemplul 8. 14

Consider funcia recursiv urmtoare:

Int f(int a, int b)
{
if( a>=b) return f(a-b,b)+1;
else return 0;
}

mi propun s scriu o funcie iterativ echivalent cu cea recursiv.
Cum procedez?
Pas 1. Pun n eviden calculul matematic recursiv al funciei date.

0 daca ab
f(a,b)=
1+f(a-b,b) daca ab

Pas 2. pentru a=4 si b=2, avem f(4,2)=1+f(2,2)=1+1+f(0,2)= 1+1+0=2
Pas 3. Observ c algoritmul calculeaz ctul mpririi lui a la b.
Pas 4. Scriu funcia iterativ:

int ff(int a, int b)
{
return a/b;
}

Consider funcia iterativ urmtoare:

int fi(int &x)
{
int t=1;
while (x>0) { x/=2; t++;}
return t;
}
mi propun s scriu o funcie recursiv echivalent cu cea iterativ.
S vedem cum procedez.

Pas 1. pentru x=5, avem:

t x
1 5
2 2
3 1
4 0

Pas 2. Deduc de aici care este condiia de stopare: x=0. Observ c
valoarea returnat este 4.

Funcii
Proiectul pentru nvmntul Rural 151
Pas 3. Scriu funcia recursiv care contorizeaz mpririle ntregi ale lui x
transmis prin adres - la 2.
int f (int &x)
{
if(x)
{ x/=2;
return f(x)+1;
}
else return 1;}

Exemplul 8. 15

Recursivitatea indirect este ilustrat prin urmtorul exemplu (irurile lui Gauss):
a
n-1
+b
n-1

Fie a
n
= b
n
= a
n-1
b
n-1
, unde a
0
=a; b
0
=b
2

Figura 8.2
Pentru a, b i n numere naturale date, vreau s calculez termenul n al
irului a i termenul n al irului b.

#include<iostream.h>
// variabile globale
double a,b;
int n;
// declaratia functiei bb
double bb(int n);
// definirea functiei aa; calculeaz termenul n al irului a
double aa(int n)

Funcii
152 Proiectul pentru nvmntul Rural
{if(!n) return a;
else return (aa(n-1)+bb(n-1))/2;
}



Figura 8.3
// definirea functiei bb; calculeaz termenul n al irului b
double bb(int n)
{
if(!n) return b;
else return sqrt(aa(n-1)*bb(n-1));
}
void main()
{
cout<<a<<b<<n;
cout<< aa(n);
}

Observaii:
1. declaraia funciei bb() trebuie s precead apelul su;
2. funcia principal main() apeleaz numai funcia aa(), cu care se
pornete la efectuarea calculului termenilor irului.



Funcii
Proiectul pentru nvmntul Rural 153


Atenie!


Avantaje i dezavantaje ale recursivitii:

- avantajul recursivitii este acela c reduce drastic lungimea textului
surs al programului. De aceea soluiile recursive sunt mai clare dect
cele iterative.
- recursivitatea este o soluie avantajoas n cazul problemelor complexe,
n acelea n care datele sunt definite recursiv, sau n probleme ale cror
soluii pot fi definite n termeni recursivi.
- utilizarea tehnicilor recursive nu conduce ntotdeauna la soluii optime.
Trebuie aleas varianta (interativ - recursiv) avantajoas pentru cazul
analizat.
- folosirea recursivitii, mai ales a celei indirecte, poate genera dificulti
deosebite n depanarea programelor.


Rspunsuri corecte la testele de autoevaluare

Test de autoevaluare 8.1
Vezi U8.1.1, pag. 133, U8.1.2, pag. 134
1. c)
2. a), c), d), e)
3. b)
4. d)
5. e)

Test de autoevaluare 8.2
Vezi U8.1.3, pag. 135
1. d)
2. b), d)
3. d)
4. a)
5. b)

Sarcin de lucru 8.1
Vezi U8.1.3 pag135 i U8.1.4 pag. 140
Soluie:
#include <iostream.h>
#include <conio.h>
#include <math.h>

int n;

void citire (int n, int a[100])
{int i;
for(i=1;i<=n;i++) cin>>a[i];}

int prim(int nr)
{int i,p;
p=1;
if((nr==0)||(nr==1)) p=0;
else for(i=2;i<=sqrt(nr);i++)
if(nr%i==0) p=0;
return p;}

void main()
{ int a[100],n;
long sum;
cin>>n;
citire(n,a);
sum=0;
for(int i=1;i<=n;i++)
if(prim(a[i]))sum+=a[i];
cout<<"suma este "<<sum;
}



Funcii
154 Proiectul pentru nvmntul Rural

Sarcin de lucru 8.2
Vezi U8.1.3 pag135 i U8.1.4 pag. 140
Indicaie:

Pentru calculul 3
a[i]
poi folosi o funcie care determin cifrele acestei puteri ntr-un vector.
Calculul sumei a dou numere naturale se va face pentru numerele date prin doi vectori,
rezultatul fiind tot un vector.
De menionat este faptul c, cifrele numerelor sunt reinute n vectori ncepnd cu cifra
unitilor ctre prima cifr.

Sarcin de lucru 8.3
Vezi U8.1.3 pag135 i U8.1.4 pag. 140
Soluie:
#include<iostream.h>
#include<conio.h>
int n;
char a[30],b[30];
void citire (int n, char v[30])
{
int i;
for(i=1;i<=n;i++) cin>>v[i];}
int reuniune(int na, char a[30], int nb, char
b[30])
{int i,sem, j,nc=na;
for(i=1;i<=nb;i++)
{ sem=0;
for(j=1;j<=na;j++) if(a[j]==b[i]) sem=1;
if(sem==0) nc++;}
return nc;
}
int intersectie (int na, char a[30], int nb,
char b[30])
{int i,j,nc=0;
for(i=1;i<=na;i++)
for(j=1;j<=nb;j++)
if(a[i]==b[j]){nc++;break;}
return nc;
}

void main()
{ int na, nb, nc;
cout<<" cardinalul multimii A";cin>>na;
citire(na,a);
cout<<" cardinalul multimii B";cin>>nb;
citire(nb,b);
cout<<"cardinal
reuniune:"<<reuniune(na,a,nb,b);
cout<<"cardinal
intersectie:"<<intersectie(na,a,nb,b);
}

Sarcin de lucru 8.4
Vezi U 8.2 pag145

Soluie:

Construiesc recurena:

2 daca n=0
S(n)=
3*n+2+S(n-1) daca n>0

#include<iostream.h>
long s(int x)
{
if(x) return 3*x+2+s(x-1);
else return 2;
}

void main()
{
long n;
cout<<n=;cin>>n;
cout<<s(n);
}
Funcii
Proiectul pentru nvmntul Rural 155

Tem de reflecie 8.2
Vezi U 8.2 pag145
a)programul calculeaz a+b
c)
varianta 1:
cout<<a=;cin>>a;
cout<<b=;cin>>b;
varianta 2 (corespunde cerinei recursive):
int s(int a, int b)
{ int suma=a, i;
for(i=1;i<=b;i++) suma++;
return suma;}


Bibliografie

1. Herbert Schildt, C manual complet, Cap - Funcii C, Editura Teora, 2000
2. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele
C si C++.
3. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum
si pentru alte limbaje.
4. http://www.snippets.org exemple de programe scrise in limbajul C.
Funcii
156 Proiectul pentru nvmntul Rural

Lucrarea de verificare Nr. 8, notat de tutore


Rezolv aplicaiile de mai jos.
Barem de notare:



























Punctaj minim: 80 puncte.

1. Se consider programul:
#include<iostream.h>
int a,b,c;
void expresie(int a, int b)
{a+=c;
b+=c;
c=a+b;}
void main()
{ a=1; b=2; c=3;
expresie(a,b);
cout<<a<<b<<c;}

Dup executarea programului, ce se va afia?
a) 129 b) 219 c) 126 d) 216

2. ncercuiete A sau F n funcie de corectitudinea declaraiilor urmtoare:
Aplicaia 1 5 puncte
Aplicaia 2 5 puncte
Aplicaia 3 5 puncte
Aplicaia 4 5 puncte
Aplicaia 5 25 puncte 5 puncte declaraii corecte
5 puncte funcia care determin numrul de
numere din fiierul de intreare
5 puncte determinarea numrul de numere din
fiierul numere.in care au exact 3 cifre
5 puncte - determinarea celui mai mare numr din
fiierul numere.in
5 puncte - scrierea rezultatelor in fiierul de ieire
Aplicaia 6 25 puncte
5 puncte declaraii corecte
10 puncte afieaz cifrele distincte din n
10 puncte afieaz cte numere se pot forma cu
toate cifrele distincte din n
Aplicaia 7 20 puncte
5 puncte a)
10 puncte b)
5 puncte c)
Aplicaia 8 10 puncte
5 puncte corectitudinea antetultui, a listei de
parametri
5 puncte scrierea corect a blocului funciei
Total 100 puncte
Funcii
Proiectul pentru nvmntul Rural 157

A / F a) int maxim (int a,b,x,k);
A / F b) float calcul(int x, int a[5], int b[5][5]);
A / F c) int testare( int x, int x[10]);
A / F d) produs( int n);

3. Ce va afia urmtorul program?
#include<iostream.h>
int expresie1(long n, int c)
{ if(n<10) return(c==0);
else if (n%10==c) return 1;
else return expresie1(n/10,c);
}

int expresie2(long n)
{
int i,m;
m=0;
for (i=1;i<=10;i++) if(expresie1(n,i)) m++;
}
void main()
{cout<<expresie2(12129002);}

a) 8 b)3 c)4 d)10

4. Consider funcia:
int expresie(long k)
{ if (k==0) return 1;
else if( k%10!=0) return expresie(k/10)*(k%10);
else expresie(k/10);
}
Care va fi valoarea expresiei: expresie(192)+expresie(2005) ?

a) 28 b)18 c)8 d)2

5. n fiierul numere.in se afl numere cu cel mult 10 cifre fiecare. Pe aceeai linie
numerele sunt separate prin cte un spaiu. Scrie un program care creaz un fiier
numere.out cu urmtorul coninut:
- pe prima linie numrul de numere din fiierul numere.in;
- pe a doua linie numrul de numere din fiierul numere.in care au exact 3 cifre;
- pe a treia linie cel mai mare numr din fiierul numere.in.
Ex:
Fiierul numere.in conine:
12 34 567
1223456 89 789 90 89
13
56 7890
Fiierul numere.out conine:
11
2
1223456

Funcii
158 Proiectul pentru nvmntul Rural

6. Considderm un numr cu cel mult 10 cifre. Scrie un progam care:
- afieaz cifrele distincte din n. Vei folosi pentru aceasta o funcie care va construi un
vector cu cifrele distincte din n.
- afieaz cte numere se pot forma cu toate cifrele distincte din n.
Ex:
Pentru n=20055, se va afisa:
2 0 5
4


7. Considerm programul:

#include<iostream.h>
int x[11], y[11], dx,dy;
void cit(int n, int x[11])
{
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i];}

int suma(int n, int x[11])
{ int i,s;
s=0;
for(i=1;i<=n;i++)
s+=x[i];
return s;
}

void main()
{
cit(dx,x);cit(dy,y);
cout<<suma(dx,x)<<endl<<suma(dy,y);
}
a) Ce se va afia pe ecran dup executare dac dx=3, x=(1,2,3), dy=5, y=(1,2,3,4,5)?
i) 0 0 ii) 6 6 iii) 15 15 iv)6 15
b) Transform funcia iterativ suma() ntr-o funcie recursiv.
c) Cum se modific programul astfel nct s se afieze valorile 6 15.


8. Scrie o funcie recursiv care determin elementul maxim dintre componentele unui
vector. Funcia va avea ca parametri vectorul i lungimea sa.



Anexe Laboratorul 1
Proiectul pentru nvmntul Rural 159
ANEXE

Laboratorul 1


n cadrul acestui laborator v vei familiariza cu calculatorul i cu mediul
de lucru al limbajului C/C++; de asemenea, va trebui s efectuai un
instructaj pentru protecia muncii n cadrul laboratorului.

n continuare v este prezentat un exemplu de aplicaie din cadrul
Capitolului 2, rezolvat prin reprezentarea algoritmului prin schem logic;
reprezentarea prin pseodocod v revine vou.

Avei posibilitatea s v verificai temele de autoevaluare 2, 3 i 4 din
Capitolul 2

Exemplul 2.5

S se realizeze schema logic pentru evaluarea expresiei:
E=

>
=
<
0 ,
0 ,
0 ,
2
1
2
2
c B
c B A
c B A
A

Schema logic a acestei probleme se afl pe pagina urmtoare.





Anexe Laboratorul 1
160 Proiectul pentru nvmntul Rural









DA NU




NU DA





NU









NU DA


















START
CITESTE A,B,C
C<0
C=0
E= B A
2

AFISEAZA
E
A
2
-B>=0
Afiseaza
Expesia nu
are sens
A=0
Afiseaza
Expesia nu
are sens
E=
B
A

2
1

AFISEAZA
E
E=A
2
-B
AFISEAZA
E
STOP


Testul de autoevaluare 2.2

1. Un melc se deplaseaz cu viteza v km/sptmn. De ct timp (n ore) are nevoie melcul pentru
a strbate distana d dat n metri.

1km=1 000m;
1 sptmn = 7 zile = 7
.
24 ore = 168 ore;
v km/sptmn = 1 000 / 168 m / or;
Anexe Laboratorul 1
Proiectul pentru nvmntul Rural 161
d=v T deci T=d / v.

Pornind de la aceste relaii, algoritmul va fi:

real v, d, T
citeste v,d
T=d / (v * 1 000/168)
scrie T

2. Perimetrul unui ptrat este egal cu latura altui ptrat. tiind c suma perimetrelor este x, s se
calculeze ariile celor dou ptrate.

Perimetrul P
1
=4 L
1

P
1
=L
2
i P
2
=4 L
2
4 L
1
= L
2
P
1
+ P
2
= x 4 L
1
+ 4 L
2
= x 5 L
2
=x L
2
=x/5 i L
1
= L
2
/4. adic L
1
=x/20
Deci A
1
= L
1
2
= (x/20)
2
i A
2
= L
2
2
= (x/5)
2

n acest caz, algoritmul poate fi scris astfel:

real x, L1, L2, A1, A2
citete x
L2=x/5
L1=L2/4
A1=L1*L1
A2=L2*L2
scrie A1, A2
sau aa:

real x, A1, A2
citete x
A1=(x/20)*(x/20)
A2=(x/5)*(x/5)
scrie A1, A2
Anexe Laboratorul 1
162 Proiectul pentru nvmntul Rural

Observaie: Modul de rezolvare al unei probleme nu este unic.

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).

Indicaie: se folosete o singur variabil auxiliar, aux, pentru a putea face interschimbrile
necesare

ntregi a, b, c, aux
citete a, b, c
aux=a
a=b
b=c
c=aux
scrie a, b, c
stop

Se procedeaz asemntor i n cazul celorlalte dou situaii

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

Problema este asemntoare cu cea anterioar; iat o secven din rezolvarea celui de-al doilea
subpunct:

..........
aux=a Se poate observa modificarea ordinii de permutri ale
a=d variabilelor
d=c
c=b
b=aux

Testul de autoevaluare 2.3

1. Se d sistemul de 2 ecuaii cu 2 necunoscute x i y, iar a, b, c, d, p i q sunt parametri reali
(coeficienii necunoscutelor i termenii liberi):

= +
= +
q dy cx
p by ax

S se scrie algoritmul de rezolvare a sistemului de ecuaii.

Problema trebuie analizat i rezolvat din punct de vedere matematic:

0

=
bc ad daca
bc ad
cp aq
y
bc ad
bq pd
x

a b c
aux
b c a

Anexe Laboratorul 1
Proiectul pentru nvmntul Rural 163
n cazul n care numitorul fraciilor este egal cu zero, cele dou ecuaii reprezentate grafic vor fi
dou drepte paralele sau confundate; primul caz are loc dac pd-bq0 i n aceast situaie
sistemul nu are nici o soluie este incompatibil iar n caz contrar are o infinitate de soluii este
nedeterminat iar soluiile vor fi mulimea punctelor situate pe cele dou drepte confundate.


Algoritmul reprezentat n pseudocod este:
real a, b, c, d, p, q, x, y
citete a, b, c, d, p, q
dac a*d-b*c 0 atunci
x=(p*d-b*q)/(a*d-b*c)
y=(a*q-c*p)/(a*d-b*c)
scrie x, y
altfel
dac p*d-b*q=0 atunci
scrie o infinitate de soluii
altfel
scrie sistemul nu are soluii
stop


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.

Trebuie inut cont de faptul c 1min=60 secunde, 1h=60 min i o zi are 24 de ore. Astfel, dac
suma secundelor depete valoarea 60, atunci nseamn c 60 secunde vor da 1 minut. La fel se
ntmpl i n cazul minutelor, dac suma lor este mai mare dec 60, va fi o or n plus. De fiecare
dat va trebui s scdem cele 60 de uniti care au fost transformate ntr-o unitate de rang
superior.

Reprezentarea m pseudocod a acestei secvene de algoritm poate fi:

dac s1+s2>=60 atunci
s=s1+s2-60
m1=m1+1
altfel
s=s1+s2
dac m1+m2>=60 atunci
m=m1+m2-60
h1=h1+1
altfel
m=m1+m2
dac h1+h2>=24 atunci
h=h1+h2-24
altfel
h=h1+h2

3. Dndu-se trei valori ntregi a, b i c, s se afieze valorile lor n ordine cresctoare.

Trebuie s permutm valorile celor 3 variabile, astfel nct, la final, ele s fie ordonate cresctor.
Valorile variabilelor se compar dou cte dou i, dac nu respect ordinea dorit, i
interschimb valorile prin intermediul unei variabile auxiliare aux.

dac a>b atunci
aux=a
a=b
Anexe Laboratorul 1
164 Proiectul pentru nvmntul Rural
b=aux
dac b>c atunci
aux=b
b=c
c=aux
dac a>b atunci
aux=a
a=b
b=aux


4. S se determine valoarea urmtoarei expresii, unde a, b i x sunt numere reale date:
( )

=
< +
> +
=
0 5
0 7 2
0 3 2
2
3
b a daca x
b a daca x x
b a daca x
x E

Indicaie: Dup citirea valorilor pentru a, b i x trebuie evaluat valoarea produaului a*b,
comparat cu zero i calculat valoarea lui E n funcie de semnul acestui produs;sunt suficiente
dou structuri alternative

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).
Indicaie: Dac a este diferit de zero i este pozitiv, atunci ecuaia admite dou soluii reale i se
poate trece la analiza semnelor rdcinilor ecuaiei. Pentru aceasta se determin semnul
produsului (P=c/a); dac acesta este pozitiv, soluiile vor avea caelai semn, ce va fi determinat de
semnul sumei lor (S=-b/a)

Testul de autoevaluare 2.4

1. S se scrie algoritmul pentru calcularea sumei primelor n numere naturale impare, unde n este
un numr natural strict pozitiv, dat.

Trebuie calculat suma: ( ) ( ) N n k n S
n
k

=
= + + + + =
1
1 2 1 2 5 3 1
Problema seamn foarte mult cu cea referitoare la calcularea sumei primelor n numere naturale,
cu deosebirea c pasul de incrementare al variabilei de tip contor este 2 (Ex. 2.8)

intregi n, k, s
citete n
k=1
s=0
repet
s=s+i
k=k+2
pn_cnd k>2n-1
scrie s
stop


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.

Pentru rezolvarea problemei trebuie folosit o structur repetitiv cu test iniial, verificndu-se de
fiecare dat dac numrul citit a fost zero. Pentru a calcula media aritmetic a unui ir de numere,
Anexe Laboratorul 1
Proiectul pentru nvmntul Rural 165
trebuie calculat mai nti suma acestora i, n acelai timp, numrndu-se cte valori au fost
introduse n sum. Media lor aritmetic va fi egal cu suma acestora mprit la numrul de valori
introduse n sum. Atenie! Dac aceast valoare este zero, nu avem voie s facem
mprirea!

Pentru calcularea sumei, respectiv produsuului, se va proceda ca n exemplele prezentate. Pentru
testarea paritii unui numr este folosit simbolul %, ce reprezint operatorul pentru determinarea
restului la mprirea a dou numere ntregi.

real medie
ntreg x, n, S, P
citete x
n=0
S=0
P=1
cat_timp x 0 execut
daca x%2=0 atunci x este par
S=S+x
n=n+1
altfel
P =P * x
citete x

dac n 0 atunci
medie=S/n
scrie medie
altfel
scrie Nu au fost introduse numere pare

dac P 1 atunci
scrie P
altfel scrie Nu au fost introduse numere impare sau 1
stop


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 doilea, al patrulea, etc) i produsul numerelor de pe
poziiile impare (produsul dintre primul, al treilea, al cincilea, etc).

Diferena fa de problema anterioar const n selectarea elementelor care se introduc n sum,
respectiv produs. De data aceasta, trebuie verificat paritatea sau imparitatea poziiilor n irul
numerelor introduse

ntreg x, n, S, P
citete x
n=0
S=0
P=1
cat_timp x 0 execut
n=n+1
daca n%2=0 atunci poziie par
S=S+x
altfel
P =P * x
citete x

dac n 0 atunci
scrie S, P
Anexe Laboratorul 1
166 Proiectul pentru nvmntul Rural
altfel
scrie Nu au fost introduse numere diferite de zero
stop


4. S se determine valoarea urmtoarelor expresii, unde n este un numr natural dat:
( )
( )( ) 1 2 1 2
2
5 3
4
3 1
2
1
1
3 2
1
2 1
1
2
1
+
+ +

=
+
+ +

=
n n
n
E
n n
E



Trebuie analizat cu atenie fiecare expresie i determinat forma general a unui termen al
sumei, asemntor ca la prima problem. n cadrul primei expresii, termenul general este dat de:
( )
{ } n k
k k
, 1
1
1

+
,
iar pentru cea de-a doua expresie este:
( )( )
{ } n k
k k
k
, 1
1 2 1 2
2

+


Cele dou expresii se pot scrie condesat astfel:
( ) 1
1
1
1
+
=

=
k k
E
n
k
i
( )( ) 1 2 1 2
2
1
2
+
=

=
k k
k
E
n
k


Calcularea celor dou sume se face ca n cazul primei probleme:

real E1, E2
intreg n,i
citete n
E1=0 sau E2=0
pentru i=1, n execut
E1=E1+1/(i*(i+1)) sau E2=E2+2*i/((2*i-1)*(2*i+1))
scrie E1 sau scie E2
stop


5. Dndu-se a, b i c, coeficienii unei ecuaii de gradul doi, s se calculeze:
n n
n
x x S
2 1
+ = , unde n
N
*
este dat, fr a se rezolva ecuaia (innd cont de valorile lui P i S).

Pornind de la ecuaia de gradul doi: 0
2
= + + c bx ax , avnd soluiile x
1
i x
2
se obin urmtoarele
relaii:
0
0
0
2 1
2
21
1
21 2
2
1
1
1 1
= + +

= + +
= + +



n n n
n n n
n n n
cS bS aS
cx bx ax
cx bx ax


Pentru determinarea lui
n
S este necesar cunoaterea valorilor sumelor de ordin n-1 , respectiv n-
2. Asta nseamn c la nceput trebuie cunoscute valorile lui a b S /
1
= i a c S S / * 2
2
1 2
= , din
care se poate calcula valoarea lui S
3
, din sumele S
2
i S
3
se poate calcula S
4
, i aa mai departe.

n implementarea acestui algoritm sunt necesare trei variabile pentru sume, i anume S1, S2 i S;
la un moment dat, din valorile lui S1 i S2, folosind relaia matematic de recuren pentru calculul
lui Sn, se obine o nou valoare pentru S, se incrementeaz contorul ce ine evidena numrului de
ordine al sumei calculate i se determin noile valori pentru S1 i S2: S1 preia valoarea lui S2, S2
pe a lui S, i se poate trece la un nou pas n determinarea sumei cerute
Anexe Laboratorul 1
Proiectul pentru nvmntul Rural 167

real S1, S2, a, b, c
intreg n,i
citete a, b, c
citete n
S1=-b/a
S2 = S1*S1-*c/a
pentru i=3, n execut
S= -c/a*S1 b/a*S2
S1= S2
S2= S
scrie S
stop
Anexe Laboratorul 2
168 Proiectul pentru nvmntul Rural
Laboratorul 2

3.6.4 Operatori logici pe bii

Posibilitatea utilizrii operatorilor pe bii ofer limbajului C faciliti
asemntoare cu cele ale limbajelor de asamblare.

Operatorii de prelucrare la nivel de bit sunt:
& I
| SAU
^ SAU exclusiv
~ NEGARE
>> Deplasare dreapta
<< Deplasare stnga

Cu excepia operatorului ~ care este un operator unar, ceilali operatori
sunt binari. Operanzii pot avea numai tipuri ntregi.

Operatorul & I pe bii are sintaxa:
expr1 & expr2
n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoarea 1 vor determina aceeai valoare 1 pe bitul
de pe aceeai poziie din rezultat; Pentru celelalte cazuri, biii rezultatului
vor lua valoarea 0.


Exemplul 3.20

Cel de-al optulea bit este n general bitul de paritate. Pentru ca acestuia
s i se dea valoarea zero, se face I logic pe bii ntre acest octet i unul
n care biii de la 1 la 7 sunt egali cu 1, iar al optulea este zero, adic
numrul 127. Expresia ch & 127 semnific aplicarea unui I biilor din ch
cu biii care alctuiesc numrul 127. Rezultatul este acela c al optulea bit
din ch este stabilit la zero. Presupunem c ch a primit ca valoare
caracterul A i avea stabilit bitul de paritate:

Bit de paritate


1 1 0 0 0 0 0 1 ch conine A cu paritatea stabilit
0 1 1 1 1 1 1 1 127
&
0 1 0 0 0 0 0 1 A fr paritate

Operatorul | SAU pe bii are sintaxa:
expr1 | expr2
n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoarea 0 vor determina aceeai valoare 0 pe bitul
de pe aceeai poziie din rezultat; Pentru celelalte cazuri, biii rezultatului
vor lua valoarea 1.



Anexe Laboratorul 3
Proiectul pentru nvmntul Rural 169
Exemplul 3.21

Operatorul SAU logic pe bii poate fi folosit pentru a stabili valoarea unui
bit. Orice bit cu valoarea 1 dintr-unul din operanzi determin ca bitul
corespunztor din rezultat s fie setat la 1. De exemplu, iat operaia
128 | 3:
1 0 0 0 0 0 0 0 128 n binar
0 0 0 0 0 0 1 1 3 n binar
|
1 0 0 0 0 0 1 1 rezultatul lui SAU pe bii
Operatorul ^ SAU EXCLUSIV pe bii are sintaxa:
expr1 ^ expr2

n urma folosirii acestui operator, biii pe poziii egale din cele dou
expresii care au valoari diferite vor determina valoarea 1 pe bitul de pe
aceeai poziie din rezultat; Dac biii sunt egali, biii rezultatului vor lua
valoarea 0.


Exemplul 3.22

Operatorul SAU exclusiv, ntlnit i sub denumirea de XOR, acioneaz
asupra unui bit dac i numai dac biii respectivi sunt diferii. De exemplu,
127^120 este:
0 1 1 1 1 1 1 1 127 n binar
0 1 1 1 1 0 0 0 120 n binar
^
0 0 0 0 0 1 1 1 rezultatul lui XOR pe bii

Operatorul ~ NEGAIE pe bii are sintaxa:
~a
i face ca pe toate poziiile folosite la stocarea valorii expresiei a s aib
loc complementarea biilor fa de 1.


Exemplul 3.23

Fie numrul 120; s aplicm operatorul de negare pe bii pentru acest
numr:
0 1 1 1 1 0 0 0 120 n binar
~
1 0 0 0 0 1 1 1 rezultatul negrii pe bii 135

Se poate observa c suma dintre un numr i negatul su pe bii este
ntotdeauna 255=2
8
-1=11111111
2
.


Operatorii <<, respectiv >>, sunt numii operatori de deplasare la stnga,
respectiv la dreapta. Ei au sintaxa:
a<<n
a>>n
i sunt echivaleni nmulirii, respectiv mpririi ntregi cu 2
n
.



Anexe Laboratorul 2
170 Proiectul pentru nvmntul Rural

Fie biii b1 i b2. Conform celor spuse mai sus, rezultatele principalelor
operaii pe bii sunt:

Tabel
ul 3.4

Exemplul
3.24

nmulirea i mprirea folosind operatorii de deplasare

unsigned char x valoarea binar a lui x valoarea rezultat pentru x
x=7; 0 0 0 0 0 1 1 1 7
x=x<<1; 0 0 0 0 1 1 1 0 14
x=x<<3; 0 1 1 1 0 0 0 0 112
x=x<<2; 1 1 0 0 0 0 0 0 192
x=x>>1; 0 1 1 0 0 0 0 0 96
x=x>>2; 0 0 0 1 1 0 0 0 24
Tabelul 3.5

Fiecare deplasare la stnga determin o nmulire cu 2. Remarcai c s-a
pierdut informaia dup x<<2, deoarece un bit a depit marginea din
partea stng.

Fiecare deplasare la dreapta determin o mprire ntreag cu 2.
Remarcai c mpririle ulterioare nu readuc biii pierdui.


b1 b2 b1&b2 b1^b2 b1|b2 ~b1
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 0 1 0
Anexe Laboratorul 3
Proiectul pentru nvmntul Rural 171
Laboratorul 3


4. 4 Funcii de citire/scriere caractere

Funcia getchar() are forma general
int getchar(void);
i are rolul de a citi din stdin un caracter, citirea terminndu-se la
apsarea tastei enter.

Cuvntul cheie void are semnificaia c lista parametrilor de apel este
vid.

Pentru scrierea unui caracter se folosete funcia putchar(). Sintaxa
acestei funcii este:
int putchar(int);
Dei sunt tratate caractere, se poate observa c parametrul de intrare al
acestei funcii este de tip int, avnd loc o conversie implicit a caracterului
n ntreg (valoarea codului ASCII al caracterului respectiv).


Exemplul 4.8

Se citete un caracter de la tastatur, care apoi se va tipri

char a;
a=getchar();
putchar(a);

Aceast secven este echivalent cu urmtoarea:

putchar(getchar());

Trecerea cursorului pe un rnd nou se poate face i astfel:
putchar(\n);
de fapt se afieaz secvena escape \ncorespunztoare pentru new line.

O alt funcie de intrare este getche() (get character with echo) care
permite preluarea caracterelor imediat ce au fost tastate, fr a mai apsa
tasta enter. Caracterul tastat este afiat pe ecran n ecou. O funcie
asemntoare este getch(), care nu mai afieaz caracterul tastat (fr
ecou). Aceste dou funcii aparin bibliotecii de funcii conio.h (console
input/output).


Exemplul 4.9

main()
{
char ch;
printf(Tasteaza un caracter: );
ch=getche();


Anexe Laboratorul 3
172 Proiectul pentru nvmntul Rural
printf(\nCaracterul tastat a fost %c.,ch);
}
n urma execuiei programului, are loc urmtoarea interaciune cu
operatorul:

Tasteaza un caracter: A
Caracterul tastat a fost A

n cazul tastrii caracterului A. Nu mai este necesar apsarea tastei
enter dup ce a fost tastat caracterul cerut.

Funcia gets() citete un ir de caractere din fiierul standard de intrare.
Sintaxa acestei funcii este:
char *gets(char *s);
n acest caz, spre eosebire de funcia scanf(), se pot introduce spaii i
tab-uri n componena irului de caractere. Citirea se termin la apsarea
tastei Enter, cnd se nlocuiete caracterul \n cu terminatorul de ir \0.
Dac s-a citit corect irul, se ntoarce valoarea lui s, n caz de eroare sau
de sfrit de fiier, se ntoarce pointerul NULL.

Funcia puts() scrie un ir de caractere specificat ca parmetru n fiierul
standard de ieire. Sintaxa acestei funcii este:
int puts(char *s);
Dup afiarea irului se trece la linia urmtoare.


Exemplul 4.10

Programul urmtor citete numele i prenumele unei persoane, dup care
face afiarea acestora:
#include <stdio.h>
main()
{
char nume[20], pren[30];
printf(Tasteaza numele: );
gets(nume);
printf(Tasteaza prenumele: );
gets(prenume);
puts(nume); puts(prenume);
}
4. 5 Operaii de citire/scriere specifice limbajului C++

Limbajul C++ permite, pe lng utilizarea funciilor de intrare/ieire ale
limbajului C, un sistem mai flexibil de utilizare a intrrilor i ieirilor. Dei
operaiile au fost concepute n spiritul programrii orientate pe obiecte,
n aceast prezentare nu se va recurge la aceast tehnic i nu va fi
necesar cunoaterea lor. Cele pretentate n continuare nu se vor dect a
fi o scurt introducere a operaiilor cu consola.

Urmtoarele dispozitive sunt predefinite n C++:
cout console output dispozitiv de ieire pe ecran,
echivalent cu stdout din C;

Anexe Laboratorul 3
Proiectul pentru nvmntul Rural 173
cin console input dispozitiv de introducere de la
tastatur echivalent cu stdin din C.

Pentru a putea realiza operaii de intrare/ieire trebuie folosit biblioteca
iostream.h. Modul de utilizare este urmtorul:
cout<<expresie1<<expresie2.<<expresien;
cin>>expresie1>>expresie2.>>expresien;

Tipurile datelor citite/scrise sunt toate tipurile aritmetice i irurile de
caractere; aceste operaii nu necesit un anumit format pentru executarea
lor.


Exemplul 4.11

Aplicaia din Exemplul 4.5 poate fi rescris cu ajutorul lui cin i cout astfel:

#include <iostream.h>
main()
{
int ev;
float timp;
char poz;
cout<<Introduceti poz, ev,timp:
cin>>poz>> ev>> timp;
cout<<Evenimentul <<poz<< are numarul <<ev;
cout<< si a avut loc la <<timp<<timp.;
}

Executarea acestui program va avea acelai efect cu cel din exemplul
amintit.

n cazul citirii irurilor de caractere, caracterul nul (\0)este adugat
automat, dar nu poate fi citit un ir care conine mai multe cuvinte separate
prin spaii sau tab-uri; citirea se oprete la ntlnirea unui astfel de
caracter. Din acest motiv, pentru citirea irurilor de caractere se folosete
o funcie de un tip special, i anume funcia:
cin.get(sir_de_caractere, int nr, char=\n);
citete un ir de caractere pn cnd este ndeplinit una din condiiile de
mai jos:
au fost citite n-1 caractere;
a fost citit caracterul transmis ca ultim parametru (implicit \n);

Observaii:
sunt citite i caracterele albe spaii, tab-uri;
este inserat caracterul nul - \0 la sfritul irului de caractere;
caracterul transmis ca ultim parametru nu este inserat n ir;
al treilea parametru este trecut n mod facultativ, dac nu este
precizat se presupune c este \n.



Anexe Laboratorul 3
174 Proiectul pentru nvmntul Rural
Exemplul 4.12

a) S se citeasc un ir de maxim 5 caractere.
char s[10];
cin.get(s,6);
cout<<s;
De exemplu, dac se tasteaz cuvntul calculator i apoi se apas tasta
Enter, va fi afiat calcu.
b) S se citeasc un ir de maxim 10 caractere, cu oprirea citirii la
ntlnirea caracterului t,
char s[11];
cin.get(s,11,t);
cout<<s;
n acest caz, programul va afia cuvntul calcula.

Atenie! Dac se utilizeaz de mai multe ori funcia cin.get() cu trei
parametri, citirea nu se efectueaz corect datorit interpretrii caracterului
corespunztor tastei Enter, care rmne n memoria tampon a
calculatorului drept terminare de ir,i, prin urmare al doilea ir de
caractere nu mai este citit. Aceast problem se poate soluiona prin
folosirea unei funcii cin.get() fr parametri, dup una cu parametri,
pentru a se goli memoria tampon.


Exemplul 4.13

S se citeasc numele i prenumele unei persoane, folosindu-se pentru
fiecare din ele cte un ir de caractere.

#include <iostream.h>
#include <string.h>
main()
{
char nume[20], pren[30];
cout<<Dati numele: ;
cin.get(nume,20);
cin.get();
cout<<Dati prenumele: ;
cin.get(pren,30);
cout<<nume<< <<pren;
}
Pentru a v convinge de cele artate mai sus, executai programul de mai
sus i n situaia n care lipsete instruciunea de citire fr parametri i
comparai cele dou soluii.


Anexe Laboratorul 3
Proiectul pentru nvmntul Rural 175


Testul de autoevaluare 4.3

Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte.
Punctaj minim: 80

1. Adevrat / Fals Trebuie s apsai tasta Enter dup scrierea unui caracter pentru ca
funcia getch() s-l citeasc.

2. Un operator relaional se folosete pentru a:
a. combina valori;
b. compara valori;
c. distinge ntre diferite tipuri de variabile;
d. schimba variabile n valori logice.

3. Funcia scanf() citete:
a. un singur caracter;
b. caractere i iruri;
c. orice numr;
d. orice tip de variabil.

4. Pentru a putea realiza operaii de intrare/ieire cu cin i cout trebuie folosit biblioteca
.

5. Ce va afia urmtorul program:
main()
{ int a, b, c;
cin>>a>b>>c;
cout<<(a>b?a>c?a:c:b>c?b:c);
}
dac se introduc valorile: 5, 9 3?
dar pentru 3 1 5?


Variantele corecte de rspuns se afl la pag. 85.


Anexe Laboratorul 4
176 Proiectul pentru nvmntul Rural
Laboratorul 4


Exemplul 5.5

Se citesc a,b,c coeficienii reali ai ecuaiei de gradul II ax
2
+ bx+c=0. Se
cere s se scrie un program care s rezolve ecuaia.

Varianta 2:

# include<iostream.h>
# include<math.h>
void main()
{
float a,b,c,d;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
a?d=b*b-4*a*c,
d>=0?cout<<"x1="<<(-b+sqrt(d))/(2*a)<<"\n"<<"x2="<<(-b-sqrt(d))/(2*a):
cout<<" nu are solutii reale":
b?cout<<"x="<<(-c/b):
c?cout<<"ecuatia nu are solutii": cout<<"infinitate de solutii";
}

Observaii:

Pentru a rula programul implementat in mediul limbajului C / C++ se
tasteaz CTRL+F9. Dac sunt erori de sintax, apare un mesaj de eroare,
iar cursorul este poziionat n zona n care se presupune c exist
eroarea.

n acest caz, se efectueaz corecia necesar i se ncearc, din nou,
rularea programului (CTRL+F9).
n cazul n care nu avem erori se execut programul. Rezultatele apar
scrise in fereastra utilizator (user screen).

Dac se lucreaz sub DOS, pentru vizualizarea rezultatelor se tasteaz
ALT+F5. n acest caz, revenirea n fereastra textului surs se face prin
apasarea tastei Enter sau ALT+F5.



Anexe Laboratorul 4
Proiectul pentru nvmntul Rural 177











Anexe Laboratorul 4
178 Proiectul pentru nvmntul Rural


Exemplul 5.10

Problema Gard
Olimpiada Judeean de Informatic pentru Gimnaziu 2003, clasa a VI-a

Doi copii vopsesc un gard alctuit din n scnduri (numerotate de la 1 la n,
n< 100000) astfel: primul ia o cutie de vopsea roie cu care vopsete
scndurile cu numrul p, 2p, 3p, etc. Al doilea procedeaz la fel, ncepe
de la acelai capt al gardului, dar folosete o cutie de vopsea albastr i
vopsete din q n q snduri. Astfel, cnd vor termina de vopsit, gardul va
avea multe scnduri nevopsite, unele scnduri vopsite n rou, altele n
albastru, iar altele n violet ( albastru i rou).
Cunoscnd numerele n, p, q, scriei un program care s afieze:
- cte scnduri rmn nevopsite
- cte scnduri sunt vopsite n rou
- cte scnduri sunt vopsite n albastru
- cte scnduri sunt vopsite n violet
Exemplu: n=25, p=4, q=6 se vor afia valorile 17 4 2 2.

Dei algoritmul nu este eficient, voi parcurge succesiv toate scndurile i
voi verifica pentru fiecare scndur toate cazurile. Ilustrez astfel
instruciunea for.

#include<iostream.h>
void main()
{ long int n, i, p,q, nec,rosu, albastru, violet;
cout<<"nr. de scanduri n="; cin>>n;
cout<<"p si q: ";cin>>p>>q;
nec=rosu=violet=albastru=0;
for(i=1;i<=n;i++)
if(i%p==0 && i%q==0)violet++;
else if(i%p==0) rosu++;
else if (i%q==0)albastru++;

else nec++;
cout<<nec<<" "<<rosu<<" "<<albastru<<" "<<violet;
}


Anexe Laboratorul 4
Proiectul pentru nvmntul Rural 179



Tem de reflecie 5.1

Analizeaz algoritmul Exemplului 5.11 i rspunde cerinelor de mai jos. Fiecare rspuns
corect valoreaz 30 puncte. Punctaj minim: 70. Se acord 10 puncte din oficiu.

1. Urmrete pas cu pas execuia programului din Exemplul 5.11 pentru n=7;
2. Modific algoritmul din Exemplul 5.11 astfel nct s calculeze suma primilor n
termeni din irul Fibonacci.
3. Modific algoritmul din Exemplul 5.11 astfel nct s calculeze cel mai mare
termen din irul Fibonacci mai mic sau egal cu n.

















Anexe Laboratorul 4
180 Proiectul pentru nvmntul Rural
Lucrare practic 5.1 ( n laboratorulul de informatic)

Scrie i implementeaz programe C / C++ pentru rezolvarea urmtoarelor aplicaii. Fiecare
cerin se noteaz cu 20 de puncte. Punctaj minim: 80 puncte.

1.S se determine cel mai mare numr care se poate forma cu ajutorul cifrelor unui numr
natural citit de la tastatur. Ex: fie 2781 numrul dat; cu cifrele sale se poate forma
numrul 8721 cu proprietatea dat.

2. Se dau n numere naturale nenule (n<40). Se cere s se afieze cel mai mare divizor
comun. Ex: fie n=4 i numerele 16 40 36 8, se va afia 4.

3. Se consider un ir de n (n<10) numere naturale. S se verifice dac numrul format
din primele cifre ale acestora este un palindrom. Un numr este palindrom dac citit de la
sfrit la nceput este aceelai numr. Ex: fie n=5 i numerele 123, 435, 92, 4762, 10000
se obine numrul 14941 care este un palindrom.

4. Un mare bogta are un seif cu cifru. Pentru a nu uita cifrul, bogtaul vrea s-l scrie pe
o foaie, dar codificat: fiecare cifr s fie nlocuit cu diferena dintre cifra 9 i cifra
respectiv. Scrie un program care preia cifrul de la tastatur (prima cifr este diferit de 0),
l codific dup metoda tiut i afieaz cifrul codificat. Ex: cifrul 43746521 se codific n
56253478.

5. Se extrag dintr-o urn bile pe care sunt scrise numere naturale. Extragerea se face
pn la ntlnirea bilei cu numrul 1. Scrie un program care simuleaz aceasta i afieaz
numrul cifrelor 0 n care se termin numrul produs al numerelor citite. Ex: se extrag bile
cu numerele 15 20 4 12 1; numrul cifrelor 0 este 2.





Sarcin de lucru 5.1

Variant corect:

# include <iostream.h>
void main()
{
int n,i;
float x,p=1; // n p voi calcula puterea
cin>>n; cin>>x;
i=1;
while (i<=n) {p*=x; i++;} // la fiecare pas i voi nmuli valoarea lui p cu x
cout<<p=p;
}

Sarcin de lucru 5.2

Variante corecte:

e) 2
Anexe Laboratorul 4
Proiectul pentru nvmntul Rural 181
b)
#include< iostream.h>
void main()
{
int a,b, nr=0, i;
cout<< a=;cin>>a;
cout<< b=;cin>>b;
i=a; nr=0;
if (i<=b) do{ if (i%2==0) nr++; i++; } while (i<=b);
cout<<nr=<<nr;
}
c) n variabila nr numrm valorile pare din intervalul [a,b].


Lucrare practic 5.1

1.
Soluie: algoritmul realizeaz numrarea apariiilor fiecrei cifre n ordine descresctoare de la 9 la
0 i afiarea succesiv a acestora.
# include <iostream.h>
main()
{ long nr, a, I, aparitie, j;
cin>>nr;
for(j=9;j>=0;j--)
{ a=nr;
aparitie=0;
do{
if(a%10==j aparitie++;
a/=10;
}while (a>0);
for (i=1;i<=aparitie;i++) cout<<j;
}
}

2.
Soluie: voi determina cel mai mare divizor comun dintre primul numr i al doilea, apoi cel mai
mare divizor dintre numrul obinut i al treilea, .a.m.d.
#include<iostream.h>
void main()
{long n,x,a,b,d,i;
cout<<n=; cin>>n;
cin>>x;
d=x;
for(i=2;i<=n;i++)
{ cin>>x;
a=d; b=x;
while(a!=b)
if(a>b) a-=b;
else b-=a;
d=a;
}
cout<<c.m.m.d.c=<<d;
}


Anexe Laboratorul 4
182 Proiectul pentru nvmntul Rural
3.
Soluie: voi determina succesiv cifrele cele mai semnificative ale numerelor din ir, prin mprirea
la 10, pn cnd se ajunge la valori mai mici sau egale cu 9. Cu aceste cifre voi forma un numr
nou i apoi voi verifica dac este palindrom.

#include< iostream.h>
void main()
{
long a,b,c,n,x,i;
cin>>n; a=0;
for(i=1;i<=n;i++)
{ cin>>x;
while (x>9) x/=10;
a=a*10+x;
}
b=a; c=0;
while( b!=0)
{ c=c*10+b%10;
b/=10;
}
if(c==a) cout<<a<< este palindrom; else cout<<a<< nu este palindrom;
}


Anexe Laboratorul 5
Proiectul pentru nvmntul Rural 183
Laboratorul 5


Exemplul 6.4

Se consider un vector cu n componente numere ntregi, ordonate
cresctor i un numr ntreg x. S se determine dac acest numr se afl
printre componentele vectorului, iar n caz afirmativ, poziia sa n vector.

Pentru acest exemplu s-ar putea folosi ca metod de rezolvare algoritmul
prezentat n cazul exemplului 6.2, dar nu ar fi o metod eficient,
deoarece nu se ine cont de faptul c vectorul este deja ordonat cresctor;
prin urmare, cnd numrul x este comparat cu un element din vector a[i],
se pot lua mai multe decizii; dac numrul x este egal cu a[i], atunci se
poate spune c numrul se afl n vector pe poziia i; dac x este mai mic
dect a[i], se poate deduce c acesta se poate afla pe poziiile mai mici
dect i, respectiv pe poziiile mai mari dect i, n caz contrar.

n continuare este prezentat algoritmul cutrii binare, care rspunde
cerinelor acestei probleme.

main()
{int a[20], n, i, x, gata=0, li, ls, m;
....................................
li=0; ls=n-1;
while (!gata && li<=ls)
{
m=(li+ls)/2;
if (x==a[m])
gata=1;
else
if(x<a[m])
ls=m-1];
else
li=m+1;
}
if (gata)
printf(%d se afla pe pozitia %d in vector.\n,x,m);
else
printf(%d nu se afla in vector.\n,x);
}

n rezolvarea acestei probleme au fost folosite urmtoarele variabile de
lucru: li i ls, reprezentnd limita inferioar, respectiv superioar ntre care
se efectueaz cutarea la un moment dat n vector; m reprezint mijlocul
intervalului de cutare, fiind egal cu media aritmetic a capetelor acestuia;
gata este o variabil necesar sesizrii momentului n care a fost gsit
valoarea cutat n vector i opririi acestei cutri.

Pentru nceput, valorile limitelor inferioare i superioare sunt iniializate cu
zero, respectiv n-1, capetele vectorului, iar gata este iniializat cu zero.

Anexe Laboratorul 5
184 Proiectul pentru nvmntul Rural
S presupunem c elementele vectorului sunt: 2, 5, 8, 9, 11, 14 (n=6) iar
numrul cutat este x=11;
li=0, ls=5, gata=0;
este gata=0 i li<=ls? da //0<=5
m=2 //(0+5)/2
este 11=8? nu
este11<8? nu
li=3
este gata=0 i li<=ls? da //3<=5
m=4 //(3+5)/2
este 11=11? da
gata=1
este gata=0 i li<=ls? nu
este gata=1? da
scrie 11 se afla pe pozitia 4 in vector.

Pentru aceleai elemente ale vectorului, dar x=4, algoritmul va funciona
astfel:
li=0, ls=5, gata=0;
este gata=0 i li<=ls? da //0<=5
m=2 //(0+5)/2
este 4=8? nu
este 4<8? da
ls=1
este gata=0 i li<=ls? da //0<=1
m=0 //(0+1)/2
este 4=2? nu
este 4<2? nu
li=1
este gata=0 i li<=ls? da //1<=1
m=1 //(1+1)/2
este 4=5? nu
este 4<5? da
ls=0
este gata=0 i li<=ls? nu //1<=0
este gata=1? nu
scrie 4 nu se afla in vector.

n cazul n care numrul cutat nu se afl n vector, cutarea se oprete n
momentul n care limita inferioar nu mai este mai mic sau egal dect
cea superioar.

Indicaii pentru rezolvarea testului de autevaluare 6.5

1. Se iniializeaz valorile variabilelor min_poz = MAXINT i max_neg =
- MAXINT. Se parcurge vectorul, comparndu-se valorile pozitive cu
min_poz, respectiv cele negative cu min_neg. n final, dac una dintre
aceste valori rmne neschimbate, nseamn c nu au fost gsite
astfel de valori n vector.
2. Se folosesc doi vectori, mpreun cu 2 variabile de tip contor,
reprezentnd poziiile din vectori pe care vor fi puse noile valori citite,
Anexe Laboratorul 5
Proiectul pentru nvmntul Rural 185
n funcie de paritatea numerelor citite. Citirea se termin la
introducerea valorii 0.
3. Pentru un numr dat, se mparte acesta la 10, pn cnd numrul
devine 0. La fiecare mprire, restul se depune n vector, iar numrul
se micoreaz de 10 ori.

Aritmetica pointerilor

Operaiile aritmetice permise asupra pointerilor sunt: adunarea/scderea
unei constante, incrementarea/decrementarea i scderea a doi pointeri
de acelai tip. De asemenea, acestora li se pot aplica operatorii relaionali
(pot fi comparate adrese de variabile chiar de tip diferit).

Prin definiie, adunarea lui 1 la un pointer face ca el s indice urmtorul
obiect de acelai tip, aflat n memorie la adrese succesive. Scderea lui
1 dintr-un pointer face ca el s indice obiectul imediat anterior n spaiul de
memorie. Aceleai reguli se aplic la operatorii ++ i --.

De exemplu, avnd declaraiile:
int *pi; float *pf;
*(pi+1) este urmtorul ntreg de dup *pi, iar *(pf-1) este numrul real
aflat imediat naintea lui *pf. Similar *(pi+i) va reprezenta al i-lea ntreg
succesiv din memorie, de dup adresa pi. De remarcat c ceea ce se
adun efectiv este sizeof(int), respectiv sizeof(float).

Semnificaia pointerilor poate fi alterat prin conversia explicit de tip
(cast). Astfel, n exemplul de mai sus, expresiile:
*((char*)pf) i *(((char*)pf)+1)
vor furniza primul i, respectiv al doilea octet din reprezentarea unei
variabile de tip float. Tipul expresiei (char*)pf este char* i adunarea lui 1
la aceast expresie va avansa pe pf cu un octet.

Atribuirile de pointeri trebuie s se fac ntre pointeri (sau expresii) de
acelai tip. Se poate folosi conversia explicit de tip, n cazul unor pointeri
de tip diferit. Acest lucru trebuie evitat pentru a nu se realiza atribuiri
defectuoase.

Aritmetica unui pointer (adunri/scderi de constante) este garantat n
standardul ANSI C a funciona corect numai dac pointerul se menine
ntre limitele unui tablou declarat de variabile.

n ceea ce privete scderea a doi pointeri, standardul ANSI C permite
aceast operaie numai ntre pointeri de acelai tip, care s indice
elemente ale aceluiai tablou. Dac p i q sunt doi pointeri de tip T*,
respectnd aceste condiii i p indic un element al tabloului aflat n
memorie dup q (adic la o adres mai mare), atunci diferena p-q
reprezint numrul de obiecte de tip T aflate ntre p i q.

n aceleai condiii ca la scdere, se pot face comparaii cu operatorii: ==,
!=, <, <=, >, >=. Prin definiie, p>q este 1, dac se poate face diferena p-q
(conform restriciilor de mai sus) i aceast diferen este pozitiv. Este
Anexe Laboratorul 5
186 Proiectul pentru nvmntul Rural
permis comparaia oricrui tip de pointer cu pointerul NULL. Doi pointeri
nu se pot niciodat aduna.


Exemplul 6.7

Studiai ce tiprete programul urmtor:


Figura 6.2

Comparai bucla for din acest exerciiu cu bucla for obinuit de tiprire a
elementelor tabloului a, mpreun cu adresele acestor elemente:
long a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
long i;
for (i=0;i<10;i++)
printf("Adresa: %p Elementul: %ld\n",&a[i], a[i]);


Testul de autoevaluare 6.3

Alegei varianta (variantele) corect pentru urmtoarele ntrebri. Fiecare ntrebare
valoreaz 20 de puncte. Punctaj minim: 80


1. Considerm declaraia:
int n; const int a=10, *pi=&a;
S se determine care dintre instruciuni sunt corecte:
A. n=a;
B. a=3;
C. n=*pi;

Anexe Laboratorul 5
Proiectul pentru nvmntul Rural 187
D. *pi= 1;
E. pi++;
2. Ce se tiprete n urma executrii secvenei de mai jos?
int a=5; *&a=7;
printf(%d,a);
B. 5
C. eroare de sintax
D. 7


3. Ce se tiprete n urma executrii secvenei de mai jos?
int a=0x120f;
printf(%d,*((char*)&a+1));
A. 18
B. 12
C. 15


4. Ce se tiprete n urma executrii secvenei de mai jos?
int a=0x120f;
printf(%d,*((char*)&a)+1);
A. 16
B. 0x
C. 19



5. Tiprii coninutul n hexazecimal al octetului cel mai semnificativ al unei variabile de tip
long int.





Lucrare practic 6.1 ( n laboratorulul de informatic)

Scriei algoritmul de rezolvare a urmtoarelor probleme. Rezolvarea fiecrei probleme
valoreaz 20 de puncte. Punctaj minim: 80

1. Se citete de la tastatur un ir de caractere i un caracter. S se spun dac acest
caracter exist n ir, iar n caz afirmativ s se indice poziia primei sale apariii..






2. Se citete de la tastatur un ir de caractere i un caracter. S se spun dac acest
caracter exist n ir, iar n caz afirmativ s se indice poziiile tuturor apariiilor acestuia n
ir i numrul total de apariii.
Anexe Laboratorul 5
188 Proiectul pentru nvmntul Rural






3. S se sorteze alfabetic n cuvinte citite de la tastatur.







4. Dndu-se un ir de caractere s i un subir a, s se elimine din irul dat toate apariiile
subirului:








5. S se nlocuiasc toate apariiile unui subir a cu un subir b dintr-un ir s. Datele de
intrare se preiau de la tastatur.











Anexe Laboratorul 6
Proiectul pentru nvmntul Rural 189

Laboratorul 6



Exemplul 7.13


S considerm urmtorul program:

#include<fstream.h>
#include<string.h>
void main()
{fstream f;
char s[15], t[15];
f.open("test.txt",ios::in); // f este deschis pentru citire
while(f.getline(s,15)) //se citeste cte o linie din fisier si se retine in s
strcpy(t,s); // sirul s se copiaza in t
cout<<t;
f.close();
}

tiind c lungimea maxim a unei linii din fiierului test.txt este 15, s
verificm ce afieaz programul de mai sus.



Figura 7.1

Observaii:

1. Fiierul surs nu este denumit! Fiierul test.txt a fost construit
naintea rulrii fiierului surs, prin deschiderea unei ferestre noi,
scrierea coninutului fiierului i salvarea acestuia n directorul curent,
cu extensia txt.

Anexe Laboratorul 6
190 Proiectul pentru nvmntul Rural
2. n figura 7.1 se observ c s-a afiat ultima linie din fiier. n realitate
programul afieaz caracterul de sfrit de fiier care, n aceast
situaie este dup cuvntul fiiere.

Tem de reflecie 7.1

Analizeaz algoritmul Exemplului 7.13 i rspunde cerinei de mai jos. Rspunsul corect
valoreaz 20 puncte.

Modific fiierul test.txt astfel nct rezultatul s fie afiarea caracterului de sfrit de
fiier.










Exemplul 7.14

Se dau dou fiiere f1 i f2. S se concateneze cele dou fiiere date, iar
rezultatul s fie fiierul f3.


#include<fstream.h>
void main()
{
char c;
ifstream f1("fis1.txt"); //f1.open("fis1.txt",ios::in);
ifstream f2("fis2.txt"); //f2.open("fis2.txt",ios::in);
ofstream f3("fis3.txt"); //f3.open("fis3.txt",ios::out);
while (!f1.eof())
{f1.get(c); f3<<c;}
/* se citeste cte un
caracter din f1 si se scrie
in f3 */
f1.close();
while (!f2.eof())
{f2.get(c); f3<<c;}
/* se citeste un caracter
din f2 si se scrie in f3 */

Anexe Laboratorul 6
Proiectul pentru nvmntul Rural 191

f2.close(); f3.close();
}
Observaii:

1. Programul este pur didactic. Sunt evideniate modurile de:
deschiderea fiierelor;
detectarea sfritului de fiier pentru fiecare fiier n parte;
citirea cte unui caracter dintr-un fiier i scrierea lui n alt fiier,
operaie repetat pn la ntlnirea caracterului de sfrit de fiier
pentru fiierul de intrare;
inchiderea fiierelor.
2. Programul se poate modifica cu uurin prin adaugarea coninutului
fiierului f2 la sfritul fiierului f1, dac dorim concatenarea lui f2 la f1,
sau invers.
3. n figura 1.2 se observ n fiierul fis3.txt existena unor caractere cu
rou, care reprezint sfritul fiierelor f1 i f2.



Figura 7.2


Lucrare practic 7.1 ( n laboratorulul de informatic)

Scrie i implementeaz programe C / C++ pentru rezolvarea urmtoarelor aplicaii. Fiecare
cerin se noteaz cu 25 de puncte. Punctaj minim: 75 puncte.

Anexe Laboratorul 6
192 Proiectul pentru nvmntul Rural
1. S se scrie un program care creaz fiierul numere.out, care s conin 1000 de
numere aleatoare divizibile cu 5 din intervalul [1, 25000].



2. Profesorul a dat celor n (n natural) elevi ai si s realizeze cte un fiier text care s
conin informaii despre modul de via al vieuitoarelor i le-a spus s salveze lucrrile
cu numele: capitolul1.txt, capitolul2.txt, ..., capitoluln.txt. Scrie o aplicaie care s
concateneze aceste fiiere n stream-ul ecosisteme.txt.



3. La petrecerea organizat cu ocazia srbtoririi a 10 ani de fiinare a firmei X sunt
invitate s participe persoane al cror nume se afl n dou fiiere text (pe fiecare linie
este trecut numele unei persoane). Alctuiete o list final astfel nct o persoan s nu
fie onvitat de dou ori.



4. Se citete din fiierul elevi.in situaia la nvtur a fiecrui elev. Pe liniile impare se
gsesc numele i prenumele elevilor. Pe cele pare se gsesc numere separate prin spaii,
astfel: primul numr reprezint clasa (ex: 5 sau 8), apoi se regsesc mediile pe discipline.
S se calculeze i s se afieze media general a fiecrui elev; n cazul n care elevul este
corigent se va afia numrul disciplinelor cu corigent.





Lucrare practic 7.1

1. Pentru generarea numerelor aleatoare se va folosi funcia standard random() al crei
prototip este
int random (int x);
se afl n stdlib.h i returneaz un ntreg cuprins ntre 0 i ( x-1). Apelul funciei random()
trebuie s fie precedat de apelul funciei randomize().

2. Parcurg ntr-un ciclu toate fiierele de la 1 la n. La fiecare pas n ciclu, deschid fiierul,
adaug coninutul lui n stream-ul ecosisteme.txt i trec mai departe la urmtorul fiier.

3. Fie w vectorul n care voi obine lista final. Elementele acestui vector reprezint
reuniunea celor dou liste din fiierele date. Pentru nceput voi copia n w toate numele din
primul fiier, apoi parcurg al doilea fiier i adaug n w doar acele nume care nu se afl
deja n w.

4. Pentru fiecare elev din fiier citesc numele i prenumele ntr-o variabil de tip string. De
pe linia urmtoare citesc apoi clasa i mediile elevului (ntr+un ciclu pn la sfritul liniei),
calculez media general. Totodat numr ntr-o variabil mediile sub 5 i dac la sfritul
ciclului acest variabil e diferit de 0, atunci elevul este corigent i voi putea afia
numrul disciplinelor la care este corigent. nainte de a trece la un alt elev se afieaz
media general calculat.

Anexe Laboratorul 7
Proiectul pentru nvmntul Rural 193

Laboratorul 7



Exemplul 8.9


Consider un vector a cu n componente (a[1], a[2], a[3], , a[n]). mi
propun s calculez suma a[1]! + a[2]! + +a[n], folosind:
- o funie pentru citirea vectorului a;
- o funcie pentru calculul k! , unde k! = 1*2*3**K;
- o funcie pentru calculul sumei componentelor unui vector.
Ex:
Pentru n=4, vectorul: 4, 1, 3, 2, se va afisa 33.

Numerele a[1], a[2], a[n] i suma factorialelor nu depesc tipul long.
De aceea funciile corespunztoare factorial, respectiv suma vor fi de
acest tip.

#include <iostream.h>

int n;

/* n este o variabil global, recunoscut n toate funciile programului*/

void citire (int n, long a[100])
{
int i;
for(i=1;i<=n;i++) cin>>a[i];}

/* pentru calculul sumei componentelor vectorului, se parcurg elementele
pe rnd i se introduc n sum.*/

long suma (int n, long a[100])
{
int i; long s=0;
for(i=1;i<=n;i++) s+=a[i];
return s;
}

/* pentru calculul factorialului, voi iniializa variabila f cu valoarea 1
(elementul neutru la nmulire) i voi calcula n f produsul 1*2*3**k */

long factorial (int k)
{
int i; long f=1;
for(i=1;i<=k;i++) f*=i;
return i;
}


Anexe Laboratorul 7
194 Proiectul pentru nvmntul Rural
/* funcia principal apeleaz funciile: citire(), factorial() i suma(); este
interesant de urmrit modul n care aceste funcii sunt apelate:
- apelul funciei citire() este unul caracteristic funciilor de tip void;
- apelul funciei factorial() este membru drept ntr-o expresie;
- apelul funciei suma() apare n funcia de scriere cout */

void main()
{
long a[100], b[100];
cin>>n;
citire(n,a);
for( int i; i<=n;i++) b[i]=factorial(a[i]);
cout<<suma este<< suma(n,b);
}





Exemplul 8.10

Consider un numr natural nenul n (n<21). Vreau s construiesc o
matrice ptratic a=(a
ij
)
i,j=1,,n
, unde a
ij
este al i+j lea numr prim, apoi,
pentru un x cifr citit de la tastatur s afiez toate elementele matricei
care au k cifre distincte. Voi folosi:
- o funcie care verific dac un numr este prim;
- o funcie care returneaz al k-lea numr prim;
- o funcie care returneaz numrul de cifre distincte ale unui numr
natural.
Ex:
Pentru n=3 si k=2 se va afisa:

3 5 7
5 7 11
7 11 13

13





Anexe Laboratorul 7
Proiectul pentru nvmntul Rural 195


#include<iostream.h>
#include<math.h>
int a[21] [21],n,x,k;

/* functia prim verifica daca parametru sau este prim
si returneaza 1 daca este prim, 0 altfel*/

int prim (int k)
{
int i;
for(i=2;i<=k/2;i++) if(k%i==0) return 0;
return 1;
}

/* functia n_prim returneaza a x-lea numar prim;
pentru aceasta apeleaza functia prim() */

int n_prim(int k)
{int p,nr;
p=2; nr=0;
while(nr<k){ if(prim(p))nr++;
p++;
}
return p-1;
}
Anexe Laboratorul 7
196 Proiectul pentru nvmntul Rural

/* functia construct are tipul void, lista parametrilor vida
si va construi matricea patratica */

void construct()
{ int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) a[i][j]=n_prim(i+j);
}

int cifre_dist(int k)
{
int i,j,nr,b[20],m=0;
while(k!=0){ i=k%10; m++; b[m]=i;k=k/10;}
nr=0;
for(i=0; i<=9;i++)
for (j=1;j<=m;j++)if(i==b[j]){ nr++; break;}
return nr;
}

/* functia principala apeleaza functiile construct,
afiseaza matricea construita si elementele cu proprietaea
ca au k cifre disticte */

void main()
{ int i,j,x;
cout<<"n=";cin>>n;
construct();
cout<<" matricea:"<<endl;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++) cout<<a[i][j]<<" ";
cout<<"\n";}
cout<<"x=";cin>>x;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)if(cifre_dist(a[i][j])==x) cout<<a[i][j]<<" ";
}



Anexe Laboratorul 7
Proiectul pentru nvmntul Rural 197


Lucrare practic 8.1 ( n laboratorulul de informatic)



Scrie i implementeaz programe C / C++ pentru rezolvarea urmtoarelor aplicaii. Fiecare
cerin se noteaz cu 25 de puncte. Punctaj minim: 75 puncte.

1. S considerm un vector cu n (n<101) componente numere naturale mai mici sau egale
cu 30000. Afieaz numerele din vector care au cele mai multe cifre de 1 n repreyentare
binar. Vei folosi:
- o funcie pentru citirea vectorului;
- o funcie pentru determinarea numrului de cifre 1 din reprezentarea binar a unui
numr;
- o funcie care returmeaz elementul maxim dintre componente unui vector.
Ex: pentru n=3 si elementele vectorului 13, 9, 7, se va afisa 13 7

2. S considerm un vector cu n (n<101) componente numere naturale mai mici sau egale
cu 30000. Determin componentele vectorului care au cei mai muli divizori. Pentru
aceasta vei folosi:
- o funcie pentru citirea vectorului;
- o funcie pentru calculul numrului de divizori ai unui numr.
Ex: pentru n=5 si elementele 10 29 6 2 11, se va afisa 10 6

3. Considerm un vector V cu n (n<51) componente ntregi. Pentru un k dat (0<kn),
ordoneaz cresctor primle k elemente i descresctor celelalte componenteale lui V.
Pentru aceasta vei folosi:
- o funcie pentru citirea lui V;
- o funcie pentru a ordona, la alegere, cresctor sau descresctor o parte din
componentele unui vector.
Ex: pentru n=9, k=3 si V ( 72 15 33 45 58 23 2 5 20), se va afisa 15 33 72 58 45 23 20 5 2

4. Considerm dou numere nenule n i k (n,k<1000). Determin numerele naturale x1,
x2, ..., xk cu proprietile:
- 0<x1<x2<...<xk
- x1 + x2 +... +xk = n
- numerele sunt cuburi perfecte.
Folosete la scrierea programului o funcie pentru determinarea numerelor care
ndeplinesc toate cerinele.
Ex: pentru n=100 si k=5, se va afisa 1 8 27 64 100.







Anexe Laboratorul 7
198 Proiectul pentru nvmntul Rural
Lucrare practic 8.2 ( n laboratorulul de informatic)

Scrie i implementeaz programe C / C++ pentru rezolvarea urmtoarelor aplicaii.
Problemele se noteaz, n ordine, cu 20 puncte, 40 puncte, respectiv 40 de puncte.
Punctaj minim: 80.

1. Scrie un program care conine o funcii recursiv care permite citirea unei matrice cu n
linii i m coloane.


2. Consider date de la tastatur n (1n10) numere naturale nenule x1, x2, ..., xn. S se
calculeze suma p(x1)!+p(x2)!++p(xn)!, unde prin p(k) am notat prima cifr a numrului k,
iar prin k! produsul 1*2*3*n. Se va folosi:
- o funcie pentru citirea irului de numere;
- o funcie recursiv pentru gsirea primei cifre dintr+un numr natural;
- o funcie recursiv pentru calculul factorialului;
- o funcie recursiv pentru calculul sumei elementelor unui vector.


Ex: pentru n=3, x1=15, x2=321, x3=41, se va afisa valoarea 31.


3. Consider c se d un numr natural n(n<100). S se afieze a n-a pereche de numere
gemene. O pereche de numere naturale (a,b), a<b se numete pereche de numere
gemene dac a i b sunt prime i |a-b|=2. Perechile sunt ordonate dup primul numr din
pereche. Se va folosi:
- o funcie recursiv pentru a verifica dac un numr este prim;
- o funcie recursiv pentru gsirea celei de-a n-a perece de numere gemene.


Ex: pentru n=2 se va afisa 5 7













Anexe Laboratorul 7
Proiectul pentru nvmntul Rural 199
Lucrare practic 8.1 ( n laboratorulul de informatic)

1. Soluie:

int cifra_1(int x)
{ int num=0;
while (x)
{ num+=x%2; x/=2;}
return num;
}
int max(int n, int a[ ])
{
int i,max=a[1];
for(i=2;i<=n;i++) if( max<a[i]) max=a[i];
return max;
}

2. Soluie:

int numar_divizori(int x)
{ int nr=1, i;
for(i=2;i<=x/2;i++) if(x%i==0) nr++;
if(x>1) nr++;
return nr;
}

3. Soluie:
void ordonare( intp, int u, int v[ ], int t)
{
int i, aux, sem=1;
while(sem)
{sem=0;
for(i=p;i<u;i++) if(v[i]*t>v[i+1]*t)
{ aux=v[i]; v[i]=v[i+1]; v[i+1]=aux; sem=1;}
}

4. Indicaie:
Calculez valoarea sumei primelor k-1 numele cuburi perfecte nenule i o rein n variabila
s. Apoi verific dac diferena dintre n i sum este mai mare dect ultimul cub perfect al
sumei. n caz afirmativ exist soluie.


Lucrare practic 8.2 ( n laboratorulul de informatic)

1. Soluie:
#include<iostream.h>
void citiremat(int a[10][10], int i, int j, int n, int m)
{
if(i<n) if(j<m) { cin>>a[i][j]; citiremat(a,i,j+1,n, m);}
else citiremat(a,i+1,0,n,m);
}
void main()
Anexe Laboratorul 7
200 Proiectul pentru nvmntul Rural
{
int a[10][10],n,m;
cin>>n>>m;
citiremat(a,0,0,n,m);}
2. Soluie:
# include<iostream.h>
long x[10], z[10];
int i,n;
int citire(long x[10])
{
int i,d;
cin>>d;
for(i=1;i<=d;i++) cin>>x[i];
return d;
}
int pcifre(long a)
{
if(a<10) return a; else return pcifre(a/10);
}
long factorial(int n)
{
if(n==1) return 1;else return n*factorial(n-1);
}
long suma(long z[10], int n)
{
if( n==1) return z[1];else return suma(z,n-1)+z[n];
}
void main()
{
n=citire(x);
for(i=1;i<=n;i++) z[i]=factorial(pcifre(x[i]));
cout<<suma(z,n);
}

3. Soluie:
#include<iostream.h>
#include<math.h>
int n;
int prim(long a,long i)
{
if((a==0)||(a==1)) return 0;
else if(i<=sqrt(a)) if(a%i==0) return 0;
else return prim(a,i+1);
else return 1;
}



int generare(int n, int i)
{
if(n>0)
if(prim(i,2)&&prim(i+2,2)) generare(n-
1,i+1);
else generare (n,i+1);
else{ cout<<i-1<< <<i+1; return 0;}
}

void main()
{cin>>n;
generare(n,3);
}

Bibliografie
Proiectul pentru nvmntul Rural 201

BIBLIOGRAFIE



1. Dorin Stoilescu, Manual de C/C++, Editura Radial, Galati, 1998.
2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu
Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic,
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
5. Herbert Schildt, C manual complet, 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.
9. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu, Editura Polirom,
Iai, 2002.
10. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++ pentru liceu, ,
Editura Polirom, Iai, 2005
11. Cormen, Thomas, Introduction in Algorithms, The Massachussets Institute of
Technology, 1990.

S-ar putea să vă placă și