Sunteți pe pagina 1din 141

Algoritmica si programare/Semestrul I: Programare n limbajul Turbo (Borland) Pascal 1. eneralitati !. "lemente de sinta#a $. Structura unui program %.

Tipuri de date prede&inite '. "#presii (. )eclaratii si de&initii *. Instructiuni +. Subprograme Pascal ,. Tipuri de date structurate 1-. Structuri dinamice de date 11. "lemente de modulari.are 1!. Abstracti.area datelor 1$. Programarea orientata pe obiecte /apitolul +. Subprograme Pascal +.1. Proiectarea top0do1n +.!. Abstracti.area subprogramelor +.$. 2olul subprogramelor ntr0un program +.%. )eclararea si apelarea procedurilor +.%.1. Proceduri &ara parametri +.%.!. Proceduri cu parametri de intrare +.%.$. Proceduri cu parametri de intrare si de iesire +.'. )eclararea si apelarea &unctiilor +.(. Apelarea procedurilor si transmiterea parametrilor. Semantica apelului +.(.1. Parametri transmisi prin 3aloare +.(.!. Parametri transmisi prin adresa (re&erinta) +.(.$.4eri&icarea corespondentei parametrilor &ormali cu cei actuali +.(.%. 4ariabile globale si locale ntr0un subprogram +.(.'. 2eguli de proiectare a subprogramelor +.*. Subprograme apelate din subprograme +.*.1. Apelul subprogramelor din subprograme. Subprograme locale n subprograme +.*.!. Apelul recursi3 +.*.$. Subprograme mutual recursi3e +.+. Tipuri procedurale +.+.1. Tipuri Procedure +.+.!. Tipuri 5unction +.1. Proiectarea top0do1n Proiectarea top0do1n (de sus n jos) este o metoda de de.3oltare a programelor prin care problema de re.ol3at este descompusa n subprobleme mai simple (care se pot re.ol3a mai usor). 6a r7ndul sau8 &iecare subproblema poate &i din nou descompusa n alte subprobleme daca este necesar. 5ormal8 proiectarea top0do1n sau descompunerea &unctionala se poate e#prima ast&el: Se da o problema P care trebuie re.ol3ata. Problema P se descompune n subproblemele P18 P!8 ...8 Pn ast&el nc7t: 1) Subproblemele Pi (1 9 i 9 n) sunt deduse din speci&icarea problemei P !) 5iecare subproblema Pi (1 9 i 9 n) se poate re.ol3a independent $) 5iecare subproblema Pi (1 9 i 9 n) este mai simpla dec7t problema initiala P %) Solutia problemei P se obtine prin compunerea solutiilor subproblemelor P18 P!8 ...8 Pn 1

') Pentru o problema data8 descompunerea se opreste c7nd problema se poate re.ol3a direct 6imbajul Pascal pune la dispo.itia programatorului urmatoarele instrumente pentru proiectarea top0 do1n: 0 subprogramele (procedure si &unction) care corespund subproblemelor 0 structurile de calcul sec3entiala8 alternati3a si repetiti3a care se &olosesc la compunerea solutiilor subproblemelor 0 instructiunile de apel de subprograme care se &olosesc la determinarea solutiilor subproblemelor si la compunerea acestora (n ca.ul apelului recursi3) : metoda complementara proiectarii top0do1n este proiectarea bottom0up (de jos n sus). Aceasta se ba.ea.a pe e#istenta solutiilor pentru unele probleme simple sub &orma unor subprograme. Prin compunerea solutiilor acestor subprobleme se obtine solutia problemei initiale &ara a &i ne3oie de rescrierea tuturor subprogramelor necesare. "#emplul 1): )eterminarea solutiei ecuatiei de gradul II. )e&inirea problemei este urmatoarea: Se considera ecuatia de gradul II de &orma a;<=! > b;< > c 9 -8 unde a8 b si c sunt numere reale. Sa se determine radacinile ale acesteia. Anali.a problemei Problema initiala se poate re&ormula ast&el: se dau coe&icientii ecuatiei de gradul II a;<=! > b;< > c 9 - si se cere sa se determine radacinile #18 #! ale acesteia8 reale sau comple#e. )escompunerea (ni3elul 1) )in acest enunt identi&icam deja trei subprobleme P1: /itirea datelor de intrare (/iteste)ate) P!: )eterminarea solutiei ecuatiei de gradul II P$: A&isarea solutiei determinate (A&isea.a2e.ultate) Solutia problemei initiale P se obtine prin compunerea solutiilor subproblemelor P18 P!8 P$ (aici compunerea nseamna re.ol3area lor n ordinea enumerarii date). Arborele de structura al programului este: ?@@@A BPB C@D@E ?@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@A ?@@G@A ?@G@@A ?@G@@A B P1 B B P! B B P$ B C@@@@E C@@@@E C@@@@E /ontinuarea descompunerii Subproblema P1: /itirea coe&icientilor ecuatiei de gradul II Speci&icare: Sa se citeasca trei numere reale a8 b si c )escompunere (ni3elul !) Se identi&ica n acest ca. o singura subproblema8 numita P%: /iteste2eal care 3a trebui aplicata (re.ol3ata) de trei ori: 1) /iteste2eal pentru a !) /iteste2eal pentru b $) /iteste2eal pentru c Subproblema P% (/iteste2eal) este su&icient de simpla si nu mai trebuieste descompusa (se poate implementa direct) Subproblema P!: )eterminarea solutiei ecuatiei de gradul II Speci&icare: Sa se re.ol3e ecuatia de gradul II cu coe&icientii a8 b si c )escompunere (ni3elul !) !

Se identi&ica n acest ca. doua subprobleme: P': 3eri&ica daca ecuatia este de gradul II ()ate/orecte) P(: determina solutia ec. de gradul II (Prelucrea.a) Solutia subproblemei P! este )aca )ate/orecte atunci Prelucrea.a Subproblema P$: A&isarea re.ultatelor Speci&icare: Sa se a&ise.e re.ultatele re.ol3arii ec. de gradul II Hu mai este ne3oie de descompunere Arborele de structura al programului este: ?@@@A BPB C@D@E ?@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@A ?@@G@A ?@G@@A ?@G@@A B P1 B B P! B B P$ B C@@D@E C@D@@E C@@@@E B ?@@@@@G@@@@@@A ?@@G@A ?@@G@A ?@@G@A B P% B B P' B B P( B C@@@@E C@@@@E C@@@@E +.!. Abstracti.area subprogramelor In subprogram poate &i considerat ca o Jcutie neagraJ care primeste date de intrare si &urni.ea.a re.ultate. Proiectarea unui subprogram se reali.ea.a combin7nd doua metode: 0 1) abstracti.area prin parametri.are 0 !) abstracti.area prin speci&icare 1) Abstracti.area prin parametri.are nseamna identi&icarea8 pentru o problema data P8 a intrarilor (datelor de intrare) si iesirilor (re.ultatelor) acesteia. Intrarile si iesirile problemei se 3or numi n continuare JparametriJ. Parametrii asigura generalitatea problemei si independenta de mediul de apel (programul care 3a apela problema data 3a trebui sa &urni.e.e doar 3alori concrete pentru parametrii de intrare si sa &oloseasca re.ultatele &urni.ate de parametrii de iesire). Independenta de mediul de apel asigura reutili.area (solutiei) problemei n alte locuri dec7t cel pentru care a &ost re.ol3ata initial. Kediul de apel este &ormat din toate 3ariabilele care au in domeniul lor de 3i.ibilitate punctul apelului (at7t cele declarate n programul apelant8 deci locale n acesta8 c7t si cele declarate n blocuri e#terioare programului apelant). )in punctul de 3edere al comunicarii cu mediul e#tern (care l poate apela)8un subprogram P are trei tipuri de parametri 0 parametri de intrare: introduc in&ormatie n P &ara a &i modi&icati n timpul e#ecutiei acestuia (IH) 0 parametri de iesire: scot in&ormatie (re.ultate) din PL nu interesea.a 3alorile cu care acesti parametri intra n P (:IT) 0 parametri de intrare0iesire: sunt concomitent parametri de intrare si de iesire pentru P (IH0:IT) !) Abstracti.area prin speci&icare atasea.a &iecarei probleme o speci&icare. Speci&icarea unei probleme asigura independenta &olosirii acesteia de modul de re.ol3are a ei (alt&el spus de algoritmul &olosit pentru re.ol3are). Inei aceleiasi speci&icatii i pot corespunde mai multe implementariL toate aceste implementari 3or a3ea n comun aceeasi maniera de apel a procedurii. Prin speci&icare se preci.ea.a ce trebuie sa &aca problema si nu cum &ace. Speci&icarea contine preci.area numelui problemei8 a parametrilor acesteia si a unor asertiuni (predicate) numite pre0conditii si post0conditii: 0 pre0conditiile preci.ea.a cerintele impuse asupra datelor de intrare pentru ca subprogramul sa se e#ecute corect. 0 post0conditiile preci.ea.a e&ectele e#ecutiei subprogramului asupra datelor $

de intrare/iesire (care &ormea.a mpreuna starea programului). )e obicei speci&icarea unei probleme se &ace dupa ce s0au stabilit parametrii acesteia sau simultan cu parametri.area. )upa ce speci&icarea s0a ncMeiat8 se poate trece la implementarea acesteia. Inei speci&icari pot sa0i corespunda mai multe implementari di&erite (&olosind8 de e#emplu8 algoritmi di&eriti pentru trans&ormarea datelor de intrare n date de iesire). Speci&icarea ser3este n primul r7nd celui care &oloseste re.ol3area problemei. )in acest punct de 3edere8 ea trebuie pri3ita ca un contract ntre cel care a re.ol3at problema si cel care 3rea sa &oloseasca re.ol3area respecti3a ntr0un program. /7t timp speci&icarea nu se scMimba8 toti clientii acesteia (toti programatorii care apelea.a o implementare sau alta a ei) 3or obtine aceleasi re.ultate pe aceleasi date de intrare8 &olosind acelasi apel (indi&erent de implementarea &olosita). Parametri.area si speci&icarea sunt legate ntre ele8 ambele concur7nd la reali.area a ceea ce am numit Jabstracti.area proceduralaJ. In paragra&ul urmator 3om discuta acest lucru din punctul de 3edere al &olosirii procedurilor (subprogramelor) ntr0un program. Pentru e#emplul nostru: Parametri.area P1 0 /iteste)ate are trei parametri de iesire8 care 3or &i notati cu a8 b si c P% 0 /iteste2eal are un singur parametru de iesire0 numarul real citit # P' 0 )ate/orecte are doi parametri: a 0 coe&icientul lui #! (parametru de intrare) corect 0 parametru de iesire corect 9 - 0 ecuatia este de gradul II (a N -) corect 9 1 0 ecuatia nu este de gradul II (a 9 -) P( 0 Prelucrea.a are urmatorii parametri a8 b8 c 0 coe&icientii ecuatiei de gradul II (parametri de intrare) #18 #! 0 solutia ecuatiei (parametri de iesire) cod 0 in&ormatie pri3ind solutia (parametru de iesire) cod 9 ! 0 radacini reale di&erite cod 9 $ 0 radacini reale egale cod 9 % 0 radacini comple#e P$ 0 A&isea.a2e.ultate are urmatorii parametri #18 #! 0 solutia ecuatiei (parametri de intrare) cod 0 in&ormatie pri3ind solutia (parametru de intrare) cod 9 1 0 ecuatia nu este de gradul II cod 9 ! 0 radacini reale di&erite cod 9 $ 0 radacini reale egale cod 9 % 0 radacini comple#e Speci&icarea P1 0 /iteste)ate(a8 b8 c) Pre: True Post: a8 b8 c O 2 P% 0 /iteste2eal(#) Pre: True Post: # O 2 P' 0 )ate/orecte(a8 corect) Pre: a O 2 Post: corect O P-8 1Q corect 9 1 daca ecuatia este de gradul II corect 9 - n ca. contrar P( 0 Prelucrea.a(a8 b8 c8 #18 #!8 cod) Pre: a8 b8 c O 2 si a RS %

Post: #18 #! solutii ale ecuatiei a;<=! > b;< > c 9 cod O P!8 $8 %Q cod 9 ! 0 radacini reale di&erite cod 9 $ 0 radacini reale egale cod 9 % 0 radacini comple#e P$ 0 A&isea.a2e.ultate(#18 #!8 cod) Pre: #18 #! O 2 cod O P18 !8 $8 %Q Post: True +.$. 2olul subprogramelor ntr0un program Prima ratiune de &olosire a subprogramelor ntr0un program este mai buna structurare a acestuia. 5olosind subprograme8 corpul programului (numit si program principal) se e#prima printr0un numar mai mic de instructiuni si este mai usor de nteles. )e asemenea8 programul este mai usor de modi&icat. "#emplu: 3e.i structurile de programe discutate anterior. A doua ratiune de &olosire a subprogramelor ntr0un program este e3itarea repetarii unor grupuri de instructiuni identice sau aproape identice. In e#emplu &oarte simplu este cMiar citirea coe&icientilor ecuatiei de gradul II8 care nseamna repetarea de trei ori a aceluiasi grup de instructiuni (a&isea.a mesaj8 citeste coe&icient). Prin parametri.are8 grupurile de instructiuni aproape identice se pot trans&orma n subprograme. 5olosind apoi 3alori corespun.atoare pentru parametri8 &iecare apel reali.ea.a &unctia sa dorita (grupul de instructiuni speci&ic). A treia ratiune de &olosire a subprogramelor ntr0un program este re&olosirea lor (apelarea lor n programe di&erite). )aca subprogramele sunt su&icient de generale si daca ele necesita un 3olum mare de munca (de programare si de testare)8 atunci este rational ca8 odata ce au &ost reali.ate8 sa se poata apela oriunde este ne3oie de ele8 &ara a le rescrie. Pentru aceasta8 Turbo Pascal pune la dispo.itia programatorului (ncep7nd din 3ersiunea %.-) modulele (numite unit0uri). In ast&el de modul contine (simplist 3orbind) subprograme care se pot &olosi n alte programe. Pentru a le putea &olosi8 este su&icient sa includem numele unit0ului ntr0o &ra.a Ises pusa la nceputul .onei de declaratii a programului Pascal. Kediul Turbo Pascal are o serie ntreaga de unit0uri care contin subprograme ce se pot apela n programele pe care le reali.am. 4ersiunile anterioare (sub %.-) o&era o directi3a de compilare ce permite includerea unui &isier sursa (care contine numai subprogramul re&olosit) ntr0un alt &isier sursa (TI). Prin urmare8 ntr0un program Pascal putem &olosi urmatoarele categorii de subprograme: 0 subprograme standard: se gasesc n unit0ul SUstem (care este &olosit implicit de catre orice program Turbo Pascal)L e#emple: 2ead8 2ead6n8 Vrite8 Vrite6n8 &unctiile matematice8 subprogramele de lucru cu stringuri8 etc. 0 subprograme locale programului: sunt declarate n .ona de declaratii a acestuia si se pot &olosi (apela) numai n programul respecti3 0 subprograme de biblioteca: sunt declarate n module (ale mediului sau reali.ate de programator)L se pot apela daca programul contine n clause Ises numele unit0ului (modulului) n care sunt declarate. In toate ca.urile8 subprogramele se pot apela (&olosi) numai dupa ce au &ost declarate. Apelul de subprogram este considerat n Pascal ca instructiune simpla si nseamna urmatoarele Program apelant P Subprogram SP WdeclaratiiX WdeclaratiiX begin ( corpul P Q ?@S begin P corpul SP Q ... B instrY1L apel SP @@@@@@@@@@@@@@@@@@@@@@E

... '

instrYdupaYapel R@@@@@@@@@@@@@A ... C@@ endL P SP Q end. P P Q

instrYnL

6a nt7lnirea instructiunii de apel8 controlul e#ecutiei este predate subprogramului apelat (subprogramul SP). "#ecutia instructiunilor din programul apelant se opreste si ncepe e#ecutia instructiunilor din corpul subprogramului SP. 6a terminarea e#ecutiei corpului SP (atingerea instructiunii endL sau nt7lnirea unei instructiuni "#it 0 3e.i cap *)8 se reia e#ecutia instructiunilor din programul apelant cu instrYdupaYapel. /e 3ariabile se pot &olosi n corpul SPN 0 3ariabile locale (cele declarate n SP) 0 parametrii SP (daca are) 0 3ariabilele globale din programul apelant (numai daca SP este subprogram local al lui P) )in punctul de 3edere al comunicarii cu programul apelant8 subprogramele se pot mparti n: 0 subprograme care nu &olosesc mediul programului apelant (deci nu au ne3oie de parametri si nu recurg la &olosirea unor 3ariabile globale) 0 subprograme ce comunica cu mediul programului apelant prin 3ariabile globale si/sau parametri 0 subprograme ce comunica cu mediul programului apelant numai prin parametri )intre categoriile e#puse mai sus8 prima si a treia contin subprograme ce se pot include n module si deci re&olosi n mai multe programe. In a doua categorie (care &oloseste 3ariabile locale din programul apelant care sunt globale n el) se includ subprogramele locale ale acestuia8 iar declaratia lor trebuie sa apara dupa declaratia 3ariabilelor &olosite (at7t declaratia 3ariabilelor globale8 c7t si declaratia de subprogram 3or &ace parte din .ona de declaratii a programului apelant8 nsa acele 3ariabile care se &olosesc n corpul subprogramului trebuie declarate nainte de declararea subprogramului). "#emplu: Program P1aL P &oloseste un subprogram local8 P! Q 4ar /ontor: IntegerL Procedure P!L Begin Vrite6n(J4aloarea lui /ontor esteJ8 /ontor:%) "ndL PP!Q Begin Pprogramul principalQ 5or /ontor :9 1 To $ )o P! "ndL P P1a Q Programul P1a apelea.a subprogramul local P!8 care nu are parametri si care &oloseste 3ariabila globala /ontor8 declarata nainte de declaratia lui P!. "l 3a a&isa ca re.ultat 4aloarea lui /ontor este 1 4aloarea lui /ontor este ! 4aloarea lui /ontor este $ Programul &unctionea.a corect deoarece P! este n domeniul de 3i.ibilitate al 3ariabilei /ontor. )aca nsa declaratia 3ariabilei /ontor apare dupa declaratia subprogramului P!8 ca n e#emplul urmator8 Program P1bL P &oloseste un subprogram local8 P! Q Procedure P!L Begin Vrite6n(J4aloarea lui /ontor esteJ8 /ontor:%) P aici se 3a produce eroare de compilare: /ontor este (

identi&icator necunoscut Q "ndL PP!Q 4ar /ontor: IntegerL Begin Pprogramul principalQ 5or /ontor :9 1 To $ )o P! "ndL P P1b Q atunci se 3a produce o eroare de compilare la compilarea lui P1b8 deoarece identi&icatorul /ontor (re&erit acolo) nu este nca declarat (P! nu este n )o4 al 3ariabilei /ontor si re&era aceasta 3ariabila). /um se corectea.a eroarea de mai susN 0 3arianta 1 (nerecomandata): Programul P1a 0 3arianta ! (recomandata): Programul P1c 0 /ontor de3ine parametru al lui P! Program P1cL P &oloseste un subprogram local8 P! Q Procedure P!(/: Integer)L Begin Vrite6n(J4aloarea lui /ontor esteJ8 /:%) "ndL PP!Q 4ar /ontor: IntegerL Begin Pprogramul principalQ 5or /ontor :9 1 To $ )o P!(/ontor) "ndL P P1c Q S&aturi: 0 /oncepeti orice subprogram ast&el nc7t el sa poata &i inclus ntr0un modul. 0 Hu &olositi ntr0un subprogram 3ariabile globale. 0 In locul 3ariabilelor globale &olositi parametri. 0 Pentru a &i siguri ca subprogramele locale nu &olosesc 3ariabile globale8 puneti declaratiile de 3ariabile (4ar) dupa declaratiile de subprograme (ca n programul P1c). Aceasta 3a garanta &aptul ca 3ariabilele globale se 3or &olosi numai n corpul programului8 nu si n subprograme. In Pascal e#ista doua &eluri de subprograme: procedura si &unctie. Subprogramele de tip procedura reali.ea.a o operatie bine preci.ata si apelul lor este considerat instructiune simpla. Subprogramele de tip &unctie calculea.a o 3aloare si apelul lor este considerat operand ntr0o e#presie. 8.4. Declararea si apelarea procedurilor 8.4.1. Proceduri fara parametri Procedurile &ara parametri e#ecuta anumite operatii independente de mediul programului. In ast&el de e#emplu este procedura standard /lrScr a&lata n unit0ul /rt8 care reali.ea.a stergerea ecranului. Alte e#emple de proceduri standard &ara parametri sunt BreaZ8 /ontinue si "#it din unit0ul SUstem (discutate n cap. *). Sinta#a de declarare a unei proceduri &ara parametri este: Procedure HumeYProcL WdeclaratiiX Begin P corpul procedurii Q instrY1L ... instrYn "ndL P HumeYProc Q unde 0 Procedure8 Begin8 "nd sunt cu3inte re.er3ate 0 HumeYProc este numele procedurii (identi&icator) *

0 declaratia de procedura introduce un bloc 0 prima linie a procedurii se numeste antet (la &el ca la programul principal) 0 .ona declaratii contine declaratiile locale n procedura8 care 3or a3ea ca )o4 blocul proceduriiL se pot include aici toate tipurile de declarati discutate W)o49domeniu de 3i.ibilitateL)u49durata de 3iataX 0 instrY18 ...8 instrYn sunt instructiuni Pascal (simple sau compuse) Apelul unei asemenea proceduri se &ace printr0o instructiune care contine doar numele procedurii. "#emplu: WdeclarareX Procedure A&isea.aYTitluL Begin /lrScrL Vrite6n(J/e &ace programulJ) "ndL P A&isea.aYTitlu Q WapelareX begin ... A&isea.aYTitluL .... "nd. /onceperea unei proceduri &ara parametri nseamna de &apt (pentru limbajul Pascal8 si nu numai) reali.area unei noi instructiuni simple a limbajului. :data procedura declarata8 aceasta nseamna pentru Pascal o noua instructiune simpla8 care grupea.a (se traduce n) toate instructiunile continute n corpul ei. Aceasta este cea mai simpla modalitate de e#tindere a limbajului cu noi instructiuni8 din ce n ce mai comple#e. Init0urile mediului Turbo (Borland) Pascal contin o serie de ast&el de proceduri. 8.4.2. Proceduri cu parametri de intrare Aceste proceduri nu modi&ica mediul programului care le apelea.a. 2olul lor este de a e&ectua prelucrari8 de a 3eri&ica anumite conditii sau de a a&isa anumite re.ultate. Sinta#a de declarare a unei proceduri cu parametri de intrare este: Procedure HumeYProc(RlistaYparametriY&ormaliS)L WdeclaratiiX Begin P corpul procedurii Q instrY1L ... instrYn "ndL P HumeYProc Q unde toate preci.arile de la procedurile &ara parametri ram7n 3alabile si 0 listaYparametriY&ormali este o lista de declaratii de parametri &ormali de &orma: RlistaYparametriY&ormaliS ::9 PRdeclaratie parametri &ormaliSQ Rdeclaratie parametri &ormaliS ::9 Rlista parametriS:RtipYdeYdateSL 0 ultima Rdeclaratie parametri &ormaliS nu se ncMeie cu L 6ista de parametri &ormali se poate transcrie n &orma: RlistaYparametriY&ormaliS ::9 p&1: t1L p&!: t!L ...8 p&Yn: tYn unde p&18 p&!8 ...8 p&Yn sunt parametrii &ormali8 iar t18 t!8 ...8 tYn sunt tipurile de date asociate acestora. Apelul unei asemenea proceduri se &ace printr0o instructiune care contine numele procedurii8 urmata de lista parametrilor actuali: HumeYProc(RlistaYparametriYactualiS)L unde RlistaYparametriYactualiS este o lista de e#presii8 care trebuie sa corespunda cu RlistaYparametriY&ormaliS +

RlistaYparametriYactualiS ::9 pa18 pa!8 ...8 paYn /orespondenta dintre RlistaYparametriYactualiS si RlistaYparametriY&ormaliS nseamna urmatoarele (3e.i si +.(.$): 0 cele doua liste trebuie sa aiba acelasi numar de elemente 0 elementul de pe po.itia i din RlistaYparametriYactualiS trebuie sa &ie de tipul de date ti (cum apare el preci.at n RlistaYparametriY&ormaliS) 0 alt&el spus 0 pa1 trebuie sa &ie de tipul t1 0 pa! trebuie sa &ie de tipul t! 0 ... 0 pan trebuie sa &ie de tipul tYn Exemplu: Program P!aL P &oloseste o procedura locala8 ScrieSuma Q Procedure ScrieSuma(A8 B8 /: Integer)L 4ar S: IntegerL Begin S :9 A > B > /L Vrite6n(JSuma numerelor esteJ8 S:%)L A :9 -L B :9 -L / :9 "ndL PScrieSumaQ 4ar H18 H!8 H$: IntegerL Begin Pprogramul principalQ H1 :9 1!L H! :9 !$L H$ :9 $%L Vrite6n(JSe aduna numerele: J8 H1:$8 H!:$8 H$:$)L ScrieSuma(H18 H!8 H$)L Vrite6n(JS0au adunat numerele: J8 H1:$8 H!:$8 H$:$) "ndL P P!a Q In e#emplul de mai sus8 ScrieSuma contine o parte de declaratii locale8 n care este declarata 3ariabila ntreaga S. Aceasta 3ariabila are ca domeniu de 3i.ibilitate corpul procedurii ScrieSuma si poate &i re&erita numai n acesta. )aca se ncearca re&erirea ei n programul principal8 se 3a produce o eroare de compilare. Parametrii &ormali ai procedurii ScrieSuma sunt declarati ast&el: A8 B8 /: Integer8 declaratie ecMi3alenta cu A: IntegerL B: Integer8 /: Integer (c7nd mai multi parametri &ormali consecuti3i au acelasi tip de date8 ei pot &i pusi ntr0o lista (numele lor se separa prin 3irgule) si se scrie o singura data tipul (la &el ca la declaratia de 3ariabile). )eclararea parametrilor &ormali ai procedurii se poate considera tot o declaratie de 3ariabile locale: acestia au semni&icatie doar at7ta timp c7t procedura se e#ecuta. Antetul procedurii ScrieSuma stabileste modalitatea n care aceasta poate &i apelata. Prin urmare am dedus o regula importanta: declaratia de procedura stabileste modul de apel al acesteia. :rice apel care nu se con&ormea.a declaratiei 3a &i respins (n ca.ul limbajului Pascal de catre compilator).

Apelul procedurii ScrieSuma din e#emplul de mai sus se con&ormea.a regulii enuntate. Toti parametrii actuali de intrare pot &i orice e#presii care se pot e3alua n momentul apelului (n ca.ul nostru ei sunt e#presii simple8 &ormate din 3ariabile declarate n .ona de declaratii a programului apelant). "#ecutia acestui program 3a produce a&isarea urmatoarelor mesaje: Se aduna numerele: 1! !$ $% Suma numerelor este (, S0au adunat numerele: 1! !$ $% 8.4.3. Proceduri cu parametri de intrare si de iesire )e cele mai multe ori8 o procedura trebuie sa e&ectue.e o operatie care modi&ica mediul programului apelant. Am 3a.ut anterior ca acest lucru se poate &ace n doua moduri: 0 prin modi&icarea unei 3ariabile globale (declarata n programul appellant nainte de declaratia procedurii apelate8 care este 3i.ibila n corpul procedurii) 0 prin transmiterea modi&icarii spre programul apelant printr0un parametru de iesire Apare aici un element nou: cum se poate e#trage (scoate) din procedura o 3aloare calculata n ea si apoi aceasta sa se &aca disponibila n programul apelant8 care sa o poata &olosi n continuareN /u alte cu3inte8 cum se speci&ica &aptul ca un parametru &ormal de procedura este parametru de iesireN 6imbajul Pascal pune la dispo.itia programatorului un mecanism simplu de speci&icare a parametrilor de iesire8 pre&i#7nd declaratia acestora cu cu37ntul re.er3at J4arJ. P7na acum am 3a.ut ca J4arJ este &olostit pentru a preci.a declaratii de 3ariabile. Acum apare a doua &olosire a sa8 speci&icarea parametrilor de iesire. Sinta#a declaratiei de procedura cu parametri de intrare si de iesire este identica cu cea pentru procedurile cu parametri de intrare8 cu singura deosebire ca declaratiile parametrilor &ormali de iesire trebuie pre&i#ate cu 4ar. )in nou8 daca o procedura are mai multi parametri de iesire de acelasi tip8 si care sunt consecuti3i8 declararea acestora se poate condensa. Apelarea unei proceduri cu parametri de intrare si de iesire se &ace la &el ca n ca.ul procedurilor cu parametri de intrare. "#ista nca o restrictie pri3itoare la parametrii actuali de iesire. )aca parametrii actuali de intrare pot sa &ie orice e#presii care se pot e3alua n momentul apelului8 parametrii actuali de iesire trebuie sa &ie obligatoriu 3ariabile care au punctual apelului n domeniul lor de 3i.ibilitate. "#emple: )eclaratia de procedura Procedure Imparte(a8 b: IntegerL 4ar c8 r: Integer)L Pmpartirea numerelor a si b produce c7tul c si restul rQ este ecMi3alenta cu Procedure Imparte(a: IntegerL b: IntegerL 4ar c: IntegerL 4ar r: Integer)L In declaratiile de mai sus8 a si b sunt parametri de intrare8 iar c si r sunt parametri de iesire. "#emplul pre.entat n paragra&ul precedent se poate rescrie aici ast&el: Program P!bL P &oloseste o procedura locala8 /alculSuma Q Procedure /alculSuma(A8 B8 /: IntegerL 4ar S: Integer)L Begin S :9 A > B > /L A :9 -L B :9 -L / :9 "ndL P/alculSumaQ 1-

4ar H18 H!8 H$8 Suma: IntegerL Begin Pprogramul principalQ H1 :9 1!L H! :9 !$L H$ :9 $%L Vrite6n(JSe aduna numerele: J8 H1:$8 H!:$8 H$:$)L /alculSuma(H18 H!8 H$8 Suma)L Vrite6n(JSuma numerelor esteJ8 Suma:%)L Vrite6n(JS0au adunat numerele: J8 H1:$8 H!:$8 H$:$) "ndL P P!b Q In e#emplul de mai sus8 /alculSuma nu mai contine declaratia locala a 3ariabilei ntregi S8 aceasta trans&orm7ndu0se n parametru de iesire8 &iind declarat ca atare n antetul procedurii. Parametrii &ormali ai procedurii /alculSuma sunt declarati ast&el A8 B8 /: IntegerL 3ar S: Integer. Aceasta declaratie speci&ica &aptul ca primii trei sunt parametri de intrare8 iar S este parametru de iesire. )aca anali.am programul principal8 constatam ca: 0 s0a declarat o noua 3ariabila ntreaga8 Suma 0 apelul procedurii /alculSuma contine patru parametri actuali8 primii trei cu semni&icatia din e#emplul anterior8 iar al patrulea pe post de parametru de iesire (n ca.ul nostru 3ariabila Suma joaca acest rol8 3aloarea ei &iind &olosita n continuare pentru a&isare 0 a&isarea sumei numerelor s0a trans&erat din subprogram n programul appellant (moti3 pentru care numele subprogramului s0a scMimbat) "#ecutia acestui program 3a produce a&isarea acelorasi mesaje ca si cele de la programul precedent: Se aduna numerele: 1! !$ $% Suma numerelor este (, S0au adunat numerele: 1! !$ $% 8.5. Declararea si apelarea functiilor : categorie speciala de subprograme este &ormata din &unctii. Scopul unei &unctii este calculul unei 3alori8 care este ntoarsa (&olosita) n programul apelant. Asemanarile dintre proceduri si &unctii sunt urmatoarele 0 ambele sunt subprograme 0 declaratiile lor &ormea.a un bloc 0 ambele au parametri. )eosebirile dintre proceduri si &unctii sunt cel putin urmatoarele: 0 &unctiile ntorc un singur re.ultat8 de un tip simplu (n Pascal) 0 apelul de procedura este considerat n Pascal instructiune8 pe c7nd apelul de &unctie este considerat operand ntr0o e#presie 0 &unctiile nu trebuie sa aiba parametri de iesire 0 la &unctii trebuie preci.at tipul re.ultatului intors (calculat)8 care este &olosit in programul apelant )in punct de 3edere sintactic8 declaratia de &unctie are &orma: 5unction HumeY5unctieW(RlistaYparametriY&ormaliS)X: tipYre.ultatL WdeclaratiiX Begin P corpul &unctiei Q instrY1L ... instrYn "ndL P HumeY5unctie Q 11

unde 0 5unction8 Begin8 "nd sunt cu3inte re.er3ate 0 HumeY5unctie este numele &unctiei (identi&icator) 0 listaYparametriY&ormali este o lista de declaratii de parametri &ormali (poate sa lipseasca) 0 tipYre.ultat este tipul de data al re.ultatului ntors de &unctie (este obligatoriu) 0 declaratia de &unctie introduce un bloc 0 prima linie a declaratiei de &unctie se numeste antet (la &el ca la programul principal) 0 .ona declaratii contine declaratiile locale n &unctie8 care 3or a3ea ca )o4 blocul &unctieiL se pot include aici toate tipurile de declarati discutate 0 instrY18 ...8 instrYn sunt instructiuni Pascal (simple sau compuse)L ntre aceste instructiuni trebuie sa apara cel putin odata o instructiune de atribuire de &orma HumeY5unctie :9 e#presieL Apelul unui subprogram de tip &unctie se &ace identic cu cel de procedura8 adica se scrie numele subprogramului (urmat n parante.a de parametrii actuali8 daca &unctia are parametri). /eea ce di&era este semni&icatia apelului: deoarece &unctia ntoarce o 3aloare8 apelul de &unctie are semantica unui operator ntr0o e#presie si nu semantica unei instructiuni simple8 ca apelul de procedura. Prin urmare8 apelul de &unctie poate sa apara oriunde poate apare o e#presie de tipul sau. "#emplul urmator este ecMi3alent cu cele pre.entate anterior8 &olosind de aceasta data un subprogram de tip &unctie: Program P!cL P &oloseste o &unctie locala8 /alculSuma Q 5unction /alculSuma(A8 B8 /: Integer): IntegerL Begin /alculSuma :9 A > B > /L A :9 -L B :9 -L / :9 "ndL P/alculSumaQ 4ar H18 H!8 H$: IntegerL Begin Pprogramul principalQ H1 :9 1!L H! :9 !$L H$ :9 $%L Vrite6n(JSe aduna numerele: J8 H1:$8 H!:$8 H$:$)L Vrite6n(JSuma numerelor esteJ8 /alculSuma(H18 H!8 H$):%)L Vrite6n(JS0au adunat numerele: J8 H1:$8 H!:$8 H$:$) "ndL P P!c Q In e#emplul de mai sus8 /alculSuma nu mai contine declaratia locala a 3ariabilei ntregi S8 si nici declaratia parametrului de iesire SL re.ultatul ntors de &unctie 3a a3ea semni&icatia lui S din e#emplele precedente. Acest lucru se speci&ica &olosind n corpul &unctiei numele acesteia n membrul st7ng al operatiei de atribuire: /alculSuma :9 A > B > /L. Parametrii &ormali ai &unctiei /alculSuma sunt declarati la &el ca n e#emplul P!a. )aca anali.am programul principal8 constatam ca: 0 nu mai este ne3oie de 3ariabila ntreaga Suma 0 apelul &unctiei /alculSuma apare ca parametru al instructiunii de a&isare a re.ultatului: Vrite6n(JSuma numerelor esteJ8 /alculSuma(H18 H!8 H$):%)L 1!

"#ecutia acestui program 3a produce a&isarea acelorasi mesaje ca si cele dela programele precedente: Se aduna numerele: 1! !$ $% Suma numerelor este (, S0au adunat numerele: 1! !$ $% 8.6. Apelarea procedurilor si transmiterea parametrilor. Semantica apelului Apelul unui subprogram nseamna 0 determinarea (locali.area) subprogramului apelat (din numele acesteia)L reaminitim ca subprogramul apelat poate &i: 0 subprogram local (ca n e#emplele P!a8 P!b8 P!c de mai sus) 0 subprogram standard (a&lat n unit0ul SUstem) 0 subprogram declarat ntr0un alt unit (al carui nume apare ntr0o clau.a Ises si care a &ost n prealabil creat 0 &ie ca este un unit al mediului8 &ie ca este un unit reali.at de un programator) 0 3eri&icarea corectitudinii apelului (dupa ce s0a locali.at subprogramul8 antetul lui este disponibil si deci si lista de parametri &ormali) 0 e3aluarea parametrilor actuali si stabilirea corespondentei dintre acestia si parametrii &ormali 0 e#ecutia subprogramului8 n care parametrii &ormali primesc la nceput 3alorile parametrilor actuali 0 la terminarea e#ecutiei se preda controlul programului apelant8 care continua e#ecutia cu instructiunea de dupa apel In ce ca.uri apelul unui subprogram nu este corect (si compilatorul da un mesaj de eroare)N 0 subprogramul apelat nu este declarat (sau s0a scris gresit numele n apel) 0 lista parametrilor actuali nu corespunde cu lista de parametri &ormali 0 )o4 al subprogramului apelat nu contine punctul (locul) de unde s0a &acut apelul 4om discuta la nceput modalitatile de transmitere a parametrilor de intrare si de iesire si apoi 3om anali.a modul cum se &ace 3eri&icarea corespondentei parametrilor actuali cu cei &ormali. 8.6.1. Parametri transmisi prin aloare 4om comenta n cele ce urmea.a programul P!a. Presupunem ca s0a &acut 3eri&icarea corespondentei dintre parametrii actuali din apelul procedurii ScrieSuma si ca acestia corespund cu parametrii &ormali preci.ati n declaratia procedurii. /onstatam ca numarul parametrilor actuali si tipul acestora coincide (parametru cu parametru)8 deci din punct de 3edere &ormal conditiile de apelare sunt ndeplinite. /e se nt7mpla mai departe pentru e#ecutia apeluluiN Irmatorul pas este e3aluarea parametrilor actuali si punerea lor n corespondenta cu cei &ormali. "3aluarea este simpla: parametrii actuali au &ost initiali.ati anterior8 deci au 3alori bine determinate8 iar corespondenta se stabileste ast&el: 0 H1 este pus n corespondenta cu A 0 H! este pus n corespondenta cu B 0 H$ este pus n corespondenta cu / Punerea n corespondenta nseamna (n ca.ul nostru) copierea 3alorilor parametrilor actuali n parametrii &ormali corespun.atori8 deci se poate scrie printr0o sec3enta de atribuiri: A :9 H1L P atribuie lui A 3aloarea e#presiei H1 Q B :9 H!L P atribuie lui B 3aloarea e#presiei H! Q / :9 H$L P atribuie lui / 3aloarea e#presiei H$ Q "#plicatia de mai sus justi&ica de ce se pot &olosi e#presii pe post de parametri &ormali: acestea trebuie doar sa se poata e3alua n momentulapelului. Acum procedura ScrieSuma se poate e#ecuta. Prima instructiune din corpul ei reali.ea.a calcului sumei S :9 A > B > /L care 3a &olosi 3alorile parametrilor initiali.ate anterior. 4aloarea lui S este a&isata apoi pe ecran n a doua instructiune8 iar urmatoarele trei instructiuni initiali.ea.a pe A8 B si / cu -. )upa aceasta se 1$

nt7lneste cu37ntul re.er3at JendJ8 adica s0a terminat corpul procedurii. Prin urmare8 s0a terminat si e#ecutia procedurii ScrieSuma si se re3ine n programul apelant8 la instructiunea urmatoare apelului. Aceasta 3a a&isa 3alorile dinainte de apel ale 3ariabilelor H18 H! si H$8 cu toate ca parametrii corespun.atori lor au &ost modi&icati n timpul e#ecutiei corpului procedurii ScrieSuma. Koti3ul pentru care se nt7mpla asa este acela ca modi&icarea 3alorilor parametrilor &ormali n ScrieSuma nu in&luentea.a mediul de apel (adica 3alorile parametrilor actuali din programul apelant) deoarece parametrii &ormali sunt tratati drept 3ariabile locale ale subprogramului si ca la terminarea e#ecutiei acestuia ei se distrug 0 nu mai are loc o atribuire in3ersa de 3alori de &orma: H1 :9 A:L H! :9 BL H$ :9 /L /u alte cu3inte8 A8 B si / sunt doar copii ale parametrilor actuali H18 H! si H$ si modi&icarea 3alorii lor nu in&luentea.a 3alorile originalelor. Aceasta modalitate de transmitere a parametrilor catre un subprogram (procedura sau &unctie) se numeste Jtransmitere prin 3aloareJ. 5iecarui parametru actual transmis prin 3aloare i corespunde n subprogramul apelat o pseudo03ariabila locala8 care are cMiar numele parametrului &ormal corespun.ator. /onclu.ia acestei anali.e este urmatoarea: Parametrii actuali transmisi prin 3aloare dintr0un program apelant P spre un subprogram apelat SP si pastrea.a 3alorile dinainte de apelul SP8 indi&erent daca parametrii &ormali corespun.atori lor se modi&ica sau nu n SP. 8.6.2. Parametri transmisi prin adresa !referinta" Programul P!b contine o procedura ce are si parametri de iesire. Presupunem ca s0a &acut 3eri&icarea corespondentei dintre parametrii actuali din apelul procedurii /alculSuma si ca acestia corespund cu parametrii &ormali preci.ati n declaratia procedurii. Irmatorul pas este e3aluarea parametrilor actuali si punerea lor n corespondenta cu cei &ormali. Primii trei parametri actuali au &ost initiali.ati anterior (si sunt transmisi prin 3aloare)8 deci au 3alori bine determinate8 iar corespondenta se stabileste ast&el: 0 H1 este pus n corespondenta cu A 0 H! este pus n corespondenta cu B 0 H$ este pus n corespondenta cu / con&orm atribuirilor: A :9 H1L P atribuie lui A 3aloarea e#presiei H1 Q B :9 H!L P atribuie lui B 3aloarea e#presiei H! Q / :9 H$L P atribuie lui / 3aloarea e#presiei H$ Q Al patrulea parametru actual8 Suma8 este 3ariabila globala n P!b care nca n0a &ost initiali.ata. )e &apt8 p7na la apelul /alculSuma(H18 H!8 H$8 Suma)L n0am a3ut ne3oie de ea. Kai mult8 3rem sa0i determinam 3aloarea prin acest apel si s0o &olosim mai departe (a&is7nd0o). Parametru actual Suma din apel i corespunde parametrul &ormal S din antetul procedurii8 care este declarata as&el: Procedure /alculSuma(A8 B8 /: IntegerL 4ar S: Integer)L Acum apare deosebirea &ata de transmiterea prin 3aloare. Am spus anterior ca S este n procedura un parametru &ormal de iesire si ca am marcat acest lucru pre&i#7nd n antet declaratia lui cu J4arJ. /e nseamna de &apt acest lucruN In parametru &ormal declarat cu 4ar se transmite prin re&erinta (adresa)8 adica corespondenta dintre parametrul actual si cel &ormal n acest ca. nseamna egalitate de adresa (si nu de 3aloare8 ca n ca.ul transmiterii prin 3aloare). Prin urmare8 corespondenta dintre parametrul actual Suma din apelul procedurii /alculSuma si parametrul &ormal S din declaratia acesteia se stabileste prin atribuirea adresei 3ariabilei Suma (parametrul actual) ca adresa a parametrului &ormal S: 1%

adresa(S) :9 adresa(Suma)L "#plicatia de mai sus justi&ica de ce nu se pot &olosi e#presii pe post de parametri &ormali la parametrii de iesire: o e#presie nu are asociata o adresa &i#a n memorie (pe timpul e3aluarii sale poate &i de e#emplu memorata ntr0un registru al I/). Kai mult8 nu se justi&ica ca un parametru de iesire sa &ie o e#presie. Acum procedura /alculSuma se poate e#ecuta. Prima instructiune din corpul ei reali.ea.a calcului sumei S :9 A > B > /L care 3a &olosi 3alorile parametrilor initiali.ate anterior si 3a modi&ica 3aloarea 3ariabilei locale S. )ar cum S si Suma au aceeasi adresa (si sunt de acelasi tip)8 se 3a modi&ica concomitent si 3aloarea 3ariabilei Suma (asa cum este ea 3a.uta n programul apelant). Irmatoarele trei instructiuni initiali.ea.a pe A8 B si / cu - si e#ecutia corpului procedurii se termina8 re3enindu0se n programul principal. Irmatoarea instructiune de dupa apel reali.ea.a cMiar a&isarea 3alorii 3ariabilei Suma (care am 3a.ut cum s0a modi&icat n programul apelat). Kodalitate de transmitere a parametrilor catre un subprogram (procedura sau &unctie) e#plicata n aceasta sectiune se numeste Jtransmitere prin adresaJ sau Jtransmitere prin re&erintaJ. Pentru &iecare parametru actual JpaJ transmis prin re&erinta8 parametrul &ormal corespun.ator Jp&J din subprogramul apelat3a a3ea aceeasi adresa cu el: adresa(p&) :9 adresa(pa)L pe toata durata de e#ecutie a subprogramului si orice modi&icare a 3alorii parametrului &ormal Jp&J n subprogram 3a a3ea ca e&ect imediat si modi&icarea 3alorii parametrului actual JpaJ. Procedura /alculSuma are at7t parametri transmisi prin 3aloare8 c7t si parametri transmisi prin re&erinta. Kodul n care acestia se comporta este ilustrat de re.ultatele e#ecutiei programului P!b. /onclu.ia acestei anali.e este urmatoarea: Parametrii actuali transmisi prin re&erinta dintr0un program apelant P spre un subprogram apelat SP si modi&ica 3alorile simultan cu parametrii &ormali corespun.atori lor din SP. 8.6.3.#erificarea corespondentei parametrilor formali cu cei actuali Am nceput sa discutam aceasta problema n +.%.!8 dar acolo nca nu a3eam toate elementele necesare pentru o pre.entare completa a problemei. Acum putem sa a&irmam ca 3eri&icarea se re&era la cele doua liste (lista parametrilor &ormali8 preci.ata n declararea subprogramului si lista parametrilor actuali8 preci.ata n apel) si ca se 3eri&ica: 0 numarul parametrilor transmisi (acelasi n ambele liste) 0 tipul acestora (parametrii de pe po.itia Ji Jdin ambele liste trebuie sa &ie de acelasi tip) 0 modalitatea de transmitere (parametrii de pe po.itia JiJ din lista de parametri actuali trebuie sa poata &i transmis prin modalitatea de transmitere speci&icata n lista de parametri &ormali pentru al JiJ0lea parametru &ormal). He 3om re&eri n continuare la programul P!b pre.entat anterior. Apelul procedurii ScrieSuma stabileste o corespondenta ntre parametrii &ormali si parametrii actuali. Apelul este reali.at prin instructiunea ScrieSuma(H18 H!8 H$)L si primul pas care0l &ace compilatorul este sa stabileasca daca apelul este corect. /um stabileste compilatorul ca apelul s0a &acut corectN He aducem aminte ca Pascal este un limbaj puternic tipi.at8 ceea ce nseamna ntre altele ca tipul oricarei e#presii poate &i determinat la compilare. In ca.ul nostru8 e#presiile care corespund parametrilor actuali sunt cMiar identi&icatori de 3ariabile8 deci e#presii simple. Tipul acestor e#presii este dedus n acest ca. cMiar din declaratia acestora H18 H!8 H$: IntegerL ce apare n partea de declaratii a programului principal. 1'

8.6.4. #aria$ile %lo$ale si locale &ntr'un su$pro%ram Am discutat n capitolul ( ()eclaratii) despre domeniul de 3i.ibilitate al unui identi&icator n general si despre domeniul de 3i.ibilitate si durata de 3iata a 3ariabilelor. "#emplul urmator8 pe care0l 3om comenta8 contine at7t 3ariabile globale c7t si 3ariabile locale si e#ista o perecMe de declaratii pentru aceeasi 3ariabila. Program P$L P )omeniul de 3i.ibilitate al 3ariabilelor 0 3ariabile locale si globale Q 4ar /ontor : IntegerL P globala Q Indice : IntegerL P globala Q Procedure A&isea.aY)ateL 4ar /ontor8 P locala Q Alta : IntegerL P locala Q Begin /ontor :9 *L Vriteln(JIn A&isea.aY)ate /ontor 9J8 /ontor:'8 J Indice 9J8Indice:')L "ndL P A&isea.aY)ate Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q Begin P Programul principal Q 5or Indice :9 1 to $ do Begin /ontor :9 IndiceL Vriteln(JIn programul principal /ontor 9J8/ontor:'8 J Indice 9J8Indice:')L A&isea.aY)ateL Vriteln(JIn programul principal /ontor 9J8/ontor:'8 J Indice 9J8Indice:')L VritelnL "ndL P 5or Q ScrieYS&arsit "nd. P Programul principal Q P 2e.ultatul e#ecutiei In programul principal /ontor 9 1 Indice 9 In A&isea.aY)ate /ontor 9 * Inde# 9 1 In programul principal /ontor 9 1 Indice 9 In programul principal /ontor 9 ! Indice 9 In A&isea.aY)ate /ontor 9 * Inde# 9 ! In programul principal /ontor 9 ! Indice 9 In programul principal /ontor 9 $ Indice 9 In A&isea.aY)ate /ontor 9 * Inde# 9 $ In programul principal /ontor 9 $ Indice 9 Programul s0a terminat Q 1( 1 1 ! ! $ $

4ariabila /ontor este declarata de doua ori: odata n .ona de declaratii a programului principal (de unde 3a re.ulta ca este globala) si nca odata n .ona de declaratii a procedurii A&isea.aY)ate8 ceea ce nseamna ca este locala n respecti3a procedura. )aca anali.am )o4 al 3ariabilei /ontor globala acesta tine de la declaratia sa si p7na la s&7rsitul programului principal8 mai putin procedura A&isea.aY)ate8 care o redeclara. Aceasta nseamna ca 0 n tot corpul programului principal si al subprogramelor declarate dupa declaratia 3ariabilei globale /ontor (cu e#ceptia blocului procedurii A&isea.aY)ate) numele /ontor se re&era la 3ariabila globalaL 0 n blocul procedurii A&isea.aY)ate8 numele /ontor se re&era la 3ariabila locala8 declarata acoloL "#ecutia programului justi&ica a&irmatiile de mai sus. TeMnic 3orbind8 redeclararea unui identi&icator n )o4 al sau are ca e&ect introducerea unei JgauriJ n acestaL blocul de redeclarare 3a &olosi numele redeclarat n acceptiunea cea mai recent nt7lnita. Acesta este moti3ul pentru care se obtin 3alori di&erite pentru 3ariabila /ontor n programul principal si n procedura A&isea.aY)ate: este 3orba de &apt de doua 3ariabile di&erite8 cu domenii de 3i.ibilitate disjuncte (si cu durate de 3iata di&erite) si care au prin urmare adrese di&erite n memorie8 deci 3alori di&erite. Situatia opusa este atunci c7nd doua 3ariabile di&erite au acceasi adresa de memorie si (daca sunt de acelasi tip) aceeasi 3aloare8 care se modi&ica simultan pentru ambele. "ste situatia descrisa mai nainte a parametrilor actuali transmisi prin re&erinta: at7t parametrul &ormal8 c7t si parametrul actual (care sunt doua 3ariabile di&erite8 cu toate atributele ce le de&inesc) au aceeasi adresa din memorie si trebuie sa aiba acelasi tip de date (alt&el apelul n0ar &i corect). 8.6.5. (e%uli de proiectare a su$pro%ramelor 4om da n continuare c7te3a reguli pri3ind proiectarea subprogramelor. Aceste reguli pri3esc declararea acestora (am 3a.ut anterior ca declararea este cea care dictea.a modul de apelare). He 3om re&eri la: 0 sarcinile reali.ate de subprogram 0 stabilirea parametrilor subprogramului si a modului de transmitere a acestora 0 alegerea tipului de subprogram (procedura sau &unctie) 0 stabilirea numelui subprogramului si a parametrilor acestuia :rice subprogram trebuie sa reali.e.e o actiune bine determinata (calculul unui determinant8 determinarea minimului unui sir de numere8 re.ol3area unui sistem de ecuatii8 a&isarea unui meniu8 etc). Se spune ca subprogramul este bine g7ndit daca actiunea reali.ata de el se poate concentra n numele acestuia. Irmatoarea actiune care trebuie ntreprinsa este stabilirea parametrilor de intrare si de iesire. )aca ne g7ndim ca un subprogram este implementarea unui subalgoritm8 atunci datele de intrare ale subalgoritmului 3or &i parametrii de intrare8 iar re.ultatele algoritmului 3or &i parametrii de iesire. Parametrii de intrare se transmit de obicei prin 3aloare (cu unele e#ceptii care le 3om discuta la 3remea lor)8 iar parametrii de iesire se transmit ntotdeauna prin re&erinta. Alegerea tipului subprogramului (procedura sau &unctie) este n str7nsa legatura cu actiunea e&ectuata si cu numarul de parametri de iesire ai subprogramului. )aca subprogramul are un singur parametru de iesire si acesta este de un tip simplu de data8 atunci subprogramul 3a &i de tip &unctie. )e e#emplu: calculul minimului dintr0un sir sau calculul de determinant se pot implementa ca subprograme de tip &unctie. /Miar si a&isarea unui meniu se poate implementa ca &unctie8 daca nsotim a&isarea de selectarea unei optiuni din meniu (ca. n care &unctia 3a ntoarce codul optiunii selectate). )aca nsa subprogramul are mai multi parametri de iesire sau daca tipul parametrului de iesire este unul structurat8 atunci el 3a &i proiectat ca procedura. At7t numele subprogramului8 c7t si numele parametrilor sai trebuie sa &ie sugesti3e. Humele subprogramului procedura 3a desemna o actiune8 pe c7nd numele subprogramului &unctie poate desemna obiectul (3aloarea) ntoarsa. Ina din deosebirile dintre proceduri si &unctii8 enumerate n +.' s0a re&erit la restrictia aplicata &unctiilor de a nu a3ea parametri de iesire. )aca o instructiune din corpul unui subprogram de tip &unctie modi&ica 3aloarea unei 3ariabile globale (accesata direct sau printr0un parametru transmis prin re&erinta)8 1*

se spune ca &unctia are un Je&ect secundarJ sau Je&ect colateralJ. Acest e&ect se numeste JsecundarJ deoarece e&ectul JprimarJ al &unctiei este calculul unei 3alori8 care este ntoarsa de aceasta n programul apelant. )e aceea8 unele limbaje (de e#emplu AdaL Pascal nu) impun ca toti parametrii unei &unctii sa se transmita prin 3aloare (sau prin constanta8 o 3arianta a apelului prin 3aloare care inter.ice modi&icarea 3alorilor parametrilor &ormali n corpul subprogramului). 5olosirea e&ectelor secundare este proprie programatorilor e#perimentati8 nsa n general nu se recomanda. 2egulile pre.entate aici 3in sa complete.e s&aturile pe care le0am enuntat la s&7rsitul sectiunii +.$ pri3itoare la rolul subprogramelor ntr0un program. 8.). Su$pro%rame apelate din su$pro%rame )in punctul de 3edere al drepturilor sale de apel8 un subprogram SP se comporta e#act ca un program principal PL la r7ndul sau8 SP poate a3ea n corpul sau instructiuni de apel ale altor subprograme8 inclusi3 apelul propriu. Singura conditie impusa este aceea ca subprogramele apelate de SP sa includa n domeniul lor de 3i.ibilitate corpul subprogramului SP. +.*.1. Apelul subprogramelor din subprograme. Subprograme locale n subprograme Sa consideram urmatorul e#emplu: Program P%aL P Apelul unei proceduri din alta procedura Q Procedure InuL Begin Vriteln(JAceasta este procedura InuJ)L "ndL P Inu Q Procedure )oiL Begin InuL Vriteln(JAceasta este procedura )oiJ)L "ndL P )oi Q Procedure TreiL Begin )oiL Vriteln(JAceasta este procedura TreiJ)L "ndL P Trei Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q begin P Programul principal Q InuL VritelnL )oiL VritelnL 1+

TreiL ScrieYS&arsit end. P P%a Q P 2e.ultatul e#ecutiei Aceasta este procedura Inu Aceasta este procedura Inu Aceasta este procedura )oi Aceasta este procedura Inu Aceasta este procedura )oi Aceasta este procedura Trei Programul s0a terminat Q Programul P%a este un prim e#emplu de apel de procedura n procedura. Procedura )oi contine n corpul ei apelul procedurii Inu8 iar procedura Trei contine n corpul ei apelul procedurii )oi. 2e.ultatul apelului acestor proceduri n programul principal este ilustrat n e#emplul de mai sus. Anali.7nd structura acestui program: Program P%aL WdeclaratiiX Procedure InuL Procedure )oiL Procedure TreiL Procedure ScrieYS&arsitL begin P Programul principal Q WcorpX end. P P%a Q se obser3a ca declaratiile procedurilor Inu8 )oi8 Trei8 ScrieYS&arsit sunt continute (n aceasta ordine) n partea de declaratii a sa. )e aici re.ulta ca: 0 )o4 al numelui Inu contine declaratiile procedurilor Inu8 )oi8 Trei8 ScrieYS&arsit8 precum si programul principal8 deci procedura Inu 3a putea &i apelata n oricare dintre acestea (inclusi3 n Inu 0 3e.i paragra&ul urmator)L 0 )o4 al numelui )oi contine declaratiile procedurilor )oi8 Trei8 ScrieYS&arsit8 precum si programul principal8 deci procedura )oi 3a putea &i apelata n oricare dintre acestea8 mai putin n Inu 0 care nu &ace parte din )o4 al lui )oi 0 )o4 al numelui Trei contine declaratiile procedurilor Trei8 ScrieYS&arsit8 precum si programul principal8 deci procedura Trei 3a putea &i apelata n oricare dintre acestea8 mai putin n Inu si )oi 0 care nu &ac parte din )o4 al lui Trei 0 s.a.m.d. Irmatorul e#emplu 3ine sa ilustre.e generalitatea conceptului de bloc din Pascal. /um .ona de declaratii a unui subprogram poate contine orice declaratie 3alida8 ea 3a putea contine si declaratii de subprograme. In programul P%b am inclus declaratia procedurii )oi n .ona de declaratii a procedurii Inu si am in3ersat apelurile: Inu apelea.a pe )oi. /e constatam daca dorim sa lansam n e#ecutie acest program este ca el nu &unctionea.a: se produce o eroare de compilare: 1,

InZno1n identi&ier 0 Identi&icator necunoscut la apelul procedurii )oi n corpul lui Trei si (daca comentam acest apel) la apelul lui )oi din programul principal. Program P%bL P Apelul unei proceduri din alta procedura Q Procedure InuL Procedure )oiL Begin Vriteln(JAceasta este procedura )oi din InuJ)L "ndL P )oi Q Begin P Inu Q Vriteln(JAceasta este procedura InuJ)L )oiL P corect[ )oi este locala in Inu Q "ndL P Inu Q Procedure TreiL Begin )oiL P eroare de compilare: Identi&icator necunoscut Q Vriteln(JAceasta este procedura TreiJ)L "ndL P Trei Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q begin P Programul principal Q InuL VritelnL )oiL P eroare de compilare: Identi&icator necunoscut Q VritelnL TreiL P nu se poate compila Trei Q ScrieYS&arsit end. P P%b Q P 2e.ultatul e#ecutiei: programul are erori de compilare Q Structura programului P%b se nscrie n urmatoarea scMema: Program P%bL WdeclaratiiX Procedure InuL Procedure )oiL P locala n Inu si in3i.ibila n a&ara Q Procedure TreiL Procedure ScrieYS&arsitL begin P Programul principal Q WcorpX end. P P%b Q !-

din care se obser3a ca procedurile locale n program sunt procedurilor Inu8 Trei8 ScrieYS&arsit care sunt continute (n aceasta ordine) n partea de declaratii a sa8 iar procedura )oi este locala n Inu. )e aici re.ulta ca: 0 )o4 al numelui Inu contine declaratiile procedurilor Inu8 )oi8 Trei8 ScrieYS&arsit8 precum si programul principal8 deci procedura Inu 3a putea &i apelata n oricare dintre acestea (inclusi3 n Inu 0 3e.i paragra&ul urmator)L 0 )o4 al numelui )oi contine doar declaratiile procedurilor )oi si Inu8 &ara programul principal8 deci procedura )oi nu 3a putea &i apelata dec7t n corpul lui Inu 0 unde este locala si n propriul sau corp (apel recursi3 0 3e.i sectiunea urmatoare) 0 )o4 al numelui Trei contine declaratiile procedurilor Trei8 ScrieYS&arsit8 precum si programul principal8 deci procedura )oi 3a putea &i apelata n oricare dintre acestea8 mai putin n Inu si )oi 0 care nu &ac parte din )o4 al sau 0 s.a.m.d. Iltimul e#emplu care0l dam aici reproduce &unctionalitatea programului P%a &olosind proceduri declarate local n alte proceduri: program P%cL P Apelul unei proceduri din alta procedura Q Procedure InuL Begin Vriteln(JAceasta este procedura InuJ)L "ndL P Inu Q Procedure )oiL Procedure InuL Begin Vriteln(JAceasta este procedura Inu din )oiJ)L "ndL P Inu Q Begin P )oi Q InuL P apelul procedurii locale Inu Q Vriteln(JAceasta este procedura )oiJ)L "ndL P )oi Q Procedure TreiL Procedure )oiL Procedure InuL Begin Vriteln(JAceasta este procedura Inu din )oi din TreiJ)L "ndL P Inu Q Begin P )oi Q InuL P apelul procedurii locale Inu Q Vriteln(JAceasta este procedura )oi din TreiJ)L "ndL P )oi Q Begin P Trei Q )oiL P apelul procedurii locale )oi Q Vriteln(JAceasta este procedura TreiJ)L !1

"ndL P Trei Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q begin P Programul principal Q InuL P apelul procedurii Inu din programul principal Q VritelnL )oiL VritelnL TreiL ScrieYS&arsit end. P P%c Q P 2e.ultatul e#ecutiei Aceasta este procedura Inu Aceasta este procedura Inu din )oi Aceasta este procedura )oi Aceasta este procedura Inu din )oi din Trei Aceasta este procedura )oi din Trei Aceasta este procedura Trei Programul s0a terminat Q Structura acestui program este urmatoarea Program P%cL WdeclaratiiX Procedure InuL Procedure )oiL Procedure InuL P locala n )oi si in3i.ibila n a&ara Q Procedure TreiL Procedure )oiL P locala n Trei si in3i.ibila n a&ara Q Procedure InuL P locala n )oi si in3i.ibila n a&ara Q Procedure ScrieYS&arsitL begin P Programul principal Q WcorpX end. P P%c Q iar &unctionarea programului (ilustrata de re.ultatul tiparit) este justi&icata doar de regulile de 3i.ibilitate a identi&icatorilor ntr0un program cu structura de bloc. Sa remarcam aici ca declaratiile procedurilor locale introduc JgauriJ n )o4 al identi&icatorilor cu acelasi nume declarati n programul principal si ca n corpul procedurilor )oi si Trei 3or &i apelate8 din acest moti38 subprogramele locale acestora si nu cele globale. Kai mult8 acest program 3a &unctiona corect indi&erent de ordinea n care apar declaratiile procedurilor Inu8 )oi si Trei n .ona de declaratii a !!

programului principal (ceea ce nu se 3a nt7mpla n P%a 0 acolo s0ar produce o eroare de compilare). Sa remarcam de asemenea ca n P%c se &olosesc identi&icatori rede&initi &ara a se pro3oca o eroare de compilare. 5iecare identi&icator are propriul sau )o4 si nu e#ista ambiguitati. +.*.!. Apelul recursi3 In paragra&ul precedent am amintit ca numele unei proceduri se poate re&eri n corpul acesteia. Am discutat de asemenea n +.' &aptul ca numele unei &unctii este obligatoriu sa apara n membrul st7ng al unei operatii de atribuire. /e se nt7mpla nsa daca n corpul procedurii P apare o instructiune de apel a sa8 sau daca n corpul &unctiei 5 numele acesteia apare n membrul drept al unei operatii de atribuireN Ambele situatii sunt permise (n anumite conditii care 3or &i discutate n continuare) si sunt tratate ca apeluri (de procedura8 respecti3 de &unctie)8 &iind numite Japeluri recursi3eJ. Subprogramele recursi3e permit o descriere eleganta a proceselor de calcul (algoritmilor) care se pretea.a g7ndirii recursi3e. )e &apt recursi3itatea este o alta metoda de reducere a unei probleme date P la o problema mai simpla. Spre deosebire de descompunerea &unctionala8 n care subproblemele sunt di&erite de problema initiala8 n ca.ul recursi3itatii simple re.ol3area problemei P (de dimensiune n) se reduce la re.ol3area aceleiasi probleme P (de dimensiune n01 sau mai mica). In e#emplu simplu de aplicare a recursi3itatii este determinarea &actorialului din numarul natural n: 5act(n) ::9 n ; 5act(n01)L care nu inseamna decat aplicarea &ormulei de recurenta n[ 9 n ; (n01)[ )in punctul de 3edere al anali.ei noastre8 am redus problema determinarii lui n[ (care spunem ca are dimensiunea n) la problema determinarii lui (n01)[ (deci aceeasi problema8 dar de dimensiune n01). )in scMema de mai sus se obser3a ca problema nu este n ntregime re.ol3ata. Pe l7nga stabilirea unei legaturi ntre P(n) si P(n01)8 trebuie obligatoriu gasit un criteriu de stop (similar criteriului de oprire a descompunerii): cea mai mare 3aloare a lui n pentru care P(n) are solutie cunoscuta si deci nu mai trebuie aplicata recursi3itatea. Prin urmare8 re.ol3area recursi3a a unei probleme P(n) nseamna stabilirea a doua elemente8 la &el de importante: 0 o relatie ntre P(n) si P(n01) 0 un criteriu de oprire (o 3aloare a lui n pentru care P(n) are solutie cunoscuta) 0 n ca.ul &actorialului8 criteriul de stop se poate considera n 9 18 a37nd n 3edere ca 1[ 9 1 este cunoscut (din de&initia &actorialului) !$

In alt e#emplu simplu de aplicare a recursi3itatii este determinarea minimului unui sir de numere a18 a!8 ...8 an. Plecam de la urmatoarea constatare: ; n 9 !: P(!) nseamna determinarea minimului a doua numere8 a18 a! si se considera ca are solutie (se poate implementa direct) Kinim(a18 a!) ::9 a1 daca a1 R a! 8 respecti3 a! daca a! 9 a1 ; n S !: P(n) se re.ol3a ast&el: Kinim(a18 a!8 ...8 an) ::9 Kinim(a18 Kinim(a!8 ...8 an)) /riteriul de stop este aici atingerea 3alorii n 9 !. At7t procedurile8 c7t si &unctiile se pot apela recursi3. "#emplele urmatoare ilustrea.a acest lucru. program P'L P Proceduri recursi3e Q Ises /rtL Procedure A&isea.aYTitluL Begin /lrScrL Vrite6n(JProgram care &oloseste o procedura recursi3aJ)L "ndL P A&isea.aTitlu Q Procedure A&isea.aYSiYKicsorea.a(Indice : integer)L Begin Vriteln(J4aloarea indicelui este J8Indice:$)L Indice :9 Indice 0 1L I& Indice S - TMen A&isea.aYSiYKicsorea.a(Indice)L "ndL P A&isea.aYSiYKicsorea.a Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q 4ar /ontor: IntegerL Begin P programul principal Q A&isea.aYTitluL /ontor :9 *L A&isea.aYSiYKicsorea.a(/ontor)L ScrieYS&arsit "nd. P P' Q P 2e.ultatul e#ecutiei !%

Program care &oloseste o procedura recursi3a 4aloarea indicelui este * 4aloarea indicelui este ( 4aloarea indicelui este ' 4aloarea indicelui este % 4aloarea indicelui este $ 4aloarea indicelui este ! 4aloarea indicelui este 1 Programul s0a terminat Q Procedura recursi3a din acest program este A&isea.aYSiYKicsorea.a. "a primeste ca parametru (transmis prin 3aloare) un ntreg Indice care este a&isat (3aloarea cu care s0a &acut apelul)8 apoi este micsorat si (daca 3aloarea sa este strict po.iti3a) se apelea.a din nou procedura (cu noua 3aloare a lui Indice). Se obser3a si din modul de e#ecutie a programului ca la urmatoarea e#ecutie se repeta aceleasi operatii. /riteriul de stop al apelului recursi3 este atingerea 3alorii - pentru Indice. Se obser3a ca apelul recursi3 trebuie sa respecte ntr0u totul sinta#a u.uala de apel a procedurii. Al doilea e#emplu de program din acest paragra& ilustrea.a &olosirea &unctiilor recursi3e. 2eamintim ca apelul &unctiei este di&erit sintactic si semantic de apelul de procedura. program P(L P 5unctii recursi3e Q Ises /rtL Procedure A&isea.aYTitluL Begin /lrScrL Vrite6n(JProgram care determina /KK)/ a doua numereJ)L "ndL P A&isea.aTitlu Q 5unction /KK)/Y2ec(a8 b: 6ongInt): 6ongIntL P determina cmmdc al numerelor a si b &olosind &ormula: cmmdc(a8 b) 9 cmmdc(b8 a mod b) daca b RS 9a daca b 9 Preconditie: a S b S Q Begin Vrite6n(J/KK)/(J8a:118 J8J8 b:118 J)9J)L I& b 9 - tMen /KK)/Y2ec :9 a "lse /KK)/Y2ec :9 /KK)/Y2ec(b8 a mod b)L "ndL P /KK)/Y2ec Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q !'

4ar Humar1: 6ongIntL P primul numar citit Q Humar!: 6ongIntL P al doilea numar citit Q Begin P Programul principal Q A&isea.aYTitluL Vrite(JIntroduceti primul numar: J)L 2ead6n(Humar1)L Vrite(JIntroduceti al doilea numar: J)L 2ead6n(Humar!)L I& Humar1 S9 Humar! TMen Vrite6n(/KK)/Y2ec(Humar18 Humar!)) "lse Vrite6n(/KK)/Y2ec(Humar!8 Humar1))L ScrieYS&arsit "nd. P P( Q P 2e.ultatul e#ecutiei Program care determina /KK)/ a doua numere Introduceti primul numar: 1!$' Introduceti al doilea numar: ('*-/KK)/( ('*--8 1!$') 9 /KK)/( 1!$'8 !%') 9 /KK)/( !%'8 1-) 9 /KK)/( 1-8 ') 9 /KK)/( '8 -) 9 ' Programul s0a terminat Q Acest e#emplu implementea.a o 3arianta recursi3a a algoritmului de determinare a celui mai mare di3i.or comun a doua numere naturale8 &olosind relatia de recurenta enuntata n comentariile a&erente &unctiei /KK)/Y2ec. /on&orm7ndu0ne regulilor enuntate anterior8 deoarece subprogramul de determinare a cmmdc primeste ca parametri doua numere ntregi si ntoarce un alt numar8 este natural sa &ie conceput ca &unctie. /riteriul de stop al recursi3itatii este dat de relatia cmmdc(a8 -) ::9 a iar reducerea problemei la una de dimensiune mai mica (dimensiune mai mica nseamna aici parametri cu 3alori mai mici) se ba.ea.a pe relatia amintita: cmmdc(a8 b) ::9 cmmdc(b8 a mod b) (Preconditie: a S9 b) 4eri&icarea preconditiei se &ace n programul apelant (programul principal)8 dupa citirea 3alorilor numerelor pentru care se calculea.a cmmdc8 re.ult7nd doua apeluri nglobate ntr0o structura alternati3a. /orpul subprogramului a&isea.a prima data parametrii de apel (pentru a se ilustra succesiunea apelurilor si deci maniera de re.ol3are a problemei). Sa mai obser3am ca relatia de recurenta enuntata conser3a preconditia (ntotdeauna b S a mod b). !(

In algoritm mai lent este cel n care relatia de recurenta este cmmdc(a8 b) ::9 cmmdc(b8 a 0 b) care nsa nu mai pastrea.a preconditia. Sugeram cititorului implementarea lui. +.*.$. Subprograme mutual recursi3e In ca. interesant de recursi3itate este acela n care sunt implicate doua subprograme8 A si B si n care 0 A apelea.a n corpul sau pe B 0 B apelea.a n corpul sau pe A si oricare dintre ele se pot apela din programul principal. Subprogramele A si B care ndeplinesc aceste conditii se numesc Jmutual recursi3eJ. /u ceea ce stim p7na acum despre Pascal8 acest lucru este imposibil. Sa 3edem de ce. /onsideram ca A si B sunt subprograme declarate local n programul P. )eclararea lor ar putea &i n ordinea A8 B sau B8 A. In ambele situatii8 apelul reciproc nu se poate implementa. )e e#emplu8 ordinea Program PL Procedure AL Wcorp AX Pcontine apelul lui B 0 eroare[ B nedeclarat ncaQ Procedure BL Wcorp BX Pcontine apelul lui AQ Begin AL B "nd. ar pro3oca o eroare de compilare (n corpul lui A se apelea.a B8 care nu a &ost nca declarat8 deci se obtine eroarea de compilare InZno1n identi&ier 9 Identi&icator necunoscut Analog8 daca se in3ersea.a ordinea de declarare8 eroarea de compilare s0ar produce n corpul lui B. Ar &i o solutie care ar re.ol3a partial problema (A si B s0ar putea apela reciproc)8 nsa numai una dintre ele ar putea &i apelata din programul principal: Program PL Procedure AL Procedure BL P locala n A Q Wcorp BX Pcontine apelul lui A 0 corect[ A este declaratQ Wcorp AX Pcontine apelul lui B 0 corect[ B este declaratQ Begin !*

AL B "nd.

Peroare de compilare[ B nu este 3i.ibil aiciQ

Pentru a re.ol3a complet problema8 este ne3oie de nca un mecanism. Acesta este concreti.at n Turbo Pascal de directi3a J5or1ardJ8 care are ca scop sa anunte compilatorului sinta#a de apel a unui subprogram care 3a &i declarat mai t7r.iu. Sinta#a acestei directi3e este Antet subprogramL 5or1ardL si se aplica ca n e#emplul urmator Program PL Procedure B(parametri)L 5or1ardL Procedure A(parametri)L Wcorp AX Pcontine apelul lui B 0 corect[ apelul lui B este preci.at n 5or1ardQ Procedure BLPnu mai este obligatorie preci.area parametrilorQ Wcorp BX Pcontine apelul lui AQ Begin AL B "nd. "ste 3alabila si 3ersiunea: Program PL Procedure A(parametri)L 5or1ardL Procedure B(parametri)L Wcorp BX Pcontine apelul lui A 0 corect[ apelul lui A este preci.at n 5or1ardQ Procedure ALPnu mai este obligatorie preci.area parametrilorQ Wcorp AX Pcontine apelul lui BQ Begin AL B "nd. "#emplul pre.entat n continuare e#empli&ica declararea si &olosirea procedurilor mutual recursi3e. Sa remarcam ca cel putin una dintre proceduri trebuie sa aiba n corpul ei o instructiune de stop 0 alt&el s0ar ajunge la un ciclu in&init. program P*L P Proceduri mutual recursi3e Q Ises /rtL Procedure A&isea.aYTitluL Begin !+

/lrScrL Vrite6n(JApel recursi3 0 proceduri mutual recursi3eJ)L "ndL P A&isea.aTitlu Q Procedure ScrieY:Y6inie(3ar /ontor : Integer)L 5or1ardL Procedure Kicsorea.a(3ar Indice : Integer)L Begin Indice :9 Indice 0 1L I& Indice S - TMen ScrieY:Y6inie(Indice)L "ndL P Kicsorea.a Q Procedure ScrieY:Y6inieL begin Vriteln(J4aloarea contorului este acum J8/ontor:%)L Kicsorea.a(/ontor)L endL P ScrieY:Y6inie Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q 4ar )eY/ateY:ri : integerL Begin P programul principal Q A&isea.aYTitluL )eY/ateY:ri :9 *L Vrite6n(JApele. Kicsorea.aJ)L Kicsorea.a()eY/ateY:ri)L VritelnL )eY/ateY:ri :9 *L Vrite6n(JApele. ScrieY:Y6inieJ)L ScrieY:Y6inie()eY/ateY:ri)L ScrieYS&arsit "nd. P P* Q P 2e.ultatul e#ecutiei Apel recursi3 0 proceduri mutual recursi3e Apele. Kicsorea.a 4aloarea contorului este acum ( 4aloarea contorului este acum ' 4aloarea contorului este acum % 4aloarea contorului este acum $ 4aloarea contorului este acum ! 4aloarea contorului este acum 1 Apele. ScrieY:Y6inie 4aloarea contorului este acum * !,

4aloarea contorului este acum 4aloarea contorului este acum 4aloarea contorului este acum 4aloarea contorului este acum 4aloarea contorului este acum 4aloarea contorului este acum Programul s0a terminat Q +.+. Tipuri procedurale

( ' % $ ! 1

Incep7nd cu 3ersiunea '.-8 mediul Turbo Pascal poseda doua tipuri de date noi8 numite generic Jtipuri proceduraleJ: tipul Procedure si tipul 5unction. Aceste tipuri se pot declara de catre utili.ator si se includ n sistemul de tipuri al limbajului. Prin urmare8 se pot declara si &olosi 3ariabile de tipurile respecti3e. Sinta#a declaratiei tipurilor procedurale este: TUpe HumeYTipYProc 9 Procedure(listaYparametriY&ormali)L HumeYTipY5unc 9 5unction(listaYparametriY&ormali): tipYre.ultatL unde listaYparametriY&ormali si tipYre.ultat au semni&icatia de la declararea procedurilor si &unctiilor. 2ostul declaratiei de tip procedural este preci.area signaturii tipului de subprogram8 anume: 0 preci.area tipurilor parametrilor &ormali (si a modului de transmitere) 0 nu este obligatoriu ca numele parametrilor sa coincida 0 perecMile (tipYparametru8 mod de transmitere) pentru &iecare parametru determina ceea ce numim JsignaturaJ tipului procedural 0 perecMile (tipYparametru8 mod de transmitere) pentru &iecare parametru8 impreuna cu tipul re.ultatului intors determina ceea ce numim JsignaturaJ tipului &unctional 0 preci.area tipului re.ultatului ntors (numai pentru tipurile &unctionale) Pentru ca sa se poata &olosi tipuri procedurale ntr0un program8 acesta trebuie sa contina o directi3a de compilare PT5>Q (5orce 5ar /alls). +.+.1. Tipuri Procedure Humele oricarui subprogram de tip Procedure care are signatura identica cu signatura tipului HumeYTipYProc 3a putea &i atribuit unei 3ariabile de tipul HumeYTipYProc si orice 3ariabila de acest tip 3a putea nlocui ntr0o instructiune de apel numele concret al subprogramului continut de ea. "#emplul urmator este sugesti3: program P+aL P Tipuri procedurale Q $-

Ises /rtL PT5>Q P Aceasta directi3a &ortea.a apelurile &ar si este necesara cand dorim sa lucram cu tipuri procedurale in Turbo Pascal Q TUpe :pYAritm 9 Procedure(a8 b8 c : IntegerL 3ar r : Integer)L P tip procedural Q Procedure A&isea.aYTitluL Begin /lrScrL Vrite6n(JProgram care &oloseste tipuri procedurale siJ)L Vrite6n(Je&ectuea.a operatii aritmetice cu trei numereJ) "ndL P A&isea.aTitlu Q Procedure Adunare(In18 In!8 In$: IntegerL 3ar 2e.ultat : Integer)L Begin 2e.ultat :9 In1 > In! > In$L Vriteln(JSuma numerelor este J8 2e.ultat:()L "ndL P Adunare Q Procedure Inmultire(In18 In!8 In$: IntegerL 3ar 2e.ultat : Integer)L Begin 2e.ultat :9 In1 ; In! ; In$L Vriteln(JProdusul numerelor este J8 2e.ultat:()L "ndL P Inmultire Q Procedure Kedie(In18 In!8 In$: IntegerL 3ar 2e.ultat : Integer)L Begin 2e.ultat :9 (In1 > In! > In$) di3 $L Vriteln(JKedia numerelor este J8 2e.ultat:()L "ndL P Kedie Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q 4ar Humar18 Humar!8 Humar$: IntegerL 2e.ultatY5inal: IntegerL :peratie: :pYAritmL Begin P Programul principal Q A&isea.aYTitluL Vrite(JIntroduceti primul numar: J)L 2ead6n(Humar1)L $1

Vrite(JIntroduceti al doilea numar: J)L 2ead6n(Humar!)L Vrite(JIntroduceti al treilea numar: J)L 2ead6n(Humar$)L :peratie :9 AdunareL :peratie(Humar18 Humar!8 Humar$8 2e.ultatY5inal)L :peratie :9 InmultireL :peratie(Humar18 Humar!8 Humar$8 2e.ultatY5inal)L :peratie :9 KedieL :peratie(Humar18 Humar!8 Humar$8 2e.ultatY5inal)L ScrieYS&arsit end. P P+a Q P 2e.ultatul e#ecutiei Program care &oloseste tipuri procedurale si e&ectuea.a operatii aritmetice cu trei numere Introduceti primul numar: 1! Introduceti al doilea numar: !$ Introduceti al treilea numar: $% Suma numerelor este (, Produsul numerelor este ,$+% Kedia numerelor este !$ Programul s0a terminat Q Programul de mai sus de&ineste tipul procedural :pYAritm8 care are trei parametri ntregi de intrare (transmisi prin 3aloare) si unul ntreg de iesire (transmis prin adresa). In partea sa de declaratii sunt de&inite si trei proceduri care e&ectuea.a operatii aritmetice (numite Adunare8 Inmultire si Kedie) care au aceeasi signatura ca si :pYAritm (cMiar daca numele parametrilor di&era8 numarul lor este acelasi8 si ei corespund ca tip si ca modalitate de transmitere). \ona de declaratii de 3ariabile a programului contine declararea unei 3ariabile procedurale (de tipul :pYAritm) numita :peratie8 care 3a &i &olosita n corpul programului pentru apelul indirect al procedurilor aritmetice preci.ate anterior. )e e#emplu8 maniera de apelare a procedurii Adunare este urmatoarea: :peratie :9 AdunareL :peratie(Humar18 Humar!8 Humar$8 2e.ultatY5inal)L Prima instructiune initiali.ea.a 3ariabila :peratie cu adresa procedurii Adunare. Initiali.area este posibila deoarece Adunare si :peratie au aceeasi signatura (si deci acelasi tip de date). A doua instructiune se traduce printr0un apel indirect de procedura. 4ariabila :peratie contine adresa procedurii Adunare si prin urmare acest apel se traduce de &apt n apelul $!

Adunare(Humar18 Humar!8 Humar$8 2e.ultatY5inal)L 8.8.2. *ipuri +unction Humele oricarui subprogram de tip 5unction care are signatura identica cu signatura tipului HumeYTipY5unc 3a putea &i atribuit unei 3ariabile de tipul HumeYTipY5unc si orice 3ariabila de acest tip 3a putea nlocui ntr0o instructiune de apel numele concret al subprogramului continut de ea. "#emplul urmator este ecMi3alent cu cel de la tipuri procedurale8 &olosind de data aceasta tipuri &unctionale (care sunt mai naturale pentru ca.ul ilustrat8 deoarece operatiile aritmetice pre.entate se implementea.a natural ca &unctii): program P+bL P Tipuri &unctionale Q Ises /rtL PT5>Q P Aceasta directi3a &ortea.a apelurile &ar si este necesara cand dorim sa lucram cu tipuri procedurale sau &unctional in Turbo Pascal Q TUpe :pYAritm 9 5unction(a8 b8 c : integer): IntegerL Procedure A&isea.aYTitluL Begin /lrScrL Vrite6n(JProgram care &oloseste tipuri &unctionale siJ)L Vrite6n(Je&ectuea.a operatii aritmetice cu trei numereJ) "ndL P A&isea.aTitlu Q 5unction Adunare(In18 In!8 In$: Integer): IntegerL 4ar 2: IntegerL Begin 2 :9 In1 > In! > In$L Vriteln(JSuma numerelor este J8 2:()L Adunare :9 2 "ndL P Adunare Q 5unction Inmultire(In18 In!8 In$: Integer): IntegerL 4ar 2: IntegerL Begin 2 :9 In1 ; In! ; In$L Vriteln(JProdusul numerelor este J8 2:()L Inmultire :9 2 "ndL P Inmultire Q 5unction Kedie(In18 In!8 In$: Integer): IntegerL 4ar 2: IntegerL Begin 2 :9 (In1 > In! > In$) di3 $L Vriteln(JKedia numerelor este J8 2:()L $$

Kedie :9 2 "ndL P Kedie Q Procedure ScrieYS&arsitL Begin Vriteln(JProgramul s0a terminatJ)L "ndL P ScrieYS&arsit Q 4ar Humar18 Humar!8 Humar$: IntegerL 2e.ultatY5inal: IntegerL :peratie: :pYAritmL Begin P Programul principal Q A&isea.aYTitluL Vrite(JIntroduceti primul numar: J)L 2ead6n(Humar1)L Vrite(JIntroduceti al doilea numar: J)L 2ead6n(Humar!)L Vrite(JIntroduceti al treilea numar: J)L 2ead6n(Humar$)L :peratie :9 AdunareL 2e.ultatY5inal :9 :peratie(Humar18 Humar!8 Humar$)L :peratie :9 InmultireL 2e.ultatY5inal :9 :peratie(Humar18 Humar!8 Humar$)L :peratie :9 KedieL 2e.ultatY5inal :9 :peratie(Humar18 Humar!8 Humar$)L ScrieYS&arsit end. P P+b Q P 2e.ultatul e#ecutiei Program care &oloseste tipuri procedurale si e&ectuea.a operatii aritmetice cu trei numere Introduceti primul numar: 1! Introduceti al doilea numar: !$ Introduceti al treilea numar: $% Suma numerelor este (, Produsul numerelor este ,$+% Kedia numerelor este !$ Programul s0a terminat Q Sa remarcam ca s0au modi&icat corespun.ator declaratiile tipului procedural (&unctional) :pYAritm8 ale subprogramelor aritmetice (care sunt acum &unctii) si apelul acestora din programul principal. 1. eneralitati !. "lemente de sinta#a $. Structura unui program %. Tipuri de date prede&inite $%

'. "#presii (. )eclaratii si de&initii *. Instructiuni +. Subprograme Pascal ,. Tipuri de date structurate 1-. Structuri dinamice de date 11. "lemente de modulari.are 1!. Abstracti.area datelor 1$. Programarea orientata pe obiecte /apitolul ,. Tipuri de date structurate ,.1. Tipul de date tablou ,.1.1. /onceptul de tablou ,.1.!. )eclararea tablourilor ,.1.$. Accesarea tablourilor ,.1.%. Tablouri bidimensionale ,.1.'. Tablouri multidimensionale ,.1.(. :peratii globale pe tablori ,.1.*. Stringuri ,.1.+. Tablouri descMise ,.!. Tipul de date multime ,.!.1. )e&initia tipurilor multime ,.!.!. /onstruirea multimilor si atribuirea ,.!.$. /ompararea multimilor si testul de apartenenta ,.!.%. :peratii cu multimi ,.$. Tipul de date nregistrare ,.$.1. /onceptul de nregistrare ,.$.!. )eclararea tipului nregistrare ,.$.$. Accesarea componentelor. Instructiunea VitM ,.$.%. Structuri comple#e ,.$.'. Inregistrari cu 3ariante ,.$.(. Initiali.area nregistrarilor ,.%. Tipul de date &isier ,.%.1. Hotiunea de &isier ,.%.!. :peratii asupra &isierelor ,.%.$. 5isiere te#t ,.%.%. 5isiere cu tip ,.%.'. 5isiere &ara tip (stream) ,.%.(. 5isierele sistem Tipuri de date structurate 6imbajele de programare dispun de modalitati de agregare a datelor care permit apoi tratarea globala a acestora. "ste 3orba n general de date care corespund ni3elului de abstracti.are al limbajului8 deci care nu au corespondent direct n tipurile masina. Pentru ca aceste date de&inite de utili.ator con&orm ne3oilor sale concrete sa poata &i integrate n mecanismul de tipuri al limbajului8 acesta din urma pune la dispo.itia programatorului $'

constructorii de tipuri. In acest capitol se 3or discuta tipurile de date structurate. Spre deosebire de datele simple8 care sunt atomice8 indi3i.ibile8 datele structurate (compuse8 agregate) se descompun n componente sau elemente8 &iecare de un tip preci.at (simplu sau structurat). : data structurata poate &i accesata &ie ca ntreg (global)8 &ie pe componente. Structura unei date stabileste relatiile care e#ista ntre componentele acesteia. "#ista patru tipuri de legaturi structurale &undamentale: 0 multime (nici o legatura ntre componente)8 0 liniara (legatura 1:1)8 0 arbore (legatura 1:n) si 0 gra& (legatura m:n). )in punctul de 3edere al uni&ormitatii structurale8 datele structurate se mpart n: 0 omogene (toate componentele au acelasi tip)L tipurile de date a&erente sunt numite tablou (engl. arraU)8 multime (engl. set) si &isier (engl. &ile)L 0 Meterogene (elementele unei date au de obicei componente di&erite ca tip)L ele apartin tipului de date nregistrare (engl. record). Tablourile8 &isierele si nregistrarile au structura liniara: e#ista o prima si o ultima componenta8 iar toate celelalte au &iecare at7t predecesor8 c7t si succesor. Prin urmare8 un element (al tabloului)8 o nregistrare (din &isier) sau un c7mp (al nregistrarii) se pot locali.a. In tablou este un agregat de elemente de acelasi tip8 un element &iind locali.at prin po.itia pe care o ocupa n cadrul acestuia (indicele elementului de tablou). In &isier este constituit si el din elemente (nregistrari) de acelasi tip8 locali.ate tot dupa po.itia ocupata n &isier. )eosebirea dintre un tablou si un &isier consta n aceea ca tabloul este memorat n memoria interna a calculatorului8 iar &isierul este memorat n memoria e#terna (pe un suport magnetic sau magneto0optic). : nregistrare este un agregat care grupea.a de obicei elemente de tipuri di&erite numite c7mpuri si locali.ate prin numele lor. Kultimea are o structura amor&a: ea contine elemente de acelasi tip8 care nsa nu pot &i locali.ate e#plicit8 nee#ist7nd o ordine in care sa &ie considerate elementele din ea. Pentru tipurile structurate8 e#ista doua operatii de ba.a: construirea si selectarea componentelor. :peratia de construire a unei 3ariabile de tip structurat se &ace dupa regulile proprii ale &iecarui limbaj. Pentru tablouri8 &isiere si nregistrari e#ista si operatia de selectare a unei componente8 care este reali.ata n maniere di&erite. In ca.ul unui tablou8 selectarea unui element se &ace pe ba.a unei e#presii de indice8 atasata numelui 3ariabilei tablou. Pe ba.a e#presiei de indice si a in&ormatiilor despre tablou se e&ectuea.a calculul adresei elementului n cau.a. "#presia de indice nu se poate e3alua la compilare (ea contine de regula identi&icatori)8 3aloarea ei &iind obtinuta la e#ecutie. Pentru &isiere8 selectarea unei nregistrari se &ace dupa po.itia pe care nregistrarea respecti3a o ocupa n &isier. )in nou8 po.itia se poate da $(

printr0o e#presie care nu se poate e3alua la compilare. )omeniul de 3i.ibilitate al numelor c7mpurilor unei nregistrari ncepe cu punctul lor de declarare si se termina la s&7rsitul declaratiei tipului nregistrare. Selectarea unei componente (c7mp) se &ace pe ba.a unei e#presii de selectare8 care contine numele c7mpului cali&icat cu numele 3ariabilei nregistrare. In acest ca.8 adresa relati3a a c7mpului n cau.a se poate determina la compilare. Pentru &iecare tip de date T introdus printr0o declaratie de tip8 Turbo Pascal pune la dispo.itia programatorului o &unctie numita Si.e:&8 care ntoarce numarul de octeti pe care se repre.inta o 3ariabila de tipul respecti3. Si.e:& poate se poate &olosi 0 cu parametrul T: Si.e:&(T)L T este un nume de tip de date 0 cu parametrul 4: Si.e:&(4)L 4 este o 3ariabila de tipul T "#emplu de &olosire Si.e:&: daca a3em constructiile Wdeclararea lui TX 4ar 4: TL begin I& Si.e:&(4) 9 Si.e:&(T) TMen ... Pe#presia este TrueQ "nd. ,.1. Tipul de date tablou ,.1.1. /onceptul de tablou ,.1.!. )eclararea tablourilor ,.1.$. Accesarea tablourilor ,.1.%. Tablouri bidimensionale ,.1.'. Tablouri multidimensionale ,.1.(. :peratii globale pe tablori ,.1.*. Stringuri ,.1.+. Tablouri descMise "lementele de&initorii ale unui tip de date tablou sunt: 0 numele (optional)8 0 lista dimensiunilor8 0 tipul elementului de tablou8 0 domeniul pentru multimea indicilor. Humele unui tip tablou este un identi&icator. "#ista si tipuri tablou anonime8 care nu necesita declarare de tip8 ele put7ndu0se &olosi la declararea de 3ariabile. 6ista dimensiunilor preci.ea.a numarul de dimensiuni al tabloului respecti3 (monodimensional8 bidimensional8 tridimensional s.a.m.d)8 e#ist7nd restrictii de la limbaj la limbaj pri3ind numarul ma#im de dimensiuni permis. Tipul elementului de tablou de&ineste natura acestui element8 preci.7nd repre.entarea lui8 iar domeniul pentru multimea indicilor este de obicei (dar nu ntotdeauna) de tip subdomeniu8 o&erind in&ormatie despre indicii $*

3ali.i: pentru &iecare dimensiune se speci&ica limita in&erioara JliJ si limita superioara JlsJ8 cu :rd(li) R9 :rd(ls)L numarul de elemente al dimensiunii respecti3e este :rd(ls) 0 :rd(li) > 1. Humarul de elemente al tabloului este produsul numerelor de elemente din &iecare dimensiune. 6ungimea de repre.entare (dimensiunea alocata) al unei 3ariabile de tip tablou este egal cu produsul dintre numarul de elemente al tabloului si lungimea de repre.entare a elementului de tablou. /riteriile de clasi&icare a tablourilor sunt cel putin urmatoarele: 0 numarul de dimensiuniL 0 tipul elementului (care poate induce operatii speci&ice)L 0 momentul alocariiL 0 posibilitatea de redimensionare. )in punctul de 3edere al numarului de dimensiuni8 nt7lnim tablouri monodimensionale (numite si 3ectori)8 tablouri bidimensionale (numite si matrici)8 tablouri tridimensionale8 n general tablouri d0dimensionale. 6a nceputurile &olosirii calculatoarelor8 c7nd calculele stiinti&ice erau principalul domeniu de &olosire a acestora8 tablourile utili.ate erau numerice8 n special 3ectori si matrici. In limbajele de programare actuale8 tablourile pot a3ea o mare di3ersitate de tipuri de elemente: numerice8 caractere8 siruri de caractere8 nregistrari8 pointeri. )in punctul de 3edere al momentului alocarii8 e#ista doua categorii de tablouri: statice si dinamice. Tablourile statice se aloca la compilare (sau cel putin trebuie cunoscute la compilare dimensiunile). Pentru tablourile dinamice8 dimensiunile acestora se determina abia la e#ecutie. : categorie speciala de tablouri dinamice o repre.inta tablourile &le#ibile8 care se pot redimensiona n timpul e#ecutiei. Incep7nd cu 3ersiunea *.-8 Turbo Pascal permite si declararea tablourilor descMise8 pentru care nu se preci.ea.a domeniul indicilor. )e regula8 aceste tablouri apar ca parametri &ormali ai subprogramelor. ,.1.1. /onceptul de tablou Tablourile se &olosesc pentru a grupa 3ariabile de tipuri identice si a le manipula prin operatii. )aca &iecare 3ariabila ar &i declarata indi3idual8 atunci &iecare operatie ar trebui speci&icata separat8 &apt care ar duce la programe lungi. In tablou ne permite sa grupam 3ariabilele de acelasi tip sub un singur nume si sa putem re&eri &iecare 3ariabila (numita element al tabloului) asociind numelui un indice (care o 3a identi&ica unic). Prin aceasta se reduce considerabil dimensiunea unui program care e&ectuea.a operatii similare asupra mai multor elemente din tablou8 &olosind indicii si instructiunile de ciclare. ,.1.!. )eclararea tablourilor Incep7nd cu Algol(+ si Pascal8 tipul tablou este integrat n sistemul de $+

tipuri al limbajului. Intre altele8 sistemul de tipuri 3eri&ica concordanta tipurilor pentru parametrii &ormali si actuali de tip tablou la apelarea de subprograme8 moti3 pentru care este aproape impusa &olosirea de tipuri tablou cu nume. )e alt&el8 limbajul Pascal nu permite speci&icarea unui parametru &ormal de tip tablou ca tip anonim. In Pascal8 declaratia de tip tablou are sinta#a: TUpe tipYtablou 9 ArraUWtipYinde#X :& tipYelementL unde: 0 ArraU si :& sunt cu3inte re.er3ate 0 tipYelement8 numit tipul componentei8 poate &i orice tip recunoscut de sistemul de tipuri 0 tipYinde# este o lista de tipuri de indiciL numarul elementelor din aceasta lista denota numarul de dimensiuni al tabloului8 care nu este limitat. Tipurile indicilor trebuie sa &ie ordinale (cu e#ceptia lui 6ongint si a subdomeniilor de 6ongint). )aca tipul componentei este tot un tip tablou8 re.ultatul acestei declaratii de tip poate &i tratat &ie ca un tablou de tablouri8 &ie ca un tablou monodimensional. )e e#emplu8 a doua declaratie: tUpe ) 9 !-..$-L tUpe T 9 arraUWbooleanX o& arraUW1..1-X o& arraUW)X o& realL este identica (structural) cu declaratia: tUpe T1 9 arraUWboolean8 1..1-8 )X o& realL iar re&eriri corecte de elemente sunt: 3ar A: TL A1: T1L AW&alseX si A1W&alseX sunt de tip arraUW1..1-X o& arraUW)Xo& realL AW&alse8'X si A1W&alse8'X sunt de tip arraUW)X o& realL AW&alseXW'X si A1W&alseXW'X sunt de tip arraUW)X o& realL AW&alse8'8$-X si A1W&alse8'8$-X sunt de tip realL AW&alseXW'XW$-X si A1W&alseXW'X$-X sunt de tip realL )eclararea de 3ariabile de tip tablou nu trebuie neaparat sa contina numele unui tip de date tablou. /onstructorul de tip se poate include n declaratia de 3ariabila. Ast&el8 4ar 4: ArraUW1..1-X :& IntegerL este o declaratie 3alida de 3ariabila. In aceasta declaratie de 3ariabila8 numele tipului tablou este re&erit cMiar prin constructorul de tip8 adica ArraUW1..1-X :& IntegerL $,

In acest ca. se spune ca &olosim un tip de data anonim8 adica &ara nume (el n0are numele declarat ntr0o declaratie de tip de date). Hu recomandam o asemenea practica8 deoarece sistemul de tipuri al limbajului nu lucrea.a asa cum ne0am astepta noi cu tipurile anonime. )eci sa nu uitam o noua regula: Hu &olositi tipuri de date anonime. Humarul de elemente al unui tablou este dat de produsul numarului de elemente n &iecare dimensiune. ,.1.$. Accesarea tablourilor Accesarea (re&erirea) unui element de tablou se &ace prin preci.area numelui tabloului urmata de o e#presie de indice. "#presia de indice contine8 n parante.e drepte 3alorile e&ecti3e ale indicilor tabloului (ce trebuie8 de obicei8 sa concorde ca numar si tip cu declararea acestuia). "#ista n general doua modalitati de re&erire: punctuala si de subtablouri. Ambele modalitati se ba.ea.a pe calculul de adresa. /alculul de adresa reali.ea.a8 pentru o e#presie de indice data8 determinarea locatiei de memorie (a adresei) ce contine elementul de tabloul re&erit. )eoarece memoria calculatorului poate &i considerata ca tablou monodimensional de locatii adresabile8 problema calculului de adresa se reduce la determinarea8 pe ba.a in&ormatiei asupra indicilor si asupra tabloului n general8 a unui numar ce repre.inta adresa cautata. Pentru &iecare tablou declarat8 se memorea.a n descriptorul de tablou urmatoarele in&ormatii: 0 nume 9 numele tablouluiL 0 tip 9 tipul elementului de tablouL 0 lung 9 lungimea repre.entarii unui element de tablou (n unitati de alocare)L 0 adrs 9 adresa de unde ncepe memorarea tablouluiL 0 nrd 9 numarul de dimensiuni al tablouluiL 0 pentru &iecare dimensiune i8 limitele lii si lsi (1(i(nrd) Se presupune ca tabloului i se aloca locatii consecuti3e de memorie8 deci el ocupa o .ona compacta. 5iecare element de tablou 3a ocupa8 n .ona respecti3a8 o locatie unic determinata. "#ista doua modalitati de memorare a unui tablou: pe linii (c7nd ultimul indice 3aria.a cel mai repede8 engl. ro1 major order)8 si pe coloane (c7nd primul indice 3aria.a cel mai repede8 engl. column major order). Hot7nd cu loc o &unctie ce ntoarce adresa locatiei de memorie a unei re&erinte de tablou8 pentru doua tablouri A(li:ls) si B(li1:ls18li!:ls!)8 calculele de adresa se descriu ast&el: loc(A(i)) 9 adrs > (i 0 li) ; lung SAI loc(A(i)) 9 adrs 0 li ; lung > i ; lung Kemorare pe linii: toate elementele liniilor anterioare liniei i plus primele j01 elemente ale liniei iL loc(B(i8j)) 9 adrs > (i 0 li1) ; (ls! 0 li! >1) ; lung > (j 0 li!) ; lung sau %-

loc(B(i8j)) 9 adrs 0 li1 ; (ls! 0 li! > 1) ; lung 0 li! ; lung > j ; lung > i ; (ls! 0 li! > 1) ; lung Kemorare pe coloane: toate elementele coloanelor anterioare coloanei j plus primele i01 elemente ale coloanei jL loc(B(i8j)) 9 adrs > (j 0 li!) ; (ls1 0 li1 >1) ; lung > (i 0 li1) ; lung sau loc(B(i8j)) 9 adrs 0 li! ; (ls1 0 li1 >1) ; lung 0 li1 ; lung > i ; lung > j ; (ls1 0 li1 > 1) ; lung In e#presiile de mai sus8 ultimele relatii corespund unor calcule optime de adresa8 prin gruparea la nceput a termenilor constanti (termenii ce nu contin indicii i si j ca &actori). Sinta#a e#presiei de indice n Pascal permite &olosirea indicilor de tip enumerare. 5olosind tipul enumerare 6uni8 pe ba.a declaratiilor: TUpe 6uni 9 (Ian8 5eb8 Kar8 Apr8 Kai8 Iun8 Iul8 Aug8 Sep8 :ct8 Ho38 )ec)L 4ar temp : arraUW6uniX o& realL Pcontine temperaturile lunare Q i : luniL /onst #: real 9 -.-L P suma temperaturilor lunare Q instructiunea de ciclare: 5or i :9 Ian To )ec )o # :9 # > tempWiXL care calculea.a n # suma temperaturilor lunare este 3alida. Sa remarcam aici ca declaratia de 3ariabila pentru temp &oloseste un tip anonim. ,.1.%. Tablouri bidimensionale Tablourile bidimensionale (numite si matrici n limbajul curent) au linii si coloane. Am 3a.ut n paragra&ul precedent cum se memorea.a aceste tablouri. )am aici un e#emplu care &oloseste doua modalitati di&erite (si structural ecMi3alente) de declarare a tablourilor bidimensionale. TUpe )omeniu6inii 9 1..!'L )omeniu/oloane 9 1..+-L "lement 9 2ecord /ar: /MarL Atr: BUte "ndL Tab"cran1 9 ArraUW)omeniu6inii8 )omeniu/oloaneX :& "lementL Tab"cran! 9 ArraUW)omeniu6iniiX :& ArraUW)omeniu/oloaneX :& %1

"lementL 4ar "cran/olor1: Tab"cran1 Absolute TB+--:----L "cranKono1: Tab"cran1 Absolute TB---:----L "cran/olor!: Tab"cran! Absolute TB+--:----L "cranKono!: Tab"cran! Absolute TB---:----L Begin "cran/olor1W1!8 $$X./ar :9 JAJL Vrite("cran/olor!W1!XW$$X./ar)L "cranKono!W11XW!'X./ar :9 JBJL Vrite("cranKono1W118!'X./ar)L "nd. Prima modalitate de declarare permite accesarea 0 punctuala: "cran/olor1W1!8 $$X 0 globala: "cran/olor1 A doua modalitate de declarare a tabloului permite accesarea 0 punctuala: "cran/olor!W1!8 $$X sau "cran/olor!W1!XW$$X 0 a unei linii: "cran/olor!W1!X (care 3a &i de tipul ArraUW)omeniu/oloaneX :& "lement) 0 globala: "cran/olor! ,.1.'. Tablouri multidimensionale Au mai mult de doua dimensiuni. 6imbajul Pascal nu impune o regula pri3ind numarul ma#im de dimensiuni al unui tablou. Trebuie a3uta n 3edere doar restrictia ca spatiul alocat unei 3ariabile sa nu depaseasca dimensiunea segmentului de date sau de sti3a. ,.1.(. :peratii globale pe tablori :peratiile de&inite pe tipul tablou sunt atribuirea si testul de egalitate. )e asemenea8 3ariabilele de tip tablou se pot transmite ca parametri n subprograme. ,.1.*. Stringuri Amintim ca n Standard Pascal apare (ntre primele) tipul sir de caractere mpacMetat care este declarat prin: pacZed arraUWli..l&X o& /MarL li ] l&

Pentru compatibilitate cu Standard Pascal8 Turbo Pascal accepta si ast&el de declaratii8 nsa pacZed nu are nici un e&ect. 6a 3remea respecti3a (c7nd a aparut standardul Pascal)8 setul de caractere &olosit era setul AS/II (un caracter repre.entat pe * biti). In String de lungime H caractere (H S 1) este considerat n Pascal standard ca &iind constanta de tipul: %!

pacZed arraUW1..HX o& /MarL 4ariabilele de tipul pacZed arraUW1..HX o& /Mar se numesc 3ariabile string de lungime H. In Turbo Pascal este de&init tipul String8 cu lungime dinamica8 n doua &orme: TUpe String 9 ArraUW-..!''X :& /MarL StringWHX 9 ArraUW-..HX :& /MarL :peratiile si subprogramele de lucru cu 3ariabile String au &ost discutate n cap. ' ("#presii). ,.1.+. Tablouri descMise In Turbo (Borland) Pascal *.- se pot &olosi si tablouri descMise (engl. open arraUs) pe post de parametri &ormali n declaratiile de subprograme. )eclararea unui tablou descMis nu se poate &ace cu sinta#a: TUpe tipYtablou 9 ArraU :& tip0elementL P declaratie incorecta Q ci doar ca tip anonim8 ntre parametrii unei proceduri sau &unctii. Pentru tablourile descMise8 Turbo Pascal are doua &unctii standard8 numite 6o1 si ^igM (parametrul lor este numele tabloului descMis) care ntorc limita in&erioara8 respecti3 limita superioara a tabloului descMis. 5unctia 6o1(A) ntoarce cea mai mica 3aloare a domeniului argumentului A. In ca.ul general8 A poate sa &ie identi&icator de tip sau nume de 3ariabila de tip ordinal8 tablou8 sir de caractere si tablou descMis. 4alorile ntoarse sunt preci.ate n tabelul urmator: 00000000000000000000000000000000000000000000000000000000000000000000000 Tipul lui A /e ntoarce 6o1(A) 00000000000000000000000000000000000000000000000000000000000000000000000 :rdinal cea mai mica 3aloare a domeniului tipului ArraU cea mai mica 3aloare a domeniului indicilor tabloului String :pen arraU parametru String 00000000000000000000000000000000000000000000000000000000000000000000000 5unctia ^igM(A) ntoarce cea mai mare 3aloare a domeniului argumentului A8 care are semantica de la 6o1. 4alorile ntoarse sunt preci.ate n tabelul urmator: 000000000000000000000000000000000000000000000000000000000000000000000000 Tipul lui A /e ntoarce ^igM(A) 000000000000000000000000000000000000000000000000000000000000000000000000 :rdinal cea mai mare 3aloare a domeniului tipului %$

ArraU

cea mai mare 3aloare a domeniului indicilor tabloului String dimensiunea declarata a sirului de caractere :pen arraU numarul de elemente din tablou 0 1 parametru String numarul de caractere din sir 0 1 000000000000000000000000000000000000000000000000000000000000000000000000 "#emplul urmator pre.inta &olosirea tabloului descMis la determinarea elementului minim dintr0un tablou de numere. 5unctia Kin este generala8 ea accept7nd orice tablou de numere reale ca parametru8 tocmai prin &olosirea tabloului descMis. In corpul ei8 determinarea primului si ultimului indice se &ace cu ajutorul &unctiilor 6o1 si ^igM descrise anterior. Program Tab)escL 5unction Kin(3ar A: arraU o& 2eal): 2ealL PA este parametru tablou descMis Q 4ar I: integerL K: realL begin K :9 1-e!-L &or I :9 6o1(A) to ^igM(A) do i& AWIX R K tMen K :9 AWIXL Kin :9 K endL const P constante tablou cu tip Q /A1: arraUW'..!-X o& real 9(18!8$8%8'8(8*8+8,81-81181!81$81%81'81()L /A!: arraUW0'..*X o& real 9(0'80%80$80!8018-818!8$8%8'8(8*)L Begin Vrite6n(Kin(/A1):1-:!)L Vrite6n(Kin(/A!):1-:!)L Vrite6n "nd. P Tab)esc Q Pentru un parametru tablou cu declaratia T : ArraUWli..l&X o& 2eal8 care este argument de apel al &unctiei Kin din e#emplul anterior8 la e#ecutia acesteia parametrul &ormal A 3a &i considerat de tipul: A : arraUW-..nr01X o& 2ealL unde nr este numarul de elemente al tabloului parametru actual8 adica l& 0 li > 1. Prin urmare8 are loc o translatie a domeniului indicilor8 de la li..l& la -..nr018 limitele e&ecti3e (de lucru) ale indicelui &iind ntoarse de &unctiile 6o1 si ^igM: AW-X (adica AW6o1(A)X) corespunde lui TWliX8 AW1X lui TWli>1X8 ... AWnr01X (adica AW^igM(A)X) corespunde lui TWl&X. %%

,.!. Tipul de date multime ,.!.1. )e&initia tipurilor multime ,.!.!. /onstruirea multimilor si atribuirea ,.!.$. /ompararea multimilor si testul de apartenenta ,.!.%. :peratii cu multimi ,.!.1. )e&initia tipurilor multime 6imbajul Pascal este unul din primele limbaje care a introdus tipul multime. 5iind dat un tip ordinal B8 numit tip de ba.a8 tipul multime T se declara &olosind sinta#a: TUpe tipYmultime 9 Set :& tipYdeYba.aL )omeniul tipului tipYmultime T este multimea partilor (submultimilor) domeniului tipului tipYdeYba.a. Ast&el8 daca tipul B are domeniul Pa8 b8 cQ8 atunci domeniul lui T 3a &i PPQ8 PaQ8 PbQ8 PcQ8 Pa8 bQ8 Pa8 cQ8 Pb8 cQ8 Pa8 b8 cQQ. Tipul T se considera structurat deoarece &iecare element al sau contine elemente (posibil nici unul) din domeniul tipului de ba.a B. Implementarea tipului multime se &ace pe siruri de biti. )aca domeniul tipului de ba.a B are n elemente8 atunci domeniul tipului multime T 3a a3ea !=n (! la puterea n) elemente8 deci o 3ariabila de tip T se poate repre.inta pe un sir de n biti. Bitul de pe po.itia i din sirul respecti3 (1]i]n) 3a &i setat pe 1 daca al i0lea element din domeniul lui B (ordinal) apartine multimii si - n ca. contrar. :peratiile tipului multime se implementea.a e&icient prin operatii pe siruri de biti. In ca.ul limbajului Pascal8 n 9 !'(. Kultimile repre.inta un instrument matematic elegant. Pre.enta lor n limbajele de programare mbogateste e#presi3itatea acestuia. )in pacate8 limitarile impuse asupra domeniului tipului de ba.a (numar de elemente si tip) restr7ng utili.area multimilor. In ast&el de situatii8 utili.atorul poate sa0si de&ineasca propriile sale tipuri multime. ,.!.!. /onstruirea multimilor si atribuirea Inainte de a opera cu 3ariabile de tip multime8 ele trebuie construite. 2egulile de construire a 3ariabilelor de tip multime n Pascal sunt urmatoarele: 0 o multime Pascal este &ormata dintr0o lista de elemente separate prin 3irgula si incluse n parante.e drepteL 0 multimea 3ida se marcMea.a prin WXL 0 toate elementele din lista trebuie sa &ie de acelasi tip8 tipul de ba.a al multimii 0 toate elementele sunt di&erite 0 n loc sa se enumere toate elementele dintr0un subdomeniu8 se poate preci.a subdomeniul pe post de element n lista (primul si ultimul element cu .. %'

ntre ele) :rdinea n care se e#ecuta operatiile: 0 declararea tipului multime T 0 declararea 3ariabilei 4 de tipul T 0 construirea (initiali.area) 3ariabilei 4 "#emple: TUpe 6uni 9 (Ian8 5eb8 Kar8 Apr8 Kai8 Iun8 Iul8 Aug8 Sep8 :ct8 Ho38 )ec)L Anotimp 9 Set :& 6uniL /aractere 9 Set :& /MarL 4ar Iarna8 Prima3ara8 4ara8 Toamna: AnotimpL 6itere8 /i&re: /aractereL Begin Iarna :9 W)ec8 Ian8 5eb8 KarXL 4ara :9 WXL Toamna :9 WAug8 Sep8 :ct8 Ho3XL Prima3ara :9 WApr8 Kai8 Iun8 IulXL I& 4ara 9 WX TMen Vrite6n(JAnul asta n0a &ost 3ara[J)L 6itere :9 WJAJ..J\J8 JaJ..J.JXL /i&re :9 WJ-J..J,JX "nd. ,.!.$. /ompararea multimilor si testul de apartenenta Asa cum am discutat n cap. '8 Pascal are cinci operatori relationali care operea.a cu e#presii de tipuri multime ca operan.i si care sunt pre.entati n tabelul urmator. Primii patru dintre ei cer ca ambii operan.i sa &ie tipuri multime compatibile8 iar ultimul are un operand de tipul B si altul de tipul T unde T este Set :& B. 0000000000000000000000000000000000000000000000000000000000000000000000000000 :perator )escriere "#emplu de &olosire 2e.ultat 0000000000000000000000000000000000000000000000000000000000000000000000000000 9 egalitate de multimi WIan8 5ebX 9 W X 5alse RS di&erit WIan8 KarX RS WAprX True R9 inclu.iunea A R9 B WIan8 KarX R9 WIan8 Aug8 KarX True inseamna ca orice element WIan8 KarX R9 W5ebX 5alse din A apartine si lui B S9 include: A S9 B nseamna WIan8 Aug8 KarX S9 WIan8 AprX 5alse ca orice element din B WIan8 KarX S9 WKarX True apartine si lui A in # in A nseamna # Ian in WAug8 5ebX 5alse apartine lui A Kar in WIan8 Aug8 KarX True # trebuie sa &ie din JPJ in WJAJ..J\JX True tipul de ba.a 0000000000000000000000000000000000000000000000000000000000000000000000000000 %(

,.!.%. :peratii cu multimi :peratiile proprii tipului multime sunt cele cunoscute: reuniunea8 intersectia8 di&erenta (operatii binare cu re.ultat multimi)8 inclu.iunea8 testul de egalitate (operatii binare cu re.ultat boolean)8 apartenenta8 atribuirea. "le au &ost discutate n capitolul ' ("#presii). Incep7nd cu 3ersiunea *.-8 Turbo Pascal poseda doua noi proceduri8 Include si "#clude. Procedura Include8 declarata prin procedure Include(3ar S: set o& TL I:T)L are ca e&ect adaugarea elementului I la multimea S8 iar procedura "#clude8 cu aceeasi signatura8 are ca e&ect eliminarea elementului I din multimea S. ,.$. Tipul de date nregistrare ,.$.1. /onceptul de nregistrare ,.$.!. )eclararea tipului nregistrare ,.$.$. Accesarea componentelor. Instructiunea VitM ,.$.%. Structuri comple#e ,.$.'. Inregistrari cu 3ariante ,.$.(. Initiali.area nregistrarilor ,.$.1. /onceptul de nregistrare "lementele de&initorii ale unei nregistrari sunt: 0 numele tipului nregistrare (optional)8 0 numarul de c7mpuri8 0 numele si tipul &iecarui c7mp. Inregistrarea este o modalitate de agregare (punere mpreuna a unor date de tipuri (n general) di&erite. Humele tipului de data nregistrare este un identi&icator. Humarul de c7mpuri este dedus din lista de declarare a c7mpurilor. /7mpurile unei nregistrari se memorea.a n .one adiacente de memorie. In&ormatia de tip a &iecarui c7mp ser3este la stabilirea lungimii de repre.entare a acestuia8 iar numele c7mpului se &oloseste pentru a accesa 3aloarea lui (prin operatia de accesare). )e obicei8 sunt accesibile at7t data compusa (nregistrarea)8 c7t si componentele (c7mpurile) acesteia. "#ista doua clase de nregistrari: cu structura &i#a si cu 3ariante. Inregistrarile cu structura &i#a au o singura de&initie8 iar nregistrarile cu 3ariante au o parte &i#a8 un discriminant si mai multe de&initii de 3ariante. 6ungimea unei nregistrari este suma lungimilor c7mpurilor componente. Se poate &olosi &unctia Si.e:& cu parametru tipul de data nregistrare sau 3ariabila de tip nregistrare. "lementele de discutie pri3itoare la tipul de date nregistrare sunt urmatoarele: 0 maniera de declarare a tipurilor nregistrareL %*

0 maniera de accesare a c7mpurilor unei nregistrariL 0 de&inirea nregistrarilor cu structura 3ariabilaL 0 initiali.area unei 3ariabile nregistrareL 0 operatiile permise pe 3ariabile de tip nregistrare. ,.$.!. )eclararea tipului nregistrare :data cu Pascal si Algol(+8 prin mecanismele de tipi.are se pot declara tipuri de date nregistrare. In Pascal8 de e#emplu8 tipurile de date )ata/ (data calendaristica)8 Timp si "lement"cran se declara ast&el: TUpe )ata/ 9 2ecord .i : 1..$1L lu : 1..1!L an : 1+--..!---L "ndL Timp 9 2ecord ora: -..!$L min: -..',L sec: -..', "ndL "lement 9 2ecord P de&initia unui element pe ecranul te#t Q /ar: /MarL Atr: BUte "ndL Se obser3a ca aceste tipuri de date au componente (c7mpuri) di&erite ca tip de date. :data declarate aceste tipuri8 se pot declara 3ariabile de tipurile respecti3e: 4ar )ataHasterii8 )ata/asatoriei: )ata/L :ra)eIncepere: TimpL "cran: ArraUW1..!'X :& ArraUW1..+-X :& "lement"cranL )oar n momentul declaratiei de 3ariabila se poate stabili dimensiunea de alocare pentru 3ariabilele de tipurile respecti3e. ,.$.$. Accesarea componentelor. Instructiunea VitM 2e&erirea componentelor sau selectarea (accesarea) c7mpurilor unei nregistrari se &ace n Pascal n doua moduri 0 &olosind cali&icarea cu punct 0 &olosind instructiunea VitM /ali&icarea cu punct permite accesarea sau modi&icarea 3alorii unui c7mp dintr0o 3ariabila nregistrare. "a se &ace n &orma: numeY3ariabila.numeYc7mp In Pascal8 daca se accesea.a succesi3 mai multe c7mpuri ale aceleiasi %+

3ariabile de tip nregistrare8 se poate &olosi instructiunea VitM (3e.i ,.$.$ si *.*). 4ariabilele de tip nregistrare se pot accesa si global8 prin numele lor. "ste permisa de asemenea operatia de atribuire8 c7nd 3ariabilele implicate sunt de acelasi tip: 4ar )ata18 )ata!: )ata/L 0000000000000000000000000000000000000000000000 Atribuire globala "cMi3alenta cu 0000000000000000000000000000000000000000000000 )ata1 :9 )ata! )ata1..i :9 )ata!..i )ata1.lu :9 )ata!.lu )ata1.an :9 )ata!.an 0000000000000000000000000000000000000000000000 ,.$.%. Structuri comple#e /7mpurile unei nregistrari pot &i de orice tip recunoscut de sistemul de tipuri8 n particular si tip nregistrare. TUpe )ata/ 9 2ecord .i : 1..$1L lu : 1..1!L an : 1+--..!---L "ndL A%- 9 ArraUW1..%-X :& /MarL TipSe# 9 (masc8&em)L Stare/i3 9 (necas8casat83adu38di3ortat)L Persoana 9 2ecord Hume : StringW$-XL HrId : 6ongintL Adr : A%-L Se# : TipSe#L Stare/ : Stare/i3L )ataH : )atacL inalt : 2eal "ndL Tipurile c7mpurilor sunt prede&inite (String8 6ongInt8 2eal n Turbo Pascal)8 simple utili.ator (TipSe# si Stare/i3)8 respecti3 structurate (A%- si )ata/). Prin urmare8 cu ast&el de notatii de tip se pot declara tipuri oric7t de comple#e. )aca se declara o 3ariabila de tip Persoana: 4ar p : PersoanaL ea 3a putea &i tratata &ie global (atribuire8 test de egalitate)8 &ie selecti3 (p.Inalt 3a semni&ica c7mpul inalt din nregistrarea p). Tabelul urmator %,

pre.inta e#emple de accesare (cu punct si cu VitM). VitM P )o Begin P.Hume :9 JI:H"S/IJL Hume :9 JI:H"S/IJL P.Se# :9 mascL Se# :9 mascL P.Stare/ :9 casatL Stare/ :9 casatL P.Inalt :9 1.+-L Inalt :9 1.+-L P.)ataH..i :9 !$L )ataH..i :9 !$ "nd Alte e#emple de structuri comple#e 0 nregistrari cu c7mpuri tablou 0 tablouri de nregistrari /onst Ka#YPersoane 9 1--L Ka#Y)iscipline 9 !-L TUpe Personal: ArraUW1..Ka#YPersoaneX :& PersoanaL Kedie 9 2ecord P&acem economie: Kedie: 2eal ar ocupa ( bUte Q ParteYInt: BUteL PSi.e:&(Kedie) 9 !Q ParteY\ec: BUte "ndL P Kedie Q Kedii 9 ArraUW1..Ka#Y)isciplineX :& KedieL Trimestru 9 1..$L "le3 9 2ecord Hume: StringW%-XL )ataH: )ata/L Pdeclarat n e#emplul de mai susQ SitScolara: ArraUWTrimestruX :& KediiL "ndL P "le3 Q ,.$.'. Inregistrari cu 3ariante Inregistrarile date ca e#emplu p7na acum au o structura &i#a. : nregistrare cu structura 3ariabila contine di&erite de&initii alternati3e ale unora dintre componentele sale. )e obicei8 o nregistrare cu structura 3ariabila are o parte &i#a8 comuna tuturor alternati3elor sale8 si o parte 3ariabila8 a carei structura trebuie de&inita e#plicit n &iecare alternati3a. Partea 3ariabila este identi&icata prin 3aloarea pe care o poate lua un c7mp special al nregistrarii numit JdiscriminantJ. 4alori distincte ale discriminantului 3or produce alternati3e distincte. Kodul n care se preci.ea.a alternati3ele partii 3ariabile este de obicei de tip case. In Pascal8 sinta#a partii 3ariabile este: Rparte 3ariabila recordS ::9 case Rcamp discriminantS Ridenti&icator de tipS o& R3ariantaS Rcamp discriminantS ::9 WRidenti&icatorS:X R3ariantaS ::9 WRlista eticMete caseS:(Rlista campuriS)X cu preci.area general 3alabila ca partea &i#a a nregistrarii trebuie declarata naintea partii 3ariabile. '-

Inregistrarile cu 3ariante respecta principiul de repre.entare a celor cu structura &i#a. 6ungimea de repre.entare a unei 3ariabile de tip nregistrare cu 3ariante este de obicei lungimea partii &i#e plus ma#imul lungimii 3ariantelor. Partea &i#a contine inclusi3 c7mpul discriminant. Prin urmare8 ntr0o nregistrare cu 3ariante8 primele c7mpuri ale 3ariantelor au aceeasi adresa relati3a la nceputul nregistrarii. )e e#emplu8 n Pascal se poate de&ini o nregistrare cu 3ariante ast&el: TUpe /uloare:cMi 9 (caprui8albastru8negru83erde)L Se# 9 (Kasc85em)L Persoana 9 record Hume : stringW$-XL HrId : longintL Adr : arraUW1..%-X o& cMarL /ase s:Se# o& P discriminant Q Kasc : (Inalt: 2ealL )ataH: )ata/)L 5em : (/:: /uloare:cMiL Bust:2eal) "ndL Partea &i#a a nregistrarii Persoana contine c7mpurile Hume8 HrId8 Adr si S8 iar pentru partea 3ariabila e#ista doua alternati3e. )aca 3aloarea discriminantului S este Kasc8 atunci 3or putea &i accesate c7mpurile Inalt si )ataH8 iar daca S are 3aloarea 5em c7mpurile 3alide sunt /: si Bust. In alt e#emplu: TUpe ambele 9 (bU8cM)L bc 9 record case t:ambele o& bU : (b:bUte)L cM : (c:cMar)L endL 3ar a18 a!8 a$ : bcL Prin urmare 3ariabilele a18 a!8 a$ 3or contine &ie c7mpuri de tip bUte8 &ie c7mpuri de tip caracter. Sunt permise urmatoarele instructiuni: a1.t :9 cML Pdiscriminantul cM: accesibil a1.c Q a1.c :9 JaJL a1.t :9 bUL Pdiscriminantul bU: accesibil a1.b Q 1riteln(a1.c)L P care nu este initiali.at Q Accesarea 3ariantei a1.c cu 3aloarea discriminantului a1.t9bU repre.inta o utili.are inconsistenta a 3ariabilei a1. Acest lucru nu ar trebui sa &ie permis8 deoarece c7mpul discriminant si pierde ast&el _puterea de deci.ie_ n ceea ce pri3este 3arianta aleasa8 rolul sau de3enind practic n acest ca. unul pur decorati3. 5olosirea sistemului de tipuri pentru a reali.a 3eri&icarile de consistenta '1

necesare nu este posibila n ca.ul tipi.arii statice8 speci&ica limbajului Pascal. ,.$.(. Initiali.area nregistrarilor Inregistrarile se pot initiali.a &olosind constante cu tip. )eclararea unei constante de tip nregistrare speci&ica numele (identi&icatorul) si 3aloarea asociata pentru &iecare c7mp. /7mpurile trebuie speci&icate n ordinea declararii lor n tipul nregistrare.. Hu se pot initiali.a nregistrari ale caror tipuri contin c7mpuri de tip &ile. tUpe Punct 9 record <8 `: 2ealL endL 4ector 9 arraUW-..1X o& PunctL 6una 9 (Ian85eb8Kar8Apr8Kai8Iun8Iul8Aug8Sep8:ct8Ho38)ec)L )ata/ 9 2ecord .i : 1..$1L lu : 6unaL an : 1+--..!---L "ndL const :rigine: Punct 9 (<: -.-L `: -.-)L 6inie: 4ector 9 ((<: 0$.1L `: 1.')8 (<: '.+L `: $.-))L \iuaKea: )ata/ 9 (.i: !L lu: )ecL an: 1,(-)L ,.%. Tipul de date &isier ,.%.1. Hotiunea de &isier ,.%.!. :peratii asupra &isierelor ,.%.$. 5isiere te#t ,.%.%. 5isiere record ,.%.'. 5isiere &ara tip (stream) ,.%.(. 5isierele sistem ,.%.1. Hotiunea de &isier Programele reali.ate p7na acum au &olosit date de intrare &urni.ate de la tastatura si au pre.entat re.ultatele pe ecran. In ca.ul mai general8 un program P 3a prelua date dintr0un &isier de intrare si 3a &urni.a re.ultate ntr0un &isier de iesire. Spunem n acest ca. ca P e&ectuea.a operatii de intrare/iesire (I/"). Implicit8 un program Pascal considera ca preia datele de intrare de la &isierul standard de intrare al sistemului de operare si ca scrie re.ultatele n &isierul standard de iesire al sistemului. I.ual8 &isierul standard de intrare este tastatura sau un dispo.iti3 special de introducere de date8 pe c7nd &isierul standard de iesire este ecranul terminalului sau imprimanta. In ,.%.(. 3om discuta despre aceste &isiere sistem. '!

5isierul este o colectie de in&ormatii. Aceste in&ormatii se pot structura n Pascal sub &orma de te#t8 sub &orma de date atomice (de tipuri simple8 prede&inite) sau sub &orma de nregistrari (record). Turbo Pascal poseda si &isiere cu structura nede&inita8 numite &isiere &ara tip. 5isierul se poate considera din doua puncte de 3edere 0 &i.ic sau e#tern programului (respect7nd con3entiile sistemului de operare): speci&icator de &isier 0 logic sau intern programului care0l &oloseste: identi&icator logic de &isier. )in punct de 3edere &i.ic8 un &isier este identi&icat de 0 peri&ericul pe care este memorat 0 directorul (calea) n care se a&la 0 numele sau (nume.tip) iar din punct de 3edere logic8 un &isier este manipulat ntr0un program printr0o 3ariabila de tip &isier. In Pascal tipul &isierului se construieste speci&ic. ,.%.!. :peratii asupra &isierelor 5isierele sunt &olosite pentru a pastra (memora) in&ormatie pe suport e#tern. Aceste in&ormatii au un caracter persistent8 adica ele e#ista si dupa ce programul care le0a creat si termina e#ecutia. Spre e#emplu8 programele sursa Borland (Turbo) Pascal se gasesc n &isiere te#t8 care sunt create cu ajutorul unui editor de te#te. :data introdus te#tul sursa8 acesta poate &i modi&icat dupa dorinta programatorului8 &olosind un editor similar. :peratiile e&ectuate asupra &isierelor ntr0un program Pascal sunt: 0 declararea 0 descMiderea 0 ncMiderea 0 po.itionarea 0 citirea 0 scrierea :rdinea n care aceste operatii se e&ectuea.a este de obicei urmatoarea: 0 declararea &isierului 0 descMiderea &isierului8 care nseamna si o po.itionare implicita 0 citirea sau scrierea de in&ormatie din/n &isier8 precedate sau nu de operatii de po.itionare 0 ncMiderea &isierului 5isierele ser3esc la trans&erul de in&ormatie dintre memoria interna si suportul e#tern (peri&erice). :peratiile de trans&er sunt citirea (trans&erul de in&ormatie din &isier n memoria interna) si scrierea (trans&erul de in&ormatie din memoria interna n &isier). :peratiile de po.itionare sunt necesare pentru a preci.a locul de unde se citeste in&ormatia (n ca.ul citirii)8 respecti3 locul de unde ncepe scrierea de in&ormatie pe &isier (in ca.ul scrierii). 5iecare &isier non0te#t descMis are asociate o .ona de memorie8 numita bu&&er8 care ser3este ca intermediar ntre memoria interna si &isier8 contin7nd in&ormatia supusa trans&erului. Toate &isierele au asociat un ntreg numit contor de po.itie8 '$

care speci&ica po.itia curenta din &isier de la care ncepe trans&erul. "#cept7nd declararea8 necesara datorita caracterului puternic tipi.at al limbajului8 toate celelalte operatii enumerate se traduc n operatii &i.ice de accesare a suportului pe care se gaseste &isierul8 &iind numite generic operatii de intrare0iesire. Aceste operatii pot sa pro3oace mari batai de cap programatorilor8 moti3 pentru care mediile Turbo si Borland Pascal le pun la dispo.itie o modalitate de 3eri&icare a modului de terminare a lor8 cu ajutorul &unctiei standard I:2esult8 care ntoarce starea ultimei operatii de intrare0iesire e&ectuate. )eclaratia acestei &unctii este urmatoarea: &unction I:2esult: IntegerL si ea ntoarce: 0 - daca ultima operatie de intrare/iesire s0a terminat cu succes 0 o 3aloare di&erita de - (de obicei un cod al erorii produse) daca ultima operatie de intrare0iesire a esuat. Pentru ca programatorul sa poata &olosi aceasta &unctie8 trebuie sa se comute indicatorul TI de 3eri&icare a operatiilor de intrare0iesire pe o&&. Acest lucru se poate &ace &ie inclu.7nd n cod directi3a de compilare PTI0Q8 &ie &olosind meniul :ptionsa/ompileraI/: /MecZing. I.ual8 comutatorul TI este setat pe on8 adica PTI0Q. ,.%.!.1. )eclararea &isierelor 6a ni3elul programului sursa Pascal8 un &isier este re&erit printr0o 3ariabila &isier8 ceea ce am numit anterior identi&icator logic de &isier. )eoarece Pascal este un limbaj puternic tipi.at8 identi&icatorul logic de &isier trebuie sa &ie de una dintre urmatoarele tipuri: 0 te#t (pentru &isiere te#t) 0 &ile o& tipYcomponenta (&isierul este un &isier record n care &iecare nregistrare este de tipul tipYcomponenta) ; &ile (&isierul este nede&init8 &iind considerat ca o succesiune de octeti 0 stream) )eclararea 3ariabilelor &isier se &ace u.ual8 &olosind cu37ntul re.er3at 3ar. 4ariabilele &isier nu se pot &olosi dec7t n operatiile speci&ice lucrului cu &isiere. Kai e#act8 o 3ariabila &isier se initiali.ea.a prin operatia de descMidere a &isierului si si pierde 3aloarea la ncMiderea acestuia. 3ar &isYte#t: Te#tL P &isier te#t Q &isYintregi 9 5ile o& IntegerL P &isier de intregi Q &isYnede&init: 5ileL P &isier nede&init Q ,.%.!.!. )escMiderea unui &isier :peratia de descMidere a unui &isier este prima operatie care se e&ectuea.a '%

asupra acestuia8 naintea prelucrarilor propriu0.ise la care acesta este supus. Kenirea acestei operatii este de a stabili 0 modul n care este &olosit &isierul (citire sau scriere) 0 alocarea bu&&er0ului si initiali.area contorului de po.itie. In Turbo si Borland Pascal8 operatia de descMidere a unui &isier se reali.ea.a n doi pasi: 0 initiali.area 3ariabilei &isierL 0 descMiderea propriu0.isa a &isierului. Initiali.area 3ariabilei &isier se &ace cu procedura standard Assign8 care are declaratia: procedure Assign(3ar 3arY&isL numeY&is:String)L unde: 0 3arY&is este o 3ariabila &isier de oricare tip (identi&icatorul logic de &isier)8 iar 0 numeY&is este un sir de caractere ce desemnea.a numele e#tern al &isierului (speci&icatorul de &isier) )upa e#ecutia procedurii8 3arY&is 3a &i initiali.ata8 &iind asociata &isierului e#tern numeY&isL cu alte cu3inte8 orice operatie pe 3arY&is 3a nsemna de &apt lucrul cu &isierul numeY&is. Asocierea ram7ne 3alabila p7na c7nd se ncMide &isierul re&erit de 3arY&is sau p7na c7nd 3arY&is apare ntr0o alta procedura Assign. )aca numeY&is este sirul de caractere 3id8 3arY&is 3a &i asociata unuia dintre &isierele sistem. )aca numeY&is este numele unui &isier deja descMis8 se produce o eroare de e#ecutie. )escMiderea propriu0.isa a unui &isier se &ace n mod obisnuit prin apelul uneia dintre procedurile standard 2eset sau 2e1rite. Procedura standard 2eset reali.ea.a descMiderea unui &isier (de obicei) n citire. )eclaratia sa este: procedure 2eset(3ar 3arY&is)L unde 3arY&is este o 3ariabila &isier de oricare tip (identi&icatorul logic de &isier)8 asociat n prealabil unui &isier e#tern prin apelul procedurii Assign. 2eset descMide &isierul e#tern asociat 3ariabilei 3arY&is. )aca &isierul respecti3 este deja descMis8 el se ncMide n prealabil si apoi are loc descMiderea. /ontorul de po.itie al &isierului se setea.a pe nceputul &isierului. 2eset produce o eroare de intrare0iesire daca &isierul e#tern nu e#ista. In ca.ul &isierelor te#t8 2eset produce descMiderea acestora numai n citire. Pentru &isierele non0te#t8 Init0ul SUstem contine 3ariabila 5ileKode8 care contine in&ormatia pri3itoare la modul de descMidere a acestora prin 2eset: ''

0 - 0 2ead onlU (numai citire) 0 1 0 Vrite onlU (numai scriere) 0 ! 0 2ead/Vrite (3aloare implicita). Aceasta 3ariabila se poate seta de catre programator prin operatia de atribuire. 5unctia "#ista din programul /itireT (,.%.!.$) 3eri&ica daca &isierul speci&icat prin parametrul Hume5isier (care repre.inta un speci&icator complet de &isier) e#ista pe peri&ericul speci&icat n el. )aca peri&ericul si calea lipsesc8 atunci se considera ca &isierul este n directorul curent. Procedura standard 2e1rite reali.ea.a descMiderea unui &isier n scriere. )eclaratia sa este: procedure 2e1rite(3ar 3arY&is)L unde 3arY&is este o 3ariabila &isier de oricare tip (identi&icatorul logic de &isier)8 asociat n prealabil unui &isier e#tern prin apelul procedurii Assign. 2e1rite creea.a &isierul e#tern asociat 3ariabilei 3arY&is. )aca &isierul respecti3 e#ista8 atunci el se sterge si se creea.a un &isier 3id. )aca el este deja descMis8 atunci se ncMide n prealabil si apoi este re0creat. /ontorul de po.itie al &isierului se setea.a pe nceputul &isierului. In ca.ul &isierelor te#t8 2e1rite produce descMiderea acestora numai n scriere. ,.%.!.$. IncMiderea unui &isier :peratia de ncMidere a unui &isier semni&ica terminarea lucrului cu acesta. Prin ncMidere se reali.ea.a urmatoarele: 0 trans&erarea in&ormatiei din bu&&er pe suport (n ca.ul &isierelor descMise n scriere) 0 distrugerea asocierii ntre 3ariabila &isier si numele e#tern al &isierului. )upa ncMidere8 &isierul se poate &olosi din nou8 respect7nd etapele descrise anterior. 4ariabila &isier de3ine disponibila8 ea put7nd &i &olosita ntr0un alt apel al procedurii Assign. Pentru un &isier descMis n citire8 prelucrarea sa se termina de regula atunci c7nd s0a ajuns la s&7rsitul sau. )etectarea s&7rsitului de &isier se &ace cu &unctia standard ":5. )eclaratia acesteia este: &unction "o&(3ar 3arY&is): BooleanL P &isiere non0te#t Q &unction "o& W (3ar 3arY&is: Te#t) X: BooleanL P &isiere te#t Q In ca.ul &isierelor te#t8 daca 3arY&is lipseste se considera ca ":5 se re&era la &isierul standard de intrare. Alt&el8 3arY&is 3a re&eri un &isier descMis n prealabil prin Assign si 2eset/2e1rite. ":5 ntoarce: 0 True daca contorul de po.itie este dupa ultimul octet din &isier sau daca &isierul este 3id '(

0 5alse n toate celelalte ca.uri. "#emplu: citirea unui &isier te#t si a&isarea acestuia pe ecranL Program /itireTL 3ar &: te#tL linie: stringL nume5is: StringL este: BooleanL &unction "#ista(Hume5isier: String): BooleanL P intoarce True daca &isierul e#tern repre.entat de Hume5isier e#ista 5alse alt&el Q 3ar &: 5ileL begin PTI0Q P comuta pe o&& indicatorul TI Q Assign(&8 Hume5isier)L 5ileKode :9 -L P descMide in citire Q 2eset(&)L /lose(&)L PTI>Q "#ista :9 (I:2esult 9 -) and (Hume5isier RS JJ) endL P "#ista Q begin Vrite6n(J/itireT 0 a&isarea unui &isier te#t pe ecranJ)L 2epeat Vrite(J)ati numele &isierului: J)L 2ead6n(nume5is)L este :9 "#ista(nume5is)L i& not este tMen Vrite6n(J5isier ine#istent[J)L Intil esteL Assign(&8 nume5is)L P asocia.a & la nume5is Q 2eset(&)L P descMide & in citire Q VMile not "o&(&) do begin P cat timp nu s0a ajuns la s&arsit Q 2eadln(&8 linie)L P citeste o linie din &isier Q Vriteln(linie) P scrie linia la iesirea standard Q endL /lose(&)L P incMide &isierul Q end. P /itireT Q ,.%.!.%. Po.itionarea :peratia de po.itionare se re&era la &isierele non0te#t si are ca e&ect modi&icarea contorului de po.itie. Kodi&icarea se &ace n doua moduri: 0 implicit8 prin operatiile de citire si de scriereL orice operatie de trans&er modi&ica contorul de po.itie8 acesta a3ans7nd spre capatul &isierului 0 e#plicit8 prin procedura standard SeeZ. '*

Kediile Borland pun la dispo.itia programatorului o &unctie si o procedura care i permit acestuia sa accese.e si sa modi&ice contorul de po.itie: 5ilePos si SeeZ. )e asemenea8 &unctia 5ileSi.e determina dimensiunea unui &isier. 5unctia 5ileSi.e ntoarce numarul de componente dintr0un &isier. )eclaratia sa este urmatoarea: &unction 5ileSi.e(3ar 3arY&is): 6ongintL n care 3arY&is este o 3ariabila &isier8 asociata unui &isier descMis n prealabil. 5ileSi.e ntoarce numarul de componente al &isierului. )aca &isierul este 3id8 5ileSi.e ntoarce -. 4om discuta n paragra&ele urmatoare semantica e#acta a lui 5ileSi.e pentru &iecare clasa de &isiere. 5unctia 5ilePos ntoarce 3aloarea contorului de po.itie al unui &isier non0te#t. )eclaratia sa este: &unction 5ilePos(3ar 3arY&is): 6ongintL n care 3arY&is este o 3ariabila &isier8 asociata unui &isier descMis n prealabil. )aca contorul de po.itie este pe nceputul &isierului8 5ilePos 3a ntoarce -8 iar daca contorul de po.itie este la s&7rsitul &isierului8 atunci 5ilePos(3arY&is) 3a &i egal cu 5ileSi.e(3arY&is). /ontorul de po.itie al unui &isier non0te#t se e#prima n unitati de masura proprii tipului de &isier. "l semni&ica nregistrarea curenta din &isier8 lu7nd 3alori de la - (nceputul &isierului8 prima nregistrare din el) la 5ileSi.e(3arY&is) 0 1 (ultima nregistrare din &isier). Procedura standard SeeZ reali.ea.a modi&icarea contorului de po.itie la o noua 3aloare8 speci&icata ca parametru al acesteia. )eclaratia sa este: procedure SeeZ(3ar 3arY&isL po.itie: 6ongint)L n care: 0 3arY&is este o 3ariabila &isier8 asociata unui &isier descMis n prealabil 0 po.itie este un ntreg8 cu urmatoarele 3alori 3alide: 0 ntre - si 5ileSi.e(3arY&is) 0 1: contorul de po.itie al &isierului 3arY&is se 3a seta la 3aloarea po.itie 0 5ileSi.e(3arY&is): n &isierul 3arY&is se 3a adauga (la s&7rsit) o noua nregistrare "#ista8 de asemenea8 procedura Truncate8 care permite truncMierea unui &isier non0te#t. )eclaratia sa este: procedure Truncate(3ar 3arY&is)L n care 3arY&is este o 3ariabila &isier8 asociata unui &isier descMis n prealabil. Truncate pastrea.a n &isier numai nregistrarile de la - si p7na la 5ilePos(3arY&is) 0 18 elimin7nd celelalte nregistrari din el (daca e#ista) si set7nd ":5(3arY&is) pe True. '+

,.%.!.'. /itirea :peratia de citire nseamna trans&erarea de in&ormatie din &isierul e#tern n memoria interna a calculatorului. Kai e#act8 citirea reali.ea.a initiali.area unor 3ariabile din programul Pascal cu 3alori preluate din &isierul e#tern. /itirea se &ace di&erit pentru &iecare clasa de &isiere Borland (Turbo) Pascal. "a poate sau nu sa &ie nsotita de con3ersii. ,.%.!.(. Scrierea :peratia de scriere nseamna trans&erarea de in&ormatie din memoria interna a calculatorului n &isierul e#tern. Kai e#act8 scrierea reali.ea.a memorarea 3alorilor unor 3ariabile din programul Pascal n &isierul e#tern. Scrierea se &ace di&erit pentru &iecare clasa de &isiere Borland (Turbo) Pascal. "a poate sau nu sa &ie nsotita de con3ersii. ,.%.$. 5isiere te#t 5isierele te#t sunt &isiere speciale8 care se pot citi sau edita de orice editor de te#te standard. In &isier te#t este o succesiune de caractere AS/II organi.ate n linii. Humarul de linii este 3ariabil8 iar &iecare linie contine un numar 3ariabil de caractere. : linie se termina cu o combinatie speciala de caractere (de regula /2>658 adica AS/II 1- > AS/II 1$)8 iar s&7rsitul de &isier poate &i determinat cu ajutorul &unctiei ":5. Aceasta poate &olosi: 0 &unctia 5ileSi.e (care determina numarul de caractere din &isier) 0 un caracter special de s&7rsit de &isier (cu codul AS/II !(8 recunoscut prin combinatia /T26>\ de la tastatura). Hu este obligatoriu8 cel putin n Turbo Pascal8 ca un &isier te#t sa contina terminatorul de s&7rsit de &isier. Kediile Borland si Turbo Pascal permit speci&icarea unui &isier te#t prin cu37ntul cMeie te#t8 care are declaratia: tUpe te#t 9 &ile o& cMarL In Borland si Turbo Pascal sunt disponibile urmatoarele &unctii si proceduri speci&ice lucrului cu &isierele te#t: 0 Append (procedura) 0 ":6H (&unctie) 0 5lusM (procedura) 0 2ead (procedura) 0 2ead6n (procedura) 0 SeeZ":5 (&unctie) 0 SeeZ":6H (&unctie) 0 SetT"#tBu& (procedura) 0 Vrite (procedura) 0 Vrite6n (procedura) ',

In cele ce urmea.a8 cu e#ceptia locurilor unde se &ace o re&erire e#plicita8 prin 3arY&is 3om desemna o 3ariabila &isier de tip te#t8 descMis n prealabil. Procedura Append este speci&ica &isierelor te#t. "a permite descMiderea unui &isier n adaugare8 adica: 0 descMide &isierul n scriere 0 setea.a contorul de po.itie la s&7rsitul &isierului. )eclaratia sa este: procedure Append(3ar 3arY&is: Te#t)L unde 3arY&is este o 3ariabila &isier de tip te#t8 asociata n prealabil printr0o procedura Assign unui &isier e#tern e#istent. )aca &isierul e#tern nu e#ista8 se produce o eroare de intrare0iesire. )aca 3arY&is desemnea.a un &isier deja descMis8 acesta se ncMide n prealabil si apoi se e#ecuta operatiile speci&ice lui Append. )aca terminatorul de s&7rsit de &isier /T26>\ este pre.ent8 contorul de po.itie se setea.a pe po.itia acestuia. Prin urmare8 dupa &iecare scriere n &isier acesta 3a contine la s&7rsitul sau terminatorul de &isier. 5unctia ":6H ntoarce statutul de s&7rsit de linie8 adica ":6H 0 ntoarce True daca : 0 caracterul curent din &isier (speci&icat prin contorul de po.itie) este un terminator de linie sau de &isier 0 ntre caracterul curent si s&7rsitul de linie nu e#ista dec7t spatii 0 ntoarce 5alse alt&el. )eclaratia aceste &unctii este: &unction ":6H W(3ar 3arY&is: Te#t) X: BooleanL )aca 3arY&is lipseste8 se considera ca ":6H se re&era la &isierul standard de intrare. Procedura 5lusM reali.ea.a trans&erul &i.ic de in&ormatie din bu&&erul unui &isier descMis n scriere (cu 2e1rite sau Append) pe suport. )eclaratia sa este: procedure 5lusM(3ar 3arY&is: Te#t)L Scrierea pe un &isier te#t se reali.ea.a prin intermediul unui bu&&er. In mod normal8 scrierea &i.ica se e&ectuea.a numai atunci c7nd bu&&erul este plin. Apel7nd 5lusM8 ne asiguram ca se e&ectuea.a scrierea si c7nd bu&&erul nu este plin. Procedura standard 2ead citeste 3alori dintr0un &isier te#t ntr0una sau mai multe 3ariabile. /itirea se e&ectuea.a ncep7nd de la contorul de po.itie8 a3ans7ndu0se spre s&7rsitul &isierului. Se pot e&ectua con3ersii8 n &unctie de tipul 3ariabilelor pre.ente ca parametri ai lui 2ead. )eclaratia procedurii este: (-

procedure 2ead( W 3ar 3arY&is: Te#tL X 41 W8 4!8...84n X )L unde 418 4!8 ...8 4n sunt 3ariabile pentru care 2ead este n domeniul lor de 3i.ibilitate. /itirea se opreste la s&7rsitul de linie sau de &isier8 &ara a se citi si aceste caractere speciale. Procedura standard 2ead6n este similara procedurii 2ead8 cu e#ceptia &aptului ca dupa terminarea citirii trece la linia urmatoare: la nt7lnirea caracterelor de s&7rsit de linie le sare8 set7nd contorul de po.itie dupa ele. )eclaratia procedurii este: procedure 2ead6n( W 3ar 3arY&is: Te#tL X 41 W8 4!8...84n X )L )upa e#ecutarea lui 2ead6n8 contorul de po.itie 3a &i setat pe nceputul unei noi linii. 5unctia SeeZ":5 ntoarce True daca s0a ajuns la s&7rsitul de &isier si 5alse alt&el. )eclaratia sa este: &unction SeeZ":5 W (3ar 3arY&is: Te#t) X: BooleanL 5unctia SeeZ":6H ntoarce True daca s0a ajuns la s&7rsit de linie si 5alse alt&el. )eclaratia sa este: &unction SeeZ":6H W (3ar 3arY&is: Te#t) X: BooleanL Procedura SetTe#tBu& atribuie unui &isier te#t un bu&&er de intrare0iesire. I.ual8 bu&&erul de I/" pentru &isierele te#t este de 1!+ de octeti. /u c7t bu&&erul este mai mare8 cu at7t operatiile de citire si de scriere se e#ecuta mai rapid si printr0un numar mai mic de accese la suportul &i.ic. )eclaratia este urmatoarea: procedure SetTe#tBu&(3ar 3arY&is: Te#tL 3ar Bu& W L 6ung: Vord X )L unde: 0 Bu& este numele unei 3ariabile (de obicei de tipul unui tablou de caractere) care 3a &i &olosita pe post de bu&&er 0 6ung este dimensiunea bu&&erului (n octeti) SetTe#tBu& trebuie apelata imediat dupa descMiderea &isierului (urmatoarea instructiune dupa 2eset8 2e1rite sau Append). Procedura Vrite scrie 3aloarea uneia sau mai multor 3ariabile ntr0un &isier te#t. Scrierea se e&ectuea.a ncep7nd de la contorul de po.itie8 a3ans7ndu0se spre s&7rsitul &isierului. Se pot e&ectua con3ersii8 n &unctie de tipul 3ariabilelor pre.ente ca parametri ai lui Vrite. )eclaratia procedurii este: procedure Vrite( W 3ar 3arY&is: Te#tL X P1 W8 P!8...8Pn X )L unde P18 P!8 ...8 Pn sunt e#presii de &ormatare8 &ormate din nume de 3ariabile sau e#presii (de una din tipurile /Mar8 Integer8 2eal8 String si (1

Boolean) ce contin 3ariabile mpreuna cu speci&icatori de lungime si de numar de .ecimale. Pentru tipurile numerice8 se &ace con3ersia la string nainte de scrierea n &isier. 5isierul trebuie sa &ie descMis cu 2e1rite sau Append. /ontorul de po.itie se 3a mari cu lungimea stringurilor scrise. : e#presie de &ormatare P are &ormatul: 4:lW:.X8 unde 0 3 este o 3ariabila de tip numeric 0 l este lungimea stringului generat (daca partea ntreaga a lui 3 are lungimea mai mare ca l8 atunci l se 3a seta la lungimea partii ntregi a lui 3 0 lu7nd n considerare si semnul) 0 . este numarul de ci&re la partea .ecimala (numai pentru 3ariabile reale). Procedura Vrite6n este similara cu Vrite8 scriind la s&7rsit un terminator de linie. )eclaratia procedurii este: procedure Vrite6n( W 3ar 3arY&is: Te#tL X P1 W8 P!8...8Pn X )L iar semantica ei este: Vrite( 3ar 3arY&is8 P1 W8 P!8...8Pn X )L Vrite( 3ar 3arY&is8 /Mr(1$)8 /Mr(1-) )L P terminator de linie Q Procedurile 2ead6n si Vrite6n sunt speci&ice &isierelor te#t8 pe c7nd procedurile 2ead si Vrite se &olosesc si n ca.ul &isierelor cu tip. ,.%.%. 5isiere cu tip 5isierele cu tip (pe care le numim si &isiere record) sunt accesate prin intermediul unei 3ariabile &isier declarata ast&el: 3ar 3arY&is: &ile o& tipYcomponentaL sau8 mai elegant: tUpe tipYcomponenta 9 ... P de&initia tipului componentei Q tipY&isier 9 &ile o& tipYcomponentaL 3ar 3arY&is: tipY&isierL 5isierele cu tip respecta de&initia generala a &isierului8 preci.ata la nceputul acestei sectiuni: ele contin componente de acelasi tip8 notat mai sus prin tipYcomponenta. Tipul componentei poate &i orice tip recunoscut de sistemul de tipuri al limbajului8 cu e#ceptia tipului &ile. Spre e#emplu8 urmatoarele tipuri de &isiere sunt tipuri 3alide: tUpe &isierYinteger 9 &ile o& IntegerL &isierYboolean 9 &ile o& BooleanL &isierYpersoane 9 &ile o& PersoanaL P tipul Persoana din ,.$.%. Q (!

,.%.%.1. Bu&&erul &isierului :peratiile e&ectuate asupra &isierelor cu tip sunt cele discutate general n ,.%.!. Trans&erul de date ntre suportul e#tern (&isierul e#tern) si memorie (3ariabilele din program) se reali.ea.a prin intermediul unei .one pe care am numit0o bu&&er (denumirea rom7neasca de pe 3remuri era .ona tampon). Pentru un &isier declarat n &orma: 3ar 3arY&is: tipY&isierL bu&&erul este o .ona de memorie speciala8 &ara nume8 care o 3om nota n cele ce urmea.a cu 3arY&is=. Initiali.area 3ariabilei &isier 3arY&is se &ace prin apelul procedurii standard AssignL descMiderea &isierului se &ace &olosind procedurile standard 2eset (n citire sau n scriere si citire) si 2e1rite (n scriere). :data cu descMiderea8 de3ine accesibil si bu&&erul &isierului8 adica 3ariabila 3arY&is=. Bu&&erul trebuie considerat ca .ona de memorie n care se citesc in&ormatiile din &isierul e#tern8 nainte ca acestea sa &ie atribuite 3ariabilelor din programL similar8 n bu&&er sunt depo.itate in&ormatiile care se doreste a &i scrise n &isierul e#tern8 nainte ca scrierea sa aiba loc. 2atiunea de a &i a bu&&erului este aceea de a optimi.a (n general de a micsora) numarul de accese la suportul e#tern8 pe care se gaseste &isierul supus prelucrarii. )e obicei8 operatiile &i.ice de citire si scriere pe suport e#tern reali.ea.a trans&erul unei cantitati &i#e de in&ormatie8 numita bloc. )imensiunea blocului depinde de caracteristicile &i.ice ale suportului si peri&ericului pe care se memorea.a &isierul. )in punct de 3edere logic8 adica al &isierului prelucrat n programul Pascal8 o citire sau scriere logica reali.ea.a trans&erarea unei cantitati de in&ormatie egala cu dimensiunea unei componente a &isierului8 adica Si.e:&(tipYcomponenta). )e regula8 dimensiunea bu&&erului este un multiplu al dimensiunii bloc ,.%.%.!. /itirea prin intermediul bu&&erului Pentru a simpli&ica lucrurile8 consideram ca dimensiunile blocului8 bu&&erului si componentei sunt egale. 5olosind declaratia: tUpe tipYcomponenta 9 IntegerL tipY&isier 9 &ile o& tipYcomponentaL 3ar 3arY&is: tipY&isierL componenta: tipYcomponentaL 3om descMide acum n citire &isierul T"ST.)AT si 3om putea accesa deja prima componenta a lui: Begin Assign(3arY&is8 JT"ST.)ATJ)L ($

2eset(3arY&is)L componenta :9 3arY&is= "nd. )escMiderea pro3oaca si setarea contorului de po.itie pe prima nregistrare. Pentru a trece la urmatoarea componenta (adica pentru a aduce n bu&&er urmatoarea componenta) se &oloseste o procedura speciala8 numita get. Semantica acesteia este: 0 aducerea n bu&&er a urmatoarei componente din &isier 0 marirea cu 1 a contorului de po.itie. Prin urmare8 daca dorim o prelucrare completa a &isierului (de e#emplu a&isarea &iecarei componente pe ecran)8 atunci programul de mai sus s0ar scrie ast&el: Begin Assign(3arY&is8 JT"ST.)ATJ)L 2eset(3arY&is)L VMile not "o&(3arY&is) do begin componenta :9 3arY&is=L get(3arY&is)L Vrite6n(componenta) endL /lose(3arY&is) end. Am 3a.ut nsa ca n Pascal e#ista procedura standard 2ead pentru citirea din &isier. )e &apt8 semantica e#acta a procedurii 2ead este data n tabelul urmator: 0000000000000000000000000000000000000000000000000000000 Procedura standard "ste ecMi3alenta cu 0000000000000000000000000000000000000000000000000000000 2ead(3arY&is8 componenta) componenta :9 3arY&is=L get(3arY&is)L 0000000000000000000000000000000000000000000000000000000 Procedura get detectea.a s&7rsitul de &isier: c7nd nu mai e#ista o urmatoare nregistrare de citit8 ea nu 3a ntoarce nimic8 iar &unctia "o&(3arY&is) 3a ntoarce True8 deci citirea &isierului se termina. 5olosind procedura standard 2ead8 programul de mai sus se scrie ast&el: Begin Assign(3arY&is8 JT"ST.)ATJ)L 2eset(3arY&is)L VMile not "o&(3arY&is) do begin 2ead(3arY&is8 componenta)L Vrite6n(componenta) endL /lose(3arY&is) (%

end. ,.%.%.$. Scrierea n &isier 5olosind aceleasi declaratii: tUpe tipYcomponenta 9 IntegerL tipY&isier 9 &ile o& tipYcomponentaL 3ar 3arY&is: tipY&isierL componenta: tipYcomponentaL i: IntegerL 3om descMide acum n scriere &isierul T"ST.)AT si 3om pune prima componenta a lui n bu&&er: Begin Assign(3arY&is8 JT"ST.)ATJ)L 2e1rite(3arY&is)L 3arY&is= :9 componenta "nd. )escMiderea n scriere pro3oaca stergerea &isierului (daca acesta e#ista) si setarea contorului de po.itie pe -. Pentru a scrie o componenta n &isier este ne3oie ca aceasta sa &ie trecuta prima data n bu&&er (lucru reali.at de ultima instructiune din program)8 dupa care se &oloseste o procedura speciala8 numita put. Semantica acesteia este: 0 scrierea continutului bu&&erului n &isier 0 marirea cu 1 a contorului de po.itie. Prin urmare8 daca dorim o prelucrare completa a &isierului (de e#emplu scrierea &iecarei componente n el)8 atunci programul de mai sus s00ar scrie ast&el: Begin Assign(3arY&is8 JT"ST.)ATJ)L 2e1rite(3arY&is)L 5or i :9 1 to 1- do begin componenta :9 iL 3arY&is= :9 componentaL put(3arY&is) endL /lose(3arY&is) end. Am 3a.ut nsa ca n Pascal e#ista procedura standard Vrite pentru scrierea n &isier. )e &apt8 semantica e#acta a procedurii Vrite este data n tabelul urmator: 0000000000000000000000000000000000000000000000000000000 Procedura standard "ste ecMi3alenta cu 0000000000000000000000000000000000000000000000000000000 ('

Vrite(3arY&is8 componenta) 3arY&is= :9 componentaL put(3arY&is)L 0000000000000000000000000000000000000000000000000000000 In scriere8 s&7rsitul de &isier trebuie marcat. Acest lucru este e&ectuat de procedura standard /lose. 5olosind procedura standard Vrite8 programul de mai sus se scrie ast&el: Begin Assign(3arY&is8 JT"ST.)ATJ)L 2e1rite(3arY&is)L 5or i :9 1 to 1- do begin componenta :9 iL Vrite(3arY&is8 componenta) endL /lose(3arY&is) end. ,.%.'. 5isiere &ara tip (stream) 5isierele &ara tip pot &i considerate ca &iind &isiere cu tip in care o inregistrare are un octet8 si tipul ei este BUte tUpe &ile 9 &ile o& bUteL )eoarece este greoaie manipularea inregistrarilor de 1 bUte8 la &isierele &ara tip se &oloseste un parametru nou8 dimensiunea inregistrarii (bu&&erului)8 numit in engle.a 2ecSi.e. Acest parametru se preci.ea.a la descMiderea &isierului. )aca nu este preci.at8 se considera implicit 3aloarea 1!+. Procedurile standard 2eset si 2e1rite au &orma generala: procedure 2eset(3ar 3arY&is W: 5ileL 2ecsi.e: Vord X )L procedure 2e1rite(3ar 5: 5ile WL 2ecsi.e: Vord X )L Pentru citirea si scrierea din &isierele &ara tip se &olosesc proceduri speci&ice8 BlocZ2ead si BlocZVrite. Procedura BlocZ2ead are sinta#a: procedure BlocZ2ead(3ar 5: 5ileL 3ar Bu&L /ount: Vord WL 3ar 2esult: VordX)L unde: 5 Bu& 4ariabila &isier &ara tip 3ariabila de orice tip (de obicei un tablou de bUte)8 de lungime cel putin egala cu 2ecSi.e /ount e#presie de tip Vord 2esult 3ariabila de tip Vord

Semantica acestei proceduri este urmatoarea: se citesc cel mult /ount inregistrari (de lungime 2ecSi.e &iecare) din &isierul 5 in 3ariabila Bu& ((

(care joaca rolul bu&&erului). Humarul e&ecti3 de inregistrari citite este intors in parametrul optional de iesire 2esult. )aca acesta lipseste8 se declansea.a o eroare de intrare/iesire (detectabila prin &olosirea lui I:2esult) daca numarul de inregistrari citite este mai mic decat /ount. Pentru ca operatia sa aiba sens8 dimensiunea bu&&erului Bu& trebuie sa &ie cel putin egala cu /ount ; 2ecSi.e octeti8 dar nu mai mare decat (%b: (''$' cS Si.e:&(Bu&) cS /ount ; 2ecSi.e )aca /ount ; 2ecSi.e S (''$' se declansea.a o eroare de intrare/iesire. Parametrul de iesire 2esult 3a a3ea 3aloarea (daca este pre.ent in apel) 0 egala cu /ount daca din &isier s0a putut trans&era numarul de octeti preci.at 0 mai mic decat /ount daca in timpul trans&erului s0a detectat s&arsitul de &isierL 2esult 3a contine numarul de inregistrari complete citit )upa terminarea trans&erului8 contorul de po.itie al acestuia se mareste cu 2esult inregistrari. Procedura BlocZVrite are sinta#a: procedure BlocZVrite(3ar 5: 5ileL 3ar Bu&L /ount: Vord WL 3ar 2esult: VordX)L unde: 5 Bu& 4ariabila &isier &ara tip 3ariabila de orice tip (de obicei un tablou de bUte)8 de lungime cel putin egala cu 2ecSi.e /ount e#presie de tip Vord 2esult 3ariabila de tip Vord

Semantica acestei proceduri este urmatoarea: se scriu cel mult /ount inregistrari (de lungime 2ecSi.e &iecare) din 3ariabila Bu& in &isierul 5. Humarul e&ecti3 de inregistrari scrise este intors in parametrul optional de iesire 2esult. )aca acesta lipseste8 se declansea.a o eroare de intrare/iesire (detectabila prin &olosirea lui I:2esult) daca numarul de inregistrari scrise este mai mic decat /ount. Pentru ca operatia sa aiba sens8 dimensiunea bu&&erului Bu& trebuie sa &ie cel putin egala cu /ount ; 2ecSi.e octeti8 dar nu mai mare decat (%b: (''$' c S Si.e:&(Bu&) c S9 /ount ; 2ecSi.e )aca /ount ; 2ecSi.e S (''$' se declansea.a o eroare de intrare/iesire. Parametrul de iesire 2esult 3a a3ea 3aloarea (daca este pre.ent in apel) 0 egala cu /ount daca s0a putut trans&era in &isier numarul de octeti preci.at 0 mai mic decat /ount daca suportul pe care se &ace trans&erul se umpleL 2esult 3a contine numarul de inregistrari complete scris )upa terminarea trans&erului8 contorul de po.itie al acestuia se mareste (*

cu 2esult inregistrari. ,.%.(. 5isierele sistem Sistemul de operare KS0):S are doua &isiere standard: de intrare (tastatura)8 de unde se preia in&ormatia de prelucrat8 si de iesire (ecranul monitorului)8 unde se a&isea.a re.ultatul prelucrarilor. In 3ersiunea standard a limbajului Pascal cele doua &isiere se speci&ica n antetul programului: program Hume(input8 output)L In Turbo Pascal8 aceasta speci&icare este implicita si poate sa lipseasca. Init0ul SUstem contine doua 3ariabile &isier de tip te#t8 cu numele respecti3e: 4ar Input: Te#t :utput: Te#t P Input standard &ile Q P :utput standard &ile Q

In Init0ul Printer8 e#ista o 3ariabila &isier de tip te#t care desemnea.a imprimanta sistem: 3ar 6st : te#tL P SUstem printer Q

Al%oritmica si pro%ramare ' sem 2. /apitolele $0( 0 Structuri dinamice de date $.1. Tipul pointer in Pascal $.!. 6iste simplu inlantuite $.$. Sti3e $.%. /o.i $.'. Structuri liniare $.(. Arbori $.1. Tipul pointer in Pascal 3e.i P:IHT"2.6"/ 0 directorul P:IHT"2 % 6iste simplu inlantuite 3e.i 6IST".6"/ 0 directorul 6IST" '.1. Sti3e 3e.i STI4".6"/ 0 directorul STI4" '.!. /o.i 3e.i /:\I.6"/ 0 directorul /:\I '.$. Structuri liniare 3e.i ST26IH.6"/ 0 directorul ST26IH (. Arbori 3e.i A2B:2I.6"/ 0 directorul A2B:2I (+

1. Programarea modulara. 1.1. Termenul de modul 1.!. Structura unui modul 1.$. "#emple 1.%. /um s0a ajuns la programarea modulara 1.1. Termenul de modul Termenul de modul a &ost &olosit de0a lungul timpului in mai multe acceptiuni 0 subprogram (sursa sau obiect) 0 biblioteca de subprograme 0 colectie de subprograme destinate unui anumit domeniu sau de u. general 0 e#emple 0 biblioteca matematica a &irmei IBK 0 IBK SSP (Scienti&ic Subroutine PacZage) 0 biblioteca matematica a calculatorului 5eli# KAT^6AB 0 biblioteca matematica a &irmei )"/ 0 modul obiect 0 re.ultat din compilarea unui modul sursa 0 modul e#ecutabil ()66) 0 &isier ce contine cod e#ecutabil (&unctii) si este incarcat cand o aplicatie apelea.a o &unctie din el )66 0 )Unamic 6inZ 6ibrarU8 biblioteca cu legare dinamica /e intelegem prin modul 0 unitate de program 0 contine declaratii de 0 subprograme 0 tipuri de date 0 3ariabile 0 constante 0 etc 0 declaratiile sunt 0 publice (e#portate) 0 se pot &olosi de clientii modulului 0 pri3ate (interne) 0 se pot &olosi numai de modul 0 se compilea.a separat 0 &acilitea.a reutili.area codului 0 respecta principiul ascunderii in&ormatiei 0 datele pri3ate ale modulului sunt accesibile numai prin intermediul subprogramelor publice ale acestuia. Ideile programarii modulare 0 sa se grupe.e subprogramele in &unctie de datele pe care le &olosesc 0 sa se proteje.e datele de accesul neautori.at prin JascundereaJ lor in .ona pri3ata a modulului 0 o mai buna di3i.iune a muncii de programare 0 module ser3er: mai comple#e8 mai di&icil de implementat 0 module client: &olosesc declaratiile publice din modulele (,

ser3er "#emplu de modul: unit0ul Turbo (Borland) Pascal 1.!. Structura unui modul In modul are urmatoarele parti 0 antet 0 parte de inter&ata (publica) 0 parte de implementare (pri3ata) 0 cod de initiali.are 1.!.1. Antetul 0 preci.ea.a numele modulului 0 numele modulului apare in &ra.ele Ises din modulele client Init HumeYKodulL 0 Init este un cu3ant re.er3at 0 restrictii: 0 HumeYKodul sa &ie identic numelui &isierului sursa (HumeYKodul.PAS) 0 Ises pro3oaca cautarea unui modul HumeYKodul.TPI 1.!.!. Partea de inter&ata Partea de inter&ata contine declaratiile numelor (simbolurilor) publice. )eclaratiile se re&era la 0 modulele ser3er (o &ra.a Ises) 0 constante 0 tipuri de date 0 3ariabile 0 subprograme (proceduri si &unctii) Toti clientii unit0ului pot &olosi numele care sunt declarate in aceasta parte. In situatia in care e#ista con&lict de nume8 numele in con&lict se cali&ica cu numele modulului: HumeYKodul.Hume Sinta#a partii de inter&ata este: inter&ace P declaratii de nume publice Q: uses P ce module se &olosesc in partea de inter&ata Q const P declaratii de constante Q tUpe P declaratii de tipuri de date Q 3ar P declaratii de 3ariabile Q procedure P antete de proceduri Q &unction P antete de &unctii Q 1.!.$. Partea de implementare *-

Partea de implementare este obligatoriu sa contina corpul subprogramelor (proceduri si &unctii) declarate in partea de inter&ata. In plus8 aceasta parte poate contine si obiecte (eticMete8 constante8 tipuri de date8 3ariabile8 subprograme) locale. Termenul de _local_ inseamna ca aceste obiecte sunt &olosibile numai in partea de implementare8 ne&iind 3i.ibile in a&ara acesteia. Sinta#a partii de implementare este: implementation P declaratii de nume locale Q: uses P ce module se &olosesc in implementare Q label P declaratii de eticMete locale Q const P declaratii de constante locale Q tUpe P declaratii de tipuri de date locale Q 3ar P declaratii de 3ariabile locale Q procedure P corpul procedurilor publice Q &unction P corpul &unctiilor publice Q procedure P corpul procedurilor locale Q &unction P corpul &unctiilor locale Q Pentru subprogramele publice nu este necesara speci&icarea parametrilor. )eclaratia completa a lor este obligatoriu sa &ie &acuta in partea de inter&ata. )aca se speci&ica parametrii si in partea de implementare8 antetul subprogramului din partea de implementare trebuie sa &ie identic (te#tual) cu cel dat in partea de inter&ata. Subprogramele publice se pot apela in partea de implementare &ara a respecta regula: declarare8 apoi apelare. Acest lucru este posibil deoarece declararea lor in partea de inter&ata actionea.a ca o declaratie _&or1ard_. Subprogramele locale (pri3ate) trebuie sa respecte regulile u.uale: declarare8 apoi apelare. 1.!.%. /odul de initiali.are /odul de initiali.are a modulului are ca ca &unctia principala initiali.area 3ariabilelor (locale in special) din modul. )aca nu este ne3oie de un asemenea cod8 se pune pur si simplu cu3antul re.er3at _end._ )aca trebuie cod de initiali.are8 acesta se 3a pune intre begin si end. )in acest punct de 3edere8 codul de initiali.are a unui modul poate &i asimilat programului principal Pascal (care are instructiunile intre begin si end.). 1.$. "#emple: Init0urile standard /rt )os Printer /lient Kodule &olosite *1

/omple#e I/omple# Test I)ata/ /rt /alendar I)ata/ /itireT I5ile IPolinom 0 re..de ecuatii de gr I si II 1.%. /um s0a ajuns la programarea modulara 1.%.1. 2eutili.area codului 1.%.!. Biblioteci de subprograme 1.%.$. )e&icientele bibliotecilor de subprograme 1.%.%. Principiul programarii modulare 1.%.'. )e&icientele programarii modulare 1.%.1. 2eutili.area codului 6a putin timp dupa aparitia limbajelor de ni3el inalt a aparut si conceptul de subprogram8 si odata cu acesta8 principiul abstracti.arii procedurale. /on&orm acestui principiu8 o sec3enta de instructiuni care e&ectuea.a o aceeasi prelucrare se pot grupa intr0o unitate de program independenta8 numita subprogram8 care se caracteri.ea.a prin: 0 un nume (cu care se apelea.a) 0 o lista de parametri &ormali (de intrare si de iesire)8 care atribuie subprogramului un caracter general (re.ol3a o clasa de probleme de&inita de parametrii sai) In orice loc in care este ne3oie de e#ecutia instructiunilor cuprinse in corpul subprogramului8 nu este ne3oie sa se rescrie acele instructiuni. "ste ne3oie doar de o instructiune de apel a subprogramului8 care contine 0 numele acestuia 0 lista de parametri actuali (sau e&ecti3i)8 care trebuie sa corespunda listei parametrilor &ormali ai subprogramului Pentru a putea &i re&olosit in programe di&erite8 codul sursa al unui subprogram nu trebuie sa re&ere nici un nume din mediul sau de apel (adica de acolo unde a &ost scris prima data). 2e.ulta de aici ca in corpul unui subprogram: 0 nu se &olosesc 3ariabile globale 0 nu se &olosesc nici un alt &el de declaratii e#terioare subprogramului 0 toate numele &olosite sunt &ie nume de parametri8 &ie nume declarate local in subprogram. Aceasta este prima &orma de reutili.are a codului sursa: codul sursa al unui subprogram este scris o singura data si &olosit in orice loc este ne3oie de el. 6imbajul Pascal standard re.ol3a problema reutili.arii codului prin includerea te#tului sursa al unui subprogram (e#istent intr0un &isier sursa) in codul sursa al programului care0l apela (&olosind o directi3a de includere). Kediile Turbo si Borland Pascal au pastrat si aceasta &orma *!

de reutili.are a codului prin directi3a de compilare TI. 1.%.!. Biblioteci de subprograme : maniera mai eleganta de grupare a subprogramelor este cunoscuta sub numele de _biblioteci de subprograme_. Acestea sunt &isiere sursa care contin codul sursa al mai multor subprograme. In unele limbaje precum 5:2T2AH8 aceste &isiere se puteau compila separat8 re.ultand module obiect care se puteau pe urma lega cu programele ce le apelau8 &ormand prin linZ0editare programe e#ecutabile. Ast&el de biblioteci sunt: 0 biblioteca matematica a calculatorului 5eli# /0!'( (KatM6ib) 0 biblioteca stiinti&ica a &irmei IBK (IBK SSP 0 Scienti&ic Subroutine PacZage) 0 biblioteca matematica a &irmei )"/ Itili.atorul unei ast&el de biblioteci trebuia doar sa cunoasca modul de apelare a subprogramului dorit. 1.%.$. )e&icientele bibliotecilor de subprograme Intre de&icientele &olosirii bibliotecilor de subprograme mentionam: 0 ele nu contin decat subprograme 0 nu se &ace nici un &el de 3eri&icare a corectitudinii apelului (la compilare nu este ne3oie de e#istenta biblioteciiL este sarcina linZ0editorului sa re.ol3e apelul de subprogram8 a3and codul compilat din modulul obiect8 pe care0l include in programul e#ecutabil) 0 toata responsabilitatea &olosirii corecte a apelului cade in sarcina programatorului client (cel care apelea.a subprogramul). 1.%.%. Principiul programarii modulare :data cu cresterea comple#itatii programelor8 a de3enit din ce in ce mai imperioasa problema protejarii datelor dintr0un program. In speta este 3orba de 3ariabilele globale ale unui program8 care (cel putin teoretic) se pot modi&ica accidental si in partile programului care nu ar trebui sa le modi&ice. Tinand cont de obser3atia (reala) de mai sus8 s0a enuntat principiul programarii modulare8 care a&irma urmatoarele: 0 grupea.a subprogramele in module8 dupa principiul datelor comune 0 &oloseste principiul ascunderii in&ormatiei pentru aceste date. Asa s0a ajuns de la biblioteci de subprograme (in care subprogramele erau grupate de obicei pe criteriul &unctionalitatii) la module8 in care subprogramele se grupea.a pe criteriul datelor pe care trebuie sa le accese.e sau sa le modi&ice. Aceste date 3or &i considerate locale modulului (deci in3i.ibile in a&ara lui)8 iar subprogramele care le prelucrea.a 3or &i considerate publice. ruparea procedurilor in module pe criteriul datelor comune re.ol3a deci *$

0 protectia datelor (care sunt in3i.ibile in a&ara modulului) 0 reutili.area modulului (impreuna cu datele din el) oriunde este ne3oie de &unctionalitatea lui 0 o mai &ina structurare a programelor client (o alta paradigma de programare). 1.%.'. )e&icientele programarii modulare Pana la un punct8 intr0un modul putem concentra de&initia unui nou tip de date8 impreuna cu operatiile pe acest tip. Am spus pana la un punct8 deoarece daca declaram un tip de date nou8 declaratia trebuie sa &ie publica 0 deci in partea de inter&ata. : declaratie publica de tip are ca de&icienta &aptul ca orice 3ariabila de tipul respecti3 este modi&icabila (toate componentele sale sunt accesibile) 0 deci se incalca pe jumatate principiul ascunderii in&ormatiei). "#emplul unit0ului I)ata/ este edi&icator: el declara un tip de data nou8 )ata/ (public) si implementea.a o serie de operatii pe el (si nu numai): 0 /ompara 0 \i/orecta 0 \iua)inAn 0 Humar\ile 0 Aduna 0 \i6ucratoare 0 )ata/ToStr+ 0 )ata/ToStr10 )ata/ToStr 0 Aduna\i 0 Scade\i Toate aceste operatii sunt utile8 insa unit0ul I)ata/ nu ascunde _structura_ )ata/8 deci nu se elimina posibilitatea modi&icarii accidentale (sau neautori.ate) a unei 3ariabile de tip )ata/ in programele client ale unit0ului. : solutie ar &i renuntarea la o declaratie de tip nou si ascunderea structurii acestuia in partea de implementare a modulului. Pentru unit0ul )ata/ acest lucru ar insemna sa renuntam la toate declaratiile de tipuri din partea de inter&ata8 sa le includem in partea de implementare si sa modi&icam aproape toate antetele subprogramelor (pentru ca nu mai a3em tipul )ata/). Hu am castiga mai nimic in ceea ce pri3este protectia datelor8 insa am castiga sigur in neclaritate. "#ista si situatii cand putem ascunde structura tipului in partea de implementare. Init0ul I6ist//).PAS repre.inta8 impreuna cu programul sau client8 6ST/ap/d.PAS un e#emplu de modul corect gandit8 in spiritul paradigmei programarii modulare. In unit0ul I6ist//) au &ost incluse subprograme care operea.a cu o structura de date dinamica numita 6ista/ap/oada. )eclaratia tipului8 ca si a unicei 3ariabile de tipul respecti3 sunt incluse in partea de implementare a modulului8 deci nu sunt 3i.ibile in a&ara acestuia: *%

tUpe 6ista/ap/oada 9 2ecord /ap8 P capul listei: &olosit la tra3ersare Q /oada: PHod P coada listei: acolo se &ac inserari si stergeri Q "ndL 3ar 6: 6ista/ap/oadaL )eoarece lucrea.a toate cu 3ariabila (locala) 68 subprogramele publice 0 /reea.a: /rearea unei liste 3ide 0 Inserea.a: Adaugarea nodului H in coada listei 0 Sterge: Stergerea nodului din coada listei 0 /auta(I): /auta in lista nodul cu in&ormatia utila I 0 Tra3ersea.a: Tra3ersea.a toate nodurile listei si a&isea.a in&ormatia utila din ele 0 "liberea.a: )ealoca toate elementele listei8 trans&ormand0o intr0o lista 3ida nu au ne3oie de 6 ca parametru. /a &apt di3ers8 aici am incalcat principiul e#pus mai sus8 al autonomiei subprogramelor. )e data aceasta8 deoarece ele sunt grupate in acest modul pe principiul datelor comune care le &olosesc (in ca.ul nostru 3ariabila 6)8 nu este ne3oie ca acest principiu sa &ie respectat: daca datele si implementarea subprogramelor ce actionea.a pe ele sunt ascunse e#teriorului8 nu este nici un pericol in a altera aceste date din a&ara. In acest e#emplu am ilustrat principiul programarii modulare. "#emplul &unctionea.a corect atata timp cat in programele client a3em ne3oie de o singura lista. )aca insa am a3ea ne3oie de doua liste8 modulul nostru nu mai e bun. Aceasta este de &apt principala de&icienta a programarii modulare: 0 datele locale in modul permit lucrul cu o singura instanta a modulului (considerat ca tip de date). A &ost ne3oie de urmatoarea paradigma de programare 0 abstracti.area datelor sau 0 programarea ba.ata pe obiecte pentru a re.ol3a aceasta problema. !. Abstracti.area datelor !.1. Istoric !.!. /e este abstracti.area datelor !.!.1. Tipuri de date de&inite de utili.ator !.!.!. Hi3ele de abstracti.are a tipurilor de date !.$. Tipuri abstracte de date !.$.1. Speci&icarea tipurilor abstracte de date !.$.!. Proiectarea operatiilor unui TA) !.$.$. Implementarea tipurilor abstracte de date !.$.%. A3antajele TA) !.%. "#emple !.1. Istoric *'

)ate :peratii Imbunatatire 00000000000000000000000000000000000000000000000000000000000000 adrese de memorie instructiuni masina per&ormanta celule de memorie instructiuni in li.ibilitate cu nume limbaj de asamblare mai usor de (mnemonice) inteles tipuri de date standard instructiuni standard independenta de (sec3enta8 deci.ie8 masina repetitie)

tipuri de date subprograme limbaje 3irtuale utili.ator d / d / module ascunderea in&ormatiei tipuri abstracte de date instante multiple (abstracti.area datelor) (programare ba.ata pe obiecte) clase polimor&ism dinamic (programare orientata pe mostenire obiecte) legare dinamica !.!. /e este abstracti.area datelor !.!.1. Tipuri de date de&inite de utili.ator !.!.!. Hi3ele de abstracti.are a tipurilor de date Abstracti.area inseamna 0 neglijarea detaliilor nesemni&icati3e 0 concentrarea asupra esentei. !.!.1. T)I 0 Tipuri de date de&init de utili.ator Am 3a.ut ca limbajul Pascal ne permite8 prin intermediul declaratiei JtUpeJ8 sa de&inim tipuri de date proprii8 altele decat cele standard. Stim ca un tip de date T este caracteri.at de 0 domeniul 3alorilor (multimea 3alorilor pe care le poate lua o 3ariabila de tipul T)L domeniul este preci.at prin componentele noului tip de&init 0 enumerare 0 subdomeniu 0 multime 0 tablou 0 record 0 multimea operatiilor care se pot e&ectua asupra 3ariabilelor de tipul T. )in pacate8 daca Pascal acorda atentie speciala numai de&inirii domeniului unui nou tip T8 lasand nere.ol3ata problema de&inirii *(

operatiilor pe noul tip T. /u e#ceptia tipurilor multime8 toate celelalte tipuri de&inite de utili.ator au ca operatii prede&inite: 0 atribuirea (componenta cu componenta) 0 testul de egalitate (componenta cu componenta). "#emple: TUpe T 9 ... 3ar a18a!: TL tip de&init de utili.ator a1 si a! sunt 3ariabile de tipul T

0 atribuirea (componenta cu componenta) 0 T de tip tablou: a1 :9 a! inseamna a1WiX :9 a!WiX pentru i luand 3alori de la cel mai mic indice pana la cel mai mare indice 0 T de tip record: a1 :9 a! inseamna a1.c1 :9 a!.c1L c18 c!8 ...8 cn sunt campurile din a1.c! :9 a!.c!L declaratia lui T ... a1.cn :9 a!.cnL 0 testul de egalitate (componenta cu componenta) 0 T de tip tablou: a1 9 a! inseamna a1WiX 9 a!WiX pentru i luand 3alori de la cel mai mic indice pana la cel mai mare indice 0 T de tip record: a1 9 a! inseamna a1.c1 9 a!.c1L c18 c!8 ...8 cn sunt campurile din a1.c! 9 a!.c!L declaratia lui T ... a1.cn 9 a!.cnL !.!.!. Hi3ele de abstracti.are a tipurilor de date Hotiunea de tip de date este discutata aici din punctul de 3edere al programarii. In &ond8 e#ista doua entitati care cooperea.a: utili.atorul uman8 ce poseda inteligenta si &oloseste un limbaj speci&ic speciei umane si masina &i.ica (calculatorul)8 care e#ecuta un program &ormat din instructiuni pe care el le ntelege. Intermediarul ntre aceste entitati este o masina 3irtuala8 necesara unei comunicari c7t mai lesnicioase ntre ele8 cu alte cu3inte un limbaj de programare. Se pot distinge trei ni3ele de abstracti.are ale unui T) simplu sau structurat: abstract8 3irtual si &i.ic. :rdinea de enumerare a acestor ni3ele pleaca de la utili.atorul uman si are ca destinatie masina &i.ica pe care se lucrea.a8 calculatorul. Plec7nd de la rationamentul uman8 primul ni3el este cel abstract8 concreti.at n ceea ce numim tip abstract de date TA). Abstracti.area are rolul de a pune accent pe proprietatile esentiale ale T) (3i.7nd at7t domeniul8 c7t si operatiile)8 neglij7nd detaliile de repre.entare si algoritmii necesari pentru reali.area concreta a operatiilor. Alt&el spus8 TA) pune accent pe semantica T)8 n mod esential pe comportamentul acestuia8 preci.7nd /" trebuie sa &aca &iecare operatie si HI /IK actionea.a aceasta. **

Abstracti.area poate &i 3a.uta si ca o modalitate de ordonare a g7ndirii umane. /onceperea unui TA) nseamna: 0 identi&icarea TA) (n termenii rationamentului uman)8 0 stabilirea unui nume (care sa sinteti.e.e proprietatile sale)8 0 preci.area domeniului si a operatiilor. )e&inirea domeniului TA) nseamna enumerarea proprietatilor pe care trebuie sa le ndeplineasca 3alorile TA)8 iar de&inirea &iecarei operatii o : " 0S 5 nseamna: 0 stabilirea conditiilor de utili.are corecta a ei8 0 stabilirea domeniului " (parametrii de intrare) si a codomeniului 5 (parametrii de iesire)8 precum si 0 preci.area re.ultatului ei. Hi3elul abstract este cel mai apropiat de de&initia datei8 3a.uta ca element purtator de in&ormatie. 6a acest ni3el8 detaliile de repre.entare a 3alorilor posibile ale ei (domeniul T)) nu sunt preci.ate8 esentiale &iind operatiile8 adica comportamentul8 &unctionalitatea datei8 posibilitatile de 3alori&icare a in&ormatiei continuta n data. )e&inirea TA) poarta numele de speci&icare. Hi3elul intermediar de abstracti.are este cel 3irtual8 n care se e#ecuta urmatoarele actiuni: 0 se alege un limbaj de programare 6P (masina 3irtuala)L 0 se de&ineste repre.entarea TA) n termenii 6PL HiZlaus VirtM: AlgoritMms > )ata Structures 9 Programs Prentice0^all8 1,*( 0 se proiectea.a algoritmii necesari pentru operatii cu ajutorul repre.entarii aleseL 0 se scrie codul sursa pentru operatiile TA) sub &orma de subprograme n 6P. Kasina 3irtuala e#ista numai ca o combinatie ntre compilatorul (sau interpretorul) 6P8 sistemul de operare si arMitectura Mard a calculatorului ga.da. 6P poseda T) proprii si/sau mecanisme de tipi.are8 precum si un set de instructiuni8 cu ajutorul carora se pot e#prima repre.entarea si operatiile T) concepute la ni3elul abstract. 6a ni3elul 3irtual putem 3orbi de o concreti.are a TA)8 obtin7ndu0se un tip 3irtual de date T4). Trecerea de la TA) la T4) este numita implementare sau codi&icare. Iltimul ni3el de abstracti.are este cel &i.ic8 n care componentele T4) sunt e#primate &olosind resursele &i.ice ale calculatorului (memorie si instructiuni cablate)8 ca re.ultat al procesului de traducere a T4). Kasina &i.ica poate &i considerata si ea ca un T)8 n care domeniul ar &i memoria8 iar operatiile ar &i instructiunile cablate. )in punct de 3edere &i.ic8 memoria poate &i 3a.uta ca un 3ector de octeti (octetul &iind unitatea adresabila)8 iar instructiunile cablate sunt singurele operatii pe care masina stie sa le e#ecute8 ele &orm7nd limbajul masina. Acest model de T) l 3om numi tip &i.ic de date T5). Trecerea de la T4) la T5) se reali.ea.a prin traducerea programului8 cu ajutorul unui translator *+

(compilator8 asamblor sau interpretor) si e3entual a unui editor de legaturi. 2e.um7nd8 cele trei ni3ele de abstracti.are ale unui T) si trans&ormarile de trecere sunt pre.entate n &igura 1. :K KASIHA @@@@@@@@@@@S TA) @@@@@@@@@@@@S T4) @@@@@@@@@@@@S T5) speci&icare implementare traducere 5igura 1. Hi3ele de abstracti.are a unui tip de date 5iecarui ni3el de abstracti.are i corespunde un limbaj n care trebuiesc preci.ate componentele T)8 adica domeniul si operatiile8 con&orm tabelului 1. ?@@@@@@@@@@@D@@@@@@@@@@@@@@@@@A B Hi3el B 6imbaj B e@@@@@@@@@@@F@@@@@@@@@@@@@@@@@f B abstract B de speci&icare B B 3irtual B de programare B B &i.ic B masina B C@@@@@@@@@@@G@@@@@@@@@@@@@@@@@E Tabelul 1. Hi3ele de abstracti.are si limbaje 6imbajul de speci&icare a TA) poate &i &ormal sau in&ormal. 6imbajul &ormal este riguros8 e#act8 dar greu de nteles de nespecialisti (&ac7nd apel la notatii matematice)8 pe c7nd limbajul in&ormal este mult mai apropiat de e#primarea umana8 cMiar daca el su&era n rigoare si e#actitate. Speci&icarea &ormala a TA) utili.ea.a n esenta mecanisme algebrice (algebre uni3ersale8 algebre multisortate8 g0algebre)8 repre.ent7nd asta.i o directie importanta de cercetare n in&ormatica teoretica. 6imbajul de programare8 3a.ut ca mijloc de e#primare la ni3elul 3irtual de abstracti.are8 poate &i mai apropiat de masina &i.ica (limbaj de asamblare) sau de utili.atorul uman (limbaj de ni3el nalt). In ambele iposta.e8 &olosirea lui este conditionata de e#istenta unui translator capabil sa traduca T4) ntr0un program e#ecutabil pe masina &i.ica. Traducerea T4) nseamna e#primarea lui (ca repre.entare si operatii) n limbaj masina. /a programe8 T4) si T5) sunt semantic ecMi3alente (adica produc acelasi re.ultat)8 deosebirea dintre ele const7nd doar n mijloacele de e#primare8 adica n limbajul &olosit. ?@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@ @@@A B Hi3el B Hi3el 3irtual B Hi3el &i.ic B B abstract B (Turbo Pascal) B (procesor +-#+() B e@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@ @@@f B Adresa B 2ecord B Implementarea B B B 6ocalitate:stringW!-XL B T) 2ecord pe B *,

B B Strada:StringW1-XL B IBK0P/ B B B Humar:Integer B $%9!1>11>! oct. B B B "ndL B B B B B B B Temperaturi B ArraUW1..1!X o& 2ealL B Implementarea B B medii B B T) ArraU pe B B lunare B B IBK0P/ B B B B 1!;(9*! octeti B B B B B B 47rsta B Integer B ntreg +-#+( B B B B ! octeti B C@@@@@@@@@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@@@@@@@@@@@@ @@@E 5igura !. Tipuri de date si ni3ele de abstracti.are !.$. Tipuri abstracte de date (TA)) !.$.1. Speci&icarea tipurilor abstracte de date Asa cum am aratat mai inainte8 TA) se preci.ea.a cu ajutorul unui asa0numit limbaj de speci&icare8 &ormal sau in&ormal. In cele ce urmea.a 3om &olosi un limbaj de speci&icare in&ormal8 cu ajutorul caruia 3om de&ini scMeme de speci&icare pentru T) simple si pentru T) structurate. In esenta8 o scMema de speci&icare a TA) contine doua parti: speci&icarea domeniului T) si speci&icarea operatiilor. In ca.ul T) structurate8 speci&icarea domeniului T) nseamna: 0 speci&icarea elementelor (descrierea elementelor componente)8 0 speci&icarea structurii (adica a relatiei sau legaturii dintre elemente) 0 speci&icarea propriu0.isa a domeniului (descrierea multimii 3alorilor posibile). Speci&icarea unei operatii se reali.ea.a n maniera procedurala8 operatiei atas7ndu0i0se un nume8 o lista de parametri8 ea &urni.7nd un re.ultat. )e asemenea8 pentru &iecare operatie trebuiesc preci.ate preconditia si postconditia. Preconditia este o asertiune (a&irmatie) care preci.ea.a n ce conditii operatia are sens si ea trebuie 3eri&icata inainte8 pentru ca operatia sa se e#ecute corect8 iar postconditia e#prima legaturile dintre re.ultatele obtinute n urma e#ecutarii operatiei si operan.i n ipote.a ca preconditia este 3eri&icata. "ste important de preci.at ca postconditia speci&ica numai /" re.ultate se obtin8 &ara a intra n detalii pri3ind /IK se obtin acestea. In &igura $ pre.entam scMemele de speci&icare pentru TA) simplu8 TA) structurat si pentru o operatie. ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A B a) ScMema de speci&icare a unui TA) simplu B B B B )omeniu: descrierea multimii 3alorilor posibile B B B B :peratii: speci&icarea &iecarei operatii8 3e.i c) B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E +-

?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@A B b) ScMema de speci&icare a unui TA) structurat B B B B "lemente: descrierea elementelor componente B B B B Structura: descrierea relatiilor sau legaturilor ntre B B elemente B B B B )omeniu: descrierea multimii 3alorilor posibile B B B B :peratii: speci&icarea &iecarei operatii8 3e.i c) B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@E ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@A B c) ScMema de speci&icare a unei operatii B B B B Hume: numele operatiei (identi&icator8 c7t mai sugesti3) B B B B 6ista de parametri: speci&icarea parametrilor8 ca B B perecMi (identi&icator8 T)) B B B B 2e.ultat: (c7nd operatia are sensul unei &unctii Pascal) B B T) al re.ultatului ntors B B B B Pre: preconditia (e3entuale conditii impuse parametrilor B B de intrare) B B B B Post: postconditia (preci.area legaturilor dintre B B re.ultatele obtinute si parametrii B B de intrare) B B B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@E 5igura $. ScMeme de speci&icare Pentru e#empli&icare8 3om speci&ica c7te3a TA) simple: \ile8 Hatural si Sutime si TA) structurat Konede. Speci&icarea 1. Tipul abstract simplu \ile )omeniu: multimea 3alorilor posibile este: SAP9Pluni8marti8miercuri8joi83ineri8s7mbata8duminicaQ. :peratii: Ieri(.:\ile):\ile PStabileste .iua precedenta a .ilei .Q Pre: .OSAP. Post: Ieri(.) este .iua precedenta a .ilei .. K7ine(.:\ile):\ile PStabileste .iua ce urmea.a .ilei .Q Pre: .OSAP. +1

Post: K7ine(.) este .iua urmatoare a .ilei .. 6ibera(.:\ile):Boolean P. este .i nelucratoare NQ Pre: .OSAP. Post: )aca . este .i nelucratoare. atunci 6ibera(.) este True alt&el 6ibera(.) este 5alse. Scrie(.:\ile) Pscrie 3aloarea lui . la dispo.iti3ul standard de iesireQ Pre: .SAP. Post: Se 3a a&isa .iua . ca sir de caractere. /iteste(3ar .:\ile) Pciteste 3aloarea lui . de la dispo.iti3ul standard de intrareQ Pre: T2I". Post: re.ultatul . se 3a citi ca sir de caractere ce repre.inta o 3aloare din domeniul SAP. Speci&icarea !. Tipul abstract simplu Hatural )omeniu: multimea 3alorilor posibile este multimea H a numerelor naturale. :peratii: KaiKare(n18n!:Hatural):Boolean Pn1 S n! NQ Pre: n18n!OH. Post: )aca n1 S n! atunci KaiKare(n18n!) 3a &i True alt&el KaiKare(n18n!) 3a &i 5alse. "gal(n18n!:Hatural):Boolean Pn1 9 n! NQ Pre: n18n!OH. Post: )aca n1 9 n! atunci "gal(n18n!) 3a &i True alt&el "gal(n18n!) 3a &i 5alse. Aduna(n18n!:HaturalL 3ar n:Hatural) Pcalculea.a suma lui n1 si n!Q Pre: n18n!OH. Post: n 9 n1 > n!. Scade(n18n!:HaturalL 3ar n:Hatural) Pscade n! din n1Q Pre: n18n!OH si KaiKare(n18n!). Post: n 9 n1 0 n!. :ri(n18n!:HaturalL 3ar n:Hatural) Pcalculea.a produsul lui n1 si n!Q Pre: n18n!OH. Post: n 9 n1 ; n!. /7t(n18n!:HaturalL 3ar n:Hatural) Pcalculea.a c7tul mpartirii lui n1 la n!Q Pre: n18n!OH si n!S-. Post: n 9 partea ntreaga a c7tului n1 / n!. 2est(n18n!:HaturalL 3ar n:Hatural) Pcalculea.a restul mpartirii lui n1 la n!Q Pre: n18n!OH si n!S-. Post: n 9 n1 0 /7t(n18n!) ; n!. Speci&icarea $. Tipul abstract simplu Sutime )omeniu: multimea 3alorilor posibile este multimea numerelor naturale +!

cuprinse ntre - si ,,8 notata prin )S. :peratii: KaiKare(s18s!:Sutime):Boolean Ps1 S s! NQ Pre: s18s!O)S. Post: )aca s1 S s! atunci KaiKare(s18s!) 3a &i True alt&el KaiKare(s18s!) 3a &i 5alse. "gal(s18s!:Sutime):Boolean Ps1 9 s! NQ Pre: s18s!O)S. Post: )aca s1 9 s! atunci "gal(s18s!) 3a &i True alt&el "gal(s18s!) 3a &i 5alse. Aduna(s18s!:SutimeL 3ar n:HaturalL 3ar s:Sutime) Pcalculea.a suma lui s1 si s!Q Pre: s18s!O)S. Post: s 3a contine partea &ractionara a sumei dintre s1 si s! iar n 3a contine partea ntreaga a acesteia (transportul). Scade(s18s!:SutimeL 3ar s:Sutime) Pscade s! din s1Q Pre: s18s!O)S si KaiKare(s18s!) sau "gal(s18s!). Post: s 9 s1 0 s!. Speci&icarea %. Tipul abstract structurat Konede "lemente: "lementele componente sunt partea ntreaga8 respecti3 partea &ractionara a unei sume monetare. Structura: Se notea.a cu 6ei partea ntreaga a sumei8 respecti3 cu Bani partea &ractionara a acesteia. "#ista o corespondenta unu0la0unu ntre &iecare identi&icator si elementul component corespun.ator. )omeniu: 4aloarea partii ntregi a sumei8 6ei8 este un numar natural8 iar cea a partii &ractionare8 Bani8 este n inter3alul natural -..,,. )omeniul tipului Konede8 )K este 3a.ut ca produsul carte.ian al acestor doua domenii ale elementelor componente. :peratii: BaniInKonede(n:SutimeL 3ar r:Konede) Ptrans&orma suma n e#primata n Bani n 6ei si BaniQ Pre: nO)S. Post: r este 3aloarea lui n e#primata n 6ei si Bani. 6eiInKonede(n:HaturalL 3ar r:Konede) Ptrans&orma suma n e#primata n 6ei n 6ei si BaniQ Pre: nOH. Post: r este 3aloarea lui n e#primata n 6ei si Bani. 6ei)inKonede(s:Konede):HaturalPpartea ntreaga a sumeiQ Pre: sO)K. Post: 6ei)inKonede(s) este 3aloarea c7mpului 6ei al lui s. Bani)inKonede(s:Konede):Sutime Ppartea &ractionara a sumeiQ Pre: sO)K. Post: Bani)inKonede(s) este 3aloarea c7mpului Bani al lui s. KonedeIn2eal(s:Konede):2eal P3aloarea sumei s ca numar realQ Pre: sO)K. +$

Post: numarul real KonedeIn2eal(s) 3a a3ea partea intreaga egala cu 6ei si partea &ractionara egala cu Bani / 1--. 2ealInKonede(r:2ealL 3ar s:Konede) P3aloarea numarului real r con3ertita la tipul KonedeQ Pre: rO2. Post: sO)K are componentele: c7mpul 6ei este partea ntreaga a numarului real r8 c7mpul Bani are ca ci&re primele doua .ecimale din partea &ractionara a lui r. KaiKare(s18s!:Konede):Boolean Ps1 S s! NQ Pre: s18s!O)K. Post: )aca s1 S s! atunci KaiKare (s18s!) 3a &i True alt&el KaiKare (s18s!) 3a &i 5alse. "gal(s18s!:Konede):Boolean Ps1 9 s! NQ Pre: s18s!O)K. Post: )aca s1 9 s! atunci "gal (s18s!) 3a &i True alt&el "gal (s18s!) 3a &i 5alse. Aduna(s18s!:KonedeL 3ar r:Konede) Paduna s1 si s!Q Pre: s18s!O)K. Post: r 9 s1 > s!. Scade(s18s!:KonedeL 3ar r:Konede) Pscade s! din s1Q Pre: s18s!O)K si KaiKare(s18s!). Post: r 9 s1 0 s!. Scrie(s:Konede) Pscrie 3aloarea lui s la dispo.iti3ul standard de iesireQ Pre: sO)K. Post: se 3a a&iYa s n &ormatul J,,,,,,8,, leiJ. )ob7nda(s:KonedeL d:2ealL 3ar r:Konede) Pcalculea.a dob7nda r a&erenta sumei s si ratei rQ Pre: s )K si d2. Post: r 9 dob7nda la suma s calculata cu rata dob7n.ii d. !.$.!. Proiectarea operatiilor unui TA) /ea mai importanta &a.a n speci&icarea unui TA) este proiectarea multimii operatiilor. Kultimea operatiilor n ansamblul ei trebuie sa ndeplineasca urmatoarele conditii: (1) sa &ie completaL (!) sa &ie minimala. )upa criteriul &unctionalitatii lor8 clasele de operatii ale unui TA) sunt urmatoarele (clasi&icare data de 2ileU8 1,+*): (1) constructoriL (!) operatii de intrare/iesireL ($) operatii de con3ersieL (%) operatii de testL (') operatii de copiereL (() operatii de selectare. +%

4om discuta n cele ce urmea.a caracteristicile &iecarei clase de operatii. "#emplele &urni.ate apartin speci&icarii %. /onstructorii sunt operatii prin care se atribuie 3alori unor reali.ari ale TA)8 adica creea.a sau modi&ica instante ale TA). In ca.ul n care operatia se reali.ea.a prin utili.area unor date de alt tip8 constructorii se numesc initiali. /ompletitudinea setului de operatii se poate &ormula ast&el: /onstructorii unui TA) trebuie sa produca orice element din domeniul acestuia. "#emple de constructori: BaniInKonede8 6eiInKonede (initiali)8 Aduna8 Scade8 )ob7nda. :peratiile de intrare0iesire (numite prescurtat operatii de I/:) permit citirea sau scrierea 3alorii unei reali.ari a TA) de pe/pe suport e#tern. Acest lucru este necesar deoarece8 cu putine e#ceptii8 TA) sunt structurate si majoritatea 6P nu dispun de operatii de I/: cu care sa se poata implementa T4) asociate TA). :peratiile de intrare pot &i considerate si constructori. Scrie este o operatie de I/: (de iesire mai e#act8 deci nu este constructor). :peratiile de con3ersie reali.ea.a trans&ormarea 3alorii instantelor T) n 3alori de instante ale altor T). :peratiile KonedeIn2eal si 2ealInKonede &ac parte din aceasta clasa. 2ealInKonede se poate considera si constructor pentru Konede. :peratiile de test sunt necesare n primul r7nd pentru testarea preconditiilor8 put7nd &i &olosite cMiar n speci&icarea TA) (3e.i speci&icarile !0%). KaiKare si "gal sunt ast&el de operatii. :peratiile de copiere sunt necesare c7nd nu se poate &olosi instructiunea de atribuire pentru a copia 3aloarea unei instante de TA) ntr0o alta instanta. "le sunt considerate si constructori8 numiti uneori cMiar constructori de copiere (in />>). Pentru TA) Konede8 o operatie /opU(m1:KonedeL 3ar m!:Konede) P m! :9 m1 Q

ar &i o operatie de copiere care ar copia &iecare camp al instantei m1 in campul corespun.ator al instantei m!. :peratiile de selectare permit (n ca.ul TA) structurate) operarea cu elementele componente ale unei instante a TA). 6ei)inKonede si Bani)inKonede sunt ast&el de operatii. /u alte cu3inte8 operatiile de selectare permit a&larea 3alorii unei componente a instantei (pentru TA) structurate)8 &ara a permite modi&icarea ei. : alta clasi&icare a operatiilor8 data de KeUer (1,++) distinge $ clase: 0 constructori (creea.a noi instante ale TA))8 0 accesori (permit accesul la 3alorile anumitor componente8 &ara a le +'

modi&ica) si 0 modi&icatori (modi&ica anumite componente ale instantei). 6egatura dintre aceste doua clasi&icari este sinteti.ata n tabelul !. ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@A B KeUer B 2ileU B e@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@f B constructori B constructori initiali B B B operatii de con3ersie spre TA) B B B operatii de intrare B B modi&icatori B constructori (altii dec7t cei B B B initiali) B B accesori B operatii de test B B B operatii de con3ersie de la TA) B B B operatii de selectare B B B operatii de iesire B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@E Tabelul !. Tipuri de operatii pentru TA) !.$.$. Implementarea tipurilor abstracte de date Asa cum am preci.at anterior8 implementarea unui TA) presupune parcurgerea urmatoarelor etape: 0 alegerea unui limbaj de programare 6P8 0 stabilirea repre.entarii domeniului TA) n termenii acestui limbaj8 0 proiectarea algoritmilor necesari pentru implementarea operatiilor (tin7nd cont de repre.entare) si8 0 scrierea de subprograme corespun.atoare &iecarei operatii8 in 6P. In mod normal8 &a.a de implementare mai contine o etapa de testare8 3a.uta at7t la ni3elul &iecarei operatii8 c7t si al TA) n ansamblu (testarea procedurala si testarea de modul). 2e.ultatul implementarii8 tipul 3irtual de date8 T4)8 3a &i numit n cele ce urmea.a modul sau pacMet8 n ideea ca el este o unitate sintactica de sine statatoare8 compilabila separat. In sectiunea !.%. 3om pre.enta implementarile TA) pre.entate n speci&icarile 1 0 %. !.$.%. A3antajele TA) Abordarea la ni3el abstract a T) o&era c7te3a a3antaje importante pentru acti3itatea de programare n general: (1) speci&icatii preciseL (!) modularitateL ($) ncapsularea si ascunderea in&ormatieiL (%) simplitate n proiectare si utili.areL (') integritatea repre.entariiL (() independenta de implementare si +(

(*) modi&icabilitate. )eoarece speci&icarea TA) se &ace &olosind un limbaj precis8 iar semantica operatiilor nu &ace apel la repre.entarea domeniului8 de&initiile obtinute sunt clare8 neambigue si independente de conte#tul de utili.are. )espre modularitate: putem discuta de doua tipuri de module: TA) si T4). "ste e#trem de important ca de&inirea unui TA) (care utili.ea.a operatii sau elemente ale altor tipuri de date) sa utili.e.e numai de&initiile TA) respecti3e8 &ara 3reo re&erire la T4) ce le implementea.a. In e#emplele pre.entate de noi n !.$.18 TA) Konede este construit cu ajutorul TA) Hatural si Sutime8 nsa &ara nici o re&erire la implementarea acestora. In mod natural8 implementarea unui ast&el de TA) 3a trebui sa apele.e operatiile TA) ale componententelor sale8 pre3a.ute n speci&icare. Incapsularea repre.entarii si operatiilor (punerea lor mpreuna) induce ordine si e&icienta. Pentru o anumita structura de date este natural sa se conceapa nu numai o operatie8 ci toate operatiile de manipulare a respecti3ei structuri. Acest lucru8 &acut independent de utili.area respecti3ei structuri8 permite o testare usoara a operatiilor proiectate si asigura &le#ibilitate8 o noua operatie put7nd &i introdusa oric7nd8 daca e ne3oie. Acordarea unei atentii egale repre.entarii si operatiilor conduce la reali.area de module mai stabile8 descMi.7nd poarta reutili.arii lor n conte#te adec3ate. Ascunderea in&ormatiei este una dintre cerintele majore ale modulari.arii. Kodulul client nu trebuie sa cunoasca dec7t modul de apelare a ser3iciilor din modulul &urni.or (ser3er). Abstracti.area datelor o&era simplitate. 6a prima 3edere8 termenul abstract ar a3ea ntelesul de teoretic8 abscons8 greu de nteles. In ca.ul nostru8 abstracti.area are o semni&icatie opusa. "senta ei consta tocmai n surprinderea aspectelor si comportamentului esential al datelor (ca structura si operatii) prin neglijarea detaliilor de repre.entare si de implementare. Aceasta concentrare pe aspectele esentiale o&era simplitate n proiectarea TA) de catre specialist. Pe de alta parte8 cerinta de minimalitate a setului de operatii ale TA) o&era simplitate n utili.area acestora8 adica o ntelegere usoara de catre utili.ator a comportamentului TA). )in aceste a&irmatii nu trebuie sa se nteleaga ca aspectele de implementare sunt neglijate. 6a ni3elul abstract acestea nu sunt luate n considerare nu pentru ca ele nu sunt importante8 ci pentru ca aceste detalii 3or &i discutate la 3remea lor. Principiul ra&inarii succesi3e (step1ise re&inement) aplicat TA) nseamna trei etape: 0 abstracti.are8 0 de&inirea repre.entarii si 0 implementare. In T4) poate &i 3a.ut ca o cutie neagra8 n care operatiile sunt butoane ce reali.ea.a anumite &unctii (operatii) ale cutiei. Proiectantul (implementatorul) cutiei cunoaste interiorul ei8 dar utili.atorul (programatorul client) nu o poate des&ace pentru a 3edea ce e nauntru8 ci o poate &olosi prin apasarea butoanelor ei. Integritatea repre.entarii poate &i discutata pe doua ni3ele: abstract si 3irtual. 6a ni3elul abstract8 integritatea TA) este asigurata de maniera n care sunt concepute operatiile sale. 6a ni3elul 3irtual8 daca toate operatiile sunt +*

implementate corect8 atunci nici una dintre ele nu poate a&ecta integritatea repre.entarii. In plus8 programatorul client nu 3a a3ea acces la repre.entarea in&ormatiei din interiorul modulului ser3er (principiul ascunderii in&ormatiei). Hotiunea de integritate (consistenta) a repre.entarii se poate de&ini cu ajutorul in3ariantului acesteia8 care este un predicat: I : ) @S P&alse8trueQ . Spunem ca repre.entarea este consistenta daca I are 3aloarea true pentru orice element din domeniul TA). )e e#emplu8 pentru TA) Konede8 in3ariantul repre.entarii este: I(r:Konede) 9 - R9 r.6ei R9 Ka#6ongInt si - R9 r.Bani R9 ,, . 6a ni3elul abstract detaliile de repre.entare si implementare a operatiilor sunt neglijate intentionat. )e asemenea8 speci&icarea se &ace &olosind un limbaj speciali.at si nu unul de programare. Prima deci.ie n &a.a de implementare este alegerea 6P. Acest lucru se ba.ea.a pe cunoasterea T) si a instructiunilor cu care acest limbaj poate opera si are o importanta decisi3a n succesul implementarii. Irmatoarea etapa importanta este stabilirea repre.entarii T)8 concreti.are a celei abstracte prin utili.area T) ale 6P ales. Pentru acelasi TA) se pot alege repre.entari structural di&erite8 ceea ce conduce la algoritmi di&eriti. Kai mult8 pentru aceeasi repre.entare se pot concepe mai multi algoritmi (deci implementari di&erite) pentru o aceeasi operatie. )aca speci&icarea operatiei o este corecta8 modi&icarea codului de implementare al ei are un e&ect local8 aceasta neimplic7nd modi&icari n alte module sau programe ce apelea.a o. Kulti autori recomanda o abordare gradata a ultimelor doua &a.e de implementare a unui TA)8 n maniera urmatoare8 pentru o repre.entare &i#ata: (1) se stabilesc algoritmii cei mai simpli pentru &iecare operatieL (!) se implementea.a operatiileL ($) se testea.a T4) n ansamblu (teste de anduranta)8 e3identiindu0se operatiile care sunt mari consumatoare de resurse (timp sau memorie)L (%) se reproiectea.a algoritmii n cau.a si se reia ciclul de la &a.a (!). Procesul se ncMeie c7nd n &a.a ($) re.ultatele obtinute satis&ac cerintele impuse. In ca.ul c7nd nu se obtin re.ultate satis&acatoare8 se ncearca o alta repre.entare. !.%. "#emple In cele ce urmea.a 3om ilustra implementarea n Turbo Pascal a TA) speci&icate n paragra&ul $.!. )atorita restrictiilor limbajului8 numele modulului 3a &i compus din litera I (de la Init) si numele TA). !.%.1. T4) \ile TA) \ile poate &i implementat natural n Turbo Pascal8 &olosind T4) enumerare. 2emarcam parcurgerea circulara a domeniului SAP pentru ++

operatiile Ieri si K7ine si implementarea acestora ca subprograme de tip &unctie n Turbo Pascal. 4e.i I\ile.PAS !.%.!. T4) Hatural Implementarea TA) Hatural pe care o pre.entam corespunde numerelor naturale ce se pot repre.enta n memoria calculatorului pe % octeti (inter3alul W-..Ka#6ongIntX8 Ka#6ongInt 9 !=$101 n Turbo Pascal). In numar natural este deci considerat ntreg masina pe % octeti. Tin7nd cont de aceasta repre.entare8 implementarea TA) Hatural se &ace e#trem de simplu8 &olosindu0se operatiile tipului prede&init 6ongInt (aritmetice si relationale) din Turbo Pascal. Sugeram alte doua modalitati de repre.entare a T4) Hatural8 di&erite de cea aleasa8 care sa permita manipularea de numere naturale n S Ka#6ongInt8 cu: 0 n repre.entat ca tablou cu Ka#)im ci&re (Ka#)im constanta8 elementul de tablou sa &ie de tip BUte si sa contina o ci&ra a numarului scris ntr0o ba.a de numeratie numita Ba.aL (elementul de indice i 3a contine ci&ra de rang i 9 coe&icientul lui Ba.a=i)L 0 n repre.entat ca lista nlantuita8 nodul i al listei contin7nd ca in&ormatie utila ci&ra i a numarului scris n ba.a Ba.a. Pentru &iecare dintre cele doua repre.entari sugerate8 implementarea trebuie re&acuta8 plec7nd de la speci&icatiile ! si obtin7ndu0se ast&el noi 3ariante ale T4) Hatural8 care 3or di&eri ca &unctionalitate de cea de mai jos doar prin domeniu. 4e.i Init0ul IHatural.PAS )in moti3e de simpli&icare a implementarii8 la operatiile Aduna si :ri nu este testata depasirea 3alorii ma#ime repre.entabile8 Ka#6ongInt. Sugeram cititorului sa reali.e.e singur o alta implementare a acestor operatii8 n care sa se semnale.e eroare n ca.ul depasirii. !.%.$. T4) Sutime Implementarea TA) Sutime pe care o pre.entam considera repre.entarea domeniului acestui TA) ca subdomeniu al tipului prede&init Integer din Turbo Pascal. Tin7nd cont de aceasta repre.entare8 implementarea se &ace e#trem de simplu8 &olosindu0se operatiile tipului prede&init Integer (aritmetice si relationale) din Turbo Pascal. In inter&ata si implementarea unit0ului se &oloseste T4) Hatural8 pre.entat n !.%.!. 4e.i Init0ul ISutime.PAS Anali.7nd implementarea operatiei Aduna8 putem sugera si o alta solutie8 mai generala: Procedure Aduna(s18s!:SutimeL 3ar n:HaturalL 3ar s:Sutime)L 4ar +,

n18n!8n$ : HaturalL Begin n1 :9 SutimeToHatural(s1)L n! :9 SutimeToHatural(s!)L IHatural.AdunY(n18n!8n$)L IHatural./7t(n$81--8n)L IHatural.2est(n$81--8n1)L s :9 HaturalToSutime(n1) "ndL P Aduna Q n care am &olosit operatii de con3ersie de la tipul Sutime la tipul Hatural (SutimeToHatural) si in3ers (HaturalToSutime)8 iar calculele s0au &acut &olosind operatiile tipului Hatural. !.%.%. T4) Konede Acest T4) este un e#emplu de &olosire intensi3a a altor T4) (Hatural8 Sutime) pentru implementarea TA) Konede. Se remarca cali&icarea operatiei cu numele modulului (n situatia con&lictului de nume). 5olosirea operatiilor relationale ale T4) Hatural (KaiKare8 "gal) n locul operatorilor relationali (prede&initi) este un e#emplu de apel independent de implementare: daca T4) Hatural ar &i alt&el implementat (3e.i sugestiile &acute n $.!.$.1)8 n0ar putea &i &olositi respecti3ii operatori8 prin urmare codul sursa al T4) Konede (operatiile KaiKare si "gal) ar trebui rescris). Itili.7nd operatiile cu care a &ost dotat TA) Hatural8 se obtine o implementare mult mai generala si mai &le#ibila8 care nu este a&ectata de modi&icarea T4) &olosite n ea. 4e.i IKonede.PAS %. P2: 2AKA2"A :2I"HTATA P" :BI"/T" %.1. /oncepte generale %.!. Programarea orientata pe obiecte in Turbo Pascal %.1. /oncepte generale Am 3a.ut in lectia JTipuri de date utili.atorJ ca programarea orientata pe obiecte 9 programarea ba.ata pe obiecte > mostenirea > polimor&ismul. Inainte de a de&ini conceptele de mostenire si polimor&ism8 3om &ace o scurta trecere in re3ista a conceptelor de ba.a legate de programarea orientata pe obiecte (:bject0:riented Programming8 ::P sau P::). %.1.1. Hotiuni si concepte &undamentale In programarea ba.ata pe obiecte (:bject0Based Programming)8 obiectele incapsulea.a date (ce caracteri.ea.a starea lor) si actiuni (care caracteri.ea.a comportamentul obiectelor). :biectele comunica intre ele prin ,-

mesaje. )oua obiecte de acelasi tip (adica instante ale aceleiasi clase) 3or a3ea aceeasi multime a 3ariabilelor de stare (numite campuri sau 3ariabile de instanta)8 dar 3or a3ea 3alori di&erite ale acestora8 ce le 3a deosebi. In scMimb8 din punct de 3edere comportamental8 ele 3or &i capabile sa e&ectue.e aceleasi operatii (numite metode)L natural8 &iecare obiect 3a e&ectua o anumitt operatie in con&ormitate cu starea sa. /u alte cu3inte8 doua obiecte identice (ca tip) 3or reactiona di&erit la acelasi mesaj8 deoarece raspunsul tine cont de starea &iecaruia dintre ele. In preambulul de mai sus am &olosit notiunile: 0 obiect8 0 clasa8 0 instanta sau reali.are8 0 camp sau 3ariabila de instanta sau 3ariabila de stare8 0 metoda sau operatie8 0 mesaj. Sa le de&inim. a) /lasa /lasa este un tip de date repre.entand o multime de obiecte care au in comun aceeasi repre.entare (aceleasi 3ariabile de stare8 numite si campuri sau 3ariabile de instanta) si acelasi comportament (aceleasi operatii8 numite metode). /onceptual8 ea poate &i considerata la doua ni3ele: 1. 6a ni3elul abstract: clasa este un tip abstract de dateL campurile de&inesc repre.entarea saL operatiile de&inesc comportamentul obiectelor (instantelor) saleL !. 6a ni3elul 3irtual: 0 clasa este un mecanism e#istent intr0un limbaj de programare8 ce permite: 0 incapsularea datelor si operatiilorL 0 stabilirea unor reguli de 3i.ibilitate (acces la campuri din mediul e#tern eiL mecanism de protectie a datelor)L 0 asocierea unui nume entitatii respecti3e (mecanism de tipi.are)L 0 posibilitatea creerii si distrugerii instantelor (reali.arilor) sale (mecanism de instantiere8 constructori8 destructori)L 0 campurile clasei se numesc 3ariabile de instanta sau 3ariabile de stareL 0 operatiile (ser3iciile) se numesc metodeL multimea metodelor clasei &ormea.a protocolul de comunicatie al obiectelor ei )eci8 la ni3elul abstract clasa este un tip abstract de date8 iar in a doua acceptiune8 clasa este un tip 3irtual de date. b) :biectul :biectul este instanta (reali.are) a clasei8 in ambele acceptiuni discutate mai sus. 6a ni3elul 3irtual8 putem considera obiectul ca o 3ariabila de tipul ,1

clasei. :biectele comunica intre ele prin mesaje. In &orma generala8 un mesaj se poate scrie ast&el: send(28SW8AX) sau 2.S(A) unde: 2(receptor) este obiectul destinatar al mesajului S(selector) este metoda apelata A(argumente8 optional) contine parametrii actuali ai apelului :biectul receptor 28 instanta a clasei /8 poate raspunde la mesaje cu selectorul S numai daca metoda desemnata de S &ace parte din protocolul de comunicatie al clasei /. Alt&el spus8 S este numele unei metode si aceasta metoda trebuie sa &ie de&inita in clasa /. %.1.!. Kostenirea si polimor&ismul 0 o prima abordare )e&initiile date in acest paragra& sunt imprecise8 dar constituie un punct de plecare in discutia noastra. "le 3or &i detaliate in sectiunile urmatoare. Kostenirea permite clasi&icarea obiectelor in concordanta cu caracteristicile comune (de stare sau de comportament) ale lor. Polimor&ismul dinamic inseamna trimiterea de mesaje spre obiecte de tip necunoscut8 dar care recunosc mesajul (selectorul acestuia &ace parte din protocolul de comunicatie al clasei lor). Humim obiecte polimor&ice acele obiecte care au acelasi protocol de comunicatie. Impreuna8 mostenirea si polimor&ismul sunt instrumente ce permit reali.area a doua mari de.iderate: 0 organi.area ierarMiilor de claseL 0 simpli&icarea comunicarii intre obiecte. /u aceste notiuni preci.ate8 se pot &ormula doua (pseudo)de&initii ale programarii orientate pe obiecte (P::): 1. "senta P:: este trimiterea de mesaje spre obiecte de tip necunoscut8 care au in comun acelasi protocol de comunicatieL !. P:: este un stil de programare (mai bine .is de de.3oltare de programe) ce incearca minimi.area comple#itatii unui program prin reducerea numarului de cone#iuni intre componentele sale. /aile de reducere a comple#itatii sunt: 0 transmiterea de mesajeL 0 de&inirea unui protocol de comunicatie simplu si8 in acelasi timp8 general. "tapele de reali.are a unui program orientat pe obiecte respecta in general etapele pre.entate pana acum8 la programarea ba.ata pe obiecte. "le sunt: 1. /rearea de clase8 ce de&inesc repre.entarea si comportamentul obiectelorL !. /rearea de obiecte8 instante ale claselorL $. /rearea programului8 3a.ut ca o sec3enta de comunicari intre obiecte (programul &iind un sir de mesaje). /u alte cu3inte8 programul este o colectie structurata de obiecte care comunica intre ele. ,!

Aceste etape 3or &i detaliate in sectiunea %.$8 succesiunea lor ba.andu0se pe urmatoarele obser3atii: 1. In proiectarea unui program este ne3oie de identi&icarea si clasi&icarea obiectelor ce concura la reali.area &unctiunilor programuluiL !. /lasi&icarea obiectelor impune ordine8 atat pentru sistemul real (o ordine naturala8 proprie acestuia)8 cat si pentru modelele sale (logic si &i.ic)L $. :biectele se clasi&ica dupa caracteristicile lor comuneL %. In &unctie de locul de &olosire a obiectelor8 caracteristicile lor pot &i accentuate sau ignorateL '. :biectele cu aceleasi caracteristici se grupea.a in clase. Sa consideram un produs program destinat e3identei mar&urilor intr0un supermaga.in. Tinand cont de obser3atiile de mai sus8 primul lucru care trebuie &acut este identi&icarea obiectelor. In ca.ul nostru8 sistemul real este compus cel putin din urmatoarele categorii de obiecte (&iinte8 lucruri8 compartimente): 0 mar&uri8 0 maga.ii8 0 case de marcaj8 0 standuri de 3an.are8 0 personal8 0 cumparatori. )intre toate aceste obiecte8 3om discuta in continuare doar despre mar&uri. In sistemul real (supermaga.inul)8 obiectele (reale) care sunt manipulate (3andute) sunt mar&uri. Prin urmare am identi&icat obiectele reale si urmea.a sa le clasi&icam. In supermaga.in comerciali.ea.a o mare di3ersitate de mar&uri. )in multe considerente (o gestiune mai usoara8 atracti3itate si usurinta in gasirea mar&ii pentru cumparatori)8 spatiul comercial al supermaga.inului este impartit in raioane8 a caror denumire caracteri.ea.a genul de mar&uri comerciali.ate. I.ual putem gasi raioanele: 0 alimentar8 0 te#tile8 0 librarie0papetarie8 0 tutungerie8 0 cosmetice8 0 incaltaminte8 0 menaj8 0 electrice8 0 electronice8 0 articole de lu# s.a. Iata ca sistemul real o&era o clasi&icare a mar&urilor8 &acuta dupa di3erse proprietati ale acestora (pro3enienta8 utili.are). "ste &iresc ca aceasta clasi&icare naturala sa se prelungeasca si in modelele logic si &i.ic ale sistemului real. Prin urmare8 putem discuta de obiectul KA25A8 care are ca descendenti obiectele A6IK"HTA2"8 T"<TI6"8 6IB2A2I"8 TITIH "2I"8 /:SK"TI/"8 IH/A6TAKIHT"8 K"HAh8 "6"/T2I/"8 "6"/T2:HI/"8 A2TI/:6" )" 6I<. ,$

/aracteristicile comune ale tuturor mar&urilor le 3om grupa in obiectul KA25A. In anali.a care trebuie &acuta8 trebuie considerate obiectele din di3erse puncte de 3edere. Pentru un cumparator sunt importante &unctionalitatea si pretul de 3an.are. 5unctionalitatea este o caracteristica mai greu de cuanti&icat8 moti3 pentru care ea 3a &i tratata distinct la &iecare clasa in parte8 insa pretul este e#trem de important: in supermaga.ine di&erite8 aceeasi mar&a poate sa aiba preturi di&erite. )in punctul de 3edere al gestiunii maga.inului sunt importante si alte caracteristici8 ca de e#emplu: 0 codul mar&ii (ce asigura o identi&icare unica a ei)8 0 denumirea8 0 unitatea de masura8 0 pretul de acMi.itie8 0 pretul de transport8 0 adaosul comercial aplicat8 0 T4A8 0 stocul din depo.it8 0 intrari (acMi.itie de mar&a de la &urni.ori)8 0 iesiri (3an.are de mar&a). Inele dintre aceste caracteristici 3or ser3i la determinarea pretului de 3an.are. /aracteristicile de mai sus sunt comune tuturor mar&urilor. Pentru clasele de mar&uri enumerate8 se pot identi&ica si caracteristici speci&ice &iecareia8 ca de e#emplu: A6IK"HTA2" : termen de 3alabilitate T"<TI6" : tip &ire IH/A6TAKIHT" : marime "6"/T2I/" : putere consumata "6"/T2:HI/" : termen de garantie A2TI/:6" )" 6I< : acci.e Hatural8 &iecare din mar&urile mai sus enumerate8 &iind descendenti ai obiectului KA25A8 3or a3ea toate caracteristicile acestuia. Se obser3a deja reutili.area speci&icarii: obiectul de ba.a contine caracteristicile comune8 iar pentru descendentii acestuia se speci&ica numai ceea ce0i deosebeste de parinte. In e#plicatiile de mai sus8 am identi&icat si clasi&icat obiecte din sistemul real8 determinand caracteristicile comune sau speciali.ate ale lor. /on&orm ultimei reguli (')8 trebuie sa grupam aceste obiecte in clase. ruparea se poate &ace numai dupa ce caracteristicile obiectelor (grupurilor de obiecte) sunt scoase in e3identa. /laselor nu le mai corespund obiecte realeL clasele sunt descrieri abstracte ale obiectelor reale. /lasi&icarea acestor obiecte 3a &orma o ierarMie de clase. Pentru e#emplul nostru8 ierarMia clasei KA25A este ilustrata in &igura 1. Hatural8 &iecare subclasa a clasei KA25A poate &i la randul ei de.3oltata in continuare. ?@@@@@A cod unitate de masura stoc intrari ,%

BKA25AB denumire pret acMi.itie T4A iesiri C@@D@@E pret pret transport adaos comercial B ?@@@@@G@@@D@@@@@@@@@@@D@@@@@@@@@@@D@@@@@@@@@@@D@@@@@@@@ @@@@@@@A ?@@@@@G@@@@A?@@@G@@@A?@@@@@@G@@@@@A?@@@@G@@@@A?@@@@@G@@@@@A ?@@@@@@@@G@@@@@@A BA6IK"HTA2"BBT"<TI6"BBIH/A6TAKIHT"BB"6"/T2I/"BB"6"/T2:HI/"BBA2TI/:6" )" 6I<B C@@@@@@@@@@EC@@@@@@@EC@@@@@@@@@@@@EC@@@@@@@@@EC@@@@@@@@@@ @EC@@@@@@@@@@@@@@@E termen de tip marime putere termen de acci.e 3alabi0 &ire consumata garantie litate 5igura 1. IerarMia clasei KA25A :data clasele identi&icate8 trebuie reali.ata speci&icarea lor8 cand multe dintre elementele discutate in&ormal trebuiesc preci.ate. Ast&el8 unele dintre caracteristici sunt date8 ca de e#emplu denumirea8 codul8 unitatea de masuraL altele8 cum este pretul (de 3an.are) se pot calcula (pe ba.a unui algoritm de calcul). Primele sunt ceea ce am numit campuri sau 3ariabile de instanta8 iar ultimele sunt metode ale claselor respecti3e. /and am &acut identi&icarea caracteristicilor claselor nu am preci.at daca ele sunt campuri sau metode. Speci&icarea unei clase 3a cuprinde8 intr0o prima apro#imatie numele clasei8 speci&icarea campurilor si speci&icarea metodelor. ScMema generala de speci&icare a unei clase este data in &igura !. ?@@@@@@@@@@@@@@@@@@@@@@@@@A B /lasa B B nume8 identi&icator B ?@@@@@@@@@@@@@@@@@@@@@@A B /ampuri B B Speci&icare camp B B speci&icare campY1 B B nume si e#plicatie B B speci&icare campY! B B tip de date B B ... B C@@@@@@@@@@@@@@@@@@@@@@E B speci&icare campYn B ?@@@@@@@@@@@@@@@@@@@@@@A B Ketode B B Speci&icare metoda B B speci&icare metodaY1 B B nume si e#plicatie B B speci&icare metodaY! B B parametri &ormali B B ... B B algoritm B B speci&icare metodaYm B C@@@@@@@@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@@@@@@@@E 5igura !. ScMema de speci&icare a clasei Pentru clasa KA25A8 scMema de speci&icare este pre.entata in &igura $. )in ratiuni de spatiu8 numele unor caracteristici este truncMiat. ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @A B /lasa B Kar&a B B ,'

B /ampuri B B /od codul mar&ii8 numar intreg B B )enumire denumirea mar&ii8 sir de caractere B B IK unitatea de masura8 sir de caractere B B PretYacM pretul de acMi.itie8 numar real B B T4A procent T4A8 numar real B B AdaosYc procent adaos comercial8 numar real B B Stoc cantitatea e#istenta in maga.in8 B B numar intreg (real) B B Ketode B B PretYtr pret transport B B PretYtr :9 -.1 ; PretYacM B B PretY3 pret 3an.are B B PretY3 :9 PretYacM (1>(T4A>AdaosYc)/1--) B B > PretYtr B B Intrare(c) intrarea unei cantitati c din mar&a B B Stoc :9 Stoc > c B B Iesire(c) 3an.area unei cantitati c de mar&a B B Stoc :9 Stoc 0 c B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @E 5igura $. ScMema de speci&icare a clasei KA25A 2e3a.ad scMema de speci&icare a unui tip abstract de date8 pre.entata intr0o lectie anterioara putem constata ca speci&icarea claselor respecta aceasta scMema. )in moti3e de spatiu8 in speci&icarile de mai sus nu am detaliat partea a&erenta operatiilor TA) (numite aici metode). In plus &ata de speci&icarea TA)8 dupa cum se 3a 3edea in paragra&ul urmator8 speci&icarea clasei contine si alte elemente. %.1.$. Kostenirea Kostenirea permite de&inirea de noi clase8 pe ba.a celor e#istente (ultimele sunt numite clase de ba.a sau clase parinti sau superclase). Hoile clase ast&el obtinute se numesc clase deri3ate8 subclase sau clase descendente ale claselor de ba.a8 ele &iind speciali.ari ale acestora. /a regula generala8 o clasa deri3ata mosteneste toate caracteristicile (starea si comportamentul) clasei de ba.a8 iar speciali.area (di&erentele in stare sau comportament &ata de clasa de ba.a) poate insemna: 0 ignorarea unor caracteristici ale clasei de ba.a (mai rar intalnita)L 0 adaugarea unor noi caracteristici (3ariabile de stare sau metode)8 numita speciali.are prin imbogatireL 0 modi&icarea unor caracteristici ale clasei de ba.a (in general modi&icarea unor metode)8 adica speciali.area prin inlocuire. Prin urmare8 mostenirea permite ca in clasa deri3ata se se speci&ice doar caracteristicile noi. /a regula generala8 de&initia unei clase deri3ate contine: preci.area parintelui (parintilor) si preci.area noilor caracteristici. Acest lucru o&era doua prime a3antaje: 0 reutili.area de&initiilor si a codului: caracteristicile mostenite de la parinti nu mai trebuie nici speci&icate8 nici codi&icateL ,(

0 de&initii mai simple ale claselor deri3ate (se speci&ica mai putine elemente)8 deci o mai buna intelegere a speci&icarii si implementarii. "#ista doua tipuri de mostenire: simpla si multipla. Kostenirea simpla corespunde unei singure clase parinte8 iar mostenirea multipla presupune cel putin doi parinti. 2elatia de mostenire este o legatura intre clase8 de la &iu la parinte8 ce stabileste o relatie (partiala) de ordine pe multimea claselor. In ca.ul mostenirii simple8 ierarMia claselor se poate repre.enta ca un arbore (arborele de mostenire8 un nod corespun.and unei clase)8 ce are ca radacina clasa de ba.a a ierarMiei8 cea mai generala clasa (ce concentrea.a caracteristicile comune ale tuturor claselor din ierarMie). In ca.ul mostenirii multiple8 ierarMia claselor se repre.inta sub &orma unui gra& (gra&ul de mostenire). In arborele (respecti3 gra&ul) de mostenire se pot considera subarbori (subgra&e)8 in care radacina este clasa de ba.a a subarborelui (nodul initial al subgra&ului). In ca.ul mostenirii simple8 legatura parinte0&iu este de tipul unulYlaYmai multe (unui pYrinte ii corespund mai multi descendenti)8 iar in ca.ul mostenirii multiple8 legatura este de tipul maiYmulteYlaYmai multe (unui parinte ii corespund mai multi descendenti8 iar un descendent poate a3ea mai multi parinti). In ierarMia de mostenire8 o clasa a&lata intr0un nod intern sau terminal are doua tipuri de caracteristici: 0 caracteristici mostenite de la parinti (clasele a&late in a3al de ea in ierarMie)L 0 caracteristici proprii8 speci&icate in de&initia ei (&ie caracteristici noi8 &ie rede&iniri ale caracteristicilor parintilor). 2eluand e#emplele discutate in paragra&ul anterior8 trebuie sa preci.am ca scMema de speci&icare a unei clase trebuie sa contina8 pe langa elementele preluate de la speci&icarea TA) (nume8 campuri si metode)8 si preci.area parintilor (superclaselor) clasei in cau.a. Prin urmare8 o scMema completa de speci&icare a unei clase 3a a3ea structura pre.entata in &igura %. ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@A B /lasa B B nume B B Superclasa B B lista de superclase B B /ampuri B B speci&icarea campurilor B B Ketode B B speci&icarea metodelor B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@E 5igura %. ScMema completa de speci&icare a unei clase 5iecare dintre clasele speci&icate constituie o speciali.are a superclasei sale8 a3and &ie caracteristici noi (PutereYabs8 aranYie8 Acci.e8 TipY&ire8 /apacitate8 StandardY4/28 TaraY&urni.oare8 Pro3enienta8 TipYingrediente)8 &ie rede&inind caracteristici (metode) ale superclaselor (PretYtr8 PretY3). ,*

In &igura 1 este pre.entat arborele de mostenire cu radacina clasa KA25A. "3ident8 a3em de0a &ace in acest e#emplu cu o mostenire simpla8 toti descendentii a3and o singura superclasa8 KA25A. 2amanand in acelasi conte#t8 se pot da e#emple mai elaborate de ierarMii de mostenire. 6a inceput 3om e#empli&ica mostenirea simpla8 considerand trei descendenti ai clasei KA25A: "6"/T2I/"8 A2TI/:6Y)"Y6I< si A6IK"HT"8 care 3or a3ea la randul lor descendentii 52I I)"28 4I)": si ^:KA28 respecti3 :IA si BIS/IITI. ScMemele de speci&icare ale acestor clase sunt date in continuare8 in &igura '8 iar arborele de mostenire in &igura (. ?@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@A B /lasa B B /lasa B B /lasa B B "6"/T2I/" B B A2TI/:6Y)"Y6I< B B A6IK"HT" B B Superclasa B B Superclasa B B Superclasa B B KA25A B B KA25A B B KA25A B B /ampuri B B /ampuri B B /ampuri B B PutereYabs B B Acci.e B B TipY&ire B B Ketode B B Ketode B B Ketode B B /onsum B B PretY3 B B B C@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@E ?@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@@A B /lasa B B /lasa B B /lasa B B 52I I)"2 B B 4I)": B B ^:KA2 B B Superclasa B B Superclasa B B Superclasa B B "6"/T2I/" B B A2TI/:6Y)"Y6I< B B A2TI/:6Y)"Y6I< B B /ampuri B B /ampuri B B /ampuri B B /apacitate B B StandardY4/2 B B TaraY&urni.oare B B Ketode B B Ketode B B Ketode B C@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@@E ?@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@@@A B /lasa B B /lasa B B :IA B B BIS/IITI B B Superclasa B B Superclasa B B A6IK"HT" B B A6IK"HT" B B /ampuri B B /ampuri B B Pro3enienta B B TipYingrediente B B Ketode B B Ketode B B PretYtr B B B C@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@@@E 5igura '. Speci&icari de clase ?@@@@@@@A B KA25A B C@@@D@@@E ?@@@@@@@@@@@@@@@@@@G@@D@@@@@@@@@@@@@@@@@@@@0A ?@@@@@G@@@@@A ?@@@@@@@G@@@@@@@@A ?@@@@@G@@@@A ,+

B "6"/T2I/" B B A2TI/:6Y)"Y6I< B B A6IK"HT" B C@@@@@D@@@@@E C@@@@@@@D@@@@@@@@E C@@@@@D@@@@E B ?@@@@G@@@@@A ?@@@@@G@@0A ?@@@@@G@@@@A ?@@@@G@@A ?@@@G@@@A ?@@G@@A ?@@@@G@@@@@A B 52I I)"2 B B 4I)": B B ^:KA2 B B :IA B B BIS/IITI B C@@@@@@@@@@E C@@@@@@@E C@@@@@@@E C@@@@@E C@@@@@@@@@@E 5igura (. Arbore de mostenire Anali.and arborele de mostenire din &igura (8 remarcam simplitatea lui (&apt po.iti3) pe de o parte8 dar si rigiditatea ierarMiei (&apt negati3)8 pe de alta parte. Ar parea normal ca 4I)": sa &ie si descendent al clasei "6"/T2I/"8 pentru ca &uncYionea.a cu curent electric8 insa acest lucru nu este posibil in mostenirea simpla. Pentru a e#empli&ica mostenirea multipla8 ramanem in acelasi conte#t8 considerand in plus clasele P"2ISABI6"8 52A I6" si A6T"2ABI6" si rescriind speci&icatiile claselor 4I)":8 ^:KA2 si :IA. IerarMia de clase ast&el obtinuta este mai comple#a8 insa relatiile dintre clase sunt acum mai naturale. Am putut ast&el sa consideram ca 4I)": are atat caracteristicile unui aparat electric ("6"/T2I/")8 cat si cele ale unui A2TI/:6Y)"Y6I<. In plus8 cele trei noi clase introduse asigura o mai buna ierarMi.are a mar&urilor: P"2ISABI6" (mar&uri care trebuie transportate cu mijloace de transport adec3ate8 deci necesita conditii speciale de manipulare si transport)8 52A I6" (mar&uri ce trebuie manipulate si transportate cu atentie8 ca sa nu se sparga) si A6T"2ABI6" (care se deprecia.a rapid in timp)8 descendenta a clasei P"2ISABI6". In toate aceste situatii8 pretul de transport 3a include cMeltuieli suplimentare (datorate &ie mijloacelor speciale de transport8 &ie restrictiilor de timp)8 deci in speci&icarea claselor metoda cu numele PretYtr 3a &i rede&inita. Hoile speci&icatii sunt date in &igura *8 iar gra&ul de mostenire in &igura +. ?@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@A B /lasa B B /lasa B B /lasa B B P"2ISABI6" B B 52A I6" B B A6T"2ABI6" B B Superclasa B B Superclasa B B Superclasa B B KA25A B B KA25A B B KA25A B B /ampuri B B /ampuri B B P"2ISABI6" B B Temperatura B B B B /ampuri B B Ketode B B Ketode B B )ataYe#pir B B PretYtr B B PretYtr B B B C@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@E ?@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@A ?@@@@@@@@@@@@@@@@@@@A B /lasa B B /lasa B B /lasa B B :IA B B 4I)": B B ^:KA2 B B Superclasa B B Superclasa B B Superclasa B B A6IK"HT" B B A2TI/:6Y)"Y6I< B B A2TI/:6Y)"Y6I< B B A6T"2ABI6" B B "6"/T2I/" B B P"2ISABI6" B B 52A I6" B B 52A I6" B B /impuri B B /ampuri B B /ampuri B B TaraY&urni.oare B B Pro3enienta B B StandardY4/2 B B Ketode B ,,

B Ketode B B Ketode B B B C@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@E C@@@@@@@@@@@@@@@@@@@E 5igura *. Speci&icari de clase in ca.ul mostenirii multiple ?@@@@@@@A B KA25A B C@@@D@@@E ?@@@@@@@@@@@@@D@@@@@G@@@@@@@@@@@@D@@@@@@@@@@@@@D@@@@@@@@ @@@@@@0A ?@@@@@G@@@@@A ?@@@@@G@@@@@@@@@@A ?@@@@@G@@@@A ?@@@@@G@@@@@@A ?@@@@@G@@@@A B "6"/T2I/" B B A2TI/:6Y)"Y6I< B B 52A I6" B B P"2ISABI6" B B A6IK"HT" B C@@@D@@@D@@@E C@@@@@D@@@@@@@@D@E C@@@D@@@@@DE C@@D@@@@@D@@@E C@@D@@@@D@@E B B B B B B ?@@@@E B B B B B B B B B B ?@@@@@@@@G@@@A B B B B B ?@@@@@@F@@@@@@@E B B B A6T"2ABI6" B B B B B BB B B B C@@@@@D@@@@@@E B B B C@@@@@@@@@A B B B ?@@@@@@@@@F@E B B B B BBB B B B ?@@@@@@@E B B B BBB B B B B ?@@@@@@@@@@@@@@@@@@E B ?@@G@@@@@@@A ?@G@G@G@A ?G@@@G@@A ?G@G@GA ?@@@@@@@G@@A B 52I I)"2 B B 4I)": B B ^:KA2 B B :IA B B BIS/IITI B C@@@@@@@@@@E C@@@@@@@E C@@@@@@@E C@@@@@E C@@@@@@@@@@E 5igura +. ra& de mostenire /on&orm noilor speci&icatii8 clasele A6T"2ABI6"8 4I)":8 ^:KA2 si :IA au mai multe superclase directe8 prin urmare ierarMia de mostenire se repre.inta sub &orma unui gra&. 5ie / o class si A o caracteristica a ei. )aca A este mostenita8 se pune problema determinarii superclasei S/ a lui / pentru care A este caracteristica proprie (S/ 3a &i clasa de la care / mosteneste caracteristica A). In ca.ul mostenirii simple8 e#ista un singur drum de la radacina arborelui de mostenire la nodul corespun.ator clasei /8 relatia de mostenire inducand o relatie de ordine pe multimea claselor e#istente in nodurile acestui drumL identi&icarea superclasei S/ se &ace prin parcurgerea respecti3ului drum in sens in3ers (de la nodul lui / spre radacina) si inspectarea &iecarui nod intalnit. Primul nod in care se gaseste de&initia caracteristicii A 3a corespunde clasei S/. In ca.ul mostenirii multiple8 e#ista mai multe drumuri (in ca.ul general) de la nodul clasei / la nodul initial al gra&ului de mostenire. Pot e#ista doua situatii: 0 caracteristica A apartine unui singur drum (/ mosteneste caracteristica A de la un singur parinte): determinarea clasei S/ se &ace pe acest drum8 la &el ca in ca.ul mostenirii simpleL 0 caracteristica A apartine la cel putin doua drumuri (/ mosteneste caracteristica A de la cel putin doi parinti)8 situatie numita con&lict de mostenireL in acest ca. trebuie (pe ba.a unei in&ormatii suplimentare) preci.at parintele de la care / mosteneste caracteristica AL intre 1--

modalitatile de re.ol3are a con&lictului de mostenire amintim: 0 stabilirea unei ierarMii intre parinti (aceasta ierarMie 3a dicta ordinea in care se iau in considerare drumurile)L 0 con&lictele sunt de &apt con&licte de numeL se poate incerca o scMimbare a numelor sau o cali&icare a lor cu numele clasei parinte (neelegant)L 0 mostenirea se speci&ica e#plicit8 in genul: &rom S/ inMerits A. (dela S/ mosteneste A). 2e3a.and e#emplul nostru8 un asemenea con&lict de mostenire apare in clasa :IA8 pentru care metoda PretYtr este mostenita atat de la clasa 52A I6"8 cat si de la clasa P"2ISABI6". In ast&el de situatii8 in scMema de speci&icare a clasei trebuie preci.at parintele de la care se mosteneste respecti3a caracteristica. : situatie analoaga poate sa apara si pentru campuri. 2elatia de instantiere este o legatura intre obiecte si clase: obiectul este o instanta a unei singure clase. Prin urmare8 aceasta legatura este de tipul unuYlaYunu (de la obiect la clasa). In3ers8 o clasa poate a3ea mai multe instante. Intr0o ierarMie de clase8 nu neaparat toate clasele pot a3ea instante. "#ista doua categorii de clase: 0 clasele abstracte8 ce nu generea.a instanteL de obicei ele sunt in partea superioara a ierarMiei (clase de ba.a)8 continand caracteristicile comune ale tuturor claselor descendenteL 0 clasele generatoare de instante8 ce se a&la in nodurile interioare sau terminale ale ierarMiei. 2e3a.and ierarMiile de mostenire ale clasei KA25A pre.entate in &igurile ( si +8 putem concMide ca KA25A este o clasa abstracta (in ca.ul mostenirii simple)8 respecti3 ca KA25A8 52A I6"8 P"2ISABI6" si A6T"2ABI6" sunt clase abstracte (pentru mostenirea multipla). /lasele "6"/T2I/"8 A2TI/:6Y)"Y6I< si A6IK"HT" se pot considera &ie abstracte8 &ie generatoare de instante8 pe cand 52I I)"28 4I)":8 ^:KA28 :IA8 BIS/IITI sunt doar clase generatoare de instante. Intre clasele abstracte8 un loc aparte il ocupY clasele generice sau clasele parametri.ate. )aca mostenirea permite ra&inarea caracteristicilor unei multimi de obiecte8 plecand de la cele comune si speciali.and8 obtinandu0se o ierarMie in care &iecare clasa are cel putin o caracteristica di&erit in raport cu celelalte8 genericitatea inseamna acelasi comportament pentru clase di&erite. )e e#emplu8 o sti3a de intregi8 o sti3a de siruri de caractere sau o sti3a de inregistrari P"2S:AHA 3or a3ea (toate) comportamentul generic al sti3ei (operatiile PusM8 Pop si Top)8 dictat de disciplina de ser3ire 6I5: (6ast In 5irst :ut). /eea ce di&era la cele trei e#emple de sti3e este tipul elementului supus manipularii: intreg8 sir de caractere8 inregistrare de tip P"2S:AHA. enericitatea (in acele limbaje in care este implementata) permite parametri.area claselor. Pentru e#emplul nostru8 3a &i su&icienta declararea unei clase Sti3aWTUpeX unde TUpe este tipul generic al elementului sti3ei. Itili.area acestei clase generice in ca.urile particulare enumerate inseamna instantierea acestei clase generice: Sti3aInt 9 ne1 Sti3aWIntegerXL Sti3aStr 9 ne1 Sti3aWStringXL 1-1

Sti3aP"2 9 ne1 Sti3aWP"2S:AHAXL Instantele unei clase generice sunt 3a.ute di&erit in limbaje di&erite. Spre e#emplu8 in Ada (clasa9pacMet)8 instanta unui pacMet generic este tot un pacMet8 generator de instante terminale (obiecte). /a si in ca.ul mostenirii8 genericitatea are ca e&ect reutili.area codului scris. %.1.%. Polimor&ismul Intr0un program pot e#ista obiecte di&erite8 care sa &ie instante ale unor clase legate intre ele prin relatia de mostenire. 6e numim obiecte inrudite (polimor&ice) deoarece: 0 ierarMia claselor ale caror instante sunt are o clasa radacina8 clasa de ba.aL 0 clasa de ba.a de&ineste protocolul de comunicatie comun tuturor obiectelor inrudite: toate obiectele sunt capabile sa raspunda la aceleasi mesaje (cum raspund e alta problema8 important este ca inteleg aceleasi mesaje)L 0 sunt de tipuri (instante de clase) di&erite. Stricto sensu8 polimor&ism inseamna mai multe &orme (aspecte8 in&atisari). Termenul este imprumutat din biologie8 unde se de&ineste ast&el: 3ariatie in &orma si &unctiile membrilor unor specii cu stramosi comuni in arborele de e3olutie (di3ersitate mor&o&i.iologica in acelasi plan sau in planuri di&erite de structura). In terminologia P::8 prin polimor&ism intelegem abilitatea de a: 1. pune obiecte inrudite intr0un tablou sau colectieL !. utili.a protocolul de comunicatie pentru a transmite mesaje obiectelor indi3iduale8 printr0o re&erire unitara (ca elemente de tablou sau colectie). In primul e#emplu8 toate mar&urile ce se comerciali.ea.a in supermaga.in &ormea.a o asemenea colectie de obiecte polimor&ice. "le au in comun acelasi protocol de comunicatie (de&init in clasa radacina a ierarMiei de mostenire8 KA25A)8 pe de o parte8 &iind insa instante ale unor clase di&erite8 pe de alta parte. Spre e#emplu8 orice mar&a se manipulea.a (se acMi.itionea.a de la &urni.ori si se 3inde)8 deci asupra ei se e#ecuta operatii ca Intrare si Iesire si are un pret (determinat cu metoda PretY3). Pentru operatiile Intrare si Iesire8 metoda de calcul este descrisa in clasa KA25A (5igura $)8 ea &iind general 3alabila in ca.ul oricarei mar&i. Hu acelasi lucru se intampla in ca.ul metodei PretY38 care este rede&inita in ca.ul clasei A2TI/:6Y)"Y6I<8 deoarece pentru aceste articole se aplica ta#e &iscale mai mari8 numite acci.e. In e#emplu de algoritm pentru pretul de 3an.are al articolelor de lu# ar putea &i: A2TI/:6Y)"Y6I<.PretY3 :9 KA25A.PretY3 > PretYacM ; Acci.e / 1-Prin urmare8 daca a3em o mar&a K si dorim sa a&lam pretul ei de 3an.are8 pentru acest e#emplu simpli&icat con3entia de apelare ar putea &i: K.PretY3 unde PretY3 are semni&icatia A2TI/:6Y)"Y6I<.PretY3 daca K este articol de lu#8 1-!

respecti3 KA25A.PretY3 cand K este o alta mar&a (K 3a mosteni PretY3 de la clasa de ba.a KA25A). Se remarca &olosirea aceleiasi notatii8 deci simpli&icarea scrierii. Acesta este un prim e#emplu (mai simplu) de polimor&ism8 reali.at numai cu ajutorul mostenirii. : situatie analoaga este o&erita de metoda PretYtr8 care este rede&inita in clasa :IA (in ca.ul mostenirii simple)8 respecti3 in clasele P"2ISABI6" si 52A I6" (la mostenirea multipla). /e se intampla insa cand o metoda (cum este PretYtr) rede&inita intr0o clasa &iu trebuie &olosita in clasa de ba.aN Spre e#emplu8 re3a.and algoritmul de calcul al pretului de 3an.are pentru clasa KA25A (&igura $)8 KA25A.PretY3 :9 KA25A.PretYacM > (1 > (KA25A.T4A > KA25A.AdaosYc) / 1--) > KA25A.PretYtr ne punem intrebarea: cum se 3a calcula :IA.PretY3N 2aspunsul nu este asa de simplu cum pare la prima 3edere. "lementele de calcul ale pretului trebuie sa &ie caracteristici (campuri sau metode) ale clasei :IA8 deci :IA.PretY3 :9 :IA.PretYacM > (1 > (:IA.T4A > :IA.AdaosYc) / 1--) > :IA.PretYtr )intre acestea8 doar PretYtr este metoda proprie clasei :IA (&iind rede&inita in speci&icarea '8 la mostenirea simpla8 respecti3 mostenita de la 52A I6" sau P"2ISABI6" in speci&icarea *8 la mostenirea multipla). Toate celelalte elemente de calcul sunt proprii clasei KA25A8 prin urmare pretul ar trebui sa se calcule.e ast&el: :IA.PretY3 :9 KA25A.PretYacM > (1 > (KA25A.T4A > KA25A.AdaosYc) / 1--) > :IA.PretYtr Suntem deci in situatia cand8 pentru a se obtine un re.ultat corect8 o metoda de&inita in clasa de ba.a trebuie sa apele.e o metoda dintr0o clasa deri3ata. Aceasta este a doua &ata a polimor&ismului8 mult mai atracti3a8 dar mai greu de reali.at. )in pacate8 numai mostenirea nu este su&icienta pentru a pune in practica acest lucru8 deoarece8 asa cum am aratat in %.1.$8 relatia de mostenire este o legatura de la &iu la parinte8 deci de la clasa deri3ata la clasa de ba.a. )e&initia metodei PretY3 &iind &acuta in clasa de ba.a8 KA25A8 &olosind (numai) relatia de mostenire se 3a ajunge la o de&initie de &orma: :IA.PretY3 :9 KA25A.PretYacM > (1 > (KA25A.T4A > KA25A.AdaosYc) / 1--) > KA25A.PretYtr ast&el: 1) pentru :IA.PretY3 se deduce (din arborele sau gra&ul de mostenire) ca KA25A este clasa in care PretY3 este metoda proprieL !) Pentru elementele de calcul (PretYacM8 T4A8 AdaosYc8 PretYtr) se deduce ca toate sunt proprii clasei KA25AL daca n0ar &i asa8 ele ar &i cautate 1-$

in ierarMia de mostenire8 in superclasele clasei KA25A (daca ar e#ista asemenea superclase) si nicidecum inapoi8 in subclase. In conclu.ie8 putem re.uma caracteristicile polimor&ismului ast&el: 1. Polimor&ismul necesita mostenire. 5ara mostenire nu am a3ea o clasa de ba.a8 deci nu ar e#ista protocolul comun de comunicatieL !. Kostenirea nu este su&icienta pentru reali.area polimor&ismului8 &iind ne3oie de mecanisme suplimentare. In cele ce urmea.a 3om discuta modul in care interactionea.a aceste doua mecanisme si de ce mecanisme noi mai e ne3oieL $. Polimor&ismul simpli&ica munca programatorului8 uni&ormi.and sinta#a mesajelor si micsorand comple#itatea programelor. )i&erentele dintre polimor&ism si mostenire le putem discuta in raport cu trei aspecte: scop8 arie de cuprindere si e&ecte. Kostenirea are ca scop ierarMi.area claselor (tipurilor de date)8 in ideea unei mai bune structurari a uni3ersului obiectelor8 prin eliminarea redundantelor8 iar polimor&ismul simpli&ica comunicarea cu sau intre obiectele inrudite. )in punctul de 3edere al ariei de cuprindere8 mostenirea implica toate caracteristicile claselor (campuri si metode)8 pe cand polimor&ismul are ca obiect doar metodele ce de&inesc protocolul de comunicatie (de &apt numai metodele 3irtuale8 de&inite in cele ce urmea.a8 3e.i %.1.'). Kostenirea are ca e&ect reutili.area codului si permite mani&estarea polimor&ismuluiL polimor&ismul utili.ea.a mostenirea pentru a construi ierarMii de tipuri polimor&ice8 ce au in comun acelasi protocol de comunicatie8 de&init in clasa de ba.a. %.1.'. /onsideratii de speci&icare si implementare a P:: %.1.'.1. /lasa ca tip abstract de date In secYiunile anterioare8 am asimilat o clasa de obiecte cu un TA). 5ata de scMema generala de speci&icare a unui TA)8 trebuie considerate noi aspecte8 legate de: 0 speci&icarea mosteniriiL 0 regulile noi de 3i.ibilitate si acces induse de mostenireL 0 speci&icarea operatiilor (metodelor). Speci&icarea mostenirii apare la de&inirea unei subclase8 cand trebuiesc &acute preci.ari pri3ind: 0 parintele (in mostenirea simpla)L 0 parintii si ierarMi.area lor (in mostenirea multipla). 2egulile de 3i.ibilitate si drepturile de acces s0au ra&inat. In &unctie de 3i.ibilitatea lor in e#terior8 caracteristicile unei clase se grupea.a in (e#emplu: limbajul />>): 0 publice (se pot accesa si/sau modi&ica in e#terior)L 0 pri3ate (nu se pot accesa si/sau modi&ica in e#terior)L 0 protejate (se pot accesa si/sau modi&ica doar in subclase). In plus8 la speci&icarea mostenirii se pot pre3edea modi&icatori de acces ai caracteristicilor claselor parinti: 1-%

0 public: pastrea.a aceleasi drepturi de acces pentru descendenti la caracteristicile mosteniteL 0 pri3at: inter.ice accesul pentru descendenti la caracteristicile mostenite. In s&arsit8 o alta modalitate de acces este o&erita de clasele prietene (&riend in limba engle.a). )aca o clasa / este prietena a unei clase /J8 atunci / 3a a3ea acces la campurile pri3ate ale clasei /J. 6a TA) am discutat tipurile de operatii dupa &unctionalitatea lor. In ca.ul claselor din P::8 unele operatii capata noi 3alente (constructorii si destructorii) si apare o alta clasi&icare a operatiilor8 dupa criteriul momentului legarii (metode statice si 3irtuale). In paragra&ul urmator 3om detalia noile aspecte mentionate. %.1.'.!. /lasa in P:: /onstructori si destructori In P::8 constructorii sunt speci&ici claselor. In a&ara &unctiilor cunoscute deja de la programarea ba.ata pe obiecte (creare de obiecte8 cu initiali.area unor 3ariabile de stare)8 in P:: constructorii au si o alta &unctie: pun _semnatura_ clasei in obiect. Practic8 ne putem imagina acest lucru in &elul urmator: un obiect : al unei clase / 3a &i o 3ariabila ce 3a contine: 0 spatiu pentru 3ariabilele de stare (in con&ormitate cu de&initia clasei /)L 0 o legatura spre clasa / (un pointer8 de e#emplu)8 ce repre.inta materiali.area relatiei de instantiere. A3em o prima regula: 21. :rice obiect : al unei clase / se construieste prin apelul unui constructor. ()aca regula 21 ar &i incalcata8 ar putea e#ista obiecte care sa nu0si recunoasca prototipul8 adica clasa ale carei instante sunt). In&ormatia de instantiere este utila la e#ecutie8 cand cu ajutorul ei se poate determina e#act clasa instantei (obiectului). Aceasta regula este 3alabila in ca.ul programarii orientate pe obiecte. In programarea ba.ata pe obiecte nu este necesara e#istenta constructorilor in acceptiunea de mai sus. Analog8 un destructor (in a&ara &unctiilor deja cunoscute) trebuie sa distruga si in&ormatia de instantiere. 6egare statica si dinamica 6imbajele de programare &olosesc din plin notiunea de identi&icator. Prin identi&icatori8 programatorul &ace notatii (intre altele) pentru 3ariabile si subprograme. In identi&icator poate &i 3a.ut in doua momente distincte: declararea si re&erirea. In general8 o declarare a unei 3ariabile se &ace &olosind un tip de date cunoscut8 iar declararea unui subprogram 1-'

respecta cerintele sintactice ale &iecarui limbaj in parte: se speci&ica de obicei tipul subprogramului (procedura sau &unctie8 la ultima si tipul re.ultatului obtinut) si lista parametrilor &ormali (nume si tip). Incepand cu abstracti.area datelor8 putem 3orbi atat de declararea unui subprogram (3a.ut ca o operatie a unui TA))8 cat si de de&inirea acestuia. )eclararea se &ace in partea publica a modulului (inter&ata acestuia) si in unele limbaje nu speci&ica decat tipul parametrilorL de&inirea preci.ea.a codul8 ea &iind proprie implementarii modulului. Prin legare intelegem o operatie ce are loc intr0un program traducator (compilator sau interpretor)8 ce consta in inlocuirea re&eririi unui identi&icator (nume de 3ariabila sau de procedura ce apare in te#tul sursa) printr0o adresa (din codul programului8 re.ultat in urma traducerii). In ca.ul compilatoarelor8 &a.ele de compilare si e#ecutie ale aceluiasi program se des&asoara la momente di&erite de timp (intai compilarea integrala a te#tului sursa si apoi e#ecutia codului re.ultat in urma compilarii). In scMimb8 in interpretoare aceste doua &a.e se des&asoara principial una dupa alta pentru &iecare linie sursa (intai traducere8 apoi e#ecutie). In limbajele de programare dotate cu compilatoare8 spunem ca legarea este statica8 in sensul ca8 intr0o &a.a oarecare a traducerii8 compilatorul poate asocia re&eririi unui nume o adresa: adresa unei 3ariabile (cand a3em un nume de 3ariabila) sau adresa punctului de intrare a unui subprogram (cand a3em un apel de procedura sau de &unctie). /um de obicei declararea unui identi&icator precede re&erirea lui8 declararea are ca e&ect &ie alocarea de spatiu in cod (pentru 3ariabile)8 &ie generarea de cod (pentru subprograme)8 in ambele ca.uri memorandu0se (sa .icem ca in tabela de simboluri) corespondenta nume0adresa (de 3ariabila sau de punct de intrare). Si ca sa &im si mai e#acti8 ceea ce nu poate re.ol3a compilatorul (in ca.ul compilarii separate a programelor) 3a re.ol3a editorul de legaturi8 principiul ramanand acelasi. In ca.ul limbajelor puternic tipi.ate8 in momentul legarii se mai &ac si alte 3eri&icari de compatibilitate: 0 a tipurilor (pentru 3ariabile)L 0 a listelor de parametri actuali (pentru apelurile de subprograme). In limbajele de programare dotate cu interpretoare8 spunem ca legarea este dinamic8 ea a3and loc in momentul e#ecutiei. 5iecare dintre tipurile de legare discutate pre.inta a3antaje si de.a3antaje8 pe care nu le discutam aici. Implementarea polimor&ismului Am 3a.ut ca polimor&ismul presupune tratarea unitara a obiectelor inrudite8 ce au in comun acelasi protocol de comunicatie8 de&init de clasa de ba.a. In &apt8 protocolul de comunicatie inseamna o lista de identi&icatori (nume de metode de&inite in clasa de ba.a). Am 3a.ut de asemenea ca obiectele inrudite nu au comportament identic8 deci un acelasi identi&icator de metoda poate sa re&ere metode semantic di&erite (deci actiuni di&erite) pentru doua obiecte din clase di&erite. 1-(

Kanipularea obiectelor polimor&ice inseamna parcurgerea etapelor: 1. Se declara o colectie (lista8 tablou) de obiecte in care un element al colectiei are tipul clasei de ba.aL !. Se creea.a si se introduc in colectie obiecte de tipuri descendente ale clasei de ba.a (colectia 3a &i Meterogena)L crearea de obiecte se 3a &ace apeland constructorii proprii claselor respecti3e8 care 3or pune semnatura clasei in instanteL $. "senta polimor&ismului este ca toate elementele colectiei se pot trata unitar in maniera: send("/8SW8AX) sau "/.S(A) unde: "/ (receptorul) este un element al colectieiL S (selectorul8 numele metodei) apartine protocolului de comunicatie de&init de clasa de ba.a. /onsideram ca discutam despre un limbaj dotat cu compilator. Se pune intrebarea: Se poate &olosi legarea statica pentru implementarea polimor&ismuluiN 2aspunsul este IH HI /AT" :2I/[ Sa 3edem de ce. 1. 6a compilare nu se cunoaste e#act clasa receptorului "/8 ci doar clasa de ba.a a lui8 pe ba.a instructiunii de declarare a colectiei. Ar &i bine doar daca clasa "/ coincide cu clasa de ba.aL !. Kesajul de mai sus se traduce printr0un apel al metodei SL la compilare se 3a alege in toate ca.urile (indi&erent carei clase ar apartine "/) metoda S a clasei de ba.a. )in nou ar &i bine doar daca clasa "/ coincide cu clasa de ba.a sau daca metoda corespun.atoare clasei "/ ar &i mostenita din clasa de ba.aL $. /a sa se aleaga metoda adec3ata clasei lui "/8 ar trebui sa se cunoasca clasa lui "/8 deci compilatorul ar trebui sa aiba acces la repre.entarea obiectului "/ (unde se gaseste si _semnatura_ clasei8 pusa de constructor). Indi&erent daca "/ este un obiect static sau dinamic8 el 3a e#ista numai dupa apelul constructorului8 care apel inseamna o actiune e&ectuata la e#ecutia programului8 si nu la compilare. /Miar daca la compilare a3em acces la repre.entarea obiectului (cand acesta este alocat in segmentul de dateL n0am a3ea acces daca este alocat in sti3a sau in Meap)8 in&ormatia de instantiere nu este completata8 deci nu se poate deduce clasa obiectuluiL %. /um se poate &ace distinctie intre metode care se leaga static si cele care se leaga dinamicN 6a aceasta intrebare nu putem inca raspunde8 dar trebuie sa a3em in 3edere o atare situatie. )in discutia de mai sus re.ulta ca (pentru compilatoare): 0 polimor&ismul se poate implementa numai prin legare dinamicaL 0 protocolul de comunicatie trebuie sa preci.e.e si tipul legarii (legare 1-*

statica sau legare dinamica). Ketode statice si 3irtuale Am 3a.ut ca pentru o colectie de obiecte polimor&ice8 clasa de ba.a de&ineste protocolul de comunicatie. In acelasi timp8 am constatat ca nu este su&icienta de&inirea metodelor comune8 compilatorul trebuind sa cunoasca si tipul legarii pentru &iecare dintre metodele ce &ormea.a protocolul de comunicatie (celelalte metode se 3or lega static). Acesta este ultimul impediment in implementarea polimor&ismului si el se re.ol3a prin asa0numitele metode 3irtuale. Termenul de procedura 3irtuala este introdus pentru prima data in Simula(*8 &iind preluat intre altele de />> (&unctie 3irtuala) si Turbo Pascal (metoda 3irtuala). A3em8 prin urmare8 inca un criteriu de clasi&icare a metodelor unei clase8 dupa momentul legarii lor: 0 metode statice (legare statica8 la compilare)L 0 metode 3irtuale (legare dinamica8 la e#ecutie). /u aceste preci.ari8 putem de&ini mai e#act protocolul de comunicatie8 ca &iind &ormat din metodele 3irtuale ale clasei de ba.a. Proiectarea protocolului de comunicatie trebuie sa respecte regulile: 2!. /onstructorii nu pot &i metode 3irtualeL (ei sunt responsabili cu _identitatea_ obiectelor8 deci trebuie legati static)L 2$. )estructorii pot &i metode 3irtualeL 2%. )aca o metoda 4 este declarata 3irtuala intr0o clasa /8 toate rede&inirile ei din descendentii lui / 3or &i 3irtualiL 2'. Speci&icarea metodelor 3irtuale proprii trebuie sa corespunda celei din clasa de ba.a8 pentru orice clasa descendenta a clasei de ba.aL (optional8 la limbajele puternic tipi.ate8 cand compilatorul 3eri&ica lista parametrilor actuali) 2(. : clasa ce are metode 3irtuale trebuie sa posede cel putin un constructor. :biectele la munca Triada constructor 0 metoda 3irtuala 0 legare dinamica asigura implementarea corecta a polimor&ismului. In linii generale8 aceasta implementare presupune urmatoarele etape si con3entii: 1. Pentru &iecare clasa ce poseda metode 3irtuale8 compilatorul construieste tabela de metode 3irtuale (4irtual KetMod Table 4KT in Turbo Pascal8 4irtual 5unction Table 45T in Borland />>)8 ce contine pointeri la punctele de intrare ale acestora (perecMi de &orma numeYmetoda8 adresaYpunctYdeYintrare)L !. Semnatura clasei8 pe care constructorul o pune in &iecare obiect este de &apt un pointer la tabela de metode 3irtuale a clasei obiectuluiL $. In ca.ul legarii dinamice8 obiectul este cel care o&era in&ormatia necesara legarii8 in el e#istand re&erinta la tabela de metode 1-+

3irtuale ce trebuie consultata pentru a se re.ol3a apelul. %. Ketodele sunt considerate implicit staticeL declararea unei metode 3irtuale se &ace e#plicit. 2e3enind la mesajul: send(28SW8AX) sau 2.S(A) re.ol3area lui se poate discuta in doua iposta.e: 0 S este un nume de metoda staticaL 0 S este un nume de metoda 3irtuala. A. 6egarea statica 6egarea statica se reali.ea.a cand S este o metoda statica. Toate operatiile de mai jos se e#ecuta la compilare: 1. se determina clasa / a lui 2 (din declararea lui)L !. se 3eri&ica daca S este o metoda a clasei / (proprie sau mostenita)L $. )aca HI8 se 3a genera un mesaj de eroare (eroare de sinta#a)L %. )aca )A8 se 3eri&ica lista parametrilor actuali cu declararea metodei (daca e#ista o lista de parametri actuali si daca limbajul este puternic tipi.at)L '. )aca totul este :b8 se &ace legarea statica (mesajul se traduce prin salt la punctul de intrare al metodei gasite). :bser3atie Inele limbaje (/>>8 Ada) permit e#istenta unor proceduri cu acelasi nume8 care di&era prin lista argumentelor (se spune ca numele sunt supraincarcate). In ca.ul lor8 trebuie &acuta o 3eri&icare in plus: metoda este identi&icata dupa nume si dupa lista argumentelor. B. 6egarea dinamica 6egarea dinamica este proprie colectiilor de obiecte polimor&ice. Prin urmare8 se tratea.a mesaje de &orma: send("/8SW8AX) sau "/.S(A) unde: "/ este un element al unei colectii polimor&iceL S este o metoda 3irtuala. Actiunile se des&asoara in doua momente distincte: compilare si e#ecutie. 6a compilare: 1. se determina / 0 clasa de ba.a a elementelor colectiei "/L !. se 3eri&ica daca S este o metoda (3irtuala) a lui /8 identi&icandu0se punctul de intrare in 4KT pentru SL 1-,

$. )aca )A8 se 3eri&ica sinta#a apeluluiL %. )aca sinta#a apelului este corecta8 se pune in cod adresa relati3a a metodei S din 4KT a lui /. 6a e#ecutie: 1. se determina / 0 clasa e&ecti3a a "/ (din "/ a3em adresa 4KTL de &apt se identi&ica 4KT a clasei e&ecti3e8 din semnatura pusa in obiectul "/ de constructor)L !. se identi&ica S in 4KT determinata la pasul anterior (1)8 pe ba.a adresei relati3e a lui S din 4KT8 determinata la compilareL $. din 4KT se ia punctul de intrare determinat la pasul ! si se continua la &el ca la legarea statica. In e#plicatiile de mai sus8 am considerat ca8 deoarece clasa de ba.a este cea care de&ineste protocolul de comunicatie (prin metodele sale 3irtuale)8 in tabelele de metode 3irtuale ale claselor deri3ate o metoda 3irtuala S 3a ocupa aceeasi locatie (3a a3ea aceeasi adresa relati3a a unui nume de metoda in toate 4KT ale unei ierarMii de clase). Prin urmare8 la compilare se 3a determina locatia din tabela (adresa relati3a) corespun.atoare metodei 3irtuale apelate8 iar la e#ecutie se 3a determina in care tabela de metode 3irtuale se &ace cautarea. 2e3enind la e#emplul discutat in %.1.%8 putem spune acum ca pentru a se obtine un calcul corect al pretului de 3an.are pentru clasa :IA8 metoda PretYtr trebuie declarata 3irtuala8 iar clasa :IA trebuie sa aiba un constructor speci&ic (analog clasele 52A I6" si P"2ISABI6" in ca.ul mostenirii multiple). In aceste conditii8 legarea metodei PretYtr se 3a &ace dinamic8 cautarea metodei 3irtuale in arborele sau gra&ul de mostenire incepand din clasa :IA. Se obser3a inca odata utili.area mostenirii8 deosebirea (&ata de legarea statica) &iind ca aceasta cautare are loc si in adancime (&iecare cautare incepe din clasa obiectului si nu din clasa in care apare pentru prima data re&erirea la caracteristica cautata8 in ca.ul nostru PretYtr). %.1.(. Pasi spre P:: Bertrand KeUer WKeU++X de&ineste conditiile pe care trebuie sa le indeplineasca un produs program si limbaj de programare orientat pe obiecte. In a&ara primei cerinte8 care da criteriul de proiectare8 toate celelalte se re&era la programare8 in sensul restrans al termenului: Primul ni3el corespunde obser3atiei: datele trebuie sa o&ere criteriul &undamental de structurare: Hi3elul 1 (Structura modulara ba.ata pe obiecte) Sistemele sunt modulari.ate pe ba.a structurilor de date proprii8 sau Proiectarea programelor are drept criteriu datele &olosite si nu &unctiile pe care programele trebuie sa le reali.e.e. Irmatorul pas reali.ea.a conectarea cu TA): 11-

Hi3elul ! (Abstracti.area datelor) :biectele trebuie descrise ca implementari ale TA). Al treilea pas este de natura mai putin conceptuala si mai mult practica8 re&lectand o cerinta importanta de implementare: cum se creea.a obiectele. Programatorii nu trebuie sa se preocupe de alocarea sau dealocarea memoriei pentru obiecte: Hi3elul $ ( estiunea automata a memoriei) :biectele neutili.ate trebuie dealocate de sistemul de ba.a (substrat) al limbajului8 &ara inter3entia programatorului. Irmatorul pas este cel care &ace o separare clara a limbajelor ba.ate pe obiecte de restul lumii. Se poate spune ca ecuatia de de&inire a acestor limbaje este identitatea: clasa 9 tip de date. Hi3elul % (/lase) :rice tip de date non0simplu este un modul si orice modul de ni3el inalt este un tip de date. /ali&icatorul _non0simplu_ &ace posibila pastrarea tipurilor de date prede&inite8 care nu sunt 3a.ute ca moduleL cu3antul _ni3el inalt_ permite e#istenta unitatilor de structurare a unui program (procedurile) care nu sunt tipuri. Irmatorul pas este o consecinta naturala a celui precedent: daca tipurile de date se identi&ica cu modulele8 suntem tentati sa identi&icam mecanismele de reutili.are o&erite de ambele concepte: 0 pe de o parte8 posibilitatea unui modul de a re&eri direct entitati de&inite in alt modulL 0 pe de alta parte8 conceptul de subtip8 prin care se poate de&ini un nou tip adaugand proprietati noi unui tip e#istent (ca un subdomeniu Integer din Pascal8 subtip al lui Integer cu preci.area limitei in&erioare si superioare a domeniului sau). Hi3elul ' (Kostenire) : clasa poate &i de&inita ca e#tensie sau restrictie a alteia. TeMnicile de mai sus descMid posibilitatea &olosirii polimor&ismului si legarii dinamice: Hi3elul ( (Polimor&ism si legare dinamica) "ntitatile unui program trebuie sa poata sa re&ere obiecte din mai multe clase8 iar operatiile trebuie sa aiba reali.ari di&erite in clase di&erite. 111

Irmatorul si ultimul pas e#tinde notiunea de mostenire pentru a permite reutili.area in mai multe conte#te. Aceasta inseamna mostenirea multipla. Hi3elul * (Kostenirea multipla si repetata) Trebuie sa se poata declara clase care sa mosteneasca de la mai multi parinti si/sau de mai multe ori de la aceeasi clasa. %.!. P2: 2AKA2" :2I"HTATA P" :BI"/T" IH TI2B: PAS/A6 %.!.1. /lase si obiecte in Turbo Pascal. Terminologie %.!.!. Kostenire. :biecte statice %.!.$. /onstructori si destructori. Ketode statice si 3irtuale. 6egare statica si dinamica. Implementarea obiectelor %.!.%. Proiectarea si implementarea metodelor 3irtuale %.!.'. /lase abstracte %.!.(. /olectii de obiecte polimor&ice %.!.1. /lase si obiecte in Turbo Pascal. Terminologie Turbo Pascal (TP) este in acelasi timp un mediu si un limbaj de programare puternic tipi.at8 ce poseda o e#tensie P:: incepand de la 3ersiunea '.'. 5iind un mediu de programare binecunoscut utili.atorilor de P/0uri8 Turbo Pascal este accesibil incepatorilor si capabil sa o&ere su&iciente instrumente pentru reali.area de aplicatii pro&esionale. In plus8 e#ista un mare numar de carti si articole de specialitate legate de el. )eoarece limbajul Pascal este &olosit pe scara larga in procesul de in3atare a programarii calculatoarelor (in scoli si uni3ersitati)8 Turbo Pascal cunoaste o mare popularitate in mediile academice8 &iind8 prin e#tensia P::8 un mijloc relati3 &acil de &amiliari.are cu conceptele programarii orientate pe obiecte. )in punctul de 3edere conceptual8 e#tensia P:: din Turbo Pascal se inspira din limbajele />> si :bject Pascal. 6a prima 3edere8 ar putea apare o con&u.ie in notatii. In TP8 o clasa este de tipul prede&init JobjectJ si se de&ineste (in 3ersiunea '.') cu ajutorul mecanismului JtUpeJ (propriu limbajului Pascal)8 in &orma: tUpe numeYclasa 9 objectW(numeYsuperclasa)X declaratii de campuri P publice Q speci&icari de metode endL /onceptual8 o clasa este tratata ca un tip 3irtual de date8 pentru ea &iind de&inite campurile (ce &ormea.a domeniul T4)) si operatiile (metodele). )e&initia de mai sus corespunde partii de inter&ata a unui T4)8 ea trebuind completata cu partea de implementare a metodelor. 6a implementare8 antetul unei metode este cali&icat cu numele clasei: procedure numeYclasa.numeYmetodaW(parametriY&ormali)XL sau &unction numeYclasa.numeYmetodaW(parametriY&ormali)X : tipL 11!

Instantele unei clase8 numite obiecte8 sunt declarate ca 3ariabile de tip numeYclasa: 3ar ob18ob! : numeYclasaL )eclaratia de mai sus corespunde unor obiecte statice (alocate in segmentul de date sau in sti3a de e#ecutie). 5olosind pointerii8 se poate lucra si cu obiecte dinamice8 alocate in Meap: tUpe pointerYnumeYclasa 9 =numeYclasaL 3ar pob18pob! : pointerYnumeYclasaL Apelul unei metode se &ace printr0un mesaj de &orma: ob1.numeYmetoda(listaYdeYparametriYactuali)L sau pob1=.numeYmetoda(listaYdeYparametriYactuali)L in care ob1 (respecti3 pob1=) este receptorul8 iar numele metodei este selectorul. Prin de&initia unei clase numeYclasa se speci&ica si inter&ata clasei respecti3e cu mediul e#tern. 2egulile de 3i.ibilitate permit ca atat campurile cat si metodele sa &ie 3i.ibile (deci utili.abile) in e#terior. )aca pentru metode acest lucru este normal8 accesul din e#terior la campuri (inclusi3 posibilitatea modi&icarii 3alorii lor) incalca una din regulile de ba.a ale abstracti.arii datelor: modi&icarea 3alorii campurilor unui obiect trebuie sa se &aca numai prin operatiile proprii obiectului respecti3. Pentru inlaturarea acestui neajuns8 in 3ersiunea (.- a limbajului Turbo Pascal e#ista posibilitatea declararii de metode si campuri pri3ate8 ce sunt in3i.ibile in e#terior. /ampurile pri3ate pot &i re&erite numai in partea de implementare a metodelor (publice sau pri3ate) ale obiectului8 iar metodele pri3ate ser3esc la implementarea celor publice. ScMema de de&inire a unei clase de obiecte in Turbo Pascal (.- este: tUpe numeYclasa 9 objectW(numeYsuperclasa)X declaratii de campuri publice speci&icari de metode publice pri3ate declaratii de campuri pri3ate speci&icari de metode pri3ate endL Pentru protejarea e&icienta a campurilor unui obiect8 se recomanda ca ele sa &ie declarate in .ona Jpri3ateJ. )e.a3antajul acestei metode de proiectare a claselor de obiecte consta in aceea ca utili.atorul nu 3a a3ea acces la aceste campuri8 nici macar pentru a citi 3aloarea lor. Acest 11$

impediment poate &i surmontat prin adaugarea de metode publice8 care sa &urni.e.e 3aloarea acestor campuri pri3ate. In acest &el8 campurile de3in accesibile in citire (read onlU)8 dar 3aloarea lor nu se 3a putea modi&ica decat prin metode. In speci&icarea 1 este de&inita clasa 6ocatie8 cu urmatoarele atribute: ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@A B campuri: <8` (pri3ate) B B metode: Init Pmodi&ica campurile < si ` ale obiectului B B la 3alorile speci&icate prin a< si a`Q B B </oord Pintoarce 3aloarea abscisei <Q B B `/oord Pintoarce 3aloarea ordonatei `Q B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@E TUpe P unit0ul I6oc.PAS Q 6ocatie 9 :bject procedure Init(a<8a`:Integer)L &unction </oord : IntegerL &unction `/oord : IntegerL pri3ate <8` : IntegerL "ndL Speci&icarea 1. /ampuri pri3ate si metode publice Ketodele publice </oord si `/oord au &ost concepute tocmai pentru a permite mediului e#tern (clientului) sa cunoasca 3aloarea coordonatelor obiectului. %.!.!. Kostenire. :biecte statice In Turbo Pascal mostenirea este simpla. Prin mostenire8 campurile superclasei se pastrea.a si nu pot &i rede&inite. In scMimb8 metodele unei superclase se pot rede&ini in con&ormitate cu comportamentul speci&ic al subclasei careia le apartin. In speci&icarea !8 se considera clasa Punct8 descendenta a clasei 6ocatie de&inita anterior. :biectul geometric punct (in plan) poseda doua coordonate si un atribut de 3i.ibilitate: el poate &i desenat (este 3i.ibil) sau nu. tUpe P unit0ul IPctS.PAS Q Punct 9 :bject(6ocatie) procedure Init(a<8a`:Integer)L P rescrie 6ocatie.Init Q procedure )esenea.aL P noua Q procedure AscundeL P noua Q &unction "4i.ibil : BooleanL P noua Q procedure KutaIn(nou<8nou`:Integer)L P noua Q procedure Translatea.a(pas:Integer)L P noua Q procedure 2oteste(centru:6ocatieL ungMi:Integer)L P noua Q &unction /aracteristici: StringL P noua Q procedure 6istea.aL P noua Q pri3ate 11%

4i.ibil : BooleanL "ndL

P nou Q

Speci&icarea !. Kostenire in Turbo Pascal Atributele clasei Punct sunt urmatoarele: ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@A B campuri:<8` (pri3ate si mostenite de la 6ocatie) B B 4i.ibil (pri3at) B B metode: Init Prede&ineste metoda Init de la 6ocatie B B initiali.ea.a in plus campul 4i.ibilQ B B </oord8 `/oord Pmostenite de la 6ocatieQ B B )esenea.a Pdesenarea obiectului pe ecranQ B B Ascunde Pstergerea obiectului de pe ecranQ B B "4i.ibil Pintoarce 3aloarea campului 4i.ibilQ B B KutaIn Pmuta obiectul in locatia nou<8 nou`Q B B Translatea.a Pe&ectuea.a o translatie8 marind B B 3alorile coordonatelor cu 3aloarea pasQ B B 2oteste Proteste obiectul in jurul locatiei B B centru8 cu ungMiul ungMiQ B B /aracteristici Pintoarce un sir de caractere ce B B contine 3alorile coordonatelorQ B B 6istea.a Pa&isea.a caracteristicile obiectuluiQ B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@E In aceasta speci&icare8 metoda Init a clasei Punct rede&ineste metoda omonima de la superclasa 6ocatie8 concreti.and comportamentul speci&ic al descendentului8 iar metoda "4i.ibil permite cunoasterea 3alorii campului 4i.ibil in mediul e#tern. TUpe /erc 9 :bject(Punct) procedure Init(a<8a`8a2a.a:Integer)L procedure )esenea.aL procedure AscundeL procedure KutaIn(nou<8nou`:Integer)L procedure Translatea.a(pas:Integer)L procedure 2oteste(centru:6ocatieL ungMi:Integer)L procedure Kareste(/u/it:Integer)L &unction 2a.a : IntegerL &unction /aracteristici : StringL pri3ate 2 : IntegerL "ndL Speci&icarea $. 2a&inarea mostenirii : ilustrare mai cuprin.atoare a rede&inirii metodelor este pre.entata in speci&icarea $8 corespun.atoare clasei /erc8 descendenta a clasei Punct. 11'

/onceptual8 obiectul geometric cerc are ca in3ariant un obiect geometric punct8 numit centrul cercului8 prin urmare mostenirea este naturala. In a&ara centrului8 cercul poseda o ra.a (atribut speci&ic). Atributele clasei /erc sunt urmatoarele: ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@A B campuri: <8`84i.ibil (pri3ate si mostenite de la Punct) B B 2 (ra.a8 pri3at) B B metode: Init Prede&ineste metoda Init de la Punct B B initiali.ea.a in plus campul 2Q B B </oord Pmostenita de la 6ocatieQ B B `/oord Pmostenita de la 6ocatieQ B B "4i.ibil Pmostenita de la PunctQ B B 6istea.a Pmostenita de la PunctQ B B )esenea.a Ptrasarea obiectului pe ecran B B rede&ineste metoda omonima de la PunctQ B B Ascunde Pstergerea obiectului de pe ecran B B rede&ineste metoda omonima de la PunctQ B B KutaIn Pmuta obiectul in locatia de&inita B B de coordonatele nou<8 nou` B B rede&ineste metoda omonima de la PunctQ B B Translatea.a Pe&ectuea.a o translatie8 marind B B 3alorile coordonatelor cu pas B B rede&ineste metoda omonima de la PunctQ B B 2oteste Proteste obiectul in jurul locatiei B B centru8 cu ungMiul ungMi B B rede&ineste metoda omonima de la PunctQ B B Kareste Pmareste ra.a cercului cu B B 3aloarea parametrului pasQ B B 2a.a Pintoarce 3aloarea campului 2Q B B /aracteristici Pintoarce un sir de caractere ce B B contine 3alorile coordonatelor si ra.eiQ B B rede&ineste metoda omonima de la PunctQ B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@E Ketoda 2a.a permite cunoasterea 3alorii ra.ei cercului in mediul e#tern. Ketodele Init8 )esenea.a8 Ascunde8 KutaIn8 2oteste si Translatea.a sunt rede&iniri ale metodelor omonime ale superclasei Punct8 ele concreti.and comportamentul speci&ic al clasei /erc8 di&erit de cel al parintelui sau Punct. Ast&el8 desenarea unui cerc inseamna desenarea centrului si a circum&erinteiL stergerea trebuie sa le ascunda. Kutarea unui cerc (de &apt mutarea centrului sau) presupune stergerea 3ecMii imagini8 mutarea centrului si desenarea noii imagini a obiectului. In mod analog se procedea.a si in ca.ul translatiei sau rotatiei obiectului /erc. Acest lucru 3a re.ulta cu e#actitate din implementarea claselor 6ocatie8 Punct si /erc8 care este data in continuare. Se obser3a gradul ridicat de simplitate al algoritmilor &olositi. "#emplul 1. Init0ul I6:/.PAS: Implementarea metodelor clasei 6ocatie 11(

"#emplul !. Init0ul IPctS.PAS: Implementarea metodelor clasei Punct "#emplul $. Init0ul I/ercS.PAS: Implementarea metodelor clasei /erc In implementarea metodelor claselor mai sus de&inite s0au &olosit proceduri si &unctii din doua unit0uri: rapM (unit sistem8 ce contine e#tensia gra&ica a limbajului Turbo Pascal) si I rapM (unit utili.ator). Pentru o mai usoara accesare a claselor enumerate8 s0au conceput trei unit0uri Turbo Pascal: I6oc pentru clasa 6ocatie8 IPctS pentru clasa Punct si I/ercS pentru clasa /erc. 5iecare unit contine in partea de inter&ata de&initia clasei8 iar in partea de implementare te#tele sursa ale metodelor. Itili.area instantelor claselor /erc si Punct este pre.entata in programele "#:bSt1.PAS si "#:bSt!.PAS. Primul dintre ele lucrea.a cu obiecte statice8 iar al doilea cu obiecte dinamice. :biectele din clasele Punct si /erc reactionea.a di&erit la mesajele )esenea.a8 Ascunde8 KutaIn8 2oteste8 Translatea.a8 6istea.a. Humele metodelor apelate este acelasi pentru o actiune data8 indi&erent de obiect (punct sau cerc)8 sugerand actiunea ce trebuie e&ectuata. "3ident8 metodele 3or a3ea implementari di&erite pentru cele doua clase Punct si /erc. Ar &i interesant de 3a.ut daca se poate lucra cu colectii de ast&el de obiecte polimor&e8 colectii care contin pointeri la obiectele respecti3e. In e#emplu simplu este programul "#:bSt$.PAS8 ce repre.inta transpunerea programului "#:bSt!.PAS8 colectia considerata aici &iind un tablou A de doua elemente8 cu elementul de tablou de tip Pointer6aPunct. )in pacate8 desi programele "#:bSt! si "#:bSt$ sunt ecMi3alente semantic (cel putin la prima 3edere)8 la e#ecutie ele se comporta di&erit8 in sensul ca al doilea obiect (re&erit de AW!X)8 cMiar daca este instanta a clasei /erc8 se comporta ca o instanta a clasei Punct. _Heca.ul_ este generat de instructiunea de atribuire: AW!X :9 P/L si nu poate &i e3itat nici printr0un subter&ugiu de &orma: He1(AW!X)L Palocarea obiectului dinamic re&erit de AW!XQ AW!X=.Init(1'-8!$-8'-)L deoarece protestea.a compilatorul (AW!X este Pointer6aPunct8 iar metoda Init din urmatoarea instructiune apartine clasei /erc). Acest program este o prima tentati3a de lucru cu obiecte polimor&ice. 2eamintim ca aceste obiecte sunt instante ale unor clase di&erite8 untre care e#ista relatia de mostenire si care pot sa raspunda la aceleasi mesaje. Se pune intrebarea: /um se re.ol3a lucrul cu obiecte polimor&ice in Turbo PascalN Anali.and te#tele sursa ale metodelor clasei /erc ce sunt rede&iniri ale metodelor clasei Punct8 constatam ca KutaIn8 Translatea.a8 2oteste si 6istea.a sunt identice din punctul de 3edere al apelului (este clar ca8 semantic8 actiunile sunt di&erite). Se pune intrebarea: 11*

Hu s0ar putea ca metodele amintite sa &ie mostenite de la clasa PunctN 2aspunsul la aceste doua intrebari este a&irmati3. In Turbo Pascal8 ca in toate limbajele orientate pe obiecte8 acest lucru se reali.ea.a prin actiunea conjugata a celor trei mecanisme discutate in sectiunea %.1.': constructorii si destructorii8 metodele 3irtuale si legarea dinamica. Pe langa acestea si in stransa legatura cu &olosirea constructorilor8 s0a pre3a.ut si o e#tensie a procedurilor standard He1 si )ispose. Sa le discutam pe rand. %.!.$. /onstructori si destructori. Ketode statice si 3irtuale. 6egare statica si dinamica. Implementarea obiectelor In e#emplele discutate pana acum8 mostenirea a &ost &olosita pentru campuri (clasele Punct si /erc mostenesc de la 6ocatie campurile < si `) si pentru metode (ale superclasei8 care nu sunt rede&inite in subclase: </oord8 `/oord). Ketode omonime ()esenea.a8 Ascunde8 KutaIn8 Translatea.a8 2oteste) au &ost de&inite in clasa Punct si au &ost rede&inite (toate) in clasa deri3ata8 /erc. Kai mult8 &iecare apel de metoda este re.ol3at la compilare8 in sensul ca se deduce8 din tipul receptorului8 clasa a carei metoda este apelata. )in acest moti38 in programul "#:bSt$ nu &unctionea.a polimor&ismul dinamic: desi P/ este pointer la cerc si obiectul re&erit de P/ este initiali.at ca atare8 prin atribuirea AW!X :9 P/ are loc o constrangere (elementele tabloului A sunt pointeri la punct) si in continuare compilatorul 3a considera ca AW!X re&era un punct8 selectand in consecinta metodele clasei Punct la intalnirea receptorului AW!X=. Aceasta maniera de legare a metodei la tipul clasei instantei a &ost numita in %.1.'.! legare statica. Toate metodele pre3a.ute in e#emplele discutate pana acum sunt metode statice (implicit8 orice metoda este statica in Turbo Pascal). /and un mesaj contine apelul unei metode statice cu selectorul numeYmetoda8 apelul se poate re.ol3a la compilare prin parcurgerea arborelui de mostenire de la clasa obiectului receptor (cunoscuta la compilare) spre radacina arborelui. Prima metoda gasita ce are ca selector numeYmetoda 3a &i metoda apelata si acest apel se re.ol3a in mod obisnuit (ca apelul unei proceduri din Pascal Standard). Algoritmic8 legarea statica pentru mesaje de &orma ob1.numeYmetodaYstatica(listaYdeYparametriYactuali)L sau pob1=.numeYmetodaYstatica(listaYdeYparametriYactuali)L inseamna: 1. Se determina clasa receptorului (ob1 sau pob1=)8 cunoscuta la compilare (ob1 sau pob1 sunt declarate ca 3ariabile)L !. Se selectea.a din dictionarul de metode al clasei respecti3e adresa punctului de intrare al metodei speci&icateL $. Se pune in cod apelul metodei respecti3e (salt la punctul de intrare a&erent procedurii in cau.a). )in punctul de 3edere al implementarii8 pentru o instanta a unei clase se 11+

aloca un numar de octeti egal cu suma lungimilor de repre.entare ale campurilor instantei (la &el ca la T) record). In ca.ul e#emplelor de mai sus8 se 3or aloca ' octeti pentru o instanta a clasei Punct: Si.e:&(Punct) 9 Si.e:&(<) > Si.e:&(`) > Si.e:&(4i.ibil)8 respecti3 * octeti pentru o instanta a clasei /erc: Si.e:&(/erc) :9 Si.e:&(Punct) > Si.e:&(2). Prin urmare8 in timpul e#ecutiei8 o instanta nu0si _cunoaste_ clasa sa. Acest lucru este 3alabil in situatia in care clasele nu poseda metode constructor8 toate e#emplele anterioare &iind din aceasta categorie. 2olul unui constructor este in primul rand acela de a atasa &iecarei instante _semnatura_ clasei la care aceasta apartine. In Turbo Pascal acest lucru se reali.ea.a atasand inca doi octeti repre.entarii &iecarei instante. In spatiul ast&el re.er3at8 constructorul 3a pune un pointer la tabela de metode 3irtuale (4KT) a clasei la care apartine instanta. In&ormatia de instantiere este accesibila numai in citire8 ea putand &i modi&icata doar printr0un alt constructor. 2eamintim ca8 pe langa aceasta &unctie (principala in P::)8 un constructor are de obicei sarcina de a initiali.a campurile instantei (rolul metodelor Init din e#emplele discutate) sau de a aloca memorie dinamica pentru instanta sau pentru acele campuri ale acesteia ce re&era 3ariabile dinamice. )istrugerea in&ormatiei de instantiere se &ace printr0o alta metoda speciala8 numita destructor in Turbo Pascal. Pe langa aceasta sarciba8 un destructor poate reali.a dealocarea memoriei dinamice alocata de constructor. : clasa poate a3ea mai multi constructori si destructori. Speci&icarea lor se &ace in de&initia clasei8 in &orma: constructor numeYconstructorW(parametriY&ormali)XL si destructor numeYdestructorW(parametriY&ormali)XL W3irtualLX iar implementarea lor se &ace in aceeasi maniera ca si implementarea celorlalte metode8 antetele &iind: constructor numeYclasa.numeYconstructorW(parametriY&ormali)X respecti3 destructor numeYclasa.numeYdestructorW(parametriY&ormali)XL )eclararea metodelor 3irtuale se &ace atasand cu3antul cMeie J3irtualJ la speci&icarea acestora8 in maniera: procedure numeYmetodaW(parametriY&ormali)XL 3irtualL sau &unction numeYmetodaW(parametriY&ormali)X : tipL 3irtualL Inainte de a discuta rolul metodelor 3irtuale8 sa preci.am restrictiile de proiectare si utili.are a lor8 date sub &orma urmatoarelor reguli (deduse din regulile 2102( pre.entate in sectiunea %.1): 11,

41. :rice clasa ce poseda metode 3irtuale trebuie sa aiba cel putin un constructor. 4!. In programul utili.ator8 o instanta isi 3a apela constructorul inaintea oricarui apel de metoda 3irtuala. 4$. :rice speciali.are (rescriere) a unei metode 3irtuale in descendentii clasei trebuie sa &ie tot 3irtualaL 4%. :rice speciali.are (rescriere) a unei metode 3irtuale in descendentii clasei trebuie sa aiba e#act acelasi antet (acelasi nume si aceeasi lista de parametri). 4'. /onstructorii nu pot &i 3irtuali. Pentru &iecare clasa ce poseda metode 3irtuale8 compilatorul Turbo Pascal creea.a o tabela de metode 3irtuale (4irtual KetMod Table8 4KT)8 ce contine: 0 dimensiunea unei instante a claseiL 0 numarul de metode 3irtualeL 0 pointeri la codul &iecarei metode (adrese de puncte de intrare). Asadar8 4KT este proprie clasei. Am 3a.ut mai inainte ca &iecare instanta creata cu un constructor poarta in ea _semnatura_ clasei prototip8 care nu este altce3a decat adresa 4KT. Apartenenta unei instante JobJ la o clasa data JnumeYclasaJ se poate testa in Turbo Pascal ast&el: TUpe:&(ob) 9 TUpe:&(numeYclasa)L iar &aptul ca doua obiecte ob1 si ob! sunt instantee ale aceleiasi clase prin: TUpe:&(ob1) 9 TUpe:&(ob!)L Am 3a.ut in %.1.' ca metodele 3irtuale ser3esc la modelarea comportamentului polimor&ic al obiectelor. )aca apelul metodelor statice se re.ol3a la compilare8 apelul de metode 3irtuale se re.ol3a numai la e#ecutie. Ast&el8 concreti.and consideratiile pre.entate in %.1.'8 un mesaj de &orma: ob1.numeYmetodaY3irtuala(listaYdeYparametriYactuali)L sau pob1=.numeYmetodaY3irtuala(listaYdeYparametriYactuali)L se re.ol3a la e#ecutie in urmatoarele etape: 1. Se determina clasa receptorului (ob1 sau pob1=)8 de &apt adresa 4KT corespun.atoare clasei sale8 din in&ormatia e#istenta in instanta respecti3aL !. Se selectea.a din 4KT adresa codului metodei speci&icate (adresa punctului de intrare)L $. Se lansea.a in e#ecutie respecti3a metoda (se &ace salt la punctul de intrare corespun.ator acesteia). Spre deosebire de legarea statica8 unde contea.a doar tipul clasei instantei (cunoscut la compilare)8 aceasta maniera de legare a selectorului de receptor 1!-

in timpul e#ecutiei a &ost numita in %.1.'.! Jlegare dinamicaJ. Accentuam &aptul ca se apelea.a metoda adec3ata instantei8 in con&ormitate cu atributele ei din timpul e#ecutiei8 si nu metoda adec3ata clasei statice a instantei8 declarata la compilare prin J3arJ. In obiect JoJ8 instanta a unei clase JcJ8 poate &i considerat in d:IA iposta.e distincte: a) la compilare8 cand i se cunoaste clasa statica (declarata cu J3ar o:cLJ in Turbo Pascal)L in acest moment se pot re.ol3a toate apelurile de metode statice JmsJ prin: Jo.ms(...)LJ b) la e#ecutie8 cand i se cunoaste clasa e&ecti3a JsYcJ (ca urmare a apelului unui constructor8 de e#emplu JInitJ al clasei JsYcJ8 care 3a trebui sa &ie o e#tensie a clasei JcJ (in arborele de mostenire al clasei statice JcJ): Jo.Init(...)LJ dupa acest moment (al apelului de constructor)8 orice apel de metoda 3irtuala Jm3J cu receptorul JoJ: Jo.m3(...)LJ 3a tine cont de clasa e&ecti3a JsYcJ si nu de clasa statica JcJ. Iposta.a a) corespunde legarii statice8 pe cand b) corespunde legarii dinamice. /unoscand aceste lucruri8 se poate e#plica necesitatea regulilor 4104' enuntate anterior: 41. Pre.enta imperati3a a constructorului pentru clasele ce poseda metode 3irtuale: daca nu e#ista constructor8 instanta nu 3a contine spatiu pentru adresa 4KT8 deci nu se 3a putea cunoaste clasa e&ecti3a a instanteiL 4!. Apelul constructorului unei instante JoJ trebuie sa preceada apelul oricarei metode 3irtuale a lui o: numai dupa apelul constructorului se cunoaste clasa e&ecti3a a instanteiL 4$. :rice rescriere a unei metode 3irtuale trebuie sa &ie la randul ei metoda 3irtuala: absenta acestei reguli ar pro3oca combinarea celor doua modalitati de legare a metodelor8 complicand implementarea legarii statice si dinamiceL 4%. : metoda 3irtuala cu numele Jm3J trebuie sa aiba aceeasi lista de parametri in toate clasele din arborele de mostenire in care ea este rede&inita: acest lucru este impus de caracterul puternic (static) tipi.at al Pascal0ului (antetul metodei din clasa statica8 de declarare8 asupra careia se &ace 3eri&icarea la compilare8 trebuie sa &ie identic cu antetul metodei din clasa e&ecti3a8 dinamica care se 3a apela la e#ecutie). 4'. /onstructorii sunt proprii &iecarei clase8 deci nu pot &i 3irtualiL doua clase di&erite au tabele de metode 3irtuale di&erite. %.!.%. Proiectarea si implementarea metodelor 3irtuale 4om relua speci&icatiile claselor Punct si /erc in care 3om &olosi metode 3irtuale. /on&orm preci.arilor 4104'8 aceasta inseamna ca in &iecare clasa 3or &i pre3a.ute: 0 un constructorL 0 un destructor (necesar pentru dealocarea obiectelor dinamice)L 0 metode 3irtuale. Inainte de a discuta noile speci&icatii8 ne 3om re&eri la lucrul cu obiecte dinamice in Turbo Pascal. 1!1

In obiect dinamic este alocat in memoria dinamica (Meap)8 &iind re&erit de un pointer ce contine adresa lui. Programele "#:bSt! si "#:bSt$ contin e#emple de obiecte dinamice din clasele Punct si /erc. I.ual8 in situatia: tUpe pointerYnumeYclasa 9 =numeYclasaL 3ar pob : pointerYnumeYclasaL crearea unui obiect dinamic se &ace cu ajutorul unei proceduri de initiali.are (numita Init in e#emplul nostru)8 in maniera: He1(pob)L Pse aloca memorie dinamica pentru obiectul dinamic re&erit de pobQ pob=.Init(...)L Pse apelea.a metoda InitQ In 3ersiunea (.-8 Turbo Pascal introduce e#tensii ale procedurilor standard He1 si )ispose8 care se pot apela in ca.ul e#istentei constructorilor8 respecti3 destructorilor. Ast&el8 e#tensiile au sinta#a (Init este constructorul clasei numeYclasa8 iar )one este destructorul acesteia): He1(pob8Init(...))L respecti3 )ispose(pob8)one(...))L Actiunile e&ectuate de procedura standard He1 in e#emplul de mai sus sunt: 1. Se aloca in memoria dinamica spatiu pentru obiectul dinamic re&erit de pob8 in con&ormitate cu speci&icatiile clasei numeYclasaL !. Se apelea.a cu pob= ca receptor constructorul Init8 care: !.1. pune in instanta pob= adresa 4KT a clasei numeYclasaL !.!. initiali.ea.a (si e3entual aloca dinamic unele dintre) campurile obiectului pob=. 2eciproc8 procedura standard )ispose (3ersiunea e#tinsa) reali.ea.a: 1. Apelarea destructorului )one (cu pob= ca receptor)8 care: 1.1. resetea.a pe 3alorile implicite (si e3entual dealoca unele dintre) campurile pob=L 1.!. distruge in instanta pob= adresa 4KT a clasei numeYclasaL !. )ealocarea din memoria dinamica a spatiului pentru obiectul pob=. Procedura standard He1 mai are o e#tensie8 cu sinta#a: pob :9 He1(pointerYnumeYclasa8Init(...))L ca. in care He1 3a intoarce un pointer de tip pointerYnumeYclasa8 e&ectuand actiunile preci.ate anterior. Bineinteles8 Init trebuie sa &ie constructorul clasei numeYclasa. Se obser3a ca in aceasta situatie apelul lui He1 are sinta#a apelului de &unctie si nu de procedura. 2e3enind la speci&icatiile claselor Punct si /erc si tinand cont de obser3atiile &acute8 acestea se 3or scrie ast&el: 1!!

tUpe Pointer6aPunct 9 =PunctL Punct 9 :bject(6ocatie) constructor Init(a<8a`:Integer)L destructor )oneL 3irtualL procedure )esenea.aL 3irtualL procedure AscundeL 3irtualL &unction "4i.ibil : BooleanL procedure KutaIn(nou<8nou`:Integer)L procedure Translatea.a(pas:Integer)L procedure 2oteste(centru:6ocatieL ungMi:Integer)L &unction /aracteristici: StringL 3irtualL procedure 6istea.a(c8l:Integer)L pri3ate 4i.ibil : BooleanL "ndL Pointer6a/erc 9 =/ercL /erc 9 :bject(Punct) constructor Init(a<8a`8a2a.a:Integer)L procedure )esenea.aL 3irtualL procedure AscundeL 3irtualL procedure Kareste(/u/it:Integer)L &unction 2a.a : IntegerL &unction /aracteristici : StringL 3irtualL pri3ate 2 : IntegerL "ndL Speci&icarea %. Ketode 3irtuale8 constructori si destructori Implementarea metodelor este data in unit0urile IPct).PAS si I/erc).PAS. "#emplul %: unit0urile IPct).PAS si I/erc).PAS /omparand speci&icarea % cu speci&icarea $ (pentru clasa /erc)8 se constata un grad mare de reutili.are a codului8 in sensul ca metodele KutaIn8 2oteste8 Translatea.a si 6istea.a nu mai apar ca metode proprii ale acestei clase8 ele &iind mostenite de la clasa parinte8 Punct. )eoarece toate aceste metode apelea.a la randul lor metode 3irtuale8 legarea acestora se 3a &ace dinamic. )e e#emplu8 in situatia: 3ar P : PunctL / : /ercL mesajul P.KutaIn(1--8!--) 3a a3ea ca e&ect (programul "#:bSt!): P.AscundeL PPunct.AscundeQ 6ocatie.Init(1--8!--)L P.)esenea.a PPunct.)esenea.aQ pe cand mesajul /.KutaIn(1--8!--) se 3a traduce ast&el: 1!$

/.AscundeL P/erc.AscundeQ 6ocatie.Init(1--8!--)L /.)esenea.a P/erc.)esenea.aQ Kai mult8 cand se lucrea.a cu obiecte polimor&ice8 ca in situatia: 3ar A:ArraUW1..!X o& Pointer6aPunctL si AW1X :9 He1(Pointer6aPunct8Init(1--8!--))L AW!X :9 He1(Pointer6a/erc8 Init(1'-8!$-8'-))L mesajul AW1X=.KutaIn(1--8!--) 3a a3ea ca e&ect: AW1X=.AscundeL PPunct.AscundeQ 6ocatie.Init(1--8!--)L AW1X=.)esenea.a PPunct.)esenea.aQ pe cand mesajul AW!X=.KutaIn(1--8!--) se 3a traduce ast&el: AW!X=.AscundeL P/erc.AscundeQ 6ocatie.Init(1--8!--)L AW!X=.)esenea.a P/erc.)esenea.aQ Se obser3a clar8 in ca.ul obiectelor polimor&ice8 maniera in care se stabileste la e#ecutie metoda 3irtuala adec3ata instantei receptorului. Programele "#:bSt18 "#:bSt! si "#:bSt$ pre.entate anterior 3or &unctiona corect in pre.enta noilor speci&icatii ale clasei /erc. In &ond8 nu este 3orba de modi&icarea algoritmilor care implementea.a metodele acestei clase8 ci de o utili.are mai e&icienta a mostenirii prin utili.area metodelor 3irtuale. )e aceasta data si programul "#:bSt$ 3a &unctiona corect (e#emplul are numele "#:bSt%). %.!.'. /lase abstracte In proiectarea ierarMiei claselor8 e#ista unele dintre ele care nu 3or poseda instante. 2olul lor este o mai buna structurare a acestei ierarMii8 ele colectand caracteristicile comune (campuri si metode) pentru mai multe clase descendente. /lasa 6ocatie din speci&icarea 1 este un e#emplu de clasa abstracta. 2olul ei este de&inirea caracteristicilor (coordonatele8 metodele de initiali.are si de accesare a acestora) comune pentru clasele descendente. Toate aceste clase8 a3and clasa 6ocatie in arborele lor de mostenire8 3or poseda atributele respecti3e. Pe de alta parte8 6ocatie poate &i considerata o clasa abstracta si deoarece comportamentul ei nu este su&icient de bogat pentru a &i utili.at de instantele sale. Ast&el8 6ocatie nu poseda metode de 3i.uali.are sau manipulare8 cum poseda descendentul sau direct8 clasa Punct. %.!.(. /olectii de obiecte polimor&ice 1!%

%.!.(.1. 6iste In programul %.!.$ este pre.entat un e#emplu simplu de colectie de obiecte polimor&ice8 depo.itate in tabloul A cu doua elemente de tip Pointer6aPunct. : alta maniera de implementare a unei colectii de obiecte 3a &olosi o lista simplu inlantuita. Intreaga colectie poate &i considerata ca o noua clasa8 asupra careia se prelungesc operatiile proprii obiectelor ei. In unit0ul I6ist5.PAS este pre.entata speci&icarea si implementarea clasei 6ista. "#emplul ': Init0ul I6ist5.PAS In a&ara claselor mentionate mai inainte8 in acest e#emplu se &olosesc inca doua: Arc 0 clasa deri3ata a clasei /erc8 a carei speci&icare si implementare este pre.entata in unit0ul IArcL Segment 0 clasa deri3ata a clasei Punct8 pre.entata in unitul ISeg. "#emplul %.!.(: Init0ul IArc.PAS "#emplul %.!.*. Init0ul ISeg.PAS Ketodele clasei 6ista se impart in doua categorii: 0 metode proprii listelor: Init 0 constructor8 creea.a o lista 3idaL )one 0 destructor8 dealoca elementele listeiL Adauga 0 adauga un nou element la coada listeiL 0 metode ce 3or re&lecta comportamentul obiectelor memorate in elementele listei: 6istea.a 0 listea.a caracteristicile &iecarui element din listaL )esenea.a 0 desenea.a &iecare obiect din listaL Ascunde 0 ascunde &iecare obiect din listaL 2oteste 0 roteste &iecare obiect din lista cu acelasi ungMi8 in jurul obiectului precedent din lista (prin parcurgerea circulara a listei)L Translatea.a 0 translatea.a &iecare obiect din lista cu aceeasi marimeL Kareste 0 mareste ra.a &iecarui obiect rotund din lista cu aceeasi marime. A doua categorie de metode &oloseste din plin apelul de metode 3irtuale8 &ie direct8 &ie indirect. : atentie speciala trebuie acordata metodei Kareste8 care nu este comuna tuturor claselor mentionate8 &iind proprie numai claselor /erc si Arc (prototipuri de obiecte rotunde). In implementarea ei se &oloseste &unctia TUpe:& pentru determinarea clasei e&ecti3e a obiectului. : alta solutie de implementare ar &i adaugarea metodei 3irtuale Kareste la clasa Punct (la care ea n0ar &ace nimic sau e3entual ar desena obiectul)8 ca. in care implementarea metodei Kareste a clasei s0ar &ace in aceeasi maniera ca si metodele anterioare. Aceasta se poate reali.a ast&el: 0 la clasa Punct se declara metoda 3irtuala Kareste8 care se implementea.a ast&el: Procedure Punct.Kareste(/u/it:Integer)L Begin 1!'

)esenea.a "ndL P Kareste Q 0 la clasa /erc se declara Kareste ca 3irtualaL 0 la clasa 6ista se modi&ica implementarea metodei Kareste ast&el: Procedure 6ista.Kareste(/u/it:Integer)L 4ar H : Pointer6aHodL PP : Pointer6aPunctL Begin H :9 IltimulL VMile H RS Hil do Begin P/ :9 H=."lementL P/=.Kareste(/u/it) H :9 H=.Precedentul "ndL "ndL P Kareste Q 6ucrul cu obiecte polimor&e este ilustrat in programul "#:b)i.PAS %.!.(.!. Initul I rapM Pentru implementarea unor &unctii gra&ice speci&ice e#emplelor discutate anterior8 s0a proiectat unit0ul I rapM8 ce e#porta o serie de ast&el de operatii. Te#tul sursa este pre.entat in unit0ul I rapM.PAS. +. ra&ica in Turbo Pascal "lemente de discutie +.1. Itili.area ecranului in mod gra&ic +.!. Init0ul rapM +.$. )esenarea in plan a &igurilor din planul real +.1. Itili.area ecranului in mod gra&ic "tape 0 initiali.area modului gra&ic (trecerea de la modul te#t la modul gra&ic) 0 lucrul in modul gra&ic 0 terminarea modului gra&ic (re3enirea la modul te#t) Kemoria ecran: .ona de memorie interna ce contine ceea ce se 3ede pe ecran 0 te#t 0 gra&ica /aracteristicile modului de lucru gra&ic 0 primiti3e gra&ice 0 culori 0 re.olutie 0 placa gra&ica 1!(

0 Borland rapMics Inter&ace (B I) # etKa#<01 -?@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@A B B B B B B B B B UF@@@@@@@@@@@@@@@@@.P(#8 U) B B B B B B B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E etKa#`01 Pi#el 0 picture element 0 coordonate (numere intregi) 0 culoare 5ereastra &i.ica ecran (3ie1port) 0 portiune din ecranul gra&ic in care se reali.ea.a desenul u1 u! etKa#<01 -?@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@A B B P1(u18 31) B B 31F@@@@@@@ jkkkkkkkkkkkkkkkkkkkkkkkl B B m m B B m m B B m m B 3!F@@@@@@@ nkkkkkkkkkkkkkkkkkkkkkkko B B P!(u!8 3!) B C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E etKa#`01 0 caracteristicile &erestrei &i.ice 0 coordonatele aparat: (u8 3) sunt relati3e la originea P1 0 initial: &ereastra &i.ica este tot ecranul +.!. Init0ul rapM +.!.1. Terminologie +.!.!. /lase de subprograme +.!.$. "#emple de &olosire Acest unit contine: 0 subprograme 0 constante 0 3ariabile speci&ice modului de lucru gra&ic. +.!.1. Terminologie 0 ecranul gra&ic corespunde unui dri3er gra&ic 0 dri3erul gra&ic 0 corespunde placii gra&ice din calculator 1!*

0 este speci&icat printr0o constanta simbolica cu urmatoarele 3alori /onstanta B 4aloare/comentariu kkkkkkkkkkkkkkpkkkkkkkkkkkkkkkkkkkkkkkk /urrent)ri3er B 01!+ pentru etKode2ange )etect B - Pro3oaca autodetectie / A B 1 K/ A B ! " A B $ " A(% B % " AKono B ' IBK+'1% B ( ^ercKono B * ATT%-B + 4 A B , P/$!*B 10 modul gra&ic 0 un dri3er gra&ic poate a3ea mai multe moduri gra&ice 0 la un moment dat pentru dri3erul gra&ic e#istent se lucrea.a intr0un singur mod gra&ic 0 modul gra&ic de&ineste 0 re.olutia pe 3erticala si pe ori.ontala ( etKa#<8 etKa#`) 0 numarul de culori ( etKa#/olor) 0 modul gra&ic se repre.inta printr0un numar (constanta simbolica) /onstanta B 4aloareB 2e.olutie /onstanta B4aloareB 2e.olutie kkkkkkkkkkkpkkkkkkkkpkkkkkkkkkkk kkkkkkkkkkkpkkkkkkkpkkkkkkkkkkkk / A/B - B $!- # !-- " A6o B - B (%- # !-/ A/ B 1 B $!- # !-- " A^i B 1 B (%- # $'/ A/! B ! B $!- # !-B B / A/$ B $ B $!- # !-- " A(%6o B - B (%- # !-/ A^i B % B (%- # !-- " A(%^i B 1 B (%- # $'B B B B K/ A/- B - B $!- # !-- ATT%--/- B - B $!- # !-K/ A/1 B 1 B $!- # !-- ATT%--/1 B 1 B $!- # !-K/ A/! B ! B $!- # !-- ATT%--/! B ! B $!- # !-K/ A/$ B $ B $!- # !-- ATT%--/$ B $ B $!- # !-K/ AKed B % B (%- # !-- ATT%--Ked B % B (%- # !-K/ A^i B ' B (%- # %+- ATT%--^i B ' B (%- # %-B B B B " AKono^i B $ B (%- # $'- IBK+'1%6o B - B (%- # %+^ercKono^i B - B *!- # $%+ IBK+'1%^i B 1 B 1-!% # *(+ B B B B 4 A6o B - B (%- # !-- P/$!*-^i B - B *!- # $'4 AKed B 1 B (%- # $'- 4 A^i B ! B (%- # %+0 in&ormatii de desenare 0 culoarea de &ond 0 culoarea &ondului ( etBZ/olor) 0 culoarea cernelii 0 culoarea cu care se desenea.a ( et/olor) 0 punctul curent ( et<8 et`) 0 punctul in care se a&la cursorul gra&ic 1!+

0 pagini gra&ice 0 pentru dri3erele " A (!'(b)8 4 A si ^ercules8 memoria gra&ica se imparte in mai multe pagini 0 &iecare pagina este identi&icata printr0un numar 0 pagina curenta este pagina care este a&isata pe ecran (Set4isualPage) 0 pagina acti3a este pagina in care se &ace desenarea (SetActi3ePage) 0 pagina curenta si pagina acti3a nu sunt neaparat una si aceeasi 0 la animatie se procedea.a ast&el: 0 se setea.a ca pagina acti3a alta pagina decat cea curenta si se desenea.a in ea 0 cand pagina este desenata8 se declara ca pagina curenta 0 se pot &olosi mai multe pagini8 care se declara pe rand pagini curente 0 culorile pentru modul curent se codi&ica prin numere intregi prin urmatoarele constante simbolice /ulori intunecate: (/erneala si &ond) kkkkkkkkkkkkkkkkkk BlacZ Blue 1 reen ! /Uan $ 2ed % Kagenta ' Bro1n ( 6igMt raU * /ulori descMise: (5ond) kkkkkkkkkkkkkkkkkk )arZ raU + 6igMtBlue , 6igMt reen 16igMt/Uan 11 6igMt2ed 1! 6igMtKagenta 1$ `ello1 1% VMite 1'

0 paleta de culoare: un tabel de culori care contine codurile acestora8 intr0o anumita ordine 0 numarul de culori depinde de dri3erul gra&ic si de modul gra&ic 0 se poate modi&ica ordinea culorilor in paleta 0 se obtin e&ecte speciale 0 e#ista o paleta curenta8 care se poate seta (SetPalette) 0 &actor de corectie (aspect ratio) 0 este de&init de doi parametri: <Asp si `Asp cu semni&icatia ca o linie ori.ontala de dimensiune <Asp are pe 3erticala dimensiunea `Asp 0 stil de umplere (&ill stUle)8 se modi&ica cu Set5illStUle 0 este &olosit pentru umplerea .onelor ecranului gra&ic 0 este de&init de 0 sablon de umplere (&ill pattern) 0 culoare de umplere (&ill color) 0 constante simbolice pentru stilul de umplere /onstanta B 4aloareaB Semni&icatia kkkkkkkkkkkkkkkpkkkkkkkkkpkkkkkkkkkkkkkkkkkkkkkkkkk "mptU5ill B - B 5oloseste culoarea &ondului Solid5ill B 1 B 5oloseste culoarea cernelii 6ine5ill B ! B Implere cu 000 6tSlasM5ill B $ B ^asura /// SlasM5ill B % B ^asura /// &ina 1!,

BZSlasM5ill B ' B ^asura ddd &ina 6tBZSlasM5ill B ( B ^asura ddd ^atcM5ill B * B 6igMt MatcM &ill <^atcM5ill B + B ^ea3U cross MatcM Interlea3e5ill B , B 6inii intretesute Vide)ot5ill B 1- B Puncte spatiate larg /lose)ot5ill B 11 B Puncte spatiate strans Iser5ill B 1! B )e&init de utili.ator 0 o linie desenata are urmatoarele caracteristici ( et6ineSettings) 0 stil de linie (line stUle) Set6ineStUle 0 sablon de linie (line pattern) 0 grosime de linie (line tMicZness) 0 constante simbolice: Stiluri de linie rosimi de linie Solid6n - continua HormVidtM 1 normala )otted6n 1 puncte TMicZVidtM $ subtire /enter6n ! )asMed6n $ intrerupta IserBit6n % ()e&init de utili.ator) 0 te#tul scris in modul gra&ic are urmatoarele caracteristici de stil ( etTe#tSettings) 0 &ont 0 &ontul cu care se scrie 0 directie 0 directia in care se scrie 0 dimensiunea caracterelor 0 proportia acestora pe ori.ontala si 3erticala /onstanta B4aloareB Semni&icatie kkkkkkkkkkkkkkpkkkkkkkpkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk )e&ault5ont B - B &ont mapat +#+ bit Triple#5ont B 1 B StroZed &ont Small5ont B ! B StroZed &ont SansSeri&5ont B $ B StroZed &ont otMic5ont B % B StroZed &ont ^ori.)ir B - B :rientare de la stanga la dreapta 4ert)ir B 1 B :rientare de jos in sus Iser/MarSi.e B - B )imensiunea caracterelor de&inita de B B utili.ator +.!.!. /lase de subprograme 0 initiali.area si terminarea modului gra&ic 0 /lose rapM 0 termina modul gra&ic 0 )etect rapM 0 determina dri3erul gra&ic 0 rapM"rrorKsg 0 intoarce mesajul de eroare pentru un cod speci&icat 0 rapM2esult 0 intoarce starea ultimei operatii gra&ice e&ectuate 9 - :b8 RS - 0 eroare 0 Init rapM 0 initiali.ea.a modul gra&ic 0 2estore/rtKode 0 restaurea.a modul ecran dinainte de trecerea in modul gra&ic 1$-

0 setarea &erestrei &i.ice 0 /lear)e3ice 0 sterge ecranul si setea.a punctul curent /P la (-8-) 0 /lear4ie1Port 0 sterge &ereastra &i.ica curenta 0 et4ie1Settings 0 obtine parametrii &erestrei &i.ice 0 Set4ie1Port 0 setea.a &ereastra &i.ica curenta 0 Set4isualPage 0 stabileste pagina 3i.uala curenta 0 setari de pagina8 culoare8 &actor de corectie 0 SetActi3ePage 0 stabileste pagina acti3a 0 SetAllPalette 0 scMimba paletele de culoare 0 SetAspect2atio 0 setea.a &actorul de corectie 0 SetBZ/olor 0 setea.a culoarea &ondului 0 Set/olor 0 setea.a culoarea cernelii 0 Set rapMBu&Si.e 0 modi&ica dimensiunea bu&&erului gra&ic &olosit la scanare sau umplere 0 Set rapMKode 0 setea.a sistemul la modul gra&ic speci&icat si sterge ecranul 0 SetPalette 0 scMimba o culoare a unei palete cu alta 0 Set2 BPalette 0 setea.a paletele de culoare pt IBK+'1% 0 setarea sau obtinerea punctului curent 0 et< 0 intoarce abscisa punctului curent 0 et` 0 intoarce ordonata punctului curent 0 Ko3e2el 0 muta punctul curent cu un deplasament preci.at 0 Ko3eTo 0 scMimba punctul curent la cel preci.at 0 primiti3e gra&ice 0 Arc 0 trasea.a un arc de cerc de centru si ra.a cunoscute8 cuprins intre doua ra.e ce &ormea.a ungMiuri date cu a#a :# 0 Bar 0 desenea.a o bara &olosind stilul si culoarea de umplere curente 0 Bar$) 0 desenea.a o bara $) &olosind stilul si culoarea de umplere curente 0 /ircle 0 trasea.a un cerc de centru si ra.e cunoscute 0 )ra1polU 0 trasea.a un poligon cu n 3ar&uri &olosind stilul de linie si culoarea curente 0 "llipse 0 trasea.a un arc elipsa data prin centru8 semia#a mare si mica si ungMiurile ra.elor ce determina arcul cu semia#a mare 0 5ill"llipse 0 trasea.a si umple o elipsa de centru si semia#e cunoscute 0 5illPolU 0 trasea.a un poligon si apoi il umple &olosind stilul de umplere si culoarea curente 0 5lood5ill 0 umple o regiune marginita cu sablonul de umplere si culoarea curenta 0 etImage 0 sal3ea.a o imagine (bitmap) dintr0o regiune speci&icata intr0un bu&&er (3ariabila) 0 PutImage 0 pune pe ecran o imagine dintr0un bu&&er 0 etPi#el 0 intoarce culoarea pi#elului de la locatia (<8`) speci&icata 0 PutPi#el 0 scMimba culoarea pi#elului de la locatia speci&icata cu culoarea speci&icata 0 6ine 0 trasea.a o linie de la un punct la alt punct (ambele speci&icate)L punctul curent nu se modi&ica 0 6ine2el 0 trasea.a o linie de la punctul curent (#-8 U-) la punctul (#18 U1)8 unde: #1 9 #- > )# U1 9 U- > )U iar )# si )U sunt parametrii lui 6ine2el. (#18U1) de3inde noul punct curent 1$1

0 6ineTo 0 trasea.a o linie de la punctul curent (#-8 U-) la punctul (#18 U1)8 unde #1 si U1 sunt parametrii lui 6ineTo. (#18U1) de3inde noul punct curent. 0 PieSlice 0 trasea.a si umple o &elie de placinta de centru8 ra.a si ungMiuri cunoscute 0 2ectangle 0 trasea.a dreptungMiul de&init de coltul dreapta sus si coltul stanga jos 0 Sector 0 trasea.a si umple un sector de elipsa de parametri cunoscuti 0 parametri de umplere8 sablon8 stil 0 et5illPattern 0 intoarce sablonul si culoarea de umplere selectate 0 et5illSettings 0 intoarce sablonul si culoarea de umplere curente 0 et6ineSettings 0 intoarce setarile curente de stil8 sablon si grosime de linie 0 Set5illPattern 0 selectea.a un sablon de umplere de&init de utili.ator 0 Set5illStUle 0 setea.a sablonul si culoarea de umplere 0 Set6ineStUle 0 setea.a stilul8 sablonul si grosimea liniei 0 in&ormatii despre setarile curente 0 etArc/oords 0 intoarce coordonatele ultimei comen.i Arc e#ecutate 0 etAspect2atio 0 intoarce parametrii care determina &actorul de corectie 0 etBZ/olor 0 intoarce culoarea &ondului 0 et/olor 0 intoarce culoarea cernelii 0 et)e&aultPalette 0 intoarce paleta de culoare cu care s0a initiali.at modul gra&ic 0 et)ri3erHame 0 intoarce un string continand numele dri3erului gra&ic 0 et rapMKode 0 intoarce modul gra&ic curent 0 etKa#/olor 0 intoarce cel mai mare cod de culoare 0 etKa#Kode 0 intoarce cel mai mare numar de mod gra&ic 0 etKa#< 0 intoarce re.olutia curenta pe ori.ontala 0 etKa#` 0 intoarce re.olutia curenta pe 3erticala 0 etKodeHame 0 intoarce numele modului gra&ic 0 etKode2ange 0 intoarce subdomeniul numerelor de moduri gra&ice 3alide pentru un anumit dri3er gra&ic 0 etPalette 0 intoarce paleta curenta si dimensiunea ei 0 etPaletteSi.e 0 intoarce dimensiunea paletei curente 0 rapM)e&aults 0 setea.a pe (-8-) punctul curent si resetea.a parametrii gra&ici la 3alorile lor implicite 0 ImageSi.e 0 intoarce numarul de octeti necesar pentru a memora o regiune de ecran (bitmap) speci&icata 0 scrierea de te#t in modul gra&ic 0 etTe#tSettings 0 intoarce setarile de te#t pentru scrierea in modul gra&ic 0 SetTe#tStUle 0 setea.a parametrii de stil de te#t 0 SetTe#thusti&U 0 setea.a parametrii de aliniere a te#tului scris cu :utTe#t sau :utTe#t<` in raport cu punctul curent 0 SetIser/MarSi.e 0 setea.a latimea si inaltimea caracterelor din &ontul curent 0 SetVriteKode 0 setea.a modul de desenare a liniilor (scrie peste8 <:28 etc) 0 Te#t^eigMt 0 intoarce inaltimea stringului argument8 in pi#eli 0 Te#tVidtM 0 intoarce latimea stringului argument8 in pi#eli 0 :utTe#t 0 scrie stringul argument in mod gra&ic8 in raport cu 1$!

punctul curent 0 :utTe#t<` 0 scrie stringul argument in mod gra&ic8 in raport cu un punct speci&icat 0 instalari de dri3ere8 &onturi 0 InstallIser)ri3er 0 InstallIser5ont 0 2egisterB Idri3er 0 2egisterB I&ont +.!.$. "#emple de &olosire +.!.$.1. Initiali.area modului gra&ic 3e.i I rapM.Init r &oloseste 0 )etect rapM 0 Init rapM 0 rapM2esult 0 rapM"rrorKsg +.!.$.!. Programul /ercuri 3e.i /ercuri.PAS &oloseste 0 I rapM.Init r 0 /lose rapM 0 /ircle +.!.$.$. Programul 5erestre 3e.i 5erestre.PAS &oloseste 0 I rapM.Init r 0 /lose rapM 0 /ircle 0 Set4ie1Port 0 2ectangle +.$. )esenarea in plan a &igurilor din planul real /oordonate ecran 0 intregi de&initi de re.olutia ecranului 0 sunt coordonate absolute 0 originea este coltul din stanga sus al ecranului (-8 -) /oordonate reale 0 coordonatele punctelor din planul real 0 se repre.inta prin numere reale /oordonate din &ereastra &i.ica 0 sunt relati3e la coltul din stanga sus al &erestrei 0 se obtin din coordonatele ecran prin scaderea coordonatelor coltului stanga sus 5ereastra &i.ica ecran 4 (u18 31) (u!8 3!) etKa#<01 1$$

-?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A B B K1(u18 31) B B 31F@@@@@@@ jkkkkkkkkkkkkkkkkkkkkkkkl B B m m B 3 F@@@@@@@@q@@@@@@@@@@.K(u8 3) m B B m B m B 3!F@@@@@@@ nkkkkkkkkkkkkkkkkkkkkkkko K!(u!8 3!) B B B B B B C@@@@@@@@F@@@@@@@@@@F@@@@@@@@@@@@F@@@@@@@@@@@@@E etKa#`01 u1 u u! 0 u18 31 si u!8 3! sunt coordonate ecran 0 ordonata 3 creste in jos 5ereastra reala (logica): domeniul ) din planul real ) 0 de&init de doua colturi opuse 0 (a8 c) (b8 d) 0 (a8 d) (b8 c) 0 ordonata U creste in sus (a8 d) # d?@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@A (b 8 d) B B B B B B B B B UF@@@@@@@@@@@@@@@@@.P(#8 U) B B B B B B B cC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E (b8 c) a b Punctul P(#8 U) din ) se repre.inta in punctul K(u8 3) din 4 Problema repre.entarii punctului P in coordonate ecran este: )ate: domeniul real ) (a8 c) si (b8 d) &ereastra ecran (-8 -) si ( etKa#<018 etKa#`01) punctul P(#8 U) din ) a R9 # R9 b8 c R9 U R9 d 2e.ultate: (u8 3) 2elatii de trans&ormare # 0 a u 0 u1 00000 9 0000000 b 0 a u! 0 u1 U 0 d 3 0 31 00000 9 0000000 c 0 d 3! 0 31 de unde re.ulta 1$% u1 9 -8 u! 9 etKa#<01

31 9 -8 3! 9 etKa#`01

u :9 2ound((#0a);(u!0u1)/(b0a)) > u1 3 :9 2ound((U0d);(3!031)/(c0d)) > 31 u si 3 sunt coordonate ecran. )aca se doreste repre.entarea numai in &ereastra &i.ica 4 (ca. in care coordonatele trebuie calculate relati3 la coltul din stanga sus al acesteia)8 atunci &ormulele de mai sus de3in: uJ :9 2ound((#0a);(u!0u1)/(b0a)) 3J :9 2ound((U0d);(3!031)/(c0d)) in care (u18 31) si (u!8 3!) repre.inta colturile &erestrei &i.ice

Pascal !lim$a, de pro%ramare"


)e la ViZipedia8 enciclopedia liberr

Salt la: Ha3igare8 crutare Pascal este unul dintre limbajele de programare de re&erinsr On ttiinsa calculatoarelor8 &iind cel care a de&init programarea calculatoarelor. Pascal a &ost de.3oltat de el3esianul HiZlaus VirtM On 1,*- pentru a pune On practicr programarea structuratr8 aceasta &iind mai utor de compilat. Inul din marile sale a3antaje este asemrnarea cu limbajul natural limba engle.r8 ceea ce Ol &ace limbajul ideal pentru cei care sunt la primul contact cu programarea. Pascal este ba.at pe limbajul Algol ti a &ost denumit ast&el On onoarea matematicianului Blaise Pascal8 creditat pentru construirea primelor matini de calcul numeric. VirtM a mai de.3oltat limbajele Kodula0! ti :beron8 similare cu Pascal. /ele mai populare implementrri a acestui limbaj au &ost Turbo Pascal ti Borland Pascal8 ambele ale &irmei Borland cu 3ersiuni pentru KacintosM ti ):S8 care i0au adrugat limbajului obiecte ti au &ost continuate cu 3ersiuni destinate programrrii 3i.uale pentru Kicroso&t Vindo1s (limbajul )elpMi) ti pentru 6inu# (bUli#). un pre.ent e#istr ti alte implementrri mai mult sau mai pusin populare8 dar gratuite8 printre care se remarcr 5ree Pascal ti HI Pascal. )eti On pre.ent este relati3 rar &olosit On industria so&t1are8 el este Oncr util ele3ilor ti studensilor care doresc sr se inisie.e On programare. Spre deosebire de BASI/8 care a stat On trecut la ba.a On3rsrrii programrrii8 Pascal este un limbaj structurat. )e aceea8 el &ormea.r un anumit tip de gindire8 similar limbajelor moderne8 precum />>8 dar nu desine comple#itatea ti abstracti.area acestuia din urmr8 &iind mai utor de Onseles datoritr sinta#ei simple ti apropiate de pseudocod.

-uprins
WascundeX 1$'

1 Tipuri de date de ba.r ! :peratori (clasi&icare dupr tipul de date) o !.1 Pentru datele numerice (integer8 real8 bUte8 1ord) !.1.1 :peratori relasionali o !.! Pentru datele de tip tir de caractere (string) !.!.1 :peratori relasionali $ Instrucsiuni de ba.r o $.1 Instrucsiune multiplr o $.! /ondisie o $.$ /icluri $.$.1 /u test inisial $.$.! /u test &inal $.$.$ /u numrr cunoscut de pati % Structura unui program Pascal ' /ite3a instrucsiuni o '.1 V2IT" '.1.1 "#emplu o '.! 2"A) '.!.1 "#emple o '.$ 2"A)b"` '.$.1 "#emplu o '.% ST2 '.%.1 "#emplu o '.' 4A6 '.'.1 "#emplu o '.( B2"Ab o '.* "<IT o '.+ ^A6T '.+.1 "#emplu o '., )"6"T" '.,.1 "#emplu o '.1- IHS"2T

'.1-.1 "#emplu

.modific/0 *ipuri de date de $a1/


2nte%er (numere Ontregi) (eal (numere reale) -3ar (caractere) Strin% (tiruri de caractere) 4oolean (3alori logice) *ext (&itiere te#t) +ile (&itiere binare) 1$(

Arra5 (3ectori)

.modific/0 6peratori !clasificare dup/ tipul de date"


.modific/0 Pentru datele numerice !inte%er7 real7 $5te7 8ord"
( )

grupea.r e#presiile

+,-

adunare ti scrdere

*,/

Onmulsire ti Omprrsire (Omprrsirea cu 3irgulr se &ace On numere reale)

mod

returnea.r restul (doar On Ontregi)

div

returnea.r citul (doar On Ontregi)

.modific/0 6peratori rela9ionali mai mic

<

>

mai mare

egal

<>

di&erit

<=

mai mic sau egal

>=

mai mare sau egal

.modific/0 Pentru datele de tip :ir de caractere !strin%"


+

concatenarea a dour tiruri

1$*

.modific/0 6peratori rela9ionali mai mare sau mai mic8 pe ba.a ordinii le#icogra&ice On &uncsie de codurile AS/II

<,>

cele dour tiruri sunt identice

.modific/0 2nstruc9iuni de $a1/


.modific/0 2nstruc9iune multipl/
begin <instruciuni> end.

.modific/0 -ondi9ie
if <condiie> then <instruciune>;

sau
if <condiie> then <instruciune> else <instruciune>;

.modific/0 -icluri
.modific/0 -u test ini9ial
hile <condiie> do <instruciune>;

.modific/0 -u test final


re!e"t <instruciuni> until <condiie>;

.modific/0 -u num/r cunoscut de pa:i


for <v"ri"bil#>$=<v"lo"re%inii"l#> to <v"lo"re%fin"l#> do <instruciune>;

sau
for <v"ri"bil#>$=<v"lo"re%inii"l#> do nto <v"lo"re%fin"l#> do <instruciune>;

.modific/0 Structura unui pro%ram Pascal


1$+

!rogr"m <nume%!rogr"m>; uses <biblioteci cu funcii &i !roceduri folosite 'n !rogr"m> t(!e <ti!uri de d"te definite de utili)"tor> const <const"nte folosite 'n !rogr"m> v"r <v"ri"bile glob"le folosite 'n !rogr"m> <"ici se !ot scrie funcii &i !roceduri folosite 'n !rogr"m> begin <"ici se scrie !rogr"mul !rinci!"l> end. Not: Dup fiecare comand se pune " ; " cu urmtoarele excepii: nainte

de "else" i dup

"do".

.modific/0 -;te a instruc9iuni


.modific/0 <(2*E
"ste o instrucsiune pentru afi:area pe ecran a unui te#t (tir de caractere) sau a 3alorii unor constante8 unor 3ariabile sau unor e#presii8 e#ceptind date de tip 3ector sau &itier. /onsinutul a ceea ce urmea.r sr &ie a&itat pe ecran este Oncadrat de dour parante.e rotunde. 6ista a ceea ce urmea.r sr &ie a&itat pe ecran este desprrsitr prin 3irgulr. Instrucsiunea <(2*E=> &ace aceeati acsiune ca ti V2IT" dar dupr a&itare mutr cursorul la Onceputul rindului urmrtor al ecranului. .modific/0 Exemplu 1rite (Ja9J8 a)L Descriere: a&itea.r pe ecran tirul a= dupr care a&itea.r 3aloarea 3ariabilei sau constantei a.

.modific/0 (EAD
"ste o instrucsiune care citette de la tastaturr o 3ariabilr8 cu e#cepsia tipului boolean ti a 3ectorilor. 4ariabilele se scriu Ontre parante.e ti8 dacr sunt mai multe 3ariabile8 se despart prin ir%ul/. Instrucsiunea 2"A)6H &ace acelati lucru ca 2"A) dar atteaptr un R"HT"2S Onainte de a prelucra datele primite. un ca. cr sunt citite mai multe 3ariabile8 introducerea acestora se 3a &ace prin separarea 3alorilor prin spasii albe (RSpaceS8 RTABS sau R"HT"2S). .modific/0 Exemple

1rite (J)ati #9J)L readln (#)L

Descriere: a&itea.r pe ecran Dati x= dupr care citette de la tastaturr 3aloarea 3ariabilei x.

readlnL

Descriere: atteaptr aprsarea tastei R"HT"2S dupr care continur cu restul de instrucsiuni din program.

.modific/0 (EAD?E@
"ste o instrucsiune de citire de la tastaturr a caracterelor (3alori de tip cMar) &rrr ca acestea sr &ie a&itate pe ecran. 4ariabila caracter cititr se scrie Ontre parante.e. .modific/0 Exemplu 1$,

1rite (JParasiti aplicatiaN (d/n)J)L readZeU (#)L Descriere: a&itea.r pe ecran Parasiti aplicatia? apoi atteaptr sr &ie introdusr de la tastaturr o literr.

.modific/0 S*(
Trans&ormr un numrr Ontr0un string (tir de caractere). :datr trans&ormat On string8 numrrului nu i se mai pot e&ectua operasii matematice deoarece acum este considerat un cu3int. .modific/0 Exemplu str (#8 s)L Descriere: /reea.r un string din numrrul x On tirul s.

.modific/0 #A=
Trans&ormr un string Ontr0un numrr atit timp cit stringul consine o repre.entare 3alidr. .modific/0 Exemplu 3al (s8 #8 er)L Descriere: creea.r un numrr din stringul s On 3ariabila x. )acr On timpul e#ecusiei se Ontilnette o eroare8 3ariabila de tip integer er 3a consine po.isia caracterului de la care s0a constatat cr nu se poate trans&orma stringul On numrr. Spre e#emplu8 pentru tirul de caractere J 12 !a" J 3ariabila er 3a consine #.

.modific/0 4(EA?
:prette &orsat un ciclu (5:28 2"P"AT sau V^I6")8 cMiar dacr acesta nu s0a OncMeiat.

.modific/0 EA2*
:prette automat programul.

.modific/0 BA=*
:prette automat programul cu posibilitatea de transmite sistemului de operare un cod de eroare. .modific/0 Exemplu Malt (')L Descriere: oprette programul ti transmite codul de eroare '.

.modific/0 DE=E*E
vterge o porsiune dintr0un string. .modific/0 Exemplu 1%-

delete (s8 +8 %)L Descriere: tterge ! caractere din tirul s Oncepind cu po.isia $.

.modific/0 2>SE(*
Introduce un tir de caractere On altul. .modific/0 Exemplu insert (s8JabcJ8 +)L Descriere: introduce On tirul s pe po.isia $ caracterele a%c.

1%1

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