Вы находитесь на странице: 1из 102

UNIVERSITATEADINORADEA FACULTATEADETIINE

Programareprocedural
[suportdecurs]
Lect.univ.dr.HoreaOros [anuniv.20092010]

[LucrareareprezintsuportuldecurspentrudisciplinaProgramareProceduraldin planuldenvmntalstudenilordelaspecializrileInformaticiMatematicanulI.]

Cuprins
1.

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

Programarea structurat i cum s-a ajuns la ea ............................................................. 90 Proceduriitransmitereaparametrilor ................................................................ 92 Abstractizare i specificare ........................................................................................... 92 Proceduri ....................................................................................................................... 96 Evaluarea i transmiterea parametrilor ......................................................................... 98 Specificarea parametrilor unei proceduri ...................................................................... 99 Noiunea de efect secundar ........................................................................................... 99 Proceduri mutual recursive ......................................................................................... 100 9. ANEXE .................................................................................................................... 101 8.

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 importantaprogramelorscrisenastfeldelimbajeianumeportabilitatea,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.

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Istoria i evoluia limbajelor de programare


Primullimbaj Ada Lovelace scrie programe pentru proiectul motor diferenial al lui Charles Babbage iar mai apoi pentru motorul analitic. n 1945, germanul K. Zuse, inventatorul calculatorului Z3 a definit un limbaj evoluat pentru acest motor (folosindtablouriinregistrri) Asamblare Asambloarele au aprut o dat cu primele calculatoare. Acestea asociaz un nume simboliccoduluilanivelmain,deex: Addbx,4 cmp[adr],3 jmpaddress Programarea n limbaj de asamblare nu se mai practic pe scar larg, nici mcar pentrurutinecetrebuiesrulezefoarterapid. Autocoder1952 AlickEGlennie ImplementatpentruprimadatpeMark1,iarmaiapoiipealtecalculatoare. IPL1956 InformationProcessingLanguage ANewell,HSimon,JCShaw Limbajdeniveljospentruprocesarealistelor.Implementeazrecursivitatea Fortran19541958 FORmulaTRANslator JohnBackusialicercettoridelaIBM Limbajdedicatcalculelormatematice

10

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

FortranII(1958)introducesubrutine,funcii,bucle,ostructurdecontrolprimitiv detipFOR.Identificatoriisuntlimitailaasecaractere Lisp19581960 LIStProcessing MacCarthy Limbaj funcional pentru procesarea listelor. Este recursiv, nu este iterativ. Nu existdiferenntrecodidate. Algol1960/AlgolW1966/Algol68 ALGOrithmicLanguage Definitdeunconsoriuinternaionalformatdinspecialitininformatic Primul limbaj universal independent de main. Introduce utilizarea gramaticilor BNF(BackusNaurForm)pentruacreaunanalizorsintactic.Introduceblocurilede instruciuni i variabilele locale n cadrul unui bloc. Recursivitatea a fost implementat cu reticen pentru c a fost considerat inutil! Folosete tablouri dinamiceceeacenseamnclimbajeleurmtoare(Pascal,C)auregresatfolosind tablouristaticepentruoperformanmaibun. AreinstruciuneaIFTHENELSE,FOR,simbolul:=pentruatribuire(folositmaiapoi nPascal),instruciuneaSWITCHcuGOTO,indicatoriBEGIN,ENDicicluWHILE. Algol W proiectat de Niklaus Wirth n 1966 folosea RECORD (structuri de date dinamice), CASE, transmiterea parametrilor prin valoare, precedena operatorilor. n acelai an, Niklaus Wirth a creat Euler, un limbaj ntre Algol i Pascal. Algol 60 limbaj orientat spre calcule matematice. Pentru a ncerca s se obin obiectivul iniialianumedeacreaunlimbajdeuzgeneral,sacreatncepndcu1964onou versiuneAlgolX,numitmaitrziuAlgol68.Algol68folosea=+pentruacontopi atribuireacuadunarea.IntroduceUNIONitipuriCAST.AreIFTHENESLEFI,CADE GOTO,operatoridefiniideutilizator.Compilareaincrementalnuestepermis. Cobol1960 COmmonBusinessOrientedLangage. DefinitdeCODASYL,COnferenceonDAtaSYsystemsLanguages. 11

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Basic1964 BeginnersAllpurposeSymbolicInstructionCode JohnKemeny,ThomasKurtz Proiectat n1963,pentruafiuor denvatiafostimplementatn1964.Prima versiuneafostcompilat,dupcareadevenitinteractiviinterpretat.Fiecarelinie areunnumripermitesaltullaliniecuinstruciuneaGOTO. Bill Gates i Paul Allen au ctigat un concurs internaional prin proiectarea i implementareaunuiBasicrapidicompact,primadatpeAltair(4kbdememorie) imaiapoipealtemicrocomputere. Microcomputerele aufost furnizate cuBasicnROM pnla sfritul anilor80. n 1977, Appel II se vindea cu Basic pentru ntregi. Mai apoi Applesoft Basic de la Microsoft cu virgul flotant. Applesoft avea identificatori din dou litere. SubprogrameleerauapelateprinGOSUBnumrlinie. PrimulPCdelaIBM(1981)foloseasistemuldeoperareMSDOSdelaMicrosofti Basicinterpretat(Basica).n1982MicrosoftaprodusprimulBasiccompilat(Quick Basic) n acelai deceniu Pascal i C au nlocuit Basic. Microsoft folosete n continuare Basic(VBA). Logo66 WFuerzeig,SPapert,andothers Folositpentruainvapecopiiprogramare.AsemntorcuLispisebazeazpe micareauneibroateestoasepeecran. Pascal1970 BlaisePascal,matematicianfrancez NiklausWirth.

12

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

A fost proiectat pentru a simplifica crearea compilatoarelor i pentru ndruma procesuldenvareaprogramriispreprogramareastructurat.UCSDPascaleste prima versiune pentru microcomputere. Programele sunt compilate n Pcod, care este portabil i interpretat (la fel ca Java mai trziu). Includea un mediu pentru dezvoltare de aplicaii complet, un principiu folosit cu succes mai trziu n Turbo Pascal.n1981,joculWizardryscrisnPascalaavutunsuccesfoartemarepeApple. Turbo Pascal (proiectat deAnders Hejlsberg)a aprutn 1983.Erarapid, aveaun IDE complet aa c limbajul a avut un succes instantaneu i este folosit chiar i astzi.StructuriledecontrolsuntasemntoarecuceledinC. Smalltalk1972 AlanKay,SoftwareConceptGroup. Limbajdeprogramareorientatobiectcareruleazntotdeaunancadrulunuimediu grafic,cuferestre,mouseetc. C1973 CestesuccesorulluiB,carelarndulluiestesuccesorulluiBCPL DennisRitchie. A fost destinat pentru programarea sistemului de operare UNIX, dar a devenit repede un limbaj universal datorit portabilitii i vitezei. Permite compilare incremental. n 1965, programatorii AT&T foloseau BCPL pentru a implementa Unix.Nemulumiidelimbaj,laumbuntitisacreatlimbajulBiarmaiapoiC. EvoluiahardwareuluiadeterminatapariialimbajuluiC.BCPLiBfoloseauntregi pentru pointeri, dar aceasta nu funciona pe calculatoarele noi. BCPLnuare tipuri (lafelcaPHPsaualtelimbajescriptmoderne).Declaraiileinti,charbaufostcreate nC.Ulteriorauaprutialtetipuri.Operatorul+=vinedinAlgolundeerascris=+. nBCPL,unblocdeinstruciuniesteinclusntresimbolurile(*i*)iarcomentariile ntre /* i */ iar subexpresiile ntre ( i ). Limbajul C a simplificat scrierea prin folosirea acoldelor. ++ exista i n limbajul B. Cuvntul include venea din PL/1. Preprocesorulafostimplementatn1973idinacelmomentlimbajulCafostfolosit pentruscriereasistemuluideoperareUnix.Limbajulaevoluatpnn1980. Sql1970+

13

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

StandardQueryLanguage IBM Limbajpentruinterogareabazelordedaterelaionale. C++19811986 BjarneStroustrup. Versiune a limbajului C orientat pe obiecte. Introduce suprancrcarea operatorilor. Metodele pot fi inline. Comentarii // care vin din BCPL. Au fost implementatemotenireaiabloanele(clasesaufunciigenerice). Objective C, inventat de Brad Cox n 1984, este o alt versiune orientat obiect a limbajuluiCinspiratdinSmalltalk. Perl1987 PracticalExtractingandReportLangage. LarryWall,lingivstaustralian Destinat pentru nlocuirea limbajelor linie de comand Unix, Sh, Sed and Awk, a pstrataceeaisintaxgreoaie.Folositnprincipalpentruadministrareasistemului i scripturi CGI. Folosete liste i tablouri asociative. Exist structura de control FOREACHcarepermiteparcurgereaunorliste. Java1994 Java(coffee) JamesGosling,SunMicrosistems Proiectatn1991caunlimbajinteractivnumitOak.Lavremearespectivnuaavut succes.n1994afostrescrispentruInternetiredenumitJava.n1995seputeau crea appleturi. n ianuarie 1996, Javasoft distribui JDK 1.0. Kitul pentru dezvoltarea de aplicaii. Java este un limbaj clasic de programare procedural, apropiat de C++. Se compileaz n bytecode ce poate rula pe orice calculator. Este maisimpludectC++:fiecarefiierconineosingurclas,memoriaestegestionat automat, nu exist pointeri, motenire multipl, suprancrcarea operatorilor dar includemultitasking.SpredeosebiredeCiC++aredoartablouridinamice. 14

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

