Sunteți pe pagina 1din 102

UNIVERSITATEADINORADEA FACULTATEADETIINE

Programareprocedural
[suportdecurs]

Lect.univ.dr.HoreaOros
[]

[LucrareareprezintsuportuldecurspentrudisciplinaProgramareProceduraldin
planuldenvmntalstudenilordelaspecializrileInformaticiMatematicanulI.]
Cuprins
1. Introducere ................................................................................................................ 5
Definiii ........................................................................................................................... 5
Paradigme de programare ............................................................................................... 7
Generaii de limbaje ........................................................................................................ 8
Istoria i evoluia limbajelor de programare ................................................................. 10
Tendine ........................................................................................................................ 16
2. Procesuldecreareasoftwareului ........................................................................ 17
Introducere .................................................................................................................... 17
Aspecte ale calitii software-ului ................................................................................. 18
Studiu de caz - Limbajul C ........................................................................................... 19
3. Traducereaiexecuiaprogramelor ..................................................................... 21
Specificarea sintaxei unui limbaj de programare .......................................................... 21
Traducerea programelor ................................................................................................ 28
Uniti de program ........................................................................................................ 32
Link-editarea ................................................................................................................. 33
Execuia programelor .................................................................................................... 34
Medii de programare i execuie ................................................................................... 35
Interpretarea .................................................................................................................. 35
4. Declaraii .................................................................................................................. 36
Rolul identificatorilor ntr-un program ......................................................................... 36
Semantica unei declaraii .............................................................................................. 37
Declaraii de constante .................................................................................................. 37
Declaraii de tipuri de date ............................................................................................ 40
Declaraii de variabile ................................................................................................... 47
5. Tipuridedate .......................................................................................................... 58
Tipuri fundamentale ...................................................................................................... 58
iruri de caractere ......................................................................................................... 60
Tipul pointer.................................................................................................................. 61
Tipuri procedurale......................................................................................................... 63
Tipuri structurate ........................................................................................................... 64
Tipul tablou ................................................................................................................... 66
Tipul de date nregistrare .............................................................................................. 68
Tipuri definite de utilizator ........................................................................................... 70
6. Expresii..................................................................................................................... 71
Generaliti.................................................................................................................... 71
ProritateaiasociativitateaoperatorilornlimbajulC: ................................................ 73
Clase de operatori i de expresii (dup tipul rezultatului) ............................................ 75
Modaliti de evaluare a expresiilor .............................................................................. 80
7. Instruciuniicontrolulexecuiei .......................................................................... 84
Instruciunea de atribuire .............................................................................................. 84
Instruciunea compus .................................................................................................. 86
Instruciuni condiionale (de ramificare, de selectare) .................................................. 86
Instruciuni de ciclare.................................................................................................... 88
Instruciuni de transfer .................................................................................................. 89

Programarea structurat i cum s-a ajuns la ea ............................................................. 90


8. Proceduriitransmitereaparametrilor ................................................................ 92
Abstractizare i specificare ........................................................................................... 92
Proceduri ....................................................................................................................... 96
Evaluarea i transmiterea parametrilor ......................................................................... 98
Specificarea parametrilor unei proceduri ...................................................................... 99
Noiunea de efect secundar ........................................................................................... 99
Proceduri mutual recursive ......................................................................................... 100
9. ANEXE .................................................................................................................... 101

4
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lect.univ.dr.HoreaOros

1. Introducere
PP este o paradigm de programare bazat pe conceptul de apel de procedur.
Procedurile, numite i rutine, subrutine, metode sau funcii (a nu se confunda cu
funciile matematice, dar similare cu cele folosite n programarea funcional)
coninoseriedepaicomputaionalicaretrebuieparcuri.Oriceprocedurpoatefi
apelat oriunde n timpul execuiei unui program inclusiv din interiorul ei (apel
recursiv).

PPestedemulteorioalternativmultmaibundectprogramareasecvenialsau
programarea nestructurat n situaiile n care complexitatea problemei este
moderatinunecesitunefortdentreinereridicat.

BeneficiialePP:
Posibilitateadearefolosiacelaicodnlocuridiferitencadrulprogramului
fralcopia.
Controlul execuiei programului este mai simplu n comparaie cu folosirea
unorinstruciuniGOTOsauJUMP(instruciunicepottransformaunprogram
marencevacesenumetecodsubformdespaghete).
Abilitateadeafiputernicmodularistructurat.

Definiii
Limbajdeprogramare:notaiesistematicprincareestedescrisunprocesdecalcul.
Rolul unui LP este de a pune la dispoziia programatorilor construcii sintactice
pentruorganizareacalculelor.Procesuldecalculesteconstituitdintromulimede
pai pe care o main i poate executa pentru a rezolva o anumit problem, pai
care sunt exprimai n comenzielementare pe caremaina (calculatorul) tie s le
execute.Pentrudescriereaprocesuluidecalculestenecesarcunoatereasetuluide
comenzi(instruciuni)almainiilacarenereferim.
Limbaj main: limbajul nativ al unui computer, reprezint notaia la care
calculatorul rspunde n mod direct. Setul de comenzi elementare al unui
calculatoresteconstituitdin:operaiiaritmeticeilogice,operaiideintrareieire
i unele funcii speciale, numite funcii de control. Comenzile i instruciunile
limbajului main sunt scrise ntro form codificat, foarte compact, fapt ce
ngreuneazfoartemultnelegereatextuluisurs.Limbajulmainestefoartelegat
de arhitectura fizic a mainii, el fiind constituit din codificri binare a cror
semnificaieesteimposibildedescifratnmodrezonabildectreprogramator.
0000101011110000
0010111111111111
0010000000000101

5
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Limbajul de asamblare: face un pas nainte ntruct atribuie nume simbolice
(mnemonici) codificrilor operaiilor mainii, precum i locaiilor de memorie
asociate. Secvena de coduri binare de mai sus are, pe o anumit arhitectur,
echivalentulmnemonic:

LOAD I
ADD J
STOREK

Niciunadinceledouvariantenuestelafeldeclarisemnificativcaechivalentul
lor:

K:=I+J

Din acestmotiv, limbajelemain i cele de asamblarese numesclimbaje denivel
sczut.
Acestelimbajesuntfoartedepartedelimbajulnatural,aacsacutatelaborarea
altor limbaje, mai apropiate de exprimarea natural. Rezultatul a fost crearea
limbajelor de nivel nalt (highlevel programming languages). Aceste limbaje
utilizeaz notaii mai puin primitive dect limbajele de asamblare, n care
exprimarea aciunilor de urmat devine uoar, clar i concis. Nivelul nalt are
semnificaiauneidistanrisuficientdemarifadeniveluldeexprimarealmainii.
Un limbaj de nivel nalt mrete considerabil numrul celor care vor programa
calculatoare. Proiectarea i implementarea limbajelor de programare este
activitateacapitaldeacreicalitatedepindelrgireacomunitiiprogramatorilor
carespoatrealizaeficientdezvoltareaunoraplicaiidelarginteres.
Orice notaie utilizat care este diferit de limbajul main nu poate fi executat
direct, ea trebuind s fie tradus n limbajul main al calculatorului gazd.
Activitatea de traducere (numit generic translatare) este preluat de programe
specializatenumitecompilatore(dactextulsursestescrisntrunlimbajdenivel
nalt)sauasambloare(dactextulsursestescrisnlimbajdeasamblare).
Datorit interpunerii compilatoarelor i asambloarelor este evident c odat cu
creterea claritii i accesibilitii, limbajele de programare de nivel nalt aduc cu
ele i o scdere a performanei de execuie fa de variantele de program scrise
directnlimbajmain.Acestescderisemanifestpedouplanuri:
timpmaincerutdeprocesuldecompilare
codul rezultat n urma translatrii este de obicei mai lung i necesit mai
multtimpdeexecuiedectvariantacodificatdirectnlimbajmain.
Trecerea la utilizarea LP de nivel nalt a adus cu sine o caracteristic foarte
importantaprogramelorscrisenastfeldelimbajeianume portabilitatea,adic
posibilitatea de a rula programele fr modificri pe arhitecturi de calcul diferite
(eventualmodificrilesuntcutotulminore).Acestmomentafostfoarteimportant

6
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

pentrudezvoltareauneicomunitideprogramatori,pentrurspndireasoftuluii
pentrucreareadebibliotecideprogramereutilizabile.

Paradigme de programare
Paradigm de programare: colecii individualizate de caracteristici de evaluare i
criterii de abstractizare care determin i difereniaz clasele de limbaje de
programare. Astfel de criterii sunt: structura programului, noiunea de stare a
execuiei,metodologiaprogramrii.
Programarenestructurat:foloseteGOTO
Programarestructurat:eliminGOTO(saureducefoartemultutilizareaGOTO)
Programarea procedural: este caracterizat prin faptul c un program este privit
caomulimeierarhicdeblocuriiproceduri.Exponent:ALGOL60
Programare funcional: un program este descris pe baza unor funcii de tip
matematic utilizate de obicei recursiv. Funciile sunt considerate obiecte cu
drepturiegale(firstclasscitizens)ncadrullimbajului,adiclafelcaelementele
oricrui tip de dat ele pot constitui elementul de baz n structurarea unor date
(putem avea de exemplu tablouri de funcii), pot fi returnate ca rezultat al unor
funcii(funciacompuneredefunciireturneazoaltfuncie).Exponeni:Lisp(anii
60),Miranda(anii70),ML(anii80),Haskell(anii90).
Programareimperativ:(opusulesteprogramaredeclarativ)esteoparadigmde
programare care descrie procesul de calcul n termeni de stare a programului i
instruciunicareschimbstareaprogramului.Programeleimperativepotfiprivite
ca o serie de comenzi pe care calculatorul le execut. Limbajele imperative indic
modulncarearelocprocesuldecalcul.Majoritatealimbajelordeprogramaresunt
limbajeimperative.(Fortran,Algol,C,Pascal,Ada)
Programare declarativ: este o abordare a programrii calculatoarelor ce implic
creareaunuisetdecondiiicedescriuspaiulsoluieidarlasinterpretareapailor
necesari pentru a ajunge la soluie unui interpretor nespecificat. Programarea
declarativesteoabordarediferitfadeprogramareimperativtradiionaldin
Fortran,Pascal,Ccarenecesitcaprogramatorulsfurnizezeolistdeinstruciuni
ce se execut ntro ordine specificat. Soluiile declarative au dou faze
independente:declaraiaiinterpretarea.(Prolog,Haskell,Oz,SQL,WSDL)
Programare logic: un program este descris printrun set de relaii ntre obiecte
precumiderestriciicedefinesccadrulncarefuncioneazaceleobiecte.Execuia
nseamn aici activarea unui proces deductiv care va furniza concluzii posibile pe
bazadatelordeintrare.Exponent:Prolog.
Programare bazat pe obiecte i orientat pe obiecte: un program este constituit
dintro colecie de obiecte care interacioneaz. Exponeni: Simula, Smalltalk, C++,
Java,C#.
Programare concurent i distribuit: execuia unui program este constituit din
aciuni multiple posibil a fi executate n paralel pe una sau mai multe maini.
Execuia aciunilor poate fi independent sau aciunile pot depinde una de alta,

7
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

situaie n care este nevoie de primitive de sincronizare i comunicare. Exponeni:
CSP, extensii concurente ale limbajelor imperative (C, Pascal, FORTRAN), Linda,
Occam
Programare la nivelul bazelor de date: aciunile programului sunt dictate de
cerinele unei gestiuni corecte i consistente a bazelor de date asupra crora
acioneazprogramul.Exponent:SQL.
Paradigmele prezentate nu sunt mutual exclusive. Exist limbaje de programare
multiparadigm.

Generaii de limbaje
19541958Limbajeledeprogramaredeprimageneraie(FORTRANI,ALGOL58).
Acesteaaumerituldeafifcutpasuldecisivdelalimbajuldeasamblarelalimbajele
de nivel nalt. Rolul lor primordial a constat n promovarea i dezvoltarea
conceptelor ce stau la baza limbajelor de programare de nivel nalt precum i a
implementriilor.
19591961Limbajedegeneraiaadoua(ALGOL60,FORTRANII,Cobol,Lisp)
Sunt considerate limbaje stabile, durabile, care se utilizeaz intens i astzi. Chiar
dacALGOL60nuaatinsungradderspndiresuficientdemare,influenasaafost
imensndezvoltarealimbajelorPascal,PL/1,SimulaiAda.
19621971Limbajedegeneraiaatreia(PL/1,ALGOL68,Pascal,Simula)
Chiardacaureprezentatteoreticunpasnainte,succesullornusepoatecompara
nicipedepartecucelallimbajelordegeneraiaadoua.ncercareaacestorlimbaje
dealenlocuipeceledegeneraiaadouaafostsortiteecului,fcndulpeC.A.R.
Hoare s remarce ALGOL60 reprezint un pas nainte fa de succesorii(!) si.
Limbajul PL/1 a combinat elemente de FORTRAN, ALGOL i Cobol rezultnd un
limbaj puternic, dar mult prea complex, deosebit de dificil de nvat i de
implementat. ncercarea limbajului ALGOL68 de a generaliza limbajul ALGOL60 a
fost caracterizat drept elegant dar neacceptat practic de marea mas a
programatorilor. Limbajul Pascal, dei cu un enorm succes din punct de vedere
didactic,nuesteconsideratniciastzisuficientderobustpentruutilizarealascar
industrial.
19721979Limbajedegeneraiaapatra(CLU,CSP,Ada,Smalltalk)
Au avut o rspndire i mai redus dect cele de generaia a treia, justificnd pe
bun dreptate denumirea acestei perioade drept gol de generaie (generation
gap).Aceastperioadafostnsoperioaddecercetareintensidereevaluarea
obiectivelor proiectrii limbajelor de programare. Criza software de la sfritul
anilor 60 a condus la o schimbare de optic n acest sens, accentul cznd pe
structurare.Lanivelmicroacestlucrusafcutprineliminareainstruciunilorgoto
inlocuirealorcuinstruciunidetipwhile,iarlanivelmacrosapusmareaccent
pe modularizarea programelor prin utilizarea intensiv de funcii i proceduri i
prinpromovareaconceptuluideabstractizareadatelor.

8
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

19801990Paradigmealelimbajelordeprogramare
Aceast perioad se caracterizeaz printro intens activitate de cercetare,
concentratnuattpestudiulidezvoltareaunorlimbajeparticulare,ctpestudiul
paradigmelor asociate claselor de limbaje. n acest sens se remarc clasele de
limbaje funcionale, logice, orientate obiect i distribuite, ele reprezentnd i cele
patruparadigmedeprogramarecelmaiintensstudiatelaoraactual.

9
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Istoria i evoluia limbajelor de programare


Primullimbaj
Ada Lovelace scrie programe pentru proiectul motor diferenial al lui Charles
Babbage iar mai apoi pentru motorul analitic. n 1945, germanul K. Zuse,
inventatorul calculatorului Z3 a definit un limbaj evoluat pentru acest motor
(folosindtablouriinregistrri)

Asamblare
Asambloarele au aprut o dat cu primele calculatoare. Acestea asociaz un nume
simboliccoduluilanivelmain,deex:
Addbx,4
cmp[adr],3
jmpaddress
Programarea n limbaj de asamblare nu se mai practic pe scar larg, nici mcar
pentrurutinecetrebuiesrulezefoarterapid.

Autocoder1952
AlickEGlennie
ImplementatpentruprimadatpeMark1,iarmaiapoiipealtecalculatoare.

IPL1956
InformationProcessingLanguage
ANewell,HSimon,JCShaw
Limbajdeniveljospentruprocesarealistelor.Implementeazrecursivitatea

Fortran19541958
FORmulaTRANslator
JohnBackusialicercettoridelaIBM
Limbajdedicatcalculelormatematice

10
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

FortranII(1958)introducesubrutine,funcii,bucle,ostructurdecontrolprimitiv
detipFOR.Identificatoriisuntlimitailaasecaractere

Lisp19581960
LIStProcessing
MacCarthy
Limbaj funcional pentru procesarea listelor. Este recursiv, nu este iterativ. Nu
existdiferenntrecodidate.

Algol1960/AlgolW1966/Algol68
ALGOrithmicLanguage
Definitdeunconsoriuinternaionalformatdinspecialitininformatic

Primul limbaj universal independent de main. Introduce utilizarea gramaticilor


BNF(BackusNaurForm)pentruacreaunanalizorsintactic.Introduceblocurilede
instruciuni i variabilele locale n cadrul unui bloc. Recursivitatea a fost
implementat cu reticen pentru c a fost considerat inutil! Folosete tablouri
dinamiceceeacenseamnclimbajeleurmtoare(Pascal,C)auregresatfolosind
tablouristaticepentruoperformanmaibun.
AreinstruciuneaIFTHENELSE,FOR,simbolul:=pentruatribuire(folositmaiapoi
nPascal),instruciuneaSWITCHcuGOTO,indicatoriBEGIN,ENDicicluWHILE.
Algol W proiectat de Niklaus Wirth n 1966 folosea RECORD (structuri de date
dinamice), CASE, transmiterea parametrilor prin valoare, precedena operatorilor.
n acelai an, Niklaus Wirth a creat Euler, un limbaj ntre Algol i Pascal. Algol 60
limbaj orientat spre calcule matematice. Pentru a ncerca s se obin obiectivul
iniialianumedeacreaunlimbajdeuzgeneral,sacreatncepndcu1964onou
versiuneAlgolX,numitmaitrziuAlgol68.Algol68folosea=+pentruacontopi
atribuireacuadunarea.IntroduceUNIONitipuriCAST.AreIFTHENESLEFI,CADE
GOTO,operatoridefiniideutilizator.Compilareaincrementalnuestepermis.

Cobol1960
COmmonBusinessOrientedLangage.
DefinitdeCODASYL,COnferenceonDAtaSYsystemsLanguages.

11
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Basic1964
BeginnersAllpurposeSymbolicInstructionCode

JohnKemeny,ThomasKurtz

Proiectat n1963,pentruafiuor denvatiafostimplementatn1964.Prima


versiuneafostcompilat,dupcareadevenitinteractiviinterpretat.Fiecarelinie
areunnumripermitesaltullaliniecuinstruciuneaGOTO.
Bill Gates i Paul Allen au ctigat un concurs internaional prin proiectarea i
implementareaunuiBasicrapidicompact,primadatpeAltair(4kbdememorie)
imaiapoipealtemicrocomputere.
Microcomputerele aufost furnizate cuBasicnROM pnla sfritul anilor80. n
1977, Appel II se vindea cu Basic pentru ntregi. Mai apoi Applesoft Basic de la
Microsoft cu virgul flotant. Applesoft avea identificatori din dou litere.
SubprogrameleerauapelateprinGOSUBnumrlinie.
PrimulPCdelaIBM(1981)foloseasistemuldeoperareMSDOSdelaMicrosofti
Basicinterpretat(Basica).n1982MicrosoftaprodusprimulBasiccompilat(Quick
Basic)
n acelai deceniu Pascal i C au nlocuit Basic. Microsoft folosete n continuare
Basic(VBA).

Logo66

WFuerzeig,SPapert,andothers

Folositpentruainvapecopiiprogramare.AsemntorcuLispisebazeazpe
micareauneibroateestoasepeecran.

Pascal1970
BlaisePascal,matematicianfrancez

NiklausWirth.

12
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

A fost proiectat pentru a simplifica crearea compilatoarelor i pentru ndruma
procesuldenvareaprogramriispreprogramareastructurat.UCSDPascaleste
prima versiune pentru microcomputere. Programele sunt compilate n Pcod, care
este portabil i interpretat (la fel ca Java mai trziu). Includea un mediu pentru
dezvoltare de aplicaii complet, un principiu folosit cu succes mai trziu n Turbo
Pascal.n1981,joculWizardryscrisnPascalaavutunsuccesfoartemarepeApple.
Turbo Pascal (proiectat deAnders Hejlsberg)a aprutn 1983.Erarapid, aveaun
IDE complet aa c limbajul a avut un succes instantaneu i este folosit chiar i
astzi.StructuriledecontrolsuntasemntoarecuceledinC.

Smalltalk1972

AlanKay,SoftwareConceptGroup.

Limbajdeprogramareorientatobiectcareruleazntotdeaunancadrulunuimediu
grafic,cuferestre,mouseetc.

C1973
CestesuccesorulluiB,carelarndulluiestesuccesorulluiBCPL

DennisRitchie.

A fost destinat pentru programarea sistemului de operare UNIX, dar a devenit


repede un limbaj universal datorit portabilitii i vitezei. Permite compilare
incremental. n 1965, programatorii AT&T foloseau BCPL pentru a implementa
Unix.Nemulumiidelimbaj,laumbuntitisacreatlimbajulBiarmaiapoiC.
EvoluiahardwareuluiadeterminatapariialimbajuluiC.BCPLiBfoloseauntregi
pentru pointeri, dar aceasta nu funciona pe calculatoarele noi. BCPLnuare tipuri
(lafelcaPHPsaualtelimbajescriptmoderne).Declaraiileinti,charbaufostcreate
nC.Ulteriorauaprutialtetipuri.Operatorul+=vinedinAlgolundeerascris=+.
nBCPL,unblocdeinstruciuniesteinclusntresimbolurile(*i*)iarcomentariile
ntre /* i */ iar subexpresiile ntre ( i ). Limbajul C a simplificat scrierea prin
folosirea acoldelor. ++ exista i n limbajul B. Cuvntul include venea din PL/1.
Preprocesorulafostimplementatn1973idinacelmomentlimbajulCafostfolosit
pentruscriereasistemuluideoperareUnix.Limbajulaevoluatpnn1980.

Sql1970+

13
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

StandardQueryLanguage

IBM

Limbajpentruinterogareabazelordedaterelaionale.

C++19811986

BjarneStroustrup.

Versiune a limbajului C orientat pe obiecte. Introduce suprancrcarea


operatorilor. Metodele pot fi inline. Comentarii // care vin din BCPL. Au fost
implementatemotenireaiabloanele(clasesaufunciigenerice).

Objective C, inventat de Brad Cox n 1984, este o alt versiune orientat obiect a
limbajuluiCinspiratdinSmalltalk.

Perl1987
PracticalExtractingandReportLangage.

LarryWall,lingivstaustralian

Destinat pentru nlocuirea limbajelor linie de comand Unix, Sh, Sed and Awk, a
pstrataceeaisintaxgreoaie.Folositnprincipalpentruadministrareasistemului
i scripturi CGI. Folosete liste i tablouri asociative. Exist structura de control
FOREACHcarepermiteparcurgereaunorliste.

Java1994
Java(coffee)

JamesGosling,SunMicrosistems

Proiectatn1991caunlimbajinteractivnumitOak.Lavremearespectivnuaavut
succes.n1994afostrescrispentruInternetiredenumitJava.n1995seputeau
crea appleturi. n ianuarie 1996, Javasoft distribui JDK 1.0. Kitul pentru
dezvoltarea de aplicaii. Java este un limbaj clasic de programare procedural,
apropiat de C++. Se compileaz n bytecode ce poate rula pe orice calculator. Este
maisimpludectC++:fiecarefiierconineosingurclas,memoriaestegestionat
automat, nu exist pointeri, motenire multipl, suprancrcarea operatorilor dar
includemultitasking.SpredeosebiredeCiC++aredoartablouridinamice.

14
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

PHP1995
PersonalHomePagesHypertextProcessor

RasmusLerdorf

Limbajscript mutliplatform,ceseincludenHTML.AsemntorcuCdarnueste
tipizat. Variabilele se prefixeaz cu $. Interpretorul prelucreaz pagina html ce
include instruciuni php i o transform ntro pagin html pur. Biblioteca de
funcii permite crearea de pagini web dinamice. Microsoft folosete ASP
(asemntorcuBasic)

UML1996
UnifiedModelingLanguage
Standard (Object Management Group) Grady Booch, Jim Rumbaugh, and Ivar
Jacobson
Uml reprezint reunirea a trei limbaje de modelare proiectate de cei trei autori.
Limbajulfoloseteonotaiegraficpentruaproiectasoftware.Sefacdiagramecare
exprim obiecte i interaciunile dintre acestea. Un model este realizat din
vizualizri i combinarea lor descriu un sistem complet. Modelul este abstract i
independentdedomeniu.

Este limbaj pentru specificarea, vizualizarea, construirea i documentarea


proiectelorsotwareintense.

C#2000
(Csharp),succesoralC++?

AndersHejlsberg/Microsoft.

15
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Principalul limbaj din platforma .NET , pentru crearea de software care s
funcionezeprinInternet.LafelcaiJava,pstreazsintaxaC(unlimbajde30de
ani!) i aduce mbuntiri: garbage collector, nu are pointeri, interfee, multi
tasking
C# se comileaz n limbaj intermediar MSIL (Microsoft Intermediate Language) i
folsoeteobibliotecmultilimbaj,CLR(CommonLanguageRuntime).Originalitatea
sistemului.NETestevarietateadelimbajecepotficompilatenMSILipartajarea
claselor.
Altefacilitioferitedeacestlimbaj:
Structurilesuntspecialefiindtransmiseprinvaloare
Identificatoriisuntobiectecumetode
Atributele sunt obiecte descriptive ataate elementelor programului i folosite la
execuie
Proprieti(get/set)
Foreachpentruparcurgereaunorlistedeobiecte
Delegai(nlocuiescpointeriilafunciidinC)
mbuntirifadeJava:
Gestiuneaevenimentelorestembuntit
Suprancrcareaoperatoriloresteprezent
Accesmaisimplulasistemulnativ

Tendine
Limbajescript:NetRexx,Python,Ruby,Scriptol.
LimbajepentruInternet:Php,Asp,JavaScript
Limbajedemarcare:XML
Platforma .NET sau altele similare vor simplifica introducerea de cod n interiorul
datelor,darXMLpoatefioalternativ.C#vafiunliderpentruastfeldeplatforme
iar succesul su va fi asigurat de faptul c programatorii de C, C++ i Java l vor
adopta cu uurin. Datorit faptului c platforma .NET permite utilizarea oricrui
limbaj va fi posibil apariia unor limbaje noi mai expresive. Platforma .NET
foloseteXMLprinconvertireanobiecte.ViitorulestefolosireadirectaXMLului
catipdedate.

16
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

2. Procesuldecreareasoftwareului
Introducere
Limbajele de programare sunt instrumente pentru scrierea de programe. Ele sunt
componente ale procesului de creare a softwareului i prinurmare proiectarea i
implementarea lor respect etapele componente ale acestui proces. Se poate
considera c realizarea unui nou limbaj este structural identic cu realizarea unei
aplicaii software complexe, ea trebuind s urmeze un anumit cadru general, ale
cruifazesuntbinedefinite,cadruncareestepermislafiecarepasrevenirean
fazaimediatanterioar.
ncontinuarevomprezentafazeleprocesuluidecreareasoftwareului.
Analiza i specificarea cerinelor. O aplicaie software este conceput pentru a
veni n sprijinul unui anumit grup de utilizatori poteniali. Cerinele acestora sunt
stabilitesubformaunuidocumentcaretrebuiesprecizezeceeacetrebuiesfac
aplicaiarespectivinucum.Laelaborareadocumentuluiparticipattpotenialii
utilizatori, ct i specialitii n dezvoltarea de software. Acest document conine
specificaiiprivindmanualeleutilizator,studiidecostifezabilitate,cerineprivind
performaneleetc.
Proiectarea i specificarea softwareului. Plecnd de la cerinele specificate n
faza precedent, echipa care realizeaz aceast etap (proiectanii software)
realizeaz specificaiile de proiectare, care identific fiecare modul al sistemului,
precum i interferenele dintre module. Metodologia de proiectare utilizat n
aceast faz are o mare importan pentru alegerea limbajului de programare
utilizatnfazaimediaturmtoare.
Implementarea.Aceastfazestesingurancareesteutilizatexplicitunlimbajde
programare. Implementarea nseamn scrierea de uniti de program
corespunztoare modulelor descrise n specificaiile de proiectare i editarea
documentaieicorespunztoare.Rezultatulacesteifazeesteunsistemimplementat
idocumentatcomplet.
Certificarea.Scopulacesteietapeesteverificareacerinelorimpusenprimaetap
i se realizeaz de obicei prin testarea sistemului n raport cu fiecare cerin
specificat, utiliznduse o baterie de teste, adic un set de programe (cnd este
vorba de un limbaj de programare) sau un set de exemple (cnd este vorba de o
aplicaieoarecare)careacopertoatenecesitileimpuse.Dinpunctuldevedereal
testrii,nusepoatefaceodistincieclarntrefazele3i4.Astfel,estenormalcan
fazadeimplementaresserealizezetestarealaniveldemodul,efectuatdefiecare
programatoriparialtestareainterfeelorintermodule(testaredeintegrare),care
serealizeazprinlegareactorvadintremoduleleaplicaiei.nfazadecertificarese
realizeaz testarea sistemului, care verific sistemul n ansamblul su. Rezultatul
acestei faze este un sistem verificat i certificat complet, livrabil utilizatorilor. n

