Documente Academic
Documente Profesional
Documente Cultură
PP PDF
PP PDF
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
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
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
Cobol1960
COmmonBusinessOrientedLangage.
DefinitdeCODASYL,COnferenceonDAtaSYsystemsLanguages.
11
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros
Basic1964
BeginnersAllpurposeSymbolicInstructionCode
JohnKemeny,ThomasKurtz
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.
Sql1970+
13
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros
StandardQueryLanguage
IBM
Limbajpentruinterogareabazelordedaterelaionale.
C++19811986
BjarneStroustrup.
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.
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
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.
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.)
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.
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.
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.
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.
<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.
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
Figur:Structuraunuicompilator
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).
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.
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.
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);
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
}
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*/
constchar*conststep[3]={left,right,hop};
cazncarenusepotmodificaniciiruriledecaractereinicipointerii(elementele
tabloului):
step[2]=skip;/*eroare:nusepoatemodificaunpointerconstant*/
step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/
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.
42
UniversitateadinOradea,Facultateadetiine,
DepartamentuldeMatematiciInformatic
SuportdecurspentrudisciplinaProgramareprocedural
Specializrile:InformaticiMatematicanulI,semestrulI
Lectoruniv.HoreaOros
structStudent
{
char*nume;
intvarsta;
};
dupcareputemdefiniovariabildetipStudentastfel:
structStudents;
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);
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.
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;};
structA{intx,y;};//nfiierul1
structB{intx,y;};//nfiierul2
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.
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:
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.
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.
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.
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>.
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.
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);
intf(int,char);//declaraiafuncieif
int(*pf)(int,char);/*sedeclarpfcapointerlafunciededouargumente(intichar)centoarce
unntreg*/
inti,j;charc;
pf=f;//atribuiredeadrese
j=(*pf)(i,c);//apelulfuncieiffolosindpf
if(f1()!=f()){}//testasupravalorilorreturnate
sau
if(f1!=f){}//testasupravaloarilorprocedurale
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.
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:
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.
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.
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:
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.
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).
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);
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;
f(a,(b=3,b+4),c);
aretreiparametriactuali,aldoileaavndvaloarea7.
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.
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;
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*/
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.
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:
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;
}
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.
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.
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.
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*/
}
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.
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