PHP1995 PersonalHomePagesHypertextProcessor RasmusLerdorf Limbajscript mutliplatform,ceseincludenHTML.AsemntorcuCdarnueste tipizat. Variabilele se prefixeaz cu $. Interpretorul prelucreaz pagina html ce include instruciuni php i o transform ntro pagin html pur. Biblioteca de funcii permite crearea de pagini web dinamice. Microsoft folosete ASP (asemntorcuBasic) UML1996 UnifiedModelingLanguage Standard (Object Management Group) Grady Booch, Jim Rumbaugh, and Ivar Jacobson Uml reprezint reunirea a trei limbaje de modelare proiectate de cei trei autori. Limbajulfoloseteonotaiegraficpentruaproiectasoftware.Sefacdiagramecare exprim obiecte i interaciunile dintre acestea. Un model este realizat din vizualizri i combinarea lor descriu un sistem complet. Modelul este abstract i independentdedomeniu. Este limbaj pentru specificarea, vizualizarea, construirea i documentarea proiectelorsotwareintense. C#2000 (Csharp),succesoralC++? AndersHejlsberg/Microsoft.

15

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

16

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

17

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Aspecte ale calitii software-ului


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

18

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Portabilitatea:esteuurinacucareproduselesoftwaresepottransferandiverse mediihardwareisoftware. Verificabilitatea: este uurina de elaborare a procedurilor de acceptare (n particular date de test) i a procedurilor de detectare i trasare (transformare n erori)acderilor(failures)ntimpulfazelordevalidareiexploatare. Integritatea: este abilitatea produselor software de ai proteja componentele (programe,date,documente)fadeacceseimodificrineautorizate. Uurinanutilizare:sereferlanvareautilizriisistemului,operarea,pregtirea datelordeintrare,interpretarearezultatelorirecuperareadinsituaiideeroare. Factorii interni de calitate sunt strns legai de natura intim a procesului de elaborareaproduselorprogram.Aicicontribuie:metodeledeanaliziproiectarea produselor program, facilitile oferite de limbajele de programare folosite la implementareiaspecteleorganizatoricealeindustrieisoft. Factoriiinterni: Modularitatea: structural produsul program trebuie s fie alctuit din module, urmrinduseprincipiuldescentralizrii. Documentareacomplet:presupuneexistenauneidocumentaiiclareiaduslazi pentrufiecarefazdincicluldeviaalprogramului. Unlimbajdeprogramaretrebuiesposedeurmtoarelecaliti: S permit o descriere ct mai natural a problemei care se rezolv, permind programatorului s se concentreze asupra problemei i nu asupra detaliilor de adresare,indexareetc. Saibungraddelizibilitatectmairidicat,adicunprogramspoatfiuorde descifrat(sintacticisemantic)deoricinelconsult. Spermitgestiuneaexcepiilor(depiriaritmetice,erorideintrareieireetc.)

Studiu de caz - Limbajul C


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

20

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Specificarea sintaxei unui limbaj de programare


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

care are ca scop identificarea atomilor lexicali din care este compus programul respectiv. Exist urmtoarele categorii de tokeni: simboluri speciale, identificatori, etichete, literali. Doi tokeni succesivi trebuie separai de unul sau mai muli separatori. De obicei separatoriinusuntconsideraitokeni,cutoateceipotfacepartedinconstituenii unuiliteral. Deexempluinstruciunea: if(a>b)x=x+1elsey="Hello!"; conineurmtoriiatomilexicali: identificatori:if,a,b,x,else,y simbolurispeciale:(,),>,=,+ literali:1,"Hello!" Att atomii lexicali ct i separatorii se construiesc din caracterele coninute n alfabetullimbajului. Exist dou categorii de separatori: separatorii uzuali, comentariile. Ambele categoriisuntignoratenprocesuldeanalizlexical. Separatoriiuzualiservesclaseparareaadoitokeniconsecutivi,fiindnumiinunele limbaje spaiu alb (white space); n aceast categorie intr caracterele spaiu, tab, linienou. Comentariilenuausemnificaiepentruprocesuldecalculspecificatnprogram;ele servescnumailaobunnelegereatextuluisursdectrecelcarelcitete.Exist dou maniere de comentare a unui program: linie i text. n limbajul C, C++, C# comentariulliniencepecucombinaiadecaractere//,iarcomentariultextncepe cucombinaia/*isetermincu*/. Identificatori,cuvintecheieirezervate Un identificator este o secven arbitrar de litere i cifre din alfabetul limbajului, dincareprimulcaracterestelitersausemnuldesubliniere.Numruldecaractere din secven poart numele de lungime a identificatorului. Unele limbaje stabilesc limite superioare ale acestei lungimi altele las pe seama implementrii aceste restricii. Suntlimbajecarefacdistincientreliterelemariimici(suntcasesensitive):C,C++, Java iar altele care nu fac aceast distincie: Pascal, Modula2, FOTRAN. n C cuvintelerezervatesescriunumaiculiteremici(if,else,while,foretc.) Existdoucategoriideidentificatori: Predefinii: sunt precizai n definiia limbajului i ei se pot mpri n dou categorii: cuvinte cheie i cuvinte rezervate. Cuvintele cheie au un neles explicit ntrun context precizat. De ex. cuvintele DO, IF, CONTINUE au o semnificaie foarte clar cnd sunt folosite ntrun text surs FOTRAN, semnificaialorrezultnddincontextulncareapar.Elepotfifolositensi 22

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

double else int struct long

extern float

register return short

switch typedef union

unsigned void

volatile while

CuvintelecheieC Simbolurispeciale Lafelcaicuvintelerezervate,simbolurilespeciale(numiteuneoriioperatorisau semne de punctuaie, delimitatori) au o semantic bineprecizat. n unele limbaje elesepotfolosidoarconformdefiniieilor,naltelesemanticasepoateextinde,prin ceeacesenumetesuprancrcareaoperatorilor. SimbolurilespecialenCsunt: Operatorisausemnedepunctuaie:!%^&*()+={}|~[]\;:<>?,./ Operatori(fiecareconsideratunsingurtoken):>++<<>><=>===!=&& ||*=/=%=+==<<=>>=&=^=|= Tokenifolosiidepreprocesor:# Literali Prin literal vom nelege o valoare constant de tip numeric sau caracter. Literalii, numiidemulteoriiconstantesepotmprin: Constantenumerice(ntregiireale) 23

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Constantecaracter Constanteirdecaractere Trebuie fcut distincie ntre conceptul de constant (n sensul de literal) i constantsimbolic.Deasemeneatrebuiefcutdistincientretermenuldeliterali celdeidentificator.Termenulconsacratdeliteralpentruvalorileconstantearputea proveni de la adlitteram, adic are semnificaia unei valori precizate explicit. O definiie mai elaborat afirm c literalii exprim valori constante ale tipurilor de baz(numericeicaracter). Vom prezenta n continuare categoriile de literali din limbajul C (folosim notaia BNF). Literal::=constantntreag|constantcaracter|constantflotant|literalirde caractere Constantntreag:esteformatdiniruridecifre.Suntrecunoscutetreiconvenii de reprezentare: zecimal (dac nu ncepe cu 0), octal (dac ncepe cu 0) i hexazecimal (dac ncepe cu 0x sau 0X). Tipul constantelor ntregi depinde de forma,valoareaisufixulacestora(i,I,u,U). Constant caracter: este format din unul sau mai multe caractere incluse ntre apostroafe. Pentru un caracter, tipul constantei este char, iar valoarea lui este valoarea codului ASCII al caracterului; dac sunt mai multe caractere, tipul constanteiesteint,iarvaloareaacesteiadepindedeimplementare.Existconstante caracter predefinite, care se precizeaz cu ajutorul unor secvene escape (secvene deevitareprecedatedecaracterulbackslash\): CaracterASCII secvenaescape NLnewline \n HTtaborizontal \t VTtabvertical \v BSbcackspace \b CRcarriagereturn \r FFformfeed \f BELbell \a \ \\ ? \? \ nr.octal \ooo nr.hexa \xhhh Constantele reale: sunt compuse din: parte ntreag, marc zecimal, parte fracionar, marc exponent (e sau E) i exponent ntreg cu semn. Tipul lor este implicitdouble,carepoatefimodificatprintrunsufix(Fsauffloat,Lsaullong double).Parteantreagsauparteafracionarpotlipsi(darnuambele),lafelpot lipsiimarcazecimalsaumarcaexponenial(nuambele). 24

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Constanteleirdecaractere:suntformatedintrunulsaumaimultecaractereincluse ntre ghilimele. Tipul lor este char[] i au clasa de memorie static. Reprezentarea unuiirdecaracteresefacepen+1octei,ultimuloctetconinndcaracterulNULL (cu codul ASCII 0). Constantele ir de caractere se mai numesc nullterminated strings. Sintaxaunuilimbajdeprogramare La fel ca n orice limb, i n limbajele de programare, succesiunile de cuvinte formeaz propoziii sau instruciuni. Prin sintaxa unui limbaj de programare se nelegeunansambludereguliprincaresedetermindacoanumitinstruciune estecorectalctuitsaunu. Conceptuldesintaxaparesubdouforme: Sintax abstract: identific rolul componentelor fiecrei construcii; descrierile de limbaj i implementrile sunt organizate n jurul sintaxei abstracte. Sintaxa concret (lexical): prezint modul de scriere a construciilor limbajului,coninnddetaliirelativlaplasareacuvintelorcheieiasemnelor depunctuaie. Spreexemplu,aceeaisintaxabstractstlabazasecveneideprogram: WHILEx<>A[i]DO i:=i1 END ScrisnModula2,precumiaurmtoareisecveneC: while(x!=A[i])i=i1; Existdiversemoduriprincaresepoatedescriesintaxaunuilimbajdeprogramare: BNF,grafeledesintax,gramaticiiautomateetc. BNF (BackusNaur Form = notaia BackusNaur) a aprut n 1963 n cadrul raportuluiALGOL60. nraportulALGOL60instruciuneaforeradefinitnfelulurmtor: <instr.for>::=<clauzfor>|<etichet>|<instr.for> <clauzfor>::=for<variabil>:=<listfor>do <listfor>::=<elementdelistfor>|<listfor>,<elementdelistfor> <elementdelistfor>::=<expr.aritmetic>| <expr.aritmetic>step<expr.aritmetic> until<expr.aritmetic>| 25

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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