17
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

afaratestrilorpropriuzise,totnaceastfazseincludtoateactivitilecaresunt
legatedeverificareacorectitudiniiprogramelorscrise.
ntreinerea. Dup intrarea n exploatarea a aplicaiei, pot s apar necesitatea
unormodificri,provocatefiededetectareaunoreroricareauscpatdinfaza4,din
dorina de ai aduga noi specificaii (cerine). De obicei, costul ntreinerii unei
aplicaiintrececostultuturorcelorlaltefazeluatempreun.

ngeneral,oriceprodussoftwaretrebuiessatisfacurmtoarelecerine:
Sfiefiabil
Sfieuordentreinut
Sseexecuteeficient

Aspecte ale calitii software-ului


Toat lumea dorete ca programele s fie fiabile, rapide, uor de folosit, lizibile,
modulare,structurateetc.
Calitatea produselor program se definete ca o compunere a mai multor trsturi.
Existoseriedefactoriexterniifactoriinterni.
Factorii externi de calitatea sunt sesizai de cei care interacioneaz direct cu
produsulfinalicarecumprprodusul,contracteazdezvoltareaintreinerealui.
Factorii interni de calitate se pot detecta doar de ctre persoanele implicate n
procesuldedezvoltaredesoftware.
Factoriiexterni:
Corectitudinea: abilitatea produsului de a executa exact sarcinile sale, n
conformitatecucerineleispecificareasa.
Robusteea: este abilitatea sistemului de a funciona chiar i n condiii anormale.
Uneori se folosete termenul fiabilitate, care este un concept mai general i se
interpreteazcelmaibinecaacoperindattcorectitudineactirobusteea.
Extensibilitatea:esteuurinacucareproduselesoftwaresepotadaptalaschimbri
ale specificaiilor. Exist dou principii eseniale pentru mbuntirea
extensibilitii: simplitatea proiectului (o arhitectur simpl va fi ntotdeauna mai
uordeadaptatlamodificridectunacomplicat)idescentralizarea(cuctsunt
maiautonomemodulelentroarhitectur software,cuattva fimaimicnumrul
de consecine ale unei modificri simple; ea va trebui s afecteze doar modulul n
cauzsauunnumrmaimicdealtemodule).
Reutilizabilitatea:esteabilitateaproduselorsoftwaredeafireutilizate,nntregime
saupariallanoiaplicaii.
Compatibilitatea:esteuurinacucareproduselesoftwarepotficombinatentreele
(potinteraciona).
Eficiena:nseamnfolosirearaionalaresurselorhardware(procesoare,memorii,
dispozitivedecomunicare).

18
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Portabilitatea:esteuurinacucareproduselesoftwaresepottransferandiverse
mediihardwareisoftware.
Verificabilitatea: este uurina de elaborare a procedurilor de acceptare (n
particular date de test) i a procedurilor de detectare i trasare (transformare n
erori)acderilor(failures)ntimpulfazelordevalidareiexploatare.
Integritatea: este abilitatea produselor software de ai proteja componentele
(programe,date,documente)fadeacceseimodificrineautorizate.
Uurinanutilizare:sereferlanvareautilizriisistemului,operarea,pregtirea
datelordeintrare,interpretarearezultatelorirecuperareadinsituaiideeroare.

Factorii interni de calitate sunt strns legai de natura intim a procesului de


elaborareaproduselorprogram.Aicicontribuie:metodeledeanaliziproiectarea
produselor program, facilitile oferite de limbajele de programare folosite la
implementareiaspecteleorganizatoricealeindustrieisoft.
Factoriiinterni:
Modularitatea: structural produsul program trebuie s fie alctuit din module,
urmrinduseprincipiuldescentralizrii.
Documentareacomplet:presupuneexistenauneidocumentaiiclareiaduslazi
pentrufiecarefazdincicluldeviaalprogramului.

Unlimbajdeprogramaretrebuiesposedeurmtoarelecaliti:
S permit o descriere ct mai natural a problemei care se rezolv, permind
programatorului s se concentreze asupra problemei i nu asupra detaliilor de
adresare,indexareetc.
Saibungraddelizibilitatectmairidicat,adicunprogramspoatfiuorde
descifrat(sintacticisemantic)deoricinelconsult.
Spermitgestiuneaexcepiilor(depiriaritmetice,erorideintrareieireetc.)

Studiu de caz - Limbajul C


C este (dup cum admit Brian W. Kernighan i Dennis M. Ritchie, creatorii
limbajului) un limbaj relativ mic, dar un limbaj care se comport foarte bine (din
punctuldevederealadmiratoriloracestuilimbaj).Faptulclimbajulestemiciare
unsetlimitatdecaracteristiciimplicoseriedeavantaje:trebuienvatmaipuin;
nu exist un bagaj suplimentar n calea programatorilor, de care nu au nevoie.
Limbajul fiind mic implic i dezavantaje: din moment ce limbajul nu face totul
pentruprogramator,acestatrebuieslucrezemaimult.(Acestaspectesteprivitde
muli ca i un avantaj: tot ceea ce limbajul nu face pentru programator, nu este
impus,lsndlibertateaprogramatoruluideafaceacellucruaacumvrea.)
Cesteadeseadenumitlimbajdeasamblaredenivelnalt.Uniiconsideraceastao
insult, dar este un aspect intenionat i important al limbajului. Construciile
simple, exprimate n C, nu se extind n construcii de nivel main costisitoare (n
timp sau spaiu), n momentul cnd programul este compilat. Dac scriem un

19
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

programsimpluisuccint,efoarteprobabilcvarezultaunprogramexecutabiln
limbaj main foarte eficient. Dac observai c programul executabil obinut nu
este eficient, motivul este probabil modul de realizare al programului i nu
compilatorul care ar fi fcut ceva, fr tirea programatorului, asupra cruia nu
avemcontrol.
Un limbaj de programare este o unealt, i nici o unealt nu poate realiza orice
sarcin fr un ajutor. Limbajul C nu are toate trsturile necesare de care avem
nevoie n programele noastre. Limbajul C impune un set mic de reguli
programatorilor. Unele sarcini obinuite, cum ar fi manipularea irurilor, alocarea
memorieiirealizareaoperailordeintrareiieire,suntexecutateprinapelulunor
funcii de bibliotec. Alte sarcini de care am avea nevoie n programe cum ar fi:
crearea de directoare, listarea coninutului acestora, interaciunea cu mouseul,
afiareaferestreloretc.,nusuntdefinitedelimbajulC.Acesteoperaiibinenelesc
potfifcutedintrunprogramC,darntrunmodspecificmediuluideprogramare
pe care l folosim (mediu pentru dezvoltarea de aplicaii, compilator, procesor,
sistemdeoperare),modcenuestedefinitdestandardulC.
UnaltaspectallimbajuluiCcaretrebuiepunctataiciestecacestlimbajesteunul
periculos, n sensul c limbajul nu ofer programatorului modaliti de protecie
mpotriva erorilor. Dac scriei un program care face (din cauza unei greeli) cu
totulaltcevadectaiintenionat(deexemplutergereadatelordepedisc),idac
compilatorulpoatecompilaacelprogram,nuveipriminiciunmesajdeavertizare
de genul: Vrei ntradevr s facei asta? sau Suntei sigur c vrei s facei
asta?.Cesteadeseacomparatcuuncuitfoartebineascuit:sepoaterezolvacuel
oproblemcupreciziechirurgical,darnacelaitimpvputeitiacueldegetulcu
oprecizie chirurgical. Programatoruleste celcare trebuie sutilizezelimbajulcu
grij.

20
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

3. Traducereaiexecuiaprogramelor
Unlimbajdeprogramareesteuninstrumentcucaresepoateexprimaunprocesde
calcul,rezultndceeacenumimprogramsursnlimbajuldeprogramarerespectiv.
Programul surs reprezint nivelul virtual al abstractizrii problemei de rezolvat.
Pentru ca maina (calculatorul) s poat rezolva problema, aceasta trebuie
exprimatntermeniilimbajuluimainiirespective,adictrebuieatinsnivelulfizic
alabstractizrii,nivelcevafiatinsprinintermediulunuiprocesdetraducere.
Rezolvareauneiproblemecucalculatorulparcurgedoumarifaze:
formalizarea problemei i exprimarea ei ntrun limbaj de programare. n
termeniicicluluideviaaprogramuluirezultat,aicisuntcuprinseetapelede
definire, specificare, analiz, proiectare i implementare. Rezultatul obinut
esteprogramulsurs.naceastfazrolulfactoruluiumanestehotrtor.
traducereaprogramuluisursrezultatdinetapaprecedentntrunprogram
executabil pe calculator i execuia acestuia. Aceast faz este mult mai
automatizat dect prima, recurgnduse la programe de traducere din
limbajuldeprogramarenlimbajulmain.

Specificarea sintaxei unui limbaj de programare


La definirea unui nou limbaj de programare primele aspecte care se discut sunt
cele exterioare ale acestuia, aspectele ce in de sintaxa limbajului. n continuare
vom discuta despre setul de caractere al unui limbaj, despre modalitile de
descriere a lexicului i sintaxei i despre modul n care se realizeaz analiza
sintacticisemanticatextuluiunuiprogramscrisntrunlimbajoarecare.
Descriereasintaxei isemanticiiunuiLP ovom face ntrun cadrumai largfcnd
referirilafazeleprocesuluidetraducerealimbajului.
Setuldecaractere
Fiecare limbaj de programare este bazat pe un anumit alfabet de caractere.
Alfabetul fiecrui limbaj este folosit pentru a construi cuvinte sau simboluri, care
formeaz vocabularul sau lexicul limbajului. Majoritatea limbajelor de programare
ausetuldecaractereformatdin:literelealfabetuluienglez(dealaz26delitere),
cifrelearabe(09),caracterespeciale,acrorsemnificaieestelegatmaimultsau
maipuinderolullorndefiniialimbajului.
SeturiledecaracteremaicunoscuteifolositelaoraactualsuntASCII,ASCIIextins,
EBCDIC, Unicode. O caracteristic important a oricrui alfabet este posibilitatea
ordonriicaractereloracestuia.

Elementelelexicalealeunuilimbaj
Un program este format din atomi lexicali (tokens) i separatori. Un atom lexical
esteceamaimicunitatesintacticceareunnelesdesinestttorntruncontext
precizat.Analizalexicalesteaceafazaprocesuluideanalizaunuiprogramsurs

21
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

care are ca scop identificarea atomilor lexicali din care este compus programul
respectiv.
Exist urmtoarele categorii de tokeni: simboluri speciale, identificatori, etichete,
literali.
Doi tokeni succesivi trebuie separai de unul sau mai muli separatori. De obicei
separatoriinusuntconsideraitokeni,cutoateceipotfacepartedinconstituenii
unuiliteral.
Deexempluinstruciunea:
if(a>b)x=x+1elsey="Hello!";
conineurmtoriiatomilexicali:
identificatori:if,a,b,x,else,y
simbolurispeciale:(,),>,=,+
literali:1,"Hello!"
Att atomii lexicali ct i separatorii se construiesc din caracterele coninute n
alfabetullimbajului.

Exist dou categorii de separatori: separatorii uzuali, comentariile. Ambele


categoriisuntignoratenprocesuldeanalizlexical.
Separatoriiuzualiservesclaseparareaadoitokeniconsecutivi,fiindnumiinunele
limbaje spaiu alb (white space); n aceast categorie intr caracterele spaiu, tab,
linienou.
Comentariilenuausemnificaiepentruprocesuldecalculspecificatnprogram;ele
servescnumailaobunnelegereatextuluisursdectrecelcarelcitete.Exist
dou maniere de comentare a unui program: linie i text. n limbajul C, C++, C#
comentariulliniencepecucombinaiadecaractere//,iarcomentariultextncepe
cucombinaia/*isetermincu*/.

Identificatori,cuvintecheieirezervate
Un identificator este o secven arbitrar de litere i cifre din alfabetul limbajului,
dincareprimulcaracterestelitersausemnuldesubliniere.Numruldecaractere
din secven poart numele de lungime a identificatorului. Unele limbaje stabilesc
limite superioare ale acestei lungimi altele las pe seama implementrii aceste
restricii.
Suntlimbajecarefacdistincientreliterelemariimici(suntcasesensitive):C,C++,
Java iar altele care nu fac aceast distincie: Pascal, Modula2, FOTRAN. n C
cuvintelerezervatesescriunumaiculiteremici(if,else,while,foretc.)
Existdoucategoriideidentificatori:
Predefinii: sunt precizai n definiia limbajului i ei se pot mpri n dou
categorii: cuvinte cheie i cuvinte rezervate. Cuvintele cheie au un neles
explicit ntrun context precizat. De ex. cuvintele DO, IF, CONTINUE au o
semnificaie foarte clar cnd sunt folosite ntrun text surs FOTRAN,
semnificaialorrezultnddincontextulncareapar.Elepotfifolositensi

22
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

canumedevariabil,frniciunfelderestricie.naltelimbajecumesteC
acest lucru nu este posibil. Evident, c o astfel de situaie nu este indicat
pentrucpoateducelaconfuziiingreuneaznelegereaprogramului.Spre
deosebiredecuvintelecheie,esteinterzisfolosireacuvintelor rezervaten
alt scop dect acela pentru careele sunt definite.ntabelul de mai josdm
toatecuvintelecheiedinlimbajulC.Avantajeleutilizriicuvintelorrezervate
sunt: programul devine mai uor de neles prin utilizarea lor, se mrete
viteza de compilare (la cutarea n tabela de simboluri, simplificnduse
analiza lexical, sintactic i semantic), este uurat depistarea erorilor.
Dacnumrulde cuvinterezervatealunuilimbajestemare,atunci el nui
maipstreazproprietilebenefice,devenindunbalast.Existenacuvintelor
rezervate nu d un certificat de calitate unui limbaj. n universul de azi al
limbajelordeprogramare,aceastmprirencuvintecheie/rezervatein
identificatori/cuvinte(cheiesaurezervate)esterelativ.
Definiideutilizator:suntidentificatoricreaideutilizatorpentruafifolosii
ca nume de variabile, constante, proceduri, funcii, clase, obiecte, tipuri de
datedefinitedeutilizator,metode,proprieti,evenimente,delegaietc.

auto break case char const continue default do

double else enum extern float for goto if

int long register return short signed sizeof static

struct switch typedef union unsigned void volatile while


CuvintelecheieC

Simbolurispeciale
Lafelcaicuvintelerezervate,simbolurilespeciale(numiteuneoriioperatorisau
semne de punctuaie, delimitatori) au o semantic bineprecizat. n unele limbaje
elesepotfolosidoarconformdefiniieilor,naltelesemanticasepoateextinde,prin
ceeacesenumetesuprancrcareaoperatorilor.
SimbolurilespecialenCsunt:
Operatorisausemnedepunctuaie:!%^&*()+={}|~[]\;:<>?,./
Operatori(fiecareconsideratunsingurtoken):>++<<>><=>===!=&&
||*=/=%=+==<<=>>=&=^=|=
Tokenifolosiidepreprocesor:#

Literali
Prin literal vom nelege o valoare constant de tip numeric sau caracter. Literalii,
numiidemulteoriiconstantesepotmprin:
Constantenumerice(ntregiireale)

23
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Constantecaracter
Constanteirdecaractere
Trebuie fcut distincie ntre conceptul de constant (n sensul de literal) i
constantsimbolic.Deasemeneatrebuiefcutdistincientretermenuldeliterali
celdeidentificator.Termenulconsacratdeliteralpentruvalorileconstantearputea
proveni de la adlitteram, adic are semnificaia unei valori precizate explicit. O
definiie mai elaborat afirm c literalii exprim valori constante ale tipurilor de
baz(numericeicaracter).
Vom prezenta n continuare categoriile de literali din limbajul C (folosim notaia
BNF).

Literal::=constantntreag|constantcaracter|constantflotant|literalirde
caractere
Constantntreag:esteformatdiniruridecifre.Suntrecunoscutetreiconvenii
de reprezentare: zecimal (dac nu ncepe cu 0), octal (dac ncepe cu 0) i
hexazecimal (dac ncepe cu 0x sau 0X). Tipul constantelor ntregi depinde de
forma,valoareaisufixulacestora(i,I,u,U).
Constant caracter: este format din unul sau mai multe caractere incluse ntre
apostroafe. Pentru un caracter, tipul constantei este char, iar valoarea lui este
valoarea codului ASCII al caracterului; dac sunt mai multe caractere, tipul
constanteiesteint,iarvaloareaacesteiadepindedeimplementare.Existconstante
caracter predefinite, care se precizeaz cu ajutorul unor secvene escape (secvene
deevitareprecedatedecaracterulbackslash\):
CaracterASCII secvenaescape
NLnewline \n
HTtaborizontal \t
VTtabvertical \v
BSbcackspace \b
CRcarriagereturn \r
FFformfeed \f
BELbell \a
\ \\
? \?
\
nr.octal \ooo
nr.hexa \xhhh

Constantele reale: sunt compuse din: parte ntreag, marc zecimal, parte
fracionar, marc exponent (e sau E) i exponent ntreg cu semn. Tipul lor este
implicitdouble,carepoatefimodificatprintrunsufix(Fsauffloat,Lsaullong
double).Parteantreagsauparteafracionarpotlipsi(darnuambele),lafelpot
lipsiimarcazecimalsaumarcaexponenial(nuambele).

24
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Constanteleirdecaractere:suntformatedintrunulsaumaimultecaractereincluse
ntre ghilimele. Tipul lor este char[] i au clasa de memorie static. Reprezentarea
unuiirdecaracteresefacepen+1octei,ultimuloctetconinndcaracterulNULL
(cu codul ASCII 0). Constantele ir de caractere se mai numesc nullterminated
strings.

Sintaxaunuilimbajdeprogramare
La fel ca n orice limb, i n limbajele de programare, succesiunile de cuvinte
formeaz propoziii sau instruciuni. Prin sintaxa unui limbaj de programare se
nelegeunansambludereguliprincaresedetermindacoanumitinstruciune
estecorectalctuitsaunu.
Conceptuldesintaxaparesubdouforme:
Sintax abstract: identific rolul componentelor fiecrei construcii;
descrierile de limbaj i implementrile sunt organizate n jurul sintaxei
abstracte.
Sintaxa concret (lexical): prezint modul de scriere a construciilor
limbajului,coninnddetaliirelativlaplasareacuvintelorcheieiasemnelor
depunctuaie.
Spreexemplu,aceeaisintaxabstractstlabazasecveneideprogram:

WHILEx<>A[i]DO
i:=i1
END

ScrisnModula2,precumiaurmtoareisecveneC:

while(x!=A[i])i=i1;

Existdiversemoduriprincaresepoatedescriesintaxaunuilimbajdeprogramare:
BNF,grafeledesintax,gramaticiiautomateetc.

BNF (BackusNaur Form = notaia BackusNaur) a aprut n 1963 n cadrul


raportuluiALGOL60.
nraportulALGOL60instruciuneaforeradefinitnfelulurmtor:

<instr.for>::=<clauzfor>|<etichet>|<instr.for>
<clauzfor>::=for<variabil>:=<listfor>do
<listfor>::=<elementdelistfor>|<listfor>,<elementdelistfor>
<elementdelistfor>::=<expr.aritmetic>|
<expr.aritmetic>step<expr.aritmetic>
until<expr.aritmetic>|

25
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

<expr.aritmetic>while<expr.bool>

Simbolurile <, >, |, :: fac parte din mecanismul de descriere a limbajului, ele fiind
numitemetasimboluri.Simbolul::=nseamnsedefineteastfel.Cuvintelefor,do,
step,until,while,precumi caracterele{, :=,:,},careapar nproducii,senumesc
simboluriterminale,pecnd<instr.for>,<clauzfor>suntsimbolurineterminale.n
orice producie, la stnga metasimbolului ::= apare un neterminal, iar definiia
acestuiaesteolistdeneterminale,terminaleimetasimboluri.
Conformprimeiproducii,instruciuneafor aredoudefiniii alternative,separate
prin |. Aceast producie utilizeaz ideea definirii recursive n a doua alternativ,
deoarece <instr. for> este definit prin ea nsi. nelesul definiiei este c o
instruciune for poate s nu aib etichet sau poate s aib un umr variabil de
etichete,fiecareterminatprin:(doupuncte).
Neterminalul <clauza for> este definit astfel: ncepe cu simbolul terminal for, care
este cuvnt rezervat n ALGOL 60, urmat de o <variabil>, :=, o <list for> i
cuvntul rezervat do. Definiia neterminalului <lista for> utilizeaz de asemenea
recursivitatea(recursivitatelastnga),cuefectulco<listafor>poateconinede
mai multe ori neterminalul <element de lista for>, folosind virgula ca separator.
Ultimaproducieexpliciteaztreimoduridealctuireaelementelorlisteifor.
Dea lungul timpului notaia BNF a suferit unele adugiri ajungnduse la ora
actuallautilizareauneiaanumitenotaiiBNFextinse.
Noileregulialeacesteinotaiisunt:
Toate unitile sintactice ale limbajului sunt cuprinse ntre ghilimele; de
exemplu,"<"desemneazsemnulmaimicinumetasimbolul<
Entitileopionalesuntcuprinsentreparantezeledrepte[i].
Orice expresie repetabil (cu semnificaia c poate apare de zero sau mai
multeori)estecuprinsntreaccolade
Parantezele rotunde se folosesc n situaiile n care se dorete exprimarea
unor grupri de aciuni: de exemplu (a | b) c desemneaz irul de
caractere"ab"sau"bc".

Gramatici
NoamChomskyadezvoltatteoriagramaticilor(1959).Cuajutorulacestorapoatefi
formalizatdefiniiaunuilimbaj,formalizareceseimpunepentruunstudiuintegrat
i complet al proiectrii i implementrii limbajelor. Limbajele independente de
context (generate de gramatici independente de context GIC) pot modela formal
limbajele de programare. BNF i gramaticile independente de context sunt
echivalentedinpunctuldevederealdescrieriiunuilimbajdeprogramare.

Grafeledesintax
Oaltmetoddedescrierea sintaxeiunuilimbaj deprogramareutilizeazgrafele
de sintax, echivalente cu BNF (deci i cu GIC), dar mai sugestive. Regulile de

26
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

definireagrafelordesintaxaufostintrodusedeNiklausWirth(1976).Camodde
reprezentare,grafeledesintaxutilizeaz:
Cerculpentrureprezentareaunuisimbolterminal
Dreptunghiulpentrureprezentareaunuisimbolneterminal
Sgeatapentruareprezentadireciatransformrii
OproduciedeformaA::=a1a2ansetranscriedupcumurmeaz:

a1 a2 an


OproduciecumaimultealternativeA::=a1|a2||ansetranscrieastfel:

a1

a2

an

Oregulrecursiv{A::=a1}setranscrie:

a1

Un automat de acceptare (sau de recunoatere) este folosit pentru a rspunde la
ntrebarea:aparineunirxlimbajuluiLsaunu?
Automatul este definit ca o main cu operaii extrem de simple, care primete
iruldeanalizatpeunsuportoarecare(numitbanddeintrare),lparcurgefolosind
un cap de citire i rspunsul final este dat de starea n care rmne unitatea de
comand aautomatului. Maina poatefolosio memorie auxiliar pentru pstrarea
unor informaii care so ajute n luarea de decizii la un moment dat. Funcionarea
unitii centrale (evoluia) este o secven de micri, o micare constnd dintro
modificare a configuraiei mainii. Prin configuraie se nelege ansamblul strilor
componenteloracesteia.

27
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Modelulfizicdescrismaisusesteintuitiv,elstnd labazamodeluluimatematical
automatului,modelnecesarpentruformalizareafuncionriimainiiidecipentru
fundamentareaalgoritmilordeanalizimplementaicuajutorulacesteia.
Automateleseclasificndeterministeinedeterministe.Existoseriedetipuride
automate: automat finit determinist, automat finit nedeterminsit, automat push
down determinist, automat pushdown nedeterminist etc. Exist o relaie ntre
limbajeleacceptatedeautomateigramaticiledinierarhialuiChomsky.
Automatele de acceptare se folosesc n analizoarele lexicale i semantice ale
programelordetraducere.

Traducerea programelor
Programe traductor
Prin translator vom nelege un program ce traduce un program surs (PS), scris
ntrunanumitlimbajdeprogramare(LP)ntrunprogramechivalentexprimatntr
un alt limbaj, pe care l vom numi program destinaie (PD). Familia programelor
translatoare are ca reprezentani compilatoarele, asambloarele i interpretoarele.
Pentruuncompilator, PDsenumete program obiectsaucodobiect,fiindapropiat
de codul main, iar asamblorul este compilatorul unui limbaj de asamblare. n
ambele situaii, traducerea este urmat de obicei de editarea de legturi (link
editarea),naintecaprogramulspoatfiexecutat.Linkeditareaestefazancare
seproducecodulexecutabilprinlegareacoduluiobiect(rezultatdintraducere)cu
altemoduleobiect(rezultatedincompilrianterioaresauexistentenbiblioteci).O
alt modalitate de execuie a PS scrise n limbaje de nivel nalt este folosirea unui
interpretor, care este tot un translator ce realizeaz execuia instruciune cu
instruciuneaprogramuluisurs.
npracticsentlnescialtetipurideprogramtranslatoare:
Preprocesoarelesaumacroprocesoarele:traducPSdinlimbajedenivelnaltnPD
scrisetotnlimbajedenivelnalt,compilabile.Deex.preprocesorulC.
Crosscompilatoarelesaucrossasambloarele:seexecutpeuncalculatorgazdi
genereaz cod obiect pentru o alt main obiect (de exemplu, maina gazd
minicalculator sau calculator mare, iar maina obiect este un microcalculator cu
memoriemic,pecarenusepoateimplementaprogramuldetraducere).
Generatoareledeprograme:pleacdelaunPSscrisntrunlimbajdespecificarei
genereazprogramesursscrisendiverselimbajedeprogramaredenivelnalt.

Schema general a unui compilator


Compilatorul este un program complex, a crui realizare presupune abordarea
sistematicaprocesuluidetraducere.nprocesuldecompilare,PSsuferunirde

28
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

transformrincascad,dincencemaiapropiatedecodulobiect.Conceptual,un
compilatorrealizeazdoumariclasedeoperaii:
Analizatextuluisurs
Sintezacoduluiobiect
Acestedouoperaiisedescompunnsuboperaiispecializate,nlnuitentreelei
caracterizate prin funcii bine precizate. n figura de mai jos prezentm schematic
structuraunuicompilator.

ANALIZ SINTEZ

Program
ir de atomi Arbore Cod Cod intermediar
surs
lexicali sintactic intermediar optimizat
Analiz Analiz Analiz Optimizare Generare Cod obiect
lexical sintactic semantic de cod de cod

Tratarea erorilor Gestiunea tabelelor


Figur:Structuraunuicompilator

Analiza lexical realizeaz prima parcurgere a PS (considerat ca ir de caractere),


