Sunteți pe pagina 1din 188

UNIVERSITATEA PETROL-GAZE DIN PLOIETI

P PR RO OG GR RA AM MA AR RE EA A
C CA AL LC CU UL LA AT TO OA AR RE EL LO OR R


Curs destinat specializrii
Automatic i Informatic Aplicat, Anul I
domeniul de studii de licen
Automatic
- nvmnt cu frecven redus -









PLOIETI 2012




Introducere
Acest curs face parte din primele cursuri prezentate
studenilor n programul de pregtire i are ca obiective
principale prezentarea conceptelor de baz din informatic i
prgtirea cursanilor n domeniul progamrii calculatoarelor.
Competenele generale urmrite se refer la cunoaterea
arhitecturii calculatoarelor, a sistemelor de operare, a conceptelor
fundamentale ale informaticii i ale algoritmicii.
Competenele specifice se refer la:
abilitatea de a transpune datele unei probleme de rezolvat
ntr-un program, de a proiecta algoritmi care s rezolve
corect i eficient problema i de a interpreta corect
rezultatele obinute;
abilitatea de a nelege algoritmii aflai n spatele
diverselor aplicaii software (inginereti sau generale), n
vederea ntreinerii sau mbuntirii lor, a testrii i a
corectrii eventualelor erori.

Cursul este structurat n cinci uniti de nvare (UI):
UI1. Introducere n informatic
Concepte de baz ale informaticii
Arhitectura calculatoarelor
Sisteme de operare
UI2. Baze de numeraie. Reprezentarea informaiei n
calculator
Baze de numeraie
Reprezentarea informaiei n calculator
UI3. Rezolvarea problemelor cu calculatorul
Etapele rezolvrii problemelor cu calculatorul
Tipuri de date si operatii elementare
Structuri de date
Algoritmi caracteristici i descriere


UI4. Introducere n limbajul de programare C
Introducere n limbajul de programare C
Elemente de baz ale limbajului C
Expresii n C. Funcii de intrare/ieire uzuale pentru
consol
UI5. Programare n limbajul C
Instruciuni de control ale programului
Tablouri i iruri de caractere

Resursele complementare care vor fi utilizate pe parcursul
studiului sunt: calculatoarele i aplicaia-program Borland C++
care va permite crearea i testarea programelor create de studeni
n limbajul de programare C i diverse programe coduri surs
scrise n acest limbaj.
Evaluarea cunotinelor se realizeaz prin:
autoevaluarea cu ajutorul sarcinilor de nvare incluse n
fiecare UI i al testelor aflate la finalul fiecrei UI pentru
care se ofer rezultatele;
o lucrare de verificare asistat de tutore susinut la
finalul programului de pregtire.
Criteriile de evaluare sunt: notele obinute la verificarea
asistat (proporie 60%) i nota acordat la examinarea final
(proporie 40%).


Cuprinsul cursului

UI1. Introducere n informatic
Obiectivele unitii de nvare pag 5
Concepte de baz ale informaticii pag 5
Arhitectura calculatoarelor pag 10
Sisteme de operare pag 21
Rspunsurile testelor de autoevaluare pag 26
Lucrarea de verificare pag 27

UI2. Baze de numeraie. Reprezentarea informaiei n calculator
Obiectivele unitii de nvare pag 29
Baze de numeraie pag 29
Reprezentarea informaiei n calculator pag 37
Rspunsurile testelor de autoevaluare pag 46
Lucrarea de verificare pag 46

UI3. Rezolvarea problemelor cu calculatorul
Obiectivele unitii de nvare pag 49
Etapele rezolvrii problemelor cu calculatorul pag 49
Tipuri de date si operatii elementare pag 53
Structuri de date pag 55
Algoritmi caracteristici i descriere pag 63
Rspunsurile testelor de autoevaluare pag 79
Lucrarea de verificare pag 80

UI4. Introducere n limbajul de programare C
Obiectivele unitii de nvare pag 83
Introducere n limbajul de programare C pag 83
Elemente de baz ale limbajului C pag 90
Expresii n C. Funcii de intrare/ieire uzuale pentru consol
pag 98
Rspunsurile testelor de autoevaluare pag 129
Lucrarea de verificare pag 129

UI5. Programare n limbajul C
Obiectivele unitii de nvare pag 133
Instruciuni de control ale programului pag 133
Tablouri i iruri de caractere pag 168
Rspunsurile testelor de autoevaluare pag 181
Lucrarea de verificare pag 182



5

UI1. Introducere n informatic

Obiectivele unitii de nvare pag 5
Concepte de baz ale informaticii pag 5
Test de autoevaluare pag 10
Arhitectura calculatoarelor pag 10
Test de autoevaluare pag 21
Sisteme de operare pag 21
Test de autoevaluare pag 26
Rspunsurile testelor de autoevaluare pag 27
Lucrare de verificare pag 26
Rezumat pag 27
Bibliografie pag 28


Obiectivele unitii de nvare
cunoaterea conceptelor fundamentale ale informaticii;
cunoaterea arhitecturii calculatoarelor;
cunoaterea sistemelor de operare.

Durata: 4 ore
Concepte de baz ale informaticii
Prin dat se nelege un numr, mrime, relaie etc.,
reprezentarea unui fenomen, lucru sau fapt, fiind susceptibil de
a fi memorat, transformat sau vehiculat [5].
n sens larg, informaia desemneaz un element nou,
necunoscut anterior. n sens restrns informaia poate fi definit
ca o msur a incertitudinii nlturat prin realizarea unui
eveniment dintr-un set de evenimente posibile [5].
6

O informaie este o dat creia i s-a asociat o semnificaie.
Spre exemplu, valoarea 3, care este o dat memorat n
calculator, poate reprezenta ntr-un caz numrul de obiecte dintr-
un ir, iar n alt caz preul unui produs.
Calculatorul este sistemul fizic care prelucreaz datele
introduse ntr-o form prestabilit i furnizeaz rezultate fie ntr-o
form accesibil utilizatorului, fie ca semnale destinate acionrii
unor echipamente [5].
n funcie de modul de reprezentare a datelor exist:
calculatoare numerice, unde datele sunt codificate
numeric;
calculatoare analogice, unde pentru codificare se
utilizeaz elemente de tip continuu;
calculatoare hibride, care mbin elemente de tip numeric
cu elemente de tip continuu.
n acest curs ne referim la calculatoarele numerice.
Principalele clase de calculatoare numerice sunt cele IBM i
compatibile IBM (reunite generic sub denumirea de PC
1
-uri) i
calculatoarele MacIntosh (iMac). Atunci cnd un calculator face
parte dintr-o reea, acesta se numete staie de lucru sau server de
reea, dup rolul pe care l ndeplinete n cadrul reelei.
Dup manevrabilitate, calculatoarele sunt:
staionare (sau de tip desktop) sau
portabile.
Principalele tipuri de calculatoare portabile sunt:
calculatoarele laptop, notebook, palmtop (PDA
2
), handheld i alte
aparate "inteligente. Caracteristicile acestora se refer la:
puterea de calcul, portabilitate (dimensiuni, greutate, durata de
via a bateriilor), conectivitate i fiabilitate (condiii de utilizare
mobil, medii critice, rezistena la ocuri mecanice).
Informatica este tiina pluridisciplinar avnd ca scop
proiectarea, dezvoltarea i exploatarea unor tehnici i sisteme,
pentru organizarea, memorarea i distribuirea mai eficient a
informaiei.

1
engl.PersonalComputers
2
PersonalDigitalAssistant
7

Evoluia mainilor de calcul - scurt istoric
Ideea efecturii calculelor cu ajutorul unor dispozitive nu
este de dat recent. Astfel, abacul, unul din primele dispozitive
de calcul realizat de om i care este folosit i astzi, este cunoscut
din timpul civilizaiilor antice, greac i roman. Stocarea datelor
se face n cazul abacului manual prin poziionarea unor bile pe
srmele unui cadru dreptunghiular, iar rezultatele se obin prin
observarea poziiilor finale ale bilelor.
Mult mai trziu apare ideea reprezentrii datelor cu ajutorul
unor roi dinate. Valorile de intrare se marcau manual prin
poziionarea corespunztoare a roilor, se declana angrenajul de
roi dinate i la oprire se interpretau poziiile finale ale roilor.
Legat de aceast tehnologie, cele mai importante nume sunt:
Blaise Pascal (1623-1662, francez), Gottfried Wilhem Leibniz
(1646-1716, german), Charles Babbage (1792-1871, englez).
Spre deosebire de inveniile predecesorilor si, maina
inventat de Babbage tiprea rezultatele direct pe hrtie, evitnd
astfel erorile de transcriere. n 1801, Joseph Jacquard (Frana), un
productor de rzboaie de esut, avusese ideea de a comanda
paii pe care trebuia s-i realizeze maina pentru a realiza un
anumit model de estur folosind perforaiile de pe cartelele de
hrtie. Babbage aplic aceast idee n cazul mainii sale de
calcul: paii algoritmului nu mai sunt integrai n structura
mainii, ci sunt preluai de pe cartele perforate. n felul acesta,
funcie de configuraia perforaiilor, maina lui Babbage putea s
execute diferii algoritmi. Ideile folosite de Babbage n
construcia mainii sale, cum ar fi tiprirea rezultatelor i mai
ales memorarea pailor algoritmilor vor fi folosite i mai trziu,
n epoca modern a calculatoarelor.
La recensmntul efectuat n 1890 n S.U.A., Herman
Hollerith (1860-1929) utilizeaz pentru memorarea datelor
cartelele perforate, fapt ce reduce spectaculos timpul de
procesare a informaiilor. Legat i de rezultatele obinute de
Hollerith, n 1924 apare compania IBM (International Business
Machine Corporation), care va juca un rol important n evoluia
tehnicii de calcul pe plan mondial. n 1940, George Stibitz
construiete la Bell Laboratories o main de calcul electronic.
Patru ani mai trziu, n 1944, Howard Aiken de la Universitatea
din Harvard construiete calculatorul Mark I, care utilizeaz relee
mecanice comandate electronic. Primul calculator electronic
8

bazat pe tuburi electronice este considerat a fi ENIAC
(Electronic Numerical Integrator And Calculator) construit de
John Mauchly i J. Presper Eckert, de la Universitatea din
Pensylvania, n perioada 1942-1945.
Unii cercettori ai istoriei evoluiei calculatoarelor consider
c prima main care folosete integral n construcia sa elemente
electronice este calculatorul construit de John Atanasoff i de
asistentul su Clifford Berry n perioada 1937-1941.
Revenind la ENIAC, se poate spune c, fa de
calculatoarele din ziua de azi, era un gigant care se mica ns
foarte lent. Avea n structura sa aproape 20 000 de tuburi
electronice, ocupa 160m
2
i avea o greutate de aproximativ 30
tone. Viteza de calcul putea ajunge pn la 5000 de adunri pe
secund. O problem dificil era introducerea datelor i a
programului. Aceast activitate dura mai multe zile i se fcea cu
ajutorul fielor celor 40 de panouri special construite n acest
scop.
Matematicianul american de origine german John von
Neumann public n 1946, n SUA proiectul primului calculator
cu prelucrare secvenial a instruciunilor i datelor, memorate
mpreun ntr-o zon special numit memoria calculatorului.
Aceste principii folosite de von Neumann au stat la baza
dezvoltrii calculatoarelor moderne. Prima aplicare a acestor
principii este datorat profesorului M. Wilkes de la Universitatea
Cambridge din Anglia, care n 1949 a construit primul calculator
cu program stocat ntr-o memorie cu ntrziere, calculator ce a
primit numele EDSAC (Electronic Delay Storage Automatic
Calculator).
Perioada care a urmat este mprit n etape de evoluie
cunoscute sub numele de generaii de calculatoare. Prezentm n
continuare limitele (aproximative n timp) ale fiecrei generaii,
precum i caracteristicile sale principale.
Generaia I de calculatoare este cuprins ntre anii 1946-
1958 i folosete drept tehnologie de baz tuburile electronice.
Alte caracteristici ale acestor calculatoare sunt:
memorie de capacitate redus i timp de acces mare;
vitez de calcul redus (maxim 10
4
operaii/sec);
se programeaz n cod main i n limbaje de asamblare.
9

Generaia a II-a de calculatoare este localizat n timp ntre
anii 1958-1964 i se bazeaz pe tehnologia tranzistoarelor i a
diodelor semiconductoare. Caracteristicile de baz ale acestei
generaii de calculatoare sunt:
memorie intern cu capacitate sporit i timp de acces
mai redus;
vitez de calcul sporit (maxim 10
5
operaii/sec);
apar limbajele de programare: FORTRAN (FORmula,
TRANslator), COBOL (Common Business Oriented
Language) i ALGOL (ALGOrithmic Language);
apar sistemele de operare.
Generaia a III-a de calculatoare se ntinde de-a lungul
perioadei 1964-1981 i are la baz tehnologia circuitelor
integrate. Printre caracteristicile celei de-a III-a generaii
amintim:
volum redus, capacitate mare de memorare;
viteza de calcul mare (10
6
adunri/sec) ;
se dezvolt limbajele de programare de nivel nalt: PL/1,
Pascal, LIST, Basic etc. i de nivel mediu (limbajul C).
Generaia 3.5 - 4 acoper perioada 1982-1989 i se bazeaz
pe tehnologia circuitelor integrate pe scar larg i foarte larg
(pn la un milion de tranzistoare pe circuit integrat).
Concomintent cu progresele obinute n domeniul
tehnologiei folosite, se dezvolt puternic componentele logice de
baz ale calculatorului. Astfel, n preul unui calculator, costul
software-ului crete sensibil n raport cu costul datorat hardware-
ului. Se dezvolt modul de lucru interactiv, sistemele de gestiune
a bazelor de date, apar limbajele de programare concurente.
Generaia a V-a de calculatoare cuprinde perioada 1980-
1990 i se remarc att prin progrese tehnologice deosebite (grad
ridicat de minituarizare datorat circuitelor integrate pe scar
foarte larg, viteze de ordinul miliardelor de operaii pe secund,
memorii externe de ordinul Gigaocteilor la preuri tot mai mici),
ct i prin dezvoltarea impresionant a elementelor de inteligen
artificial. Acest lucru a permis apariia unor limbaje specializate
(de exemplu PROLOG PROgramare LOGic) i elaborarea mai
eficient a unor sisteme expert care imit modul de raionament
10

al experilor umani.
Generaia a VI-a de calculatoare se dezvolt n prezent i
are la baz rezultatele obinute n optoelectronic i mai ales
bioelectronic.
Test de autoevaluare
1.1. Care este deosebirea dintre date i informaii?
1.2. Care dintre urmtoarele sunt clasificri valide ale
calculatoarelor?
a. calculatoare numerice, analogice i portabile;
b. calculatoare numerice, analogice i hibride;
c. calculatoare staionare i portabile.
Arhitectura calculatoarelor
Calculatorul, ca sistem fizic destinat implementrii i
prelucrrii automate a unor modele logico-matematice are la baz
trei tipuri de resurse:
resurse fizice (procesoare, memorie, dispozitive de
intrare-ieire) numite resurse hardware;
resurse logice (sisteme de operare, programe utilitare,
programe utilizator) numite resurse software;
resurse informaionale (date organizate i memorate pe
supori de memorie extern).
Funcionarea calculatorului devine posibil prin activarea
unui anumit tip de conexiuni existente ntre unitile sale cu
destinaie special numite uniti funcionale. Arhitectura unui
calculator cuprinde reprezentarea unitilor sale funcionale i a
legturilor dintre ele. Exist diverse tipuri arhitecturale, funcie
de o serie de criterii care iau n calcul aspecte privind timpul i
costul prelucrrilor, necesitile de prelucrare i transmitere a
datelor, tipul problemelor care sunt rezolvate etc.
Arhitectura clasic (serial) e reprezentat de sistemul de
calcul monoprocesor sau maina de calcul John von Neumann.
11

La modul cel mai general, un sistem de calcul von Neumann
are la baz urmtoarele uniti funcionale:
mediu de intrare unitate de intrare (UI);
mediu de ieire unitate de ieire (UE);
memorie unitate de memorie (UM);
ansamblu de prelucrare unitate aritmetic i logic
(UAL) sau unitate de execuie;
element de comand i control unitate de comand i
control (UCC).
Unitatea de intrare (UI) preia sub controlul unitii de
comand i control informaia de la diverse dispozitive
(periferice) de intrare, o aduce la forma standard de reprezentare
i o transfer n unitatea de memorie. Informaia poate fi
reprezentat de date sau instruciuni de executat. Exemple de
dispozitive de intrare: tastatur, mouse, scanner, creion optic etc.
Unitatea de ieire (UE) preia sub controlul UCC informaia
din memorie i o transfer ntr-o form adecvat dispozitivelor
periferice de ieire: videomonitor, imprimant, boxe audio etc.
Unitatea de memorie (UM) are rolul de stocare primar i
secundar n locaii (celule) de memorie - identificabile dup
adrese - date de intrare, seturi de instruciuni destinate execuiei
(programe) i rezultate ale execuiei acestora.
Memoria RAM
3
este o memorie volatil, care i pierde
coninutul la ntreruperea alimentrii cu energie electric a
calculatorului. De exemplu, datele nscrise ntr-un document
nainte de salvare sunt pstrate n memoria RAM a calculatorului.
Odat cu salvarea documentului, datele sunt transferate pe un
dispozitiv de stocare de tip memorie ROM
4
, care este o memorie
nevolatil, adic i pstreaz coninutul i dup ncetarea
alimentrii cu energie electric a calculatorului.
Unitatea aritmetic i logic (UAL) permite efectuarea unor
operaii aritmetice sau logice conform instruciunilor
programului.
Citirea instruciunilor din memorie, decodificarea lor i

3
RandomAccessMemorymemoriecuaccesaleator
4
ReadOnlyMemory
12

transmiterea semnalelor de comand pentru execuia lor, ctre
UAL sau unitile de intrare-ieire (I/O), precum i controlul
bunei funcionri a ntregului sistem de calcul, cad n sarcina
unitii de comand i control (UCC). Unitatea de comand i
control (UCC) mpreun cu unitatea aritmetic i logic (UAL)
formeaz unitatea central de prelucrare (UCP) sau procesorul
calculatorului. Procesorul mpreun cu unitatea de memorie
alctuiesc unitatea central a calculatorului (UC).
ntre elementele funcionale de baz ale calculatorului exist
ci de comunicaie care permit circulaia informaiei reprezentat
prin adrese, date de prelucrat, comenzi. Din punct de vedere
funcional, sistemul de calcul John von Neumann se poate
reprezenta sub forma schemei din Figura 1.1.



Figura 1.1. Arhitectura mainii de calcul John von Neumann

Modul de funcionare al acestui tip de calculator se poate
rezuma astfel. Datele n forma lor primar (neprelucrat) precum
i programul sunt preluate cu ajutorul dispozitivelor de intrare,
aduse la forma standard de reprezentare i transferate n memorie
unde sunt memorate n locaii identificabile prin adrese. Fiecare
instruciune a programului este preluat de UCC, care decodific
operaia ce trebuie executat, trimite UAL comanda
corespunztoare i solicit memoriei transferul ctre UAL a
datelor aflate la adresele specificate n instruciune. UAL execut
operaiile cerute i depune sub controlul UCC rezultatele
temporar n memorie sau le transmite dispozitivelor de ieire.
Prezentm mai jos arhitectura unitii de memorie.

Arhitectura unitii de memorie (UM)
Memoria calculatorului poate fi privit ca un ansamblu de
UI UE
UM
UA UC
procesor
UC
13

locaii de memorie identificabile prin adrese. Se spune c
memoria este adresabil.
Componenta fizic de baz n construcia memoriei o
reprezint bistabilul element care poate lua doar dou stri
stabile. Strile bistabililor se asociaz n mod tradiional cu
cifrele binare 0 sau 1 numite i bii pluralul termenului bit
(binary digit
5
). n calculatoare, bistabilii se realizeaz cu ajutorul
inelelor de ferit sau cu circuite integrate, iar cele dou stri
corespund perechii de tensiuni (0V, 5V). Ca exemple de bistabili
enumerm perechile de stri: perforat-neperforat, stins-aprins,
magnetizat-nemagnetizat. Prezena bistabililor n construcia
memoriei a impus codificarea binar a informaiei n calculator.
O locaie de memorie poate fi privit ca o succesiune de
bistabili, iar la nivel formal ca o configuraie binar (succesiune
de bii). Prin urmare, pe m bii consecutivi se pot reprezenta 2
m

configuraii binare diferite.
Bitul reprezint cea mai mic unitate de date care poate fi
reprezentat i prelucrat de calculator. Pentru exprimarea unui
bit se folosete litera b.
O succesiune de 8 bii formeaz un octet (sau byte). Acesta
este cea mai mic unitate de date adresabil. Pentru exprimarea
unui byte se folosete litera B.
Multiplii folosii n exprimarea capacitii memoriei sunt:
Kilo, Mega, Giga, Tera, Peta, Exa, Zetta i Yotta:
1 Kilo byte (KB) = 1024 bytes (2
10
bytes)
1 Mega byte (MB) = 1024 KB (2
20
bytes)
1 Giga byte (GB) = 1024 MB (2
30
bytes)
1 Tera byte (TB) = 1024 GB (2
40
bytes)
1 Peta byte (PB) = 1024 TB (2
50
bytes)
1 Exa byte (EB) = 1024 PB (2
60
bytes)
1 Zetta byte (ZB) = 1024 EB (2
70
bytes)
1 Yotta byte (YB) = 1024 ZB (2
80
bytes)
Dei pentru msurarea capacitii memoriei i a dimensiunii
fiierelor multiplii unitilor sunt puteri ale lui 2 (deoarece se

5
care n traducere din limba englez semnific cifr binar
14

lucreaz n sistem binar), pentru vitezele de transfer al
informaiei, se obinuiete s se foloseasc multipli care nu mai
sunt puteri ale lui 2, ci ale lui 10 [3]:
1 Kilo bit pe secund (Kbps) = 1 000 bps (10
3
bps)
1 Mega bit pe secund (Mbps) = 1 000 000 bps (10
6
bps)
1 Giga bit pe secund (Gbps) = 1 000 000 000 bps (10
9
bps)

Aadar, un fiier de 1 MB memoreaz 1024 (2
10
) octei de
informaie, ns o linie de comunicaie de 1Mbps transmite
1 000 000 (10
6
) bii pe secund.

Doi, trei sau patru octei consecutivi formeaz un cuvnt.
Lungimea cuvntului difer de la un tip de calculator la altul.
Reprezentarea n memorie a informaiei se realizeaz la nivel de
cuvnt sau de multipli ai acestuia.
Accesul la o locaie de memorie se face pe baza adresei sale.
Dac adresa se formeaz pe o configuraie de m bii, se poate
explora un spaiu de adresare n memorie de 2
m
cuvinte.
Timpul de acces reprezint timpul scurs de la cererea unei
date din memorie pn la obinerea acesteia. Accesul la o locaie
de memorie este aleator (direct), iar timpul de acces este
aproximativ acelai pentru orice locaie.
Transferul informaiei n memorie se numete scriere, iar
extragerea datelor din memorie se numete citire. Executarea
unei operaii de citire-scriere se poate face doar cunoscnd adresa
locaiei de memorie implicate.
Descriei pe scurt arhitectura unitii de memorie.

Unitile de stocare a datelor sunt formate din:
mediile de stocare (suporturile fizice)
+
interfeele de comunicare ale acestora cu UC,
mpreun cu protocoalele logice aferente.
15

Principalele medii de stocare sunt:
harddisc-urile,
memoriile flash (stick memory),
discurile optice i discurile magneto-optice,
dischetele (floppy disk),
benzile magnetice,
memoriile holografice,
memoriile moleculare.
Interfeele (controller-ele) unitilor de stocare gestioneaz
schimbul de informaie ntre UC i unitile de stocare.
Arhitecturile de baz sunt:
IDE
6
, numit mai trziu ATA
7
i apoi PATA (parallel
ATA) pentru a o distinge de SATA (serial ATA). Are o
lime de 16 bii i permite dou dispozitive pe fiecare
canal.
EIDE
8
, cu rate de transfer de 4-16.6 MB/s, poate suporta
dispozitive de stocare de pn la 8.4 GB (Fast ATA sau
Fast IDE sau ATA-2). ATA-3 sau Ultra ATA suport
transferuri de 33 MB/s.
SATA
9
, cu rate de transfer de 3 Gb/s per dispozitiv,
permite ndeprtarea sau adugarea de dispozitive n
timpul operrii. SATA 300 de exemplu asigur o vitez
de transfer de 300 MB/s.
SCSI
10
folosete comunicarea paralel i ofer o lime de
band maxim per dispozitiv de 320 MB/s i rate de
transfer de pn la 80 MB/s, mai mari dect alte porturi
seriale i paralele.
SAS
11
, o generaie mai nou de protocoale de comunicare
serial, creat pentru a permite viteze mai mai de transfer
al datelor, compatibil cu SATA. Ofer o vitez de transfer

6
IntegratedDriveElectronics
7
AdvancedTechnologyAttachment
8
EnhancedIDE
9
SerialAdvancedTechnologyAttachment
10
SmallComputerSystemInterface
11
SerialAttachedSCSI
16

de 375 MB/s i permite 4 dispozitive pe fiecare canal.

Mediul de stocare este suportul (detaabil) de memorare, iar
unitatea de stocare aferent este, din punct de vedere fizic,
ntregul ansamblu care asigur memorarea. Denumirea unitii de
stocare include termenul drive pe lng numele mediului de
stocare pe care l suport. De exemplu:
Mediu de stocare Unitate de stocare
HD (Harddisk) HDD (Harddisk Drive)
CD-ROM CD-ROM Drive
Caracteristicile mediilor de stocare sunt: tipul interfeei
suportate (IDE, SCSI etc.), viteza maxim (teoretic) de
citire/scriere a informaiei, capacitatea, timpul de acces,
fiabilitatea i viteza de acces (n rotaii pe minut).
Enumerai principalele medii de stocare a datelor.
n continuare se vor prezenta mai detaliat mediile de stocare
(suporturile de memorie) dup principiul de memorare.
Suporturile magnetice sunt dischetele, harddisc-urile i
memoriile RAM magnetorezistive (MRAM) i sunt suporturi
nevolatile.
Suporturile optice sunt de asemenea suporturi nevolatile.
Acestea se clasific astfel:
Discuri read only (care pot fi doar citite, nu i scrise):
- CD-ROM (Compact Disk)
- DVD-ROM (Digital Video Disk sau Digital
Versatile Disk)
- BD-ROM (Blu-ray Disk)
Discuri write once (care pot fi scrise numai o dat):
- CD-R, DVD-R, DVD+R, BD-R
Discurile rewritable (renregistrabile):
- CD-RW, DVD-RW, DVD+RW, DVD-RAM, BD-
RE
Discuri UDO (Ultra Density Optical), similare n
17

capacitate cu BD-R sau BD-RE, dar folosite la stocarea
teriar sau off-line. Ofer un timp de acces de 35 ms, o
capacitate de 60-120 GB (chiar 500 GB pe discuri de 13.3
cm n diametru) i au durat de via de aprox. 50 de ani.
Etichetele suporturilor optice conin: tipul suportului, viteza
de scriere/citire, capacitatea, numrul de fee utile i numrul de
straturi. Un disc etichetat SS (Single Side) are o singur fa util,
unul etichetat DS (Double Side) are dou fee utile, unul SL
(Single Layer) un singur strat, iar unul DL (Double Layer) dou
straturi.
Capacitatea, de exemplu, a unui disc optic de 8 cm diametru
etichetat DVD-1 SS SL este de 1.46 GB, iar a unuia de 12 cm
diametru etichetat DVD-18 DS DL este de 17.08 GB.
Viteza (teoretic) de transfer a informaiei se eticheteaz sub
forma 10x, 14x etc., raportat la o vitez standard 1x, care n cazul
discurilor de tip CD este de 150 kB/s. Pentru discurile de tip
DVD, viteza de scriere 1x este 1350 kB/s.
Generaiile de suporturi optice sunt urmtoarele:
I. CD, discuri laser, discuri magneto-optice;
II. DVD, DVD-Audio, DualDisc, Digital Video Express
(DIVX), Super Audio CD, Video CD, Universal Media
Disc;
III. BD, BD-RE (cu o capacitate de 50 GB pe un strat
dublu), Forward Versatile Disc, Digital Multilayer
Disk sau Fluorescent Multilayer Disc, UDO;
IV. Holographic Versatile Disc (HVD, cu o capacitate de
3.9 TB, care echivaleaz cu cea a 5 800 de CD-ROM-
uri) i Protein-coated disc (cu o capacitate de 50 TB).
Ce sunt unitile de stocare a datelor i care este relaia
acestora cu unitatea de memorie? Dar cu suporturile fizice de
memorare?
* * *
Reamintim c unitatea de comand i control (UCC)
mpreun cu unitatea aritmetic i logic (UAL) formeaz
unitatea central de prelucrare (UCP), reprezentat de procesorul
calculatorului (microprocesor). Puterea de calcul a unui
18

microprocesor se msoar n MIPS
12
sau n FLOPS
13
i este
determinat de: lrgimea magistralelor de date i a magistralelor
de adrese (numr de bii), de tipul soclului utilizat, de viteza
maxim de lucru (msurat n Hz), de capacitatea maxim de
memorie pe care o poate accesa i de tehnologia de fabricaie
14

(msurat n microni, m).
Care sunt unitile funcionale care alctuiesc
arhitectura unui calculator serial?

Calculatorul serial este construit dup principiile stabilite de
John von Neumann. Conform acestor principii, calculatorul este
alctuit din cele cinci uniti funcionale (unitatea de intrare,
unitatea de ieire, unitatea de memorie care conine programul i
datele, unitatea aritmetic i logic, unitatea de comand i
control). Calculatorul serial are un singur procesor care execut o
singur instruciune la un moment dat.
Viteza de lucru a procesoarelor actuale este de peste 10
9

operaii pe secund i, evident, se doresc viteze i mai mari. Se
apreciaz ns c limita fizic a numrului de operaii este n jur
de 10
10
operaii pe secund. Acest rezultat este impus de limita
vitezei de propagare a semnalului electric, care este de
aproximativ un metru ntr-o nanosecund (10
-9
secunde). Pragul
de 10
10
operaii pe secund ar putea fi depit numai dac s-ar
micora foarte mult dimensiunea componentelor calculatorului,
lucru practic imposibil, deoarece unele componente ale
calculatorului nu pot avea dimensiuni sub ordinul milimetrilor.
Alternativa la aceast situaie o reprezint folosirea mai
multor procesoare n construcia unui calculator. Aceast idee a
prins contur n jurul anilor 1970. Abandonarea principiului lui
John von Neumann un singur procesor care execut o singur
instruciune la un moment dat a nsemnat de fapt apariia
calculatorului paralel.
Calculatorul paralel reprezint o colecie de procesoare, de
obicei de acelai tip, interconectate ntr-o anumit reea care
permite coordonarea activitilor lor i schimbul de date.

12
MillionInstructionsperSecondmilioanedeinstruciunipesecund
13
FloatingOperationsperSecondoperaiinvirgulmobilpesecund
14
dimensiuneacomponenteielementareaprocesorului
19