a1 a2 an

OproduciecumaimultealternativeA::=a1|a2||ansetranscrieastfel:
a1

a2

Oregulrecursiv{A::=a1}setranscrie:

an

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.

a1

27

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

Schema general a unui compilator


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

28

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

transformrincascad,dincencemaiapropiatedecodulobiect.Conceptual,un compilatorrealizeazdoumariclasedeoperaii: Analizatextuluisurs Sintezacoduluiobiect Acestedouoperaiisedescompunnsuboperaiispecializate,nlnuitentreelei caracterizate prin funcii bine precizate. n figura de mai jos prezentm schematic structuraunuicompilator. ANALIZ
Program surs ir de atomi lexicali
Analiz lexical

SINTEZ
Arbore sintactic
Analiz semantic

Cod intermediar

Cod intermediar optimizat


Generare de cod

Analiz sintactic

Optimizare de cod

Cod obiect

Tratarea erorilor

Gestiunea tabelelor

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Eliminareasubexpresiilorcomune(prinevaluarealorosingurdat) Factorizareainvariaiilordincicluri. Generareaprogramului(codului)obiectconstnalocareadelocaiidememoriei registre ale unitii centrale pentru variabilele programului i nlocuirea codurilor deoperaiidincodulintermediarcucelemain.Codulobiectrezultatpoatefi: absolut(directexecutabil) relocabil (care va face obiectul editrii de legturi, unde va fi legat de alte moduleobiect,rezultatedincompilrianterioaresaudinbiblioteci); n limbaj de asamblare, lucru ce asigur un efort mic de implementare a generatoruluidecod. naltlimbajdeprogramare,ncazulpreprocesoarelor. Generareadecoddifernfunciedearhitecturamainii. Cele cinci module de baz ale procesului de compilare sunt asistate de alte dou componente ale compilatorului, ale cror servicii sunt utilizate pe tot parcursul compilrii:modululdetratareaerorilorigestionarultabeleidesimboluri. Modululdetratareaeroriloresteconstituitdintrocoleciedeproceduricaresunt activateoride cteori estedetectatoeroarentimpuloperaiilorde analiz.Ele emitmesajedediagnosticrelativelaeroarearespectiviiaudeciziiprivindmodul decontinuareatraducerii: traducereasecontinucuignorareaelementuluiceconineeroarea; sencearccorectareaerorii seabandoneazprocesuldetraducere. Dup momentul de analiz n care apar, erorile pot fi lexicale, sintactice sau semantice. Un alt criteriu de clasificare a erorilor este gravitatea lor; distingem avertismente (de obicei omisiuni de programare), erori care se pot corecta de ctre un compilator mai inteligent i erori fatale, care provoac abandonarea procesuluidecompilare. Gestionarul tabelelor este o colecie de proceduri care realizeaz crearea i actualizarea bazei de date a compilatorului, care conine dou categorii de informaii: proprii compilatorului (generate la implementare i constituite din mecanismelededescriereaanalizeilexicale,sintacticeisemantice) caracteristice programului surs (identificatori, constante, cuvinte cheie), caredeobiceisememoreazntrotabeldesimboluri. n faza de analiz lexical (de obicei) la ntlnirea unui nume nou, acesta este introdusntabeladesimboluri,reinnduseadresaintrrii.Oridecteorinumele estereferit,informaiaprezentntabelesteactualizatcuinformaiisauatribute noi ale numelui respectiv, verificnduse totodat consistena utilizrii acestuia (analiza semantic). La generare de cod, atributele numelui determin lungimea zoneidememoriealocatacestuia.Atributelenumeluipotserviinfazadetratare aerorilor. 30

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Analiza
Fazadeanalizcuprindetreietape:analizalexical,sintacticisemantic.Aceste treietapesepotimplementaseparatsauglobal. Analizalexical(scanningnengl.,analizorlexical=scanner)transformprogramul surs (considerat ir de caractere) ntrun ir de uniti lexicale, numite atomi lexicalisauparticulelexicale(tokensnengl.).Claseledeatomilexicali,considerate ca mulimi finite, corespund identificatorilor, constantelor ntregi, constantelor reale i operatorilor. Pe scurt, analizorul lexical realizeaz operaii de detectare, clasificareitraducere: detectarea n PS a subirurilor care respect regulile de formare aatomilor lexicali; clasificareaacestorsubiruri(identificareaclaseiacestora); traducereasubirurilornatomilexicali; memorareantabeladesimboluriaidentificatoriloriconstantelor. Deobicei,analizalexicalesteconsideratcaoetapaanalizeisintactice.Analizorul lexicalcontribuielacurareaPSdeoarecenumrulatomilorlexicaliestemaimic dectnumruldecaracteredinPS,seeliminspaiilealbesicomentariile,sepoate prelua n analiza lexical evaluarea unor construcii dificil de implementat n analizorulsintactic,rezultatulfiindreducereacomplexitiianalizeisintactice. Analizasintactic(parsingnengl.)esteunadinetapeleprincipalealeprocesuluide traducere.Prineaserealizeaztransformareairuluideintrare(formatdinatomi lexicali)n: descriereastructuralaacestuia,semanticechivalent(ncazulncareirul deintrareestecorectsintactic) mesajdeeroare(ncazcontrar). Analiza semantic structura sintactic poate fi folosit pentru specificarea semanticii unui limbaj. n general, semantica (nelesul) unei construcii poate fi exprimatprinoricecantitatesaumulimedecantitiasociateaceleiconstrucii.O astfel de cantitate asociat se numete atribut. Ca exemple de atribute putem meniona:omulimedeiruridecaractere,ovaloare,untip,oconfiguraiespecific dememorieetc.Aceastmodalitatedeabordareasemanticiisenumeteorientat de sintax. Regulile care definesc atributele unei construcii se numesc reguli semantice. O specificare de sintax mpreun cu regulile semantice asociate realizeazodefiniieorientatdesintax. De exemplu, dac dezvoltm un evaluator de expresii, semantica expresiei 2+3 poatefiexprimatprinvaloarea5.Dacdezvoltmuntranslatordinformainfixat n form postfixat semantica expresiei 2+3 ar putea fi exprimat sub forma tripletului(+23). 31

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

32

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

34

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Medii de programare i execuie


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

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

35

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Semantica unei declaraii


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

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

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

37

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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


constintTBLSIZE=100; constintTBLMAX=(TBLSIZE1);

Declaraia de constant este deci prefixat de cuvntul rezervat const. Ea conine precizarea tipului, numelui i a valorii asociate constantei, printrun iniializator. Tablourile,pointeriiireferinele const auointerpretare special.Dac un tablou este declarat const nseamn c fiecare element al acestuia este const, iar un pointerconstnseamncvariabilareferitdeelesteconst. ntermeniilimbajuluiC++,constnunseamnnicialocatntrozondememorie readonly i nici constant stabilit la compilare. Mecanismul const a fost conceput pentru a preveni eventualele accidente (ca de exemplu modificarea nedoritaunorvaloricareseconsiderconstante)inufraudele. Proteciaoferitdeacestmecanismpoatefieludatprintroconversieexplicitsau prinaliere.Deexemplu:
inti=1;//inuesteconst constint*p=&i;//inusevaputeamodificaprinp int*q=(int*)p;/*aliereacantitii*qcuiprinconversieexplicitdetipechivalentcuint*q=&p; iniializareaint*q=parfiilegaldincauzaincompatibilitiicaracteristicilordetip;*/ voidf() { p; i++; //ok:nuiesteconstcip (*p); //eroare:*pesteconst (*q)++;/*ok:qnuesteconst,decicantitateareferitadeaceastanuestesupusarestrictiilor demoficare*/ } voidg() { (*(int*)p)++//ok:conversieexplicita }

Dac un specificator const sau volatile apare ntro declaraie, el va modifica declaratorulcareurmeazimediatdupel.
constchar*step[3]={left,right,hop};