grupnd aceste caractere n subiruri, numite atomi lexicali: cuvinte cheie sau
rezervate,operatori,constante,identificatori,separatori.
Analiza sintactic depisteaz n irul atomilor lexicali structuri sintactice: expresii,
liste, instruciuni, proceduri, genernd arborele sintactic (arborele de derivare),
caredescrierelaiiledintreacestestructuri(deincluziune,deseparare).
Analiza semantic folosete arborele sintactic pentru extragerea de informaii
privind apariiile obiectelor purttoare de date din PS (tipuri de date, variabile,
proceduri, funcii) i pentru verificarea consistenei utilizrii lor. Pe msura
parcurgeriiarboreluisintactic,segenereazcodulintermediar.Acestaesteunide
instruciunisimple,cuformatfix,ncare:codurileoperaiilorsuntasemntoarecu
codurilemaincorespunztoare,ordineaoperaiilorrespectordineaexecuiei,iar
operanziisuntreprezentaisubformavariabilelordinPSinusubformderegistre
sauadresedememorie.
Optimizarea codului intermediar are ca obiectiv eliminarea redundanelor, a
calculelorinutile,nscopulrealizriiuneiexecuiieficienteacoduluiobiect.Pentru
realizareaacestuiobiectivsencearc:
Realizareatuturorcalculelorposibilencdinfazadecompilare(deexemplu
nexpresiicuoperanziconstante)

29
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Eliminareasubexpresiilorcomune(prinevaluarealorosingurdat)
Factorizareainvariaiilordincicluri.
Generareaprogramului(codului)obiectconstnalocareadelocaiidememoriei
registre ale unitii centrale pentru variabilele programului i nlocuirea codurilor
deoperaiidincodulintermediarcucelemain.Codulobiectrezultatpoatefi:
absolut(directexecutabil)
relocabil (care va face obiectul editrii de legturi, unde va fi legat de alte
moduleobiect,rezultatedincompilrianterioaresaudinbiblioteci);
n limbaj de asamblare, lucru ce asigur un efort mic de implementare a
generatoruluidecod.
naltlimbajdeprogramare,ncazulpreprocesoarelor.
Generareadecoddifernfunciedearhitecturamainii.
Cele cinci module de baz ale procesului de compilare sunt asistate de alte dou
componente ale compilatorului, ale cror servicii sunt utilizate pe tot parcursul
compilrii:modululdetratareaerorilorigestionarultabeleidesimboluri.

Modululdetratareaeroriloresteconstituitdintrocoleciedeproceduricaresunt
activateoride cteori estedetectatoeroarentimpuloperaiilorde analiz.Ele
emitmesajedediagnosticrelativelaeroarearespectiviiaudeciziiprivindmodul
decontinuareatraducerii:
traducereasecontinucuignorareaelementuluiceconineeroarea;
sencearccorectareaerorii
seabandoneazprocesuldetraducere.
Dup momentul de analiz n care apar, erorile pot fi lexicale, sintactice sau
semantice. Un alt criteriu de clasificare a erorilor este gravitatea lor; distingem
avertismente (de obicei omisiuni de programare), erori care se pot corecta de
ctre un compilator mai inteligent i erori fatale, care provoac abandonarea
procesuluidecompilare.
Gestionarul tabelelor este o colecie de proceduri care realizeaz crearea i
actualizarea bazei de date a compilatorului, care conine dou categorii de
informaii:
proprii compilatorului (generate la implementare i constituite din
mecanismelededescriereaanalizeilexicale,sintacticeisemantice)
caracteristice programului surs (identificatori, constante, cuvinte cheie),
caredeobiceisememoreazntrotabeldesimboluri.
n faza de analiz lexical (de obicei) la ntlnirea unui nume nou, acesta este
introdusntabeladesimboluri,reinnduseadresaintrrii.Oridecteorinumele
estereferit,informaiaprezentntabelesteactualizatcuinformaiisauatribute
noi ale numelui respectiv, verificnduse totodat consistena utilizrii acestuia
(analiza semantic). La generare de cod, atributele numelui determin lungimea
zoneidememoriealocatacestuia.Atributelenumeluipotserviinfazadetratare
aerorilor.

30
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Analiza
Fazadeanalizcuprindetreietape:analizalexical,sintacticisemantic.Aceste
treietapesepotimplementaseparatsauglobal.
Analizalexical(scanningnengl.,analizorlexical=scanner)transformprogramul
surs (considerat ir de caractere) ntrun ir de uniti lexicale, numite atomi
lexicalisauparticulelexicale(tokensnengl.).Claseledeatomilexicali,considerate
ca mulimi finite, corespund identificatorilor, constantelor ntregi, constantelor
reale i operatorilor. Pe scurt, analizorul lexical realizeaz operaii de detectare,
clasificareitraducere:
detectarea n PS a subirurilor care respect regulile de formare aatomilor
lexicali;
clasificareaacestorsubiruri(identificareaclaseiacestora);
traducereasubirurilornatomilexicali;
memorareantabeladesimboluriaidentificatoriloriconstantelor.
Deobicei,analizalexicalesteconsideratcaoetapaanalizeisintactice.Analizorul
lexicalcontribuielacurareaPSdeoarecenumrulatomilorlexicaliestemaimic
dectnumruldecaracteredinPS,seeliminspaiilealbesicomentariile,sepoate
prelua n analiza lexical evaluarea unor construcii dificil de implementat n
analizorulsintactic,rezultatulfiindreducereacomplexitiianalizeisintactice.

Analizasintactic(parsingnengl.)esteunadinetapeleprincipalealeprocesuluide
traducere.Prineaserealizeaztransformareairuluideintrare(formatdinatomi
lexicali)n:
descriereastructuralaacestuia,semanticechivalent(ncazulncareirul
deintrareestecorectsintactic)
mesajdeeroare(ncazcontrar).

Analiza semantic structura sintactic poate fi folosit pentru specificarea


semanticii unui limbaj. n general, semantica (nelesul) unei construcii poate fi
exprimatprinoricecantitatesaumulimedecantitiasociateaceleiconstrucii.O
astfel de cantitate asociat se numete atribut. Ca exemple de atribute putem
meniona:omulimedeiruridecaractere,ovaloare,untip,oconfiguraiespecific
dememorieetc.Aceastmodalitatedeabordareasemanticiisenumeteorientat
de sintax. Regulile care definesc atributele unei construcii se numesc reguli
semantice. O specificare de sintax mpreun cu regulile semantice asociate
realizeazodefiniieorientatdesintax.
De exemplu, dac dezvoltm un evaluator de expresii, semantica expresiei 2+3
poatefiexprimatprinvaloarea5.Dacdezvoltmuntranslatordinformainfixat
n form postfixat semantica expresiei 2+3 ar putea fi exprimat sub forma
tripletului(+23).

31
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Conceputcaofinalizareaetapeideanalizatextuluisurs(pringenerareacodului
intermediar), analiza semantic completeaz structurile sintactice cu valorile
atributelor asociate fiecrei componente de structur. Cunoscnduse valorile
atributelor,serealizeaz:
validareasemanticaprogramuluisurs;
generareacoduluiintermediarechivalent;
naceastultimfazaanalizeisegenereazcodulintermediar.npractic,analiza
semanticsedesfoarnparalelcuanalizasintactic,princompletareaaciunilor
analizorului sintactic cu aciuni referitoarea la anumite structuri de date ce
reprezintatributealecomponentelorsintactice.

Uniti de program
Structurageneralaunuiprogramscrisntrunlimbajdeprogramareconvenional
(imperativ, dirijat de control) presupune existena unui program principal i
eventual a unuia sau mai multor subprograme (proceduri, funcii sau subrutine)
carecomunicntreelei/saucuprogramulprincipalprinintermediulparametrilor
i/sauaunorvariabileglobale.
Orice program sau subprogram surs, indiferent de limbajul n care este scris i
indiferent de sintaxa concret a acestuia este divizat n dou pri (nu neaprat
distincte din punct de vedere fizic): partea de declaraii i partea imperativ.
Declaraiile, denumite uneori i instruciuni neexecutabile sunt informaii
descriptiveadresatecompilatoruluicaredescriunprincipalatributealezonelorde
datecumarfitipul,dimensiuneadereprezentare,eventualvaloriiniialeetc.Partea
imperativ conine instruciunile ce se vor executa n cursul rulrii
(sub)programului.
Ideea reutilizrii codului precum i cea a reducerii dificultilor de proiectare i
ntreinere a programelor mari au condus n mod natural la modularizarea
dezvoltriiprogramelor.Corespunztor,carezultatalprocesuluideabstractizarei
factorizare,aparastfellanivelulprogramelor,unitideprogramdistincte,numite
module,curolbineprecizaticareaducodatcuapariialornumeroaseavantaje.
Unuldincelemaiimportanteavantajeestecompilareaseparat.
n majoritatea cazurilor activitile efectuate de subprograme sunt independente.
Astfel, unul sau mai multe subprograme pot fi grupate n module, care, fiind la
rndullorindependentepotficompilateseparatunuldecellalt,adiclamomente
diferite n timp i combinate mai trziu de ctre editorul de legturi ntrun unic
programexecutabil.Caurmare,dacunmodulnecesitmodificriicelelaltenu,va
firecompilatdoarmodululmodificat,editoruldelegturirealizndapoicombinarea
codului obiect rezultat cu versiunile deja compilate ale celorlalte module. Se
economisete n acest fel un timp semnificativ de lucru, ideea compilrii separate
fiindextremdeutillantreinereabibliotecilormarideprograme.

32
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

LimbajulCpermitecompilareaseparat,lucruposibildatoritexisteneiatributului
clasdememorieexternpentruvariabileleC,ceeacepermiteexistenamodulelorn
limbajulC.Acestemodulepotcomunicaprinvariabileleexterne.
Prinmodulvomnelegeounitatesintacticcenglobeazproceduri,tipuridedate,
constanteivariabile.Dinpunctuldevederealutilizriisalemodulularedoumari
pri: interfaa iimplementarea. Fiind proiectat de lanceput n ideeareutilizrii,
modululspecific,prininterfaasa,aceleentitiprincareelcomuniccuexteriorul
su (cu alte module sau programe). n partea de implementare a modulului se
definesc procedurile declarate n interfa i sunt precizate alte entiti locale
necesareimplementrii.
Informaia din interfa este necesar procesului de compilare: spre exemplu,
compilare unui modul A care are nevoie de servicii din modulul B va necesita
cunoaterea i includerea n codul obiect rezultat a informaiei din interfaa
modulului B (declaraii de tipuri, proceduri, variabile i constante), care va trebui
decisfiecompilatnainte.ExempledemodulearfiunituriledinTurboPascalsau
fiiereleheaderifiiereledeimplementaredinC.

Link-editarea
Linkeditorul sau editorul de legturi este o component a mediului pentru
dezvoltareadeaplicaiicaregrupeazunulsaumaimultemoduleobiect,rezultate
din compilare sau asamblare, mpreun cu subprograme de servicii din diverse
biblioteci,ntrunprogramexecutabil.
ngeneral,unprogramexecutabilestecompusdinmaimultesegmente.Editorulde
legturioferposibilitateacadousaumaimultesegmentediferitealeunuiacelai
program s poat ocupa n execuie, la momente diferite de timp, aceeai zon de
memorie(procesnumitesegmentareoverlay),proprietatefoarteutilncontextul
rulrii de programe foarte mari care depesc capacitatea memoriei RAM
disponibile.
Pedealtparte,linkeditareantroaceeaicomandamaimultorfiiereobiectva
avea ca rezultat un singur fiier executabil ce va fi alocat ntro zon contigu de
memorie.Laacestnivel(aleditriilegturilor)arelocoprimajustare(relocare)a
adreselordinmoduleleobiect,ajustarecaresreflecteraportareatuturoracestora
lanceputulfiieruluiexecutabil.
Deoarece un program executabil poate fi ncrcat n majoritatea cazurilor la orice
adresdesegment,pentruoexecuiecorectestenecesarcalancrcaressefac
o relocare a majoritii referinelor din program. Relocarea este efectuat la
lansareanexecuieaprogramuluidectreocomponentasistemuluideoperare
numitncrctordeprograme(loader)icarearenprincipiuurmtoarelesarcini:
citireaunuiprogramexecutabildepeunanumitsuport;
ncrcareaprogramuluirespectivnmemorie;
lansarealuinexecuie.

33
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Execuia programelor
Dup linkeditare, programul executabil obinut se poate lansa n execuie. Exist
diferene n ceea ce privete execuia unui astfel de program, n funcie de
caracteristicile de utilizare ale sistemului de operare al calculatorului gazd i de
mediul de programare folosit pentru scrierea de programe. Pornind de la un text
(program) surs, programatorul are la dispoziie trei opiuni pentru a ajunge la
execuiaacestuia:
operare la nivelul liniei de comand: se introduc pe rnd comenzile de
compilare,linkeditareilansarenexecuie;
asistat de un mediu de programare: comenzile de mai sus sunt lansate i
executatedininteriorulunuiastfeldemediu;
sistembatch(prelucrarenloturi):scriereaunorfiieredecomenzicarevor
automatizanlnuireafazelordelapunctul1.
ntrun sistem de operare interactiv, utilizatorul comunic cu sistemul de operare
de la terminalul su propriu printrun limbaj de comenzi sau printro interfa
vizual.ncazulinterfeelorutilizatorvizuale,peecranulterminaluluisuntdesenate
elemente vizuale sugestive (iconuri). Exemple sugestive sunt Microsoft Windows
sauXWindows.Fiecareiconareasociatocomand,careesteactivatnmomentul
cnd utilizatorul acioneaz asupra iconului cu mouseul. Orice comand tastat
sau asociat unui icon este preluat de interpretorul de comenzi al sistemului de
operare,careotraduceioexecut(dacesteocomandcorect).
Unsistemdeoperareinteractivaredoumariclasedecomenzi:interne(engl.built
in) i externe. Comenzile interne sunt rezidente n nucleul sistemului de operare
respectiv, iar comenzile externe, dup cum le arat i numele, au corespondent n
fiiere executabile. ntre comenzile externe, un loc aparte revine comenzilor
utilizator,croralecorespundfiiereleexecutabilepropriialeutilizatorului,fiiere
realizateprinprocesuldecompilarelinkeditare.Fiiereleexecutabilerealizatede
utilizator sunt noi comenzi care extind limbajul de comenzi al sistemului su de
calcul.Sistemuldeoperarealunuicalculatormodernestenacestsensunexemplu
adecvatdeextensibilitateasoftului.
Sistemele de operare moderne permit rularea concomitent (n paralel) a mai
multor programe proprietate numit multitasking. Aceste programe pot fi
independente sau nu i ocup zone de memorie distincte. Sistemele multitasking
sunt implementate n principal pe sisteme monoprocesor, ceea ce pune problema
alocrii timpului CPU aplicaiilor ce se ruleaz. Din acest punct de vedere
multitaskingul poate fi preemptiv sau cooperativ. n cazul multitaskingului
preemptiv sistemul de operare ia decizia ntreruperii aplicaiei curente (pe baza
unor algoritmi de planificare) indiferent de stadiul i dorina acesteia. Exemplu
clasicnacestsensnconstituiesistemuldeoperareUnix.Multitaskingulcooperativ

34
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

adopt varianta ca aplicaia curent s semnaleze faptul c poate fi ntrerupt.
SistemulWindowsaparineacesteiultimecategorii.

Medii de programare i execuie


Mediile de programare sunt componente complexe destinate activitii de
dezvoltare de programe. Relativ la un limbaj, un astfel de produs soft nglobeaz
urmtoarele subcomponente: editor de texte, compilator interactiv, compilator
serial,editordelegturi,interpretorpentruexecuiarezultatuluicompilrii(numit
i mediu de execuie runtime environment), depanator simbolic, componente de
legturcumediulexterior(deregulcusistemuldeoperarecucarelucreaz).
Medii de programare mai cunoscute i mai rspndite sunt: Visual Studio de la
Microsoft,BuilderdelaBorland,Eclipseialtele.
Conceptul de program executabil a evoluat dea lungul timpului de la aplicaii
monolitsaajunslaaplicaiiintegrate,caresuntconstituitedinmoduleexecutabile
ce se ncarc dinamic n execuie, n funcie de nevoile curente. De exemplu, o
aplicaieWindowspoaterecurgelancrcareadinamic(laexecuie)aunorfuncii
din biblioteci cu legare dinamic (DLL Dynamic Link Librarie), lucru complet
transparentpentruutilizator.

Interpretarea
Esteoactivitateprincareseexecutpeuncalculator(realsauomainvirtual)un
programscrisntrunlimbajsurs.Interpretorulesteunprogramcareexecutpas
cu pas instruciunile descrise n limbajul respectiv. Viteza de interpretare a unui
programestemultmaimicdectexecuiacoduluigeneratdectreuncompilator
pentru acelai program. Cu toate c aceast vitez este cam de 10 ori mai mic,
interpretareaestefolositpescarlargdatoritimplementriimultmaisimplea
unuiinterpretordectaunuicompilator.Unaltavantajestefaptulcinterpretarea
asiguromultmaimareflexibilitateaexecuiei,nsensulposibilitiideefectuarea
mai multor verificri dinamice (la execuie), de urmrire a evoluiei valorilor
variabilelorncursuletapelordeexecuie,posibilitidecolaborarecuutilizatorul
ntimpulexecuieietc.

35
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

4. Declaraii
Rolul identificatorilor ntr-un program
Identificatoriiservesccanumepentrudiverseentitialeunuiprogram:
constantesimbolice
tipuridedate
variabile
subprograme
module
programe
cmpurinnregistrri
Daclimbajuldeprogramareoferunsistemdenotaiigeneralepentruexprimarea
unuiprocesdecalcul,iarunprogramsursesteconcretizareaunuiastfeldeproces
decalcul,identificatoriifolosiideprogramatornrespectivulprogramvorreflecta
particularitile algoritmului descris (constantele necesare, tipurile de date
utilizator introduse, variabilele care pstreaz date de intrare, rezultate
intermediareifinaleisubprogramelecarecorespundsubalgoritmiloretc.)
ntrun sens mai larg, identificatorii declarai i folosii de programator constituie
unsistemdenotaii:odatdeclarat,identificatorulvareferiunicoanumeentitate
din program i simpla prezen a numelui su (nsoit eventual de alte elemente
suplimentare) va reprezenta pentru programul traductoro referire neambigu la
entitateancauz.
npridiferitealeaceluiaiprogramsurssaunmodulediferitecareconcurprin
compunerelaalctuireaunuiprogramexecutabilsepotfolosiidentificatoriidentici.
Rezolvareaeventualelorconflictedenumecarepotaparesefacepebazaregulilor
devizibilitateanumelor.
Noiunea de domeniu de vizibilitate (engl. scope) a aprut odat cu limbajele cu
structurdebloc.Fiecaredeclarareaunuinumestabiletedomeniuldevizibilitate
al numelui. Domeniul de vizibilitate ncepe de obicei imediat dup punctul de
declararealnumeluirespectivisencheielasfritulblocului,procedurii,fiierului
surs etc., dup caz. Un nume local, declarat n interiorul unui subprogram are
domeniuldevizibilitatetoatsecvenadedeclaraiiiinstruciunideduppunctul
de declarare i pn la sfritul subprogramului respectiv (inclusiv blocurile sau
subprogramelenglobatenelincarenusaredeclaratnumelerespectiv);pentru
numele globale declarate n corpul programului principal, domeniul de vizibilitate
inededuppunctulde declarare pnlasfritulfiierului surs(curespectarea
observaieianterioarenlegturcuredeclararea).
Definiia de mai sus se refer la domeniul de vizibilitate lexical. Din observaiile
fcute,rezultcacestdomeniunuesteneapratcontinuu,cnelpotaparepete
albepentruunnume.

36
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Universulunuilimbajdeprogramare(ULP)esteconstituitdinobiectelespecificepe
carelimbajullepuneladispoziiaprogramatoruluipentrumodelareaproblemelor
sale.Prinacesteobiecte,utilizatorulsimuleazcomportamentulobiectelorsalesau
realizeaz noi obiecte, mai complexe, cu proprieti noi. Odat cu aceste obiecte,
care sunt specificate prin declaraii, limbajul pune la dispoziia programatorului
operaiiasupraacestora,pecarelenumimdeobiceiinstruciuni.

Semantica unei declaraii


Obiectele ULP sunt datele, fie elementare, fie structurate. Aceste date au anumite
caracteristici (nume, tip, valoare, modificabilitate) care sunt precizate prin
declaraii.
UneiconstantesimboliceiseasociazprintrodeclaraieunobiectdinULP,acelai
petotparcursulexecuieiprogramului.Ovariabilareasociatolocaiedememorie
care poate, la un moment dat, s conin un obiect dintro mulime de obiecte
(valori posibile) din ULP. Aceast mulime formeaz domeniul de definiie al
variabilei, fiind de fapt domeniul tipului variabilei, iar locaia de memorie este
neleasnsensuldepoziiadelacarencepealocareavariabileirespective.
Precizareatipuluipentruconstanteivariabilesefaceprindeclaraii.Informaiade
tipasociatunuiobiectserveteladeterminareagameideoperaiicaresepotface
cuacelobiect.
Limbajeledeprogramaremodernepermitdeclarareadenoitipuri,pebazatipurilor
dejacunoscute.Astfeldetipurisenumesctipuriderivateiseprecizeazcuajutorul
declaraiilorde tipuri.ncazulideal, untip dedatedefinitdeutilizatorare acelai
statutcaiuntipdedatepredefinit:declarareaifolosireavariabilelor,precumi
verificareaconsisteneiexpresiilorrespectivelortipurisefacenaceeaimanier.

Declaraii de constante
Spredeosebiredevariabile,constantelesimbolice(numitencontinuareconstante)
i pstreaz valoarea pe tot parcursul execuiei unui program. Utilizarea lor
permite o mai uoar scriere a programelor i le asigur acestora o mai mare
expresivitate.Deexemplu,esteconvenabilssescrie:

PI:=3.1415

ntrun program care face calcule trigonometrice i peste tot n program unde ar
trebuissescrieconstantareal3.1415sevapunePI.Rostulacestorconstanteeste
nunumaiuurinanexprimareinnelegereatextuluisurs,ciiasigurareaunei
maimariflexibilitiaprogramului.Deexemplu,dacnuestesuficientfolosirealui
PIcupatruzecimaleisedoretePIcu12zecimaleexacte,doarliniadeiniializare
aconstanteisevaschimba:

PI:=3.141592653595

37
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