Distanele dintre procesoare sunt reduse, iar ntreg ansamblul
obinut contribuie la rezolvarea unor probleme de regul dificile
sau/i de dimensiuni mari. Aceste caracteristici sunt eseniale
pentru a deosebi un calculator paralel de un sistem distribuit.
Astfel, dei un sistem distribuit este vzut tot ca o colecie
de procesoare, diferena este c, n acest caz, ele sunt distribuite
pe o arie geografic mare, sunt de obicei de tip diferit, iar scopul
urmrit este utilizarea n comun a resurselor disponibile, precum
i colectarea i transmiterea informaiilor.
Eficiena calculatorului paralel se datoreaz procesrii
paralele a datelor. Acest lucru permite reducerea timpului de
rezolvare a unei probleme utiliznd procesoare cu viteze nu
foarte mari i n consecin ieftine. Din acest motiv, un calculator
paralel nu este neaprat mai scump dect unul serial. n ciuda
acestei realiti i a faptului c la ora actual cel puin 25 de mari
companii produc calculatoare paralele, totui, penetrarea lor pe
piaa calculatoarelor este destul de slab. Motivul esenial l
constituie tehnologia software relativ primitiv a calculatoarelor
paralele. De-a lungul timpului fondurile pentru cercetare n
software au vizat n special sectorul calculatoarelor seriale. Un
software eficient pentru un calculator serial nu este obligatoriu
eficient i pentru calculatoare paralele. Crearea unor biblioteci
performante de software destinat calculatoarelor paralele necesit
timp i bineneles fonduri.
Calculatoarele Cray i Ciber (aprute n anii 1970) s-au
numrat printre primele calculatoare din lume care au utilizat
paralelismul. Ele au la baz un procesor vectorial care
implementeaz tehnica pipeline. Originea termenului pipeline o
gsim n industria petrolier, unde desemneaz o linie de selecie
pentru hidrocarburile dintr-un produs petrolier de baz. Aceast
tehnic este asemntoare cu ansamblarea unui produs pe o
band rulant: la fiecare unitate de timp fiecare diviziune de
operaii este n lucru.
Urmeaz apoi o dezvoltare rapid de noi generaii de
supercalculatoare care cunosc mbuntiri substaniale: dispar
buffer-ele (zonele tampon) de mare vitez, o parte din memorie e
distribuit ntre procesoare, iar o parte este accesibil tuturor
unitilor, se imagineaz i se pun n practic noi modaliti de
interconectare a procesoarelor etc.
20

Calculatoarele paralele i gsesc utilitatea mai ales n
rezolvarea problemelor care necesit soluii rapide sau sunt de
dimensiuni mari. Iat cteva exemple: probleme de procesarea
imaginilor, probleme de modelare i simulare (de exemplu
simularea numeric a zcmintelor de petrol), probleme de
previziune a fenomenelor meteorologice etc.
Dai o scurt definiie a calculatorului paralel.
Care sunt avantajele unui calculator paralel?
Motivai de ce, n ciuda performanelor, calculatoarele
paralele nu cunosc o rspndire aa de mare ca mainile de calcul
seriale.
Clasificarea sistemelor paralele se poate face dup mai
multe criterii cum ar fi: numrul de procesoare, viteza de lucru a
procesoarelor, mecanismul de control al sistemului, modul de
organizare al memoriei, topologia dispunerii procesoarelor.
n legtur cu numrul de procesoare apare termenul de
granulaie. Granulaia poate fi:
fin - aproximativ 1000 de procesoare, fiecare tratnd
date puine;
grosier - aproximativ 16 procesoare care trateaz multe
date;
medie - aproximativ 64 de procesoare.
O modalitate clar de a clasifica calculatoarele paralele o
datorm lui Flynn (1966). Conform acestei clasificri exist patru
categorii de calculatoare paralele [4]:
SISD (Single Instruction Single Data) - un singur set de
instruciuni i un singur set de date (calculatorul serial) ;
SIMD (Single Instruction Multiple Data) un singur set
de instruciuni i mai multe seturi de date;
MISD (Multiple Instruction Single Data) mai multe
seturi de instruciuni i un singur set de date;
MIMD (Multiple Instruction Multiple Data) mai multe
21

seturi de instruciuni i mai multe seturi de date.
Ce este arhitectura unui calculator?
Test de autoevaluare
1.3. Ce fel de resurse se afl la baza funcionrii
calculatoarelor ?
a. resurse fizice, logice i informaionale;
b. resurse hardware, software i informaionale;
c. resurse fizice, software i informaionale.
1.4. Ce tipuri arhitecturale cunoatei ?
1.5. Enumerai cteva domenii n care i gsesc utilitatea
calculatoarele paralele.
1.6. Care este clasificarea lui Flynn?
1.7. Ci bii poate memora un CD-ROM cu capacitatea de
700 MB ?

Sisteme de operare
Sistemul de operare este o interfa ntre componenta
hardware i utilizator, reprezentat prin programele sale, numite i
programe de aplicaie. Mai precis, un sistem de operare este un
ansamblu de programe de control care ghideaz un calculator n
executarea sarcinilor sale i asist programele de aplicaie i
utilizatorul prin intermediul anumitor funciuni [7]. Rolul
sistemului de operare ca interfa om-calculator este evideniat n
figura de mai jos (Figura 1.2).

Figura 1.2. Sistemul de operare ca interfa om-calculator [7]

Hardware
Sistem de
operare
Programe de
aplicaie
Utilizator
22

Un sistem de operare este alctuit din dou categorii de
programe:
programe de comand i control;
programe de servicii.
Programele de comand i control coordoneaz i
controleaz toate funciile sistemului de operare. Principalele
componente ale sistemului de programe de comand i control
sunt [7]:
supervizorul
sistemul de gestiune a intrrilor/ieirilor.
Sarcinile supervizorului sunt urmtoarele:
coordoneaz toate componentele sistemului de operare;
planific, lanseaz i urmrete execuia programelor;
depisteaz i trateaz evenimentele care apar la execuie.
Rutinele de baz sau frecvent folosite, ale supervizorului,
sunt rezidente n memoria intern. Celelalte sunt tranziente, adic
sunt stocate n memoria auxiliar i ncrcate la nevoie n
memoria intern.
Sistemul de gestiune al intrrilor/ieirilor coordoneaz
modul de afectare al dispozitivelor periferice programelor,
precum i transferul datelor dintre dispozitivele de intrare/ieire
i memorie.
Cea de-a doua component a unui sistem de operare,
programele de servicii, cuprinde [7]:
translatoare (asambloare, compilatoare, interpretoare);
editoare de legturi (linkeditoare);
ncrctoare;
editoare de text;
programe utilitare;
programe bibliotecar;
programe pentru gestiunea operaiilor de intrare/ieire
pentru fiiere i baze de date.
Deoarece sarcina de baz a unui sistem de operare este de a
23

pune la dispoziia utilizatorului mijloace prin care s poat crea,
stoca, prelucra, regsi i distruge informaia, funciile sale de
baz urmresc realizarea acestor obiective.
Dai o definiie scurt a sistemului de operare.
Prezentm mai jos lista funciilor de baz ale unui sistem
de operare [7]:
pregtirea i lansarea n execuie a programelor de
aplicaie;
alocarea resurselor necesare executrii programelor;
planificarea execuiei lucrrilor dup anumite criterii,
cum ar fi: timp de execuie, prioriti etc.;
folosirea utilitarelor pentru crearea unor faciliti de
sortare (ordonare), creare biblioteci de programe,
catalogare (depunere programe n bibliotec) etc.;
coordonarea execuiei mai multor programe, crearea unor
faciliti de depanare etc.;
asistarea execuiei programelor de aplicaie folosind
posibilitile de comunicare om - calculator.
Exist patru tipuri de sisteme de operare [7]:
secveniale;
cu multiprogramare;
cu prelucrare multipl;
n timp real.
n sistemele de operare secveniale (batchprocessing)
prelucrarea programelor se face serial. Execuia programului
poate s nceap numai dup ce a fost ncrcat complet n
memorie mpreun cu datele. Din acest motiv gradul de ocupare
al procesorului este mic n raport cu timpul total folosit pentru
execuia programului (pentru cteva secunde de folosire a unitii
centrale se pierd mai mult de 5 minute).
Sistemele de operare cu multiprogramare (multi
programming) au aprut tocmai din nevoia de a mri gradul de
utilizare al procesorului. n acest scop, n memoria partajat
corespunztor pot fi ncrcate mai multe programe. Execuia lor
24

se realizeaz prin multiplexarea unitii centrale. Dac, de
exemplu, n timpul execuiei programului P1, se solicit o
operaie de intrare/ieire, se execut o ntrerupere I/O
(Input/Output), iar procesorul va continua s execute instruciuni
ale unui alt program P2 i aa mai departe. Acest tip de execuie
(programare concurent) este, evident, mai eficient din punct de
vedere al gradului de utilizare al procesorului, iar viteza cu care
se execut programele creeaz percepia execuiei lor simultane.
Gestiunea corect a memoriei partajate, a accesului programelor
la resurse (memorie, procesor, uniti de intrare/ieire) sunt doar
dou din problemele majore care apar n plus la aceste tipuri de
sisteme de operare.
Sistemele de prelucrare multipl se implementeaz pe
calculatoarele cu mai multe procesoare (calculatoare paralele).
Mai multe procesoare pot executa simultan acelai program dac
este descompus n mai multe sarcini (multitasking).
Sistemele de operare n timp real se folosesc pentru
conducerea operativ a unor dispozitive ai cror parametrii se
modific continuu.
Exemple de sisteme de operare sunt: UNIX, Windows,
Linux, MS-DOS i MacOS.
Enumerai i caracterizai tipurile de sisteme de operare.
Enumerai funciile de baz ale unui sistem de operare.

Fazele execuiei unui program
Programul poate fi privit ca o unitate de operare. Indiferent
n ce limbaj este scris, pentru a fi executat, programul trebuie
translatat (tradus) n cod-main. Exist dou tipuri mari de
translatoare: compilatoarele i interpretoarele.
Modul de lucru al compilatorului este urmtorul. Se
analizeaz sintactic programul surs i se furnizeaz o list de
erori. Dup eliminarea erorilor de ctre programator, se obine
forma binar translatabil (BT) a programului. Formatul BT
nseamn un numr de module obiect fr legtur ntre ele.
Programul care realizeaz legturile dintre module este editorul
25

de legturi (linkeditorul). Se obine forma IMT (Imagine
Translatabil a Memoriei). Este forma care va fi preluat de
programul ncrctor i va fi ncrcat la o adres concret de
memorie obinndu-se formatul IMA (Imagine Absolut a
Memoriei). n aceast form programul poate fi executat.
Compilatorul limbajelor de asamblare se numete asamblor.
Fazele execuiei unui program translatat prin compilare sunt
prezentate mai jos (Figura 1.3):



Figura 1. 3. Fazele execuiei unui program translatat prin compilare

Modul de lucru al interpretorului este urmtorul. Se
analizeaz sintactic linie cu linie programul. Dac linia de
program analizat este corect din punct de vedere sintactic
atunci se i execut nainte de a trece la analiza urmtoarei linii.
Se observ c diferena esenial dintre compilator i interpretor
se refer la momentul cnd se face execuia n raport cu analiza
sintactic a programului. La compilator execuia se face dup ce
tot programul a fost translatat, la interpretor analiza sintactic a
unei linii de program este urmat obligatoriu de execuia ei.
Fiecare din cele dou metode de translatare prezint
avantaje i dezavantaje. Cnd se folosete compilatorul,
necesarul de memorie este mai mare (memoria trebuie s conin
att codul surs ct i codul obiect), dar modulele obiect rezultate
pot fi catalogate n biblioteci i folosite la nevoie.
n cazul interpretorului este nevoie de memorie relativ
puin, dar execuia programului este mai anevoioas deoarece
presupune pentru fiecare linie, la fiecare rulare, att translatarea
ct i execuia.

cod
surs
format
BT
format
IMT
format
IMA
compilator
linkeditor ncrctor execuie
26

Test de autoevaluare
1.8. Care sunt cele dou categorii de programe care
alctuiesc un sistem de operare?
1.9. Care sunt sarcinile supervizorului?
1.10. Enumerai funciile de baz ale unui sistem de operare.
1.11. Care sunt fazele de execuie ale unui program
translatat prin compilare?
Rspunsurile testelor de autoevaluare

1.1. Informaie = dat + semnificaie.
1.2. b, c
1.3. a, b, c
1.4. Arhitectura serial i arhitectura paralel.
1.5. Procesarea imaginilor, modelare i simulare, previziune
(economic, meteorologic etc.).
1.6. Clasificarea calculatoarelor paralele n categoriile:
SISD, SIMD, MISD i MIMD.
1.7. 700 MB = 700 * 8 * 1024 b.
1.8. Programele de comand i control i programele de
servicii.
1.9. Coordoneaz toate componentele sistemului de operare,
planific, lanseaz i urmrete execuia programelor, depisteaz
i trateaz evenimentele care apar la execuie.
1.10. Compilarea (sau analiza sintactic) a codului surs,
editarea legturilor ntre modulele obiect rezultate, ncrcarea
formei IMT la o adres concret de memorie i execuia
programului.

27

Lucrare de verificare ...................................................
Realizai o sistematizare a cunotinelor dobndite n aceast
unitate de nvare.

Rezumat
Calculatoarele sunt sisteme fizice care prelucreaz date
pentru a furniza rezultate fie ntr-o form accesibil utilizatorului,
fie ca semnale destinate acionrii unor echipamente.
Resursele pe care se bazeaz funcionarea calculatoarelor
sunt resurse fizice (sau hardware), logice (sau software) i
informaionale. Resursele fizice se refer la componentele
tangibile, cele software la sistemul de operare i programele de
aplicaie, iar cele informaionale reprezint materia
prelucrabil la un moment dat.
Sistemul de operare se definete ca un ansamblu de
programe de control care ghideaz calculatorul n executarea
sarcinilor i asist programele de aplicaie i utilizatorul prin
intermediul anumitor funciuni speciale. Sarcina de baz a unui
sistem de operare este de a pune la dispoziia utilizatorului
mijloace prin care acesta s poat crea, stoca, prelucra, regsi i
distruge informaia.
Unitile dedicate ale unui calculator mpreun cu
conexiunile ce se stabilesc ntre ele pentru asigurarea
funcionabilitii sale se numete arhitectur de calcul. Cele dou
mari arhitecturi de calcul sunt: arhitectura serial, clasic (sistem
de calcul monoprocesor sau main de calcul von Neumann) i
cea paralel, care presupune conlucrarea simultan a mai multor
procesoare n vederea rezolvrii sarcinilor ntr-un timp mult mai
redus.
Arhitectura serial cuprinde unitatea de intrare, unitatea de
ieire, unitatea de memorie, unitatea de execuie i unitatea de
comand i control, plus conexiunile ntre acestea prin
magistralele de adrese, de date i de comenzi.
Cea mai mic unitate de date care poate fi reprezentat i
28

prelucrat de calculator este bit-ul (o valoare binar asociat unui
bistabil). Un grup de opt bii, numit octet sau byte, este cea mai
mic unitate de date adresabil, iar reprezentarea n memorie a
informaiei se realizeaz de regul la nivel de cuvnt (care este
un grup de 2, 3 sau 4 octei consecutivi).

Bibliografie
1. J. Glenn Brookshear, Introducere n Informatic, Ed. Teora,
Bucureti, 1998.
2. Gheorghe Dodescu, Radu Mranu, Floarea Nstase,
Calculatoare Elemente fundamentale de structur. Iniiere n
utilizarea PC-urilor, Editura ALL EDUCATIONAL, Bucureti, 2000.
3. Andrew Tanenbaum, Computer Networks, fourth edition, Pearson
Education International, 2003.
4. Dana Petcu, Calcul Paralel, Editura de Vest, Timioara, 1994.
5. Tiberiu Popescu (coordonator), Dicionar de Informatic, Editura
tiinific i enciclopedic, Bucureti, 1981.
6. A. Petrescu, N. pu, T. Moisa, Gh. Rizescu, V. Hrbor, N.
Mranu, Tr. Mihu, abc de calculatoare personale i nu doar att
, Vol.I, Ed. Tehnic, Bucureti, 1990.
7. Florin Punescu, Analiza i concepia sistemelor de operare,
Editura tiinific i Enciclopedic, Bucureti, 1982.
29

UI2. Baze de numeraie.
Reprezentarea informaiei n calculator

Obiectivele unitii de nvare pag 29
Baze de numeraie pag 29
Test de autoevaluare pag 37
Reprezentarea informaiei n calculator pag 37
Test de autoevaluare pag 45
Rspunsurile testelor de autoevaluare pag 46
Lucrare de verificare pag 46
Rezumat pag 46
Bibliografie pag 47


Obiectivele unitii de nvare
- nelegerea i operarea facil cu diverse baze de
numeraie i cunoaterea principiilor de conversie a
numerelor ntregi i reale dintr-o baz de numeraie n
alta;
- cunoaterea modalitilor de reprezentare a informaiei n
calculator, dup tipul acesteia.

Durata: 4 ore
Baze de numeraie
Orice numr natural 2 > q poate fi considerat o baz de
numeraie. Cifrele n baza de numeraie q sunt 0, 1, 2, , q-1.
Baza 10 este evident cea mai cunoscut baz i are cifrele 0, 1, 2,
3, 4, 5, 6, 7, 8, 9. Datorit utilizrii bistabililor n construcia
memoriei calculatoarelor, n informatic se utilizeaz
reprezentarea numerelor n baza 2 sau puteri ale acesteia (baza 8
30

i baza 16). Rezultatele obinute n analiza matematic ne arat
c orice numr real se poate scrie ntr-o baz oarecare 2 > q sub
forma
... ... . ...
3 2 1 0 1 2 1 i n n n
a a a a a a a a a

, unde
i
a sunt
cifre ale bazei q, adic { } 1 ..., , 2 , 1 , 0 e q a
i
. n informatic,
bazele uzuale sunt 2, 8 i 16. Cifrele n baza 2 sunt {0, 1}, n
baza 8, {0, 1, 2, 3, 4, 5, 6, 7}, iar n baza 16 sunt {0, 1, 2, 3, 4, 5,
6, 7, 8, 9, A, B, C, D, E, F}.
Exemple :
- n baza 10 396.83, -25691, 48
- n baza 2 1101.11, 111001.11, 110101
- n baza 8 675.02, 0.36, -475
- n baza 16 69A, DEA.AB5, CAD.39A
Care sunt cifrele bazei de numeraie 6?
Calea cea mai simpl de conversie a unui numr dintr-o
baz n alta este utilizarea bazei 10 ca baz intermediar. Din
acest motiv, n continuare prezentm conversia numerelor din
baza 10 ntr-o baz oarecare i invers.
Conversia numerelor dintr-o baz n alta
Conversia numerelor ntregi
Conversia numerelor ntregi din baza oarecare q n baza 10
Conversia unui numr ntreg din baza oarecare q n baza 10
se face utiliznd dezvoltarea polinomial. Mai precis, dac
numrul ntreg N se reprezint n baza q sub forma
0 1 2 1
... a a a a a N
n n n q
=

atunci reprezentarea n baza 10 va rezulta din dezvoltarea
0 1
2
2
1
1 10
... a q a q a q a q a N
n
n
n
n
n
n
+ + + + + =

.
Exemple
10
0 1 2 3 4 5
2
35 2 1 2 1 2 0 2 0 2 0 2 1 100011 = + + + + + =

10
0 1 2
0 1 2
16
3028 16 4 16 13 16 11
16 4 16 16 4
= + + =
= + + = D B BD
31

Conversia numerelor ntregi din baza 10 n baza oarecare q
Pentru a nelege algoritmul de conversie dintr-o baz q n
baza 10 s considerm dezvoltarea polinomial
(1)
0 1
1
1 10
... a q a q a q a N
n
n
n
n
+ + + + =

.
Sarcina algoritmului de conversie este s identifice cifrele
0 2 1
..., , , , a a a a
n n n
, practic a numrului convertit n baza q,
0 1 1
... a a a a N
n n q
=
.
mprind relaia (1) prin q obinem:
q
a
a q a q a
q
N
n
n
n
n
0
1
2
1
1 10
... + + + + =

.
innd cont c expresia
( )
1
2
1
1 0
10
... a q a q a N
n
n
n
n
+ + + =