declaruntabloudepointerilairuridecaracterecaresuntconstante.Pointeriise potmodifica;iruriledecaracterenusepotprinintermediulacestorpointeri. 39

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Dac se dorete declararea unui tablou de pointeri constani la iruri de caractere constante,definiiarespectivsescrie:
constchar*conststep[3]={left,right,hop};

cazncarenusepotmodificaniciiruriledecaractereinicipointerii(elementele tabloului):
step[2]=skip;/*eroare:nusepoatemodificaunpointerconstant*/ step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/

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

Declaraii de tipuri de date


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

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Clasificarea tipurilor de date


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

structStudent { char*nume; intvarsta; };

dupcareputemdefiniovariabildetipStudentastfel:
structStudents;

Aceai secven de definire a tipului i variabilei se poate face mai compact cu ajutorulunuitipanonim:
struct { char*nume; intvarsta; }s;

Dinpunctuldevederealdefiniieilimbajului,distingemdoucategoriidetipuri: tipurifundamentale,careaucanumeidentificatoripredefinii; tipuri derivate, care au numele (identificator) dat de utilizator ntro declaraiececuprindeunconstructordetip. Dinpunctuldevederealmomentuluiverificriitipului,distingemdoucategoriide tipuripentruoexpresie: tipstatic(verificatlacompilare); tipdinamic(verificatlaexecuie). Unadincaracteristicileesenialealelimbajelordeprogramareorientatpeobiecte estelegareadinamicaprocedurilor,pebazatipuluidinamicalobiectelor. Un alt criteriu de clasificare este natura comportamentului reprezentanilor (obiectelor) unui anumit tip. O privire sumar asupra caracteristicilor instanelor ducelaidentificareaurmtoarelorclasedetipuri: simple sau scalare: ordinale (ntreg, boolean, caracter, enumerare, subdomeniu)ireale; irdecaractere; structurate(tablou,nregistrare,mulime,fiier,clas,uniune); pointer; procedurale. n limbajul C numele unui tip se d printrun numedetip, care este, din punct de vedere sintactic, exact ca o declaraie pentru o variabil sau o funcie de acel tip, numaicnuaparenumelevariabileisaufunciei. Exemple: 43

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Numedetip
int int* int*[3] int(*)[3] int*() int(*)(double)

Declaraia
inti int*pi int*p[3] int(*p3i)[3] int*f() int(*pf)(double)

Tipul ntreg Pointerlantreg Tabloude3pointerilantregi Pointerlatabloude3ntregi Funcie fr argumente care returneaz pointerlantreg Pointerlafunciecuunargumentdetip doublecarereturneazntreg.

Existiposibilitateadeadaunnumeunuinumedetip,prinmecanismultypedef,a cruisintaxgenericeste: typedefdeclaraiedevariabil; cunelesulcnumedetipesteidentificatorul(utilizator)coninutndeclaraiede variabil. Deexemplu:


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

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

Notaia de declarare din C i din C++ oglindete sintaxa expresiilor bazat pe precedena i asociativitatea operatorilor. Limbajele C i C++ exceleaz prin multitudineadeoperatori(fiindlimbajeorientatepeexpresii),pentrucareordinea de prioritate pare de multe ori nenatural; pentru a se obine prioritatea dorit trebuie folosite parantezele. De exemplu, declararea tipului anonim pointer la un tabloude10pointerilafunciiceauargumentintintorcunpointerlachar(chiar dac literar expresia este relativ rezonabil) este greu de exprimat n C++ i nu avantajeazlizibilitatea(festedeclaratcaovariabildeacesttip):
char*(*(*f)[10])(int);

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


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

Echivalena i compatibilitatea de tip


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

vor defini dou tipuri A i B compatibile n C (structural) i incompatibile n C++ (dupnume).Maimult,declaraiile:


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

definesc dou tipuri diferite, ambele cu numele D (att n C ct i n C++). Dac compilatorul face verificarea celor dou fiiere (uniti de traducere) 1 i 2, se obineeroareadefiniiedubl. Dinpunctuldevederealimplementrii,attnCctiC++garanteazcstructuri similare (cum sunt A, B i D din exemplu anterior) au reprezentare identic n memorie,decielesepotconvertiexplicitifolosidreptstructuricompatibile:
externf(structA*) structA{intx,y;}; structB{intx,y;}; voidg(structA*pa,structB*pb) { f(pa);/*correct*/ f(pb);/*eroareC++:enecesarargumentA*datoritechivaleneidenume,nscorectnC conformechivaleneistructurale*/ pa=pb;/*eroareC++:trebuieA*;corectnC*/ pa=(structA*)pb;/*corect:conversieexplicit*/ pb>x=1; if(pa>x!=pb>x) error(implementaregresita); }

46

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Elemente definitorii ale unei variabile


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

Atribute Y

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

49

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

50

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Clase de memorie C
n limbajul C funciile nu se pot include unele n altele, deci nivelul de nglobare staticaltuturorfunciiloresteacelai.nCexistattinstruciunicompuse,cti blocuri se permit definiri de obiecte n cadrul blocurilor. O alt caracteristic a limbajului este compilarea separat, rezultnd segmente diferite care sunt legate mpreundectreeditoruldelegturi. Pentrudeterminareadomeniuluidevizibilitateiadurateideviapentruvariabile, limbajulCintroduceunnouatributpentruacestea: clasadememorie.Existpatru astfel de clase, care se declar cu cuvintele rezervate: auto (declaraie implicit pentruvariabileledeclarateninteriorulfunciilor),register,staticiextern(clasa implicit pentru variabilele declarate n afara funciilor). Precizarea clasei de memorieiatipuluivariabileisefacentrodeclaraiedeforma: <nume_clas><tip><list_nume_variabile>; unde: <list_nume_variabile> conine identificatorii ce reprezint numele variabilelor,separaiprinvirgule. Variabilele auto sunt declarate n interiorul funciilor. O astfel de variabil este activattatimpctesteactivunitateadeprogram(funciasaublocul)lanceputul creia a fost declarat pierzndui valoarea la terminarea execuiei respectivei uniti de program, la o nou apelare nemaifiind disponibil vechea ei valoare. n 52

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Variabilele static sunt de dou categorii: static interne i static externe. Nu este necesarfolosireadecuvintecheierezervatenacestsens,ncadrareauneivariabile static n categoria corect fcnduse n funcie de locul n care apare declaraia: static interne dac se declar n interiorul unei funcii i static externe dac se declarnafarafunciilor: 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
staticinta[20];//variabilaaestedetipstatic

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Etape ale lucrului cu variabile


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Coninespecificatorulexterninuareiniializareasaucorpdefuncie; Declarunmembrustaticntrodeclaraiedeclas; Esteodeclaraiedenumedeclas; Esteodeclaraietypedef. Urmtoareadeclaraieesteidefiniie:


inta;

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

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

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


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

iarcaexempledeoperaiiilegaleavem: 55

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Exemple:
inti=1; //isepoatemodifica constint*p=&i;//pointerlaobiectconstant //pointerulsepoatemodifica,nuinsasi //obiectulreferit int*constvp=&i; //pointerconstantlaunobiect //obiectulsepoatemodifica, //nuinsasipointerulcarelrefera constint*constcp=&i;//pointerconstantlaun //obiectconstant //niciobiectulnusepoatemodifica, //nicipointerulcarelrefera. voidf() { i++; //OK:inuesteconst p; //OK:pnuesteconst (*vp);//OK:*vpnuesteconst cp++; //eroare:nusepoatemodificaunobiectconst (*cp);//eroare:nusepoatemodificaunobiectconst (*p)++;//eroare:nusepoatemodificaunobiectconst vp++;//eroare:nusepoatemodificaunobiectconst }

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

57

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Tipuri fundamentale
Fiecare limbaj de programare i definete tipurile fundamentale, numite i tipuri baz, care de obicei corespund tipurilor main. Pentru aceste tipuri, definiia limbajuluiintroduceidentificatoripredefinii. Dinpunctuldevederealcomportamentuluilor,tipurilefundamentalesepotmpri n tipuri aritmetice, caracter i boolean. Despre precizarea detaliat a operatorilor vomdiscutantrunaltcapitol. Tipurile aritmetice (ntregi i reale) sunt apropiate de maina fizic. n general exist mai muli reprezentani ai acestor tipuri, tipuri care difer unele de altele prin: maniera i lungimea de reprezentare, prezena semnului etc. Operaiile de bazsuntcelearitmetice(rezultnd expresiiaritmetice)idecomparare (expresii relaionale). Domeniultipuluidedatbooleanarenumaidouvalori:trueifalse.Existcinci operaii definite pe acest tip: and, or, not, imp (implicaia logic) i equiv (echivalenalogic).Definireaoperaiilordemaisussepoatefaceastfel(utilizndu seoinstruciuneifelseipresupunndcxiysuntvariabilebooleene): xandy=ifxthenzelsefalse xory=ifxthentrueelsey notx=ifxthenfalseelsey ximpy=ifxthenyelsetrue xequivy=ifxthenyelsenoty LimbajulCconsideroriceirbiiceconinnumai0cafalse,respectivtrueoriceir debiintrecareesteunulnenul. Operanzii de tip boolean se folosesc la formarea expresiilor logice, cu ajutorul operatorilorlogici. n C++ exist dou mari clase de tipuri fundamentale: aritmetice i void (cu domeniuldevalorivid).Tipurilearitmeticesuntformatedintipurintregi(char,int n toate variantele i enumerrile) i tipuri reale (flotante). Valorile minim i 58

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