iarreferirilelaPIdinprogramvornsemnafolosireanoiivaloripentruacestnumr
transcendent.
nmodnormal,nlocuireaconstanteisimbolicecuvaloareasaareloclacompilare.
Dinpunctuldevederealunuilimbajdeprogramare,oconstantsimbolicesteun
cuplu format din nume i valoarea asociat. Nu toate limbajele de programare
suport constante (FORTRAN, PL/1, Basic, C nu posed acest obiect n universul
lor).Pentrulimbajelecesuportacestconcept(Pascal,C++,C#),sepotdistingecel
puinurmtoareleclasededeciziecetrebuiediscutateiadoptatelaproiectare.
cumsefacedeclaraiadeconstant?
limbajul admite numai constante de tipuri simple sau este permis i
folosireaconstantelordetipuristructurate?
valoareaconstanteisedprintrunliteralsauprintroexpresieevaluabil(i
cnd:lacompilaresaulaexecuie)?
cnd se face substituirea numelui constantei cu valoarea asociat (la
compilaresaulaexecuie)?
admitelimbajulconstantepredefinite?
Limbajul C nu posed conceptul de constant simbolic. Folosirea constantelor se
simuleaz prin macrodefiniii, care sunt tratate de preprocesorul C. Din punctul
nostru de vedere, dezavantajul major al folosirii macrodefiniiilor este acela c
pentruelenu suntvalabilereguliledevizibilitatealenumelordinC.Chiardacse
pot simula constante prin macrodefiniii, numele acestora vor fi globale. De
exemplu,primadintremacrodefiniiile:

#defineTBLSIZE100
#defineTBLMAX(TBLSIZE1)

vaasociaidentificatoruluiTBLSIZEvaloarea100,iaradouamacrodefiniievaasocia
identificatoruluiTBLMAXvaloarea99.Dacacesteasuntsingurelemacrodefiniii,n
ntreg textul surs parcurs de preprocesor, apariiile acestor identificatori vor fi
nlocuite (textual) cu valorile asociate lor. Dac ns ntro funcie ulterioar ar
apreamacrodefinia

#defineTBLSIZE50

identificatorulTBLSIZEvaprimivaloarea50,cucaresevanlocuioriceapariiealui
dinacelloc,nunumaidincorpulfunciei,ciidupterminareaacesteia.Analog,la
determinareavaloriiluiTBLMAXsevafolosivaloareaactualaluiTBLSIZE.
Un alt dezavantaj al simulrii constantelor prin macrodefiniii este acela c nu se
poate declara tipul constantei i, dac parantezele nu sunt puse corect, pot apare
probleme legate de interpretarea macrodefiniiei. Mai mult expresiile de definire
trebuieevaluatelafiecarentlnireanumeluimacroului,numecaresepierden

38
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

fazademacroexpandaredelacompilareinumaipoatefiregsitdedepanatoarele
simbolicesaudealteinstrumentefolositeladezvoltareadeprograme.
C++introduceconstantele(deoricetip),prindeclaraiideforma:

constintTBLSIZE=100;
constintTBLMAX=(TBLSIZE1);

Declaraia de constant este deci prefixat de cuvntul rezervat const. Ea conine


precizarea tipului, numelui i a valorii asociate constantei, printrun iniializator.
Tablourile,pointeriiireferinele const auointerpretare special.Dac un tablou
este declarat const nseamn c fiecare element al acestuia este const, iar un
pointerconstnseamncvariabilareferitdeelesteconst.
ntermeniilimbajuluiC++,constnunseamnnicialocatntrozondememorie
readonly i nici constant stabilit la compilare. Mecanismul const a fost
conceput pentru a preveni eventualele accidente (ca de exemplu modificarea
nedoritaunorvaloricareseconsiderconstante)inufraudele.
Proteciaoferitdeacestmecanismpoatefieludatprintroconversieexplicitsau
prinaliere.Deexemplu:

inti=1;//inuesteconst
constint*p=&i;//inusevaputeamodificaprinp
int*q=(int*)p;/*aliereacantitii*qcuiprinconversieexplicitdetipechivalentcuint*q=&p;
iniializareaint*q=parfiilegaldincauzaincompatibilitiicaracteristicilordetip;*/

voidf()
{
p;
i++; //ok:nuiesteconstcip
(*p); //eroare:*pesteconst
(*q)++;/*ok:qnuesteconst,decicantitateareferitadeaceastanuestesupusarestrictiilor
demoficare*/
}

voidg()
{
(*(int*)p)++//ok:conversieexplicita
}

Dac un specificator const sau volatile apare ntro declaraie, el va modifica


declaratorulcareurmeazimediatdupel.

constchar*step[3]={left,right,hop};

declaruntabloudepointerilairuridecaracterecaresuntconstante.Pointeriise
potmodifica;iruriledecaracterenusepotprinintermediulacestorpointeri.

39
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

step[2]=skip;//ok:semodificapointerlaconstchar
step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/

Dac se dorete declararea unui tablou de pointeri constani la iruri de caractere


constante,definiiarespectivsescrie:

constchar*conststep[3]={left,right,hop};

cazncarenusepotmodificaniciiruriledecaractereinicipointerii(elementele
tabloului):

step[2]=skip;/*eroare:nusepoatemodificaunpointerconstant*/
step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/

Definiia limbajului nu specific constante predefinite. Pentru asigurarea


compatibilitii tipurilor numerice cu ANSI C, limitele (minim i maxim) ale
domeniilor acestor tipuri se gsesc (sub forma unor macrodefiniii) n fiierele
header<limits.h>i<float.h>.

Declaraii de tipuri de date


Tipul de date este un mecanism de clasificare a expresiilor care furnizeaz dou
informaii:
mulimeavalorilorposibilealeexpresieincauz(domeniultipului);
operaiilecesepotaplicarespectiveiexpresii;
Unul din principiile de baz ale proiectrii unui limbaj de programare este: orice
expresie trebuie s aib un tip unic determinat. Tipul asociat unei expresii ofer
programuluitraductorinformaianecesarpentruverificareautilizriirespectivei
expresiiipentrureprezentareaacesteianmemorie.

Sisteme de tipuri
Unsistemdetipuri pentruunlimbaj deprogramareesteomulime dereguli prin
care unei expresii i se asociaz un tip al limbajului respectiv. Un sistem de tipuri
respingeoexpresiedacnuipoateasociauntip. Respingerea expresieiarelocde
obicei la compilare (se emite un mesaj de eroarea corespunztor) sau, mai rar, la
execuie(programulterminndusecuuncoddeeroare).
Limbajeleactualeimpundeclarareaexplicitavariabilelor,unadintreinformaiile
debazprezentendeclaraiefiindtocmaitipulvariabilei.
Sarcinileprincipalealeunuisistemdetipurisunt:
1. declararea de tipuri de date utilizator (extinderea mulimii tipurilor
recunoscutedelimbaj),prinfolosireadeclaraiilordetip;
2. asociereadetipurilavariabile,realizateprindeclaraiiledevariabile;

40
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

3. verificareaconsisteneifolosiriiexpresiilor,careserealizeazprin:
a. determinareatipuluioricrei expresii(saurespingereaacesteia dac
nuisepoatedeterminatipul);
b. verificareaconsisteneiinstruciunilor(deatribuire,apeletc.)pebaza
regulilorprivind:
compatibilitateatipurilor;
egalitateatipurilor,includereatipurilor;
echivalenatipurilor;
concordanalistelordeparametri(formaliiactuali)napelulde
subprograme.
Regulile unui sistem de tipuri precizeaz utilizarea adecvat a fiecrui operator n
limbaj. Verificarea tipurilor (engl. type checking) are ca scop garantarea folosirii
corecteaoperaiilorntrunprogram.Prinaceastaseprevineroriledeexecuie.O
eroaredeexecuieapareatuncicndooperaieseaplicincorect,deexemplucnd
un operand numr ntreg este considerat altceva (caracter, ir de caractere,
boolean). Mai precis, o eroare de tip (engl. type mismatch) apare cnd o funcie f
declaratcuunargumentformaldetipulScarentoarceunrezultatdetipulTeste
apelatcuunargumentactualdetipulAcarenuestedetipulS.Unprogramncare
nuapareroridetipsenumetesigurdinpunctuldevederealtipurilor(engl.type
safe).
Verificareatipuluisepoatefacestaticsaudinamic.Verificareastaticatipurilorse
face n timpul procesului de traducere, iar verificarea dinamic de tip se face n
timpul execuiei, prin inserarea n programul executabil (la compilare i link
editare) a unor poriuni de cod care realizeaz acest lucru. Desigur, verificarea
dinamic nseamn costuri suplimentare de execuie (dimensiunea programului
executabil crete, la fel i timpul de execuie, o parte din el fiind dedicat
verificrilorspecifice),deciestepreferabilverificareastatic.Deobicei,verificarea
static nseamn numai verificare de tip, iar verificarea dinamic cuprinde att
verificareadetip,cti verificarea unorvaloricalculate ntimpulexecuiei(indici
detablou,mprirelazeroetc.).
Senumeteexpresiesigur(engl.safeexpression)oexpresienacreievaluarenu
apareoeroaredetip.Existdoucategoriidesistemedetipuri:puterniceislabe
(engl. strong, respectiv weak type system). Un sistem puternic de tipuri este acela
care accept numai expresii sigure, iar un sistem slab de tipuri este unul care nu
esteputernic.
Unlimbajdeprogramaresenumeteputernictipizatdacelareunsistemdetipuri
puternic i slab tipizat n cazul cnd are un sistem slab de tipuri. O definiie
alternativ a conceptului de limbaj puternic tipizat este dat de urmtoarele trei
cerine:
1. fiecareexpresiesaibunsingurtip;
2. determinarea tipului s fie posibil n timpul procesului de traducere, din
sintaxalimbajului;

41
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

3. variabilelesfiememoratelaadresedistincte.
Oaltdefiniiepentrulimbajputernictipizatestedatdeurmtoarelecaracteristici:
1. fiecareobiectestecreatcuuntipspecificat;
2. fiecareobiectestefolositntromanierconsistentcutipulsu.
Limbajul puternic tipizat static este acela pentru care detectarea inconsistenei
folosiriiobiectelorsefacelacompilare.

Clasificarea tipurilor de date


Caracterul extensibil al unui limbaj de programare este dat ntro msur
hotrtoare de capacitatea acestuia de a permite definirea de noi tipuri de date.
Existdiversecriteriidupcaresepotclasificaacestetipuri:
niveluldeabstractizare;
prezenasauabsenanumeluitipului;
prezenan(sauabsenadin)definiialimbajului;
momentulverificriitipului;
caracteristiciletipurilor(domeniu,operaii).
ntrun limbaj de programare, tipurile pot fi considerate pe trei niveluri de
abstractizare:
nivelul main conine acele tipuri pe care maina le tie reprezenta i
pentrucareeadispunededispozitivecarepotefectuaoperaiicuele:tipurile
ntregi i reale, caracter i boolean; aceste tipuri semai numesc i tipuri de
baz.
nivelul limbajului conine pe lng tipurile de baz, tipurile structurate:
tablouri, nregistrri, mulimi, liste etc. care se construiesc cu ajutorul
tipurilor mai simple; tipurile structurate sunt necesare pentru a manipula
structurile de date proprii unui anumit program i se definesc cu ajutorul
unorconstructoridetip.
nivelulutilizatorconinetipuriledefinitedeutilizator;acestetipuriadaug
cmpurilordelatipurilestructurateoperaii,prinncapsulare;programarea
bazat pe obiecte i programarea orientat pe obiecte recurg la astfel de
tipuri.
Pentru uurina exprimrii, un tip de date este notat cu un identificator, numit
numele tipului. Acest nume concentreaz n el toat informaia de declarare a
respectivuluitip(domeniulioperaiileasociate).Recurgerealaunastfeldesistem
de notare este benefic pentru claritatea textului surs, fiind proprie matematicii.
Oridecteoriprogramultraductorntlneteunnumedetipdedate,eltrebuies
dispundedeclaraiacompletanumeluidetiprespectiv.Existnsideclaraiin
carenuaparenumeletipului,fiindprezentdoardeclarareaacestuia.Prinurmare,
prezenasauabsenanumeluiesteunaltcriteriudeclasificareatipurilordedaten
tipuricunumeitipurianonime(frnume).
DeexemplunlimbajulCputemdeclarauntipstructurcunumeastfel:

42
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

structStudent
{
char*nume;
intvarsta;
};

dupcareputemdefiniovariabildetipStudentastfel:

structStudents;

Aceai secven de definire a tipului i variabilei se poate face mai compact cu


ajutorulunuitipanonim:

struct
{
char*nume;
intvarsta;
}s;

Dinpunctuldevederealdefiniieilimbajului,distingemdoucategoriidetipuri:
tipurifundamentale,careaucanumeidentificatoripredefinii;
tipuri derivate, care au numele (identificator) dat de utilizator ntro
declaraiececuprindeunconstructordetip.
Dinpunctuldevederealmomentuluiverificriitipului,distingemdoucategoriide
tipuripentruoexpresie:
tipstatic(verificatlacompilare);
tipdinamic(verificatlaexecuie).
Unadincaracteristicileesenialealelimbajelordeprogramareorientatpeobiecte
estelegareadinamicaprocedurilor,pebazatipuluidinamicalobiectelor.
Un alt criteriu de clasificare este natura comportamentului reprezentanilor
(obiectelor) unui anumit tip. O privire sumar asupra caracteristicilor instanelor
ducelaidentificareaurmtoarelorclasedetipuri:
simple sau scalare: ordinale (ntreg, boolean, caracter, enumerare,
subdomeniu)ireale;
irdecaractere;
structurate(tablou,nregistrare,mulime,fiier,clas,uniune);
pointer;
procedurale.

n limbajul C numele unui tip se d printrun numedetip, care este, din punct de
vedere sintactic, exact ca o declaraie pentru o variabil sau o funcie de acel tip,
numaicnuaparenumelevariabileisaufunciei.
Exemple:

43
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Numedetip Declaraia Tipul
int inti ntreg
int* int*pi Pointerlantreg
int*[3] int*p[3] Tabloude3pointerilantregi
int(*)[3] int(*p3i)[3] Pointerlatabloude3ntregi
int*() int*f() Funcie fr argumente care returneaz
pointerlantreg
int(*)(double) int(*pf)(double) Pointerlafunciecuunargumentdetip
doublecarereturneazntreg.

Existiposibilitateadeadaunnumeunuinumedetip,prinmecanismultypedef,a
cruisintaxgenericeste:

typedefdeclaraiedevariabil;

cunelesulcnumedetipesteidentificatorul(utilizator)coninutndeclaraiede
variabil.
Deexemplu:

typedefint*Tf();//numedetipesteTf
Tff;//declaraiedetipechivalentcudeclaraiadevariabil
//int*f();

typedefint(*Tpf)(double);//numedetipesteTpf
//declaraiedetipechivalentcudeclaraia
Tpfpf; //int(*pf)(double);

Notaia de declarare din C i din C++ oglindete sintaxa expresiilor bazat pe


precedena i asociativitatea operatorilor. Limbajele C i C++ exceleaz prin
multitudineadeoperatori(fiindlimbajeorientatepeexpresii),pentrucareordinea
de prioritate pare de multe ori nenatural; pentru a se obine prioritatea dorit
trebuie folosite parantezele. De exemplu, declararea tipului anonim pointer la un
tabloude10pointerilafunciiceauargumentintintorcunpointerlachar(chiar
dac literar expresia este relativ rezonabil) este greu de exprimat n C++ i nu
avantajeazlizibilitatea(festedeclaratcaovariabildeacesttip):

char*(*(*f)[10])(int);

Tocmaideaceea,cndselucreazcutipurinetriviale,serecomandssefoloseasc
numedetip. Tipul mai sus exprimat se poate descrie suficient de clar folosind
notaiileoferitedenumeledetip,peetape,nfelulurmtor:

44
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

typedefchar*F(int);//Festetipulfunciilorceauargument
//intintorcpointerlachar
typedefF*A[10];//Aestetipultablouluide
//10pointerilafunciidetipulF
A*p;//pesteunpointerlatablouldetipAdinexpresiademaisus.

Echivalena i compatibilitatea de tip


Unpasimportantndezvoltarealimbajelordeprogramareesteapariialimbajelor
puternic tipizate, dotate cu mecanisme de declarare a tipurilor utilizator. Apariia
acestorsistemedetipuriaprodusnoiprobleme,legatedeegalitateatipurilor.
Se pune problema compatibilitii tipurilor, cu referire la regulile semantice care
determindacntrunanumitcontextestevalidsaunuunobiectdeunanumittip.
Prin context se poate nelege aici instruciunea de atribuire, expresia de indice la
tablouri, apelul unui subprogram, aplicarea unui anumit operator sau orice alt
instan a unui tip dat. Noiunea de instan a unui tip desemneaz variabile,
componentealeunorvariabile,constante,constante,expresii,funciisauparametri
formalidetipulrespectiv.
Echivalenatipurilorestepiatraunghiularaverificrilordetippecareleimplicun
sistemdetipuri.Gamaacestorverificriestedivers,depinznddetipulexpresiilor,
de contextul n care acestea apar i n primul rnd de accepiunea noiunii de
echivalen de tip implementat. Echivalena tipurilor poate fi tratat att la nivel
semantic(censeamn),ctilanivelsintactic(cumserealizeaz).
Din punct de vedere semantic, distingem dou abordri ale echivalenei de tip:
egalitatea i compatibilitatea tipurilor. Trebuie reinut c abordarea semantic a
noiuniideechivalendetipexprimideeadecomportamentidenticsaucompatibil
la aplicarea acelorai operaii, i nu ideea de reprezentri structurale identice. n
unele situaii este nevoie ca tipurile implicate n verificri s fie identice (egale),
alteori este nevoie doar de compatibilitatea acestora. Cerina de egalitate a dou
tipuri este mai tare dect cerina de compatibilitate a lor i este cerut n puine
situaii.Compatibilitateatipurilorncadrulprogramelorseverificlanivelurile:
atribuiri(compatibilitateadeatribuire);
expresiilor(compatibilitateadeexpresii);
tablourile(compatibilitateadetablou);
listelordeparametriformaliiactuali(concordanalistelordeparametriai
parametriaiprocedurilorifunciilor);
Din punct de vedere sintactic, exist trei accepiuni ale echivalenei tipurilor:
structural,denumeidedeclarare.Doutipurisuntechivalentestructuraldaci
numai dac componentele lor sunt aceleai din toate punctele de vedere.
Echivalena denume statueaz c dou tipuri sunt echivalente dac inumai dac
ele au acelai nume. Echivalena de declarare are loc numai dac variabilele ale
cror tipuri sunt considerate echivalente apar sub aceeai declarare de tip. ntre

45
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

aceste echivalene de tip exist o relaie de incluziune, n sensul c echivalena de
numeoimplicipeceastructural,iarechivalenadedeclarareleimplicautomat
peamndoucelelalte.
Limbajul C folosete echivalena structural pentru toate tipurile. Motivul pentru
care sa prevzut n C echivalena structural este minimizarea problemelor de
ntreinere.
EchivalenadenumeestepiatraunghiularasistemuluidetipuriallimbajuluiC++.
Regulile de compatibilitate ale reprezentrii garanteaz folosirea conversiilor
explicitepentruaseobineserviciidenivelmaisczutcarenaltelimbajeseobin
prin echivalena structural. Sa preferat echivalena de nume n locul celei
structuraledeoareceeaareunmodelmaisimpluimaiclar.ndefiniialimbajului
C++, echivalena de nume nseamn regula definiie unice: orice funcie, variabil,
tip,constantetc.trebuiesaibosingurdefiniie:
Declaraiile:

structA{intx,y;};
structB{intx,y;};

vor defini dou tipuri A i B compatibile n C (structural) i incompatibile n C++


(dupnume).Maimult,declaraiile:

structA{intx,y;};//nfiierul1
structB{intx,y;};//nfiierul2

definesc dou tipuri diferite, ambele cu numele D (att n C ct i n C++). Dac


compilatorul face verificarea celor dou fiiere (uniti de traducere) 1 i 2, se
obineeroareadefiniiedubl.
Dinpunctuldevederealimplementrii,attnCctiC++garanteazcstructuri
similare (cum sunt A, B i D din exemplu anterior) au reprezentare identic n
memorie,decielesepotconvertiexplicitifolosidreptstructuricompatibile:

externf(structA*)
structA{intx,y;};
structB{intx,y;};

voidg(structA*pa,structB*pb)
{
f(pa);/*correct*/
f(pb);/*eroareC++:enecesarargumentA*datoritechivaleneidenume,nscorectnC
conformechivaleneistructurale*/
pa=pb;/*eroareC++:trebuieA*;corectnC*/
pa=(structA*)pb;/*corect:conversieexplicit*/
pb>x=1;
if(pa>x!=pb>x)
error(implementaregresita);
}

46
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Declaraii de variabile
Dac unei constante i se asociaz un obiect din ULP, acelai pe tot parcursul
execuieiprogramului,uneivariabileicorespundeolocaiedememoriecarepoate,
launmomentdat,sconinunobiectdintromulimedeobiecte(valoriposibile)
dinULP.Aceastmulimeformeazdomeniuldedefiniiealvariabilei,iarlocaiade
memorie este neleas n sensul de poziia de la care ncepe alocarea variabilei
respective.
Creareadevariabileilucrulcuacesteaestecaracteristicadebazalimbajelorde
programareimperative.
Denumireadevariabilarepentrulimbajeledeprogramarealtsemnificaiedect
ceafolositnmatematic.Dacnsensmatematicovariabilesteonedeterminat
sauunparametrudintrunsistemformalcepoateluaoricevaloaredintromulime
cunoscut de valori (domeniul de definiie al variabilei), pentru ULP noiunea de
variabil este legat de localizarea acesteia n memoria calculatorului i de
modificabilitateaconinutuluilocaieirespective.

Elemente definitorii ale unei variabile


Dinpunctdevederestructural,ovariabilesteuncvadrupluformatdinnume,set
deatribute,referinivaloare.

Numeleuneivariabileesteunidentificator,creatnconcordancuregulileproprii
sintaxeifiecruilimbaj.Deexemplu,nCiC++sefolosesclitere,cifreicaracterul
underscorepentruacreaidentificatori.Conveniaestessefoloseascliteremici.

Setuldeatributealuneivariabilepoatefifixatlacompilaresaumodificatdinamic(la
execuie). Definirea atributelor se poate face declarativ sau implicit. Definirea
declarativ presupune folosirea unor instruciuni de declarare, iar definirea
implicit se poate realiza fie prin stabilirea unei convenii privitoare la numele
variabilei(cumsentmplnFORTRANundenumeledevariabilecarencepcuI,J,
K,L,M,Nseconsiderntregi,iarcelelalteseconsiderreale),fieprinatribuireade
valori, caz n care tipul variabilei se stabilete n funcie de valoarea atribuit
acesteia.
Sedistingtreiatributeeseniale:
domeniuldevizibilitateesteconsideratafiintervalul(deprogramsurs)n
care variabila respectiv este recunoscut, deci utilizabil. Noiunea de
domeniudevizibilitateestemailarg,deobiceitoatenumelefolositentrun
program (nu numai variabilele) au un domeniu de vizibilitate stabilit prin
reguli de vizibilitate specifice limbajului. Domeniul de vizibilitate ncepe de
obiceiimediatduppunctuldedeclararealnumeluirespectivisencheiela
sfritul blocului, procedurii, fiierului surs, dup caz. O variabil local,
declarat n interiorul unui subprogram are domeniul de vizibilitate toat

47
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

secvenadedeclaraiiiinstruciunideduppunctuldedeclarareipnla
sfritul subprogramului respectiv; pentru variabilele globale, declarate n
corpul programului principal, domeniul de vizibilitate ine de dup punctul
dedeclararepnlasfritulfiieruluisurs.
duratadeviaestedefinitcaintervalul(detimpdeexecuie)ncarezona
de memorie alocat variabilei respective este utilizat pentru aceast
variabil.Existvariabilelocale,globaleidinamice:variabilelocale,numite
ivariabileautomatice,declarateninteriorulblocurilorsausubprogramelor,
suntalocatenstivdoarlaactivareaunitiirespectivedeprogram,avnd
duratadeviaegalcuperioadactesteactivatbloculsausubprogramuln
careelesuntdeclarate;variabileleglobalesuntdeobiceialocatensegmentul
de date nc de la compilare, aa c au durata de via egal cu timpul de
execuiealprogramului;variabiledinamiceauduratadeviacontrolatde
utilizator: alocarea i dealocarea se face prin instruciuni specifice fiecrui
limbaj.
tipulvariabileipoatefiprecizatnmodurilespecificeanterior.Majoritatea
limbajelor de programare posed tipuri predefinite (tipuri numerice,
caracter,boolean),iarcelemaievoluateau,pelngacestea,mecanismede
definire a tipurilor utilizator (typedef, struct, union n C, class n C++), cu
ajutorulcroraprogramatorulpoateconstruipropriilesalestructuridedate.
Mecanismelededeclararedenoitipurisuntextinseprinceeacesenumete
abstractizare datelor i programarea orientat pe obiecte, n care accentul
este pus pe definirea operaiilor prevzute pentru un anumit tip de dat
definitdeutilizator.
Odat cu noiunea de tip apare problema definirii tipului, care se poate face static
(n timpul compilrii, pentru limbajele puternic tipizate), sau dinamic (n timpul
execuie, atunci cnd tipul exact al variabilei nu este cunoscut n momentul
compilrii). Tipul unei variabile determin domeniul de definiie al variabilei
respectiveigamadeoperaiipermisepentruvariabilarespectiv.

Referina este informaia adres, adic locul unde este memorat variabila.
Stabilireareferineiserealizeazprinceeacenumimalocareavariabileirespective.
Alocareauneivariabilesepoatefacestaticsaudinamic,nfunciedemomentuln
careserealizeazacestlucru.Dacalocareasefacenfazadecompilareestevorba
de alocare static, iar dac alocarea se face la execuie este vorba de alocare
dinamic.
Douvariabilecareauaceeaireferinsenumescvariabilealiate,iaroperaiaprin
caresepoaterealizaacestlucrusenumetealiere(engl.aliasing).nCiC++alierea
sepoateobineprinmecanismulunion.

Valoareaasociatuneivariabilesepoateschimbantimpulexecuieiunuiprogram
dar,petoatduratadeviaavariabileirespective,nlocaiadememorieprecizat

48
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

prinreferinsevagsiovaloare.Mulimeavalorilorasociatevariabilelordintrun
program formeaz spaiul strilor sau mediul programului. Determinarea valorii
uneivariabilelaunmomentdatsefaceprinoperaiadederefereniere.Prinaceasta,
pe baza referinei se returneaz valoarea variabilei. n general operaia de
derefereniereesteimplicit,neexistndonotaieconsacratpentruea.

Celepatrucomponentealevariabileisepotreprezentaschematicastfel:

Nume Set de atribute Referin

valoare


Referina, mpreun cu valoare formeaz un obiect. n cazul variabilelor aliate,
acestea vor avea aceeai referin, dar nu neaprat vor desemna acelai obiect,
deoarece, dac sunt de tipuri diferite, ele vor avea valori diferite (datorit, de
exemplu,diferitelormoduridereprezentareinternaleacestora).Schematic,dou
variabilealiateXiYseprezintastfel:

X Atribute X valoare

Y Atribute Y

Legarea variabilelor
Termenul de legare a variabilelor este folosit n mai mult accepiuni. Urmrind
structura unei variabile, prezentat n seciunea precedent, putem distinge dou
punctentrecareaparelegarea:ntrenumeisetuldeatributepedeoparteintre
perechea (nume, set de atribute) i referin pe de alt parte. Legarea variabilelor
poatefidiscutatidinpunctuldevederealprocesuluidecompilare.Exist,nacest
context,legareinterniexternacestuiproces.Daclegareainternavariabilelor
se face n interiorul procesului de compilare a textului surs, legarea extern este
sarcina editorului de legturi, care rezolv legarea unei variabile folosit ntrun
modul i declarat ntrun alt modul (modulele respective fiind supuse unor
compilri separate). n sfrit, termenul de legare a variabilelor are accepiuni
diferite n traducerea efectuat de compilatoare fa de cea efectuat cu

49
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

interpretoare. n ultima situaie vorbim de o legare dinamic a variabilelor,
efectuatchiarntimpulexecuiei.
Din schemele de mai sus se observ c legarea variabilelor (engl. binding) implic
punerea n coresponden a variabilelor cu atributele acesteia. Momentul legrii
(engl.bindingtime)estemomentullacaredevincunoscuteatributeleuneivariabile.
Existdousituaiidistincte:
1. atributele se cunosc la compilare: se poate face n acest caz, tot la
compilare, toate verificrile necesare privind compatibilitatea i
corectitudinea utilizrii variabilei, prin urmare codul generat este mai
compact,permindoexecuieeficientaacestuia.
2. atributele se cunosc numai la execuie: rezult c n codul generat la
compilare vor trebui introduse i secvene care s realizeze verificrile de
corectitudineautilizriivariabilei,ceeaceconducelauncodmaimare,deci
maiineficient.Pedealtparte,acestlucruconduce,deaceastdatnsens
pozitiv,laomaimareflexibilitateaprogramelorscrise.
nfunciedemomentullegrii,sedistingdouclasedelimbaje,curepercusiunin
ceea ce privete deciziile de implementare. n prima clas sunt acele limbaje care
permit legarea static, adic pentru care momentul legrii coincide cu momentul
compilrii.Pentruacestelimbaje(cuvariabilepentrucaremajoritateaatributelorse
cunosc la compilare) este caracteristic eficiena n execuie. A doua clas conine
acele limbaje pentru care legarea este dinamic, adic momentul legrii este
momentul legrii este momentul execuiei. Pentru acestea, soluia de
implementarea optim este cea interpretativ, cu alocarea dinamic a memoriei,
verificareadinamicacorectitudiniifolosiriivariabilelor,aexecuieioperaiiloretc.,
ceeaceconducelaflexibilitatenexecuie.
Decizia privind tipul programului traductor (compilator sau interpretor) depinde
de muli ali factori (resurse hardware, pre de cost, criteriul de eficien stabilit
pentru limbaj timp sau memorie, domeniul de aplicare etc.). De obicei limbajele
imperative posed compilatoare iar limbajele aplicative posed interpretoare.
Aceasta nu este o regul general, existnd compilatoare i pentru limbajele
aplicative.Deosebireantrelimbajelecompilateiceleinterpretatedevinemultmai
estompat n cazul limbajelor moderne. De exemplu, pentru un limbaj (cum este
Ada)carepermitelucrulcutablouridedimensiunicunoscutenumailaexecuie,la
compilaresevainserancodunapellarutinespecialecevorfiactivatelaexecuie.
Alte faciliti cum sunt alocarea dinamic a irurilor de caractere, procedurile
recursive,facilitilegenerice,lucrulcuvariabileledinamiceaccesateprinpointeri,
legareadinamicaprocedurilor,folosireabibliotecilorncrcatedinamic(DLL)ia
mediilor de execuie necesit de asemenea includerea n codul generat de
compilator a unor apeluri de rutine specifice, ceea ce transform codul obiect mai
degrab ntrun cod intermediar dect n cod main, apropiindul de ceea ce
realizeazuninterpretor.

50
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Punctul de declarare a unei variabile poate fi definit att pentru limbajele cu
declaraiicompletexplicite,ctipentrucelecarepermit ideclaraiiimplicitede
variabile. n primul caz, orice variabil necesar trebuie n prealabil declarat
printroinstruciunededeclarare,iarpunctuldedeclarareseconsiderafiimediat
dupterminareadeclaraieinumeluivariabilei.naldoileacaz,punctuldedeclarare
este prima instruciune de atribuire care conine n membrul stng numele
variabilei. Punctul de declarare marcheaz nceputul domeniului de vizibilitate al
variabilei.
ntlnirea unei instruciuni de declarare nseamn pentru compilator legarea
numeluivariabileidesetuldeatribute.ntradevr,nmodnormaloinstruciunede
declararespecificdouinformaii:
numelevariabilei;
tipulacesteia.
Celelalte atribute ale variabilei se determin dup cum urmeaz. nceputul
domeniuluidevizibilitateestedefinitdepunctuldedeclarare,adicdeloculncare
apare respectiva declaraie n textul surs al programului, iar sfritul domeniului
estedeterminattotdepunctuldedeclarare,astfel:
a. Punctul de declarare este intern unui bloc sau subprogram: domeniul de
vizibilitateinepnlasfritulblocului(subprogramului),inclusivblocurile
(subprogramele)locale(dacnuexistredeclarrialenumeluininteriorul
acestora), situaie n care vor fi valabile redeclarrile aa numitele pete
albe hole in scope; respectiva variabil este deci local unitii n care a
aprutpunctuldedeclarare.
b. Punctuldedeclarareestenafaraoricruiblocsausubprogram:domeniulde
vizibilitate al variabilei este ine pn la sfritul fiierului surs respectiv,
variabilafiindglobalnfiierulceconinedeclaraia.
c. Punctul de declarare este n partea de interfa a unui modul: domeniul de
vizibilitate al variabilei este, pe de o parte cel stabilit la (b), variabila fiind
global modulului, iar pe de alt parte orice alt modul sau program care
specificexplicitfolosireamodululuidedeclarare.
d. Punctuldedeclarareestenparteadeimplementareaunuimodul:domeniul
de vizibilitate este cel stabilit la (b), cu precizarea c numele este invizibil
modulelor sau programelor care specific explicit folosirea modulului de
declarare,iarvariabilaestelocalmodulului.
Punctul de declarare determin indirect i durata de via a variabilelor. Acest
atributestenstrnslegturcuadouavariantdelegare,anumelegareaperechii
(nume, set de atribute) de referin, legare numit de obicei alocarea variabilei.
Astfel, variabilele globale (n program sau modul) sunt alocate la compilare n
segmentul de date, deci durata lor de via coincide cu durata de execuie a
programului,fiindalocatestatic,iarvariabilelelocalesuntalocateautomatdectre
mecanismul de execuie (bazat pe principiul stivei (ele se mai numesc i variabile
automatice). n cazul variabilelor globale, la ntlnirea instruciunii de declarare

51
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

compilatorulpoatealocansegmentuldedatespaiupentrurespectivavariabil(pe
baza informaiei de tip). Pentru variabilele locale compilatorul determin locul
variabileinnregistrareadeactivarearespectivuluiblocsausubprogram,carevafi
alocat automat n stiva de execuie cnd blocul sau subprogramul sunt activate,
respectivdealocat(totautomat)laterminareaexecuieilui.Prinurmare,duratade
via a unei variabile locale este definit de timpul de activare a blocului sau
subprogramuluidedeclarare.
Deobiceivariabileledinamicesuntanonime,iaraccesarealorsefaceprinvariabile
de tip pointer (a cror valoare reprezint adresa variabilei dinamice referite).
Declararea unei variabile pointer nu are efect dect asupra duratei de via a
variabileipointer(tratatlafelcaoricealtvariabil).Variabiladinamicreferitde
pointervaaveaduratadeviacontrolatdeutilizator,carepoatefolosiinstruciuni
specifice dealocarei dealocare.Variabileledinamicesealocnzonadememorie
dinamic(heap).
Prin urmare, variabilele au nc un atribut, care determin modul lor de alocare,
numit clas de memorie. Acest atribut este de obicei implicit (fiind determinat de
localizarea punctului de declarare). n limbajele C i C++ exist posibilitatea
declarriiexpliciteaclaseidememoriepentruoricevariabil.

Clase de memorie C
n limbajul C funciile nu se pot include unele n altele, deci nivelul de nglobare
staticaltuturorfunciiloresteacelai.nCexistattinstruciunicompuse,cti
blocuri se permit definiri de obiecte n cadrul blocurilor. O alt caracteristic a
limbajului este compilarea separat, rezultnd segmente diferite care sunt legate
mpreundectreeditoruldelegturi.
Pentrudeterminareadomeniuluidevizibilitateiadurateideviapentruvariabile,
limbajulCintroduceunnouatributpentruacestea: clasadememorie.Existpatru
astfel de clase, care se declar cu cuvintele rezervate: auto (declaraie implicit
pentruvariabileledeclarateninteriorulfunciilor),register,staticiextern(clasa
implicit pentru variabilele declarate n afara funciilor). Precizarea clasei de
memorieiatipuluivariabileisefacentrodeclaraiedeforma:

<nume_clas><tip><list_nume_variabile>;

unde:
<list_nume_variabile> conine identificatorii ce reprezint numele
variabilelor,separaiprinvirgule.

Variabilele auto sunt declarate n interiorul funciilor. O astfel de variabil este


activattatimpctesteactivunitateadeprogram(funciasaublocul)lanceputul
creia a fost declarat pierzndui valoarea la terminarea execuiei respectivei
uniti de program, la o nou apelare nemaifiind disponibil vechea ei valoare. n

52
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

afarauneideclaraiideclasdememorie,toatevariabileleseconsiderimplicitn
clasaauto.
Variabilele register se constituie ntro subclas a clasei auto, declaraia register
anunndcompilatorulcacestevariabilevorfiutilizatefoartefrecvent.Daceste
posibil,compilatorullevaalocacteunregistrumain,pentrumicorareatimpului
deacceslaacestevariabile(nacestcaznumaitrebuiefcutcalcululdeadresic,
ngeneral,regitriimainautimpideaccesmaimicidectmemoriaintern).Dac
se folosete un numr mare de variabile register, care depete numrul de
regitrii main disponibili, compilatorul va ncadra variabilele register rmas n
clasaauto(deaceeasespunecclasaregisteresteosubclasaclaseiauto).Oalt
limitareautilizriiclaseiregisterestedatdecapacitateaunuiregistrumain,care
estengeneraldoisaupatruoctei,prinurmarenumaivariabiledetipurilentreg,
caractersaupointerpotaparineacesteiclase.
O utilizare uzual a acestei clase de memorie este pentru memorarea ntrun
registruavariabileidecontrolpentruosecvenrepetitiv:

voidmain()
{
registerinti;
for(i=0;i<1000;i++)a[i]=i;
}

Variabilele static sunt de dou categorii: static interne i static externe. Nu este
necesarfolosireadecuvintecheierezervatenacestsens,ncadrareauneivariabile
static n categoria corect fcnduse n funcie de locul n care apare declaraia:
static interne dac se declar n interiorul unei funcii i static externe dac se
declarnafarafunciilor:

staticinta[20];//variabilaaestedetipstatic

Dacsedeclarnafarafunciilor,acelevariabilestaticevorfiaccesibilemaimultor
funcii.Domeniuldevizibilitatealuneiastfeldevariabileestedinloculdeclarriiei
ipnlasfritulmodululuirespectiv,decidomeniuldevizibilitateestelimitatla
fiierul ce conine declaraia. Valoarea unei variabile statice poate fi modificat de
funciile care au acces la ea. n momentul n care un segment care conine o
declaraiedevariabilstaticdevineinactiv,variabilastaticrespectivivapierde
valoarea,lareactivareasegmentuluieaprimindvaloareainiialdeladeclarareaei
(cunoscutlacompilare).SepoateconsideracvariabilelestaticexternedinCsunt
similare variabilelor globale (declarate n programul principal), ele alocnduse la
compilarensegmentuldedate.
Dac se declar n interiorul unei funcii o variabil static va avea regim de
variabil local din punct de vedere al domeniului de vizibilitate, ns ea nu se va
aloca n stiv ci tot n segmentul de date globale, avnd astfel o proprietate

53
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

interesant: valoarea acesteia se va pstra ntre dou apeluri consecutive ale
aceleiaifuncii,iniializareaeifcndusedoarlaprimulapelalfunciei.
Pentrucomunicareantresegmentediferite,compilateseparat,nCsuntprevzute
variabiledinclasaextern.Lafelcavariabileledinclasastatic,elesuntdeclaraten
afarafunciilor,iardomeniuldevizibilitatealuneivariabileexternestedelalocul
declarriiipnlasfritulsegmentuluincareaparedeclararea.Spredeosebire
de variabilele static, care sunt locale unui segment, variabilele extern pot aparine
maimultorsegmente(rolullorfiindcomunicareantresegmente),aceeaivariabil
externavndacelainumenfiecaredintresegmentelencareesteutilizat.Sarcina
stabiliriilegturilornecesarepentruovariabildeclasexternrevineeditoruluide
legturi, o referire la ea n oricare dintre segmentele unde este declarat
traducnduseprinaceeaiinformaiedeadres.
FunciileCauimplicitclasadememorieextern,eleputndfiapelatedinoricepunct
alprogramului.Pentruafacecaofunciespoatfiapelatnumaidinsegmentuln
careeaestedefinit,isevaatribuiclasastatic.

Etape ale lucrului cu variabile


Din punctul de vedere al manipulrii, n viaa unei variabile se disting mai multe
momente,enumeratenceleceurmeaznordineafireascaapariieilor:
1. Declararea
2. Iniializarea
3. Folosirea
Declararea variabilelor se face implicit sau explicit. Declararea explicit este
realizat cu ajutorul instruciunilor de declarare, care comunic compilatorului
informaii privind numele variabilelor, atributele acestora i, eventual, valorile de
iniializare. Declararea implicit recurge la convenii privitoare fie la numele
variabilei,fielavaloareaacesteia.
Instruciunilededeclararetrebuiesapar,nmajoritatealimbajelor,nparteade
nceput (de declaraii) a blocurilor, subprogramelor sau modulelor. Excepie este
limbajulC++,carepermitedeclarareauneivariabileexactacoloundeestenevoiede
eaprimadat.
Declaraiile mai pot specifica tipul de legare a variabilei respective (intern sau
extern), modul de alocare a acesteia, modul de transmitere a parametrilor n
subprograme.
n limbajul C++ se definesc doi termeni: declarare i definire (prin definire se
nelege declarare i iniializare). n cazul definiiilor fr iniializator, variabilele
primesc valori implicite, echivalente lui 0 (0 pentru tipuri numerice, stringul vid
pentruiruridecaractere,valoareaNULLpentrupointeri).Odeclaraiearerolulde
a introduce unul saumai multenume (noi) ntrun program.DeclaraiaNUeste i
definiiecnd:
Declarofunciefraispecificacorpul;

54
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Coninespecificatorulexterninuareiniializareasaucorpdefuncie;
Declarunmembrustaticntrodeclaraiedeclas;
Esteodeclaraiedenumedeclas;
Esteodeclaraietypedef.
Urmtoareadeclaraieesteidefiniie:

inta;

pentru c are iniializarea implicit (cu 0), i declaraia este local unitii de
traducerencareeaapare,iarurmtoareaestenumaideclaraie:

externinta;//nfiierul2

deoarecevariabilantreagaseconsiderdefinitnaltunitatedetraducere(de
exemplunfiierul1,undesefaceiniializareaei),iarnfiierul2estedoarfolosit.
Declaraiilepentruvariabilepotspecificaitipullegrii(internsauextern,maniera
de alocare specificat n C i C++ prin clasa de memorie). Declaraiile static
corespundlegriiinterne,iarceleexterncorespundlegriiexterne(lalinkeditare).
O declaraie sau definiie poate conine i calificatori (const sau volatile), care
definesc modificabilitatea obiectelor precizate. O particularitate a acestora este
moduldeaplicarelapointeri:atributulconstsauvolatileprefixatcuoperatorulde
derefereniere*seaplicpointeruluiinuobiectuluipunctatdeacesta.
Deexemplu,definiiile:

constci=10,*pc=&ci,*constcpc=pc;
inti,*p,*constcp=&i;

declar:
ciconstantntreag;
pcpointerlaconstantantreagci;
cpcpointerconstantlaconstantantreagci;
ivariabilntreag;
ppointerlantreg;
cppointerconstantlavariabilantregi;
Valorileluici,cpcicpnusepotmodificadupiniializare.Valoarealuipcsepoate
modifica,caiobiectulpointatdecp.Exempledeoperaiilegalesunt:

i=ci;
*cp=ci;
pc++;
pc=cpc;
pc=p;

iarcaexempledeoperaiiilegaleavem:
55
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

ci=1; //cinusepoatemodifica
ci++; //idem
*pc=2; //artrebuisasemodificeci
cp=&ci; //cpnusepoatemodifica
cpc++; //cpcnusepoatemodifica
p=pc; //arpermitemodificareulterioaraaluiciprinp

Exemple:

inti=1; //isepoatemodifica
constint*p=&i;//pointerlaobiectconstant
//pointerulsepoatemodifica,nuinsasi
//obiectulreferit
int*constvp=&i; //pointerconstantlaunobiect
//obiectulsepoatemodifica,
//nuinsasipointerulcarelrefera
constint*constcp=&i;//pointerconstantlaun
//obiectconstant
//niciobiectulnusepoatemodifica,
//nicipointerulcarelrefera.

voidf()
{
i++; //OK:inuesteconst
p; //OK:pnuesteconst
(*vp);//OK:*vpnuesteconst
cp++; //eroare:nusepoatemodificaunobiectconst
(*cp);//eroare:nusepoatemodificaunobiectconst
(*p)++;//eroare:nusepoatemodificaunobiectconst
vp++;//eroare:nusepoatemodificaunobiectconst
}

Variabilele pointer sunt iniializate implicit la NULL (echivalentul valorii 0 pentru
tipulpointer).

Iniializarea
Una dintre condiiile naturale pe care trebuie s le ndeplineasc un program este
stabilitatea sa, care se poate defini intuitiv astfel: cu aceleai date de intrare,
programul produce aceleai rezultate. Problema stabilitii este rezolvat n cazul
programelorsimple,careconindeclaraiidedate(variabile)deintrareirezultate:
variabilele de intrare se iniializeaz prin operaii de intrare (citire) i rezultate:
variabileledeintrareseiniializeazprinoperaiideintrare(citire),iarvariabilele
rezultat(deieire)prinoperaiideatribuire.nschimb,dacnprogramsefolosesc
ivariabileauxiliare(necesarepentruomaibunstructuraprocesuluidecalcul),
nimeni nu mai garanteaz iniializarea acestora. Prin urmare, din definiia
stabilitii (dat mai sus) rezult o prim condiie de stabilitate: toate variabilele

56
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

auxiliare din program s fie iniializate cu aceleai valori, la fiecare execuie a
programuluicuacelaisetdedatedeintrare.
Iniializarea unei variabilesepoatefacenurmauneiinstruciunideatribuiresau
prininstruciunispecifice.nceeacepriveteiniializareauneivariabileaceastase
poate face n momentul alocrii ei (variabila primete o valoarea predefinit, n
funcie de tipul ei sau stabilit printro instruciune sau clauz) sau imediat dup
momentulalocrii(valoareavariabileiestenedefinitseconsidervaloareagsit
nlocaiadememoriedefinitdereferinaei,valoareanumitvaloarearezidual).
Limbajeledeprogramaremoderneacordoateniesporitiniializriivariabilelor.
De regul se aplic iniializarea implicit, elibernd programatorul de o activitate
suplimentar.
Referireavariabilelorsefaceprintroexpresiedeidentificarecarepoatefi:
identificator(numelevariabileirespective);
expresieindexat(cndvariabilaestedetiptablou);
expresie de selectare (dac variabila este component a unei date
structurate);
expresiedeindirectare(cndvariabilaestedetippointer);

57
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

5. Tipuridedate

Printipdedatesenelegeomulimedeobiectensoitdeomulimedeoperaiipe
mulimea acestor obiecte. Operaiile realizeaz crearea, construirea, distrugerea,
modificareasaucopiereainstanelor(realizrilor)obiectelor.Operaiiledefinitepe
mulimea obiectelor reprezint un set minim de operaii primitive, cu ajutorul
crora, prin compunere, se pot descrie operaii mai complexe. Fiecare limbaj de
programare are stabilite, n momentul specificrii lui, tipurile de dat proprii,
numiteitipurifundamentale.

Tipuri fundamentale
Fiecare limbaj de programare i definete tipurile fundamentale, numite i tipuri
baz, care de obicei corespund tipurilor main. Pentru aceste tipuri, definiia
limbajuluiintroduceidentificatoripredefinii.
Dinpunctuldevederealcomportamentuluilor,tipurilefundamentalesepotmpri
n tipuri aritmetice, caracter i boolean. Despre precizarea detaliat a operatorilor
vomdiscutantrunaltcapitol.
Tipurile aritmetice (ntregi i reale) sunt apropiate de maina fizic. n general
exist mai muli reprezentani ai acestor tipuri, tipuri care difer unele de altele
prin: maniera i lungimea de reprezentare, prezena semnului etc. Operaiile de
bazsuntcelearitmetice(rezultnd expresiiaritmetice)idecomparare (expresii
relaionale).
Domeniultipuluidedatbooleanarenumaidouvalori:trueifalse.Existcinci
operaii definite pe acest tip: and, or, not, imp (implicaia logic) i equiv
(echivalenalogic).Definireaoperaiilordemaisussepoatefaceastfel(utilizndu
seoinstruciuneifelseipresupunndcxiysuntvariabilebooleene):

xandy=ifxthenzelsefalse
xory=ifxthentrueelsey
notx=ifxthenfalseelsey
ximpy=ifxthenyelsetrue
xequivy=ifxthenyelsenoty

LimbajulCconsideroriceirbiiceconinnumai0cafalse,respectivtrueoriceir
debiintrecareesteunulnenul.
Operanzii de tip boolean se folosesc la formarea expresiilor logice, cu ajutorul
operatorilorlogici.
n C++ exist dou mari clase de tipuri fundamentale: aritmetice i void (cu
domeniuldevalorivid).Tipurilearitmeticesuntformatedintipurintregi(char,int
n toate variantele i enumerrile) i tipuri reale (flotante). Valorile minim i

58
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

maxim din domeniul fiecrui tip sunt precizate, pentru fiecare implementare, n
fiierulheader(antet)<limits.h>.
Tipulchararecadomeniusetuldecaracteredebazallimbajului.Fiecareinstan
asaestememoratntrovariabildetipcaracter,carearecavaloarecodulntreg
alcaracterului.Caracterelesepotdeclaracusemnsaufrsemn(declarareexplicit
signed sau unsigned); exist deci trei tipuri distincte: char, signed char i unsigned
char. Fiecare va ocupa acelai spaiu de memorie (determinat de operatorul
sizeof()).
Existtreitipurintregidistincte:int,shortilongint.Tipurilesignedchar,short,int
ilongaucorespondentuntipunsigned,careocupacelaispaiudememorie.

Tip sizeof (n Aliniere (multiplu de, n


octei) octei)
char 1 1
short 2 2
int 2sau4 2sau4
long 4sau8 4sau8

n C++ (ca i n C) nu este predefinit tipul boolean. Orice expresie cu valoarea


diferit de zero (sau diferit de echivalentul lui 0 n cazul domeniului oricrui alt
tip)esteconsiderattrue,iaroriceexpresiecuvaloarea0esteconsideratfalse.
Tipul enumerare este un tip ntreg distinct ce are constante cu nume. Numele su
devine un aa numit numeenumerare, care este cuvnt rezervat n domeniul de
vizibilitatepropriu.Identificatoriidintrolistenumeraresuntdeclaraiconstantei
pot apare oriunde pot apare constante. Dac nu apar enumeratori cu =, valorile
respectivelor constante ncep de la 0 i cresc cu 1, de la stnga la dreapta. Un
enumeratorcu=vadaidentificatoruluivaloareaindicat,carermnecavaloare
destartpentruurmtoriienumeratori.Valoareaunuienumeratortrebuiesfiede
tipintsaudetipcesepoateconvertilaint.
Numeleenumeratorilortrebuiesfiedistinctedecelealevariabilelorordinaresau
alealtorenumeratorinacelaidomeniudevizibilitate.Deexemplu:

enumculori=
{rosu,orange,galben,verde,albastru};
enumfruct=
{mar,para,orange,kiwi};//eroare:orangeesteredefinit
enumpasare=
{strut,
dodo,
lebada,
kiwi};//eroarekiwiesteredefinit

intlebada;//eroare:lebadaredefinit

59
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Valorileenumeratorilornutrebuiesfiedistincte.Unenumeratoresteconsideratc
se definete dup ce sa citit numele (i eventual iniializatorul, dac exist). De
exemplu:

enum{a,b,c=0};
enum{d,e,f=e+2};

definetea,c,dcuvaloarea0,biecuvaloarea1ifcu3.
Fiecare enumerator definete un tip ntreg diferit de toate celelalte tipuri ntregi.
Tipulunuienumeratoresteenumerareasa.
Tipurilerealedistinctesunt:float,doubleilongdouble.Caracteristicilelorsunt
precizatenfiierulantet<float.h>.

Tip sizeof (n Aliniere (multiplu de, n


octei) octei)
float 4 4
double 8 4sau8
long 12sau16 4,8sau16
double

Tipulvoidaredomeniulvalorilorvid.Estefolositpentruaprecizatipulrezultatului
ntors de funciile cu semantic de procedur. Nu se declar obiecte de tip void;
orice expresie se poate converti explicit la tipul void, iar rezultatul conversiei se
poatefolosinumaipepostde:instruciuneexpresie,operandstng,expresievirgul
saualtreileaoperanddinexpresiacondiionalconstruitcuoperatorul?:.

iruri de caractere
Tipulirdecaractere(numitistring)arecavaloareunirdecaractereculungimea
variabil (modificabil dinamic). Lungimea irului de caractere este numrul de
caractereconinutnel.Caracterelecarepotconstituiirulsunt,deobicei,celedin
setul de caractere acceptat de limbaj. Operaiile care se pot efectua cu iruri de
caracteresunt:construirea,inserareaunuiirdecaracterenaltul,extragereaunui
subir, tergerea unui subir, cutarea unui subir, concatenarea a dou iruri de
caractere.
Acest tip de date sa impus din cel puin dou motive: imposibilitatea accesrii
globaleaunuitabloudecaractereprecumirigiditateautilizriitablourilorstatice
(de dimensiune fixat). Astfel, pentru tipul tablou sunt definite doar operaiile de
atribuire i test de egalitate; pentru tipul ir de caractere sunt necesare n plus
operaiiledeintrare/ieireicelespecificatemaisus.Prinacesteoperaii,lungimea
irului de caractere se poate modifica, prin urmare o reprezentare fix (pe numr
prestabilitdecaractere)nuesteadecvat.

60
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

nCsefoloseteurmtoareaconveniepentrureprezentareairurilordecaractere:
unirdencaracteresereprezintpen+1octei,numerotaidela0lan,astfel:
octetuli(dela0lan1)conineali+1leacaracterdinirulconsiderat
octetul n conine un caracter terminator de ir: caracterul NULL (\0) din
ASCII;rezultcacestcaracternupoatefacepartenCdintrunirdecaractere.
Includerea ntrun limbaj de programare a unor operaii specifice prelucrrii
irurilordecaracterepresupuneurmtoarele:
existenatipuluidedateirdecaractere(string);
prelungireautilizriioperatorilorrelaionalipeiruridecaractere;
stabilireauneireprezentripentruiruriledecaractere;
stabilireauneimulimiminimaledeoperaiipeiruridecaractere.
nC,C++tipulirdecaracterenuestepredefinit.Tratareairurilordecaracterese
poatefacefolosinddeclaraiadetablou:

char[n](sauchar[])

Indiciiacestortablourincepcu0,iarreprezentareasefacenconveniaC.
Pentru a prelucra iruri de caractere folosim funcii din biblioteca standard C:
strcpy,strcmp,strstr,strchr,strlenetc.

Tipul pointer
Tipuldedatepointeraredomeniulformatdinadreselealtorentiti(reprezentabile
nmemorie)dintrunprogram.Lucrulcupointeripermitecreareaiutilizareaunor
structuridedatecomplexe,darfolosirealuingreuneaznelegereaunuiprogram,
putnd genera erori deosebit de greu de detectat. n general, adresa unei entiti
este caracterizat de dou informaii: adresa segmentului de memorie n care se
gseteentitateaideplasamentulacesteiansegment(distanafadenceputul
acestuia).
Exist dou tipuri de pointeri: cu tip i fr tip. Pointerii cu tip conin adrese de
entiti deacelaitip,fiind integrain sistemele de tipuri. Pointerii fr tiprefer
oriceentitatedememorie,indiferentdetipulacesteia.
Variabilele pointer constituie o alternativ de accesare a entitilor din memoria
unuiprogram,prinintermediulunuiaanumitmecanismdeindirectare.Unpointer
care nu refer nimic are valoarea echivalent cu 0 (pointer null); n caz contrar,
valoarea sa este adresa entitii respective, iar informaia de tip al pointerului
exprimitipulentitiireferitedepointer.
Uzual,odeclaraiedetippointerspecific,printrunconstructordetip:
numelenouluitippointer(opional);
numeletipuluireferitdepointer(obligatoriu).
ncazulcndentitateaesteovariabil,pointerularecavaloareadresaacesteiadin
memorie.ncazulvariabileloralocatenmemoriadinamic,acesteanuauunnume

61
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

explicit (se i numesc variabile anonime), ele putnduse referi numai prin
intermediul unui pointer asociat: alocarea i dealocarea lor se vor face cu operaii
specificedealocare,respectivdedealocare,aplicatepointerului.Operaiilespecifice
pentru pointeri sunt atribuirea i dereferenierea (indirectarea, referirea entitii
punctate de pointer). Unele limbaje posed i operaii aritmetice (adunare i
scdere)cuoperanzipointerii/sauntregi.
Pointerii asigur flexibilitatea n execuia unui program, ns trebuie gestionai cu
atenie. Programatorul controleaz durata de via a variabilelor i i gestioneaz
singuroanumitparteamemorieicalculatorului.Aceastafacepartedinlibertile
democratice pe care le are programatorul n lumea democrat a informaticii.
Practica a artat ns c nu sunt puine situaiile cnd libertile greit nelese se
ntorc mpotriva aceluia care beneficiaz de ele. Apare de multe ori problema
referinelorambigue,careapareatuncicndsefoloseteunpointeracruivaloare
refercevacenumaiestealocatnmemorie.
Osoluielagestionareamemorieidinamiceestegarbagecollectorcarecolecteaz
toatelocaiilecarenumaisuntreferiteileelibereaz.
Pointeriiauurmtoareleavantaje:
libertatea oferit programatorului n controlarea duratei de via a
variabilelor;
flexibilitatea sporit a programelor realizate, prin folosirea structurilor de
datedinamice;
actualizarea selectiv a structurilor complexe, fr recopierea ntregii
structuri;
compactitateacoduluiscrisprinfolosireapointerilorlafuncii.
n lipsa unei riguroase discipline n programare, utilizarea pointerilor poate fi un
comar,eroriletipicefiind:
ncercarea de a accesa o entitate printrun poitner nainte de iniializarea
pointeruluiceorefer,lucruceconducelaerorideexecuie;
ncercarea de a accesa o locaie dup ce aceasta a fost eliberat, lucru ce
conducelarezultateimprevizibilenexecuie.
C++motenetedelalimbajulCabilitideosebitendeclarareailucrulcutipurile
pointer.nplusfadeC,C++introduceitipulreferindesprecarenuvomdiscuta
aici.
Un tip pointer la tipul T se precizeaz printro declaraie T*. Uzual, stilul de
programare C nu recurge la nume proprii pentru tipurile de date pointer; sintaxa
limbajului este deosebit de flexibil n a permite declararea de tipuri pointer la
tipuri de date complexe. Prin urmare, astfel de tipuri de date pointer anonime se
folosescfrecventndeclaraiile(idefiniiile)devariabilesauparametriformali.Am
prezentatdejaexemplededeclaraiidevariabiledetippointer.
(Nusepotdeclarapointerilareferineipointerilairuridebii.)

Operaiileasupratipurilorpointersunt:

62
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

*(indirectarea)*parecarezultatobiectuldetipTreferitdepdacpestede
tipulpointerlaT.
&(adresalui)&parecarezultatobiectuldetippointerlaT(Tfiindtipullui
p)carereferpep,decicualtecuvinte,adresaluip.
++,incrementareaidecrementareavalorilordetipadres.
Operaiidecomparare
Operatorii new i delete (doar n C++) pentru alocarea i eliberarea
variabilelordinamicereferitedepointeri.

Limbajul posed numai semantica apelului prin valoare pentru transmiterea


parametrilor actuali ai funciilor. Apelul prin referin se poate simula folosind
explicit pointerii. De multe ori este suficient prima metod de transmitere prin
valoare,maialespentrutipurilefundamentalealelimbajului. Eapoatedevenins
neconvenabil pentru parametri de tipuri de date utilizator de dimensiune mare.
(Observaie:oinconsistensemanticalimbajuluiCestectablourilesetransmit
ntotdeauna prin referin) i devine un impediment serios n calea definirii unei
notaiiconvenionalepentrutipdedateutilizatordinC++.

Tipuri procedurale
Un tip procedural este un tip de date cu domeniul format din mulimea tuturor
procedurilorsaufunciilorcerespectunanumitablon,definitncadruldeclarrii
tipuluiproceduralncauz.
Uzual, o declaraie de tip procedural specific, printrun constructor de tip un aa
numitablon(pattern)ceconine:
Numelenouluitipprocedural(opional);
Tipul i numele (nume care sunt ns fr semnificaie n contextul
declarrii) eventualilor parametri formali ai procedurilor sau funciilor ce vor
respectaablonul;
Tipulrezultatuluintors(dacevorbadesprefuncii).
O variabil procedural are i ea un nume, un tip i o valoare. Tipul variabilei
conine informaia ce servete la verificarea consistenei folosirii ei (tipul
argumentelor i, eventual tipul rezultatului ntors), iar valoarea unei variabile
procedurale este de fapt adresa codului proceduriin cauz n cadrul programului
executabil.Valorilecesepotatribuincursulexecuieiunuiprogramuneivariabile
de tip procedural sunt (sintactic vorbind) numele procedurilor/funciilor ce sunt
declarate n acel program sau numele procedurilor/funciilor externe de tip
compatibilcutipulproceduralalvariabileicareesteiniializat.Acestenumejoac
aadar rolul unor constante relativ la tipul procedural respectiv. Invocarea unei
variabiledetipprocedural(folosindparametricorespunztori)arecaefectapelarea
procedurii/funcieireferitedeaceasta.

63
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

n limbajul C un nou tip se declar prin prefixarea unei declaraii de variabil cu
cuvntulrezervattypedef,numelevariabileidevenindnumedetip.Aadar,ncazul
definiriidetipurifuncionalevomaveaformageneral:

typedef<declaraie_de_funcie>

Exemple:
typedefvoidffp();//definiiedetip
ffppfp;//definiiedevariabil
typedefvoidfpr(floata,floatb,floatc);
typedeffloatfreal(floatx);
typedeffloatffunc(floatp1,floatp2,frealf);

n limbajul C numele unei funcii este evaluat n cadrul programelor la adresa de


nceput a funciei n cadrul codului compilat, deci variabila pfp de mai sus va
reprezenta o cantitate de tip adres compatibil cu orice valoare reprezentnd
numeleuneifunciifrparametriidetipvoid.
Adresa unei funcii se obine deci prin simpla specificare a numelui funciei fr
parantezeiaceastadrespoatefiatribuitunuipointerdefunciecurezultati
parametricompatibili.Pointerulpoatefifolositapoipentruapelulfunciei:

intf(int,char);//declaraiafuncieif
int(*pf)(int,char);/*sedeclarpfcapointerlafunciededouargumente(intichar)centoarce
unntreg*/
inti,j;charc;

pf=f;//atribuiredeadrese
j=(*pf)(i,c);//apelulfuncieiffolosindpf

Limbajul C cere ca la apelul unei funcii chiar i fr parametri s fie utilizate


parantezelerotunde.Sepotscrieurmtoarelesecvene:

if(f1()!=f()){}//testasupravalorilorreturnate
sau
if(f1!=f){}//testasupravaloarilorprocedurale

Tipul ntors i tipurile argumentelor sunt considerate parte a tipului funciei;


argumentele implicite nu. Funciile nu pot ntoarce tablouri de funcii, dar pot
ntoarcepointerilaastfeldeobiecte.Nuexisttablouridefuncii,darexisttablouri
depointerilafuncii.

Tipuri structurate
Limbajele de programare dispun de modaliti de agregare a datelor care permit
apoi tratarea global a acestora. Este vorba n general de date care corespund
nivelului de abstractizare al limbajului, deci care nu au corespondent direct n

64
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

tipurile main. Pentru ca aceste date definite de utilizator conform nevoilor sale
concretespoatfiintegratenmecanismuldetipuriallimbajului,acestadinurm
puneladispoziiaprogramatoruluiconstructoriidetipuri.nparagrafeleprecedente
am discutat despre dou clase de tipuri construite prin asemenea constructori:
pointeriiitipurileprocedurale.
Spredeosebiredetipurilesimplecaresuntatomice,indivizibile,datelestructurate
(compuse, agregate) se descompun n componente sau elemente, fiecare de un tip
precizat (simplu sau structurat). O dat structurat poate fi accesat fie ca ntreg
(global),fiepecomponente.Structurauneidatestabileterelaiilecareexistntre
componenteleacesteia.
Existpatrulegturistructuralefundamentale:
Mulime(niciolegturntrecomponente);
Liniar(legtur1:1);
Arbore(legtur1:n);
Graf(legturm:n)
Dinpunctuldevederealuniformitiistructurale,datelestructuratesempartn:
Omogene(toatecomponenteleauacelaitip);tipurilededateaferentesunt
numitetablou(engl.array)imulime(engl.set);
Heterogene(elementeleuneidateaudeobiceicomponentediferitedetip);
eleaparintipuluidedatenregistrare(engl.record).
Tablourile i nregistrrile au o structur liniar: exist o prim i o ultim
component, iar toate celelalte au fiecare att predecesor, ct i succesor. Prin
urmare, un element al tabloului sau un cmp al nregistrrilor se pot localiza. Un
tablou este un agregat de elemente de acelai tip, un element fiind localizat prin
poziia pe care o ocup n cadrul acestuia (indicele elementului de tablou) iar o
nregistrare este un agregat care grupeaz de obicei elemente de tipuri diferite
numitecmpuriilocalizateprinnumelelor.Mulimeaesteostructuramorf:ea
conine elemente de acelai tip, care ns nu pot fi localizate explicit, neexistnd
informaiadeapartenenaunuielementlaea.nlimbajulCnuexistsuportpentru
tipulmulime,existnsaltelimbajecumestePascal,ncaresepoatefolositipul
mulime.
Pentru tipurile structurate, exist dou operaii de baz: construirea i selectarea
componentelor. Operaia de construire a unei variabile de tip structurat se face
dupregulilepropriifiecruilimbaj.Pentrutablouriinregistrriexistioperaia
deselectareauneicomponente,careesterealizatnmanierediferite.
ncazulunuitablou,selectareaunuielementsefacepebazauneiexpresiideindice,
ataat numelui variabilei tablou. Pe baza expresiei de indice i a informaiilor
despretablouseefectueazcalcululadreseielementuluincauz.Expresiadeindice
nu se poate evalua la compilare (ea conine de regul identificatorii), valoarea ei
fiindobinutlaexecuie.
Domeniul de vizibilitate al numelor cmpuriloruneinregistrri ncepe cu punctul
lordedeclarareiseterminlasfrituldeclaraieitipuluinregistrare.Selectarea

65
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

unei componente (cmp) se face pe baza unei expresii de selectare, care conine
numele cmpului calificat cu numele variabilei nregistrare. n acest caz, adresa
relativacmpuluincauzsepoatedeterminalacompilare.

Tipul tablou
Elementeledefinitoriialetipuluidedatetablousunt:
Numele(opional)
Listadimensiunilor
Tipulelementuluidetablou
Domeniulpentrumulimeaindicilor
Numele unui tip tablou este un identificator, construit pe baza regulilor proprii
fiecrui limbaj. Lista dimensiunilor precizeaz numrul de dimensiuni al tabloului
respectiv, existnd restricii de la limbaj la limbaj privind numrul maxim de
dimensiuni permis. Tipul elementului de tablou definete natura acestui element,
preciznd reprezentarea lui,iardomeniulpentrumulimeaindicilorestedeobicei
detipsubdomeniu.
Criteriiledeclasificareatablourilorsunt:
Numruldedimensiuni
Tipulelementului(carepoateinduceoperaiispecifice)
Momentulalocrii
Posibilitatearedimensionrii
Dinpunctuldevederealnumruluidedimensiuni:
Tablourimonodimensionale(vectori)
Tablouribidimensionale(matrici)
Tablouritridimensionale
ngeneral,tablouriddimensionale
Din punctul de vedere al momentului alocrii, exist dou categorii de tablouri:
statice i dinamice. Tablourile statice se aloc la compilare (sau cel puin trebuie
cunoscute dimensiunile la compilare). Pentru tablourile dinamice, dimensiunile
acestorasedeterminabialaexecuie.Ocategoriespecialdetablouridinamiceo
reprezinttablourileflexibile,caresepotredimensionantimpulexecuiei.
Referirealaunelementaltablouluisefaceprinprecizareanumeluitablouluiurmat
deoexpresiedeindice.Expresiadeindiceconine,nparantezerotundesaudrepte
(n C) valorile efective ale indicilor tabloului. Exist dou modaliti de referire:
punctualidesubtablouri.Ambelemodalitisebazeazpecalcululdeadres.
Calcululdeadresrealizeaz,pentruoexpresiedeindicedat,determinarealocaiei
de memorie (a adresei) ce conine elementul de tablou referit. Deoarece memoria
calculatoruluipoateficonsideratcatabloumonodimensionaldelocaiiadresabile,
problemacalcululuideadressereduceladeterminarea,pebazainformaieiasupra
indiciloriasupratablouluingeneral,aunuinumrcereprezintadresacutat.

66
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Pentrufiecaretabloudeclarat,sememoreazndescriptoruldetablouurmtoarele
informaii:
numenumeletabloului
tiptipulelementuluidetablou
lunglungimeareprezentriiunuielementdetablou(nunitidealocare)
adrsadresadeundencepememorareatabloului
nrdnumruldedimensiunialtabloului
pentrufiecaredimensiune,limiteleliiilsi(1<=i<=nrd).
Sepresupunectablouluiisealoclocaiiconsecutivedememorie,decielocupo
zon compact. Fiecare element de tablou va ocupa, n zona respectiv, o locaie
unicdeterminat.Existdoumodalitidememorareaunuitablou:
pelinii(cndultimulindicevariazmairepede)
pecoloane(cndprimulindicevariazmairepede)
Notnd cu loc o funcie ce ntoarce adresa locaiei de memorie a unei referine de
tablou, pentru dou tablouri A(li:ls) i B(li1:ls1, li2:ls2), calculele de adres se scriu
astfel:

loc(A(i))=adrs+(ili)*lung
sau
loc(A(i))=adrsli*lung+i*lung

Memorareapelinii:
Toateelementeleliniiloranterioarelinieiiplusprimelej1elementealelinieii
loc(B(i,j))=adrs+(ili1)*(ls2li2+1)*lung+(jli2)*lung
sau
loc(B(i,j))=adrsli1*(ls2li2+1)*lungli2*lung+ (constant)
+j*lung+i*(ls2li2+1)*lung

Memorareapecoloane:
Toate elementele coloanelor anterioare coloanei j plus primele i1 elemente ale
coloaneij
loc(B(i,j))=adrs+(jli2)*(ls1li1+1)*lung+(ili1)*lung
sau
loc(B(i,j))=adrsli2*(ls1li1+1)*lungli1*lung+ (constant)
+i*lung+j*(ls1li1+1)*lung

n expresiile de mai sus, ultimele relaii corespund unor calcule optime de adres,
pringruparealanceputatermenilorconstani(termeniicenuconinindiciiiijca
factori).
Elementelecetrebuietratatecndsediscutprezenatipuluitablounlimbajelede
programaresunt:

67
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

regulile sintactice de definire a tablourilor i de referire a elementelor
acestora;
familiadetipuridedatecepotficonsideratecaelementedetablou;
familiadetipuridedatecepotfiutilizatecaindicidetablou;
cndtrebuiecunoscutedomeniileindicilor:lacompilaresaulaexecuie;
numrul maxim de dimensiuni permis (care este legat de complexitatea
calcululuiadreseiunuielement);
posibilitatearefeririilasubtablourileunuitabloudat;
cumsefaceiniializareatabloului;
operaiilepredefinitepetablouri.

Tipul de date nregistrare


Elementeledefinitoriialeuneinregistrrisunt:
numeleitipulnregistrrii;
numruldecmpuri;
numeleitipulfiecruicmp.
nregistrareaesteomodalitatedeagregare(punerempreunaunordatedetipuri
n general diferite). Numele tipului de dat nregistrare este un identificator.
Numruldecmpuriestededusdinlistadedeclarareacmpurilor.Cmpurileunei
nregistrri se memoreaz n zone adiacente de memorie. Informaia de tip a
fiecruicmpservetelastabilirealungimiidereprezentareaacestuia,iarnumele
cmpului se folosete pentru a accesa valoarea lui (prin operaia de selectare). De
obicei, sunt accesibile att data compus (nregistrarea), ct i componentele
(cmpurile)acesteia.
nCavemdoutipuridenregistrri:structurilecareauostructurfixiuniunile
unfeldenregistrarecustructurvariabil.
Elementelecetrebuieavutenvederecndsediscutdesprenregistrrisunt:
manieradedeclarare;
manieradeaccesareacmpuriloracestora;
iniializarea;
operaiilepermisepentruvariabileledetipnregistrare.
nregistrrile sunt precursorii claselor. Clasa este un concept fundamental n
programareaorientatpeobiecte.
LimbajulCnepermitedeclarareadetipurinregistrare(struct)iuniuni(union).
Sintaxapentrudeclarareauneistructurieste:

struct[nume]{[tipnume_var];

}[variabile];

68
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Dei numele asociat structurii i variabilele de structur declarate sunt elemente
opionaletrebuiesaparmcarunadinceledou.
Exemplu:

struct{charnume[30];
intvarsta;floatgr;}cineva;

declarvariabilacinevacafiindostructurcegrupeaztreitipurideinformaii.
Pentru a se putea declara mai multe variabile de aceeai structur exist dou
posibiliti:

atribuireaunuinumepentruansamblulcmpurilorstructurii:
structpersoana{charnume[30];
intvarsta;floatgr;};
structpersoanacineva,altcineva[20];
structpersoanaNoi[],*Voi[];
definireaunuinumedetippentruspecificaiastructurii:
typedefstruct{charnume[30];
intvarsta;floatgr;}persoana;
persoanacineva,altcineva[20];

Operaiilepermiseasuprastructurilorsunt:
selectareaunuicmp(prinoperatorul.);
obinereaadreseiuneistructuri(prin&);
determinarealungimiiuneistructuri(prinsizeof);
atribuireauneistructuri(prin=).
Exemplu:
structpers{inta;charb;}p1,p2={2,b};//iniializare

p1=p2;//atribuiredestructuri

Notaiaps>campesteechivalentcu(*ps).camp.
Deexemplu:
struct
{
intx;
int*y
}*p;

declarpcafiindpointerlaostructurformatdindoucmpuri:unntregiun
pointerlantreg.Atunci,inndcontideprioritateaoperatorilor,vomavea:
++p>xincrementeazpex,operatorul>avndprioritatemaimaredect++;
(++p)>x incrementeaz mai nti pe p i apoi acceseaz elementul x din
structuranoupointat;
(p++)>xseacceseazntixapoiseincrementeazp;

69
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

*p>yindicconinutuladreseipointatdey;
*p>y++acceseaznticeeacepointeazyiapoiincrementeazy;
(*p>y)++incrementeazceeacepointeazy;
*p++>yacceseazceeacepointeazyiapoiincrementeazpointerulp.

Uniunile permit utilizarea n comun a unei zone de memorie de ctre mai multe
obiecte(numitemembri)detipuridiferiteiaresintaxa:

unionnume_uniune{[tipnume_var]}[decl_variabile];

Exemplu:
unionamestec{inti;floatf;char*psir;}X;

semnificfaptulcvaribilaXpoateconinenaceeaiariedememoriefientreguli,
fierealulf,fiepointerulpsir.ConinutulzoneidememoriealocatpentruvaribilaX
(delungimeegalcudimensiuneadereprezentareaceleimailungivariante)vafi
interpretatfiecantreg,fiecareal,fiecapointerlacaracter,nfunciedecmpul
selectat.Coninuturilecmpurilorseacceseazcalastructuri:

X.int X.f X.psir

Avndnvederespaiulcomuntuturorvariantelor,atribuireaunuiadintrecmpuri
vaafectaimplicitivaloareacelorlalte.ntreagarspundereacontroluluiuniunilor
revine programatorului. O uniune este o structur n care toi membri au
deplasamentul zero, structura fiind suficient de mare pentru a putea pstra pe cel
maimaremembru.

Tipuri definite de utilizator


POO

70
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

6. Expresii

Expresiile sunt elementele de baz prin care se precizeaz calculele. Din punct de
vederesintactic,expresiaesteosecvendeoperanziioperatori,careexprimun
proces de calcul. O expresie poate avea o valoare, determinat prin procesul de
evaluare. n decursul evalurii exist posibilitatea modificrii i altor valori din
contextulevalurii,fenomenedenumiteefectesecundare(engl.sideeffects).
ncontinuarevomprezenta:
Notaiilefolositepentruexpresii;
Domeniuldevizibilitateaalnumelor;
Stabilireatipului(conversii);
Evaluareaexpresiilor.

Generaliti
Sintaxa unei expresii
O expresie este format din operanzi i operatori. ntre criteriile de clasificare a
expresiilorenumerm:
Numruldeoperanzi;
Poziiaoperatoruluinraportcuoperanzii;
Tipulrezultatului;
Semantic.
DefiniiaexpresieinC.

Operatori
nfunciedenumruldeoperanzi,expresiileseclasificn:
Expresiiunareunsinguroperand;
Expresiibinaredoioperanzi;
Narenoperanzi.
Numrul de operanzi necesar este o caracteristic a unui operator i se numete
aritatearespectivuluioperator.Existoperatoricuaritateafixatioperatoricare
au aritatea variabil. De exemplu, n Lisp, operatorul + poate avea unui, doi sau
maimulioperanzi.
Duppoziiaoperatorilornraportcuoperanzii,expresiileseclasificn:
Expresiiinfixoperatorulsepunentreoperanzi;
Expresiiprefixoperatorulsepunenainteaoperanzilor;
Expresiipostfixoperatorulsepunedupoperanzi.
Pentru cazul operatorilor binari, expresiile binare formate cu operatorul op i
operanziiE1iE2sescriuastfel:

71
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Notaiainfix:E1opE2
Notaiaprefix:opE1E2
Notaiapostfix:E1E2op
De exemplu, dac operatorul op este cel de adunare, adic +, iar operanzii sunt
douexpresiisimple(variabile),notatecuxiy,atunciexpresiacaredenotsuma
acestorasescrie:
Notaiainfix:x+y
Notaiaprefix:+xy
Notaiapostfix:xy+

Analog,oexpresiescrismatematicnforma(x+y)*zsevatranscrieastfel:
Notaiainfix:(x+y)*z
Notaiaprefix:*+xyz
Notaiapostfix:xy+z*

nnotaiainfix(notaieuzualnmatematic),unoperandEsepoateincludentre
paranteze,nforma(E)pentruclaritateaexprimrii;valoarealuinusemodificn
prezenaparantezelor.nnotaiaprefixipostfixnumaisuntnecesareparantezele,
deoareceoperanziifiecruioperatorsepotdeterminaframbiguiti.
Regulilenotaieiprefixsunt:
Pentrufiecareoperatorsecunoatearitatealui;
Notaiaprefixpentruoconstantsauvariabilesteconstantasauvariabilan
cauz;
Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia
prefixnformaopE1E2.
Aplicareaoperatoruluinar(dearitaten>=0)opnlasubexpresiileE1,E2,,En
sescriennotaieprefixcaopnE1E2En.

Dacsenlturprimaregulatuncicelelaltedouregulideconstruireaexpresiilor
semodific:estenecesarprezenaparantezelorpentruadelimitaoexpresie,deci
expresiileconstruitevoraveaforma:(opE1E2)respectiv(opnE1E2En).
Regulilenotaieiinfixsunt:
Pentrufiecareoperatorsecunoatearitatealui;
Notaiapostfixpentruoconstantsauvariabilesteconstantasauvariabila
ncauz;
Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia
postfixnformaE1E2op.
Aplicareaoperatoruluinarar(dearitaten>=0)opnlasubexpresiileE1,E2,,
EnsescriennotaieprefixcaE1E2Enopn

72
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Precedena operatorilor
Rezolvareaambiguitilorncazulnotaieiinfixsefaceprindoureguli,privind:
Precedenaoperatorilor;
Asociativitateaoperatorilor(pentruoperatoriicuaceeaipreceden).
Acesteambiguitiapardeobiceilaexpresiilearitmetice,lacareoperatoriibinarise
grupeaz pe trei niveluri de preceden (prioritate), prezentai n continuare n
ordineadescresctoareaprioritii:
Operatorulridicarelaputere(^prezentnunelelimbaje);
Operatoriimultiplicativi(*,/i%)
Operatoriiaditivi(+i).
Fiecarecategoriedeoperatoriarepreceden(prioritate)maimaredectceicare
urmeazdupea.
Astfel,expresia:a+b*csevaevaluacaa+(b*c),iara*b+csevaevaluaca(a*b)
+c(parantezeleindicordineancareseefectueazaplicareaoperatorilor).
n exemplele de mai sus sa folosit numai precedena operatorilor. Dac ntro
expresieaparedemaimulteoriacelaioperatorsauoperatoricuaceeaiprioritate,
acioneazaldoileagrupderegulicarestabileteasociativitateaoperatorilor.Exist
doutipurideasociativitate:lastngailadreapta.
Unoperatoresteasociativlastngadacsubexpresiilecareconinapariiimultiple
aleluisegrupeazdelastngaladreapta.Astfel,sumaa+b+cesteinterpretatca
(a+b)+c,deciprimadatseefectueazsumaa+biarapoirezultatulsevaadunala
valoarealuic.
Unoperatoresteasociativladreaptadacsubexpresiilecareconinapariiimultiple
aleluisegrupeazdeladreaptalastnga.Astfel,expresiaa=b=cesteinterpretat
caa=(b=c).
Asociativitatea operatorilor se aplic doar n situaia cnd acetia au aceeai
prioritate.
Majoritatea limbajelor de programare posed astfel de reguli de preceden i
asociativitate.
LimbajeleCiC++posedceamaimarecoleciedeoperatori.
ProritateaiasociativitateaoperatorilornlimbajulC:
Operatorul Descriere Asociativitat
e
1. () Apeldefuncie de la stnga
[] Accesareelementtablou ladreapta
> Selectare membru structur prin
. pointer
Selectaremembrustructurdirect
2. ! Negarelogic de la dreapta
Unari ~ Complementpebii lastnga
++ Preincrementare sau
postincrementare
+ Predecrementare sau
postdecrementare

73
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

* Plusunar
& Minusunar
(tip) Indirectare
sizeof Adres
Cast
Returneazdimensiuneaoperandului
3. * nmulire de la stnga
Multiplicativi / mprire ladreapta
% Rest
4. + Plusbinar de la stnga
Aditivi Minusbinar ladreapta
5. << Deplasarelastnga de la stnga
Deplasare >> Deplasareladreapta ladreapta
6. < Maimic de la stnga
Relaionali <= Maimicsauegal ladreapta
> Maimare
>= Maimaresauegal
7. == Egal de la stnga
Egalitate != Diferit ladreapta
8. & Ipebii de la stnga
ladreapta
9. ^ XORpebii de la stnga
ladreapta
10. | SAUpebii de la stnga
ladreapta
11. && Ilogic de la stnga
ladreapta
12. || SAUlogic de la stnga
ladreapta
13. ?: a?x:y(ifathenxelsey) de la dreapta
Condiional lastnga
14. =+== de la dreapta
Atribuire *=/=%=&= lastnga
^=|=
<<=>>=
15.Virgul , de la stg. la
dr.

Arborele unei expresii


O expresie este format din operatori i operanzi. Structura expresiei ilustreaz,
pentrufiecareoperator, operanzii lacareacestase aplic.nexempleleanterioare
de expresii infix, structura expresiei sa precizat, pentru claritate, prin folosirea
parantezelor rotunde. Se observ c structura expresiei este independent de
manieraeidenotare(infix,prefixsaupostfix).
O manieralternativ de ilustrare a structurii unei expresiifolosete arborii nari.
ntrun astfel de arbore, numit arbore sintactic al expresiei, nodurile reprezint

74
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

operatorii,iarsubarboriireprezintoperanzii.Constanteleivariabilele(expresiile
simple)suntfrunzele(nodurileterminale)aleunuiastfeldearbore.
Pentruunoperatoropndearitaten>=0,expresieiconstruitcuel,caresescrieopn
E1 E2En (n notaie prefix), respectiv E1 E2En opn (n notaie postfix) i va
corespundearborele:

De exemplu, pentru expresia (a + b) * (c * d * e 4 / f) arborele sintactic este un


arborebinar(toioperatoriiauaritatea2)deforma:

Arborii de sintax sunt abstraci, reprezentarea lor fiind aceeai, independent de


notaiafolositpentruexpresie.nfapt,denumireanotaiei(infix,prefixsaupostfix)
provinedelamanieradeparcurgere(vizitare)anodurilorarborelui:
Prefix(rccin,subarboridelastngaladreapta):*+ab**cde/4f
Afix (subarbore stng, rdcin, subarbore drept; numai pentru arbori
binari):a+b*c*d*e4/f
Postfix(subarboridelastngaladreapta,rdcin):ab+cd*e*4f/*

Clase de operatori i de expresii (dup tipul rezultatului)


n funcie de natura operaiilor pe care le semnific, operatorii se pot clasifica n
urmtoarelecategorii:
Aritmetici
Relaionali
Logici
Pemulimi
Peiruridecaractere

75
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Peiruridebii
Pepointeri
Operatoruldedeterminareadomeniuluidevizibilitate(engl.scoperesolution
operator)
Conversieexplicit
Atribuire
Condiional
Operatorulvirgul.
Tipul expresiei se stabilete pe baza tipurilor operanzilor i operatorilor ce
formeazexpresia.

Operatori aritmetici
Operatorii aritmetici se folosesc la construirea expresiilor aritmetice. Operanzii
unor asemenea expresii trebuie s fie de tipuri numerice, iar rezultatul evalurii
expresieiestetotdetipnumeric.Fiecarelimbajposedpropriileregulideefectuare
acalculeloridestabilireatipuluirezultatului.

Operatori relaionali
Operatorii relaionali se aplic unor operanzi de tipuri variate, producnd un
rezultatBoolean.nCnuexisttipulboolean.Oricevaloarentreagdiferitdezero
este tratat ca true i valoarea ntreag zero este tratat ca false. Operatorii
relaionalisunt:<,>,<=,>=,==(egalitate),!=(inegalitate).

Operatori logici
Operatorii logici au de regul operanzi de tip boolean i ntorc un rezultat de tip
boolean.
Operatorii logici n C sunt: && (i logic), || (sau logic), ! (negaie logic operator
unar).Opereazasupraunorntregiiarrezultatulestezero(false)sauunu(true).

Operatori pe mulimi
Operatorii pe mulimi au operanzi de tip mulime i ntorc un rezultat de tip
mulime.Acetioperatoriexistdoarnlimbajelecesuporttipulmulime.Limbajul
Cnusuportacesttipdedate.

76
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Operatori pe iruri de caractere
Limbajeledeprogramarecareautipuldedateirdecaractere(string)furnizeazi
operatori pentru lucrul cu iruri de caractere (de exemplu operatorul + pentru
concatenareaadouiruri)
n limbajul C nu exist de date special pentru iruri de caractere, oferinduse n
schimb posibilitatea folosirii tablourilor unidimensionale de caractere pentru
memorarea irurilor. Din aceast cauz nu sunt disponibili nici operatori pentru
iruri.BibliotecastandardCconineunsetdefunciidedicateoperaiilorcuiruri,
declarate n fiierul <string.h>. strcpy (pentru copiere de iruri), strcat (pentru
concatenaredeiruri),strcmp(pentrucomparareaadouiruri)etc.

Operatori pe iruri de bii


Acetia sunt operatori care lucreaz la nivel de reprezentare pe bii, aplicnd
operaiilelogicecunoscutebiilorcorespunztori(capoziiencadrulreprezentrii)
ai operanzilor. Valorile biilor (0 i 1) se consider la aplicarea operaiilor drept
valorideadevr.
Acest tip de operatori este specific mai degrab limbajelor de asamblare dect
limbajelorde nivel nalt, ns datoritorientrii anumitor limbajespre aplicaii de
sistem(nspecialCiC++)eleaufostprevzutecuacestgendeoperaiicarepermit
accesullamemorielaniveldebit.
LimbajeleCiC++dispunde:
1. operatori de deplasare a coninutului unei locaii de memorie spre stnga
(<<)ispredreapta(>>).Astfel,a<<b,undeaibsuntexpresiintregi,
iar b are o valoare ntreag nenegativ, are ca rezultat valoarea obinut
dupdeplasareareprezentriivaloriiacubbiisprestnga.Biiieliberaila
dreapta se completeaz cu zero. Dac tipul este unsigned, deplasarea la
stnga este echivalent cu o nmulire cu 2 la puterea b, urmat de o
trunchierelanumruldebiiaitipului.Prina>>bserealizeazdeplasareala
dreapta.Aicirezultatuloperaieidifernfunciedetipulvalorii(maiprecis
de semnul acesteia): pentru valori unsigned codul binar este deplasat spre
dreaptacubpoziiiiseinsereazntotdeaunalastngabiicuvaloarea0.
Rezultatulestedefaptparteantreagampririila2laputereab;pentru
valorisigned nuseintroducautomatzerouri lastnga cisemultiplic bitul
cel mai semnificativ (bitul de semn). Operaia se numete deplasare
aritmeticspredreaptaiarecaefectconservareasemnului.
2. operatoribooleenipebii(&Ibitcubit,|SAUbitcubit,^SAUEXCLUSIV
bit cu bit, ~ negare bit cu bit). Aceti operatori efectueaz operaiile
specificate asupra unor expresii ntregi. Prin a & b se obine o secven de
biideaceeailungimecuaoperanzilor,ncareunbitarevaloarea1daccei
doibiicorespunztoridinaibsunt1,iarevaloare0ncazcontrar.Prina
|bfiecarebitalrezultatuluiarevaloarea0dacbiiicorespunztoridinaib

77
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

sunt 0, i are valoarea 1 n caz contrar. Operatorul unar ~ aplicat unei
expresii a,schimbnreprezentareavaloriiluiafiecarebit 0n1i fiecare
bit 1 n 0. Din punct de vedere al operrii practice este bine de reinut c
operaiileprezentatesuntutilepentruurmtoarelesituaii:
& permite izolarea valorii unui anumit bit sau forarea unor bii la valoarea
zero.
| permiteforareaunorbiilavaloarea1.
^ permitecomplementareavaloriiunorbiifrativaloarealor.
~ realizeazcomplementareatuturorbiilorvaloriiargumentului.
n general, pentru realizarea unor astfel de scopuri se folosete ca un al doilea
operandomasc(aceastafiindoconfiguraiedebiialeasdeprogramatorntrun
modadecvat).

Conversie explicit i implicit


nCiC++estecelmaibineilustratconceptuldeconversie.
n unele situaii, este nevoie de conversia explicit a valorii unui anumit tip la
valoareaaltuitip.Oconversieexplicitdetipproduceovaloareaunuitippebaza
valoriialtuitip.Astfel:

floatr=float(1);

efectueazconversiantregului1nvaloareanvirgulflotant1.0fnaintedease
efectua operaia de atribuire. Rezultatul unei conversii de tip nu este o lvaloarea,
decinupoatefiatribuit(cuexcepiatipuluireferin).
Existdounotaiipentruconversiaexplicitdetip:notaiaCtradiional,numit
cast,deex.(double)ainotaiafuncionaldouble(a).Ultimanusepoatefolosi
pentrutipuricarenuaunume simplu.Astfel,pentru aconvertiovaloarelauntip
pointeranonim,sevafolosinotaiacast:

char*p=(char*)0777;

sausepoatedefiniunnounumedetipiatuncisepoatefolosinotaiafuncional:

typedefchar*Pchar;
char*p=Pcahr(0777);

O conversie de tip trebuieevitatdac nueste necesar. Programele care folosesc


conversii explicite de tip sunt mai greu de neles dect programele care evit
conversiile prin recurgerea la tipuri pentru a reprezenta concepte de nivel nalt.
Corectitudineaconversiilorexplicite detipdepindenmodcritic demodulncare
programatorulnelegemanierancareobiectelediferitesuntgestionatedelimbaj,
precumidedetaliiledeimplementareacompilatorului.Deexemplu:

78
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

inti=1;
char*pc="asdf";
int*pi=&i;

i=(int)pc;
pc=(char*)i;//pcipoateschimbavaloarea.
//peunelemainisizeof(int)estemaimicdectsizeof(char*)

pi=(int*)pc;
pc=(char*)pi;//pcipoateschimbavaloarea.
//peunelemainiunchar*sereprezintaltfeldectunint*

Peunelemaininuvorfiprobleme,nspealtelepotaparerezultatedezastruoase.
n cel mai bun caz, acest cod este portabil. De obicei este normal (i sigur) s se
presupuncpointeriiladiferitestructuriauaceeaireprezentare.Maimult,orice
pointersepoateatribui(frconversieexplicitdetip)launvoid*,iarunvoid*se
poateconvertiexplicitlaunpointerdeoricetip.
Conversiaimplicitaparecelpuinnurmtoarelesituaii:
laoperaiadeatribuire;
laapelulunuisubprogram,ncadrulprocesuluideevaluareaaparametrilor;
laevaluareauneiexpresiimixte.

Operatorul condiional
LimbajeleCiC++dispundeunoperatorcondiional(?:)caresepoateutilizan
cazurilecndinstruciuniledeexecutatsuntexpresii.Sintaxageneraleste:

expr_logic?expr_adev:expr_fals

echivalentsemanticcu:

if(expr_logic)expr_adev;elseexpr_fals;

Expresia expr_logic trebuie s fie de tip aritmetic sau pointer. Dac evaluarea ei
furnizeazovaloareadiferitdezero,rezultatulexpresieicondiionaleestevaloarea
expresiei expr_adev, n caz contrar fiind valoarea expresiei expr_fals. Eventualele
efecte secundare introduse de evaluarea expresiei expr_logic au loc nainte de
evaluarealuiepxr_adevsauexpr_fals.
Determinarea maximului a dou valoria a i b se poate face prin expresia
codiional:

max=(a>b)?a:b;

79
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Operatorul virgul
nCiC++virgulaesteconsideratoperatorcuurmtoareasemnificaie:osecven
deexpresiideforma
epxr1,expr2,,exprN

reprezinteansioexpresiencareseevalueazsuccesiv,delastngaladreapta
expresiile. Valoarea final atribuit expresiei secven este cea a expresei exprN.
Expresiile componente trebuie s fie atribuiri, incrementri sau decrementri, n
afardeexprNcarepoatefioarecare,deoareceaceastadvaloareantregiisecvene.
Efectele primelor N1 expresii sunt de fapt efectele secundare ale unei astfel de
expresiisecveniale.Deexemplu,dupefectuareaatribuiriidemaijos:

intx=6,y=7,z,w;
w=(z=y+x,y=yx,x=x*yz,x+y+z);

vomobine
x=7;y=1;z=13;w=7;

n listele de parametri actuali sau de iniializatori, operatorul virgul trebuie s


apar n cadrul unei expresii secveniale cuprins ntre paranteze. De exemplu,
apelul

f(a,(b=3,b+4),c);

aretreiparametriactuali,aldoileaavndvaloarea7.

Modaliti de evaluare a expresiilor


Determinareavaloriiuneiexpresiisenumeteevaluare.Ocondiienecesarpentru
evaluare, din punct de vedere matematic, este c ea trebuie s produc o valoare,
dar nu trebuie s altereze mediul. Acest lucru poart numele de transparen
referenial. Denumirea vine de la faptul c orice referire de variabil sau funcie
trebuiesfietransparent,adicefecteleartrebuisfiedoarceleevidentepentruo
accesare, adic ntoarcerea unei valori. Din pcate n lumea limbajelor de
programareimperativelucrurilenustauchiaraa.Dacexpresiaconineunapelde
funcie sau operatori care afecteaz valoarea unor operanzi nainte sau dup
evaluare (cum ar fi de exemplu ++ i din C), exist posibilitatea ca evaluarea
expresieisducilamodificareamediului.Oastfeldemodificaresenumeteefect
secundar(engl.sideeffect)
n general pentru o expresie de forma: operand1 op operand2, evaluarea ei
presupuneevaluareacelordoioperanziiapoiaplicareaoperatoruluiop.

80
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Evaluarea expresiilor aritmetice mixte
n expresiile aritmetice mixte, operanzii sunt att numere ntregi ct i numere
reale.Datoritheterogenitiioperanzilor,existmaimultevariantede evaluarea
acestorexpresii,careconduc,ngeneral,larezultatediferitepentruaceeaiexpresie
iaceleaivalorialeoperanzilor.Prezentmdoudintreacestea:
1. Stabilireaunorreguliclareprivindtipulrezultatuluiuneioperaiinfuncie
de tipul operanzilor (n acest caz tipul rezultatului va fi decis la execuia
ultimei operaii aferent evalurii expresiei), conversiile fcnduse
(eventual)laterminareaevaluriisubexpresiilor.
2. Stabilirea prealabil a tipului rezultatului i apoi conversia automat a
tuturoroperanzilordealttiplatipulexpresiei,indiferentdacprinconversie
lungimea de reprezentare se mrete sau se micoreaz (n acest caz
stabilirea tipului rezultatului poate fi impus de programator sau se poate
faceprinexaminareaexpresieideevaluat).
O modalitate de evitare a posibilelor erori de calcul (care sunt de fapt provocate
numai de necunoaterea conveniilor stabilite) este aceea prin care sunt permise
numai conversiile implicite care nu afecteaz modificarea valorii variabilei (n
sensulpierderiideinformaie),aanumiteleconversiiprinlrgirea(engl.widening)
domeniului(delantreglarealsaudublprecizie,delarealdublprecizie),lrgirea
semnificndaicimrireaspaiuluidereprezentareavariabileirespective.Totodat,
conversiile care implic pierderea de informaie (n sensul c dimensiunea de
reprezentare a destinaiei este mai mic dect a sursei; conversiile respective se
numescconversiiprinngustare,engl.narrowing)nusuntpermiseimplicit,cidoar
prinutilizareaunorfunciispecifice.

Compararea expresiilor de tip pointer


Dou expresii de tip pointer sunt egale dac au ca valoare o aceeai adres de
memorieisuntdiferitencazcontrar.

Evaluarea expresiilor logice


ncazulexpresiilorbooleene(logice),nspecialpentrucazurilecndoperatoruleste
andsauor,esteposibilcasnusecunoascconcomitentvalorileambiloroperanzi.
Deexemplu,expresia:

x!=0||y/x>5

dac x este diferit de zero atunci rezultatul ei este true, indiferent ce valoare de
adevraraveasubexpresiay/x>5.Iarncazulexpresiei:

x!=0&&y/x>5

81
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

dac x este zero atunci rezultatul ei este false, dar dac se ncearc i evaluarea
subexpresiei y/x>5, ctul y/x este nedefinit, prin urmare nu se poate face aceast
evaluare.Dinexempluprezentatrezultposibilitateaevaluriiscurtcircuitncazul
expresiilorlogice,cuefectebeneficeattpentrutimpuldeexecuie(seeliminunele
operaii inutile) ct i pentru fiabilitatea programului (se evit unele situaii de
excepie).Evaluareascurtcircuitsepoatedefiniprindoureguli:
1. fiinddatexpresiae:=xandy,dacx=false,atuncie:=false
2. fiinddatexpresiae:=xory,dacx=true,atuncie:=true
n C++, expresiile care conin operatorii relaionali <, >, <=, >= folosesc
asociativitatealastnga.Definiiaexpresieirelaionaleeste:

expresierelaional::=
expresiededeplasare
expresierelaional>expresiededeplasare
expresierelaional<expresiededeplasare
expresierelaional<=expresiededeplasare
expresierelaional>=expresiededeplasare
Operanziitrebuiesfiedetiparitmeticsaupointer.Operatorii<,>,<=,>=produc
rezultatul 0 dac relaia specificat se evalueaz la false i 1 dac se evalueaz la
true.Tipulrezultatuluiesteint.
Pentru operanzii aritmetici se efectueaz conversiile aritmetice uzuale, iar pentru
operanziipointerseefectueazconversiidepointer.Deaicirezultc:
Oricepointersepoatecomparacuoexpresieconstantceseevalueazla0.
Oricepointersepoatecomparacuunpointerdetipulvoid*(nacestcazse
faceprimadatconversialavoid*).
Pointerii la obiecte sau funcii cu acelai tip (dup efectuarea conversiilor de
pointeri)sepotcompara:rezultatuldepindedepoziiilerelativealeobiectelorsau
funciilorpunctatedepointerinspaiuladreselor.
Reguliledecomparareapointerilorsunt:
1. doipointerilaacelaiobiectsuntegalidinpunctuldevederealcomparrii;
2. cnddoipointeripuncteaz spremembrinonstaticiaiaceluiaiobiect, pot
existaurmtoarelesituaii:
a. Dac cei doi membri sunt separai de o etichet de specificator de
acces i dac clasa obiectelor nu este uniune, atunci pointerul la
ultimul membru declarat (dintre cei doi membri referii) este mai
maredinpunctuldevederealcomparrii.
b. Dac cei doi membri sunt separai de o etichet de specificator de
acces,rezultatulestenedefinit;
c. Dacpointeriipuncteazspremembriaiaceleiaiuniuni,eisuntegali
dinpunctuldevederealcomparrii.

82
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

3. dacdoipointeripuncteazspreelementeleaceluiaitablou,sauunuldintre
eipuncteaz spresfritultabloului,pointerulspreobiectul cuindicelemai
mareestemaimaredectcellalt.
4. celelaltecomparridepointerisuntdependentedeimplementare.
nceeacepriveteexpresiilecareconinoperatorilogici,operanziinutrebuiesfie
de acelai tip, dar trebuie sfie de tiparitmetic sau pointer. Rezultatuleste de tip
int.toateefectelesecundareprovocatedeprimaexpresieaulocnaintedeevaluarea
celeideadoua.

83
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

7. Instruciuniicontrolulexecuiei

Diferiteleoperaiicetrebuieexecutatedeunanumitprogramscrisntrunlimbajde
programare (imperativ) oarecare sunt date sub forma unor instruciuni sau
comenzi. n afara instruciunilor, un program surs mai poate conine declaraii i
eventual,directivedecompilare.nfunciedesemanticalor,instruciunilepotfi:
deatribuire;
deintrareieire;
decontrol.
Instruciunile de intrareieire sunt instruciunile de transfer ntre memorie i
dispozitiveleperiferice.ngeneral,existunniveldevirtualizare,nsensulcnuse
realizeazoperaiiledeintrareieiredirectpesuport,cipefiiere.Acesteoperaii
suntdependentedemain.
Instruciuniledecontrol:execuiaunuiprogramscrisntrunlimbajdeprogramare
imperativnu estealtceva dectun ir de transformri ale valorilorunor locaii de
memorie. Aceast execuie este controlat de mecanisme ale cror rol este de a
determina ordinea de execuie a instruciunilor dintrun program. Aceste
mecanisme se numesc instruciuni de control i, mpreun cu instruciunile de
atribuire,vomdiscutadespreelencontinuare.
Putemclasificainstruciuniledecontrolastfel:
instruciunicondiionale;
instruciunideciclare;
instruciunidelucrucusubprograme(realizeazdoulucruri:declarareade
subprogrameiapelareasubprogramelorinclusivrevenireadinacestapel);
instruciunidetransfer(salt)
Din punctul de vedere al structurrii lor, instruciunile sunt simple i compuse. O
instruciunesimplrealizeazoaciunebineprecizatsemantic,iaroinstruciune
compus este format din mai multe instruciuni simple, grupate mpreun prin
folosireadeobiceiaunorcuvintecheiecuroldedelimitatori(beginendnunele
limabje).

Instruciunea de atribuire
Instruciuneadeatribuireareformageneral:

expridopatrexpr

unde:
exprid esteoexpresiedeidentificare;
opatr esteoperatoruldeatribuire;
expr esteoexpresie.

84
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

De obicei, ntro instruciune de atribuire, numele unei variabile are dubl
identitate: valoare stng (lvaloare engl. leftvalue), cu semnificaie de referin
(adresa zonei de memorie asociat variabilei) i valoare dreapta, rvaloare, cu
semnificaiedevaloare(valoareamemoratnzonarespectivdememorie).
Deexempluninstruciunea

x=x+1;

se face apel la lvaloarea lui x n stnga operatorului = i la rvaloarea lui x n


dreaptaoperatorului=.
n limbajele actuale exist operatori prefix care produc adresa unei variabile
(operatorul@nPascal)sautipuri(tipulreferinnC++).Deexemplu:

inti;
i=5;
int&ri=i;//inC++
ri=7;

Aicivaloareavariabileiisepoatemodificaattobinuit(primainstruciune),cti
prinintermediulreferineiri.Variabileiiiafostasociatvariabiledetipreferinri
aacoricaredinnumeleisaurivordenotaacelaiobiect,decimodificareafcut
nultimalinievaafectavaloareavariabileii.

intv1,v2;/*v1iv2suntdetipint*/
int*pv1,*pv2,*pv3;/*pv1,pv2ipv3suntdetippointerlaint*/

/*situaiainiial*/
v1=5;/*Iniializarealuiv1*/
v2=15;/*Iniializarealuiv2*/
pv1= (int*)malloc(sizeof(int)); /*alocare dinamicde memoriepentruunntreg,iiniializarealui
pv1cuadresaacesteimemorii*/

/*1.iniializareavariabilelordinamice*/
*pv1=v1;/*zonadememoriepointatdepv1esteiniializatatribuiredevalori*/
pv2=&v2;/*iniializareapointeruluipv2atribuiredepointeri*/
pv3=pv1;/*atribuiredepointeri,salvarenecesarpentrudealocareazoneidememoriealocatmai
sus*/

/*2.atribuiredepointeri*/
pv1=pv2;/*pv1vaaveaaceaivaloarecaipv2deci*pv1i*pv2desemneazacelaiobiect,aiciv2
*/

/*3.atribuiredevalori*pv1=*pv2*/
pv1=pv3;/*refacereavariabileidinamicepv1atribuiredepointeri*/
*pv1=*pv2;/**pv1i*pv2auaceeaivaloarefrcapv1ipv2sfieegale*/
/*4.atribuireindirectv1=v2prin*pv1=*pv2*/
pv1=&v1;/*pv1conineadresaluiv1*/

85
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

*pv1=*pv2;/*similarcuv1=v2*/
free(pv3);/*dealocareavariabileidinamicepv3*/

Aadar trebuie fcut distincia ntre atribuirea de valori i atribuirea de adrese.


Pentruascoatenevidensemanticadiferitacelordoutipurideatribuire,unele
limbaje prevd operatori distinci pentru aceste operaii. Dac p i q sunt pointeri
atuncinCiC++
p=qnseamnatribuiredepointeri;
*p=*qnseamnatribuiredevalori;
p>cmp este sintaxa pentru selectarea componentei unei structuri (dac p
estepointerlaostructur).

Instruciunea compus
Instruciuneacompusspecificfaptulcinstruciunilecareocompunseexecutn
aceeai ordine n care apar. Instruciunile componente sunt tratate ca o singur
instruciune, lucru esenial n contextele n care sintaxa limbajului cere o singur
instruciune.
Termenul de instruciune compus este similar, n unele limbaje, celui de bloc.
Deosebirea dintre cele dou noiuni este urmtoarea: instruciunea compus nu
conine declaraii, pe cnd blocul poate conine declaraii. Un bloc poate fi
consideratcaunitateadevizibilitate(declaraiileceaparneldefinescdomeniide
vizibilitatepentrunumelecareaparnele).
nC,C++,termeniideinstruciunecompusiblocsuntidentici.Motivulesteacela
c orice declaraie este considerat instruciune. Delimitatorii folosii pentru
marcarea nceputului i sfritului blocului sunt acoladele, iar instruciunile se
termincupunctivirgul,inclusivultima.
Existlimbajedeprogramarecareposedattblocurictiinstruciunicompusei,
deasemenea,existlimbajecarenuposedinstruciunicompuse:Fortran,Basici
ngenerallimbajelefrstructurdebloc.

Instruciuni condiionale (de ramificare, de selectare)


Instruciunile condiionale (de selectare sau de ramificare) au ca scop alegerea
unuiadintremaimultefluxuridecontrolalprelucrrii(alternativedecontinuarea
execuiei)posibilelaunmomentdat.
Primainstruciunecondiionalesteif:
SintaxainstruciuniiifnlimbajulCeste:

if(expresie)
instruciune1;
[else
instruciune2;]

86
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

undeexpresietrebuiesfiedetiparitmeticsaupointer.Dacexpresieseevalueaz
la o valoare diferit de zero atunci se execut instruciune1, altfel se execut
instruciune2.Parteaelseesteopional.
nlimbajeledeprogramarencareexisttipuldedateboolean,expresietrebuies
fieoexpresielogicacreivaloareestetruesaufalse.
A doua instruciune condiional este instruciunea de selectare, instruciune care
este o soluie mai elegant pentru situaiile de programare n care se folosesc
instruciuni ifelseif n cascad. Rolul semantic al instruciunii de selectare este
alegereauneialternativedintromulimedevariantereciprocexclusive.Eapoatefi
simulat printro cascad de instruciuni ifelse, dar avantajul ei const ntro
expresivitatesporitaexprimrii.Deducereaalternativeicareseexecutsefacepe
baza unei expresii numite selector, iar valorile luate n considerare se numesc
etichete case. Cnd se discut despre instruciunea de selectare trebuie avute n
vedereurmtoareleaspecte:
tipulexpresieiselectoare;
tipuletichetelorcase;
esteposibilexistenaetichetelorreciprocneexclusive;
eticheteleacopertoatmulimeavalorilorexpresieiselectoare.
posibilitateaexprimrilorninteriorulsauexteriorulcorpuluiinstruciunii.
InstruciuneadeselectareanlimbajeleCiC++esteinstruciuneaswitch.Expresia
selectoaretrebuiesfiedetipntregsaudetipclaspentrucareexistoconversie
neambigu la tip aritmetic sau pointer. Orice instruciune din corpul lui switch
poatefietichetatcuunasaumaimulteetichetecasedeforma:

caseexpresieconstant:

unde expresieconstant se convertete la tipul expresiei selectoare. ntro


instruciuneswitchnupotexistadouconstantecasecuaceeaivaloare.Corpullui
switchpoatesconinicelmultoetichetdeforma:

default:

La execuia instruciunii switch, se evalueaz expresia selectoare i se face


comparaiacufiecareconstantcase.Dacunadintreconstantelecaseesteegalcu
valoareexpresiei,setransfercontrolullainstruciuneacuetichetacaserespectiv.
Dacvaloarenucorespundeniciuneiadintreconstantelecaseidacexisteticheta
default,setransfercontrolullainstruciuneacuaceastetichet,iardacnuexist
default,nuseexecutniciunadininstruciuniledincorpulluiswitch.
Etichetele case i default nu altereaz fluxul de control, care continu n corpul lui
switch.Pentruaprsicorpulluiswitch,sefoloseteinstruciuneabreak.Deobicei
instruciunile care fac obiectul lui switch sunt instruciuni compuse, dar nu este
obligatoriuacestlucru.

87
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Instruciuniledincorpulluiswitchpotfiideclaraiidartotuinuesteindicatsse
facastfeldedeclaraii.

Instruciuni de ciclare
Instruciuniledeciclare(repetitive,iterative)realizeazspecificareaunorprocesede
calcul iterative. Aceste procese pot fi cu numr cunoscut de pai sau cu numr
necunoscut de pai (iteraii). Secvena de instruciuni care specific procesul de
calculiterativsenumetecorpalacestuia(corpulciclului).
Nu se tie dinainte de cte ori se repet execuia unui proces iterativ cu numr
necunoscut de pai. La un moment dat decizia privind reluarea execuiei corpului
ciclului (continuarea cu o nou iteraie) se face prin testarea valorii unei anumite
expresii. Din punctul de vedere al locului unde se face aceast testare, se disting
douclasedeastfeldeprocese,cutestiniialicutestfinal.
Specificarea formal a unui proces de calcul iterativ se poate face folosind
delimitatori,caremarcheazcorpulacestuia.Continuarea(repetarea)procesuluide
calculestedecisdevaloareadeadevrauneicondiiideterminare,careestedat
explicit sub forma unei expresii booleene. Dup momentul n care se evalueaz
expresiasedistingdouconstrucii:cutestiniialicutestfinal.Atuncicndtestul
este la finalul ciclului corpul se execut cel puin o dat indiferent de valoarea de
adevracondiieideterminare.
InstruciuniledeciclarenCiC++suntwhile,doifor.Sintaxaloreste:

instruciunedeciclare::=
while(expresie)instruciune;
doinstruciunewhile(expresie);
for(instruciuneiniializarefor;expresie;expresie)
instruciune;

instruciuneiniializarefor::=
instruciuneexpresie
instruciunedeclaraie

Corpuluneiinstruciunideciclarenupoatefiodeclaraie.
La instruciunea while corpul se execut repetat pn cnd valoarea lui expresie
devine0.Testulsefacenaintedefiecareexecuieacorpului.Expresietrebuiesfie
detiparitmeticsaupointer.
Lainstruciuneadocorpulseexecutrepetatpncndvaloarealuiexpresiedevine
0. Testul se face dup fiecare execuie a corpului. Expresie trebuie s fie de tip
aritmeticsaupointer.
Instruciuneaforaresintaxa:

for(instruciuneiniializarefor;expr1;expr2)
instruciune;

88
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

iesteechivalentcu:

instruciuneiniializarefor;
while(expr1){
instruciune;
expr2;
}

cu excepia faptului c ntlnirea unei instruciuni continue n instruciune va


provoca evaluarea lui expr2 nainte de evaluarea lui expr1. Prin urmare, prima
instruciune nseamn iniializarea ciclului, expr1 este condiia de continuare a
ciclrii,testatnaintafiecreiiteraii(seterminciclareacndexpr1devine0),iar
expr2 specific de obicei o aciune care modific ceva (de obicei incrementarea
variabilei de ciclare care se face dup fiecare iteraie). Expr1 trebuie s fi de tip
aritmetic.
Attexpr1ctiexpr2suntopionale.Daclipseteexpr1,seobineoconstrucie
echivalentcuwhile(1)

for(;;)//cicluinfinit

Instruciuni de transfer
Instruciunile de transfer (salt) ntrerup execuia secvenial (instruciune cu
instruciune) a unei secvene de program, permind continuarea execuiei
programului dintrun loc precizat. Forma general a instruciunii de salt este goto
etichet. Unde etichet este un identificator care apare naintea unei instruciuni,
instruciunecucaresevacontinuaexecuiaprogramului.Nuvomintrandetaliin
legturcuaceastinstruciunentructnuesterecomandatafifolosit.
n 1968, Dijkstra a publicatn Communication of ACM, articolul GO TO statement
considered harmful n care discuta problema proastei utilizri a acestei
instruciuni, rezultnd programe greu de neles i nefiabile. Acest articol a
declanatoseriedediscuiicareauduratanintregi,discuiiprivindutilitateasau
inutilitatea acestei instruciuni (condiiile n care se poate renuna la GOTO;
transformarea programelor cu instruciuni GOTO n programe echivalente fr
GOTO; eficiena algoritmilor fr GOTO). Dup un timp discuiile sau potolit i
GOTOarmascainstruciunenlimbajeledeprogramareimperativemoderne.Au
aprut i construcii auxiliare (break, continue, exit) care servesc la o mai bun
structurareaunuiprogramilaomaiuoarnelegerealui.
Majoritatealimbajelormodernepstreazinstruciuneadesaltnecondiionatdoar
dinmotivedecompatibilitatecuversiunileanterioare.
nCinstruciuniledesaltsunt:goto,break,continueireturn.Sintaxaloreste:

instruciunedesalt::=
break;
continue;

89
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

returnexpresieopt;
gotoidentificator;

Instruciuneabreakpoatesaparnumaincorpuluneiinstruciunideciclaresau
ntro instruciune switch; ea are ca efect terminarea celei mai interioare
instruciunideciclaresauswitch,iarcontrolulestetransferatlainstruciuneacare
urmeazinstruciuniideterminareaciclului(dacexist).
Instruciuneacontinuepoatesaparnumaincorpuluneiinstruciunideciclarei
are ca efect transferarea controlului la poriunea de continuare a celei mai
interioare instruciuni de ciclare, adic la sfritul ciclului, unde se face testul de
continuareaciclrii.
O funcie red controlul apelatorului ei la ntlnirea instruciunii return.
Instruciuneareturnfrargumentesepoatefolosinumainfunciicentorctipul
void.
Formareturnexpresiesepoatefolosinumainfunciilecarentorcovaloare(detip
diferit de void); valoarea expresiei este ntoars n apelatorul funciei. Dac este
nevoie,expresiantoarsesteconvertit,lafelcalainiializare,latipulrezultatului
ntors de funcie. ntlnirea sfritului unei funcii este echivalent cu return fr
valoare,lucruilegalncazulfunciilorcentorcovaloare.

Programarea structurat i cum s-a ajuns la ea


Odat cu introducerea limbajului ALGOL60 programatorii au observat c
programareanacestlimbaj necesitnmodnaturalutilizarea demult maipuine
oriainstruciuniigotodectceraltelimbajenuz(deex.FOTRAN).Saobservatde
asemeneacprogrameleastfelrezultateerauimultmailizibiledectechivalentul
lorcugoto.
Aceste observaii iau fcut pe civa cercettori de renume (Peter Naur, Edser
DijkstraiPeterLandin)sexperimentezelanivelulanilor19661968programarea
frutilizareadeinstruciunigoto.Concluziaafostcinstruciunilegotoartrebuie
eliminate total din practica programrii. Dijkstra sublinia faptul c dificultatea
nelegerii programelor care fac uz excesiv de instruciuni goto provine din marea
diferen dintre structura static a unui program (aa cum apare textul surs n
pagin) i structura dinamic a calculelor asociate (evoluia n timp a execuiei).
Ideeasugeratpoatefiexprimatsubformaaanumituluiprincipiualstructurrii,
carespunec:
Structura static a unui program trebuie s corespund la nivel simplu cu
structuradinamicacalculelorcorespunztoare.
nurmasemnaluluidealarmtrasdeDijkstrasaudezvoltatnoilimbaje,metodei
tehnici grupate sub titulatura de programare structurat, stil de programare care
prinnoiletipuridestructuridecontrolintroduse(for,repeatuntil,whiledo)numai
necesitaufolosireadeinstruciunigotoipermiteaurespectareaacestuiprincipiual
structurrii (ordinea static a instruciunilor programului era aceeai cu cea de la

90
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

execuie). Respectarea unei discipline de programare i folosirea riguroas a
structurilor de calcul introduse au dus la posibilitatea elaborrii de algoritmi uor
deurmrit,clariicoreci.
Un rezultat foarte important pentru ajungerea la programarea structurat la
constituitarticolulluiBohmiJacopini,careaudemonstratcoricealgoritmpoate
ficompusdinnumaitreistructuridecalcul:
structurasecvenial;
structuraalterntiv;
structurarepetitiv.
Programare structurat a fost caracterizat ca fiind: programare fr goto,
programaredetiptopdowniomanierdeaorganizaicodificaprogrameastfel
nct ele s fie uor de neles i de modificat, scopul ei fiind de a controla
complexitateaprinteorieidisciplin.
Knuth consider programarea structurat ca un mijloc de a face programele mai
uordecitit.
La nivel micro, programarea structurat se poate ntlni la nivelul elaborrii unui
(sub)algoritm,undeseimpuneclaritate,ordineiscriereirespectareastructurilor
decalculdemaisusncadrulfiecruimodulnparte.Lanivelmacroeasemanifest
la nivelul ntregului produs program, prin practicarea proiectrii topdown, a
programelormodulareiaaltormetodedeprogramareceimpunordinenntreaga
activitate. De asemenea, este necesar existena unei structuri clare a ntregii
aplicaii,precizatprintrodiagramdestructur.
n ceea ce privete claritatea unui algoritm sau a unui program, indentarea
(paragrafarea) precum i inserarea de comentarii reprezint tehnici de lucru ce
nsoescdeobiceiavantajeledejamenionatealeprogramriistructurate.
Chiardacmajoritatealimbajelorimperativeactualedispundeinstruciuneagoto,
necesitateafolosiriieiadisprut,iarprogramatoriiauacumamaibunnelegerea
modului n care trebuie utilizat o instruciune de acest tip precum i asupra
situaieincareoastfeldeutilizareesteadecvat.

91
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

8. Proceduriitransmitereaparametrilor
Abstractizare i specificare
Practica a demonstrat viabilitatea principiului machiavelic divide et impera. n
proiectarea aplicaiilor pe calculator, acest principiu se regsete sub termenul de
descompunereauneiprobleme,princaresenelegefactorizareaeinsubprobleme
disjuncte,cuurmtoareleproprieti:
1. fiecare subproblem este situat la acelai nivel de detaliere; ea poate fi
tratatulteriorcaoproblemdistinct;
2. fiecaresubproblemsepoaterezolvaindependent;
3. soluiile subproblemelor se pot combina pentru a obine soluia problemei
iniiale.
Descompunerea unei probleme este strns legat de termenul de abstractizare. n
general,procesuldeabstractizareesteprivitcaoaplicareauneifuncii(ngeneral
neinjectiv), numit funcie de abstractizare, prin care se neglijeaz unele
informaii, considerate nesemnificative, pstrnduse doar acelea considerate
eseniale din punctul de vedere al contextului aplicaiei. Ideea de baz a
abstractizriiesteaceeaclucruridiferite(nstotuinrudite)sepottrataidentic.
Ca metod de proiectare a programelor, abstractizarea se poate realiza prin
parametrizaresauprinspecificare.
Abstractizarea prin parametrizare presupune identificarea, pentru o problem
dat, a intrrilor i ieirilor acesteia, care vor constitui parametrii formali ai
problemei respective. Se poate discuta ce pot fi parametrii unei probleme: numai
date(adicrealizrialeunortipuridedatcunoscute)sauitipuridedat.
Abstractizarea prin specificare se realizeaz prin asocierea unei specificri la
fiecaresubproblemcaretrebuierezolvat,considernduseapoicoricecererede
rezolvare a subproblemei se bazeaz pe aceast specificare, mai mult dect pe un
algoritm de rezolvare a ei. Realizarea specificrii se face printrun cuplu de
aseriuni,acrorfolosiresebazeazpedoureguli.Aseriunile:
a. necesit (precondiia) ce specific proprietile ce trebuie satisfcute
cndsedoreterezolvareasubproblemeirespective;
b. realizeaz (postcondiia) ce specific proprietile presupuse a fi
ndeplinitelaterminarearezolvriiproblemei.

Regulilespecificriiafirmc:
a. duprezolvareauneisubproblemesepoatepresupunecpostcondiiaeste
adevrat
b. sepotadmitenumaiaceleproprieticarederivdinpostcondiie.
Prima regul statueaz c utilizatorul nu trebuie s se gndeasc la algoritmul de
rezolvare a subproblemei, adic el trebuie s fac abstracie de detalii, iar a doua
afirm c rezolvarea subproblemei ofer rezultate ce satisfac postcondiia,

92
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

subproblema fiind o abstractizare ce reprezint mulimea calculelor necesare
realizrii postcondiiei. Astfel, o subproblem poate fi neleas ntrun sens mai
larg,caonouoperaiepemulimeadatelorcesatisfacprecondiia.
Sepoatevorbideabstractizareladouniveluri:proceduraliprintipuriabstracte
dedate.
Abstractizarea procedural este o abstractizare de tip operaional prin care se
realizeazonouoperaie,utilizabildupdefinireaei.Eapermiteadugareadenoi
operaii(extinderea)unuilimbajdeprogramare(consideratcamainvirtual).
Abstractizarea prin tipuri de date abstracte presupune definirea de noi clase
(structuri)dedateidefinireadeoperaiipeacesteobiecte,carerealizeazcrearea,
actualizarea sau distrugerea acestor obiecte sau ofer informaii asupra
comportamentului acestora. Acest nivel de abstractizare utilizeaz abstractizarea
procedural.

Abstractizarea prin proceduri combin metodele abstractizrii prin


parametrizare cu cele ale abstractizrii prin specificare. Procedura este o unitate
sintacticisemanticcaredescrietransformareaargumentelorfurnizatelaintrare
nargumentedeieire.Dinpunctdevederesemantic,procedurasepoateidentifica
ntro oarecare msur cu subproblema. Ea se poate considera abstract ca o
aplicaiepemulimeaargumentelordeintrare,cuvalorinmulimearezultatelor,cu
eventualamodificareaintrrilor.
Abstractizare prin proceduri trebuie s satisfac trei cerine: minimalitate,
generalitate i simplitate. Minimalitatea este caracterizat prin faptul c,
comportamentul unei proceduri trebuie precizat numai n limitele realmente
necesare.ngeneral,caracterulminimalaluneiproceduriimplicnedeterminismul
(soluii multiple), care de obicei se rezolv la nivelul implementrii, obinnduse
unicitatea soluiei. Generalitatea se obine prin utilizarea parametrilor n locul
variabilelor sau al ipotezelor specifice. Simplitatea nseamn c procedura trebuie
saibunscopbinedefinitiuordeexplicat,caresnudepinddecontextuln
careesteutilizat.Seafirmcoprocedurestebinegnditatuncicndsepoate
descrie scopul ei prin numele acesteia (adic se folosesc ct mai puine cuvinte
pentruaexplicamenireaei).Simplitateaimplic,deobicei,caoprocedursaib
uncoddeimplementareredus(deordinulzecilordeliniisurs).
Abstractizareaprinparametrizareservetelaidentificareadatelorutilizate.Eaeste
definit cu ajutorul parametrilor formali. Ori de cte ori se apeleaz o procedur,
parametrii de apel (efectivi) trebuie n general s corespund ca numr i
semnificaiecuceiformali.Distingemdejadoumomentedeosebitedinviaaunei
proceduri: proiectarea i utilizarea ei. Lista de parametri, stabilit la proiectarea
uneiproceduri,realizeazinterfaacualteproceduri,conferinduinacelaitimpo
mai mare generalitate (aplicabilitatea n mai multe situaii, prin setarea
corespunztoare a parametrilor efectivi), cu efect n realizarea de aplicaii
compacte,maiuordescrisidentreinut.

93
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Abstractizarea prin specificare presupune concentrarea asupra comportamentului
procedurilor scrise, cu neglijarea detaliilor de implementare, altfel spus trebuie
gndit ce trebuie s fac procedura, i nu cum trebuie s fac. Pentru o aceeai
specificare se pot realiza mai multe implementri, diferite ntre ele (n limbaje
diferite,cualgoritmidiferii).Laschimbareaimplementrii,programeleapelantenu
vor trebui modificate dac specificarea procedurii nu se schimb. Abstractizarea
prinspecificareoferometoddeproiectareaprogramelorcearedouproprieti
importante:localizareimodificabilitate.
Localizarea nseamn c implementarea unei abstractizri se poate face
independent de implementarea altora. Avantajele oferite de aceast proprietate
sunt: posibilitatea lucrului n echip (proceduri diferite pot fi implementate de
persoanediferite)icreterealizibilitii(lanelegereascopuluiuneiprocedurinu
estenecesarcunoatereaalgoritmilorfolosiipentrualteproceduriapelatedeea,
cidoarasemanticiiacestora).
Modificabilitateanseamnlimitareaefecteloruneimodificri.Dacimplementarea
unei proceduri se modific fr ca s se modifice i specificarea acesteia, atunci
apelulrespectiveiprocedurinusemodific,deciefectulmodificriiuneiproceduri
se reduce numai la implementarea ei. Aceast proprietate ofer i o metod de
controlaperformaneiprogramelor,careconstn:
1. se realizeaz specificarea corect i complet a tuturor procedurilor unui
programiseimplementeazceimaisimplialgoritmi;
2. se execut programul, detectnduse locurile nguste (engl. bottlenecks),
adicaceleproceduricareconsummajoritateatimpuluideexecuie;
3. se rescrie codul pentru procedurile respective, folosinduse algoritmi mai
performani.
Proiectarea unei proceduri presupune dou etape distincte: specificarea i
implementarea. Specificarea unei proceduri definete ce au n comun diversele
implementrialeacesteia.Implementrileuneiprocedurisuntechivalentesemantic
dac reprezint aceeai abstractizare; ele pot diferi din punctul de vedere al
algoritmilorfolosii.Ocondiienecesarceseimpuneimplementriiestecaaceasta
srealizezecomportamentuldefinitprinspecificare.Deasemenea,estededoritcao
implementaresfiectmaiinteligibil,ctmailizibil.ntretehniciledesporirea
lizibilitiiuneiimplementrimenionm:
1. utilizareanotaiilordelaspecificareaunorparametri;
2. utilizareacomentariilor(attpentruprecizareaalgoritmuluiutilizat,ctin
codulpropriuzis);
3. folosirea indentrii, aezarea n pagin ce faciliteaz nelegerea structurii
codului.

Specificarea abstractizrii prin proceduri: abstractizarea trebuie realizat prin


definiii precise. Ea se definete cu ajutorul specificaiilor scrise ntrun limbaj de
specificare. Acestlimbajpoatefi forma, specificaiileavnd unsensprecis,riguros

94
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

matematic, sau informal, cnd specificaiile au un caracter descriptiv, suferind n
precizieirigoare,darfiinduordeneles.
Specificareauneiproceduriconineantetulacesteia(parteasintacticaspecificrii)
idescriereaaciunii(parteasemantic).Antetulconine:numeleproceduriiilista
de argumentelor (parametrilor), caracteriznd numele, tipul i ordinea acestora.
Descriereaaciuniiproceduriisefaceprinaseriunile:
necesit(condiiilesaurestriciiledeutilizare;
modific(parametriideintrarecaresemodific);
realizeaz(comportamentulprocedurii).
Din punctul de vedere al modului n care furnizeaz rezultatul aciunii lor,
procedurile sunt de tip subrutin sau funcie. Procedurile de tip subrutin i
materializeazefectulnmodificareaparametrilordeieire(eventualiaunorade
intrare), pe cnd funciile furnizeaz un rezultat de un tip precizat, determinat de
parametri.
Schemadespecificareauneiprocedurieste:

nume=proc(listaargumentelor)[returns(rezultat)]
necesitseprecizeaztoaterestriciiledeutilizareaprocedurii.
modificseprecizeazargumentelecaresemodific.
realizeazdescriecomportamentulprocedurii.
Dmncontinuarectevaexempledespecificareaprocedurilor.

concat=proc(a,b:string)returns(ab:string)
realizeaz la terminarea execuiei, ab este un nou ir de caractere ce conine
caractereledinirula(nordineaapariiei),urmatedeceledinirulb.

elim_dubl=proc(a:array[int])
modifica
realizeazsuprimareaapariieimultiplealeelementelordina.Indiceleinferioral
lui a rmne acelai, darordineaelementelor inumrul deelementedin a se pot
modifica.

caut=proc(a:array[int],x:int)returns(i:int)
necesitatableordonatcresctor
realizeazdacexistunindiceipentrucarex=a[i],rezultatulestei,altfelivafi
unntregcuvaloareamaimaredectindicelesuperioralluia.

Dinpunctuldevederealspecificriilor,procedurilepotfitotale(lipseteaseriunea
necesit), deci nu exist restricii de utilizare a lor, sau pariale (este prezent
aseriunea necesit). Termenii total sau parial trebuie considerai n raport cu
domeniuldedefiniiealprocedurii:oprocedurtotalestedefinitpetotdomeniul
su(consideratcaproduscartezianaldomeniilortipurilordedatceformeazlista

95
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

deparametri,nordineaspecificriiacestora),pecndlaunaparialdomeniuleste
restrns n conformitate cu cerinele impuse de aseriunea necesit. Pentru
exemplele de mai sus, concat i elim_dubl sunt proceduri totale, iar caut este
parial.

Proceduri
Procedurapoatefiprivitcaomodalitatedeaajungedelaoinformaiedeintrarela
o informaie de ieire. Specificarea unei proceduri trebuie s stabileasc relaiile
ntre mulimea datelor de intrare i cea a rezultatelor de la ieire, dar (conform
principiuluicutieinegre)nutrebuiesdeainformaiiasupramoduluincaresunt
obinuteieirile.PrimullucrucareneintereseazlaoproceduresteceeaCEface
aceastainuCUMface.
Funcional,oprocedurpoateficonsideratcaonouoperaiedefinitdeutilizator
prinintermediuloperaiilorprimitivealeunuilimbajdeprogramare.
Conceptual,oprocedurestecompusdinpatruelemente:
numeleprocedurii;
olistdedefinireaparametrilor;
corpulprocedurii;
mediulprocedurii.
Sintaxa unei proceduri se refer la modul concret de specificare a celor patru
constitueni.Ingeneral,eaaratastfel:

ProcedureNUME(listdeparametri)
Declaraii
Corpulprocedurii
EndNUME.

Evidentcdelaunlimbajlaaltulexistuneledeosebirinceeaceprivetesintaxa
procedurilor.nlimbajulC,putemdefinidoarfuncii.
Oprocedurncepedeobiceiprintruncuvntcheie(procedure)caredeclartextul
care va urma ca fiind o procedur. Dup cuvntul cheie urmeaz numele acesteia,
dupcare,nparantez,urmeazolistdeidentificatori,numiiparametriformali.
Aceti identificatori sunt nume care joac rolul argumentelor reale din momentul
apelului (nu sunt variabile). Este nevoie de acetia pentru a putea descrie
procedura.Variabileleiexpresiilecevorfipreluatedeprocedurpentruanlocui
parametrii formali se numesc parametri actuali. Exist o coresponden direct
ntre parametrii formali i cei actuali, bazat de regul pe ordinea n care acetia
apar n list.
Orientarea n limbajele de programare moderne este de a da ct mai mult
informaieladefinire,ncadrullisteiparametrilorformali.Astfel,lrgindusepuin
noiuneadelistdeparametri,vorbimdesprespecificareaparametrilor,carepoate
coninepelngnumeleparametrilor,tipulacestora,precumimodalitateancare
vorfifolosiilaexecuie.

96
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Decelemaimulteoridefinireauneiproceduridelimiteazidomeniulunorobiecte
din program. Declaraiile descriu atributele variabilelor, constantelor, etichetelor,
toate acestea fiind locale procedurii despre care vorbim. Corpul procedurii const
dintro instruciune (simpl sau compus) care controleaz procesul de calcul. De
asemenea, o procedur poate referi variabile globale ei care provin dintrun bloc
exterior. Mediul procedurii const din acele variabile care sunt definite n afara
corpuluiprocedurii, darcarepotfiutilizateieventualmodificatelaexecuieprin
intermediulinstruciunilorprocedurii.
nprincipal,procedurilesempartndoucategorii:subrutineifuncii.
Osubrutinesteprocedurcarendeplinetesarcinafieprinatribuirearezultatelor
unuia sau mai multor parametri, fie prin modificarea mediului procedurii, fie prin
amndouacestemetode.Caracteristicsubrutineiestefaptulcapelulacesteiaeste
interpretatcaoinstruciune.
Ofuncieesteoprocedurcareestecaracterizatdefurnizareauneivalori.Astfelse
permitecaapeluluneifunciisfiecomponentauneiexpresii.nmultelimbajede
programare o funcie poate s modifice valoare unei variabile din mediu, aceasta
fiind una din caracteristicile principale ale programrii imperative i implicit
deosebireamajorntrenoiuneadefunciematematic(carenupermiteastfelde
modificri i pe care se bazeaz programarea funcional) i cea de funcie din
informatic.
O modalitatea de stabilire a valorii unei funcii este atribuirea valorii numelui
funciei,construciecevafitratatcaivariabillocal(nPascal,ALGOL,FOTRAN
).Pedealtparte,altelimbaje(cumesteC)cercavaloareadetransmissfieplasat
imediatdupoinstruciunereturn.
Laexaminareauneiproceduridistingemtreiclasedenume:
numeleparametrilorformali;
numelevariabilelorlocale;
numelevariabilelorglobale.

Relativlaacestecategoriiilamodulncareseraporteazoprocedurlaacestea,se
ridic problema evalurii parametrilor actuali i a modului de punere n
corespondenaacestoracuceiformali.
Scopulfinalalcreriiproceduriloresteutilizarealor,etapcareaparelamomentul
execuiei,icuprindetreifaze:
1. CALLmomentulapelului.Setransmitecontroluldelaprogramulapelantla
procedur
2. ENTRYcuprindeaciunileceaulocnmomentulintrriinprocedur.
3. RETURN cuprinde aciunile ce se execut la trecerea controlului de la
procedurlaprogramulapelant.

97
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

Evaluarea i transmiterea parametrilor
Evaluarea parametrilor este procesul n care fiecare parametru actual este asociat
cu parametrul formal corespunztor. Prin transmitere a parametrilor nelegem
modalitatea prin care valoarea evaluat a parametrilor actuali este transferat
procedurii.Existmaimultemetode detransmitereaparametrilor,nsncelece
urmeaz ne vom limita la dou dintre acestea care au fost cele mai utilizate dea
lungultimpuluincadrullimbajelordeprogramare:
1. n cazul apelului prin valoare parametrului actual este copiat ntro nou
locaie de memorie, care este pus apoi n legtur cu parametrul formal,
care acioneaz n continuare ca variabil local pentru unitatea apelat.
Aceast metod este maniera implicit de tratare a evalurii i transmiterii
parametrilornmultelimbaje(Pascal,C).Trsturaprincipalaapeluluiprin
valoareestecparametrulactualdevinepentruprocedurovaloarecepoate
fi numai utilizat (readonly), iar eventualele modificri ale coninutului
parametrilor nu vor influena programul din afara procedurii. Aceasta,
deoarece se lucreaz de fapt cu copia argumentului, ceea ce poate fi un
dezavantaj n cazul obiectelor structurate (tablouri, structuri voluminoase
etc.), consumnduse mult timp i spaiu de memorie cu aceast copiere.
Apelulprinvaloarenupermiteniciunfluxdeinformaienapoispreapelant,
atribuirileparametrilorneafectndunitateaapelant.
2. n cazul apelului prin referin, dac parametrul actual este o locaie ce
desemneaz o variabil cu nume, aceast locaie este legat direct cu
parametrul formal corespunztor, ceea ce face ca s se lucreze direct cu
valoareainiialdinmemorie.Acestlucrupermitecaeventualelemodificri
ce se fac asupra acestor variabile s fie recunoscute i n afara procedurii.
LimbajulCnudispunedeunmecanismsintacticdeimpunereaapeluluiprin
referin,acestaputndfinssimulatdectreprogramatorprinintermediul
variabilelor de tip pointer. Principalul avantaj al acestui mod de apel este
eficiena.
Mai jos dm un exemplu n C de apel prin valoare, apel n urma cruia valorile
variabileloraibdinprogramulprincipalnusevormodifica.

#include<stdio.h>
voidswap(inta,intb)
{
intt;
t=a;a=b;b=t;
}
voidmain()
{
inta=1,b=2;
printf(%d%d,a,b);/*sevaafisa12*/
swap(a,b);
printf(%d%d,a,b);/*sevaafisatot12*/

98
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

}

Pentrucavalorilecelordouvariabilessemodificetrebuiesfolosimapelulprin
referinceeacenCsesimuleazcuvariabiledetippointer:

#include<stdio.h>
voidswap(int*a,int*b)
{
intt;
t=*a;*a=*b;*b=t;
}
voidmain()
{
inta=1,b=2;
printf(%d%d,a,b);/*sevaafisa12*/
swap(&a,&b);/*Functieiisetransmitadreseleluiasib*/
printf(%d%d,a,b);/*sevaafisa21*/
}

Specificarea parametrilor unei proceduri


n cadrul limbajelor de programare moderne, orientarea actual este de a cere
programatorilor s furnizeze ct mai multe informaii despre parametrii formali
utilizai n descrierea unei proceduri (tipul acestora). Astfel, se permite un grad
sporit de eficien a verificrii corespondenelor ntre parametrii formali i cei
actuali.
Un alt nivel de specificare se refer la modul n care vor fi folosii parametrii. n
general se permite compilatorului o oarecare libertate n alegerea metodei de
evaluareitransmitereaparametrilor.
Parametriiuneiprocedurisepotaflanunadinurmtoareletreiipostaze:
1. parametruladuceovaloarenprocedur,fiindnumaicitit(ifolosit)ns
nuiatribuit(modificat),iarvaloareasanuestetransmislaieire.Spunem
nacestcazcparametrulestedetipIN.
2. parametrul transmite valoarea sa n exteriorul procedurii, valoarea fiind
atribuit parametrului pe parcursul execuiei procedurii, dar nefiind adus
cuovaloareiniialdinexterior.nacestcazspunemcparametrulestede
tipOUT.
3. parametrulesteaduscuovaloareiniial,esteapoimodificatitransmisca
parametrudeieire.SpunemcparametrulestedetipINOUT.

Noiunea de efect secundar


Unadinproblemelecareseridicesteceaaefectuluipecarelpoateaveaofuncie
asupra diverselor valori din program. Funciile pot modifica n corpul lor de
instruciuni valorile unuia sau mai multor parametri transmii, precum i valorile

99
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

unor variabile globale. Aceste modificri asociate calculului valorii funciei se
numescefectesecundare.
Astfel de efecte pot crea anumite probleme. De exemplu, n cadrul evalurii unei
expresii unde apare o astfel de funcie ce produce efecte secundare nu se va ti
precis ce valori vor avea alte variabile din expresie nainte i dup evaluarea
funciei.

Proceduri mutual recursive


Oaltproblemcareatrebuitsfierezolvatafostproblemaprocedurilormutual
recursive. Acestea sunt proceduri care se apeleaz reciproc. Problema care apare
este imposibilitatea respectrii principiului definirii unui obiect naintea utilizrii
lui, deoarece oricare din cele dou proceduri sar defini prima, ea va conine n
corpul ei un apel al celeilalte proceduri, care nu este nc definit. Rezolvarea
impasului const n posibilitatea declarrii unei funcii printrun antet specific,
reprezentnd semnalarea faptului c definirea va urma utilizrii. n limbajul C
problemaserezolvprinmecanismuldedeclarareafunciilornaintedeutilizarea
lor. Declaraia unei funcii informeaz compilatorul de prezena acelei funcii.
Declaraia(prototipulsausemntura)uneifunciiconstdin numelefunciei, lista
de argumente (sunt importante doar tipurile argumentelor numele lor fiind
opionale)itipuldedatentorsdefuncie(tipuldereturn).

100
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

9. ANEXE
Codspaghetti
Cod sub form de spaghete este un termen peiorativ
pentru un cod surs complex cu o structur de control
nclcit,cefolosetemulteinstruciuniGOTO,excepii,fire
deexecuieialteelementederamificarenestructurate.Un
termen sinonim dar mai puin folosit este cod cangur
pentrucsuntmultesalturincadrullui.

MaijosdmunexemplutrivialdecodscrisnlimbajulBASICcepoateficonsiderat
subformdespaghete.Programulafieaznumereledela1la10iptratullorpe
ecran.Codulnutrebuiesfiealiniat(indentat).Liniileprogramuluisuntnumerotate
i instruciunile GOTO se bazeaz pe aceste numere de linii. Controlului execuiei
programuluisaredelaozonlaaltantrunmodnufoarteprevizibil.nprogramele
adevrateastfeldesecvenedecodsuntmultmaicomplexeipotducelacreterea
foartemareacosturilordentreinerealeunuiprogram.

10dimi
20i=0
30i=i+1
40ifi<>10thengoto90
50ifi=10thengoto70
60goto30
70print"Terminat."
80end
90printi&"lapatrat="&i*i
100goto30

Aceeaisecvendecoddarscrisntrunstildeprogramarestructurat(nlimbajul
C):

inti;
for(i=1;i<=10;i++)
printf(%dlapatrat%d,i,i*i);
printf(Terminat.);

intpatrat(inti)
{
returni*i;
}

i n acest program se fac salturi de la o zon la alta dar aceste salturi sunt
predictibileiformaledeoarecefolosireainstruciuniiforiafunciilorsuntmetode

101
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros

standarddeacontrolaexecuiaunuiprogram.Acesteprogramestefoartescurt,dar
programele reale au foarte multelinii de cod i sunt dificil de ntreinut dac sunt
scrisesubformdespaghete.

Teoremadestructur
n mai 1966, Bhm i Jacopini au publicat un articol n Communications of the
ACM n care au artat c orice program care conine instruciuni GOTO poate fi
transformat ntrun program fr instruciuni GOTO care s conin doar
instruciuni de selecie (IF THEN ELSE) i instruciuni repetitive (WHILE condiie
DO xyz), eventual cu cod duplicat i/sau cu adugarea de variabile booleene
suplimentare (indicatori true/false). Ulterior sa demonstrat c instruciunea de
selecie poate fi i ea eliminat i c orice program se poate scrie doar cu
instruciunirepetitiveicuadugareadealtevariabilebooleene.
Faptul c un astfel de minimalism este posibil nu nseamn c este i indicat.
Teoretic,calculatoareleaunevoiedoardeosingurinstruciunemain(operaie)
pentruafuncionaianume:scadeunnumrdintraltuliramificdacrezultatul
estenegativ.nrealitate,calculatoareleauzecisaupoatechiarsutedeinstruciuni
main.
CeeaceaudemonstratBhmiJacopiniafostctoateprogramelepotfiscrisefr
instruciuni GOTO. Ali cercettori au demonstrat c structurile de control cu o
singurintrareiosingurieiresuntmultmaisimpludenelespentrucacestea
potfifolositeoriundecaosingurinstruciunefrainfluenacontrolulexecuiei.

102

S-ar putea să vă placă și