este ntreag, iar
q a < s
0
0
deoarece
0
a
este cifr n baza q,
rezult c
0
a
se obine ca rest al mpririi numrului
10
N
la q,
iar
) 0 (
10
N este ctul acestei mpriri. Procedm analog cu expresia
) 0 (
10
N
i obinem
( )
q
a
N
q
a
a q a q a N
n
n
n
n
1 ) 1 (
10
1
2
3
1
2 0
10
... + = + + + + =

.
Printr-un raionament similar deducem c cifra
1
a
se obine
ca rest al mpririi ctului anterior
) 0 (
10
N
la baza q.
n general, obinem n ordine cifrele
0
a
,
1
a
,
2
a
, ,
n
a

pentru fiecare pas i aplicat relaiei
( )
q
a
N
q
N
i i
i
+ =

) (
10
1
10
, n i ..., , 2 , 1 , 0 = , unde
( )
10
1
10
N N =

.
Algoritmul de conversie se termin cnd se obine ctul
) (
10
i
N
egal cu zero.
Exemple:
Convertim din baza 10 n baza 2, numerele 35 i 3028
obinute n exemplul precedent, aplicnd algoritmul descris.
32

35 2 3028 16
34 17 2 3024 189 16
1 16 8 2 4 176 11
1 8 4 2 13
0 4 2 2
0 2 1
0
Figura 2.1. Ilustrarea algoritmului de conversie a numerelor ntregi
din baza 10 n baza 2

Cifrele numerelor convertite se obin citind de la sfrit spre
nceput resturile (cifrele ncercuite). Se obin rezultatele
ateptate:
2 10
100011 35 = i
16 10
4 3028 BD = .

Conversia numerelor reale
Conversia prii ntregi a unui numr real se face dup
algoritmii prezentai mai sus. n continuare prezentm conversia
prii fracionare a unui numr real. Partea fracionar F
q
a unui
numr real pozitiv este:
... ... . 0
3 2 1 m q
a a a a F

=


Conversia prii fracionare a unui numr real pozitiv dintr-
o baz oarecare q n baza 10
Ca i n cazul numerelor ntregi, conversia dintr-o baz
oarecare q n baza 10 a unei fracii F
q
se face utiliznd
dezvoltarea sa polinomial, adic:
... ...
2
2
1
1 10
+ + + =

m
m
q a q a q a F
Exemple:
10
2 1
16
10
4 3 2 1
2
64453 . 0 16 5 10 5 . 0
6875 . 0 2 1 2 1 2 0 2 1 1011 . 0
= + =
= + + + =


A A


Conversia prii fracionare a unui numr real pozitiv din
baza 10 ntr-o baz oarecare q
Pentru a afla cifrele numrului F
10
n baza q se pornete de
33

la dezvoltarea sa polinomial, adic:
(2) ... ...
2
2
1
1 10
+ + + + =

m
m
q a q a q a F
nmulind relaia (2) cu q obinem:
... ...
1 1
2 1 10
+ + + =
+


m
m
q a q a a F q

i deci
| |
10 1
F q a =

unde prin
| | x
nelegem partea ntreag a
numrului x.
Cifra a
-2
se obine printr-un procedeu analog pornind ns de
la fracia:
... ...
1 1
2
) 1 (
10
+ + + =
+

m
m
q a q a F

Deci
| |
) 1 (
10 2
F q a =

i analog
| |
) 2 (
10 3
F q a =

,
unde,
... ...
2 2
4
1
3
) 2 (
10
+ + + =
+

m
m
q a q a q a F
i aa mai departe.
Dac exist un numr i ntreg astfel nct
) (
10
i
F
este numr
ntreg, atunci algoritmul se oprete. n caz contrar fracia este
periodic.
Exemple:
Fie numrul
64453 . 0
10
= F
. Se dorete conversia acestuia n
baza 16. Aplicm procedeul explicat mai sus i avem:
5 5 16 31248 . 0
16 64453 . 0
2
1
= =
= =

a
A a

Se obine rezultatul
16
5 . 0 A .
Considerm fracia 0.7 i dorim conversia ei n baza 4.
Obinem succesiv:
0 8 . 0 4 2 . 0
3 2 . 3 4 8 . 0
2 8 . 2 4 7 . 0
3
2
1
= =
= =
= =

a
a
a

0 8 . 0 4 2 . 0
3 2 . 3 4 8 . 0
5
4
= =
= =

a
a

Se observ repetarea rezultatelor i drept urmare obinem
fracia periodic mixt 0.2(30)
4
.
34

Convertii n bazele 2, 8, 16 numerele n baza 10:
62.845, 261.38 i 1254.2968.
Procedee de conversie rapid ntre bazele 8, 16 i baza 2
Conversia binar octal
Fiecare din cifrele bazei 8 se reprezint n baza 2 (pe baza
algoritmilor prezentai) prin configuraiile binare urmtoare,
numite triade ( Tabelul 2.1):
Tabelul 2.1. Triadele corespunztoare reprezentrii n baza 2
a cifrelor din baza 8

octal binar
0 0 0 0
1 0 0 1
2 0 1 0
3 0 1 1
4 1 0 0
5 1 0 1
6 1 1 0
7 1 1 1

Conversia rapid unui numr din octal n binar se face
scriind n locul fiecrei cifre octale triada corespunztoare.
Exemplu:
Numrul 47.36
8
se scrie n baza 2 fcnd nlocuirile:

4 cu 1 0 0
7 cu 1 1 1
3 cu 0 1 1
6 cu 1 1 0

Se obine
2 8
011110 . 100111 36 . 47 =
.


triade
35

Conversia rapid a unui numr binar n octal se face astfel:
- pentru partea ntreag se marcheaz triadele ncepnd de
la virgul spre stnga;
- pentru partea fracionar se marcheaz triadele ncepnd
de la virgul spre dreapta;
- fiecare triad este nlocuit cu valoarea corespunztoare
din baza 8.
Exemplu:
1 111 101.011 101 1
2
= 175.374
8


Conversia binar-hexazecimal
Prezentm mai jos (Tabelul 2.2) valorile cifrelor
hexazecimale n binar, numite tetrade.
Tabelul 2.2. Tetradele corespunztoare reprezentrii n baza 2
a cifrelor din baza 16

hexazecimal binar hexazecimal binar
0 0 0 0 0 9 1 0 0 1
1 0 0 0 1 A 1 0 1 0
2 0 0 1 0 B 1 0 1 1
3 0 0 1 1 C 1 1 0 0
4 0 1 0 0 D 1 1 0 1
5 0 1 0 1 E 1 1 1 0
6 0 1 1 0 F 1 1 1 1
7 0 1 1 1
8 1 0 0 0

n conversia binar-hexazecimal rolul triadelor este luat de
tetrade, iar paii algoritmului sunt identici cu cei ai conversiei
binar-octal.
Exemplu :
1111000.1110 1111
2
= 78.ED
16


Observaie. Procedeele de conversie prezentate, binar-octal
i binar-hexazecimal se fac mecanic, fr calcule, i din acest
motiv sunt foarte rapide. O alt raiune pentru care sunt preferate
36

bazele 8 i 16 bazei 2 rezult din aspectul evident al faptului c
numerele binare, datorit lungimii lor, sunt mai greu de
manipulat.

Reguli de calcul n baza 2 i baza 8
n baza 2 adunarea i nmulirea se fac conform tabelului
2.3:
Tabelul 2.3. Regulile de calcul pentru adunare i nmulire n baza 2

+ 0 1 x 0 1
0 0 1 0 0 0
1 1 10 1 0 1

La adunare se observ c apare cifra de transport (bitul 1 din
10 = 1+1).
n baza 8 tabelele pentru adunare i nmulire sunt dup cum
urmeaz (Tabelul 2.4):
Tabelul 2.4. Regulile de calcul pentru adunare i nmulire n baza 8

+ 0 1 2 3 4 5 6 7
0 0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7 10
2 2 3 4 5 6 7 10 11
3 3 4 5 6 7 10 11 12
4 4 5 6 7 10 11 12 13
5 5 6 7 10 11 12 13 14
6 6 7 10 11 12 13 14 15
7 7 10 11 12 13 14 15 16

x 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7
2 0 2 4 6 10 12 14 16
3 0 3 6 11 14 17 22 25
4 0 4 10 14 20 24 30 34
5 0 5 12 17 24 31 36 43
6 0 6 14 22 30 36 44 52
7 0 7 16 25 34 43 52 61
37

Test de autoevaluare
2.1. Care este reprezentarea n baza 2 i 16 a numerelor:
3265, 28, 293 i 526 scrise n baza 10?
2.2. Care este valoarea n baza 10 a numerelor binare:
00110101, 01110101, 00010011?
2.3. Convertii n baza 10 numerele: 0. 11101
2
, 11.010111
2
,
10.0111
2
, A3.267
16
, ABA.BA
16
.
2.4. Convertii n bazele 2, 8, 16 numrul 30.3
10
.
2.5. Convertii n baza 8 numrul 110111001.1010
2
.
2.6.Convertii n baza 2 numerele A42
16
, 148.F
16
i 331.50
8.

Reprezentarea informaiei n calculator
Reprezentarea numerelor ntregi
Reprezentarea numerelor ntregi n memoria calculatorului
se poate realiza n trei moduri:
- reprezentare n modul i semn (cod direct);
- reprezentare n complement fa de 1 (cod invers);
- reprezentare n cod complement fa de 2 (cod
complementar).
n reprezentarea n modul i semn (cod direct), bitul din
extremitatea stng este folosit pentru codificarea semnului.
Convenia este urmtoarea:
- dac numrul este pozitiv, bitul de semn trebuie s aib
valoarea 0;
- dac numrul este negativ, bitul de semn trebuie s aib
valoarea 1.
Exemplu. Cifrele 6 i 6 sunt reprezentate n binar pe 8 bii
sub forma:
0 1 1 0 0 0 0 1 6
0 1 1 0 0 0 0 0 6



Modul de reprezentare n modul i semn are urmtoarele
38

dezavantaje:
- exist dou reprezentri pentru zero. De exemplu, ntr-o
reprezentare pe 8 bii avem:
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0

+

Acest lucru creeaz probleme n realizarea circuitelor
electronice pentru adunare, deoarece:
- biii de semn trebuie tratai separat cand se efectueaz
operaii;
- trebuie definit operaia de scdere a numerelor astfel
reprezentate.
Complementul fa de 1 (cod invers) al unui numr
reprezentat n binar se obine prin nlocuirea fiecrei cifre binare
cu complementul ei fa de 1. Complementul fa de 1 al cifrei 0
este 1, iar al cifrei 1 este 0.
Exemplu. Valorile 6 i 6 sunt reprezentate n binar, pe 8
bii sub forma:
1 0 0 1 1 1 1 1 6
0 1 1 0 0 0 0 0 6



Operaia de scdere se reduce la o operaie de adunare prin
reprezentarea scztorului n cod invers. Dac rezultatul este
negativ atunci el va fi reprezentat tot n cod invers. Dac apare
transport n stnga rangului de semn aceasta se va aduna la
rangul cel mai puin semnificativ (cel mai din dreapta) al
rezultatului.
Exemple:
ntr-o reprezentare pe 8 bii operaia 6-5 se efectueaz astfel:

2 10
0 1 1 0 0 0 0 0 6 = n cod direct

2 10
1 0 1 0 0 0 0 0 5 =
n cod direct
2 10
0 1 0 1 1 1 1 1 5 = n cod invers


39

(+6) 0 0 0 0 0 1 1 0
+(-5) +1 1 1 1 1 0 1 0
1 1 0 0 0 0 0 0 0 0

+

0 0 0 0 0 0 0 1

Se observ cum transportul din stnga rangului de semn se
adun la ultimul bit.
n aceeai reprezentare pe 8 bii operaia 6-7 se efectueaz
astfel:

(+6) 0 0 0 0 0 1 1 0
+(-7) +1 1 1 1 1 0 0 0
- 1 1 1 1 1 1 1 1 0

Se observ c 1 1 1 1 1 1 1 0 este reprezentarea cifrei 1 n
cod invers pe o configuraie de 8 bii.
Observaie. i n acest tip de reprezentare se menine
dezavantajul reprezentrii valorii zero sub dou forme, ntlnit la
codul direct.
Exemplu:
(+4) 0 0 0 0 0 1 0 0
+(-4) 1 1 1 1 1 0 1 1
0 1 1 1 1 1 1 1 1

Se observ cele dou reprezentri pentru zero
0 0 0 0 0 0 0 0
i
1 1 1 1 1 1 1 1

Pentru a nelege reprezentarea n cod complementar s
scriem, de exemplu, operaia 5-3 sub forma
2 10 12 10 7 5 10 ) 3 10 ( 5 = = + = + .
Observm c rezultatul se poate obine n felul urmtor:
- se adun la desczut complementul fa de 10 al
scztorului, adic se face operaia 12 7 5 = +
40

- rezultatul final (2) se obine ignornd transportul care
apare (adic 1).
Acest exemplu sugereaz ideea ca un numr negativ n binar
s fie reprezentat n cod complement fa de 2 (cod
complementar). Complementul fa de 2 al unui numr se obine
astfel:
- se obine complementul fa de 1 al numrului;
- se adun valoarea 1 la rangul cel mai semnificativ al
numrului.
Dac apare transport la stnga rangului de semn acesta se
ignor, iar dac rezultatul este negativ aceasta este reprezentat tot
n cod complementar fa de 2.
Observaie. Folosind acest cod, zero are o unic
reprezentare.
Exemplu:
7 are valoarea 0 0 0 0 0 1 1 1 n binar
7 are codul invers 1 1 1 1 1 0 0 0
-7 are codul complementar 1 1 1 1 1 0 0 1
(+7) 0 0 0 0 0 1 1 1
+(-7) +
1
1 1 1 1 0 0 1
0 1 0 0 0 0 0 0 0 0
se neglijeaz

Se constat unicitatea reprezentrii pentru zero.
Calculatoarele moderne utilizeaz pentru reprezentarea
numerelor ntregi negative codul complementar.

Reprezentarea numerelor reale
Reprezentarea numerelor reale se poate face sub dou
moduri:
- n virgul fix;
- n virgul mobil.
41

Reprezentarea n virgul fix
n acest tip de reprezentare, virgula care desparte partea
ntreag de partea subunitar are poziie fix. De exemplu, dac
ntr-o reprezentare pe 8 bii, virgula este plasat dup 4 bii,
numrul N reprezentat n baza 2 are valorile extreme dup cum
urmeaz:
1111 . 1111 0000 . 0000
2
s s N

sau, corespunztor n baza 10,
9375 . 15 0 . 0
10
s s N
.
n cazul n care primul bit este folosit pentru codificarea
semnului, plaja de reprezentare pentru N
10
va fi:
9375 . 7 9375 . 8
10
s s N
.
Se observ c puterea de reprezentare a numerelor reale n
cazul folosirii virgulelor fixe este extrem de mic. Din acest
motiv folosirea virgulei fixe n calculatoarele moderne se face
numai dup ultimul rang, reprezentndu-se practic n aceast
manier numai numerele ntregi.

Reprezentarea n virgul mobil
n reprezentarea n virgul mobil se pornete de la un
rezultat matematic cunoscut i anume: orice numr real o poate
fi reprezentat n mod unic sub forma (numit virgul mobil
normalizat):
b
q a = o , unde 1 | | / 1 < s a q , 2 > q numr natural, b
numr ntreg.
q este baza de reprezentare,
a se numete mantis, b se numete exponent.
De exemplu, numrul 208 . 1423 = o n baza 10 are
reprezentarea n virgul mobil normalizat:
4
10 1423208 . 0 = o .
Aici b are valoarea 4, q valoarea 10, iar mantisa
1423208 . 0 = a .
Condiia
1 | | / 1 < s a q
este esenial pentru asigurarea
42

unicitii reprezentrii. Pentru 10 = q condiia se scrie
1 | | 1 . 0 < s a , ceea ce este echivalent cu faptul c prima cifr
dup virgul s fie diferit de 0. n cazul n care se renun la
aceast restricie asupra mantisei, exist o infinitate de
reprezentri echivalente. De exemplu, numrul o de mai sus se
poate scrie echivalent:
5 4 2 4
10 01423208 . 0 , 10 1423208 , 10 23208 . 14 , 10 1423208 . 0


etc.
Denumirea de virgul mobil vine tocmai de la deplasarea
virgulei, funcie de valoarea exponentului.
Pentru a aduna dou numere scrise sub form normalizat
trebuie ca ele s aib acelai exponent. Dac exponenii sunt
diferii, numrul cu exponent mai mic este scris n virgul mobil
nenormalizat astfel nct noul exponent obinut s fie egal cu cel
mai mare dintre cei doi exponeni. nmulirea se face nmulind
mantisele i adunnd exponenii.
Din cauza restriciilor privind lungimea mantisei, aritmetica
virgulei mobile difer de aritmetica obinuit.
Pentru a ilustra acest lucru, s presupunem c mantisei i se
rezerv patru cifre zecimale i s considerm exemplele:
4
4 4 3 4
10 6742 . 0
10 0210 . 0 10 6532 . 0 10 21 . 0 10 6532 . 0
=
+ = +
;
se observ c nu se pierde nici o cifr.
= + = +
4 4 4
10 0001234 . 0 10 6532 . 0 10 1234 . 0 10 6532 . 0


4 4 4
10 6533 . 0 10 0001 . 0 10 6532 . 0 = + = ;
se observ c se pierd ultimele trei cifre ale numrului
0001234 . 0 .
4 4 4 4
10 1216 . 0 10 2164 . 1 10 5632 . 0 10 6532 . 0 = =

;
se observ c se pierde ultima cifr a numrului 2164 . 1 datorit
operaiei de normalizare.
3 3 1 4
10 1371 . 0 10 137172 . 0 10 21 . 0 10 6532 . 0 = =

;
se observ c se pierd ultimele dou cifre ale numrului
0.137172.
43

n programele n care calculele au un grad ridicat de
complexitate, erorile se pot propag, iar efectul este obinerea
unui rezultat afectat de erori. Acest efect nedorit se poate
contracara prin utilizarea unor metode numerice speciale, care
inhib propagarea erorilor.
Ce se nelege prin virgul mobil normalizat?
Reprezentarea n virgul mobil se poate face sub dou
forme: reprezentarea n virgul mobil simpl precizie i
reprezentarea n virgul mobil dubl precizie.
Reprezentarea n virgul mobil simpl precizie se face pe
32 de bii i are structura:

32 31 24 23 1
S Caracteristic (c) Fracie (f)

S reprezint semnul numrului reprezentat, ocup un bit
(bitul 32), iar valorile sale au semnificaia urmtoare:
- 0 = S cnd numrul reprezentat are semnul negativ;
- 1 = S cnd numrul reprezentat are semnul pozitiv.
Caracteristica c ocup 8 bii (biii 24-31) i conine
valoarea exponentului la care se adaug valoarea 127, adic:
127 + = e c .
Folosirea acestei formule permite economisirea unui bit care
ar fi necesar pentru memorarea semnului exponentului. Zona de 8
bii destinat caracteristicii este considerat totdeauna pozitiv i
deci:
255 1 2 0
8
= s s c .
Din acest motiv, valorile minime i maxime ale
exponentului sunt 127 respectiv 128.
Cu alte cuvinte:
- dac 127 > c atunci 0 > e ;
- dac 127 < c atunci 0 > e .
Fracia (f) este reprezentat n zona biilor 1-23. Alinierea se
44

face la stnga, iar dac este cazul spaiile libere se completeaz
cu cifra zero.
Reprezentarea n virgul mobil dubl precizie se face pe
64 de bii i are structura:

64 63 53 52 1
S Caracteristic (c) Fracie (f)

Cmpurile din structur au aceeai semnificaie ca la
reprezentarea n virgul mobil simpl precizie. Difer doar
lungimea caracteristicii (11 bii) i a fraciei (52 bii). Relaia
dintre exponentul e i caracteristica c este:
1023 + = e c
i evident c are drept limite de reprezentare
2047 1 2 0
11
= s s c .
Valorile minime i maxime ale exponentului sunt 1023 i
1024, ceea ce arat o putere de reprezentare deosebit de mare n
cazul folosirii virgulei mobile n dubl precizie.

Reprezentarea caracterelor alfanumerice
Calculatoarele prelucreaz att informaie numeric, ct i
informaie nenumeric (texte). Pentru reprezentarea informaiei
numerice se folosesc algoritmii i conveniile prezentate.
Reprezentarea informaiei nenumerice (litere mari i mici,
cifre zecimale, semne de punctuaie, operatori aritmetici i logici,
simboluri pentru controlul comunicaiei i editare etc.) se face pe
baza unor coduri. Aceste coduri asociaz fiecrui semn utilizat o
configuraie binar. Pentru o mulime de m semne sunt necesare
2
n
configuraii binare unde n este cel mai mic numr natural cu
proprietatea m
n
> 2 . De exemplu, fiecare element al unei
mulimi de 30 de semne poate fi codificat utiliznd una din cele
32 2
5
= configuraii binare distincte, cu lungimea de la 5 bii. Se
observ c dou din cele 32 configuraii binare posibile nu sunt
folosite (sunt cuvinte fr sens).
Convenia de reprezentare a caracterelor alfanumerice, n
calculatoarele moderne este codul ASCII (American Standard
45

Code for Information Interchange). O configuraie binar din
codul ASCII are 8 bii (se pot codifica 256 2
8
= semne). Plajele
de reprezentare sunt urmtoarele:
0 31 : codificarea caracterelor de control.
32 127: codificarea literelor mari i mici, a cifrelor
zecimale i a semnelor speciale.
128 255: codificarea semnelor cu utilizare special.
Exist i alte coduri folosite n sistemele de calcul. Dintre
acestea amintim codul EBCDIC (Extended Binary Coded
Decimal Interchange Code).
Test de autoevaluare
2.7. Care este reprezentarea n virgul mobil normalizat a
numrului n baza 10, 207.022? Dar a numrului 0.00446?
2.8. Care este structura reprezentrii n virgula mobil
simpl precizie?
a.
64 63 53 52 1
S Caracteristic (c) Fracie (f)
b.
32 31 24 23 1
S Caracteristic (c) Fracie (f)
c.
64 63 24 23 1
S Caracteristic (c) Fracie (f)

2.9. Ce este codul ASCII?



46

Rspunsurile testelor de autoevaluare

2.1. 3265
10
= 110011000001
2
= CC1
16
, 28
10
= 11100
2
=
1C
16
, 293
10
= 100100101
2
= 125
16
, 526
10
= 1000001110
2
= 20E
16
.
2.2. 53, 117, 19.
2.3. 0.90625, 3.359375, 2.4375, 163.150146484375,
2746.7265625.
2.4. 30.3
10
= 11110.0(1001)
2
= 36.2(3146)
8
= 1E.4(C)
16.
2.5. 671.50.
2.6. 101001000010, 000101001000.1111,
001100110001.01010000
2.7. 0.207022 x 10
3
, 0.446 x 10
-2

2.8. b
2.9. Un cod de reprezentare a caracterelor alfanumerice.
Lucrare de verificare ...................................................
Realizai o sistematizare a cunotinelor dobndite n aceast
unitate de nvare.
Rezumat
Construcia memoriei calculatoarelor fiind bazat pe
utilizarea bistabililor, informaia numeric se reprezint n baza 2
sau n baze care sunt puteri ale acesteia (baza 8 i baza 16). Pe de
alt parte, valorile numerice pe care le furnizm programelor sunt
exprimate n baza 10, i tot n baza 10 solicitm rezultatele
acestor programe. Prin urmare, n operarea cu valori numerice au
loc foarte frecvent conversii n i din baza 10 n bazele 2, 8 sau
16. Aceast unitate de nvare descrie conversiile numerelor
ntregi i reale dintr-o baz de numeraie n alta i reprezentarea
n calculator a informaiilor numerice i alfanumerice.
Reprezentarea numerelor ntregi se poate realiza n trei
moduri:
47

- reprezentare n modul i semn (cod direct);
- reprezentare n complement fa de 1 (cod invers);
- reprezentare n cod complement fa de 2 (cod
complementar).
Reprezentarea utilizat de calculatoarele moderne, care
deine avantaje fa de celelalte reprezentri, este reprezentarea n
cod complementar.
Reprezentarea numerelor reale se poate face n virgul fix
sau n virgul mobil. n cazul folosirii virgulei fixe puterea de
reprezentare este foarte redus, spre deosebire de cazul folosirii
virgulei mobile, bazate pe exprimarea numerelor (reale) n
virgul mobil normalizat.
Dup dimensiunea i structura spaiului de memorie utilizat,
reprezentarea n virgul mobil poate fi: reprezentare n virgul
mobil simpl precizie (pe 32 de bii) sau reprezentare n virgul
mobil dubl precizie (pe 64 de bii).
Informaia nenumeric (litere, cifre zecimale, semne de
punctuaie, operatori aritmetici i logici, simboluri pentru
controlul comunicaiei i editare etc.) se reprezint pe baza unor
coduri care asociaz fiecrui semn o configuraie binar. Cel mai
cunoscut astfel de cod este codul ASCII.
Bibliografie

1. Gheorghe Barbu, Ion Vduva, Mircea Boloteanu, Bazele
Informaticii, Editura Tehnic, Bucureti, 1997.
2. A. Petrescu, N. pu, T. Moisa, Gh. Rizescu, V. Hrbor, N.
Mranu, Tr. Mihu, abc de calculatoare personale i nu doar att
, Vol.I, Ed. Tehnic, Bucureti, 1990.
3. L. Livovschi, Bazele Informaticii, Editura Didactic i Pedagogic,
Bucureti, 1981

49

UI3. Rezolvarea problemelor cu calculatorul

Obiectivele unitii de nvare pag 49
Etapele rezolvrii problemelor cu calculatorul pag 49
Tipuri de date i operaii elementare pag 53
Test de autoevaluare pag 55
Structuri de date pag 55
Test de autoevaluare pag 63
Algoritmi caracteristici i descriere pag 63
Test de autoevaluare pag 79
Rspunsurile testelor de autoevaluare pag 79
Lucrare de verificare pag 80
Rezumat pag 80
Bibliografie pag 82

Obiectivele unitii de nvare
- cunoaterea etapelelor rezolvrii problemelor cu
calculatorul
- cunoaterea tipurilor de date elementare i a celor
structurate utilizate n rezolvarea problemelor
- abilitatea de a proiecta un algoritm corect n pseducod sau
schem logic pentru probleme elementare

Durata: 8 ore
Etapele rezolvrii problemelor cu calculatorul
Activitatea de rezolvare a problemelor cu calculatorul se
bazeaz pe talent, creativitate i experien. Evident, n condiiile
creterii complexitii problemelor de rezolvat, n scopul mririi
eficienei acestei activiti, calitile enumerate devin cu att mai
50

necesare. Totui, acest lucru nu este suficient. n timp, viaa a
impus o nou abordare a activitii de rezolvare a problemelor cu
calculatorul. Dorina i nevoia de a obine eficien n acest
domeniu au condus la conturarea unor etape bine definite, cu
metode i instrumente de lucru specifice. Astfel, o activitate care
n trecut era vzut mai ales ca un meteug sau o art, la ora
actual este abordat tot mai des i sub aspectul ei de activitate
sistematic.
O list a etapelor pe care programatorul le parcurge n mod
uzual n rezolvarea problemelor poate fi privit ca un important
ajutor n obinerea unor rezultate bune. Evident, etapele pe care le
enumerm mai jos trebuie privite mai degrab ca un ghid, n
sensul c parcurgerea lor contiincioas nu va conduce n mod
obligatoriu la rezultatul scontat. A ignora aceste etape este ns la
fel de duntor cu a exagera importana lor. n general, se accept
ca fiind necesare urmtoarele faze n rezolvarea unei probleme cu
calculatorul:
1. analiza problemei;
2. proiectarea algoritmului de rezolvare;
3. descrierea algoritmului;
4. codificarea algoritmului (obinerea programului);
5. testarea programului;
6. execuia programului, obinerea rezultatelor i
interpretarea lor;
7. ntreinerea programului.

n prima etap, etapa de analiz a problemei se are n
vedere stabilirea modelului logico-matematic al problemei. Se
identific cu claritate funcia (sau funciile) problemei, se
stabilesc datele de intrare i datele de ieire. Aceast etap are ca
scop nelegerea ct mai exact a problemei de rezolvat.
Etapa de proiectare a algoritmului are ca scop stabilirea
algoritmului de rezolvare a problemei. Este etapa n care se
precizeaz operaiile pe care trebuie s le execute un calculator
pentru a rezolva problema. n cazul problemelor complexe este
recomandabil descompunerea problemei n subprobleme care
pot fi rezolvate mai uor. Aceast tehnic, numit top-down (de
51

sus n jos) va avea ca efect final obinerea unui sistem de module
conectate ntre ele dup logica impus de rezolvarea problemei.
Practic, ntr-o prim faz se obine o schi general de rezolvare
care se rafineaz succesiv pn la obinerea comenzilor necesare
execuiei pe calculator. mprirea problemei n subprobleme
prezint avantajul lucrului eficient n echip - subproblemele pot
fi rezolvate simultan de ctre membrii echipei. De asemenea,
obinerea modulelor program prin implementarea fiecrei
subprobleme uureaz munca de depanare (depistare a erorilor) i
de ntreinere a programului.
Pe msur ce crete complexitatea problemelor de rezolvat,
crete i dificultatea de a descrie algoritmii ct mai exact, fr
ambiguiti, utiliznd un limbaj natural. Din acest motiv s-au
imaginat diferite forme de descriere (diagram de structur,
scheme logice, pseudocod etc.) care pe de o parte permit
reprezentarea corect a algoritmilor ntr-o manier prietenoas,
natural, iar pe de alt parte faciliteaz codificarea cu uurin a
acestuia ntr-un limbaj de programare.
Dei foarte multe limbaje de programare au un caracter
universal, totui anumite trsturi ale problemei de rezolvat pot
recomanda un anumit tip de limbaj. Astfel, pentru o problem n
care predomin prelucrrile numerice se va alege un limbaj
puternic n acest sens, cum ar fi Fortran, Basic, Pascal etc.
Pentru probleme n care operaiile aritmetice au complexitate
redus, dar predomin prelucrrile nenumerice (sortare, cutare,
reuniune de fiiere etc.) se va alege un limbaj orientat pe aceste
probleme (Cobol, dBase, FoxPro etc.). Dac problema necesit
prelucrri ale unor baze de cunotine se pot folosi limbaje
speciale ca Prolog, Lisp, Ada etc.
n etapa de codificare o importan deosebit trebuie
acordat stilului de programare. n general se consider c stilul
de programare este bun dac ndeplinete condiii cum ar fi:
- programul este nsoit de documentaia de analiz i
proiectare care trebuie s conin elementele minimale:
descrierea funciilor programului, diagrama de structur
(schia general a programului), tabele de descriere a
variabilelor de intrare i ieire etc.;
- exist procedee de validare a datelor. Se pot utiliza
diverse procedee (sume de control, coduri autocorectoare,
52

intervale de apartenen, scrierea cu ecou, verificarea
unor relaii existente ntre variabilele de intrare etc.);
- programul este lizibil. Acest lucru se poate realiza prin
scrierea indentat (n fierstru) a liniilor de program,
prin alegerea unor nume sugestive pentru identificatori,
prin folosirea (neabuziv) a comentariilor etc.

Etapa de testare este etapa n care se elimin erorile
programului. Erorile pot fi de natur sintactic sau de natur
logic. Eliminarea erorilor de natur sintactic se face n urma
listelor de erori afiate de compilatoare. Stabilirea corectitudinii
din punct de vedere logic a programului se poate face prin
demonstraie matematic sau prin testarea programului folosind
date de test. Deoarece demonstrarea matematic a corectitudinii
este dificil chiar i pentru programe mici, metoda uzual este
metoda datelor de test. Datele de test trebuie alese cu grij, astfel
nct s se poat valida toate ramurile programului. Dac sunt
erori se ncearc localizarea acestora folosind diverse metode.
O metod rapid const n afiarea unor mesaje din loc n
loc, prin analiza crora se poate stabili zona unde se afl eroarea.
Mediile moderne de programare, care asist programatorul n
punerea la punct a programului, ofer i alte faciliti de
depanare, cum ar fi: ferestre de observare n timpul execuiei a
unor variabile i expresii, execuia pas cu pas a liniilor de
program, puncte de oprire a execuiei etc. Odat ndeprtate
erorile de sintax i de logic, programul poate fi executat.
Rezultatele obinute sunt analizate, iar n urma interpretrii lor se
iau deciziile corespunztoare.
Descriei cteva trsturi ale unui bun stil de
programare.
n mod normal programele sunt proiectate spre a fi rulate
(executate) la diverse intervale de timp, pe seturi de date diferite.
Aplicaia informatic obinut din unul sau mai multe programe
trebuie privit i ca un produs care sufer n timp un proces de
uzur moral. Activitatea de ntreinere a programului const n
modificri ale programelor ori de cte ori este nevoie, realizate
tocmai n scopul de a menine aplicaia la zi. Depanarea i
ntreinerea programelor sunt dou din activitile care pun n
53

lumin, n cel mai nalt grad, importana unui stil bun de
programare. Este evident c aceste activiti vor fi ngreunate
dac programele nu sunt suficient documentate, dac lipsesc
comentariile, scrierea este neindentat, iar logica programului se
realizeaz prin folosirea abuziv a instruciunilor de salt.
Care sunt etapele de rezolvare ale unei probleme cu
calculatorul? Descriei pe scurt fiecare etap.
Tipuri de date i operaii elementare
n acest paragraf vom prezenta, ntr-o manier general,
operaiile elementare i obiectele pe care le ntlnim de obicei
ntr-un limbaj de programare.
Datele sunt obiectele folosite ntr-un limbaj de programare
i pot fi de dou tipuri: date elementare i date structurate.
Datele elementare sunt recunoscute de calculator i se refer, n
majoritatea cazurilor la urmtoarele tipuri de date:
- date numerice;
- date logice;
- date alfanumerice.
Datele numerice pot fi ntregi sau reale.
Datele ntregi pot fi reprezentate n sistemul zecimal (de
exemplu -64, 9569, +311) sau n alte baze de numeraie (de
exemplu n sistemul hexazecimal: AD4, 6E3C etc.).
Datele reale se reprezint n multe limbaje de programare
sub dou forme:
- n notaie uzual (notaie cu punct), unde virgula e
reprezentat printr-un punct (exemplu -6.43, 82.1, +0.6);
- n notaie tiinific (exponenial). n acest caz
succesiunile b E sau b e au semnificaia de
b
10 . De
exemplu, 07 25 . 3 , 02 52 . 0 + e E nseamn
2
10 52 . 0 ,
respectiv
7
10 25 . 3

.
Operaiile folosite n mod obinuit sunt operaii de adunare,
scdere, nmulire, mprire, ridicare la putere.
54

Datele logice se refer la valorile logice (numite i
booleene) adevrat i fals. Operaiile permise sunt cele
cunoscute: conjuncia (I), disjuncia (SAU), negaia (NU), SAU
exclusiv etc. Dac notm cu 1 valoarea adevarat i cu 0
valoarea fals, rezultatele acestor operaii sunt dup cum
urmeaz (Tabelul 3.1):

Tabelul 3.1. Tabelul operaiilor de lucru cu date logice
a b a I b a SAU b NU a a SAU exclusiv b
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
1
1
1
0
0
0
1
1
0

Datele alfanumerice se refer la caractere i iruri de
caractere. Asupra acestor tipuri de date sunt permise operaii cum
ar fi comparaia, copierea, concatenarea (alipirea) etc. De
exemplu, prin concatenarea irurilor Ploieti i -Vest rezult
irul Ploieti-Vest.
Dai exemple de date ntregi, reale, alfanumerice.
Se observ c un tip de date este caracterizat printr-o
mulime de valori i o mulime de operaii care li se aplic.
n cadrul unui algoritm, datele se prezint sub forma
variabilelor i a constantelor. Constantele nu-i modific valoarea
n timpul execuiei algoritmului. De exemplu, 6.29 este o
constant real. O variabil i poate modifica valoarea pe
parcursul execuiei algoritmului. Numele unei variabile se
asociaz cu adresa unei celule, iar valoarea ei la un moment dat,
cu coninutul acesteia. Variabilele pot fi clasificate n variabile
statice i variabile dinamice. n cazul variabilelor statice
numelui variabilei i se asociaz adresa unei locaii de memorie pe
toat durata execuiei algoritmului. Valoarea variabilei este dat
de coninutul acestei locaii la un moment dat. De exemplu,
atribuirea: 3 x

se poate schia grafic sub forma:


Prin atribuirea 7 x

coninutul locaiei asociate variabilei
x se schimb n 7, conform schiei:
3
x
55



Unei variabile dinamice i se poate asocia pe parcursul
execuiei unui algoritm diferite adrese. O dat fixat adresa
celulei asociate se poate prelucra coninutul (informaia propriu-
zis) din celul.
- n cazul static asocierea nume - variabil adres celul
este fix (static), conform schiei


- n cazul dinamic, asocierea nume - variabil adres celule
este variabil (dinamic), dup cum sugereaz schema
urmtoare:




Datele avute n vedere pn acum sunt date elementare,
indivizibile n raport cu operaiile pe care le prelucreaz.
Expresiile sunt combinaii valide sintactic de date
(operanzi) i operaii (operatori).
Test de autoevaluare
3.1. Ce se nelege prin variabile statice?
3.2. Ce se nelege prin variabile dinamice?
Structuri de date
Abordarea datelor sub aspectul lor elementar este n foarte
multe situaii nesatisfctoare. De foarte multe ori, este preferabil
sau chiar imperios necesar ca datele s fie privite drept
3
x
7
3
s
legtur
static
d
56

componente ale unor structuri de date mai complexe. Structurile
de date folosite frecvent n algoritmi sunt: tabloul, nregistrarea,
lista liniar simplu nlnuit, lista liniar dublu nlnuit, stiva,
coada, arborele i graful.
Tabloul reprezint o colecie omogen de date (de acelai
tip, numit tip de baz). Tablourile modeleaz vectori, matrici,
masive multidimensionale. Accesul la elementele unui tablou se
face folosind indicii elementelor. De exemplu, componentele
haurate ale vectorului a i ale matricii b din figura 16 se
desemneaz prin a[3] i b[1][2]. Numerele 3, 1 i 2 dintre
parantezele ptrate sunt indici. Indicele 3 desemneaz a 3-a
component din irul de componente a[1], a[2], a[3], a[4], iar
indicii 1 i 2 se refer la elementul aflat pe linia 1 i coloana 2
din matricea b de dimensiune 3x4.

b
a

Figura 3.1. Figurarea componentelor a[3] i b[1][2] din tablourile
a i b

Variabilele
| | i a , 4 1 s s i i | | | | j i b , 3 1 s s i , 4 1 s s j se
numesc variabile indexate. Notaia indicelui i implicit folosirea
tablourilor are o importan covritoare n prelucrarea datelor.
Pentru a ilustra acest lucru, s presupunem c vrem s calculm
suma a n numere reale, cu n cunoscut. Dac n = 4 atunci,
reprezentnd cele 4 numere prin a, b, c i d, vom avea algoritmul:

Citete a, b, c, d
d c b a s + + +

Scrie s
Stop

Dac n are valoare mare (de exemplu 100), mergnd pe
aceeai idee, ar trebui s avem 100 de variabile i s le prelucrm
conform algoritmului de mai sus. Evident, acest lucru este de
neimaginat. Soluia const n a folosi n = 100 de variabile
57

indexate, x
i
, n i , 1 = i de a calcula suma
=
n
i
i
x
1
folosind o
structur iterativ de control.
Caracterizai tipul de date tablou. Dai cteva exemple.
nregistrrile modeleaz colecii neomogene de date. De
exemplu, se presupunem c pentru fiecare persoan a unui
colectiv ne intereseaz datele: nume (tip alfanumeric), vrst (tip
ntreg), salariu (tip real), sex (tip boolean).
Pentru o persoan, datele de tip diferit pot fi reunite ntr-o
nregistrare ca n variabila nregistare info (Figura 3.2):
nume vrst salariu sex
info
Ionescu 52 7 633 1

Figura 3.2. Ilustrarea unei nregistrri cu patru cmpuri

nume, vrst, salariu i sex se numesc cmpuri. Referirea la
un cmp se face folosind construcia
numevariabila.numecamp
De exemplu, info.nume se refer la irul Ionescu,
nume.varsta la valoarea 52 etc.
Dai cteva exemple de nregistrri.
n mod natural, listele de obiecte se pot memora n tablouri
unidimensionale (numite vectori). De exemplu, lista de persoane
Ionescu, Popescu, Georgescu, Vasilescu poate fi memorat n
vectorul persoane:

persoane
Ionescu Popescu Georgescu Vasilescu

Folosind structura tablou, dou elemente vecine din list
sunt memorate la adrese vecine (de exemplu, vecinii Popescu i
Georgescu sunt memorate la adresele vecine 2 i 3).
Aceast variant de implementare a listelor (numit static)
are avantajul unei parcurgeri rapide n ambele sensuri, n orice
58

punct ne-am afla. Dificultatea apare la eliminarea sau adugarea
unui element nou n list. Presupunnd c vectorul n care se
memoreaz lista are o dimensiune suficient, introducerea
persoanei Marinescu n list pe poziia a 2-a implic deplasarea
subirului Popescu, Georgescu, Vasilescu cu o poziie spre
dreapta conform schiei din Figura 3.3.

Marinescu

Ionescu Popescu Georgescu Vasilescu ...

Figura 3.3. Adugarea unui element ntr-un vector pe poziia a doua

Deplasri, dar de data aceasta spre stnga, au loc i atunci
cnd se elimin elemente din list. De exemplu, dac din lista
iniial se dorete scoaterea persoanei Popescu, acest lucru
implic deplasri spre stnga cu o poziie (Figura 3.4).

Ionescu Popescu Georgescu Vasilescu

Figura 3.4. Eliminarea elementului de pe poziia a doua dintr-un
vector

Aceste deplasri consum timp calculator, a crui mrime
depinde de poziia de inserie sau de tergere.
O soluie de implementare care rezolv elegant aceste
probleme o reprezint listele nlnuite. ntr-o list nlnuit
elementele vecine din list nu sunt memorate obligatoriu la
adrese vecine. Lista de mai sus poate fi implementat dinamic
sub forma unei liste simplu nlnuite, ca n figura 20.

Ionescu
-
Popescu - Georgescu - Vasilescu -

Figura 3.5. List nlnuit (list implementat dinamic)

Orice element al listei (numit nod) este alctuit din dou
cmpuri: un cmp unde se memoreaz informaia propriu-zis
(Ionescu, Popescu, Georgescu etc.) i un cmp de legtur,
59

unde se memoreaz adresa urmtorului element din list.
Evident, consumul de memorie este mai mare dect n cazul
listelor liniare implementate prin vectori (static), ns avantajul
apare la efectuarea operaiilor de inserie i tergere.
Astfel, inseria n list a persoanei Marinescu se
realizeaz, conform schiei din Figura 3.6, foarte simplu,
actualiznd corespunztor legturile.

Ionescu - Popescu - Georgescu - Vasilescu -








Marinescu -







Figura 3.6. Adugarea unui element ntr-o list nlnuit

tergerea persoanei Popescu din lista iniial se face
memornd n cmpul de adres al primului nod (Ionescu) adresa
nodului Georgescu. n felul acesta nodul Popescu rmne
izolat. Schia urmtoare ilustreaz acest lucru (figura 22).
Ionescu
-
Popescu
-
Georgescu
-
Vasilescu
-

Figura 3.7. Eliminarea elementului de pe poziia a doua dintr-o list
nlnuit

Analiznd lista simplu nlnuit se observ c vizitarea
vecinului drept se face cu uurin, datorit sensului stnga-
dreapta n care s-au fcut nlnuirile. Realizarea legturilor n
ambele sensuri (stnga-dreapta i dreapta-stnga) presupune
ca fiecare nod s aib dou cmpuri de legtur. Ceea ce se
obine este lista dublu nlnuit, ilustrat n figura 3.8.

- Ionescu - - Popescu - - Georgescu - - Vasilescu -

Figura 3.8. List dublu nlnuit

Cu preul introducerii unui cmp de legtur pentru fiecare
cmp se obine astfel o list dinamic cu faciliti de deplasare
rapid n ambele sensuri.
60

n informatic, deosebit de utile sunt dou tipuri particulare
de liste: stiva i coada.
Stiva este lista liniar n care adugarea i extragerea unui
element se fac pe la acelai cap al listei. Se spune c operaiile n
stiv se fac dup disciplina LIFO (Last In First Out: Ultimul
Intrat Primul Ieit). Pentru a face adugri sau extrageri este
nevoie s se tie poziia ultimului element din stiv. Aceasta este
memorat ntr-o variabil numit vrf. n figura de mai jos
(Figura 3.9.) se prezint schematic cele dou implementri ale
stivei static i dinamic.



X
X
X

Figura 3.9. Ilustrarea stivei implementare static i dinamic

Coada este lista liniar n care adugarea elementelor se
face pe la un cap, iar extragerea elementelor pe la cellalt cap.
Disciplina specific unei cozi este FIFO (First In First Out:
Primul Intrat Primul Ieit). n Figura 3.10 se ilustreaz schia
celor dou modaliti de implementare: static i dinamic.

X X X


Figura 3.10. Ilustrarea cozii implementare static i dinamic

Variabilele prim i ultim indic locul de unde se extrag,
respectiv unde se adaug elemente.
vrf


vrf

prim ultim
prim
ultim

61

Caracterizai stiva. Dai cteva exemple.
Caracterizai coada. Dai cteva exemple.
Deoarece foarte multe probleme se refer la obiecte aflate
ntr-o relaie de ordin ierarhic (piramidal), structura adecvat
pentru descrierea acestor relaii este arborele. Ca exemple de
structuri arborescente menionm: structura unei armate,
structura unei cri, structura unei firme, organizarea teritorial a
unei ri etc.
Schia de mai jos (Figura 3.11) ilustreaz organizarea
studenilor pn la nivel de grupe n cadrul specializtii
Matematic al Facultii de Litere i tiine.

Specializarea Matematic





Figura 3.11. Ilustrarea unei organizri arborescente

Elementele arborelui se numesc noduri. O poziie aparte o
ocup nodul etichetat Specializarea Matematic, numit
rdcin. Pstrnd analogia cu un arbore ntors, nodurile Grupa1,
Grupa2 etc. se numesc frunze (sau noduri terminale).
Implementarea arborilor se face de regul dinamic, ns
exist i variante de implementare static.
Caracterizai arborele. Dai cteva exemple.
Pentru descrierea celor mai complexe relaii dintre obiecte
se utilizeaz grafurile. Un graf foarte cunoscut este reeaua de
ci ferate descris n mersul trenurilor. n acest caz, obiectele
An 2 An I
Grupa
1
Grupa
2
Grupa
3
Grupa
4
An 3
Grupa
5
Grupa
6
An 4
Grupa
7
Grupa
8
62

(nodurile) sunt staiile de cale ferat, iar muchiile grafului sunt
reprezentrile cilor ferate care leag staiile. Alte exemple sunt:
reeaua de drumuri dintr-un ora (nodurile sunt interseciile),
reeaua de calculatoare din universitate etc.
Cnd relaiile dintre obiecte sunt nesimetrice modelarea se
face cu ajutorul digrafurilor (directed graph graf direcionat).
Mai jos (Figura 3.12), se prezint digraful datoriilor existente
ntre patru persoane: Cristina, Mihai, Andrei i Alina. O sgeat
de la nodul a la nodul b se traduce prin a este dator lui b.





Figura 3.12. Un exemplu de graf al datoriilor ntre patru persoane

Se observ c Andrei nu are datorii, la nici un membru al
listei i, n acelai timp, nici unul dintre acetia nu-i este dator.
Implementarea unui graf se poate face att static ct i
dinamic. n implementarea static se folosete matricea de
adiacen. Dac vom considera nodurile ca fiind numerotate 1, 2,
, n matricea de adiacen A are semnificaia urmtoare:
| |

=
arc exista si ntre daca , 1
arc exista nu si ntre daca , 0
,
j i
j i
j i A
.
De exemplu, considernd codificrile Cristina1,
Alina2, Mihai 3, Andrei 4, matricea de adiacen ataat
este:
A =
0 1 1 0
0 0 1 0
0 1 0 0
0 0 0 0
Mihai
Cristina
Alina
Andrei
1
3
2
4
63

Implementarea dinamic ia forma listelor de adiacen.
Pentru exemplul considerat, lista de adiacen este urmtoarea:


Cristina
-
Alina
-
Mihai
-
Andrei
-

Figura 3.13. Implementare dinamic a grafului datoriilor

Caracterizai graful. Dai cteva exemple.
Test de autoevaluare
3.3. Care este deosebirea dintre datele elementare i
structurile de date?
3.4. Care sunt principalele structuri de date utilizate n
algoritmi?
3.4. Enumerai avantajele i dezavantajele implementrilor
statice i dinamice ale listelor.
Algoritmi caracteristici i descriere
Dei studiul algoritmilor reprezint punctul central al tiinei
calculatoarelor, totui, noiunea de algoritm nu are nc o
definiie riguroas. Intuitiv, un algoritm const dintr-o mulime
ordonat de pai executabili, descrii fr ambiguitate, care
definesc un proces finit. Cu ajutorul unui algoritm, un set de date
de intrare, numit domeniul de definiie al algoritmului este
transformat ntr-un set de date de ieire, numit domeniul de valori
al algoritmului [4].


Alina -
Mihai -
Alina -
Mihai -
64

Un algoritm se caracterizeaz prin:
- generalitate algoritmul furnizeaz rezultate pentru o
mulime de date de intrare;
- finititudine procesul trebuie s fie finit pentru a furniza
un rezultat concret;
- neambiguitate fiecare pas se execut dup reguli bine
precizate.
Cerina ca paii algoritmului s fie executabili se refer la
capacitatea lor efectiv de a produce rezultate. De exemplu,
comanda sorteaz n ordine cresctoare toate numerele ntregi
pozitive nu poate fi pasul unui algoritm, deoarece, a sorta toate
numerele ntregi pozitive (o infinitate) este o aciune imposibil.
Ce este algoritmul ? Dai cteva exemple.
O posibilitate de a descrie un algoritm este limbajul
natural. Datorit polisemiei unor termeni, limbajul natural nu
este potrivit pentru reprezentarea algoritmilor. De foarte multe
ori, ambiguitatea prezent ntr-un algoritm nu ine de algoritmul
nsui ci de modul su de reprezentare. Gradul de detaliere n
reprezentarea unui algoritm poate s aib drept obiectiv nivelul
operaiilor executabile de ctre un calculator.
Descrierea rezultat este stufoas i puternic ngreunat de
omniprezena structurilor de salt condiionat i necondiionat.
Teorema de structur elaborat de Bhm i Jacopini [4]
furnizeaz justificarea conceptului de programare structurat
implementat n limbajele de programare moderne. Conform
acestei teoreme, orice algoritm cu un singur punct de nceput i
un singur punct de terminare a execuiei poate fi reprezentat ca o
combinaie de trei structuri algoritmice fundamentale:
- secvena de dou sau mai multe operaii;
- decizia alegerea unei operaii din dou alternative
posibile;
- iteraia cu test iniial repetarea unei secvene ct timp
este adevrat o anumit condiie.
Se observ c cele trei structuri de control corespund unor
procese naturale ale raionamentului uman: enumerare, decizie,
65

repetiie. Acest lucru explic i uurina i naturaleea cu care
sunt descrii algoritmii folosind structurile de mai sus. De cele
mai multe ori descrierea acestor structuri nu se face direct ntr-un
limbaj de programare, ci se utilizeaz anumite convenii de
reprezentare. Foarte des ntlnite n practic sunt conveniile de
reprezentare sub form de schem logic i pseudocod. Aceste
convenii au avantajul lipsei de formalism al limbajelor de
programare (sunt mai intuitive) i totodat permit reprezentarea
cu claritate a structurilor algoritmice fundamentale.
Reprezentarea sub forma schemei logice folosete simboluri
grafice cu neles prestabilit. Cele mai uzuale simboluri sunt
(Figura 3.14):


Bloc terminal

Bloc intrare ieire

Bloc de calcul


Figura 3.14. Simbolurile grafice utilizate n schemele logice

Pentru exemplificare s considerm algoritmul de rezolvare
al ecuaiei de gradul I. Fie deci ecuaia 0 = + b ax . Variabilele de
intrare sunt a i b, iar variabila de ieire este x. n limbaj natural,
discuia ecuaiei de gradul I se poate face astfel:
- dac a 0 atunci ecuaia este determinat i are rdcina
x = - b/a ;

- dac a=0 atunci analizm cazurile:
- dac b=0 ecuaia devine 0 0 0 = + x adic ecuaia e
nedeterminat;
- dac b 0 ecuaia devine 0 0 = + b x adic ecuaia este
imposibil.
Se observ c, dei exemplul este destul de simplu,
descrierea n limbaj natural este relativ greoaie. O descriere
Bloc de decizie
Bloc conector
Sgeat
66

simpl i clar este realizat mai jos (Figura 3.15) cu ajutorul
schemei logice.

















Figura 3.15. Schema logic a algoritmului de rezolvare a ecuaiei de
grad I

n pseudocod, n locul simbolurilor grafice se utilizeaz
cuvinte cu neles prestabilit, (cuvinte cheie). Astfel, descrierea
algoritmului de rezolvare a ecuaiei de gradul I ia forma:
Citete a, b
Dac a = 0 atunci
x -b/a
Scrie x
Altfel
Dac b = 0 atunci
Scrie Ecuaie nedeterminat
Altfel
Scrie Ecuaie imposibil


Stop
Start
Citete a, b
0 = a
0 = b
Scrie x
a b x /
Scrie Ecuaie
nedeterminat
Scrie Ecuaie
imposibil
Nu Da
Da
Nu
Stop
67

Se observ c modul de subordonare logic este sugerat cu
ajutorul unor reguli de aliniere simple. Operaii elementare cum
sunt citirea, scrierea, atribuirea, sfrit execuie, se pot reprezenta
sub forma:

Citete lista de variabile
Scrie lista de expresii
v expresie
Stop

Modul de reprezentare al celorlalte operaii complexe
(decizia i iteraia) va fi descris n seciunile urmtoare.

SECVENA
O secven este o suit de operaii care se execut n ordinea
n care sunt scrise.
De exemplu, descrierea algoritmului pentru calculul
expresiei e = x + 1 este o secven pe care o prezentm mai jos:
Citete x
e x + 1
Scrie e
Stop

DECIZIA
Decizia are urmtoarele reprezentri n pseudocod i schem
logic (Figura 3.16):

Dac conditie atunci
secvena1
Altfel
secvena2




Figura 3.16. Descrierea n pseudocod i schem logic a deciziei

secventa2
secvena1

conditie

Fals Adevrat
68

Execuia structurii de decizie se face astfel:
- se evalueaz conditie;
- dac conditie este adevrat se execut secventa1,
n caz contrar se execut secventa2.
Exemplu. Calculul maximului dintre dou numere a i b.

Citeste a,b
Dac a>b atunci
a max
Altfel
b max
Scrie max
Stop


Figura 3.17. Descrierea n pseudocod i schem logic a algoritmului
de calcul a maximului dintre dou numere

ITERAIA CU TEST INIIAL
Iteraia cu test iniial are urmtoarele reprezentri n
pseudocod i schem logic (Figura 3.18).

Ct timp conditie execut
secventa





Figura 3.18. Descrierea n pseudocod i schem logic a iteraiei cu
test iniial

Fals Adevrat
a max
Scrie max
Stop
b a >
b max
Start
Citete a, b
secventa
Adevarat
Fals
conditie
69

Efectul acestei structuri este urmtorul: se execut
secventa ct timp conditie este adevrat.
Observaii:
- dac din start conditie ia valoarea Fals, secvena nu se
execut niciodat;
- secventa trebuie s conin enunuri care s conduc la
modificarea valorii de adevr a condiiei dup un numr
finit de pai (condiia trebuie sa ia valoarea Fals la un
moment dat pentru a se iei din ciclu, n caz contrar se
produce o bucl etern sau un ciclu infinit).
Prezentm mai jos un exemplu care conine o bucl etern.
7 x
Ct timp 6 > x execut


x y

Stop

Se observ c secvena x y nu va modifica niciodat
valoarea variabilei x. n consecin, x va avea ntotdeauna
valoarea 7, condiia 7 > x va fi ntotdeauna adevrat i, deci,
secvena x y se va executa de o infinitate de ori.
Exemplu. Calculul sumei elementelor unui ir. Sfritul
irului este marcat de cifra zero.

0 s

Citete x
Ct timp x0 execut
x s s +
Citete x

Scrie s
Stop



70








Descriei n pseudocod secvena. Dai cteva exemple.
Descriei n pseudocod decizia. Dai cteva exemple.
Descriei n pseudocod iteraia. Dai cteva exemple.

Forme echivalente pentru structurile de decizie i de
iteraie cu test iniial
Pentru a uura implementarea i a spori claritatea
programelor, majoritatea limbajelor de programare utilizeaz i
alte structuri algoritmice, echivalente logic cu structurile
algoritmice fundamentale prezentate.
Astfel, n cazul deciziei, amintim decizia cu ramur vid i
decizia generalizat (sau selecia).
Decizia cu ramur vid are forma general (Figura 3.19):



Citete x
0 = x
Stop
Nu
Da
Scrie x
x s s + =
Citete x
Start
71

Dac conditie atunci
secventa





Figura 3.19. Descrierea n pseudocod i schem logic a
deciziei cu ramur vid

Efectul deciziei cu ramur vid const n execuia
condiionat a secvenei: secventa se execut numai dac
conditie este adevrat.
Exemplu. Calculul maximului dintre dou numere a i b
utiliznd decizia cu ramur vid.

Citete a,b
a max
Dac b a < atunci
b max


Scrie max
Stop








Decizia generalizat permite alegerea (selecia) unei
alternative din mai multe posibile. Forma general a seleciei este
urmtoarea (Figura 3.20):


secventa
Adevarat Fals
conditie

b a <
b max
Scrie max
Stop
Nu Da
a max
Citete a, b
Start
72




Alege expresie dintre
C
1
: secventa
1

C
2
: secventa
2
. . .
C
n
: secventa
n
Altfel secventa
n+1





Figura 3.20. Descrierea n pseudocod i schem logic a
deciziei generalizate

Modul de execuie al deciziei generalizate este urmtorul:
- se evalueaz expresie;
- dac exist { } n i ..., , 2 , 1 e astfel nct expresie = c
i
se
execut secventa
i
i se iese din structur;
- dac pentru orice { } n i ..., , 2 , 1 e expresie = c
i
se
execut secventa
n+1
i se iese din structur.

Observaie. Secvena secventa
n+1
este opional.

Exemplu. Se citete un caracter i n funcie de valoarea sa
se scriu diferite mesaje. Algoritmul este descris n pseudocod.

Citeste x
Alege x dintre
a, A: Scrie (Ana)
e: Scrie (Elena)
m..a: Scrie (Mona, Nae, Oana)
Altfel: Scrie (Ati tastat gresit)

Stop

De regul, n limbajele moderne de programare se
secventa1
C
1

C
2

C
3

Altfel
secventa
n+1

secventa2
secventa3
expresie
73

implementeaz alturi de iteraia cu test iniial i urmtoarele
dou forme echivalente:
- iteraia cu contor (structura Pentru);
- iteraia cu test final (structura Repet Ct Timp).

Iteraia cu contor este un caz particular al iteraiei cu test
iniial. Rolul central l ocup aici o variabil special, numit
variabil contor, care poate fi iniializat, actualizat i poate
controla valoarea logic a condiiei. Actualizarea nseamn
modificarea cu o valoare constant (numit raie sau pas) a
variabilei contor. Reprezentarea n pseudocod i sub form de
schem logic a iteraiei cu contor este prezentat n Figura 3.21:

Pentru v v
i
, v
f
, r execut
secventa







Figura 3.21. Descrierea n pseudocod i schem logic a
iteraiei cu contor

Observaie. Situaia descris n schema logic de mai sus se
refer la cazul v
i
s v
f
i raia r > 0. Cnd v
i
> v
f
i r < 0 condiia de
test se schimb n v > v
f
.
Structura de control Pentru se folosete cnd se cunoate
numrul de iteraii. Observaiile fcute la structura Ct timp
rmn valabile i aici.
Exemplu. Calculul sumei a n numere reale citite de la
tastatur.
v s v
f

secventa
v v + r
Fals
Adevrat
v v
i

74


Citete n
0 s
Pentru n i , 1 execut
Citete x
x s s +

Scrie s
Stop

Observaie. Cnd raia lipsete se consider c implicit are
valoarea 1.
Iteraia cu test final se reprezint n pseudocod i schem
logic sub forma (Figura 3.22):

Repet
secventa
Ct timp conditie



Figura 3.22. Descrierea n pseudocod i schem logic a
iteraiei cu test final

Observaii:
- secventa se execut cel puin o dat.
- Pentru a nu se cicla la infinit, secventa trebuie s
conin enunuri care, dup un numr finit de pai, s
conduc la valoarea de adevr Fals pentru conditie.
Exemplu. Calculul valorii x y = pentru un numr x real
citit de la tastatur.

Repet
Citete x
Ct Timp 0 < x
x y
Scrie y
Stop

secventa
conditie Fals Adevrat
75

Proceduri i funcii
Sunt frecvente cazurile n care o secven de instruciuni
este reluat pe parcursul unei algoritm schimbndu-se de fiecare
dat numai valorile iniiale ale variabilelor.
Pentru a se evita scrierea acelorai instruciuni de mai multe
ori, acestea sunt organizate separat, sub forma unui subalgoritm
i apelate n algoritmul principal ori de cte ori este nevoie.
Schematic, situaia se prezint astfel:












Subalgoritmul poate lua forma unei proceduri sau a unei
funcii.
n pseudocod o procedur se reprezint astfel:

Procedura numeprocedura (listadeparametri)
corpul procedurii
Sfrit


Instruciuni
care se repet
Instruciuni
care se repet
Instruciuni
care se repet
Algoritm
Algoritm principal
apel subalgoritm
apel subalgoritm
apel subalgoritm
Subalgoritm

76

Precizri:
- cuvintele Procedura i Sfrit sunt cuvinte rezervate.
- numeprocedura este evident numele procedurii i
servete la identificarea instruciunilor care se apeleaz.
- listadeparametri reprezin parametrii formali sau
fictivi; lista poate fi vid.
- corpul procedurii conine instruciunile
subalgoritmului.
Apelul unei proceduri se face prin specificarea numelui
procedurii urmat de lista de parametri actuali sau efectivi cuprini
ntre paranteze rotunde:
numeprocedura (listadeparametri)

i n acest caz listadeparametri poate s fie vid.
Transferul informaiei dinspre algoritmul principal spre
procedur i invers se face prin intermediul parametrilor. Exist
i posibilitatea de a transmite informaii prin variabile globale,
adic variabile care sunt recunoscute (se vd) i n algoritmul
principal i n procedur. Aceast ultim variant nu este
recomandat deoarece, tocmai datorit caracterului lor global,
valorile variabilelor pot fi modificate uneori din greeal.
Parametrii formali pot sau nu avea aceleai nume cu
parametrii actuali. Important este ns ca n ambele liste s existe
un numr egal de parametri, iar parametrii formali i actuali de
pe aceeai poziie s fie de tipuri compatibile.
Numele procedurii nu intervine n operaiile expresiilor din
algoritm. Rolul su este numai de a identifica instruciunile care
se apeleaz.
Exemplu. Calculul combinrilor de n luate cte k:
)! ( !
!
k n k
n
C
k
n

=
,
utiliznd o procedur pentru calculul factorialului. Descrierea se
face n pseudocod.



77

Procedura Fact (m,F
m
)
1 p
Pentru n k , 2 execut

k p p

p F
m

Sfrit

Citete n, k
Fact (n,F
n
)
Fact (k,F
k
)
Fact (n-k,F
nk
)
) /(
k nk n nk
F F F C
Scrie C
nk

Stop

La efectuarea apelului, se execut instruciunile din
procedur, iar dup terminare se revine n algoritmul principal la
prima instruciune de dup apel.
Un algoritm principal poate apela subalgoritmi diferii, iar
fiecare subalgoritm poate apela la rndul su ali subalgoritmi.
n exemplul de mai sus procedura Fact este apelat de trei
ori. De fiecare dat parametrii formali m i F
m
sunt pui n
coresponden cu parametrii actuali corespunztori. De exemplu,
la apelul
Fact(n,F
n
)

parametrul formal m primete valoarea parametrului actual n. Se
execut instruciunile din procedur iar rezultatul (n!) calculat n
F
m
se ntoarce n algoritmul principal prin parametrul actual
corespunztor F
n
. Analog, dup apelul succesiv al procedurii, n
F
nk
se va afla valoarea k!, iar n F
nk
valoarea (n-k)!.

n pseudocod, o funcie se reprezint astfel:

Funcia numefunctie (listadeparametri)
corpul funciei
Sfrit

Precizri:
- cuvintele Funcie i Sfrit sunt cuvinte rezervate.
78

- numefunctie este numele funciei.
- lista_de_parametri reprezint parametri formali sau
fictivi; lista poate fi vid.
- corpul functiei conine instruciunile
subalgoritmului.
Transferul informaiei dinspre algoritm spre funcie se face
prin intermediul parametrilor formali la apelul funciei.
Rezultatul prelucrrilor din corpul funciei se ntoarce n
algoritmul principal prin intermediul numelui funciei. Din acest
motiv, n corpul funciei, numefunctie trebuie s primeasc
cel puin o valoare. Numele funciei, urmat (dac e cazul) de lista
de parametri actuali cuprins ntre paranteze, poate s fie operand
ntr-o expresie; la apel construcia
numefunctie(listaparametriactuali)

va fi nlocuit cu rezultatul prelucrrilor din corpul funciei.
Exemplu. Calculul expresiei 63 . 5 ) ( + = x f y
unde

<
=
> +
=
7
7 25 . 10
7 2
) (
x daca x e
x daca
x daca x
x f
x
.
Descrierea n pseudocod este urmtoarea:

Funcia ) (x f
Dac 7 > x atunci
2 + x f
Altfel
Dac 7 = x

25 . 10 f

Altfel
x e f
x



Sfrit

Citete x

63 . 5 ) ( + x f y

Scrie y
Stop
79

Explicai rolul procedurilor i funciilor. Dai 3 exemple
de funcii i 3 exemple de proceduri.

Test de autoevaluare
3.5. Enumerai caracteristicile de baz ale algoritmului.
3.6. Enunai teorema de structur.

Rspunsurile testelor de autoevaluare
3.1. Variabilele statice sunt variabile al cror nume se
asociaz pe toat durata execuiei programului cu adresa unei
locaii de memorie.
3.2. Variabilele dinamice sunt variabile crora se pot asocia
mai multe adrese de locaii de memorie pe durata execuiei
programului.
3.3. Datele elementare sunt indivizibile n raport cu
operaiile pe care le prelucreaz (exemple: 4, -34.89, s), iar
structurile de date sunt ansambluri de date, omogene sau nu, care
pot fi tratate unitar n prelucrare.
3.4. Principalele structuri de date utilizate n algoritmi sunt:
tabloul (sau vectorul), nregistrarea, lista liniar simplu nlnuit,
lista liniar dublu nlnuit, stiva, coada, arborele i graful.
3.4. Avantajele implementrilor statice ale listelor fa de
cele dinamice: consum de memorie mai redus, acces direct la
orice element al listei, parcurgeri rapide n ambele sensuri.
Dezavantajele implementrilor statice ale listelor fa de
cele dinamice: dificulti la eliminarea sau adugarea de elemente
n list.
3.5. Generalitatea, finititudinea i neambiguitatea.
3.6. Orice algoritm cu un singur punct de nceput i un
singur punct de terminare a execuiei poate fi reprezentat ca o
80

combinaie de trei structuri algoritmice fundamentale: secvena,
decizia i iteraia cu test iniial.
Lucrare de verificare ...................................................
Realizai o sistematizare a structurilor de date.
Scriei n pseudocod algoritmul de rezolvare a urmtoarei
probleme: pentru o companie generic se citesc veniturile pe
fiecare trimestru al ultimului an pentru toate sucursalele
(ncheierea citirii se face la ntlnirea unei valorie negative). Se
cer: venitul trimestrial maxim, venitul trimestrial minim, suma
veniturilor pentru toate sucursalele i toate trimestrele i venitul
mediu trimestrial pe sucursal.
Rezumat
Etapele de rezolvare a unei probleme cu calculatorul sunt:
analiza problemei, proiectarea algoritmului de rezolvare,
descrierea algoritmului n pseudocod sau schem logic,
codificarea algoritmului ntr-un limbaj de programare (obinerea
programului), testarea programului, execuia sa, obinerea
rezultatelor i interpretarea lor i ntreinerea programului.
n limbajele de programare se folosesc date elementare i
date structurate. Datele elementare, care sunt date indivizibile i
recunoscute de calculator fr prelucrri suplimentare, sunt date
numerice (ntregi i reale), logice i alfanumerice. Datele
structurate (sau structurile de date) folosite frecvent n algoritmi
sunt: tabloul, nregistrarea, lista liniar simplu nlnuit, lista
liniar dublu nlnuit, stiva, coada, arborele i graful.
- Tablourile reprezint colecii omogene de date (iruri).
- nregistrrile reprezint colecii neomogene de date.
- Listele liniare (simplu i dublu nlnuite) modeleaz
iruri de elemente omogene care nu se memoreaz
obligatoriu la adrese vecine.
- Stiva i coada sunt liste liniare particulare care
funcioneaz dup principiul Ultimul Intrat Primul Ieit i
81

respectiv Primul Intrat Primul Ieit.
- Arborii sunt structuri pentru reprezentarea relaiilor
ierarhice dintre obiect.
- Grafurile sunt structuri de tip reea pentru reprezentarea
relaiilor (de aproape orice tip) dintre obiecte.
Tipurile de date se caracterizeaz printr-o mulime de valori
i o mulime de operaii specifice care li se aplic.
n cadrul unui algoritm, datele se prezint sub forma
constantelor i a variabilelor (statice sau dinamice).
Un algoritm se definete ca o mulime ordonat de pai
executabili, descrii fr ambiguitate, care definesc un proces
finit. Un algoritm trebuie s fie deci general, finit i neambiguu.
Descrierea algoritmilor se realizeaz prin anumite convenii de
reprezentare, ca schema logic i pseudocodul.
Teorema de structur, care furnizeaz justificarea
conceptului de programare structurat implementat n limbajele
de programare moderne, stipuleaz c orice algoritm cu un singur
punct de nceput i un singur punct de terminare a execuiei poate
fi reprezentat ca o combinaie de trei structuri algoritmice
fundamentale (structuri de control): secvena, decizia i iteraia
cu test iniial. Alturi de aceste forme standard ale structurilor de
control mai apar: decizia cu ramur vid, decizia generalizat,
iteraia cu contor i iteraia cu test final.
Cnd ntr-un algoritm este necesar scrierea repetat a unor
grupuri de instruciuni (n diverse puncte de execuie) se pot scrie
subalgoritmi care organizeaz separat aceste instruciuni i care
se pot apela ulterior n algoritmul principal sau de cte ori este
nevoie. Subalgoritmii sunt proceduri dac reunesc instruciuni
care nu ntorc valori n algoritmul apelant i funcii dac reunesc
instruciuni care ntorc o valoare algoritmului apelant.






82

Bibliografie
1. Liviu Dumitracu, Monica Vldoiu, Mihaela Oprea, Cristian
Marinoiu i colectiv, Borland Pascal n 13 conversaii cu CD, capitolul 12,
Structuri de date. Operaii elementare, pag. 548-583, Editura Universitii
din Ploieti, 2001.
2. Gheorghe Barbu, Ion Vduva, Mircea Boloteanu, Bazele Informaticii,
Editura Tehnic, Bucureti, 1997.
3. A. Petrescu, N. pu, T. Moisa, Gh. Rizescu, V. Hrbor, N.
Mranu, Tr. Mihu, abc de calculatoare personale i nu doar att ,
Vol.I, Ed. Tehnic, Bucureti, 1990.
4. Luca-Dan erbnai, V. Cristea, Florica Moldoveanu, Valeriu Iorga,
Programarea sistematic n limbajele Pascal i Fortran, Editura Tehnic,
Bucureti, 1984.
83

UI4. Introducere n limbajul de programare C

Obiectivele unitii de nvare pag 83
Introducere n limbajul de programare C pag 83
Test de autoevaluare pag 89
Elemente de baz ale limbajului C pag 90
Test de autoevaluare pag 97
Expresii n C. Funcii de intrare/ieire uzuale pentru consol
pag 98
Test de autoevaluare pag 120
Rspunsurile testelor de autoevaluare pag 129
Lucrare de verificare pag 129
Rezumat pag 130
Bibliografie pag 132


Obiectivele unitii de nvare
Familiarizarea cu limbajul de programare C
Cunoaterea elementelor de baz ale limbajului C
Capacitatea de a crea programe n limbajul C

Durata: 2 ore
Introducere n limbajul de programare C
Limbajul C a fost inventat i implementat prima dat n anii
70 de ctre Dennis Ritchie, programator de sistem la Bell
Laboratories. El i are originea n limbajul BCPL (Basic
Computer Programming Language) care, prin perfecionri i
dezvoltri succesive a devenit limbajul B i n final limbajul C.
84

Rspndirea iniial a limbajului C se datoreaz folosirii
sale n scrierea sistemului de operare UNIX, sistem care cunoate
astzi o ascensiune constant printre sistemele de operare
existente. Una din versiunile remarcabile ale limbajului C este
cea furnizat mpreun cu versiunea a 5-a sistemului de operare
UNIX. Aceast versiune este descris prima oar n cartea lui
Brian Kernighan i Dennis Ritchie intitulat The C Programming
Language. Cartea este cunoscut ca un punct de referin n
evoluia limbajului, fiind asimilat cu un adevrat standard.
Apariia microcalculatoarelor a contribuit la rspndirea
spectaculoas a limbajului n diverse variante. Dei diferena
dintre ele nu a fost niciodat semnificativ, totui, pentru
eliminarea anumitor neconcordane, n anul 1983 o comisie
special ncepe lucrul pentru elaborarea standardului ANSI
(American National Standards Institute) al limbajului C, care
apare 6 ani mai trziu, n anul 1989. La ora actual, majoritatea
compilatoarelor C sunt compatibile cu acest standard.

Locul limbajului C n familia limbajelor de programare
Familia limbajelor de programare se poate clasifica n:
limbaje de nivel cobort, limbaje de nivel nalt i limbaje de nivel
mediu.
Prima categorie cuprinde limbajul cod-main i limbajul de
asamblare. Ambele sunt specifice tipului de main de calcul pe
care sunt implementate. Limbajul cod main este limbajul
alctuit din acele instruciuni elementare care sunt nelese i
executate de un anumit tip de calculator. Limbajul de asamblare
folosete n locul codurilor numerice reprezentri simbolice,
numite i mnemonice, care uureaz munca de programare.
Operaiile limbajului de asamblare sunt operaii de baz ale
calculatorului. El nu accept structuri de control i date
structurate, dar permite adresarea simbolic a locaiilor de
memorie. Din aceste motive programele n limbaj de asamblare
sunt lungi i se scriu anevoios, dar sunt performante din punct de
vedere al vitezei de execuie i al posibilitilor de acces la
resursele hardware.
A doua categorie, cea a limbajelor de nivel nalt, include
binecunoscutele limbaje Fortran, Cobol, Basic i Pascal. O parte
din trsturile lor comune se refer la posibilitatea de a folosi
85

structuri de control, date structurate, de a elabora cu uurin
programe portabile (care se pot adapta uor la implementarea pe
diverse categorii de sisteme de calcul). Limbajele din aceast
categorie pierd ns calitatea esenial a limbajelor de nivel
cobort, aceea de a exploata eficient resursele mainii de calcul
pe care sunt implementate.
Categoria limbajelor de nivel mediu mbin trsturile
principale ale limbajelor de nivel nalt cu cele ale limbajelor de
nivel cobort. Limbajul C este un limbaj de nivel mediu.
Care sunt categoriile de limbaje de programare?

Cteva trasturi ale limbajului C
Limbajul C ofer posibilitatea organizrii programelor n
module i permite implementarea unor structuri de control i
tipuri de date care faciliteaz programarea structurat. Ca i
limbajele de nivel nalt, este uor de nvat i de folosit, iar n
plus are un numr foarte mic de cuvinte cheie (32 cuvinte dup
standardul ANSI C).
Portabilitatea specific limbajelor de nivel nalt este
accentuat n C prin folosirea funciilor de bibliotec n realizarea
operaiilor de intrare/ieire i de prelucrare a fiierelor. Numrul
mic de cuvinte cheie i prezena unei bogate familii de operatori
permit realizarea unor programe concise, cu un cod surs relativ
redus.
Compilatorul C este mai puin sever n comparaie cu
majoritatea compilatoarelor limbajelor de nivel nalt.
Dac la aceste trsturi adugm i posibilitatea de a oferi
faciliti ale limbajelor de nivel cobort (lucru cu adrese de
memorie, accesarea regitrilor, incrementri, decrementri, apelul
unor funcii ale sistemului de operare) obinem imaginea unui
limbaj puternic i flexibil preferat n special de programatorii
profesioniti.


86

Structura general a unui program C
Structura general a unui program C este urmtoarea:

directive preprocesor
declaratii globale
tip main(lista de parametri)
{
declaratii locale
instructiuni
}
tip f
1
(lista de parametri)
{
declaratii locale
instructiuni
}
tip f
2
(lista de parametri)
{
declaratii locale
instructiuni
}
. . . . .
tip f
n
(lista de parametri)
{
declaratii locale
instructiuni
}

Precizri. Faza de analiz a unei probleme evideniaz uzual
o funcie principal i mai multe funcii secundare ale acesteia.
Rezultatul acestei faze l constituie o reprezentare modular, care
reflect interdependena dintre funciile problemei. n principiu,
orice program C este o secven de funcii aflate la acelai nivel.
Cuvintele main, f
1
,f
2
,,f
n
sunt nume de funcii C. Orice
funcie dintr-un program poate apela oricare alt funcie din
program. Excepie face funcia main() care poate apela alte
funcii, dar nu poate fi apelat dintr-o alt funcie a programului.
La execuia unui program C prima funcie apelat este main():
execuia programului ncepe i se termin cu instruciuni din
main(). Ea este obligatorie i poate figura oriunde n program.
De obicei este plasat la nceputul programului, pentru a-i mri
lizibilitatea.
Directivele preprocesor sunt instruciuni destinate
compilatorului, care face transformri preliminare asupra textului
87

nainte de a ncepe compilarea. Faza preprocesrii are drept
rezultat obinerea unei uniti de compilare. Unitatea de
compilare este analizat sintactic (compilat), iar rezultatul este
depus n module obiect. Modulele obiect rezultate, mpreun cu
modulele obiect corespunztoare funciilor de bibliotec folosite
sunt legate cu ajutorul programului linkeditor (editor de
legturi) obinndu-se programul executabil. Directivele se
constituie ca un limbaj n interiorul limbajului C i ofer anumite
faciliti: compilarea condiionat a unor poriuni de cod,
nlocuirea n text a unui identificator la fiecare apariie cu un set
de caractere, includerea unui fiier surs n program etc..
O funcie C este alctuit din antet i un bloc de declaraii i
instruciuni delimitat de acoladele { i }, numit i corpul
funciei. Antetul conine numele funciei, tipul valorii returnate
(ntreg, real etc.) i o list de parametri formali care poate fi
eventual vid.
O funcie este definit dac este prezentat complet, adic
are forma:
antet
corpul funciei

Dac se prezint doar antetul funciei, se spune c funcia
este declarat. Declaraia modern a unei funcii poart numele
de prototip. Apelul funciei se face sub forma
nume_functie(lista de parametri actuali)

i presupune transferul controlului execuiei programului ctre
instruciunile din corpul funciei, execuia acestora i revenirea n
funcia apelant n punctul unde se execut operaia care
urmeaz. Schema de apel este urmtoarea:
funcie apelant funcie apelat






Figura 4.1. Schema de apel a unei funcii


apel functie
88

O funcie C nu poate fi declarat sau definit n interiorul
altei funcii.
Declaratiile globale se refer la entiti (tipuri de
date, variabile etc.) care sunt recunoscute de toate funciile.
Declaratiile locale limiteaz valabilitatea acestor entiti
doar la nivelul funciei unde se fac. Prezena prototipului unei
funcii n zona declaraiilor globale face posibil recunoterea sa
n toate funciile care o apeleaz i permite evitarea unor erori de
apelare, nc din faza de compilare.
Care este structura general a unui program C?
n construcia unui program C se pot folosi dou categorii
de funcii:
funcii utilizator, elaborate de programator;
funcii standard (predefinite), care pot fi preluate din
biblioteca standard a limbajului C.
Funciile standard ale limbajului se pot clasifica n: funcii
de intrare/ieire, funcii pentru prelucrarea caracterelor, funcii
pentru prelucrarea irurilor de caractere etc.. n mod
corespunztor prototipurile acestor funcii sunt grupate n fiiere
speciale numite fiiere antet sau header (au extensia .h). De
exemplu, funciile matematice sunt grupate n fiierul antet
math.h, funciile de manipulare a irurilor de caractere n
string.h etc.. Pentru a utiliza o funcie standard n program
trebuie cunoscut prototipul su, lucru posibil prin includerea
fiierului antet n program utiliznd directiva #include.
Un program C poate avea funciile editate ntr-un singur
fiier (programe monofiier) sau n mai multe fiiere (programe
multifiier). Un exemplu simplu de program C este urmtorul:
Exemplul 4.1
Primul program C

#include stdio.h
void main(void)
{
printf(/nPrimul program C!);
}
89

Se observ c programul este alctuit dintr-o singur
funcie, funcia main() i folosete funcia standard printf()
cu prototipul n stdio.h.
Ce sunt funciile utilizator? Dar funciile predefinite?
Test de autoevaluare
4.1. Limbajul C a fost inventat de:
a. Niklaus Wirth
b. Dennis Ritchie
c. Brian Kernighan
4.2. Limbajul C este:
a. un limbaj de nivel cobort
b. un limbaj de nivel mediu
c. un limbaj de nivel nalt
4.3. n C, o funcie:
a. nu se poate declara sau defini n interiorul alteia
b. poate apela o alt funcie
c. este alctuit din antet i un bloc de declaraii i
instruciuni delimitat de cuvintele begin i end
4.4. Funcia main()
a. poate s lipseasc dintr-un program C
b. este obligatorie i figureaz prima n program
c. este obligatorie i poate figura oriunde n program
4.5. n C, o funcie:
a. poate include declaraia sau definiia altei funcii
b. poate fi declarat sau definit n interiorul altei
funcii
c. se poate apela numai din main()
d. se poate apela din orice alt funcie
90

Elemente de baz ale limbajului C
Aa cum se ntmpl cu orice limbaj artificial, temelia pe
care se cldesc programele C este alcatuit din alfabet i
vocabular (atomi lexicali). Combinnd atomii lexicali dup
regulile specifice de sintax se construiesc linii valide de
program i, n final, programul.

Alfabetul limbajului
Alfabetul limbajului este alctuit dintr-o mulime de
simboluri care se pot clasifica n simboluri afiabile i simboluri
neafiabile.
Setul minim de simboluri afiabile (care pot fi reprezentate
grafic) este alctuit din:
litere mari ale alfabetului englez:
A B C D E F G H I J K L M N O P Q R S T
U V W X Y Z
litere mici ale alfabetului englez:
a b c d e f g h i j k l m n o p q r s t
u v w x y z
cifre zecimale: 0 1 2 3 4 5 6 7 8 9
liniu de subliniere: _
semne de punctuaie i semne speciale:
, . ; : ? ( ) [ ] < > ! | \ / ~ # & ^ * - = + { } %
Prezentm n Tabelul 4.1. denumirea unora din semnele
enumerate.
Tabelul 4.1. Cteva semne folosite n C i denumirea lor

Semn Nume Semn Nume
| bar vertical / slash
\ backslash ~ tilda
# diez _ liniu de subliniere (underscore)
& ampersand ^ sgeat sus

91

Simbolurile neafiabile (fr echivalent grafic) sunt
reprezentate prin secvene escape (de evitare) sau coduri
backslash-caracter. Aceste simboluri reprezint coduri ASCII
care nu pot fi citite de la tastatur. Folosirea lor n programe n
locul echivalentelor ASCII este recomandat din raiuni de
portabilitate. Codurile backslash ale limbajului C sunt prezentate
n Tabelul 4.2.
Tabelul 4.2. Codurile backslash din C i semnificaia lor
Cod
backslash
Semnificaie Cod
backslash
Semnificaie
\a alarm \ apostrof
\b backspace
(recul cu o poziie)
\ ghilimele
\f form feed
(salt pagin nou)
\0 caracter nul
\n newline (salt la rnd nou
i de la capt)
\\ backslash
\r carriage return
(retur car)
\ddd caracter ASCII n notaie
octal
\t horizontal tab
(tab orizontal)
\xdd caracter ASCII n notaie
hexazecimal
\v vertical tab (tab vertical)

Observaii:
Tab orizontal nseamn saltul cursorului cu un numr
de coloane, iar tab vertical saltul cursorului cu un
numr de linii.
Notaia octal folosete cifre n baza 8 (adic
0,1,2,3,4,5,6,7), iar notaia hexazecimal cifre
n baza 16 (adic 0,1,2,3,4,5,6,7,8,9,
A,B,C,D,E,F). Se observ c literele A,B,C,D,E,
F corespund respectiv numerelor 10,11,12,13,14,15.
Secvenele \ddd permit scrierea oricrui caracter
din setul ASCII ca un numr octal format din trei
cifre, iar secvenele \xdd ca un numr hexazecimal
format din dou cifre. De exemplu, caracterul
backspace poate fi scris ca \010 sau \x08.

Vocabularul limbajului
Vocabularul limbajului este alctuit din atomi lexicali.
92

Acetia reprezint grupuri de simboluri afiabile care primesc n
timpul procesului de compilare o anumit semnificaie.
Prezentm mai jos urmtorii atomi lexicali:
identificatori (nume);
constante;
operatori;
semne de punctuaie;
simboluri speciale.

Un identificator reprezint o secven de litere, cifre, liniue
de subliniere, primul caracter din secven fiind obligatoriu o
liter sau liniu de subliniere.
De exemplu, Cod_mat, cod_mat, y_1, ax, _ol sunt
identificatori, n timp ce x...1, a&b, 3xy nu sunt. n
legtur cu identificatorii facem urmtoarele precizri:
n C se face deosebirea ntre literele mari i mici ale
alfabetului. De exemplu, Cod_mat i cod_mat
reprezint nume diferite;
Dei sunt permii, este recomandabil ca identificatorii
care ncep cu liniu de subliniere s fie evitai. Ei pot
coincide cu nume rezervate, invizibile
programatorului, provocnd erori;
Standardul ANSI C nu limiteaz numrul de caractere
(lungimea) unui identificator. Un compilator C va
ignora ns caracterele aflate pe poziii mai mari dect
un numr prestabilit.
Dai cteva exemple de identificatori coreci.

Cuvintele cheie sunt cuvinte rezervate C care au o destinaie
prestabilit (nu pot fi folosite ca nume de funcie sau variabil).
Standardul ANSI C are 32 de cuvinte cheie, din care 27 au fost
definite de varianta original a limbajului C (standardul
Kernighan/Ritchie).
93

Tabelul 4.3. Cuvinte cheie dup standardul Kernighan / Ritchie
auto break case char continue
default do double else extern
float for goto if int
long register return short sizeof
static struct switch typedef union
unsigned while

Tabelul 4.4. Cuvinte cheie adugate de standardul ANSI C
const enum signed void volatile

Dup cum se poate observa, cuvintele cheie din C se scriu
cu litere mici. Pe lng cuvintele cheie rezervate de standardul
ANSI C, diverse tipuri de compilatoare C includ i cuvinte cheie
folosite n exploatarea eficient a mediului de operare specific
(faciliti privind programarea interlimbaje, accesarea
ntreruperilor etc.), numite cuvinte cheie extinse.
Cuvintele cheie extinse folosite cel mai des sunt:

asm cdecl far huge interrupt near
pascal _cs _ds _es _ss

Constantele pot fi numere, caractere, iruri de caractere;
valoarea lor nu se schimb n timpul execuiei unui program. n
C exist patru tipuri de constante: ntreg, real, caracter, ir.
O constant ntreag este un numr zecimal, octal sau
hexazecimal care reprezint o valoare ntreag pozitiv. Dac se
doresc i reprezentri ale unor numere ntregi negative se adaug
semnul minus n faa constantei respective.
Constantele ntregi zecimale sunt numere ntregi scrise n
baza 10 (de exemplu: 759,+38,6496), constantele octale sunt
numere n baza 8 care ncep, pentru identificare, cu cifra zero (de
exemplu: 012,0765), iar constantele hexazecimale sunt numere
n baza 16 care ncep pentru identificare cu caracterele 0x (de
exemplu: 0xA3,0xBC1,0x7E31).
Constantele reale sunt numere reale pozitive. Pentru a
reprezenta valori reale negative se plaseaz semnul minus n faa
constantei. Semnul minus este tratat ca operator aritmetic. Exist
dou modaliti de reprezentare o constantelor reale: n format F
(cu punct zecimal) i n format exponenial (form tiinific).
94

Reprezentarea n format F este reprezentarea uzual pentru
numere reale. De exemplu, constantele 32.753,0.591,-
4296.823, .69 sunt valori reale reprezentate n format F. Se
observ c partea ntreag a reprezentrii poate s lipseasc
atunci cnd este egal cu zero (.69 este tot una cu 0.69).
O constant real n format exponenial are forma general:
numar simbexp valexp
unde:
numar este o constant ntreag sau o constant real
n format F;
simbexp este E sau e;
valexp este o constant ntreag pozitiv precedat
sau nu de semnele + sau-;
grupul simbexp valexp se interpreteaz ca fiind
egal cu 10
valexp
.
Remarc. n realitate, ntre numar, simbexp, valexp
nu apar spaii. De exemplu, numerele reale: 1.6*10
3
, -
2.6*10
-4
, 0.32*10
6
, 423*10
4
se scriu, respectiv:
1.6E+3,-2.6E-4, 0.32e+6,423E+04.
O constant caracter este o liter, cifr, semn de punctuaie
sau secven escape cuprinse ntre dou apostrofuri. Exemplu de
constante caracter: a,\n,\,7 reprezentnd
respectiv a, newline, apostrof, 7.
O constant ir este o secven de litere, cifre i simboluri
incluse ntre ghilimele. Exemple de constante ir: \n Acesta
e un sir, Str. Cameliei, nr.3 etc.. Constantele ir
se memoreaz n octei consecutivi (un octet pentru fiecare
caracter). Sfritul irului este marcat de un octet nul (care
conine \0) ce se adaug automat. Din acest motiv un ir cu n
caractere ocup n+1 octei consecutivi.

Operatorii reprezint combinaii de semne speciale care
arat modalitatea de prelucrare sau atribuire a valorilor. Limbajul
C posed o bogat familie de operatori, fapt ce permite
elaborarea unor programe compacte. n Tabelul 4.5 prezentm
lista operatorilor C i semnificaia lor.
95

Tabelul 4.5. Lista operatorilor C i semnificaia lor

Operator Semnificaie
[] paranteze drepte (stng si dreapt)
() paranteze rotunde (stng si dreapt)
. membru structur

referin indirect la membru de structur
++ incrementare (prefix sau postfix)
-- decrementare (prefix sau postfix)
sizeof dimensiunea unei variabile sau unui tip n octei
~ NOT pe bit
! NOT logic
& adres, I pe bit
* indirectare, nmulire
/ mprire
+ adunare
- scdere, negaie aritmetic
<< deplasare logic pe bit la stnga
>> deplasare logic pe bit la dreapta
== egalitate
!= neegalitate
< mai mic
> mai mare
<= mai mic sau egal cu
>= mai mare sau egal cu
^ SAU exclusiv pe bit

SAU pe bit
&& I logic
|| SAU logic
?: operator condiional
= atribuire simpl
op= atribuire compus
% modul
, virgula (operator de secveniere)

Observaie. Caracterul op de la atribuirea compus poate fi
unul din semnele * / % + - >> << & ^ rezultnd
corespunztor operatorii compui *= /= %= += -= >>= <<=
= &= ^=.
ntre semnele care alctuiesc un operator compus nu trebuie
s existe spaiu. De exemplu, operatorul >= nu poate fi utilizat
sub forma > = . De la regula de mai sus face excepie operatorul
condiional (?:) care are alt interpretare.
96

Semnele de punctuaie folosite n C sunt: ... # : {}
Utilizarea lor va fi exemplificat pe parcursul lucrrii.

Simboluri speciale. Orice simbol care nu aparine
alfabetului C este considerat atom lexical. Astfel de semne sunt:
@ i $. Ele pot fi folosite n construcia constantelor caracter i a
irurilor. Ca exemplu, considerm constanta ir Am folosit
semnul @ in FoxPro.
Atomii lexicali sunt separai n cadrul programului prin
simboluri ale alfabetului cu rol de separator. Separatorii sunt:
spaiul, tabul (orizontal i vertical), sfrit de linie, sfrit de
pagin, comentariu. Prin comentariu se nelege orice succesiune
de simboluri cuprinse ntre /* i */. Comentariile nu sunt luate
n considerare de compilator, ele servesc la documentarea
programului uurnd nelegerea i depanarea lui. Un comentariu
poate fi plasat oriunde n program i se poate ntinde pe unul sau
mai multe rnduri.
Exemplu:
/*
Acest program calculeaza produsul a doua
matrici. Matricile de intrare A(4x3) si B(3x2) se
citesc de la tastatura, iar matricea produs
rezultata este C(4x2).
*/

Comentariile nu pot fi imbricate (incluse unul n altul). De
exemplu, urmtoarea construcie este eronat:
/* Un comentariu care include
/* un comentariu inclus */
*/

Modul n care sunt aranjai atomii lexicali ntr-un program
este impus de specificul problemei i de regulile de sintax ale
limbajului.

97

Test de autoevaluare
4.6. Un identificator este:
a. o secven de cifre, liniue de subliniere i litere
b. o secven de cifre, liniue de subliniere i litere,
primul caracter din secven fiind obligatoriu liniu de
subliniere sau liter
c. o secven de cifre, litere, spaii, liniue de subliniere
4.7. n C un identificator poate fi scris:
a. numai cu litere mici
b. numai cu litere mari
c. combinat, cu litere mici i litere mari
4.8. Dac ntr-un identificator C se nlocuiete o liter mic
(mare) cu litera sa omoloag mare (mic) atunci:
a. identificatorul obinut este considerat identic cu
primul
b. se obine un identificator diferit
4.9. n C exist:
a. patru tipuri de constante: ntregi, reale, caracter, ir
b. patru tipuri de constante: naturale, reale, complexe,
caracter
c. cinci tipuri de constante: ntregi, reale, complexe,
caracter, ir
4.10. n C secvena de cifre 0631 este interpretat ca:
a. o constant n baz 10
b. o constant n baz 8
c. o constant n baz 16
4.11. Secvena de caractere 0xABC poate fi:
a. un identificator
b. o constant hexazecimal
c. i una i alta

98

4.12. Cuvintele cheie:
a. au semnificaii date de programator
b. au semnificaii prestabilite
c. au semnificaii date de contextul n care sunt utilizate
4.13. Despre constantele reale 3.0E-2 i .03 se poate
afirma c:
a. sunt greite deoarece conin punct n loc de virgul
b. sunt corecte i reprezint valori diferite
c. sunt corecte i reprezint aceeai valoare
d. sunt greite deoarece prima conine litera E, iar a
doua nu are parte ntreag
4.14. Secvena a reprezint:
a. un ir
b. un caracter
4.15. Secvena Citirea matricii Areprezint:
a. un ir
b. un comentariu
c. nici una, nici alta
4.16. Construciile a i a:
a. reprezint acelai lucru
b. reprezint un ir, respectiv un caracter
c. reprezint un caracter, respectiv un ir
Expresii n C. Funcii de intrare/ieire uzuale pentru
consol
Expresiile sunt combinaii valide sintactic de date i
operatori. Aici, prin date nelegem deopotriv constante i
variabile. Spre deosebire de constante care sunt valori fixe,
variabilele semnific valori care se pot modifica prin program.
n C, ca i n alte limbaje, datele sunt clasificate n tipuri de
date. Exist tipuri de date fundamentale (numite i predefinite,
simple sau de baz) i tipuri de date derivate. Tipurile derivate
99

(tablouri, pointeri, structuri, uniuni, enumerri i orice tip definit
de programator) se bazeaz pe tipurile fundamentale.

Tipurile fundamentale de date n C
Tipurile de date fundamentale din C se mpart n cinci
categorii: char, int, float, double i void. Primele patru tipuri se
mai numesc i tipuri aritmetice i se refer respectiv la valori
caracter, ntregi, reale n simpl precizie i reale n dubl
precizie. Tipul de date void indic absena oricrei valori i este
utilizat, de exemplu, la descrierea funciilor care nu returneaz
nici o valoare.
Dimensiunea zonei de memorie alocate i domeniul de
valori asociate tipurilor aritmetice pot s difere funcie de
varianta de implementare a limbajului i de tipul de procesor
folosit. Standardul ANSI C nu precizeaz dect domeniul
minimal de valori al fiecrui tip de date, nu i dimensiunea sa. n
majoritatea implementrilor ns, tipul char ocup un octet, int
ocup doi octei, iar float patru octei. Domeniul de valori poate
fi modificat utiliznd modificatorii de tip. Acetia sunt: signed,
unsigned, short i long. Modificatorii signed, unsigned, short
i long se pot aplica tipului int, signed i unsigned, tipului char,
iar long, tipului double. Efectul aplicrii modificatorilor signed
sau unsigned asupra tipurilor de date ntregi const n
interpretarea diferit, din punct de vedere al semnului, a
informaiei memorate. S considerm o configuraie binar de
lungime N, biii fiind numerotai ca mai jos:
N - 1 N - 2 1 0

Figura 4.2. Configuraie binar de N bii

Dac aceast zon o destinm memorrii doar a ntregilor
pozitivi, printr-un calcul simplu se vede c plaja de reprezentare
este [0, 2
N
-1]. Dac zona este destinat memorrii att a
ntregilor cu semn ct i fr semn, bitul N-1 va fi folosit pentru
reprezentarea semnului (0 pentru numere pozitive, 1 pentru
numere negative), iar plaja de reprezentare va fi [-2
N-1
, 2
N-1
-1].
Avnd n vedere aceste consideraii, de exemplu, o variabil
de tip signed int va avea un domeniu de valori cuprins ntre -
32768 i 32767, iar una de tip unsigned int va lua valori ntre 0
100

i 65535.
Observaii:
Pentru tipul ntreg de date (char, int, short, long)
reprezentarea implicit este signed.
Specificarea unui modificator fr tip nseamn
considerarea implicit a tipului int.
n C nu exist tipul de date boolean. Din acest motiv
funcioneaz urmtoarea convenie: orice expresie
diferit de zero are valoarea adevrat, iar dac e egal
cu zero, valoarea fals.
Variabile i tipuri de date
Asocierea dintre numele unei variabile i un anumit tip de
date se face folosind declaraiile. Forma general a declaraiei
unei variabile este:
tip lista_de_variabile;

unde: tip poate fi orice tip de date recunoscut n C, iar
lista_de_variabile conine unul sau mai muli
identificatori desprii prin virgul. n exemplele de mai jos vom
folosi doar tipurile fundamentale.
Exemple de declaraii de variabile:
float x,y;
int a,b1;
short a_x,b_y;
double z;

Orice variabil folosit n program trebuie mai nti
declarat. Dac pe linia de declarare variabila este iniializat se
spune c are loc o definire a variabilei.
Exemple de declaraii i definiii de variabile:
float x=38.981,I;
int ab=-453;
char ch=A,z;

Orice variabil definit (adic declarat i iniializat)
pstreaz n continuare atributul de baz al variabilei, adic poate
fi modificat. Dac se dorete nghearea asocierii dintre o
variabil i o anumit valoare se utilizeaz modificatorul de
101

acces (sau calificatorul) const. Practic, efectul unei declaraii de
genul
const tip nume_variabila;

este crearea constantei simbolice nume care poate fi utilizat, dar
nu poate fi modificat prin program. Dac tip lipsete se
consider implicit c tipul este int. n exemplul de mai jos se
definesc dou constante, constanta pi i constanta de tip int,
ore_zi. Exemplu:
const double pi=3.1415926536;
const ore_zi=24;

Constante i tipuri de date
Anterior s-a prezentat o clasificare a constantelor n: ntregi,
reale, caracter, ir. Se pune problema, crui tip de date i aparine
o constant numeric? Cnd constanta este caracter, rspunsul
este simplu: tipului char. De asemenea, constanta n virgul
mobil (n notaie uzual cu punct sau n notaie tiinific) va
aparine tipului double. Pentru celelalte constante numerice
compilatorul va considera implicit ncadrarea n cel mai mic tip
de date compatibil. De exemplu, 23 este de tip int, 65000 de tip
unsigned, 2000002 de tip long int. ncadrarea ntr-un tip de date
se poate face i explicit adugnd constantei unul din sufixurile L
sau U, dac e ntreag sau F sau L, dac e real. Constanta
ntreag cu sufixul L este de tip long, iar cu sufixul U, de tip
unsigned. Constanta real cu sufixul F are tipul float, iar dac e
urmat de sufixul L are tipul long double.

Funcii uzuale de intrare/ieire pentru consol.
Descriptori de format
Prezentm n continuare funciile folosite frecvent pentru
transferul de date de la tastatur n memoria calculatorului
(funcii de intrare) i din memoria calculatorului pe ecran
(funcii de ieire); cu aceast ocazie introducem i descriptorii de
format cei mai folosii. Deosebim trei categorii de funcii de
intrare/ieire pentru consol:
102

funcii generale de intrare/ieire (scanf() i printf());
funcii speciale de intrare/ieire:
funcii pentru citirea i scrierea caracterelor;
funcii pentru citirea i scrierea irurilor de caractere.

Funciile printf() i scanf() reprezint echivalentele pentru
consol a funciilor de intrare/ieire pentru fiiere, fprintf() i
fscanf(). Forma general a funciei de afiare printf() este:
int printf(sir_format,lista_de_argumente);
unde:
sir_format poate conine: mesaje pentru utilizator,
secvene escape i descriptori de format pentru
valorile care se afieaz;
lista_de_argumente reprezint variabile sau
expresii al cror coninut se va afia.
Funcia ntoarce numrul de caractere scrise efectiv sau o
valoare negativ n caz de insucces.

Precizri:
Descriptorii de format servesc la efectuarea
conversiilor dintre reprezentarea extern i intern (la
citire) i ntre reprezentarea intern i extern (la
scriere); formatul extern presupune succesiuni de
caractere, iar cel intern succesiuni de cifre binare;
Att la scriere ct i la citire, descriptorii de format
sunt pui n coresponden de la stnga spre dreapta
cu elementele listei de argumente. Argumentul
trebuie s fie compatibil cu tipul anunat n
descriptorul de format corespunztor;
Dac numrul de argumente este mai mic dect
numrul descriptorilor de format, datele de ieire
sunt nedefinite; dac numrul argumentelor este mai
mare dect numrul descriptorilor de format,
argumentele n plus sunt ignorate.
n Tabelul 4.6. prezentm lista celor mai utilizai descriptori
103

folosii de funcia printf() i semnificaia lor.
Tabelul 4.6. Descriptori de format
Descriptor Utilizare
%u numere ntregi zecimale fr semn
%d sau %i numere ntregi zecimale cu semn
%c caracter
%f numere reale n notaie uzual
%e sau %E numere reale n notaie tiinific (e sau E)
%x sau %X hexazecimal fr semn (litere mici sau
majuscule)
%o octal fr semn
%s ir de caractere
%g sau %G se alege reprezentarea cu numrul cel mai
mic de caractere dintre cea n notaie
uzual i cea n notaie tiinific (de tip e
sau E)
%p valoare pointer

Descriptorul %x are ca efect afiarea cifrelor hexazecimale
A,B,C,D,E,F cu liter mic; dac se folosete %X se afieaz cu
litere mari.
Dac se folosete %e litera e din notaia tiinific apare
ca e, iar dac se folosete %E, apare ca majuscul (litera E).
Valorile de tip long int se afieaz utiliznd
%ld,%li,%lu,%lo sau %lx. Valorile de tip short int se
afieaz utiliznd %hd,%hi,%hu,%ho sau %hx.
Pentru a afia valori double se va alege una din variantele:
%lf,%le,%lE,%lg,%lG, iar pentru valori long double una din
variantele: %Lf,%Le,%LE,%Lg,%LG.
Tabelul 11 prezint descriptori de format fr caracteristici
de lungime, precizie i aliniere. Folosii astfel, ei aliniaz implicit
valorile la stnga i folosesc spaiu de afiare necesar
reprezentrii acestor valori dup cum urmeaz:
%f afieaz implicit partea ntreag, punctul i 6 cifre la
partea subunitar;
%e sau %E afieaz implicit o cifr la partea ntreag, 6 cifre
la partea subunitar, caracterul e sau E i exponentul precedat de
+ sau -;
%g sau %G alege reprezentarea cu cel mai mic numr de
104

caractere dintre cea uzual i cea tiinific.
%d,%i,%c,%o,%x,%X,%s,%p folosesc un numr de
coloane egal cu numrul de caractere ce trebuie afiate.
Exemplificm folosirea descriptorilor prezentai i a
secvenelor de evitare cu ajutorul urmtoarelor programe:
Exemplul 4.2.
Afiarea valorilor i sumei a dou numere ntregi, sub
forma:
x=valoare y=valoare
suma=valoare

# include "stdio.h"
void main(void)
{
int x=10, y=-43;
printf ("\n\tx=%d\t\y=%d\n\t suma=%i",
x,y, x+y);
}
Exemplul 4.3
Afiarea unei constante ntregi i a valorilor sale n octal i
hexazecimal pe cte un rnd.
#include "stdio.h"
void main(void)
{
const x=4529;
printf("\n numarul este=%d\n",x);
printf("\n valoarea in octal
este=%o",x);
printf("\n valoarea in hexazecimal
este=%x",x);
}
Exemplul 4.4
Afiarea unui caracter i a codului su ASCII; afiarea se va
termina cu un semnal sonor.
#include "stdio.h"
void main(void)
{
char a='Q';
105

printf("\n caracterul %c are codul
ASCII=%i\a",a,a);
}
Exemplul 4.5
Afiarea unor valori folosind diveri descriptori de format;
comentariile arat efectul execuiei funciei printf().
#include "stdio.h"
void main(void)
{
char ch;
short k;
int i;
long int j;
float x;
clrscr();
ch='A';
printf("\n Caracterul %c are codul ASCII
=%i",ch,ch);
/* Caracterul A are codul ASCII = 65 */
k=250;
printf("\n k=%hu",k); /* k=250 */
i=4567;
printf("\n i=%i",i); /* i=4567 */
printf("\n i=%u",i); /* i=4567 */
printf("\n i=%i",-i); /* -i=-4567 */
printf("\n i=%i",i); /* i=4567 */
printf(" are valoarea hexazecimala
%x",i);
/* are valoarea hexazecimala 11d7 */
printf(" sau echivalent, %X",i);
/* sau echivalent, 11D7 */
printf("\n i=%i",i); /* i=4567 */
printf(" are valoarea octala %o",i);
/* are valoarea octala 10727 */
j=123456;
printf("\n j=%li",j); /* j=123456 */
x=76.5432;
printf("\n x=%f",x); /* x=76.543198 */
printf("\n x=%e",x); /* x=7.65320e+01 */
printf("\n x=%E",x); /* x=7.65320E+01 */
printf("\n x=%g",x); /* x=76.543200 */
printf("\n x=%G",x); /* x=76.543200 */
x=-0.123456789;
printf("\nx=%f",x); /*x=-0.123457 */
printf("\nx=%e",x); /*x=-1.234568e-01 */
printf("\n x=%E",x);/* x=-1.234568E-01*/
106

printf("\n x=%g",x); /*x=-0.123457 */
printf("\n x=%G",x); /*x=-0.123457 */
printf("\n %s","testare");
}

Dimensiunea cmpului de afiare, precizia i modul de
aliniere pot fi stabilite prin simboluri plasate ntre semnul % i
specificatorul descriptorului de format (i,d,u,f etc.).
Astfel, un ntreg pozitiv aflat ntre % i specificatorul
descriptorului de format indic dimensiunea minim a cmpului
de afiare. Dac irul sau numrul care se afieaz are mai multe
caractere dect dimensiunea minim precizat, atunci afiarea va
fi integral, n caz contrar se completeaz cu spaii pn la
realizarea dimensiunii minime. Dac dorim ca aceast completare
s fie fcut cu cifra 0 n loc de spaii, atunci, nainte de ntregul
care specific dimensiunea de afiare, se pune cifra 0.
De exemplu, descriptorul %7f semnific afiarea unui
numr real pe minim 7 coloane i, completarea eventualelor
coloane libere cu spaii, iar %07f impune acelai numr minim
de coloane pentru afiare, ns completarea coloanelor libere se
va face cu cifra 0.
Utilitatea precizrii dimensiunii minime de afiare apare mai
ales la afiarea tablourilor n care alinierea se face pe coloane.
Programul urmtor ilustreaz efectul precizrii dimensiunii
cmpului de afiare:
Exemplul 4.6
Afiarea unor valori folosind descriptori de format cu
precizarea dimensiunii cmpului de afiare.
#include "stdio.h"
void main(void)
{
int i;
float x;
i=4567;
printf("\n i=%4i",i); /* i=4567 */
printf("\n i=%6i",i); /* i= 4567 */
printf("\n i=%3i",i); /* i=4567 */
printf("\n i=%06i",i); /* i=004567 */
x=76.123001;
printf("\n x=%10f",x); /* x= 76.123001*/
107

printf("\n x=%010f",x);/* x=076.123001*/
printf("\n %3s","testare");/* testare */
printf("\n %10s","testare");/* testare*/
}

Precizia de afiare se specific printr-un punct urmat de un
ntreg pozitiv. Specificatorul de precizie astfel obinut se plaseaz
imediat dup dimensiunea cmpului de afiare (cnd este
precizat). Interpretarea lui depinde de tipul de date avut n
vedere.
De exemplu, descriptorul %7.3f indic afiarea unui numr
real pe minim 7 coloane i cu 3 cifre zecimale dup virgul.
Lucrurile se petrec asemntor dac n loc de %f se folosete %e
sau %E. Dac se folosete unul din descriptorii %g sau %G
specificatorul de precizie arat minimul de cifre semnificative.
Aplicat unui ntreg, specificatorul de precizie arat numrul
minim de cifre cu care va apare afiat ntregul respectiv (dac
ntregul nu are suficiente cifre atunci se completeaz la nceput
cu numrul necesar de cifre 0).
Un descriptor de format prevzut cu specificator de
dimensiune i specificator de precizie poate fi aplicat unui ir cu
lungimea cuprins ntre valoarea specificatorului de dimensiune
i cea a specificatorului de precizie. Dac se depete valoarea
specificatorului de precizie, irul se trunchiaz.
Se poate impune alinierea la stnga a datelor plasnd semnul
(minus) imediat dup semnul % n cadrul descriptorului.
Programul urmtor ilustreaz toate cazurile prezentate:
Exemplul 4.7
Afiarea unor valori folosind diverse faciliti ale
descriptorilor prezentai
#include "stdio.h"
void main(void)
{
int i;
double x;
i=4567;
printf("\n i=%3.7i",i); /* i=0004567 */
printf("\n i=%7.3i",i); /* i= 4567 */
108

printf("\n i=%-7.3i",i); /* i=4567 */
x=76.123401;
printf("\n x=%10.3f",x); /* x= 76.123*/
printf("\n x=%-10.3f",x); /* x=76.123*/
printf("\n x=%3.7f",x); /* x=76.1234010*/
printf("\n x=%10.2e",x); /* x= 7.61e+01*/
printf("\n x=%-10.1E",x); /* x=7.6E+01*/
printf("\n x=%10.3g",x); /*x= 76.1*/
printf("\n x=%-10.4G",x); /* x=76.12*/

printf("\n %.4s","testare"); /* test */
printf("\n %10.4s","testare");/* test*/
printf("\n %-10.4s","testare");/* test */
printf("\n %-1.10s","testare");/* testare*/
}

Funcia de citire scanf() are forma general:
int scanf(sir_format,lista_de_argumente);
unde:
sir_format poate conine descriptori de format,
caractere de spaiere albe, alte caractere;
lista_de_argumente este de forma:
&var
1
,&var
2
,...,&var
n
. Prin &v se nelege
adresa variabilei v.
Funcia ntoarce numrul de argumente crora li s-a atribuit
o valoare sau constanta EOF (egal de obicei cu 1) n caz de
insucces.

Precizri:
n marea lor majoritate descriptorii de format folosii
la funcia scanf() sunt identici cu cei de la funcia
printf(); practic, din tabelul prezentat anterior
obinem o list valid pentru scanf(), ndeprtnd
%E,%X,%G. Folosii cu scanf(), descriptorii
%f,%e,%g sunt echivaleni.
Lista de argumente este citit de la stnga la dreapta
i asociat n aceast ordine cu lista de descriptori.
Fiecare descriptor arat funciei scanf() tipul valorii
care se va citi: ntreg, real, ir, pointer etc.. S
observm c aceste valori sunt transferate variabilelor
v
1
,v
2
,...v
n
prin intermediul adreselor
109

&v
1
,&v
2
,...&v
n
.
Este de menionat faptul c n cazul citirii unui ir,
deoarece nsui numele irului reprezint o adres,
operatorul de luare a adresei & nu va mai preceda
obligatoriu numele irului. Un exemplu de program
care citete iruri de caractere este prezentat n UI5, n
paragraful Funcii pentru prelucrarea irurilor de
caractere).
Ca i n cazul funciei printf() descriptorii de format
pot avea i un modificator de lungime maxim a
irului de caractere care va fi citit. De exemplu,
apelul:
scanf(%15s,sir);
are drept consecin citirea a maximum 15 caractere
din irul de intrare i atribuirea irului format
variabilei sir. Dac irul de intrare are mai mult de
15 caractere, caracterele n plus se ignor; la un nou
apel al funciei scanf() explorarea irului de intrare
ncepe cu aceste caractere anterior ignorate.
Caracterele albe de spaiere n irurile de intrare pot fi
blank-urile (spaiile albe), tab-urile (spaii
tab), sau caracterul linie nou (tasta enter). Aceste
caractere albe de spaiere sunt ignorate dac n irul
format avem corespunztor ntre descriptori cel puin
un spaiu. De asemenea, orice alt caracter poate fi
folosit ca separator n fluxul de intrare, cu condiia ca
el s fie plasat corespunztor i ntre descriptorii de
format din sir_format. Dac aceast condiie nu e
ndeplinit, la prima neconcordan (de la stnga la
dreapta) ntre separatorii din fluxul de intrare i cei
din sir_format execuia funciei scanf() se ncheie.
De exemplu, apelul funciei scanf():
scanf(%d,%f,%s,&x,&y,sir);
realizeaz o atribuire corect a datelor de intrare dac
ele sunt desprite prin virgul. Pentru a atribui
variabilei x valoarea 32, lui y valoarea 10.75 i
variabilei sir valoarea anI, n fluxul de intrare
trebuie s avem 32,10.75,anI.
110

Exemplul 4.8
Citirea numerelor reale x i X de la tastatur, calculul
produsului x*X i afiarea lui n format exponenial.
#include "stdio.h"
void main(void)
{
float x,X;
printf("\n Tastati doua numere separate
prin spatiu ");
scanf("%f %f",&x,&X);
X=X*x;
printf("\n Produsul X*x este = %e", X);
}

Observaii:
X i x sunt variabile diferite;
X=X*x; este o expresie de atribuire care se poate
scrie mai scurt sub forma X*=x; cu ajutorul
operatorului compus *=.
Funciile scanf() i printf() sunt funcii de intrare/ieire
standard cu destinaie general. Din considerente de eficien
(cod mai mic, vitez de execuie sporit, comoditate n
programare etc.) limbajul C pune la dispoziia utilizatorului i
funcii cu destinaie special.

Funcii speciale pentru citirea/scrierea caracterelor la
nivelul consolei
Standardul ANSI C prevede dou funcii simetrice pentru
transferul caracterelor la nivelul consolei: funciile getchar() i
putchar(). Ele i au prototipurile n stdio.h.
Funcia pentru citire getchar() are forma general
int getchar(void);

i ntoarce urmtorul caracter care va fi citit. Dac s-a atins
sfritul irului sau se produce o eroare se ntoarce EOF.
Dei nu aparin standardului ANSI C, totui, funciile
getch(), getche(), putch() sunt incluse frecvent n biblioteca
standard a compilatoarelor compatibile DOS. Prototipurile
111

acestor funcii sunt n fiierul header conio.h.
Funciile getch() i getche() sunt echivalente funcional cu
funcia getchar(). Forma general este:
int getch(void);
int getche(void);

Spre deosebire de funcia getchar() unde caracterul tastat


este citit numai dac se apas n continuare tasta Enter, funciile
getch() i getche() preiau caracterul imediat dup ce a fost tastat
(fr a mai apsa Enter). De asemenea, funcia getch() preia
caracterul de la tastatur fr a-l afia pe ecran, n timp ce
getche() afieaz pe ecran caracterul citit (citire cu ecou).
Funcia pentru afiare putchar() are forma general
int putchar(int ch);

unde ch este caracterul care se afieaz. Funcia ntoarce n caz
de succes caracterul scris, iar n caz contrar EOF.
Funcia putch() este echivalent funcional cu putchar() i
are forma general
int putch(int ch);

unde ch este caracterul care se afieaz. Este de asemenea o
funcie nestandard frecvent utilizat.
Exemplul 4.9
Citirea si afiarea unui caracter folosind funciile speciale
getche() i putch().
#include "stdio.h"
#include "conio.h"
void main(void)
{
char x;
printf("\n Tastati o litera! ");
x=getche();
printf("\n Multumesc! Ati tastat litera ");
putch(x);
getch();
}

112

Funcii speciale pentru citirea/scrierea irurilor de
caractere la nivelul consolei
Funcii speciale pentru citirea/scrierea irurilor de caractere
la nivelul consolei sunt gets() i puts(). Ambele funcii i au
prototipurile n fiierul header stdio.h. Deoarece n
construcia acestor prototipuri intervine noiunea de pointer, care
nu face obiectul acestui curs introductiv, ne limitm aici la a
spune c prin apelul
gets(sir_destinatie);
se citete un ir de la tastatur n sir_destinatie, iar apelul
puts(sir);
are ca efect afiarea irului sir pe ecran.
Dm ca exemplu secvena de program:
. . . . . . .
gets(x);
. . . . . . .
printf(\n Sirul citit este =);
puts(x);
. . . . . . .

Un program complet care utilizeaz funciile gets() i puts()
este prezentat n UI5 (vezi paragraful Funcii pentru prelucrarea
irurilor de caractere).

Operatori. Clasificare
Operatorii sunt elemente de baz ale limbajului care arat
ce operaii trebuie executate asupra unor operanzi. n C, operanzi
pot fi constantele, numele de variabile, numele de funcii,
expresiile. Bogata familie de operatori confer limbajului C o
trstur aparte. Clasificarea operatorilor C se poate face dup
mai multe criterii:
dup numrul de operanzi prelucrai (unari, binari,
ternari);
dup prioritatea avut n evaluarea expresiilor (clase
de preceden);
dup tipul operanzilor (aritmetici, relaionali, logici i
la nivel de bit).
113

Operatori unari, binari, ternari. innd cont de numrul de
operanzi prelucrai, n C exist operatori unari, binari i ternari.
Clasele rezultate nu sunt disjuncte, n sensul c, de exemplu, un
operator unar poate fi i binar. Astfel, n expresia -3 operatorul -
(minus) este unar, iar n expresia a-3, este binar.
Singurul operator ternar este operatorul condiional ?:.
Operanzii si sunt plasai dup schema operand1 ?
operand2 : operand 3.
Clase de preceden. Prioritile operatorilor impun ordinea
de evaluare a expresiilor. Ca i n calculele algebrice obinuite
ordinea de evaluare poate fi modificat cu ajutorul parantezelor
rotunde.
Operatorii care au prioriti egale, aparin aceleiai clase de
preceden. Lista operatorilor grupai dup clase de preceden
este dat n Tabelul 4.7.
Tabelul 4.7. Clase de preceden
Clasa Operatori
1 (paranteze, op. de selecie) () [] -> .
2 (op.unari) ++ -- ! ~ - + & * sizeof cast
3 (op. multiplicativi) % / *
4 (op. aditivi) + -
5 (op. shift) << >>
6 (op. relaionali) < <= > >=
7 (op. relaionali) == !=
8 (I pe bit) &
9 (SAU exclusiv bit cu bit) ^
10 (SAU bit cu bit) |
11 (SI logic) &&
12 (SAU logic) ||
13 (operator condiional) ?:
14 (atribuire) = += -= *= etc.
15 (secveniere) ,

Funcioneaz, de asemenea, reguli de asociere de la stnga
la dreapta sau de la dreapta la stnga. Singurii operatori care se
asociaz de la dreapta la stnga sunt operatorii unari i operatorul
?:, restul se asociaz de la stnga la dreapta.
Operatorul de atribuire = ocup un loc aparte n familia
operatorilor. Cu ajutorul lui putem s atribuim unei variabile o
anumit valoare.
114

Forma sa general este:
v=e;

unde v este un nume de variabil, iar e este o expresie. n C,
membrul stng i membrul drept al unei atribuiri se mai numesc
valoare stng (lvalue), respectiv valoare dreapt (rvalue). Spre
deosebire de alte limbaje (Fortran, Pascal etc.) n C, operatorul de
atribuire poate apare i n interiorul unei expresii, fapt ce permite
o compactare a codului surs. De exemplu, dou atribuiri
succesive de genul:
A=pi*r*r;
V=A*h;

pot fi scrise compact sub forma:
V=(A=pi*r*r)*h;

Practic, ce am scris mai sus este o instruciune expresie.
Rezultatul evalurii expresiei (A=pi*r*r)este pi*r*r; dup
cum se vede, acest rezultat se poate folosi mai departe n calcule.
Atribuirea valorii pi*r*r variabilei A apare ca un efect secundar
al instruciunii expresie A=pi*r*r;.
Compilatorul C permite ca n expresii de genul
v=e;
unde v i e s aib tipuri diferite. n aceast situaie au loc
conversii de tip. Regula de conversie este urmtoarea: valoarea
membrului drept (valoarea lui e) se convertete la tipul
membrului stng (tipul lui v). Deoarece sizeof (int) <= sizeof
(float) <= sizeof (double), se spune c int este mai slab dect
float, care este la rndul su mai slab dect double. Dac
membrul stng este de un tip mai slab dect tipul membrului
drept pot avea loc pierderi de informaie (prin trunchiere) sau
depirea posibilitilor de reprezentare. De exemplu, n
secvena:
int x,y;
float a,b;
.........
x=a;
b=y;

115

variabila x va primi partea fr fracie a valorii a sau un rezultat
imprevizibil dac se depesc posibilitile de reprezentare, iar
valoarea ntreag y va fi convertit la o valoare reprezentat n
virgul mobil.
Consideraiile de mai sus referitore la conversia tipurilor
sunt valabile i n situaia n care cel puin unul dintre cei doi
operanzi ai operatorului de atribuire sunt variante ale tipului int
(char, signed, unsigned, short, long) sau ale tipului double
(long double).
n C este posibil atribuirea multipl, ca n exemplul de
mai jos:
x=y=z=s=0;

Efectul este atribuirea valorii 0 variabilelor x,y,z,s.
De asemenea, n anumite situaii se pot folosi operatorii de
atribuire compus. Practic, orice atribuire de genul:
variabila=variabila operator expresie;

unde operator poate fi ales din lista de operatori *, /, %,
+, -, >>, <<, , &, ^ se poate scrie simplificat sub forma:
variabila operator=expresie;

De exemplu, expresia x=x+2; are acelai efect cu x+=2;
Dac v e un operand oarecare cazurile uzuale de atribuire
v=v+1 i v=v-1 se pot scrie simplificat sub forma v++ i
respectiv v--. Operatorul ++ se numete operator de
incrementare, iar -- operator de decrementare. Funcie de
poziia lor fa de operand ei pot fi operatori prefix sau postfix.
De exemplu:
x=x+1 se poate scrie x++ sau ++x,
x=x-1 se poate scrie x-- sau --x.

Dac operandul nu apare n cadrul unei expresii, dup cum
se vede din exemplul de mai sus, nu are importan dac
operatorii sunt prefix sau postfix. Cnd operandul apare n cadrul
unei expresii, dac este precedat de operatorul ++ sau -- se
116

execut nti incrementarea sau decrementarea operandului i
apoi este folosit n expresie; dac este ns urmat de operatorul
++ sau -- incrementarea sau decrementarea se va face dup
folosirea sa n expresie.
De exemplu, expresia y=++x; este echivalent cu
secvena x=x+1; y=x;
Iar expresia y=x++; este echivalent cu secvena
y=x; x=x+1;
S observm c cele dou secvene vor produce aceeai
valoare pentru x i valori diferite pentru y.
Folosirea operatorilor de incrementare i decrementare este
recomandabil nu doar din raiuni de simplificare a scrierii
programelor ci i datorit faptului c majoritatea compilatoarelor
C genereaz coduri obiect foarte rapide n astfel de cazuri.
Operatorul de secveniere (virgula) permite construirea unei
expresii ca o list de alte expresii. Expresiile din list se
evalueaz de la stnga la dreapta. Valoarea i tipul ntregii
expresii este dat de ultima expresie din list. De exemplu, n
urma execuiei secvenei de program:
. . . . .
int x=7,y=3,z,w;
. . . . .
z=(w=x<y,x+y);

z va primi valoarea 10. Explicaia este urmtoarea: se
evalueaz mai nti expresia w=x<y, apoi expresia x+y.
Rezultatul evalurii expresiei x+y este 10, iar ntreaga expresie
(w=x<y,x+y) va primi aceast valoare care se va atribui lui z.
Practic, operatorul virgul ofer o modalitate elegant de a
scrie mai multe expresii n secven, sub forma compact a unei
singure expresii. n exemplul de mai sus, expresia
z=(w=x<y,x+y);

nlocuiete secvena
w=x<y;
z=x+y;
Operatorii ?,[,] vor fi prezentai mai pe larg n capitolele
unde prezena lor este necesar: operatorul ?: la instruciuni
117

condiionale, parantezele ptrate [ i ] la tipul de date tablou.
Limbajul C are urmtorii operatori aritmetici: -
,+,*,/,%,--,++.
Semnificaia lor rezult din Tabelul 10 i din prezentarea
fcut anterior operatorilor ++ i --. n plus vom face
urmtoarele observaii:
aplicat unor operanzi ntregi, operatorul / va produce
doar partea ntreag a mpririi; de exemplu,
secvena:
. . .
int x,y;
x=7;
y=x/2;
. . .
va produce valoarea 3 pentru y.
operatorul % aplicat unor operanzi ntregi furnizeaz
restul mpririi acelor ntregi; de exemplu, secvena:
. . .
int x,y
x=7;
y=x%2;
. . .
produce pentru y valoarea y=1, adic restul mpririi
lui 7 la 2.

Operatori relaionali i logici. Operatorii relaionali din
limbajul C sunt: <, >, <=, >=, ==, !=. Semnificaia lor
rezult din Tabelul 4.7. n urma evalurii unei expresii n care
intervin operatori relaionali rezult valoarea 0 pentru fals i 1
pentru adevrat. Programul de mai jos afieaz valorile anunate
n comentariile alturate:
Exemplul 4.10
Afiarea valorilor unor expresii n care intervin operatori
relaionali

#include "stdio.h"
#include "conio.h"

118

void main(void)
{
float x=0, y=2.3;
printf("\n x<y are valoarea %d",x<y) ;/*1*/
printf("\n x<=y are valoarea %d",x<=y);/*1*/
printf("\n x>y are valoarea %d",x>y); /*0*/
printf("\n x>=y are valoarea %d",x>=y);/*0*/
printf("\n x==y are valoarea %d",x==y);/*0*/
printf("\n x!=y are valoarea %d",x!=y);/*1*/
getch();
}

Operatorii logici din C sunt: ! (NU logic), && (I logic),
|| (SAU logic). Modul de aciune al acestor operatori este
prezentat n Tabelul 4.8.
Tabelul 4.8. Tabla valorilor de adevr pentru operatori logici
a b a && b a || b !a
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

Observaii:
Din Tabelul 4.8 rezult c operatorii logici && i || au o
prioritate mai mic dect operatorii relaionali. Din acest motiv:
expresia a<=b||c>d e echivalent cu (a<=b)||(c>d)
expresia a>b&&c<=d e echivalent cu (a>b)&&(c<=d)
Concluzia este c n astfel de situaii prezena parantezelor
este opional. Exist ns cazuri n care parantezele sunt absolut
necesare; de exemplu, dac dorim s negm expresia a>3 vom
scrie !(a>3) i nu !a>3. Expresia !(a>3) va returna corect
valoarea 0 sau 1 funcie de mrimea lui a, n timp ce expresia
!a>3 are totdeauna valoarea 0 (datorit prioritii mai mari a
operatorului ! fa de > se evalueaz mai nti !a care poate fi 0
sau 1; oricare ar fi valoarea lui a, rezult n final valoarea 0).
Dac ntr-o expresie format din operanzi legai prin
operatorul || , iar valoarea primului operand este 1, valoarea
expresiei este 1 (vezi Tabelul 4.8) i ceilali operanzi nu se mai
evalueaz. Dac ntr-o expresie format din operanzi legai prin
operatorul &&, primul operand ia valoarea 0, valoarea expresiei
119

este 0 iar ceilali operanzi nu se mai evalueaz.
Deoarece prezena parantezelor nu reduce viteza de execuie
a expresiilor, ele pot fi folosite, alturi de spaii, la creterea
gradului de lizibilitate a unui program. Iat dou expresii
echivalente:
a=c<d||d>=c&&a<3;
a = (c<d) || (d>=c) && (a<3);
Este evident c cea de a doua expresie este mai uor de citit.

Operatorii la nivel de bit din C permit programatorului s
manevreze biii aparinnd unor valori de tip char sau int (ei nu
se aplic tipurilor de date float, double sau long double).
Aceasta este una din acele faciliti care apropie limbajul C de
nivelul limbajelor de asamblare.

Conversii de tip implicite
Limbajul C ofer posibilitatea de a construi expresii cu date
de tipuri diferite. Din acest motiv exist un set de reguli de
conversie a operanzilor la tipul operandului cel mai tare.
Aceste reguli sunt cunoscute sub numele de avansare de tip (type
promotion). Iat setul de reguli:
Variabile de tip char i short se convertesc la tipul
int.
Dac un operand este long double
Atunci al doilea este convertit la long double;
Altfel dac un operand este double
Atunci al doilea e convertit la double;
Altfel dac un operand este float
Atunci al doilea e convertit la float;
Altfel dac un operand este unsigned long
Atunci al doilea e convertit la unsigned long;
Altfel dac un operand este long
Atunci al doilea e convertit la long;
120

Altfel dac un operand este unsigned
Atunci al doilea este convertit la unsigned.

Conversii de tip explicite (operatorul cast)
Operatorul de conversie explicit (cast) acioneaz
temporar, fornd schimbarea tipului expresiei la care se refer.
Forma general a operatorului este:
(tip)expresie;
unde tip este tipul la care dorim s se fac conversia expresiei.
De exemplu, rezultatul evalurii expresiei
(float)i/2;
unde i a fost definit prin
int i=3;
este 1.5. Dac n aceleai condiii se evalua expresia i/2;
rezultatul ar fi fost trunchiat la 1 (se mpreau doi ntregi).
Test de autoevaluare
4.17. n C exist tipurile fundamentale de date:
a. char, int, float, double, void
b. char, integer, real, double, void
c. char, int, float, double, nul, boolean
d. character, string, real, void
4.18. Declaraiile
char x;
i
signed char x;

a. sunt echivalente
b. sunt greite
c. sunt corecte


121

4.19. Declaraiile
short int x;
i
int x;

a. sunt echivalente
b. sunt greite
c. sunt corecte
4.20. Declaraia
float x,y;

a. este echivalent cu float x;float y;
b. este greit
c. este echivalent cu x,y:float;
d. este echivalent cu real x,y;
4.21. Linia de program
char ch=A,Z;
are semnificaia:
a. variabila ch ia valori de la A la Z
b. variabila ch este de tip char i este iniializat cu
valoarea A, iar variabila Z este de tip char
c. tipul de date char ia valori de la A la Z
4.22. Liniile de program
const ore_zi=24;
int ore_zi=24;

a. sunt echivalente
b.sunt corecte i compatibile
c.sunt corecte i incompatibile
4.23. Secvena de program
int x=10,y=20,z=5,w=7;
printf(\n x=%i y=%i z=%d,x,y);
afieaz:
a. x=10 y=20 z=5
122

b. date de ieire nedefinite
c. x=10 y=20
4.24. Secvena de program:
int x=10,y=20,z=5,w=7;
printf(\n x=%d y=%i,x,y,z);

a. afieaz x=10 y=20
b. afieaz x=10 y=20 z=5
c. este greit
4.25. Instruciunea printf() de mai jos
printf(\nuu!\taurul \n-are importanta!);
afieaz
a. \nuu!\taurul\n-are importanta!
b. taurul n-are importanta!
c. uu!aurul -are importanta!
d. uu! aurul
e. -are importanta!
4.26. Secvena de program
int i=10,j=20;
printf(\n i=%i,j=%i,j,i);
afieaz
a. i=10, j=20
b. i=20, j=10
c. i=10% j=20%
4.27. Secvena de program
int i=10,j=20;
printf(\n i=%i,j=%j,i,j);

a. afieaz i=10,j=20
b. este greit
c. afieaz i=%10,j=%20
4.28. Secvena de program
char a=q;
printf(\n a=%d,a);
123


a. este greit deoarece %d este descriptor pentru tipul
int, nu pentru tipul char
b. este corect i afieaz codul ASCII al caracterului q
c.este corect i afieaz codul ASCII al caracterului a
d. este corect i afieaz caracterul q
4.29. Secvena de program
float x=32.75;
printf(\n x=%e,x=%f,x,x);

a. este greit deoarece argumentul x se repet
b. este corect i va afia x=32.75,x=32.75
c.este corect i va afia
x=3.275000e+01,x=32.750000
4.30. Secvena de program
int x=439;
printf(\n %o,x);
afieaz:
a. 439
b. numrul 439 scris n baza 8
c. numrul 439 scris n baza 16
4.31. Secvena de program
int x=1011;
printf(\n %x,x);
afieaz:
a. valoarea lui x n binar
b. valoarea lui x n hexazecimal
c. valoarea lui x n octal
4.32. Secvena de program
int x=12;
float y=31.42;
printf(\n x=%f y=%d,x,y);

a. afieaz x=12 y=31.42
b. afieaz x=12.0 y=31
124

c. este greit
4.33. Secvena de program
float x=10.5;
printf(\n x=%-10.5f,x);

a. afieaz x=-10.5
b. afieaz x=10.50000
c. este greit
4.34. Secvena de program
float x=10.5;
printf(\n x=%10.5,x);

a. afieaz x=10.5
b. afieaz x= 10.50000
c. afieaz x=10.50000
4.35. Despre secvenele de program
float x;
scanf(%f,x);
i
float x;
scanf(%f,&x);
se poate afirma c:
a. sunt corecte i au acelai efect
b. prima secven este corect i a doua incorect
c. prima secven este incorect i a doua corect
4.36. Secvena de program
printf(%.3s,abcde);

a. afieaz abc
b. afieaz abcde
c. este greit
4.37. Dac irul care trebuie citit de la tastatur este abcdef
atunci secvena
scanf(%3s,sir);

125

a. este greit, deoarece variabila sir nu e precedat
de operatorul &
b. este greit, deoarece irul de intrare are 6 caractere,
iar descriptorul %s prevede doar 3 caractere
c. este corect, dar se citesc doar caracterele abc
4.38. Secvena de program
scanf(%d;%f;%s,&x,&y,sir);

a. este greit, deoarece descriptorii de format sunt
desprii prin semnul ;
b. este greit, deoarece variabila sir nu e precedat
de operatorul &
c. este corect i realizeaz corect citirea dac datele
din fluxul de intrare sunt desprite prin semnul ;
4.39. Operatorii n C pot fi:
a. unari, binari
b. unari, binari, ternari
c. unari, binali, termali
4.40. Operatorii + i - pot fi:
a. numai unari
b. numai binari
c. unari sau binari
4.41. Secvena de program:
float x;
int i;
x=34.21;
i=x;

a. este greit deoarece se atribuie valoarea real din x
variabilei ntregi i
b. este corect
c. este corect, iar i va primi valoarea 34
4.42. Secvena de program
int i;
float x;
126

i=34;
x=i;

a. este greit, deoarece se atribuie valoarea ntreag
din i variabilei reale x
b. este corect
c. este corect, iar x va primi valoarea 34 convertit n
virgul mobil.
4.43. Linia de program
V=(A=B*b)*h;

a. este eronat deoarece conine operatorul de atribuire
= de dou ori
b. este corect
c. este corect i este echivalent cu secvena de
program
A=B*b;
V=A*h;

4.44. Linia de program
a=b=c=1;

a. este corect i e echivalent cu secvena
a=1;
b=1;
c=1;
b. este corect i e echivalent cu secvena
1=a=b=c;
c. este greit deoarece operatorul de atribuire apare de
mai multe ori
4.45. Expresia
x+=1;

a. este greit;
b. este corect i echivalent cu x=x+1;
c. este corect i echivalent cu x++;
d. este corect i echivalent cu ++x;
127

4.46. Expresia
y=--x;

a. este greit
b. este corect i echivalent cu secvena
x=x-1;
y=x;
c. este corect i echivalent cu secvena
y=x;
y=x-1;
4.47. Expresia
y=x--;

a. este greit
b. este corect i echivalent cu secvena
x=x-1;
y=x;
c. este corect i echivalent cu secvena
y=x;
x=x-1;
4.48. n urma execuiei secvenei de program:
int i,j;
i=19;
j=i/4;

a. j ia valoarea 4
b. j ia valoarea 4.75
c. j ia valoarea 5
4.49. n urma execuiei secvenei de program:
int i,j;
i=19;
j=i%4;

a. j ia valoarea 3
b. j ia valoarea 4
c. j ia valoarea 4.75
4.50. Dac a,b,c,d sunt variabile numerice atunci
expresia (a<b)||(c>d) se poate scrie:
128

a. a<b||c>d
b. a<(b||c)>d
c. c>d||a<b
4.51. n secvena de program
int x=3,y=4,a,b,z;
scanf(%i %i,&a,&b);
z=(y>x)||(a<b);

variabila z va lua
a. o valoare nedefinit
b. valoarea 1
c. o valoare care depinde de a i b
4.52. n secvena de program
int x=3,y=4,a,b,z;
scanf(%i %i,&a,&b);
z=(x>y)&&(a<b);

variabila z va lua
a. valoare nedefinit
b. valoarea 0
c. valoare care depinde de a i b
4.53. n secvena de program
int a=3,b=4,x,y,z;
z=(x=a+b,y=x);

a. x ia valoarea 7
b. y ia valoarea 7
c. z ia valoarea 7
4.54. Secvena de program
int i=7;
float x;
x=(float)i/4;
printf(\n x=%f,x);
. . . . .

a. este greit
129

b. este corect i afieaz x=1.750000
c. este corect i afieaz x=1
Rspunsurile testelor de autoevaluare
4.1. b 4.2. b 4.3. a, b 4.4. c 4.5. d
4.6. b 4.7. c 4.8. b 4.9. a 4.10. b
4.11. b 4.12. b 4.13. c 4.14. b 4.15. c
4.16. c 4.17. a 4.18. a, c 4.19. c 4.20. a
4.21. b 4.22. c 4.23. b 4.24. a 4.25. d
4.26. b 4.27. a 4.28. b 4.29. c 4.30. b
4.31. b 4.32. c 4.33. b 4.34. b 4.35. c
4.36. a 4.37. c 4.38. c 4.39. b 4.40. c
4.41. b, c 4.42. b, c 4.43. b, c 4.44. a
4.45. b,c,d 4.46. b 4.47. c 4.48. a 4.49. a
4.50. a, c 4.51. b 4.52. b 4.53. a, b, c 4.54. b
Lucrare de verificare ...................................................
Descriei succint limbajul de programare C.
Scriei un program C care:
citete de la tastatur dou numere ntregi a i b, dou
numere reale c i d, dou caractere c1 i c2 i un ir
de caractere s.
afieaz a i b pe minim 4 poziii, c pe minim 4
poziii cu dou zecimale i d n format tiinific,
caracterele c1 i c2 i irul s.
determin i afieaz a+b, a/b, c/d, c1==c2, (c-
d)/a+2*c/b-1.5, (a<c) || (b<d).

130

Rezumat
Limbajul C, propus n anii 70 de ctre Dennis Ritchie, este
un limbaj de programare puternic i flexibil, de nivel mediu,
mbinnd avantajele limbajelor de nivel cobort cu cele ale
limbajelor de nivel nalt: este performant din punctul de vedere al
vitezei de execuie i ofer posibilitatea folosirii structurilor de
control, a datelor structurate, a elaborrii de programe portabile.
Limbajul C ofer posibilitatea organizrii programelor n
module i permite implementarea unor structuri de control i
tipuri de date care faciliteaz programarea structurat. Are un
numr foarte mic de cuvinte cheie (32), este uor de nvat i de
folosit.
Structura general a unui program C cuprinde directive
preprocesor (instruciuni destinate compilatorului), declaraii
globale i funcii utilizator (printre care apare cel puin funcia
principal a programului, main()).
O funcie C este declarat dac i se prezint numai antetul
(prototipul) i este definit dac, pe lng antet, se descrie i
corpul (instruciunile care o formeaz). Apelul unei funcii (n
alt funcie, excepie fcnd funcia main()) presupune
transferul controlului execuiei programului ctre instruciunile
din corpul funciei, execuia acestora i revenirea n funcia
apelant n punctul unde se execut operaia care urmeaz.
Elementele de baz ale limbajului sunt alfabetul i
vocabularul (atomii lexicali). Prin combinarea atomilor lexicali
dup regulile specifice de sintax se construiesc linii valide de
program i, n final, un program.
Alfabetul este alctuit simboluri afiabile i simboluri
neafiabile (secvene escape sau coduri backslash-caracter), iar
atomii lexicali sunt: identificatori (nume), constante, operatori,
semne de punctuaie i simboluri speciale.
Tipurile de date fundamentale n C sunt: char, int, float,
double i void, pentru care domeniul de valori poate fi modificat
utiliznd modificatorii de tip: signed, unsigned, short i long.
Declaraiile de variabile se fac sub forma
tip lista_de_variabile;

Dac pe linia de declarare o variabil este iniializat se
131

spune c are loc o definire a variabilei.
Dac tip lipsete se consider implicit c tipul este int.
Pe lng funciile utilizator, elaborate de programator, n
programe se folosesc i funcii standard, predefinite, care sunt
recunoscute i executate la compilare prin includerea n program
a fiierelor antet corespondente care le conin. Funciile standard
ale limbajului se pot clasifica n: funcii de intrare/ieire, funcii
pentru prelucrarea caracterelor, funcii pentru prelucrarea
irurilor de caractere etc.
Funciile de intrare (pentru transferul de date de la tastatur
n memoria calculatorului) i funciile de ieire (pentru transferul
din memoria calculatorului pe ecran) pentru consol sunt:
funcii generale de intrare/ieire (scanf() i printf());
funcii speciale de intrare/ieire:
funcii pentru citirea i scrierea caracterelor:
getchar(), putchar(), getch(), getche(), putch();
funcii pentru citirea i scrierea irurilor de caractere:
gets() i puts().

Descriptorii de format (%d sau %i, %c, %f, %s, %u, %e
sau %E, %x sau %X, %o, %g sau %G i %p)servesc la efectuarea
conversiilor dintre reprezentarea extern i intern (la citire) i
ntre reprezentarea intern i extern (la scriere); formatul extern
presupune succesiuni de caractere, iar cel intern succesiuni de
cifre binare.
Operatorii sunt elemente de baz ale limbajului care arat
ce operaii trebuie executate asupra unor operanzi. n C, operanzi
pot fi constantele, numele de variabile, numele de funcii i
expresiile. Operatorii C se clasific dup:
numrul de operanzi prelucrai (unari, binari,
ternari);
prioritatea avut n evaluarea expresiilor (clase de
preceden);
tipul operanzilor (aritmetici, relaionali, logici i la
nivel de bit).
132

n C este posibil atribuirea multipl, ca n exemplul:
x=y=z=s=0;

De asemenea, C permite folosirea operatorilor de atribuire
compus de forma op=. De exemplu, expresia x=x+2; are
acelai efect cu x+=2;
Operatorii aritmetici sunt: -,+,*,/,%,--,++.
Operatorii relaionali sunt: <, >, <=, >=, ==, !=.
Operatorii logici sunt: !, &&, ||.

Bibliografie

1. Cristian Marinoiu, Programarea n limbajul C, Editura
Universitii din Ploieti, Ploieti, 2000.
2. Brian Kernighan, Dennis Ritchie, The C programming Language,
Prentice Hall, 1988.
3. Herbert Schildt C: Manual complet, Editura Teora, Bucuresti,
1997.


133

UI5. Programare n limbajul C

Obiectivele unitii de nvare pag 133
Instruciuni de control ale programului pag 133
Test de autoevaluare pag 157
Tablouri i iruri de caractere pag 168
Test de autoevaluare pag 177
Rspunsurile testelor de autoevaluare pag 181
Lucrare de verificare pag 182
Rezumat pag 182
Bibliografie pag 185


Obiectivele unitii de nvare
Familiarizarea cu instruciunile de control ale
limbajului de programare C.
Realizarea conexiunilor corecte ntre structurile
algoritmice fundamentale discutate n UI4 i
implementrile acestora n limbajul C care sunt
instruciunile de control.
Abilitatea de a integra corect noiunile teoretice n
practic prin scrierea de programe care rezolv
diverse probleme elementare.

Durata: 10 ore
Instruciuni de control ale programului
n acest capitol se prezint instruciunile de control ale unui
program C: instruciunea expresie, instruciunile de decizie (sau
de selecie), instruciunile iterative (repetitive sau de ciclare) i
134

instruciunile de salt. n situaia n care sintaxa limbajului
impune utilizarea unei singure instruciuni, dar logica
programului cere folosirea unei secvene de instruciuni, secvena
de instruciuni se organizeaz ca o instruciune bloc (sau
instruciune compus). O instruciune bloc ncepe cu { i se
termin cu }.

Instruciuni expresie
Instruciunea expresie are forma general:
expresie;

unde expresie are efect lateral (conine o atribuire sau
reprezint un apel de funcie).
Secvena de program urmtoare conine exemple de
instruciuni expresie:

. . .
x=(a+b)*c;
x+=2;
p++;
getch();

Instruciuni de decizie
INSTRUCTIUNEA IF
Forma general a instruciunii if este:

if(expresie)
instructiune_1;
else
instructiune_2;

Efectul instruciunii este urmtorul: dac expresie este
adevrat (diferit de zero) se execut instructiune_1 n caz
contrar (expresie este egala cu zero) se execut
instructiune_2. Figura 5.1 ilustreaz modul de execuie al
instruciunii if.
135







Figura 5.1. Modul de execuie al instruciunii if
Exemplul 5.1
Programul calculeaz i afieaz radicalul dintr-un numr.
#include "stdio.h"
#include "conio.h"
#include "math.h"

void main(void)
{
float x,y;
printf("\n Introduceti x=");
scanf("%f",&x);
if (x<=0)
printf("\n Calcul imposibil");
else
{
y=sqrt(x);
printf("\n y=%f",y);
}
getch();
}

Observaii:
Sintaxa general a instruciunii if cere pe ambele
alternative cte o instruciune. n situaia n care pe o
alternativ sunt necesare mai multe instruciuni
acestea vor fi grupate cu ajutorul acoladelor ntr-o
instruciune bloc. Astfel, n exemplul de mai sus,
secvena
expresie
instruciune_1 instruciune_2
Fals
Adevrat
136


{
y=sqrt(x);
printf("\n y=%f",y);
}

este o instruciune bloc.
Dac alternativa else a instruciunii if este vid atunci
se poate scrie:

if(expresie)
instructiune_1
else;

sau i mai simplu

if(expresie)
instructiune;

form cunoscut sub numele de if cu ramur vid. Instruciunea
instructiune se execut numai dac expresia este adevrat,
adic se execut condiionat. Modul de execuie al instruciunii if
cu ramur vid este ilustrat n Figura 5.2.














Figura 5.2. Modul de execuie al instruciunii if cu ramu vid



expresie
instruciune
Adevrat
Fals
137

Exemplul 5.2
Programul calculeaz maximul dintre dou numere.
#include "stdio.h"
#include "conio.h"
void main(void)
{
float x,y,max;
printf("\n x=");
scanf("%f",&x);
printf("\n y=");
scanf("%f",&y);;
max=x;
if (max<y)
max=y;
printf("\n Maximul dintre x=%.2f si
y=%.2f este=%.2f",x,y,max);
getch();
}

Dac n structura unei instruciuni if intervin alte
instruciuni if avem de a face cu o structur de instruciuni if
incluse sau imbricate. Forma general a unei astfel de structuri
este urmtoarea:

if(expr
1
)
instr
1
;
else
if(expr
2
)
instr
2
;
else
. . . . . .
if(expr
n
)
instr
n
;
else
instr
n+1

Efectul execuiei unei instruciuni if imbricate este
urmtorul: dac nu exist i, i=1,...,n astfel nct expresia
expri s fie adevrat, se execut instr
n+1
, n caz contrar se
execut prima instruciune (considernd evaluarea de sus n jos),
instr
i
pentru care expr
i
este adevrat, iar restul
instruciunilor se ignor.
Pentru n mare, folosind o aliniere strict, se ajunge la o
138

structur cu adncime mare (mult deplasat spre dreapta). Din
acest motiv se folosete de obicei forma:
if(expr
1
)
instructiune
1
;
else if(expr
2
)
instructiune
2
;
else if(expr
3
)
instructiune
3
;
. . . . . .
else
instructiune
n+1
;

numit i scara if-else-if.
Exemplul 5.3
Programul citete coordonatele unui numr i stabilete n
ce cadran se afl acesta.
#include "stdio.h"
#include "conio.h"

void main(void)
{
float x,y;
printf("\n abscisa x=");
scanf("%f",&x);
printf("\n ordonata y=");
scanf("%f",&y);
if (x>=0 && y>=0)
printf("\n Numarul apartine cadranului
I");
else if (x<0 && y>=0)
printf("\n Numarul apartine cadranului
II");
else if(x<0 && y<0)
printf("\n Numarul apartine cadranului
III");
else
printf("\n Numarul apartine cadranului
IV");
getch();
}

innd cont c n limbajul C orice expresie diferit de zero
este adevrat, o secven de genul

139

if(expr!=0)
instructiune;

este echivalent cu
if(expr)
instructiune;

form care va fi ntotdeauna preferat.
Care este diferena dintre structurile if i if-else?
Cuvntul else se asociaz ntotdeauna cu cel mai apropiat if
incomplet care nu este deja asociat cu un else i care este n
acelai bloc cu el. De exemplu, n secvena
if(x)
if(y)
printf(\n x si y nenuli);
else
printf(\n x nul);

alinierea i mesajele sugerez asocierea lui else cu primul if. n
realitate, else se asociaz cu cel de-al doilea if, fiind adecvat
alinierea
if(x)
if(y)
printf(\n x si y nenuli);
else
printf(\n x nul);

Dac totui vrem s punem n practic prima intenie putem
folosi una din formele echivalente:
a) if(x)
{
if(y)
printf(\n x si y nenuli);
}
else
printf(\n x nul);

b) if(x)
if(y)
printf(\n x si y nenuli);
else;
else
printf(\n x nul);
140


c) if(x&&y)
printf(\n x si y nenuli);
else
if(!x)
printf(\n x nul);

n ideea creerii unor programe dense se pot scrie
construcii de genul

if( (c=getch() ) == a)
putch(a);
else
printf(\n caracter diferit de a);

unde expresia condiional conine o atribuire.
Construciile dense trebuie facute ns cu grij, deoarece
este posibil s avem surprize neplcute. Secvena de mai jos
x=y=7;
a=5;b=6;
if((x=a)(y=b))
printf(\nx=%i si y=%i,x,y);

va produce x=5, y=7 i nu x=5, y=6 cum ne-am fi ateptat.
Pentru ca expresia (x=a)(y=b) s fie adevrat este
suficient ca numai una din expresiile (x=a) sau (y=b) s fie
adevrat. Cu alte cuvinte, se execut atribuirea x=5, expresia
(x=5) ia valoarea adevrat, valoarea expresiei (y=b) nu mai are
importan i deci atribuirea y=6 nu mai are loc.

OPERATORUL CONDIIONAL ? :
Operatorul condiional ?: este un operator ternar, iar forma
sa general este:
expr1?expr2:expr3;

Efectul execuiei unei astfel de secvene este echivalent cu
efectul execuiei secvenei:
if expr1
expr2;
else
expr3;
141

n plus, expresia expr1 ? expr2 : expr3 va lua
valoarea expr2 sau expr3 dup cum expr1 este adevrat sau
nu.
Exemplul 5.4
Programul afieaz maximul dintre dou numere a i b
citite de la tastatur.
#include "stdio.h"
#include "conio.h"

void main(void)
{
int a,b;
printf("\n a=");
scanf("%i",&a);
printf("\n b=");
scanf("%i",&b);
printf("\n Maximul dintre a=%i si b=%i
este %i",a,b,a<b?b:a);
getch();
}

INSTRUCTIUNEA switch
Instruciunea switch permite selecia unei alternative din
mai multe posibile ntr-o form comod i elegant.
Forma general a instruciunii este:
switch(expresie)
{
case c
1
:secventa de instructiuni
1
;break;
case c
2
:secventa de instructiuni
2
;break;
. . . . . . . .
case c
n
:secventa de instructiuni
n
;break;
default:secventa de instructiuni
n+1
;break;
}
unde:
expresie este expresia selectoare care trebuie s fie
de tip ntreg;
c
1
,c
2
,...,c
n
sunt constante de tip ntreg distincte
ntre ele;
default este o etichet opional;
secvena instructiuni
i
, pentru orice
142

i=1,...,n+1 se poate constitui sau nu ntr-un bloc
de instruciuni, poate s fie vid sau nu;
break este o instruciune care permite saltul la prima
instruciune aflat dup structura switch. Prezena sa
este opional.
Efectul instruciunii este urmtorul:
Dac exist un i astfel nct expresia selectoare este
egal cu c
i
, se execut secvena instructiuni
k
,
k>=i pn la primul break ntlnit sau pn la
sfritul instruciunii switch.
Dac pentru orice i=1,...,n constantele c
i
sunt
diferite de expresia selectoare se execut
instructiune
n+1
, dac exist opiunea default sau
se iese direct din switch, dac aceasta lipsete.
Exemplul 5.5
Programul citete una din literele a,A,m,M,p,P de la
tastatur i afieaz o list de nume care ncep cu una din aceste
litere, fr s in cont dac litera este mare sau mic. Dac se
tasteaz alt caracter se afieaz un mesaj de eroare.
#include "stdio.h"
#include "conio.h"

void main(void)
{
printf("\n Tastati una din literele:
a,A,m,M,p,P ");
switch(getch())
{
case 'a':
case 'A':printf("\n Aurel,Ana,Andrei");
break;
case 'm':
case 'M':printf("\n Maria,Mihai,Marin");
break;
case 'p':
case 'P':printf("\n Paula,Petre,Pavel");
break;
default:printf("\n Ati tastat gresit !");
}
getch();
}
143

Observaie. n programul de mai sus, indiferent dac s-a
tastat a sau A se afieaz aceeai list de nume: Aurel, Ana,
Andrei. Explicaia este urmtoarea. Dac se tasteaz a se
intr n switch, prin case 'a'. Secvena de prelucrri
corespunztoare fiind vid i nentlnindu-se nici o instruciune
break se trece i se execut secvena de prelucrri
corespunztoare constantei case 'A' (adic afiarea listei).
Deoarece secvena se ncheie cu break se iese din switch.
Analog se ntmpl i cu grupurile de litere m,M i p,P.
Instruciunea switch este implementarea n limbajul C a
crei structuri algoritmice fundamentale?

Instruciuni iterative
Instruciunile iterative (repetitive sau de ciclare) permit ca
una sau mai multe instruciuni s fie repetate. Numrul de iteraii
depinde de ndeplinirea unei condiii. Dac testul asupra condiiei
se face naintea instruciunilor care se repet, se spune c iteraia
este cu test iniial; n caz contrar iteraia este cu test final.
n limbajul C exist dou instruciuni cu test iniial, while i
for i o instruciune cu test final, do - while.

INSTRUCTIUNEA while
Forma general a instruciunii while este:
while(conditie)
instructiune;
unde:
conditie poate fi orice expresie;
instructiune poate fi o instruciune simpl, vid
sau o instruciune compus (numit i corpul
ciclului).
Efectul instruciunii este urmtorul: se execut
instructiune ct timp conditie este adevrat (diferit de
zero). Atunci cnd conditie devine fals (egal cu zero),
execuia programului continu cu instruciunea imediat
urmtoare. Organigrama de mai jos ilustreaz sugestiv modul de
144

lucru al instruciunii while.









Figura 5.3. Modul de lucru al instruciunii while

Observaii:
Dac din start condiia este fals, instructiune nu
se execut niciodat.
Ieirea din ciclu se poate face normal (ca efect al
prelucrrilor din instructiune, atunci cnd dup
un numr de pai conditie devine fals), anormal
(printr-o instruciune de salt care transfer execuia
programului din interiorul ciclului n afara lui) sau
niciodat (conditie rmne mereu adevrat, i
se obine aa zisa bucl etern).
Prezentm mai jos un exemplu de program unde apare
foarte natural prezena testului iniial n bucl i deci folosirea
instruciunii while.
Exemplul 5.6
Calculul lungimii unui ir de caractere citit de la tastatur;
sfritul irului este marcat de tasta Enter (caracterul \r).
#include "stdio.h"
#include "conio.h"

void main(void)
{
int i=0;
printf("\n Tastati un sir:\n");
while (getche()!='\r')
i++;
printf("\n Lungimea sirului =%d",i);
getch();
}
Fals
instruciune
Adevrat
condiie
145

INSTRUCTIUNEA for
n C, instruciunea for prezent i n alte limbaje, are
implementarea cea mai flexibil. Ea depete cadrul tradiional
n care este plasat de obicei: instruciune cu contor (variabil
de control) recomandat spre a fi folosit ori de cte ori se
cunoate numrul de iteraii.
Forma general a instruciunii for este:
for(initializare;conditie;actualizare)
instructiune;

Semnificaia tradiional a celor trei componente este
urmtoarea:
initializare este de regul o instruciune de
atribuire folosit pentru iniializarea contorului
ciclului;
conditie este o expresie care determin sfritul
ciclului;
actualizare se refer la felul n care se modific
variabila contor.
Instruciunea for este echivalent cu secvena de instruciuni
initializare
while(conditie)
{
instructiune
actualizare
}

De aici rezult i efectul execuiei sale: se execut blocul
instructiuneactualizare ct timp conditia este
ndeplinit.
Exemplul 5.7
Programul realizeaz suma a n numere reale.
#include "stdio.h"
#include "conio.h"

void main(void)
{
float s=0,x;
146

int i,n;
printf("\n n=");
scanf("%i",&n);
for (i=0;i<n;i++)
{
printf("\n x=");
scanf("%f",&x);
s+=x;
}
printf("\n Suma este =%f",s);
getch();
}

Observaii:
Componenta initializare a instruciunii for
poate conine atribuiri care nu se refer neaprat la
variabila contor. n exemplul de mai sus iniializarea
variabilei s se poate face n componenta
initializare a ciclului for cu ajutorul
operatorului virgul, astfel:

for(s=0,i=0;i<n;++i)
{
. . . . . .
}
. . . . . .

Componenta actualizare a instruciunii for poate
s conin mai multe variabile contor.
Variabila contor nu trebuie s fie prezent obligatoriu
n componenta conditie a unei instruciuni for.
Exemplul 5.8
Afiarea termenilor irului lui Fibonacci mai mari ca 1 i
mai mici ca un numr dat m. irul are forma 1, 1, 2, 3, 5,
8, , adic primii doi termeni sunt egali cu 1, iar orice alt
termen se obine ca sum a celor doi termeni care-l preced.

#include "stdio.h"
#include "conio.h"

void main(void)
{
147

int a,b,c,m,i;
printf("\n Limita de afisare =");
scanf("%i",&m);
printf("\n Termenii sirului Fibonacci <
%i\n",m);
printf("\n 1 1 ");
for (i=3,a=b=1,c=2;c<m;i++)
{
printf("%i ",c);
a=b;b=c;
c=a+b;
}
getch();
}

Exemple:
Dac n programul precedent renunm la ideea de a
afia numrul de ordine al termenilor putem folosi
secvena:
for(a=b=1,c=2;c<m;)
{
printf(\n Termenul =%i,c)
a=b;b=c;
c=a+b;
}

Se observ absena componentei actualizare.
Secvena de program
int i=50000;
for(;i;i--);

are ca efect introducerea unei temporizri egal cu timpul
necesar decrementrii contorului i de la voloare 50000
la 0. Aici se observ absena componentei
initializare i totodat ciclarea unei instruciunii
vide.
Oricare din componentele initializare, conditie,
actualizare ale instruciunii for poate s lipseasc, ns
delimitatorii ; trebuie s fie prezeni. Lipsa componentei
conditie este interpretat ca fiind echivalent cu prezena unei
expresii condiionale adevrate. Din acest motiv, secvena
for(;;);
148


creeaz un ciclu infinit sau o bucl etern.

INSTRUCTIUNEA do-while
Este recomandabil s se foloseasc instruciunea do-while
cnd instruciunea care reprezint corpul ciclului trebuie
executat cel puin o dat.
Forma general a acestei instruciuni este:
do
{
instructiuni
}
while(conditie);

Cnd corpul ciclului este format dintr-o singur
instructiune acoladele pot s lipseasc. Totui, este
recomandabil s se pstreze chiar i n aceast situaie pentru a
distinge mai uor o instruciune while care ncepe, de o
instruciune do-while care se termin.
Efectul instruciunii este urmtorul: se execut secvena de
instructiuni ct timp expresia condiional conditie este
adevrat. Organigrama de mai jos ilustreaz cu claritate modul
de execuie al ciclului do-while.









Figura 5.4. Modul de execuie al instruciunii do-while

Observaii:
Datorit aezrii testului de condiie dup corpul
ciclului, este evident c grupul de instructiuni se
execut cel puin o dat.
Dac n corpul ciclului nu se afl instruciuni care s
instruciune
Fals
Adevrat
condiie
149

conduc la o condiie fals dup un numr finit de
ciclri (ieire normal din ciclu) sau instruciuni de
salt din interiorul ciclului (ieire anormal) se obine
un ciclu infinit (bucl etern).
Exemplul 5.9
Programul citete dou numere a i b de la tastatur i
afieaz suma lor. Procesul continu ct timp la ntrebarea
Continuati? se apas una din tastele care conin literele d
sau D.
#include "stdio.h"
#include "conio.h"

void main(void
{
float a,b;
char c;
do
{
printf("\n a=");
scanf("%f",&a);
printf("\n b=");
scanf("%f",&b);
printf("\n Suma a+b=%.2f",a+b);
printf("\n Continuati? (d/n) ");
c=getch();
}
while (c == 'D' || c == 'd');
}
Exemplul 5.10
Programul implementeaz un meniu simplu. Pentru dou
numere citite de la tastatur se efectueaz una din urmtorele
operaii: suma, diferena produsul sau mprirea (atunci cnd
este posibil) sau se iese din meniu.
#include "stdio.h"
#include "conio.h"

void main(void)
{
float a,b;
char ch;
printf("\n a=");scanf("%f",&a);
printf("\n b=");scanf("%f",&b);
150

printf("\n + Adunare");
printf("\n - Scadere");
printf("\n * Inmultire");
printf("\n / Impartire");
printf("\n r Renunta!");
printf("\n Introduceti optiunea dvs:");
do
{
ch=getchar();
switch(ch)
{
case '+' :printf("\n a+b=%.2f",a+b);
break;
case '-' :printf("\n a-b=%.2f",a-b);
break;
case '*' :printf("\n a*b=%.2f",a*b);
break;
case '/' :if (b)
printf("\n a/b=%.2f",a/b);
else
printf("\n Impartire
imposibila!"); break;
case 'r' :
case 'R' :exit(0);
}
}
while (ch!='+' && ch!='-' && ch!='*' && ch!='/');
getch();
}


Observaie. Funcia exit() provoac ntreruperea
programului i revenirea n sistemul de operare. Funcia are
forma general:
void exit(int cod_retur);

De obicei, cod_retur are valoarea 0 la ieire normal din
program i o valoare diferit de 0 n caz contrar.
Exemplul 5.11
Programul calculeaz i afieaz radicalul dintr-un numr.
Noutatea fa de Exemplul 5.1 este apariia unei bucle iterative
de validare: ieirea din bucl urmat de calculul radicalului se
face doar atunci cnd numrul citit de la tastatur este pozitiv.

151

#include "stdio.h"
#include "conio.h"
#include "math.h"

void main(void)
{
float x;
do
{
printf("\n x=");
scanf("\n %f",&x);
}
while (x<0);
printf("\n Radical din x=%.2f este
y=%.4f",x,sqrt(x));
getch();
}

Scriei un program C care calculeaz suma primelor n
numere naturale folosind pe rnd structurile for, while i do-
while.

Cicluri imbricate (incluse)
Exist posibilitatea ca o instruciune de ciclare s includ o
alt instruciune de ciclare; n acest caz se spune c ciclurile sunt
imbricate sau incluse.
Exemplul 5.12
Programul ilustreaz folosirea ciclurilor imbricate:
#include "stdio.h"
#include "conio.h"

void main(void)
{
int i,j;
for (i=1;i<=5;i++)
{
for (j=1;j<=i;j++)
printf("%2d",j);
printf("\n");
};
getch();
}
152

Rezultatul execuiei programului de mai sus este:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Pentru o valoare a variabilei contor i, variabila contor j a
ciclului interior variaz de i ori; se spune c indicele interior
variaz mai repede ca indicele exterior.
Evident, o structur de cicluri incluse poate s conin
oricare din instruciunile de ciclare permise n C. Iat un exemplu
de acest gen:
Exemplul 5.13
Programul rezolv urmtoarea problem: ct timp se
citete de la tastatur o valoare x diferit de zero se afieaz
irul de numere x, x+1, x+2, x+3, x+4. Acest proces
continu sau se ntrerupe la cerere.
#include "stdio.h"
#include "conio.h"
void main(void)
{
int x,i;
char ch;
do
{
printf("\n x=");
scanf("%i",&x);
while (x)
{
for (i=0;i<5;i++)
printf("%5d",x+i);
printf("\n x=");
scanf("%i",&x);
}
printf("\n Continuati ? (d/n)");
ch=getch();
}
while (ch == 'd' || ch == 'D');
}

153

Instruciuni de salt
n limbajul C exist patru instruciuni care execut un salt
necondiionat n program: break, continue, goto, return.
Instruciunea return se refer la revenirea din funcia apelat la
punctul unde s-a fcut apelul.

INSTRUCTIUNEA break
Dup cum s-a vzut la prezentarea instruciunii switch,
instruciunea break poate ncheia execuia unei prelucrri case i
fora trecerea execuiei la prima instruciune aflat dup switch.
O alt situaie unde instruciunea break i dovedete utilitatea
este atunci cnd se dorete ncheierea forat a unui ciclu. n acest
caz ntlnirea instruciunii break n corpul ciclului determin
ntreruperea ciclrii i trecerea controlului la prima instruciune
care urmeaz dup ciclu.
Exemplul 5.14
Programul extrage i afieaz cel mult 20 de numere
aleatoare folosind funcia rand(). Dac s-a extras numrul 10
programul nu mai efectueaz restul extragerilor.
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"

void main(void)
{
int i,x;
for (i=0;i<20;i++)
{
x=rand()%20+1;
printf("\n %i. S-a extras numarul
%i",i+1,x);
if (x==10) break;
}
getch();
}

Precizri. O instruciune break are efect numai asupra
ciclului cel mai interior n care se afl. Aceeai precizare e
valabil i la instruciuni switch imbricate sau incluse n cicluri:
instruciunea break va afecta numai prima instruciune switch in
154

care se afl, nu i eventualele instruciuni switch sau de ciclare n
care ar putea fi inclus prima.
Exemplul 5.15
Programul tiprete de 10 ori cte 7 numere extrase
aleator.
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"

void main(void)
{
int i,j;
for (i=0;i<10;i++)
{
printf("\n");
for (j=0;j<10;j++)
{
printf("%5d",rand()%10+1);
if (j>=7) break;
}
}
getch();
}

INSTRUCIUNEA continue
Instruciunea continue se folosete numai n corpul unui
ciclu; ea foreaz execuia urmtoarei iteraii a ciclului,
omindu-se instruciunile prezente ntre cele dou iteraii (locul
unde se afl plasat n corpul ciclului i sfritul acestuia).
Efectul instruciunii este urmtorul:
Cnd continue este ntlnit ntr-un ciclu for se
continu cu execuia componentei de actualizare i
apoi a testului condiional.
Cnd este ntlnit ntr-un while sau do-while, se
trece la execuia expresiei condiionale.
Exemplul 5.16
Programul citete de la tastatur 10 numere ntregi
nsumndu-le doar pe cele strict pozitive.
155

#include "stdio.h"
#include "conio.h"

void main(void)
{
int i,x,s;
for (i=s=0;i<10;i++)
{
printf("\n x=");
scanf("%i",&x);
if (x<=0) continue;
s+=x;
}
printf("\n Suma este=%d",s);
getch();
}

INSTRUCTIUNEA goto
Forma general a instruciunii goto este:
goto eticheta;
.
.
.
eticheta:instructiune;

unde eticheta este numele de identificare al instruciunii
instructiune.
Efectul execuiei instruciunii goto este saltul necondiionat
la instruciunea identificat prin eticheta. Saltul poate fi fcut
nainte sau dup instruciunea goto. Folosirea frecvent a acestei
instruciuni n programe afecteaz claritatea acestora, ngreunnd
nelegerea lor. Ea poate fi ns evitat n orice situaie utiliznd
celelalte structuri de control din C. Dm mai jos un exemplu tipic
de folosire a instruciunii goto: ieirea forat dintr-un ciclu sau
dintr-o instruciune switch.
Exemplul 5.17
Programul reprezint alt implementare a Exemplului 5.10.
#include "stdio.h"
#include "conio.h"


156

void main(void)
{
float a,b;
char ch;
for(;;)
{
clrscr();
printf("\n a=");
scanf("%f",&a);
printf("\n b=");
scanf("%f",&b);
printf("\n + Adunare");
printf("\n - Scadere");
printf("\n * Inmultire");
printf("\n / Impartire");
printf("\n r Renunta");
printf("\n Introduceti optiunea
dvs:");
ch=getche();
switch (ch)
{
case '+' :printf("\n a+b=%.2f",a+b);
break;
case '-' :printf("\n a-b=%.2f",a-b);
break;
case '*' :printf("\n a*b=%.2f",a*b);
break;
case '/' :if (b)
printf("\n a/b=%.2f", a/b);
else
printf("\n Impartire
imposibila"); break;
case 'r' :
case 'R' :goto STOP;
}
getch();
}
STOP:printf("\n Am renuntat!");
getch();
}


157

Test de autoevaluare
5.1. Secvena de program
int x=-3,y=7;
if (x>0)
printf(\n x=%i,x);
else
if (y)
printf(\n y=%i,y);
else
printf(\n y=0);

a. afieaz y=7
b. este greit deoarece o instruciune if conine o alt
instruciune if
c. afieaz x=-3
5.2. Secvena de program

if(x)
if(y)
y=3;
else
y=5;

este echivalent cu

a. if(x)
if(y)
y=3;
else;
else
y=5;

b. if(x&&y)
y=3;
else
y=5;

c. if(x)
{
if(y)
y=3;
158

}
else
y=5;

d. nici una din secvenele a, b, c

5.3. Secvena de program
int x=1,y=2;
if ((x=0)&&(y=4))
printf(\n x=%i y=%i,x,y);

a. afieaz x=1 y=2
b. afieaz x=0 y=4
c. nu afieaz nimic deoarece printf() nu se execut
5.4. Secvena de program
if(x)
y=1/x;

a. este greit
b. este echivalent cu
if (x!=0)
y=1/x;

c. este chivalent cu
if x!=0
y=1/x;

5.5. Secvena de program
if (x>=3)
y=sqrt(x-3);
else;

a. este greit deoarece conine semnul ; nainte de else
b. este greit deoarece dup else lipsete o instruciune
c. este corect i este echivalent cu secvena
if(x>=3)
y=sqrt(x-3);



159

5.6. Secvena de program

int x=3,y=6;
if (x>0)
printf(\n x=%i,x);
else
y=x+3;
printf(\n y=%i,y);

afieaz
a. x=3
b. y=6
c. x=3
y=6
5.7. Secvena de program

int x=3,y=4;
printf(\n %i,x>y?x:y);

a. afieaz 3
b. afieaz 4
c. este greit deoarece argumentul funciei printf()
este o expresie, nu o variabil.
5.8. Secvena de program
char x=a;
switch(x)
{
case a:printf(\n amic);
case A:printf(\n Amare);
}

a. afieaz amic
b. afieaz Amare
c. afieaz
amic
Amare
5.9. Secvena de program
int x=3;
if (x=4)
160

printf(\n x=%i,x);

a. este greit
b. este corect, dar nu afieaz nimic
c. este corect i afieaz valoarea 4
d. este corect i afieaz valoarea 3
5.10. Secvena de program
char x=a;
switch(x)
{
case a:printf(\n amic);break;
case A:printf(\n Amare);
}

a. afieaz amic
b. afieaz Amare
c. afieaz
amic
Amare
d. este greit deoarece al doilea case nu se termin cu
break
5.11. Secvena de program
int i=3;
while(i)
i--;
printf(%3i,i);

a. afieaz 2 1 0
b. conine o bucl etern
c. afieaz 0
5.12. Secvena de program
int i=3;
while(i)
printf(%3i,i);
i--;

a. afieaz valoarea 3 de 3 ori
b. afieaz valoarea 3 de o infinitate de ori (bucl
161

etern)
c. afieaz 3 2 1
5.13. Secvena de program
int i=3;
while(i);
printf(%3i,i);
i--;

a. afieaz valoarea 3 de 3 ori
b. afieaz valoarea 3 de o infinitate de ori (bucl
etern)
c. conine o bucl etern i nu afieaz nimic
d. afieaz 3 2 1
5.14. Secvena de program
int i=3;
while(i)
{
printf(%3i,i);
i--;
}

a. afieaz 3 2 1 0
b. afieaz 3 2 1
c. conine o bucl etern
5.15. Secvena de program
int i=0;
while(i)
printf(%3i,i);

a. afieaz valoarea 0
b. afieaz valoarea 0 de o infinitate de ori (bucl
etern)
c. nu afieaz nimic
5.16. Secvena de program
int i=0;
for (;i<3;i++);
printf(%3i,i);

162

a. este greit sintactic deoarece lipsete componenta
de iniializare a instruciunii for
b. afieaz valorile 0 1 2 3
c. afieaz valorile 0 1 2
d. afieaza valoarea 3
e. conine o bucl etern afindu-se permanent
valoarea 0
f. conine o bucl etern i nu afieaz nimic
5.17. Secvena de program
int i,j;
for (i=1,j=10;i<=5;i++,j--)
printf(\n %i %2i,i,j);

a. este greit deoarece instruciunea for conine dou
variabile contor i,j
b. este greit deoarece componenta iniializare a
instruciunii for conine dou iniializri
c. este corect i afieaz
1 10
2 9
3 8
4 7
5 6
5.18. Secvena de program
int i;
for (i=1;-3<=i&&i<1;i--)
printf(\n%3i,i);

a. nu afieaz nimic
b. afieaz 0 -1 -2 -3
c. conine o bucl etern
5.19. n secvena de program
int x=1,i;
for(i=1;x<=3;i++)
scanf(%i,&x);

163

a. funcia scanf() se execut de 3 ori
b. funcia scanf() se execut de o infinitate de ori
c. instruciunea for este greit deoarece contorul i nu
se testeaz niciodat
d. se iese din bucl numai dup ce s-a citit o valoare
x>3
5.20. Secvena de program
int i;
for(i=1,i<=3;i++)
printf(%3i,i)

a. este greit
b. conine o bucl etern
c. afieaz 1 2 3
5.21. Secvena de program
int i;
for (i=1,i<=3;i++)
printf(%3i,i)

a. conine o instruciune for greit sintactic
b. afieaz 1 2 3
c. conine o bucl for etern
5.22. Secvena de program
for();

a. este o bucl for etern
b. este greit sintactic
c. apeleaz funcia for()
5.23. Secvena de program
float x=-3.2;
do
scanf(%f,&x);
while (x>0);

a. citete x pn cnd x>0
b. citete x ct timp x>0
164

c. este greit deoarece funcia scanf() nu este pus
ntre acolade
d. nu execut nici o citire a lui x
5.24. Secvena de program

int j;
do
j=3;
while (j<=4);
{
printf(%3i,j);
j++;
}
a. afieaz valoarea 3
b. afieaz valorile 3 4
c. conine o bucl do-while etern
d. conine o bucl while etern
e. este greit
5.25. Secvena de program
int i=1;
do
printf(\n%i,i);
i++;
while(i<=2);

a. afieaz 1 2
b. este greit deoarece instruciunile dintre do i while
trebuie s fie cuprinse ntre acolade
5.26. Secvena de program
int i,j;
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
printf(\n i=%i j=%i,i,j);

a. afieaz i=1 j=1
i=2 j=2
b. afieaz i=1 j=1
i=1 j=2
i=2 j=1
165

i=2 j=2
c. afieaz i=1 j=1
i=2 j=1
i=1 j=2
i=2 j=2
5.27. Secvena de program
int i,j;
for(i=1;i<=3;i++)
{
printf(\n);
for(j=1;j<=i;j++)
printf(%3i,j);
}
a. este greit deoarece limitele de variaie ale
contorului j depind de contorul i al primului ciclu
b. este corect i afieaz
1
1 2
1 2 3
c. este corect i afieaz
1 2 3
1 2
1
5.28. Secvena de program
int i;
for(i=1;i<=5;i++)
{
printf(%3i,i);
if(i==3)break;
}

a. este greit deoarece instruciunea break se folosete
numai asociat cu switch
b. este corect i afieaz 1 2 3
c. este corect i afieaz 1 2 3 4 5
deoarece instruciunea break cuprins n corpul unui ciclu
for nu are nici un efect
5.29. Secvena de program
int i,j;
for(i=1;i-3;i++)
for(j=0;j-9;j++)
166

{
printf(\n Sunt aici!);
if (!j)break;
}
a. afieaz mesajul Sunt aici! de 2 ori
b. afieaz mesajul Sunt aici! de 30 ori
c. afieaz mesajul Sunt aici! o dat
5.30. Secvena de program
int s,i;
for(s=0,i=10;i;i--)
{
s+=i;
if(i-5)continue;
}

a. calculeaz suma s=10+9+8+7+6+4+3+2+1
b. calculeaz suma s=10+9+8+7+6+5+4+3+2+1
c. calculeaz suma s=5
5.31. Secvena de program
int s,i;
for(s=0;i=10;i;i--)
{
if(i-5)continue;
s+=i;
}

a. calculeaz suma s=10+9+8+7+6+4+3+2+1
b. calculeaz suma s=10+9+8+7+6+5+4+3+2+1
c. calculeaz suma s=5
5.32. Secvena de program
int s,i;
for(s=0;i=10;i;i--)
{
if(i==5)continue;
s+=i;
}

a. calculeaz suma s=10+9+8+7+6+4+3+2+1
b. calculeaz suma s=10+9+8+7+6+5+4+3+2+1
167

c. calculeaz suma s=5
5.33. Secvena de program
int i=1;
while(i<3)
{
if!(i==2)continue;
printf(%3i,i);
i++;
}

a. afieaz 1 i intr ntr-o bucl etern
b. afieaz 1 2 3
c. afieaz 1 3
5.34. Secvena de program
int i=1,s=0;
et1:if(i>10)
goto et2;
s+=i;
i++;
goto et1;
et2:printf(\n s=%d,s);

a. este greit deoarece conine salturi napoi
b. este corect i realizeaz o iteraie pentru calculul
primelor 10 numere naturale
c. este corect i este echivalent cu secvena
int s,i;
for(s=0,i=1;i<11;i++)
s+=i;
printf(\n s=%d,s);

d. este corect i este echivalent cu secvena
int i=1,s=0;
while(i<11)
{
s+=i;
i++;
}
printf(\n s=%d,s);

168

Tablouri i iruri de caractere
Notaia indicial a variabilelor nu este nou; ea a fost i este
folosit n special de matematicieni ori de cte ori este nevoie ca
o prelucrare s fie exprimat ct mai sintetic. Este evident c
prelucrarea S=a+b+c+d+e+f arat mult mai puin elegant dect

6
1 i
i
x S
n ultimul caz cele ase variabile a,b,c,d,e,f au
fost redenumite x
1
,x
2
,...,x
6
; ele pot fi privite astfel drept
primele 6 componente ale vectorului x.
Tablourile reprezint tocmai implementarea noiunilor de
vector, matrice sau masiv multidimensional ntr-un limbaj de
nivel nalt. Ele reprezint colecii omogene de date (adic de
acelai tip), stocate n locaii de memorie nvecinate. Accesul la
oricare din elementele tabloului se face cu ajutorul indicilor.

Tablouri unidimensionale
Declaraia unui tablou unidimensional se face dup forma
general:
tip nume_tablou[dim];
unde:
tip reprezint tipul de baz al elementelor indexate;
dim reprezint numrul de elemente ale tabloului;
nume_tablou este un identificator reprezentnd
numele tabloului.
Dimensiunea zonei continue alocate se calculeaz prin
relaia
dimens_alloc=dim*sizeof(tip).

De exemplu, prin declaraia
int a[100];
se vor aloca vectorului a, 100*2=200 de octei ntr-o zon
continu de memorie.


169

Observaii:
alocarea se face n timpul compilrii;
o dat fcut alocarea, n scopul mririi vitezei de
execuie nu se mai face nici o verificare a
dimensiunii; gestionarea corect a zonei de memorie
alocate cade, deci, exclusiv n sarcina
programatorului.
Referirea la un element al tabloului unidimensional se face
preciznd numele tabloului urmat de o expresie ntreag ntre
paranteze drepte, adic
nume_tablou[expr]

Expresia expr poate lua valori ntregi cuprinse n
intervalul[0,dim-1]. Astfel, n urma declaraiei float
y[10]; vectorului y va avea 10 componente reale i anume:
y[0] componenta_1
y[1] componenta_2
. . . . . . . .
y[9] componenta_10
Intenia de a referi ultimul element al unui tablou sub forma
nume_tablou[dim] este o greeal cu att mai grav, cu ct,
innd cont de observaiile anterioare, ea nu este depistat de
compilator. De obicei expresiile ntregi folosite pentru a accesa
componentele unui tablou sunt constante sau variabile simple
(indici).
Exemplul 5.18
Comutarea componentelor unui vector i afiarea lor n
coloan.
#include "stdio.h"
#include "conio.h"

void main(void)
{
int x[50],i,n,c;

/* citirea elementelor vectorului */
printf("\n lungimea sirului n<50 este:");
170

scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("\n x[%i]=",i);
scanf("%i",&x[i]);
}

/* comutarea elementelor */
for (i=0;i<n/2;i++)
{
c=x[i];
x[i]=x[n-1-i];
x[n-1-i]=c;
}

/* afisarea elementelor vectorului comutat */
for (i=0;i<n;i++)
printf("\n componenta x[%i] este
%i",i,x[i]);
getch();
}

Tablouri multidimensionale
Dac elementele unui tablou unidimensional sunt la rndul
lor tablouri unidimensionale obinem un tablou bidimensional
sau o matrice. De exemplu, declaraia:
int x[4][3];

se poate interpreta astfel: x este un tablou cu 4 elemente x[i],
i=0,1,2,3. Fiecare element x[i] cu i=0,1,2,3 este un
tablou cu 3 elemente ntregi x[i][j] cu j=0,1,2.
Generaliznd, un tablou multidimensional poate fi
considerat ca un tablou unidimensional care are ca elemente un
tablou cu restul de dimensiuni; declaraia unui tablou cu
dimensiunile dim
1
,dim
2,
...,dim
n
are forma general:
tip nume_tablou[dim
1
][dim
2
]...[dim
n
];
iar referirea la un element al tabloului se face prin:
nume_tablou[indice
1
][indice
2
]...[indice
n
],
unde indice
i
ia valori ntregi n intervalul [0,dim
i
-1], pentru
i=1,2,...,n.
171

Observaii:
Referirea clasic la elementele unui tablou prin
separarea indicilor prin virgul este incorect n C i
are semnificaia rezultat din folosirea operatorului de
secveniere. De exemplu, considernd declaraia de
mai sus, referirea x[i,j] este echivalent cu x[j].
Dimensiunea zonei continue de memorie alocate este
dat (n octei) de valoarea dim
1
*dim
2
*dim
3
*dim
n
*
*sizeof(tip).
Exemplul 5.19
Calculul i afiarea sumei a dou matrici a i b de
dimensiune 4x3 citite de la tastatur.
#include "stdio.h"
#include "conio.h"

void main(void)
{
int a[10][10],b[10][10],c[10][10];
short i,j,m,n;

/*citirea dimensiunilor mtricilor a,b si c */
do
{
printf("\n m=");
scanf("%i",&m);
printf("\n n=");
scanf("%i",&n);
}
while (m<1 || m>10 || n<1 || n>10);

/* citirea elementelor matricilor a si b */
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
printf("\n a[%i][%i]=",i,j);
scanf("%i",&a[i][j]);
printf("\n b[%i][%i]=",i,j);
scanf("%i",&b[i][j]);
}

/* calculul matricii suma c=a+b */
for (i=0;i<m;i++)
for (j=0;j<n;j++)
172

c[i][j]=a[i][j]+b[i][j];

/* afisarea matricii suma c */
printf("\n matricea suma este:\n");
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
printf("%4i",c[i][j]);
printf("\n");
}
getch();
}

Iniializarea tablourilor
Exemplele anterioare ne-au artat cum se poate iniializa un
tablou prin valori date de la tastatur. Exist ns posibilitatea
iniializrii unui tablou printr-o definiie de forma:
declaratie tablou={lista valori_initiale};

unde valori_initiale sunt expresii constante compatibile cu
tipul de baz al tabloului.
Exemple:
int vector[6]={-7,-2,95,21,5,-23};
float a[3][2]={1,2,3,4,5,6};
int b[3][2][2]={1,2,3,4,5,6,7,8,9,10,11,12};

n cel de-al doilea caz a fost iniializat o matrice. Cum se
vor completa elementele matricii? Rspunsul este simplu: pe
linii, adic se completeaz linia 0, apoi linia 1 i n sfrit linia
2. Matricea a va arta astfel:
1 2
3 4
5 6
Pentru a sugera modul de iniializare al tablourilor
multidimensionale se pot folosi acolade despritoare n interiorul
listei de valori. Astfel, matricea a se poate scrie mai sugestiv
int b[3][2]= {
{1, 2},
{3, 4},
{5, 6},
};
173

n general, iniializarea elementelor unui tablou
multidimensional se face dup regula ultimul indice variaz cel
mai rapid, care este o generalizare a regulii de memorare pe
linii. Astfel, cele dousprezece componente ale tabloului
b[3][2][2] vor fi iniializate astfel:
b[0][0][0]=1
b[0][0][1]=2
b[0][1][0]=3
b[0][1][1]=4
b[1][0][0]=5
b[1][0][1]=6
b[1][1][0]=7
b[1][1][1]=8
b[2][0][0]=9
b[2][0][1]=10
b[2][1][0]=11
b[2][1][1]=12

Aceste reguli decurg din modul de liniarizare a unui tablou
n C: poziiei i
1
*i
2
*...*i
n
din tablou i corespunde n forma
sa liniarizat (form sub care i se va aloca memoria) poziia k
dat de formula:
k=i
1
*dim
2
*...*dim
n
+i
2
*dim
3
*dim
n
+...+i
n-1
*dim
n
+i
n
.

De exemplu, n cazul unei matrici a[m][n] liniarizarea se
face dup formula k=i*n+j.
S notm n cazul general cu dim produsul
dim
1
*dim
2
*...*dim
n
i cu nval_in numrul constantelor din
lista de iniializare.
Dac dim=nval_in iniializarea tabloului decurge
normal dup regula de mai sus.
Dac dim<nval_in se va produce o eroare, iar dac
dim>nval_in restul de elemente sunt iniializate cu
zero.
Se observ c formula de alocare nu depinde de prima
dimensiune a tabloului, fapt ce permite urmtoarele iniializri
echivalente cu cele prezentate la nceputul seciunii:
int vector[]={-7,-2,95,21,5,-23};
float a[][2]={1,2,3,4,5,6};
int b[][2][2]={1,2,3,4,5,6,7,8,9,10,11,12};
174

Tablouri i iruri de caractere
n C nu exist un tip special pentru definirea unui ir de
caractere. irurile de caractere se construiesc cu ajutorul
tablourilor unidimensionale.
Declaraia unui ir cu numele, nume_sir de lungime
maxim dim-1 caractere se face sub forma:
char nume_sir[dim];

Sfritul unui ir este marcat de caracterul \0; din acest
motiv, n declaratia irului, dimensiunea tabloului trebuie s fie
cel puin cu o unitate mai mare dect numrul de caractere al
irului pe care vrem s-l memorm.
De exemplu:
char sr[10];

conine declaraia irului sr. Iniializarea se poate face printr-o
definiie a irului sub forma:
char sr[10]=aAbBcCdD;

Care este caracterul sr[3] din exemplu de mai sus?
Dac numrul elementelor din ir este mai mare dect
dimensiunea irului, caracterele n plus sunt ignorate, n caz
contrar restul elementelor este iniializat cu zero (caracterul nul).
Dac nu se precizeaz dimensiunea, se poate face
urmtoarea iniializare:
char sr[]=aAbBcCdD;

care este echivalent cu iniializarea tabloului sr cu un ir de
caractere, adic
char sr[]={a,A,b,B,c,C,d,D,\0};

Se observ prezena explicit a terminatorului de ir \0.
Ultimele dou variante rezerv irului un numr de locaii
egal cu numrul elementelor din ir plus o unitate
(corespunztoare terminatorului \0) i este mai comod,
deoarece nu precizeaz o limit maxim pentru numrul de
caractere, permind programatorului s evite numrarea
175

elementelor din ir.
Legtura dintre iruri i tablouri unidimensionale permite
referirea indexat la caracterele irului. Folosind acest lucru, n
exemplul de mai jos se selecteaz i afieaz literele mici din
irul sir.
Exemplul 2.10
Selectarea i afiarea literelor mici dintr-un ir.
#include "stdio.h"
#include "conio.h"

void main(void)
{
int i;
char sir[]="aAbBcCdD";
printf("\n Sirul este: %s",sir);
printf("\n Literele mici din sir sunt: ");
for (i=0;sir[i];i+=2)
printf("%c",sir[i]);
getch();
}
Funcii pentru prelucrarea irurilor de caractere
Funcii cu prototipul in stdio.h
Pentru operaiile de intrare/ieire cu iruri se pot folosi
funciile scanf() respectiv printf() cu descriptorul de format %s.
Exemplul 5.21
Citirea a dou iruri sub forma nume prenume i afiarea
lor sub forma prenume nume.
#include "stdio.h"
#include "conio.h"
void main(void)
{
char nume[25],prenume[25];
printf("\n Numele=");
scanf("%s",nume);
printf("\n Prenumele=");
scanf("%s",prenume);
printf("\n %s %s",prenume,nume);
getch();
}
176

Pentru citirea unui ir de la tastatur se poate folosi funcia
gets() cu forma general:
gets(sir_destinatie);

iar pentru afiarea unui ir pe ecran funcia puts() cu forma
general:
puts(sir).

Observaie. Funcia gets() transfer n sir_destinatie
toate caracterele pn la apsarea tastei Enter.

Funcii cu prototipul n string.h
Fiierul string.h conine prototipurile funciilor
specializate pentru manipularea irurilor de caractere. Iat cteva
dintre acestea:
Funcia strcpy() cu forma general:
strcpy(sir_destinatie, sir_sursa);

copiaz sir_sursa n sir_destinatie;
Funcia strcmp() cu forma general:
int strcmp(sir1, sir2);

compar cele doua iruri caracter cu caracter i ntoarce o
valoare:
<0 dac sir1<sir2;
=0 dac sir1=sir2;
>0 dac sir1>sir2.
Comparaia irurilor se face lexicografic.
Funcia strlen() cu forma general:
unsigned int strlen(sir);

ntoarce numrul de elemente dintr-un ir;
Funcia strcat() cu forma general:
char *strcat(sir1, sir2);

177

adaug sir2 la sfritul irului sir1 (concatenare).
Exemplul 5.22
Se citete de la tastatur un numr neprecizat de iruri de
caractere. Citirea se termin cnd se ntlnete irul stop.
Programul stabileste irul minim (n sens lexicografic) i l
afieaz mpreun cu lungimea sa.
#include "stdio.h"
#include "conio.h"
#include "string.h"

void main(void)
{
char min[20],x[20];
printf("\n Introduceti siruri de caractere ! ");
printf("\n La sfarsit tastati STOP \n");

strcpy(min,gets(x));
while (strcmp(x,"stop"))
{
strcmp(min,x)<0 ? min : strcpy(min,x);
gets(x);
}
printf("\n Sirul minim este "); puts(min);
printf("\n si are lungimea %i",strlen(min));
getch();
}

Test de autoevaluare

5.35. Declaraia
float x[100];
nseamn
a. rezervarea n memorie a 100 de locaii la adrese
consecutive
b. rezervarea n memorie a 100de locaii la adrese
ntmpltoare
c. rezervarea a 100 de octei pentru variabila real x
178

5.36. Secvena de program
int x[m][n],m=3,n=2;

a. este corect deoarece dimensiunile m i n ale matricii
sunt cunoscute
b. este greit deoarece m i n trebuia s fie declarai
nainte de x
c. este greit deoarece la declarare n main(),
dimensiunile unui tablou trebuie s fie constante i nu
variabile
5.37. Secvena de program
int y[10];
y[10]=7;

a. atribuie componentei y[10] a tabloului y valoarea 7
b. este greit deoarece componentele tabloului sunt y
[0],y[1],y[2],...,y[9]
c. este corect deoarece componentele tabloului sunt
y[1],y[2],...,y[10]
5.38. n secvena de program
int x[3][2];
x[1,2]=5;

a. atribuirea x[1,2]=5 este echivalent cu
x[1][2]=5
b. atribuirea x[1,2]=5 este corect sintactic i
nseamn x[2]
5.39. Urmtoarele trei declaraii ale tabloului x,
int x[6];
int x[3][2];
int x[2][3];

a. sunt echivalente
b. nu sunt echivalente
5.40. n urma iniializrii tabloului a
int a[3][2]={1,2,3,4,5,6};

179

componenta a[1][0] are valoarea
a. 2
b. 3
c. alt valoare dect dect 2 sau 3
5.41. Iniializarea
int a[3][2]={1,2,3,4,5,6};
este echivalent cu:
a. int a[3][2]={
{1,2},
{3,4},
{5,6},
};
b. int a[3][2]={
{1,4},
{2,5},
{3,6},
};

5.42. Iniializarea
float x[2][3]={1,2,3,4,5,6};
este echivalent cu
a. float x[][]={1,2,3,4,5,6};
b. float x[][3]={1,2,3,4,5,6};
c. float x[2][]={1,2,3,4,5,6};
5.43. Secvena de program
int x[10],i;
for(i=1;i<=10;i++)
scanf(%d,&x[i]);

a. este greit sintactic
b. nu iniializeaz toate componentele vectorului x
c. produce eroare la execuie
5.44. Secvena de program
char x[]=abc;
este echivalent cu:
a. iniializarea char x[]={a,b,c};
180

b. iniializarea char x[4]={a,b,c};
c. iniializarea char x[]={a,b,c,\0};
5.45. Secvena de program
char x[]=abcd;
putch(x[1]);

a. afieaz caracterul a
b. afieaz caracterul b
c. este greit deoarece elementele dintr-un ir nu se
pot referi indexat
5.46. Secvena de program
char x[20]=abcd;
printf(\n Lungimea sirului=%i,strlen(x));
afieaz mesajul
a. Lungimea sirului=20
b. Lungimea sirului=4
c. Lungimea sirului=5
5.47. Secvena de program
char x[]= rac;
char y[]= arc;
printf(%d,strcmp(x,y));
afieaz o valoare
a. egal cu zero
b. mai mic strict dect zero
c. mai mare strict dect zero
5.48. Secvena de program
char x[]=ac;
char y[]=ar;
strcat(x,y);
printf(\n %s,x);
afieaz
a. acar
b. arac
5.49. n secvena de program
char x[20];
181

x=Ploiesti;
atribuirea
x=Ploiesti;

a. este greit
b. este greit, iar copierea irului Ploiesti n
variabila x se realizeaz prin strcpy(x,Ploiesti);
c. este corect
5.50. Secvena de program
char x[20];
gets(x);
puts(x);
afieaz acelai ir dac nlocuim gets(x); cu:
a. gets(&x);
b. scanf(%s,&x);
c. scanf(%s,x);
5.51.n secvena de program
int i;
char x[20]=xyzw;
puts(x);
apelul
puts(x);

poate fi nlocuit cu:
a. printf(\n %s,x);
b. for(i=0;i<5;i++)
putch(x[i]);
Rspunsurile testelor de autoevaluare
5.1 a 5.2 d 5.3 c 5.4 b 5.5 c
5.6 c 5.7 b 5.8 c 5.9 c 5.10 a
5.11 c 5.12 b 5.13 c 5.14 b 5.15 c
5.16 d 5.17 c 5.18 a 5.19 d 5.20 a
182

5.21 a 5.22 b 5.23 b 5.24 c 5.25 b
5.26 b 5.27 b 5.28 b 5.29 a 5.30 b
5.31 c 5.32 a 5.33 a 5.34 b, c, d
5.35 a 5.36 c 5.37 b 5.38 b 5.39 b
5.40 b 5.41 a 5.42 b 5.43 b 5.44 c
5.45 b 5.46 b 5.47 c 5.48 a
5.49 a, b 5.50 a, b, c 5.51 a, b

Lucrare de verificare ...................................................
Realizai o prezentare a structurilor de control n limbajul C.
Scriei un program C care citete de la tastatur un vector de
numere ntregi i afieaz media aritmetic a elementelor pare.
Scriei un program C care citete de la tastatur o matrice
nxn de numere ntregi reprezentnd durata transportului pe care
o nregistreaz un autoturism ntre oraele 1,2,,n (este posibil
ca drumul de la oraul i la oraul j s dureze mai mult sau mai
puin fa de drumul de la j la i) i afieaz durata minim a
drumurilor care pleac din oraul x citit la tastatur. Ctre ce ora
duce drumul identificat?
Rezumat
Instruciunile de control ale limbajului C, care sunt
implementrile, specifice limbajului, ale structurilor algoritmice
fundamentale discutate n UI4, sunt urmtoarele:
instruciunea expresie
instruciunile de decizie: if (if-else i varianta if cu
ramur vid) i switch, la care se adaug operatorul
condiional ?:
instruciunile iterative (repetitive sau de ciclare):
while, for i do - while
183

instruciunile de salt: break, continue, goto, return
Exist posibilitatea ca o instruciune decizional s includ
o alt instruciune decizional i ca o instruciune iterativ s
includ o alt instruciune iterativ; se spune n acest caz c
instruciunile sunt imbricate sau incluse.
Instruciunea break poate ncheia execuia unei prelucrri
case din instruciunea switch sau poate ncheia forat un ciclu.
Instruciunea continue, folosit numai n corpul unui ciclu,
foreaz execuia urmtoarei iteraii a ciclului, omindu-se
instruciunile prezente ntre cele dou iteraii (locul unde se afl
plasat n corpul ciclului i sfritul acestuia).
Instruciunea goto realizeaz un salt necondiionat la o
instruciune identificat prin eticheta care urmeaz instruciunea
goto. Saltul poate fi fcut nainte sau napoi.
Evident c n programe aceste instruciuni se pot combina i
include unele n altele dup cum cere algoritmul proiectat pentru
a rezolva o anume problem.
Tablourile, acele structuri de date care reprezint colecii
omogene de date stocate n locaii de memorie nvecinate, sunt
implementrile noiunilor de vector (cnd exist o singur
dimensiune), matrice (cnd se consider dou dimensiuni) sau
masiv multidimensional (cnd se consider mai mult de dou
dimensiuni) n limbajele de nivel nalt.
Un exemplu de vector, unul de matrice i respectiv unul de
masiv multidimensional, declarate n C, sunt urmtoarele:
int v[50];
float a[10][20];
int t[2][2][6][10][3];

Accesul la oricare din elementele tabloului se face cu
ajutorul indicilor, care n C ncep de la 0.
Dimensiunea zonei continue de memorie alocate este dat
(n octei) de valoarea
dim
1
*dim
2
*dim
3
*dim
n
*sizeof(tip).
unde dim
i
este dimensiunea i, iar tip este tipul de baz al
elementelor.
Alocarea spaiului de memorie pentru elementele tabloului
184

se face n timpul compilrii, iar dimensiunea acestui spaiu nu
poate fi modificat pe parcursul execuiei programului un
tablou este un tip de dat alocat static. O dat fcut alocarea,
compilatorul nu mai face nici o verificare a dimensiunii i prin
urmare gestionarea corect a zonei de memorie alocate cade
exclusiv n sarcina programatorului.
Tablourile se pot iniializa ca n exemplele:
int v[6]={-7,-2,95,21,5,-23};
float a[3][2]={1,2,3,4,5,6};

Iniializarea elementelor tablourilor cu mai multe
dimensiuni se face dup regula ultimul indice variaz cel mai
rapid, care este o generalizare a regulii de memorare pe linii
ntlnite la matrici.
Pentru definirea unui ir de caractere, n C nu exist un tip
special de date. Acestea se construiesc cu ajutorul tablourilor
unidimensionale, care se declar ca n exemplul
char sr[10];

Un ir memorat n variabila cu numele sr va putea avea
lungimea maxim 9, deoarece ultima poziie, sr[9],este
ocupat cu caracterul sfrit de ir, \0.

Iniializarea unui ir se poate face printr-o definiie a irului sub
forma:
char sr[10]=aAbBcCdD;

Funciile principale de prelucrare a irurilor de caractere:
funcii de citire/scriere: scanf() i printf() care
folosesc descriptorul de format %s, gets() i puts()
strcpy() care copiaz un ir n alt ir
strcmp() care compar lexicografic dou iruri
strlen() care returneaz lungimea unui ir
strcat() care concateneaz dou iruri


185

Bibliografie

1. Cristian Marinoiu, Programarea n limbajul C, Editura
Universitii din Ploieti, Ploieti, 2000.
2. Brian Kernighan, Dennis Ritchie, The C programming Language,
Prentice Hall, 1988.
3. Herbert Schildt C: Manual complet, Editura Teora, Bucureti,
1997.


186

Bibliografia cursului

1. Liviu Dumitracu, Monica Vldoiu, Mihaela Oprea, Cristian
Marinoiu i colectiv, Borland Pascal n 13 conversaii cu CD,
capitolul 12, Structuri de date. Operaii elementare, pag. 548-583,
Editura Universitii din Ploieti, 2001.
2. Luca-Dan erbnai, V. Cristea, Florica Moldoveanu, Valeriu
Iorga, Programarea sistematic n limbajele Pascal i Fortran,
Editura Tehnic, Bucureti, 1984.
3. Gheorghe Barbu, Ion Vduva, Mircea Boloteanu, Bazele
Informaticii, Editura Tehnic, Bucureti, 1997.
4. Dana Petcu, Calcul Paralel, Editura de Vest, Timioara, 1994.
5. Tiberiu Popescu (coordonator). Dicionar de Informatic, Editura
tiinific i enciclopedic, Bucureti, 1981.
6. A. Petrescu, N. pu, T. Moisa, Gh. Rizescu, V. Hrbor, N.
Mranu, Tr. Mihu, abc de calculatoare personale i nu doar att
Vol.I, Ed. Tehnic, Bucureti, 1990.
7. L. Livovschi, Bazele Informaticii, Editura Didactic i Pedagogic,
Bucureti, 1981.
8. Florin Punescu, Analiza i concepia sistemelor de operare,
Editura tiinific i Enciclopedic, Bucureti, 1982.
9. Cr. Marinoiu, Programarea n limbajul C, Editura Universitii
din Ploieti, Ploieti, 2000.
10. J. Glenn Brookshear, Introducere n Informatic, Ed. Teora,
Bucureti, 1998.
11. Andrew Tanenbaum, Computer Networks, fourth edition,
Pearson Education International, 2003.