maxim din domeniul fiecrui tip sunt precizate, pentru fiecare implementare, n fiierulheader(antet)<limits.h>. Tipulchararecadomeniusetuldecaracteredebazallimbajului.Fiecareinstan asaestememoratntrovariabildetipcaracter,carearecavaloarecodulntreg alcaracterului.Caracterelesepotdeclaracusemnsaufrsemn(declarareexplicit signed sau unsigned); exist deci trei tipuri distincte: char, signed char i unsigned char. Fiecare va ocupa acelai spaiu de memorie (determinat de operatorul sizeof()). Existtreitipurintregidistincte:int,shortilongint.Tipurilesignedchar,short,int ilongaucorespondentuntipunsigned,careocupacelaispaiudememorie. Tip sizeof (n Aliniere (multiplu de, n octei) octei) char 1 1 short 2 2 int 2sau4 2sau4 long 4sau8 4sau8 n C++ (ca i n C) nu este predefinit tipul boolean. Orice expresie cu valoarea diferit de zero (sau diferit de echivalentul lui 0 n cazul domeniului oricrui alt tip)esteconsiderattrue,iaroriceexpresiecuvaloarea0esteconsideratfalse. Tipul enumerare este un tip ntreg distinct ce are constante cu nume. Numele su devine un aa numit numeenumerare, care este cuvnt rezervat n domeniul de vizibilitatepropriu.Identificatoriidintrolistenumeraresuntdeclaraiconstantei pot apare oriunde pot apare constante. Dac nu apar enumeratori cu =, valorile respectivelor constante ncep de la 0 i cresc cu 1, de la stnga la dreapta. Un enumeratorcu=vadaidentificatoruluivaloareaindicat,carermnecavaloare destartpentruurmtoriienumeratori.Valoareaunuienumeratortrebuiesfiede tipintsaudetipcesepoateconvertilaint. Numeleenumeratorilortrebuiesfiedistinctedecelealevariabilelorordinaresau alealtorenumeratorinacelaidomeniudevizibilitate.Deexemplu:
enumculori= {rosu,orange,galben,verde,albastru}; enumfruct= {mar,para,orange,kiwi};//eroare:orangeesteredefinit enumpasare= {strut, dodo, lebada, kiwi};//eroarekiwiesteredefinit intlebada;//eroare:lebadaredefinit

59

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Valorileenumeratorilornutrebuiesfiedistincte.Unenumeratoresteconsideratc se definete dup ce sa citit numele (i eventual iniializatorul, dac exist). De exemplu:
enum{a,b,c=0}; enum{d,e,f=e+2};

definetea,c,dcuvaloarea0,biecuvaloarea1ifcu3. Fiecare enumerator definete un tip ntreg diferit de toate celelalte tipuri ntregi. Tipulunuienumeratoresteenumerareasa. Tipurilerealedistinctesunt:float,doubleilongdouble.Caracteristicilelorsunt precizatenfiierulantet<float.h>. Tip sizeof (n Aliniere (multiplu de, n octei) octei) float 4 4 double 8 4sau8 long 12sau16 4,8sau16 double Tipulvoidaredomeniulvalorilorvid.Estefolositpentruaprecizatipulrezultatului ntors de funciile cu semantic de procedur. Nu se declar obiecte de tip void; orice expresie se poate converti explicit la tipul void, iar rezultatul conversiei se poatefolosinumaipepostde:instruciuneexpresie,operandstng,expresievirgul saualtreileaoperanddinexpresiacondiionalconstruitcuoperatorul?:.

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

60

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

nCsefoloseteurmtoareaconveniepentrureprezentareairurilordecaractere: unirdencaracteresereprezintpen+1octei,numerotaidela0lan,astfel: octetuli(dela0lan1)conineali+1leacaracterdinirulconsiderat octetul n conine un caracter terminator de ir: caracterul NULL (\0) din ASCII;rezultcacestcaracternupoatefacepartenCdintrunirdecaractere. Includerea ntrun limbaj de programare a unor operaii specifice prelucrrii irurilordecaracterepresupuneurmtoarele: existenatipuluidedateirdecaractere(string); prelungireautilizriioperatorilorrelaionalipeiruridecaractere; stabilireauneireprezentripentruiruriledecaractere; stabilireauneimulimiminimaledeoperaiipeiruridecaractere. nC,C++tipulirdecaracterenuestepredefinit.Tratareairurilordecaracterese poatefacefolosinddeclaraiadetablou: char[n](sauchar[]) Indiciiacestortablourincepcu0,iarreprezentareasefacenconveniaC. Pentru a prelucra iruri de caractere folosim funcii din biblioteca standard C: strcpy,strcmp,strstr,strchr,strlenetc.

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

*(indirectarea)*parecarezultatobiectuldetipTreferitdepdacpestede tipulpointerlaT. &(adresalui)&parecarezultatobiectuldetippointerlaT(Tfiindtipullui p)carereferpep,decicualtecuvinte,adresaluip. ++,incrementareaidecrementareavalorilordetipadres. Operaiidecomparare Operatorii new i delete (doar n C++) pentru alocarea i eliberarea variabilelordinamicereferitedepointeri. Limbajul posed numai semantica apelului prin valoare pentru transmiterea parametrilor actuali ai funciilor. Apelul prin referin se poate simula folosind explicit pointerii. De multe ori este suficient prima metod de transmitere prin valoare,maialespentrutipurilefundamentalealelimbajului.Eapoatedevenins neconvenabil pentru parametri de tipuri de date utilizator de dimensiune mare. (Observaie:oinconsistensemanticalimbajuluiCestectablourilesetransmit ntotdeauna prin referin) i devine un impediment serios n calea definirii unei notaiiconvenionalepentrutipdedateutilizatordinC++.

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

63

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

n limbajul C un nou tip se declar prin prefixarea unei declaraii de variabil cu cuvntulrezervattypedef,numelevariabileidevenindnumedetip.Aadar,ncazul definiriidetipurifuncionalevomaveaformageneral: typedef<declaraie_de_funcie> Exemple:
typedefvoidffp();//definiiedetip ffppfp;//definiiedevariabil typedefvoidfpr(floata,floatb,floatc); typedeffloatfreal(floatx); typedeffloatffunc(floatp1,floatp2,frealf);

n limbajul C numele unei funcii este evaluat n cadrul programelor la adresa de nceput a funciei n cadrul codului compilat, deci variabila pfp de mai sus va reprezenta o cantitate de tip adres compatibil cu orice valoare reprezentnd numeleuneifunciifrparametriidetipvoid. Adresa unei funcii se obine deci prin simpla specificare a numelui funciei fr parantezeiaceastadrespoatefiatribuitunuipointerdefunciecurezultati parametricompatibili.Pointerulpoatefifolositapoipentruapelulfunciei:
intf(int,char);//declaraiafuncieif int(*pf)(int,char);/*sedeclarpfcapointerlafunciededouargumente(intichar)centoarce unntreg*/ inti,j;charc; pf=f;//atribuiredeadrese j=(*pf)(i,c);//apelulfuncieiffolosindpf

Limbajul C cere ca la apelul unei funcii chiar i fr parametri s fie utilizate parantezelerotunde.Sepotscrieurmtoarelesecvene:
if(f1()!=f()){}//testasupravalorilorreturnate

sau Tipul ntors i tipurile argumentelor sunt considerate parte a tipului funciei; argumentele implicite nu. Funciile nu pot ntoarce tablouri de funcii, dar pot ntoarcepointerilaastfeldeobiecte.Nuexisttablouridefuncii,darexisttablouri depointerilafuncii.
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 (constant) loc(B(i,j))=adrsli2*(ls1li1+1)*lungli1*lung+ +i*lung+j*(ls1li1+1)*lung n expresiile de mai sus, ultimele relaii corespund unor calcule optime de adres, pringruparealanceputatermenilorconstani(termeniicenuconinindiciiiijca factori). Elementelecetrebuietratatecndsediscutprezenatipuluitablounlimbajelede programaresunt:

67

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Tipul de date nregistrare


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

68

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Dei numele asociat structurii i variabilele de structur declarate sunt elemente opionaletrebuiesaparmcarunadinceledou. Exemplu:
struct{charnume[30]; intvarsta;floatgr;}cineva;

declarvariabilacinevacafiindostructurcegrupeaztreitipurideinformaii. Pentru a se putea declara mai multe variabile de aceeai structur exist dou posibiliti: atribuireaunuinumepentruansamblulcmpurilorstructurii:
structpersoana{charnume[30]; intvarsta;floatgr;}; structpersoanacineva,altcineva[20]; structpersoanaNoi[],*Voi[]; typedefstruct{charnume[30]; intvarsta;floatgr;}persoana; persoanacineva,altcineva[20];

definireaunuinumedetippentruspecificaiastructurii:

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.

unionnume_uniune{[tipnume_var]}[decl_variabile];

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

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

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


X.int X.f X.psir

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

Tipuri definite de utilizator


POO

70

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Notaiainfix:E1opE2 Notaiaprefix:opE1E2 Notaiapostfix:E1E2op De exemplu, dac operatorul op este cel de adunare, adic +, iar operanzii sunt douexpresiisimple(variabile),notatecuxiy,atunciexpresiacaredenotsuma acestorasescrie: Notaiainfix:x+y Notaiaprefix:+xy Notaiapostfix:xy+ Analog,oexpresiescrismatematicnforma(x+y)*zsevatranscrieastfel: Notaiainfix:(x+y)*z Notaiaprefix:*+xyz Notaiapostfix:xy+z* nnotaiainfix(notaieuzualnmatematic),unoperandEsepoateincludentre paranteze,nforma(E)pentruclaritateaexprimrii;valoarealuinusemodificn prezenaparantezelor.nnotaiaprefixipostfixnumaisuntnecesareparantezele, deoareceoperanziifiecruioperatorsepotdeterminaframbiguiti. Regulilenotaieiprefixsunt: Pentrufiecareoperatorsecunoatearitatealui; Notaiaprefixpentruoconstantsauvariabilesteconstantasauvariabilan cauz; Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia prefixnformaopE1E2. Aplicareaoperatoruluinar(dearitaten>=0)opnlasubexpresiileE1,E2,,En sescriennotaieprefixcaopnE1E2En. Dacsenlturprimaregulatuncicelelaltedouregulideconstruireaexpresiilor semodific:estenecesarprezenaparantezelorpentruadelimitaoexpresie,deci expresiileconstruitevoraveaforma:(opE1E2)respectiv(opnE1E2En). Regulilenotaieiinfixsunt: Pentrufiecareoperatorsecunoatearitatealui; Notaiapostfixpentruoconstantsauvariabilesteconstantasauvariabila ncauz; Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia postfixnformaE1E2op. Aplicareaoperatoruluinarar(dearitaten>=0)opnlasubexpresiileE1,E2,, EnsescriennotaieprefixcaE1E2Enopn

72

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

2. Unari

73

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


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

de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la dreapta lastnga de la dreapta lastnga de la stg. la dr.

=+== *=/=%=&= ^=|= <<=>>= ,

Arborele unei expresii


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

74

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

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

Clase de operatori i de expresii (dup tipul rezultatului)


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

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

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

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

76

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Operatori pe iruri de caractere


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

Operatori pe iruri de bii


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Conversie explicit i implicit


nCiC++estecelmaibineilustratconceptuldeconversie. n unele situaii, este nevoie de conversia explicit a valorii unui anumit tip la valoareaaltuitip.Oconversieexplicitdetipproduceovaloareaunuitippebaza valoriialtuitip.Astfel:
floatr=float(1);

efectueazconversiantregului1nvaloareanvirgulflotant1.0fnaintedease efectua operaia de atribuire. Rezultatul unei conversii de tip nu este o lvaloarea, decinupoatefiatribuit(cuexcepiatipuluireferin). Existdounotaiipentruconversiaexplicitdetip:notaiaCtradiional,numit cast,deex.(double)ainotaiafuncionaldouble(a).Ultimanusepoatefolosi pentrutipuricarenuaunume simplu.Astfel,pentru aconvertiovaloarelauntip pointeranonim,sevafolosinotaiacast: sausepoatedefiniunnounumedetipiatuncisepoatefolosinotaiafuncional: O conversie de tip trebuieevitatdac nueste necesar. Programele care folosesc conversii explicite de tip sunt mai greu de neles dect programele care evit conversiile prin recurgerea la tipuri pentru a reprezenta concepte de nivel nalt. Corectitudineaconversiilorexplicite detipdepindenmodcritic demodulncare programatorulnelegemanierancareobiectelediferitesuntgestionatedelimbaj, precumidedetaliiledeimplementareacompilatorului.Deexemplu: 78
typedefchar*Pchar; char*p=Pcahr(0777); char*p=(char*)0777;

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

inti=1; char*pc="asdf"; int*pi=&i; i=(int)pc; pc=(char*)i;//pcipoateschimbavaloarea. //peunelemainisizeof(int)estemaimicdectsizeof(char*) pi=(int*)pc; pc=(char*)pi;//pcipoateschimbavaloarea. //peunelemainiunchar*sereprezintaltfeldectunint*

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

Operatorul condiional
LimbajeleCiC++dispundeunoperatorcondiional(?:)caresepoateutilizan cazurilecndinstruciuniledeexecutatsuntexpresii.Sintaxageneraleste: expr_logic?expr_adev:expr_fals echivalentsemanticcu: if(expr_logic)expr_adev;elseexpr_fals; Expresia expr_logic trebuie s fie de tip aritmetic sau pointer. Dac evaluarea ei furnizeazovaloareadiferitdezero,rezultatulexpresieicondiionaleestevaloarea expresiei expr_adev, n caz contrar fiind valoarea expresiei expr_fals. Eventualele efecte secundare introduse de evaluarea expresiei expr_logic au loc nainte de evaluarealuiepxr_adevsauexpr_fals. Determinarea maximului a dou valoria a i b se poate face prin expresia codiional:
max=(a>b)?a:b;

79

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Operatorul virgul
nCiC++virgulaesteconsideratoperatorcuurmtoareasemnificaie:osecven deexpresiideforma epxr1,expr2,,exprN reprezinteansioexpresiencareseevalueazsuccesiv,delastngaladreapta expresiile. Valoarea final atribuit expresiei secven este cea a expresei exprN. Expresiile componente trebuie s fie atribuiri, incrementri sau decrementri, n afardeexprNcarepoatefioarecare,deoareceaceastadvaloareantregiisecvene. Efectele primelor N1 expresii sunt de fapt efectele secundare ale unei astfel de expresiisecveniale.Deexemplu,dupefectuareaatribuiriidemaijos: intx=6,y=7,z,w;
w=(z=y+x,y=yx,x=x*yz,x+y+z);

vomobine

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

n listele de parametri actuali sau de iniializatori, operatorul virgul trebuie s apar n cadrul unei expresii secveniale cuprins ntre paranteze. De exemplu, apelul
f(a,(b=3,b+4),c);

aretreiparametriactuali,aldoileaavndvaloarea7.

Modaliti de evaluare a expresiilor


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

80

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Evaluarea expresiilor aritmetice mixte


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

Compararea expresiilor de tip pointer


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

Evaluarea expresiilor logice


ncazulexpresiilorbooleene(logice),nspecialpentrucazurilecndoperatoruleste andsauor,esteposibilcasnusecunoascconcomitentvalorileambiloroperanzi. Deexemplu,expresia:
x!=0||y/x>5

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

81

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

dac x este zero atunci rezultatul ei este false, dar dac se ncearc i evaluarea subexpresiei y/x>5, ctul y/x este nedefinit, prin urmare nu se poate face aceast evaluare.Dinexempluprezentatrezultposibilitateaevaluriiscurtcircuitncazul expresiilorlogice,cuefectebeneficeattpentrutimpuldeexecuie(seeliminunele operaii inutile) ct i pentru fiabilitatea programului (se evit unele situaii de excepie).Evaluareascurtcircuitsepoatedefiniprindoureguli: 1. fiinddatexpresiae:=xandy,dacx=false,atuncie:=false 2. fiinddatexpresiae:=xory,dacx=true,atuncie:=true n C++, expresiile care conin operatorii relaionali <, >, <=, >= folosesc asociativitatealastnga.Definiiaexpresieirelaionaleeste: expresierelaional::= expresiededeplasare expresierelaional>expresiededeplasare expresierelaional<expresiededeplasare expresierelaional<=expresiededeplasare expresierelaional>=expresiededeplasare Operanziitrebuiesfiedetiparitmeticsaupointer.Operatorii<,>,<=,>=produc rezultatul 0 dac relaia specificat se evalueaz la false i 1 dac se evalueaz la true.Tipulrezultatuluiesteint. Pentru operanzii aritmetici se efectueaz conversiile aritmetice uzuale, iar pentru operanziipointerseefectueazconversiidepointer.Deaicirezultc: Oricepointersepoatecomparacuoexpresieconstantceseevalueazla0. Oricepointersepoatecomparacuunpointerdetipulvoid*(nacestcazse faceprimadatconversialavoid*). Pointerii la obiecte sau funcii cu acelai tip (dup efectuarea conversiilor de pointeri)sepotcompara:rezultatuldepindedepoziiilerelativealeobiectelorsau funciilorpunctatedepointerinspaiuladreselor. Reguliledecomparareapointerilorsunt: 1. doipointerilaacelaiobiectsuntegalidinpunctuldevederealcomparrii; 2. cnddoipointeripuncteaz spremembrinonstaticiaiaceluiaiobiect, pot existaurmtoarelesituaii: a. Dac cei doi membri sunt separai de o etichet de specificator de acces i dac clasa obiectelor nu este uniune, atunci pointerul la ultimul membru declarat (dintre cei doi membri referii) este mai maredinpunctuldevederealcomparrii. b. Dac cei doi membri sunt separai de o etichet de specificator de acces,rezultatulestenedefinit; c. Dacpointeriipuncteazspremembriaiaceleiaiuniuni,eisuntegali dinpunctuldevederealcomparrii.

82

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

83

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Instruciunea de atribuire
Instruciuneadeatribuireareformageneral: expridopatrexpr unde: exprid esteoexpresiedeidentificare; opatr esteoperatoruldeatribuire; expr esteoexpresie. 84

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

se face apel la lvaloarea lui x n stnga operatorului = i la rvaloarea lui x n dreaptaoperatorului=. n limbajele actuale exist operatori prefix care produc adresa unei variabile (operatorul@nPascal)sautipuri(tipulreferinnC++).Deexemplu:
inti; i=5; int&ri=i;//inC++ ri=7;

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


intv1,v2;/*v1iv2suntdetipint*/ int*pv1,*pv2,*pv3;/*pv1,pv2ipv3suntdetippointerlaint*/ /*situaiainiial*/ v1=5;/*Iniializarealuiv1*/ v2=15;/*Iniializarealuiv2*/ pv1= (int*)malloc(sizeof(int));/*alocare dinamicde memoriepentruunntreg,iiniializarealui pv1cuadresaacesteimemorii*/ /*1.iniializareavariabilelordinamice*/ *pv1=v1;/*zonadememoriepointatdepv1esteiniializatatribuiredevalori*/ pv2=&v2;/*iniializareapointeruluipv2atribuiredepointeri*/ pv3=pv1;/*atribuiredepointeri,salvarenecesarpentrudealocareazoneidememoriealocatmai sus*/ /*2.atribuiredepointeri*/ pv1=pv2;/*pv1vaaveaaceaivaloarecaipv2deci*pv1i*pv2desemneazacelaiobiect,aiciv2 */ /*3.atribuiredevalori*pv1=*pv2*/ pv1=pv3;/*refacereavariabileidinamicepv1atribuiredepointeri*/ *pv1=*pv2;/**pv1i*pv2auaceeaivaloarefrcapv1ipv2sfieegale*/ /*4.atribuireindirectv1=v2prin*pv1=*pv2*/ pv1=&v1;/*pv1conineadresaluiv1*/

85

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


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

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

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

Instruciuni condiionale (de ramificare, de selectare)


Instruciunile condiionale (de selectare sau de ramificare) au ca scop alegerea unuiadintremaimultefluxuridecontrolalprelucrrii(alternativedecontinuarea execuiei)posibilelaunmomentdat. Primainstruciunecondiionalesteif: SintaxainstruciuniiifnlimbajulCeste:
if(expresie) instruciune1; [else instruciune2;]

86

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

undeexpresietrebuiesfiedetiparitmeticsaupointer.Dacexpresieseevalueaz la o valoare diferit de zero atunci se execut instruciune1, altfel se execut instruciune2.Parteaelseesteopional. nlimbajeledeprogramarencareexisttipuldedateboolean,expresietrebuies fieoexpresielogicacreivaloareestetruesaufalse. A doua instruciune condiional este instruciunea de selectare, instruciune care este o soluie mai elegant pentru situaiile de programare n care se folosesc instruciuni ifelseif n cascad. Rolul semantic al instruciunii de selectare este alegereauneialternativedintromulimedevariantereciprocexclusive.Eapoatefi simulat printro cascad de instruciuni ifelse, dar avantajul ei const ntro expresivitatesporitaexprimrii.Deducereaalternativeicareseexecutsefacepe baza unei expresii numite selector, iar valorile luate n considerare se numesc etichete case. Cnd se discut despre instruciunea de selectare trebuie avute n vedereurmtoareleaspecte: tipulexpresieiselectoare; tipuletichetelorcase; esteposibilexistenaetichetelorreciprocneexclusive; eticheteleacopertoatmulimeavalorilorexpresieiselectoare. posibilitateaexprimrilorninteriorulsauexteriorulcorpuluiinstruciunii. InstruciuneadeselectareanlimbajeleCiC++esteinstruciuneaswitch.Expresia selectoaretrebuiesfiedetipntregsaudetipclaspentrucareexistoconversie neambigu la tip aritmetic sau pointer. Orice instruciune din corpul lui switch poatefietichetatcuunasaumaimulteetichetecasedeforma: caseexpresieconstant: unde expresieconstant se convertete la tipul expresiei selectoare. ntro instruciuneswitchnupotexistadouconstantecasecuaceeaivaloare.Corpullui switchpoatesconinicelmultoetichetdeforma: default: La execuia instruciunii switch, se evalueaz expresia selectoare i se face comparaiacufiecareconstantcase.Dacunadintreconstantelecaseesteegalcu valoareexpresiei,setransfercontrolullainstruciuneacuetichetacaserespectiv. Dacvaloarenucorespundeniciuneiadintreconstantelecaseidacexisteticheta default,setransfercontrolullainstruciuneacuaceastetichet,iardacnuexist default,nuseexecutniciunadininstruciuniledincorpulluiswitch. Etichetele case i default nu altereaz fluxul de control, care continu n corpul lui switch.Pentruaprsicorpulluiswitch,sefoloseteinstruciuneabreak.Deobicei instruciunile care fac obiectul lui switch sunt instruciuni compuse, dar nu este obligatoriuacestlucru. 87

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Instruciuniledincorpulluiswitchpotfiideclaraiidartotuinuesteindicatsse facastfeldedeclaraii.

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

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

88

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

iesteechivalentcu:

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

cu excepia faptului c ntlnirea unei instruciuni continue n instruciune va provoca evaluarea lui expr2 nainte de evaluarea lui expr1. Prin urmare, prima instruciune nseamn iniializarea ciclului, expr1 este condiia de continuare a ciclrii,testatnaintafiecreiiteraii(seterminciclareacndexpr1devine0),iar expr2 specific de obicei o aciune care modific ceva (de obicei incrementarea variabilei de ciclare care se face dup fiecare iteraie). Expr1 trebuie s fi de tip aritmetic. Attexpr1ctiexpr2suntopionale.Daclipseteexpr1,seobineoconstrucie echivalentcuwhile(1)
for(;;)//cicluinfinit

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

89

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros returnexpresieopt; gotoidentificator;

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

Programarea structurat i cum s-a ajuns la ea


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

91

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

subproblema fiind o abstractizare ce reprezint mulimea calculelor necesare realizrii postcondiiei. Astfel, o subproblem poate fi neleas ntrun sens mai larg,caonouoperaiepemulimeadatelorcesatisfacprecondiia. Sepoatevorbideabstractizareladouniveluri:proceduraliprintipuriabstracte dedate. Abstractizarea procedural este o abstractizare de tip operaional prin care se realizeazonouoperaie,utilizabildupdefinireaei.Eapermiteadugareadenoi operaii(extinderea)unuilimbajdeprogramare(consideratcamainvirtual). Abstractizarea prin tipuri de date abstracte presupune definirea de noi clase (structuri)dedateidefinireadeoperaiipeacesteobiecte,carerealizeazcrearea, actualizarea sau distrugerea acestor obiecte sau ofer informaii asupra comportamentului acestora. Acest nivel de abstractizare utilizeaz abstractizarea procedural. Abstractizarea prin proceduri combin metodele abstractizrii prin parametrizare cu cele ale abstractizrii prin specificare. Procedura este o unitate sintacticisemanticcaredescrietransformareaargumentelorfurnizatelaintrare nargumentedeieire.Dinpunctdevederesemantic,procedurasepoateidentifica ntro oarecare msur cu subproblema. Ea se poate considera abstract ca o aplicaiepemulimeaargumentelordeintrare,cuvalorinmulimearezultatelor,cu eventualamodificareaintrrilor. Abstractizare prin proceduri trebuie s satisfac trei cerine: minimalitate, generalitate i simplitate. Minimalitatea este caracterizat prin faptul c, comportamentul unei proceduri trebuie precizat numai n limitele realmente necesare.ngeneral,caracterulminimalaluneiproceduriimplicnedeterminismul (soluii multiple), care de obicei se rezolv la nivelul implementrii, obinnduse unicitatea soluiei. Generalitatea se obine prin utilizarea parametrilor n locul variabilelor sau al ipotezelor specifice. Simplitatea nseamn c procedura trebuie saibunscopbinedefinitiuordeexplicat,caresnudepinddecontextuln careesteutilizat.Seafirmcoprocedurestebinegnditatuncicndsepoate descrie scopul ei prin numele acesteia (adic se folosesc ct mai puine cuvinte pentruaexplicamenireaei).Simplitateaimplic,deobicei,caoprocedursaib uncoddeimplementareredus(deordinulzecilordeliniisurs). Abstractizareaprinparametrizareservetelaidentificareadatelorutilizate.Eaeste definit cu ajutorul parametrilor formali. Ori de cte ori se apeleaz o procedur, parametrii de apel (efectivi) trebuie n general s corespund ca numr i semnificaiecuceiformali.Distingemdejadoumomentedeosebitedinviaaunei proceduri: proiectarea i utilizarea ei. Lista de parametri, stabilit la proiectarea uneiproceduri,realizeazinterfaacualteproceduri,conferinduinacelaitimpo mai mare generalitate (aplicabilitatea n mai multe situaii, prin setarea corespunztoare a parametrilor efectivi), cu efect n realizarea de aplicaii compacte,maiuordescrisidentreinut. 93

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

matematic, sau informal, cnd specificaiile au un caracter descriptiv, suferind n precizieirigoare,darfiinduordeneles. Specificareauneiproceduriconineantetulacesteia(parteasintacticaspecificrii) idescriereaaciunii(parteasemantic).Antetulconine:numeleproceduriiilista de argumentelor (parametrilor), caracteriznd numele, tipul i ordinea acestora. Descriereaaciuniiproceduriisefaceprinaseriunile: necesit(condiiilesaurestriciiledeutilizare; modific(parametriideintrarecaresemodific); realizeaz(comportamentulprocedurii). Din punctul de vedere al modului n care furnizeaz rezultatul aciunii lor, procedurile sunt de tip subrutin sau funcie. Procedurile de tip subrutin i materializeazefectulnmodificareaparametrilordeieire(eventualiaunorade intrare), pe cnd funciile furnizeaz un rezultat de un tip precizat, determinat de parametri. Schemadespecificareauneiprocedurieste: nume=proc(listaargumentelor)[returns(rezultat)] necesitseprecizeaztoaterestriciiledeutilizareaprocedurii. modificseprecizeazargumentelecaresemodific. realizeazdescriecomportamentulprocedurii. Dmncontinuarectevaexempledespecificareaprocedurilor. concat=proc(a,b:string)returns(ab:string) realizeaz la terminarea execuiei, ab este un nou ir de caractere ce conine caractereledinirula(nordineaapariiei),urmatedeceledinirulb. elim_dubl=proc(a:array[int]) modifica realizeazsuprimareaapariieimultiplealeelementelordina.Indiceleinferioral lui a rmne acelai, darordineaelementelor inumrul deelementedin a se pot modifica. caut=proc(a:array[int],x:int)returns(i:int) necesitatableordonatcresctor realizeazdacexistunindiceipentrucarex=a[i],rezultatulestei,altfelivafi unntregcuvaloareamaimaredectindicelesuperioralluia. Dinpunctuldevederealspecificriilor,procedurilepotfitotale(lipseteaseriunea necesit), deci nu exist restricii de utilizare a lor, sau pariale (este prezent aseriunea necesit). Termenii total sau parial trebuie considerai n raport cu domeniuldedefiniiealprocedurii:oprocedurtotalestedefinitpetotdomeniul su(consideratcaproduscartezianaldomeniilortipurilordedatceformeazlista 95

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

97

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

Evaluarea i transmiterea parametrilor


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

98

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros }

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

Specificarea parametrilor unei proceduri


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

Noiunea de efect secundar


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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

Proceduri mutual recursive


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

100

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

9. ANEXE
Codspaghetti
Cod sub form de spaghete este un termen peiorativ pentru un cod surs complex cu o structur de control nclcit,cefolosetemulteinstruciuniGOTO,excepii,fire deexecuieialteelementederamificarenestructurate.Un termen sinonim dar mai puin folosit este cod cangur pentrucsuntmultesalturincadrullui. MaijosdmunexemplutrivialdecodscrisnlimbajulBASICcepoateficonsiderat subformdespaghete.Programulafieaznumereledela1la10iptratullorpe ecran.Codulnutrebuiesfiealiniat(indentat).Liniileprogramuluisuntnumerotate i instruciunile GOTO se bazeaz pe aceste numere de linii. Controlului execuiei programuluisaredelaozonlaaltantrunmodnufoarteprevizibil.nprogramele adevrateastfeldesecvenedecodsuntmultmaicomplexeipotducelacreterea foartemareacosturilordentreinerealeunuiprogram.
10dimi 20i=0 30i=i+1 40ifi<>10thengoto90 50ifi=10thengoto70 60goto30 70print"Terminat." 80end 90printi&"lapatrat="&i*i 100goto30

Aceeaisecvendecoddarscrisntrunstildeprogramarestructurat(nlimbajul C):
inti; for(i=1;i<=10;i++) printf(%dlapatrat%d,i,i*i); printf(Terminat.); intpatrat(inti) { returni*i; }

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

UniversitateadinOradea,Facultateadetiine, DepartamentuldeMatematiciInformatic SuportdecurspentrudisciplinaProgramareprocedural Specializrile:InformaticiMatematicanulI,semestrulI


Lectoruniv.HoreaOros

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

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

102

Вам также может понравиться

  • Culegere Probleme de Informatica
    Culegere Probleme de Informatica
    Документ95 страниц
    Culegere Probleme de Informatica
    g_teodorescu
    100% (31)
  • Proiect Strategie Educatia 2030
    Proiect Strategie Educatia 2030
    Документ43 страницы
    Proiect Strategie Educatia 2030
    Gîncu Silviu
    Оценок пока нет
  • Reports7599 - 2021 06 14
    Reports7599 - 2021 06 14
    Документ12 страниц
    Reports7599 - 2021 06 14
    Gîncu Silviu
    Оценок пока нет
  • Îndrumar - Lucrarea de Diplomă - 2020 PDF
    Îndrumar - Lucrarea de Diplomă - 2020 PDF
    Документ44 страницы
    Îndrumar - Lucrarea de Diplomă - 2020 PDF
    Igor Tenu
    Оценок пока нет
  • Guvernul Republicii Moldova: Hotărâre nr.410
    Guvernul Republicii Moldova: Hotărâre nr.410
    Документ23 страницы
    Guvernul Republicii Moldova: Hotărâre nr.410
    Gîncu Silviu
    Оценок пока нет
  • HG Aprobata Nr. 98
    HG Aprobata Nr. 98
    Документ22 страницы
    HG Aprobata Nr. 98
    Gîncu Silviu
    Оценок пока нет
  • 12-Article Text-20-1-10-20190615
    12-Article Text-20-1-10-20190615
    Документ6 страниц
    12-Article Text-20-1-10-20190615
    Gîncu Silviu
    Оценок пока нет
  • Bac, Spanac, Hamac
    Bac, Spanac, Hamac
    Документ3 страницы
    Bac, Spanac, Hamac
    Gîncu Silviu
    Оценок пока нет
  • Alimrntatia Rationala
    Alimrntatia Rationala
    Документ6 страниц
    Alimrntatia Rationala
    Gîncu Silviu
    Оценок пока нет
  • SO 04 - Structuri SO
    SO 04 - Structuri SO
    Документ24 страницы
    SO 04 - Structuri SO
    Gîncu Silviu
    Оценок пока нет
  • SO 05 - Sistemul de Fisiere
    SO 05 - Sistemul de Fisiere
    Документ31 страница
    SO 05 - Sistemul de Fisiere
    Gîncu Silviu
    Оценок пока нет
  • SO 02 - Introducere - Continuare
    SO 02 - Introducere - Continuare
    Документ36 страниц
    SO 02 - Introducere - Continuare
    Gîncu Silviu
    Оценок пока нет
  • SO 01 - O Privire de Ansamblu
    SO 01 - O Privire de Ansamblu
    Документ22 страницы
    SO 01 - O Privire de Ansamblu
    Gîncu Silviu
    Оценок пока нет
  • SO 03 - SO Moderne
    SO 03 - SO Moderne
    Документ53 страницы
    SO 03 - SO Moderne
    Gîncu Silviu
    Оценок пока нет
  • Ig. Alimentatiei Aliment. Rationala
    Ig. Alimentatiei Aliment. Rationala
    Документ6 страниц
    Ig. Alimentatiei Aliment. Rationala
    Gîncu Silviu
    Оценок пока нет
  • Sintaxa C++
    Sintaxa C++
    Документ45 страниц
    Sintaxa C++
    Gîncu Silviu
    Оценок пока нет
  • Infeco
    Infeco
    Документ7 страниц
    Infeco
    Gîncu Silviu
    Оценок пока нет
  • 1.1. Bazele Psihico-Pedagogice de Formare Şi Dezvoltare A Competenţei
    1.1. Bazele Psihico-Pedagogice de Formare Şi Dezvoltare A Competenţei
    Документ10 страниц
    1.1. Bazele Psihico-Pedagogice de Formare Şi Dezvoltare A Competenţei
    Gîncu Silviu
    Оценок пока нет
  • Limbaje de Programare
    Limbaje de Programare
    Документ6 страниц
    Limbaje de Programare
    Gîncu Silviu
    Оценок пока нет
  • Programare
    Programare
    Документ2 страницы
    Programare
    Gîncu Silviu
    Оценок пока нет
  • Programare
    Programare
    Документ2 страницы
    Programare
    Gîncu Silviu
    Оценок пока нет
  • Manual C#
    Manual C#
    Документ124 страницы
    Manual C#
    anon-985823
    100% (54)
  • CUPRINS4
    CUPRINS4
    Документ3 страницы
    CUPRINS4
    Gîncu Silviu
    Оценок пока нет
  • Bate
    Bate
    Документ1 страница
    Bate
    Gîncu Silviu
    Оценок пока нет
  • Ref Pointeri
    Ref Pointeri
    Документ5 страниц
    Ref Pointeri
    Gîncu Silviu
    Оценок пока нет
  • Introd
    Introd
    Документ1 страница
    Introd
    Gîncu Silviu
    Оценок пока нет
  • Cap 11
    Cap 11
    Документ32 страницы
    Cap 11
    Bogdan Vasile
    Оценок пока нет
  • Cap12 C++
    Cap12 C++
    Документ19 страниц
    Cap12 C++
    Felicia Sturza
    Оценок пока нет
  • Capitol Ul 13
    Capitol Ul 13
    Документ18 страниц
    Capitol Ul 13
    Gîncu Silviu
    Оценок пока нет
  • Cap 10
    Cap 10
    Документ20 страниц
    Cap 10
    onofreidan
    Оценок пока нет