Programare procedurala

Embed Size (px)

DESCRIPTION

USH-Progamare procedurala

Citation preview

  • 5/25/2018 Programare procedurala

    1/88

  • 5/25/2018 Programare procedurala

    2/88

    PROGRAMARE PROCEDURALPROCEDURAL PROGRAMMING

    Disciplinobligatorie; sem 1, ore sptmnal nvmnt de zi: 2 curs, 2 laborator, total

    ore semestru 56; 6 credite; colocviu

    I. CONINUTUL TEMATIC AL DISCIPLINEI

    Algoritmi: Caracteristici. Descriere. Complexitate. Corectitudine.

    Limbaje de programare. Caracteristici.

    Limbajul de programare C: Entiti sintactice. Operatori.. Expresii. Instruciuni.

    Funcii. Directive de preprocesare. Tablouri i Pointeri. Comunicare inter-modular. Funcia main cu argumente. Pachetele: stdio.h, math.h, string.h

    Alocare static Alocare dinamic. Structuri de date dinamice (liste i arbori).

    Aplicaii ale utilizrii tipurilor de date structurate (struct, union, typedef) cu

    ajutorul pointerilor: crearea i explorarea structurilor de date. Pachetele: stdlib.h,

    alloc.h Operaii de intrare-ieire. Fiiere n C i aplicaii.

    Corectitudinea programelor C. Metoda aseriunilor (assert.h).

    Complexitatea programelor (time.h). Metrici software.

    Testarea programelor C.

    Utilizarea bibliotecilor statice (.LIB) i dinamice (.DLL).

    Metode de proiectare a programelor.

    II. BIBLIOGRAFIE MINIMALOBLIGATORIE

    1. G. Albeanu, Algoritmi i limbaje de programare, Editura Fundaiei Romnia demine, Bucureti, 2000.

    2. G. Albeanu, Programare procedural, Note de curs (Avizierul virtual /Blackboard)

    3. G. Albeanu (coord.), Tehnici de programare. Lucrri practice de programarea

    calculatoarelor, Editura Fundaiei Romnia de mine, Bucureti, 2003.4. Popa M., Popa M., Programare procedural(Aplicaii C i C++ n structuri de

    date i grafic), Editura Fundaiei Romnia de mine, Bucureti, 2006.

  • 5/25/2018 Programare procedurala

    3/88

    UNIVERSITATEA SPIRU HARET file:///C:/ACTIV/Proc/FINAL/IDD-USH.htm

    1 of 1 12/9/2007 7:18 PM

    UNIVERSITATEA SPIRU HARET

    FACULTATEA DE MATEMATICA-INFORMATICA

    Suport de curs elaborat de

    Prof. Univ. Dr. Grigore ALBEANU

    pentru disciplina:

    PROGRAMARE PROCEDURALA

    2C + 2L; Ciclul I; semestrul I

    Evaluare: Examen

    CUPRINS

    INTRODUCERE

    Ce este informatica ?

    Ce este un program ? Notiunea de algoritm.

    Cum rezolvam probleme cu ajutorul calculatorului ?

    ALGORITMI: DESCRIERE, COMPLEXITATE, CORECTITUDINE

    Notiuni de teoria grafurilor

    Scheme logice structurate

    Notiuni introductive privind organizarea datelorLimbaj algoritmic

    Analiza complexitatii

    Elemente privind corectitudinea algoritmilor

    LIMBAJE DE PROGRAMARE

    Vocabularul si sintaxa limbajelor de programare

    Tipuri de date. Constante. Variabile. Expresii

    Programare in C

    Bibliografie

  • 5/25/2018 Programare procedurala

    4/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    1 of 6 12/9/2007 7:19 PM

    1. Introducere

    1.1. Ce este informatica?1.2. Ce este un program? Notiunea de algoritm1.3. Cum rezolvam probleme cu ajutorul calculatorului?

    1.1. Ce este informatica?

    n anul 1642, matematicianul si fizicianul Blaise Pascal (1623-1662) a inventat prima masina mecanic, curoti dintate, capabil s realizeze operatii de adunare si scdere a numerelor naturale. Totusi, de abiadup aparitia masinilor electromecanice, n 1944, John von Neumann a formulat principiul programuluinregistrat si a sugerat constructorilor de calculatoare trei principii care trebuie avute n vedere pentrurealizarea unui calculator:

    programele si datele trebuie s fie codificate sub form binar;programele si datele trebuie stocate ntr-o memorie a masinii de calcul;trebuie s existe o component (unitate central de prelucrare, procesor) special care stie att sexecute operatii de calcul, ct si s extrag, s decodifice si s execute instructiunile programului.

    Astfel, aproape toate tipurile de sisteme de calcul ce au aprut mai trziu sunt calculatoare de tip vonNeumann.

    Aparitia sistemelor de calcul a dus la aparitia si dezvoltarea unei noi stiinte: informatica (Informatique,Informatics, Informatik n Europa, respectiv Computer Science n SUA). Informatica reprezint uncomplex de discipline prin care se asigur prelucrarea informatiilor cu ajutorul sistemelor de calcul.Astzi, informatica este prezent n industrie, bnci, ferme, art, medicin, stiinte sociale etc. si estestructurat n mai multe domenii precum:

    arhitectura sistemelor de calcul: studiaz modul de organizare a sistemului fizic (hardware) pentru a

    se obtine o mai mare eficient, sigurant si utilitate.sisteme de operare: studiaz modalittile de gestiune eficient a resurselor fizice si a programelor.algoritmi si structuri de date: studiaz metodele de rezolvare a problemelor si modurile de organizarea datelor pentru a obtine programe eficiente.limbaje de programare: studiaz modalittile prin care algoritmii si structurile de date suntprezentate calculatorului pentru a fi prelucrate.ingineria programrii: studiaz metodele de automatizare a proceselor de proiectare, analiz, testaresi reutilizare a programelor.calcule numerice si simbolice: studiaz modalittile de reprezentare a informatiei numerice pentruimplementarea unor algoritmi numerici robusti, eficienti si de mare precizie.sisteme de gestiune a bazelor de date: studiaz modalittile de structurare si organizare eficient a

  • 5/25/2018 Programare procedurala

    5/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    2 of 6 12/9/2007 7:19 PM

    colectiilor mari de date ce vor fi supuse diverselor prelucrri.inteligenta artificial: studiaz modalittile de reprezentare si manipulare a cunostintelor n vedereaobtinerii de noi cunostinte.animatia si robotica: studiaz modalittile de reprezentare, prelucrare si analiz a informatieiaudio-vizuale.

    n sfera sa de preocupri, Informatica a atras si dezvoltat o mare varietate de discipline precum: logica

    matematic, teoria automatelor, limbaje formale, cercetri operationale, teoria grafurilor si retelelor,calcul numeric, teoria fiabilittii, geometrie computational, teoria calculabilittii, baze de date, baze decunostinte, sisteme expert etc.

    1.2. Ce este un program? Notiunea de algoritm

    Solutia unei probleme, din punct de vedere informatic, este dat printr-o multime de comenzi(instructiuni) explicite si neambigue, exprimate ntr-un limbaj de programare. Aceast multime deinstructiuni prezentat conform anumitor reguli sintactice formeaz un program. Un program poate fiprivit si ca un algoritm exprimat ntr-un limbaj de programare. Totusi, un algoritm descrie solutiaproblemei independent de limbajul de programare n care este redactat programul.

    Exist mai multe definitii ale notiunii de algoritm. A. A. Markov, a considerat algoritmul ca fiind o notiunematematic primar si a descris-o astfel: Un algoritm este o retet care descrie precis si clar un proces decalcul.

    El a descris un mecanism formal pentru a specifica o clas larg de activitti si anume: algoritmii normali.Alte modalitti de descriere a algoritmilor ce au mai fost propuse sunt: masina Turing, sistemele Post,functiile recursive etc. n aceast lucrare, prin algoritm vom ntelege o secvent finit de comenzi explicitesi neambigue care, executate pentru o multime de date (ce satisfac anumite conditii initiale), conduce ntimp finit la rezultatul corespunztor. Observm c se face distinctie ntre algoritm (care se termin n

    timp) si procedur (care poate continua nedefinit).

    Conform lui D. Knuth (The art of computer programming, Vol. I, 1997)un algoritm posed cincicaracteristici importante:

    Un algoritm are caracter finit. El este descris printr-o secvent finit de etape si trebuie ca, ori de cteori sunt parcurse etapele algoritmului pentru anumite date, procesul s se ncheie n timp finit.Un algoritm are caracter determinist. Actiunile specificate de pasii algoritmului sunt clare, fiindriguros prezentate.Un algoritm are date de intrare. Se poate admite c ntotdeauna un algoritm lucreaz asupra unordate de intrare. Acestea pot fi evidentiate din contextul n care este formulat problema a crei

    solutie o reprezint algoritmul.Un algoritm furnizeaz cel putin o valoare de iesirece se afl ntr-o relatie specific cu datele deintrare.Un algoritm este eficace.

    Trebuie spus c nu orice problem admite solutie descris algoritmic. Problemele pentru care exist unalgoritm de rezolvare se numescprobleme decidabile. Problemele pentru care s-a demonstrat (matematic)c nu admit un algoritm de rezolvare se numescprobleme nedecidabile. Nu este suficient ca o anumitproblem (clas de probleme) s admit solutii (chiar si o singur solutie). Din punctul de vedere alinformaticii, intereseaz dac exist solutie ce poate fi descris algoritmic, deci dac solutia problemeipoate fi construit efectiv. De asemenea, pentru rezolvarea anumitor probleme pot exista mai multi

  • 5/25/2018 Programare procedurala

    6/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    3 of 6 12/9/2007 7:19 PM

    algoritmi. Stabilirea celui mai bun dintre acestia se realizeaz n urma unui proces de analiz prin care sedetermin performantele fiecruia dintre algoritmi.

    n finalul acestei sectiuni vom descrie ctiva algoritmi elementari. Acestia vor contribui la realizarea unuiprim contact cu solutiile algoritmice. Mai nti prezentm cteva conventii. Datele supuse prelucrrilorsunt manipulate cu ajutorul variabilelor. Acestea sunt entitti ce pot referi elemente ale unei anumitemultimi. Putem vorbi de variabile ntregi (respectiv reale, caracter etc.) atunci cnd acestea se refer lavalori ntregi (respectiv reale, caracter etc.). Actiunile realizate n cadrul unui algoritm vor fi descrise prin

    verbe: execut, citeste, scrieetc. Notatiile matematice consacrate vor fi utilizate fr explicatii suplimentare. Vom utiliza constructiiprecum: dac, atunci, altfel, ct timp, repet, pn cnd, pentru, de la, pn la etc., a cror semnificatieeste cea uzual. O operatie important este aceea prin intermediul creia o variabil "va primi" o anumitvaloare. Aceast actiune se mai numeste operatie de atribuire si, n continuare, se va nota prin ":="Valoarea ce se atribuie unei variabile este rezultatul evalurii unei expresii. Expresia poate fi de tipnumeric sau de tip logic. ntr-o expresie numeric apar numere (ntregi, reale etc.) si operatori aritmeticiprecum: + (adunare), - (scdere), * (nmultire), / (mprtire) etc. Expresiile logice (numite si expresiibooleene) contin operatori logici: and (si logic), or (sau logic), not (negatie) si operatori relationali (, = (mai mare sau egal), != sau (diferit), = (egalitate)) folositi ntre elemente pentrucare aceste operatii au sens. Rezultatul evalurii unei expresii logice poate fi: true (adevrat) sau false

    (fals). n descrierea unei expresii pot fi folosite si alte simboluri dac acestea sunt cunoscute sau explicate.Utilizarea parantezelor: "(" si ")" pentru indicarea modului de evaluare este, de asemenea, permis.

    Am vzut c algoritmii accept date de intrare si furnizeaz rezultate (date de iesire). Introducerea uvalori sau a unui sir de valori se va descrie folosind verbul citeste. Afisarea unei valori sau a unui sir devalori va fi descris prin verbul scrie. Vom conveni s numerotm pasii (etapele) unui algoritm.numerotare va fi utilizat eventual n alti pasi. Acest mod de prezentare a algoritmilor se numestedescriere n limbaj conventional. n unele lucrri, limbajul conventional mai este numit si limbapseudocod.

    Exemplul 1.1.Fie a si b dou variabile ntregi. Dorim s schimbm ntre ele valorile celor dou variabile. Ma i precis, dac a

    = 640 si b = 480, dorim s obtinem a = 480 si b = 640.

    Un mod de a realiza aceast schimbare presupune utilizarea unei variabile suplimentare, cu rol deintermediar. Folosind trei operatii de atribuire, algoritmul are urmtorii pasi:

    1. citeste a, b2. t := a3. a := b4. b := t5. scrie a,b

    Lsm ca exercitiu realizarea urmtoarelor transformri:i) a --> b --> c --> aii) a --> b --> c --> d --> a

    Atunci cnd va fi necesar, ne vom referii la pasii 2, 3 si 4 prin constructia interschimb(a,b).

    Exemplul 1.2.Se cere generarea primilor n termeni (n>1) ai sirului lui Fibonacci. Primii ctiva termeni sunt: 0, 1, 1, 2, 3, 5,

    8, 13, ... Mai precis, termenul curent este suma celor doi termeni anteriori.

    Vom prezenta dou metode. Prima metod descrie schema de generare c := a + b, unde a, b desemneaz

  • 5/25/2018 Programare procedurala

    7/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    4 of 6 12/9/2007 7:19 PM

    ultimii doi termeni generati, iar c va fi termenul curent. Deoarece se cer n termeni, este necesar unmecanism de numrare (incrementarea unei variabile de contorizare). Valorile contorului vor fi referiteprin variabila k. Algoritmul de generare, n prima variant, este:

    Varianta 1:1. citeste n2. k := 23. a := 0; scrie a

    4. b := 1; scrie b5. repet5.i) c := a + b; scrie c5.ii) a := b5.iii) b := c5.iv) k := k+1pn cnd k = n.

    Prin a doua metod se vor genera termenii doi cte doi. Aceasta nseamn ca uneori este generat unul nplus. Descrierea ce urmeaz foloseste numai variabilele a si b pentru a indica termenii sirului.

    Varianta 2:1. citeste n2. a := 03. b :=14. k :=25. ct timp k < n execut5.i) scrie a, b5.ii) a := a + b5.iii) b := a + b5.iv) k := k+26. dac k = n atunci scrie a, b altfel scrie a.

    Exemplul 1.3.Se consider o secvent cu n numere ntregi. Se cere afisarea numerelor n ordine cresctoare.Vom descrie sirul de numere prinx1, x2, ..., xn.Cea mai simpl metod presupune interschimbarea a cte dou elemente, pn cnd nu mai sunt necesareinterschimbri. Pasii algoritmului sunt:

    1. citeste n2. citestex1, x2, ..., xn3. k:=1;4. repet4.i) ordonat := true4.ii) pentru i de la 1 pn la n-k execut

    dac xi> xi+1atuncia) interschimb(xi, xi+1)b) ordonat := false4. iii) k:=k+1;pn cnd (ordonat = true) or (k = n)5. scriex1, x2, ..., xn.

    Justificarea metodei este simpl. Trebuie s observm c la prima parcurgere, elementul maxim va ajungepe ultima pozitie. La a doua parcurgere, elementul imediat mai mic (dect maximul recent obtinut), vaocupa penultima pozitie. Cnd nu sunt necesare interschimbri sirul este deja ordonat.

  • 5/25/2018 Programare procedurala

    8/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    5 of 6 12/9/2007 7:19 PM

    1.3. Cum rezolvm probleme cu ajutorul calculatorului?

    Am vzut c exist probleme pentru care nu poate fi dat un algoritm de rezolvare. Totusi cele mai multeprobleme cu care se confrunt informatica sunt probleme decidabile. Toate temele tratate n aceastlucrare formuleaz probleme decidabile.

    Se stie c nu nvtarea unui limbaj de programare este o sarcin dificil, ci rezolvarea algoritmic aproblemelor decidabile. Este clar c, nainte de a ncepe scrierea unui program trebuie, mai nti, s gsim(sau s cunoastem deja) solutia algoritmic a problemei puse. Cum se gseste solutia? Etapele descrise deG. Plya (Cum rezolvm o problem? Editura Stiintific, Bucuresti, 1965), pentru rezolvarea unei problemede matematic, sunt valabile si n informatic.

    nainte de a ncepe s vedem cum se face, trebuie s ntelegem att ipotezele problemei ct si ceea ce secere. Deci, ntelegerea problemei, ocup primul loc n procesul cutrii unei metode de rezolvare a acesteiacu ajutorul calculatorului. Trebuie evidentiate datele de intrare si conditiile pe care acestea trebuie s lendeplineasc. Este important s identificm esentialul. De multe ori un enunt al unei probleme continefoarte multe elemente descriptive privind importanta problemei, consideratii de natur istoric, exemple,uneori chiar si etape distincte pentru obtinerea solutiei. Cerinta problemei furnizeaz, de multe ori, chiaridei privind modul de a ajunge la solutie. Considerarea unor configuratii particulare pentru datele de

    intrare si ncercarea de a lucra asupra lor, pentru a gsi solutia, va contribui ntotdeauna la o ntelegeremai bun a enuntului.

    Dac n enunt se sugereaz etapele rezolvrii, acestea implicnd rezolvarea unor subprobleme, atuncitrebuie s aflm solutia algoritmic corespunztoare fiecrei etape. Dac nu se specific etape, dar putemdescompune problema n subprobleme mai simple atunci solutia algoritmic a problemei initiale se vaobtine prin "compunerea" solutiilor subproblemelor. Deci este foarte important s stim s rezolvmprobleme simple, eventual probleme reprezentative pentru anumite clase de aplicatii si s stim sdescompunem (respectiv, s reducem) problema initial n (la) subprobleme usor de rezolvat si apoi sconstruim solutia final. Abordarea prin descompuneri repetate, cu detaliere pas cu pas se numesteabordare top-downsau rafinare iterativ.

    Abordarea prin care pornind de la solutii algoritmice ale unor probleme cunoscute, construim solutii alealtor probleme care au ns legtur cu problema de rezolvat, iar n final, urmnd aceeasi modalitateconstruim solutia problemei a crei solutie se cere, se numeste abordare bottom-up. Aceast metodpermite reutilizarea programelor existente si este tot mai important odat cu aparitia tehnicilor orientateobiect. De asemenea, pentru a obtine o solutie a unei probleme este util s privim problema si comparativcu alte probleme ntlnite. Numai dup investigarea acestor variante putem trece la stabilirea metodei deabordare.

    Pentru probleme de complexitate ridicat, oricare din metodele de abordare top-down sau bottom-up,conduc la o solutie modular, bazat pe subprogramesau, mai nou, la o solutie orientat obiect.

    Multe din problemele de programare pot fi rezolvate usor dac solutia verific anumite principii. Dacsolutia problemei este o multime de elemente care se poate obtine pas cu pas, pornind de la multimea vid,prin adugarea celui mai bun element neconsiderat nc (si ales conform anui anumit criteriu) spunem cavem de-a face cu o abordare de tipgreedy. Pentru probleme n care se cere o solutie optim care satisfaceprincipiul optimalittii (principiul lui Bellman) se va aplica metoda programrii dinamice. Alte strategiipentru elaborarea algoritmilor sunt: metoda divide et impera, metoda backtracking, euristica etc.

    Vreau sa vad nceputul capitolului

    Vreau sa vad Cuprinsul documentului.

  • 5/25/2018 Programare procedurala

    9/88

    G. Albeanu - PROGRAMARE PROCEDURALA - Introducere file:///C:/ACTIV/Proc/FINAL/C1.HTM

    6 of 6 12/9/2007 7:19 PM

    Versiune prescurtat a capitolului 1 din: G. Albeanu. Algoritmi si limbaje de programare. Editura Fundatiei"Romnia de Mine", 2000.

  • 5/25/2018 Programare procedurala

    10/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    1 of 16 12/9/2007 7:20 PM

    2. Algoritmi: Descriere, Complexitate,Corectitudine

    2.1. Notiuni de teoria grafurilor2.2. Scheme logice structurate2.3. Notiuni introductive privind organizarea datelor2.4. Limbaj algoritmic2.5. Analiza complexitatii2.6. Elemente privind corectitudinea algoritmilor

    2.1. Notiuni de teoria grafurilor

    Un graf neorientat G este definit prin perechea G = (V, E), unde V este o multime nevid de elementenumite vrfuri (vertex), iar E este o multime (posibil vid) de perechi neordonate cu componentedistincte ale lui V care se numesc muchii (edges). Dac E este multimea vid spunem c G este trivial. ncazul n care multimea V este finit spunem c avem un graf finit. Numrul elementelor multimii Vdetermin ordinul grafului finit. O muchie cu vrfurile x si y (numite extremitti) se noteaz prin [x, y]sau [y, x]. Spunem c vrfurile x si y sunt incidente muchiei [x,y].

    Un digraf este definit printr-o pereche G=(V, E), unde V este o multime nevid de vrfuri, iar E este oparte a produsului cartezian V x V ale crei elemente le numim arce. Un arc este notat prin (x,y) cu xdiferit de y, unde x se numeste surs sau extremitate initial, iar y se numeste destinatie sau extremitatefinal. Atributele : trivial, respectiv finit, pentru un digraf se definesc similar.

    Un graf (digraf) partial al unui graf (digraf) G = (V, E) este un graf (digraf) G1= (V, E1), unde E estesubmultime a multimii E, deci este graful (digraful) G nsusi sau se obtine din G prin suprimareaanumitor muchii (arce).

    Un subgraf (subdigraf) al unui graf (digraf) G este un graf (digraf) H = (U, E'), unde U este submultimea multimii V, E' este submultime a multimii E, iar muchiile (arcele) din E' sunt toate muchiile (arcele)

    din E, care au ambele extremitti n multimea de vrfuri U.Uneori, arcele (muchiile) sunt etichetate. Dac etichetele sunt numere reale pozitive se spune c digraful(graful) este ponderat.

    n continuare vom considera numai grafuri (digrafuri) finite. De obicei un graf se reprezint prinindicarea unor puncte din plan (ce corespund vrfurilor) si a unor segmente de curb (sau de dreapt)pentru indicarea muchiilor (vezi figura 2.1a). n cazul digrafurilor arcele sunt segmente de curborientate, sensul fiind de la surs spre destinatie (vezi figura 2.1b).

    Definitia 2.1.1.

  • 5/25/2018 Programare procedurala

    11/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    2 of 16 12/9/2007 7:20 PM

    Fie G = (V,E) un digraf, iar x si y dou vrfuri. Numim x-y drum (de lungime n) o secvent de vrfuri D:

    v0, v1, ..., vndac v0= x, vn= y , iar (vi, vi+1) apartine multimii E pentru toti i, i n-1. Vrfurile x si y se

    numesc extremittile drumului D. Un drum fr nici un arc este un drum trivial. Un x-y drum se numeste

    circuit (sau drum nchis) dac x=y; dac x diferit de y, se spune c drumul este unul deschis. Circuitul este

    elementar dac toate vrfurile circuitului, cu exceptia primului si a ultimului vrf care coincid, sunt

    distincte dou cte dou.

    Definitia 2.1.2. Fie G = (V, E) un graf neorientat, iar x si y dou vrfuri. Secventa de vrfuri L: v0, v1, ..., vneste un x-y lant (de lungime n) dac [ vi, vi+1] apartine multimii E, pentru toti i, 0 i n-1, iar x=v0si y=vn.

    L este ciclu dac x=y. Atributul elementar, pentru un lant, poate fi introdus similar.

    Uneori, chiar pentru un digraf, putem folosi notiunea de lant, dac se verific proprietatea c oricaredou arce vecine au o extremitate comun.

    Definitia 2.1.3.Numim lant (drum) hamiltonian un lant (drum) elementar al unui graf care contine toate vrfurile

    grafului.

    Definitia 2.1.4.

    Fie G = (V, E) un graf netrivial. Spunem c x, y din V sunt conectate n G dac exist un x-y lant n G.Graful G este un graf conex dac oricare dou vrfuri din V sunt conectate n G. Dac G este un graf trivial

    (E multime vid) se accept c este graf conex. Dac G nu este conex atunci exist cel putin dou

    componente conexe (subgrafuri conexe maximale, disjuncte dou cte dou relativ la vrfuri). Un digraf G

    cu proprietatea c pentru oricare dou vrfuri x si y exist att un x-y drum ct si un y-x drum n G se

    numeste graf tare conex.

    n sectiunea urmtoare prezentm o metod de reprezentare a algoritmilor folosind schemele logice.Acestea sunt introduse folosind terminologia teoriei grafurilor.

    2.2. Scheme logice structurate

    O transcriere grafic a etapelor (pasilor) unui algoritm este numit organigram. De cele mai multe orieste folosit denumirea de "schem logic". Fiecrui pas, al algoritmului, i se asociaz un bloc ceconstituie eticheta unui arc. Blocurile folosite ntr-o schem logic descriu instructiuni (comenzi) saupredicate (expresii logice). Predicatele apar n cadrul instructiunii de ramificare. Celelalte instructiunisunt:

    Instructiunea START: eticheteaz arcul initial (acel arc n a crui extremitate initial nu pot sosialte arce). Orice schem logic are un unic arc initial. Acesta va indica punctul de unde ncepeexecutia unui program.

    1.

    Instructiunea STOP: eticheteaz un arc final (acel arc din a crui extremitate final nu pot pleca

    alte arce). O schem logic poate avea mai multe arce finale. Acestea indic oprirea executieiprogramului descris prin intermediul schemei logice.

    2.

    Instructiunea CITESTE: eticheteaz un arc ce indic introducerea de la mediul de intrare(tastatur, disc etc.) a unei secvente de valori (numite date de intrare). Cuvntul CITESTE este

    nsotit de variabilele ce descriu datele de intrare.

    3.

    Instructiunea SCRIE: eticheteaz un arc ce indic nregistrarea la mediul de iesire (display, discetc.) a rezultatelor (datelor de iesire). Cuvntul SCRIE este nsotit de variabilele sau constantele cedesemneaz datele de iesire.

    4.

    Instructiunea de atribuire: eticheteaz un arc cu eticheta v := e, unde v este o variabil, iar e este oexpresie de acelasi tip (numeric sau logic) cu variabila v.

    5.

    Instructiunea de ramificare: este caracterizat prin n arce ce pleac din acelasi punct, arce6.

  • 5/25/2018 Programare procedurala

    12/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    3 of 16 12/9/2007 7:20 PM

    etichetate cu predicatele p1, p2, ..., pndefinite astfel nct:

    p1or p 2or ... or pn= TRUE (adevrat) sipi and pj= FALSE (fals) pentru oricare i si j diferiti.

    Definitia 2.2.1.Se numeste schem logic (sau program sub form de schem logic) un graf orientat, ncare:

    exist o unic instructiune START si cel putin o instructiune STOP;

    Orice vrf (diferit de extremitatea final a unei instructiuni STOP) este extremitatea initial a unei

    unice instructiuni;

    Orice arc este etichetat cu una dintre instructiunile: START, STOP, CITESTE, SCRIE, atribuire sau

    cu un predicat. In ultimul caz, extremitatea initial a arcului trebuie s coincid cu extremitatea

    initial a unei instructiuni de ramificare.

    pentru orice arc exist cel putin un drum care ncepe cu instructiunea START, se termin cu o

    instructiune STOP si contine arcul considerat.

    Schemele logice sunt folosite pentru descrierea algoritmilor. Se pot pune n evident structuri

    fundamentale precum:

    structura secvential- format din arce conectate etichetate cu instructiuni distincte de cea de ramificare. O structursecvential format din dou arce etichetate prin a, respectiv b se va nota prin SEQ(a,b) si aresemnificatia " execut a urmat de b".

    1.

    structuri decizionale(alternative) - contin, obligatoriu, cel putin un predicat si cel putin un bloc functional (instructiunealta dect START sau ramificativ). Structurile decizionale sunt de urmtoarele forme:

    IF(p; a, b) - Dac p este adevrat, atunci execut a altfel execut b (vezi figura 2.2a).IF0(p; a) - Dac p este verificat, atunci a (vezi figura 2.2b).

    CASE(p1,p2,...,pn; a1, a2, ..., an) - Dac p1atunci a1, dac p2atunci a2, ..., dac pnatunci an(vezi figura 2.2c).

    2.

    Structuri repetitive(structuri de tip ciclu, structuri iterative) - contin obligatoriu un bloc predicativ si un blocfunctional care se execut de un numr finit de ori pn cnd predicatul si schimb valoarea.Sunt posibile trei situatii:

    WHILE(p; a) - Ct timp conditia p este adevrat se execut a, apoi se continu cuurmtoarea instructiune ( vezi figura 2.3a: ciclu cu test initial).REPEAT(p; a) - Repet a pn cnd conditia p este adevrat, apoi execut instructiuneaurmtoare ( vezi figura 2.3b: ciclu cu test final).FOR(p; a, b, c) - Este echivalent cu SEQ(a, WHILE(p; SEQ(b, c))). Blocul a este un bloc

    functional de initializare. Blocul b descrie instructiunea ce se va executa cnd conditia p esteadevrat. Blocul c (prezentat explicit n aceast structur) va descrie actualizarea strilorvariabilelor programului cu rol deosebit n evaluarea conditiei p ( vezi figura 2.3c: ciclu cucontor).

    3.

    Exemplul 2.2.1. Urmtoarea descriere reprezint o secvent. Uneori secventele se pot eticheta (* vezifigura 2.4).

    ET1 SEQwrite('Introduceti 3 numere:');

    read(x,y,z); media:=(x+y+z)/3;

  • 5/25/2018 Programare procedurala

    13/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    4 of 16 12/9/2007 7:20 PM

    writeln('Media = ',media);ET1 END

    Eticheta secventei de mai sus este ET1, iar componentele secventei sunt instructiuni Pascal. Secventadescrie citirea a trei numere, calculul mediei aritmetice si afisarea rezultatului.

    Exemplul 2.2.2. Urmtoarele secvente ilustreaz structurile decizionale.

    a)(* vezi figura 2.5a*)

    ET2 SEQread(x);>

    if (x>0) or (x=0) then write('Numar nenegativ') else write('Numar negativ');ET2 END

    b)(* vezi figura 2.5b*)

    ET3 SEQ read(titlu); cod:=0; if nume='algebra' then cod:=1;

    write(cod);ET3 END

    c)(* exercitiu *)

    ET4 SEQzar:=1+random(6);case zar of

    1, 3, 5 : impar:=impar+1; 2, 4, 6 : par:=par+1; endET4 END

    Secventa ET2 descrie citirea unei valori (se presupune c x este un numr) si afisarea unui mesaj nfunctie de semnul numrului x. Secventa ET3, citeste un titlu, iar dac se introduce 'algebra' atuncicodul asociat este 1, n rest codul este 0. n final se scrie codul. Prin secventa ET4 se genereaz un numraleator ntre 1 si 6. Apoi se analizeaz paritatea numrului. Dac secventa ET4 s-ar repeta, atuncivariabila impar ar contine numrul de aparitii ale numerelor impare. Similar, variabila par vareprezenta numrul numerelor pare generate.

    Exemplul 2.2.3. Prin urmtoarele secvente exemplificm structurile repetitive: While, Repeat si For(Elaborarea schemelor logice este lsat ca exercitiu).

    a)ET5 SEQ read(x);i:=1; cod:=0;

    while ((i

  • 5/25/2018 Programare procedurala

    14/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    5 of 16 12/9/2007 7:20 PM

    for i:=1 to n do begin read(x); suma:=suma+x end; writeln('Suma =', suma);ET7 END

    Secventa ET5 descrie citirea unui element x si verificarea ipotezei: "Elementul x se afl printre cele nelemente din tabloul a". n secventa ET6 se descrie generarea repetat de numere pn la aparitiavalorii 6. Secventa ET7, folosind variabila de contorizare i, citeste n numere, le calculeaz suma si apoi oafiseaz. Observati prezenta predicatului la iteratiile de tip While si Repeat.

    Definitia 2.2.2.Un algoritm exprimat n functie de structurile SEQ, IF si WHILE se numeste structurat, schema logic

    asociat se numeste schem logic structurat, iar programul corespunztor se numeste program

    structurat.

    Evident, familia algoritmilor structurati este nevid. Un rezultat foarte important afirm: Orice algoritmpoate fi transformat ntr-un algoritm structurat. Aceast afirmatie are la baz teorema Bohm-Jacopini.Pentru a transforma o schem logic (nestructurat) ntr-o schem logic structurat se poate folosiregula variabilei booleene (ce rezult din demonstratia teoremei Bohm-Jacopini). Cititorul interesat dedetalii poate consulta lucrarea: Corrado Bohm, Giuseppe Jacopini - Flow-diagrams, Turing Machines and

    languages with only two formation rules. Comm. ACM. 9 (May, 1966), 366-371. Una din consecinteleimportante ale programrii structurate este eliminarea instructiunii de salt neconditionat (goto) dinprograme. Totusi, exist situatii cnd instructiunea goto este util. Lungimea programelor nu va creste,iar claritatea algoritmului nu va avea de suferit. Important este ca numrul instructiunilor goto folosites fie foarte mic, iar salturile s fie locale.

    2.3. Notiuni introductive privind organizarea datelor

    Organizarea datelor, n vederea prelucrrii acestora, este un proces complex, dar de o deosebitimportant. De modul n care sunt structurate datele, depinde eficienta algoritmilor de prelucrare.Unele date sunt de tip simplu: data apare ca o entitate indivizibil att din punct de vedere a informatieipe care o reprezint ct si n raport cu unitatea central de prelucrare. Alte date sunt descrise princomponente, cu acelasi tip sau cu tipuri diferite. O colectie de date pe care s-a evidentiat un anumit modde structurare si s-au stabilit procedeele de nregistrare/identificare a componentelor se va numistructur de date. Componentele unei structuri de date pot fi de tip elementar sau pot fi, la rndul lor,structuri. Identificarea unei componente se poate face prin pozitia pe care o ocup n structur sau prinnume.

    Pentru o dat elementar trebuie specificate: un identificator, atribute (domeniul de valori, modul dereprezentare n sistemul de calcul, precizia reprezentrii) si valorile datei (pot fi enumerate sau indicateprintr-o proprietate comun). Din punct de vedere al domeniului de valori asociat unei date se distingurmtoarele clase:

    date de tip integer (numere ntregi);date de tip real sau float (cu elemente din multimea numerelor rationale);date de tip boolean (se refer la valorile de adevr true (adevrat), false (fals));date de tip char (cu elemente ale multimilor ASCII sau Unicode);date de tip string (obtinute prin concatenarea datelor de tip caracter);date de tip array(structur cu componente de acelasi tip ce ocup locatii succesive din memoria sistemului de

  • 5/25/2018 Programare procedurala

    15/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    6 of 16 12/9/2007 7:20 PM

    calcul, identificate prin pozitie);date de tip record (structur cu componente oarecari, identificate prin nume).

    Un mod special de organizare a datelor este ntlnit cnd avem de prelucrat liste. O list liniar este ostructur de date omogen, secvential, format din elemente apartinnd unei multimi date. O listpoate fi vid (nu are nici un element) sau plin (nu mai exist spatiu pentru stocarea unor componentesuplimentare). Este foarte important s putem accesa un element al listei, s inserm sau s stergem unelement etc.

    Listele pot fi stocate n memoria unui sistem de calcul n dou moduri: secvential si nlntuit. Modulsecvential presupune stocarea elementelor listei n locatii succesive de memorie conform ordiniielementelor din list si retinerea adresei primului element al listei (adresa de baz). Modul nlntuitpresupune c fiecare element al listei este nlocuit cu o celul format dintr-o parte de informatie(corespunztoare elementului listei) si o parte de legtur ce contine adresa celulei urmtorului elementdin list. Se va retine adresa de baz a listei, iar ultima celul va indica, n partea de legtur, o valoarespecial (ce nu poate desemna o legtur).

    Structura de date elementar adecvat reprezentrii secventiale a listelor este tabloul unidimensional.

    Orice list liniar are un nceput si un sfrsit pe care le numim baz, respectiv vrf. O list liniar lacare inserarea si extragerea elementelor se face prin vrful listei se numeste stiv (stack). O list liniar

    n care inserrile se efectueaz la baza listei, iar extragerile prin vrful listei se numeste coad (queue).

    Listele liniare pot fi transformate n liste circulare considernd c legtura ultimului element indicadresa bazei listei.

    2.4. Limbaj algoritmic

    O alt modalitate de reprezentare a algoritmilor o constituie utilizarea limbajului algoritmic. Limbajulalgoritmic foloseste o scriere similar limbajelor de programare moderne. El permite att descrierea

    instructiunilor algoritmului ct si descrierea exact a tipului datelor cu care lucreaz algoritmul. Unalgoritm descris folosind limbajul algoritmic este o succesiune finit de declarri si instructiuni.Declarrile precizeaz tipul si organizarea datelor. Ele apar naintea instructiunilor ce descriu pasiialgoritmului. Din punct de vedere al scrierii instructiunilor, o instructiune poate ocupa mai multernduri sau pe un rnd pot fi scrise mai multe instructiuni. Instructiunile vor fi separate, ntre ele,folosind caracterul ';'.

    Cuvintele care identific un tip de date sau o instructiune, numite n continuare cuvinte cheie, aparevidentiate pentru a fi deosebite de numele variabilelor. O declarare utilizeaz unul dintre cuvintelecheie integer, real, boolean, char, string, array, record, stack, queue, urmat de o list de nume devariabile. Declarrile sunt separate, ntre ele, folosind caracterul ';'. Variabilele prezente ntr-o list au

    tipul si organizarea precizat prin cuvntul cheie respectiv. De exemplu, declarrile:integer array a(10);record (integer cod; string nume; real media) x, y;stack S; queue Q; char ch; boolean ind;indic faptul c a este un tablou cu maxim 10 elemente ntregi; x si y sunt nregistrri (cu treicomponente: cod - o valoare ntreag, nume - un sir de caractere, media - un numr real), S este o stiv,Q este o coad, ch este un caracter, iar ind este o variabil logic.

    O important deosebit o au declarrile de subprograme. n rezolvarea multor probleme aparenecesitatea executrii repetate a acelorasi calcule pentru date diferite. Subprogramele permit descriereaacestor calcule o singur dat. Subprogramul poate fi apelat ori de cte ori este necesar efectuarea

  • 5/25/2018 Programare procedurala

    16/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    7 of 16 12/9/2007 7:20 PM

    acestor operatii. Un subprogram este identificat printr-un nume si o list de parametri. Subprogramelese mpart n proceduri si functii. Delararea unei proceduri const n specificarea cuvntului procedure,a unui identificator al procedurii si a unei liste de declarri (ntre paranteze rotunde) ce indicinformatiile ce fac obiectul transferului ntre apelant si apelat. Pentru declararea unei functii se folosestecuvntul cheie function. Spre deosebire de proceduri, functiile ntorc obligatoriu un rezultat. De aceea,

    n declaratii, declararea unei functii ncepe cu specificarea multimii de valori ce corespunde rezultatului,a cuvntului function, a identificatorului functiei si a listei parametrilor (similar ca la o procedur).

    Un algoritm este complet cunoscut dac este descris si definitia subprogramelor folosite. Definitia unuisubprogram presupune descrierea (prin instructiuni) modului n care se efectueaz calculele si setransmit rezultatele. Mai multe detalii prezentm n finalul acestei sectiuni.

    Instructiunile limbajului algoritmic sunt urmtoarele:

    Instructiunea de atribuire. Aceast instructiune are forma: v := E (atribuire simpl) sau (v1, v2, ...,vn) := (E1, E2, ..., En) ce realizeaz simultan atribuirile vi:=Ei, pentru oricare i = 1, 2, ..., n.Operatia de atribuire este permis cnd variabila v (variabilele v1, v2, ..., vn) din membru stng siexpresia E (expresiile E1, E2, ..., En) sunt compatibile (se refer la aceeasi aclas de obiecte). Oexpresie contine paranteze (optional), operanzi (inclusiv apeluri de functii) si operatori adecvati.

    1.

    Instructiuni de intrare/iesire.Vom presupune c citirea datelor (de intrare) se face de la un mediu de intrare (de exemplu:tastatura sistemului de calcul), iar scrierea rezultatelor (de iesire) se face la un mediu de iesire (deexemplu: ecranul, imprimanta, plotterul etc.). Forma instructiunilor de intrare/iesire este:read v1, v2, ..., vnwrite v1, v2, ..., vnunde v1, v2, ..., vnsunt variabile de tip elementar.

    2.

    Instructiunea repetitiv While. Aceast instructiune are forma: while p do S, unde p este unpredicat, iar S este o secvent de instructiui. Deoarece instructiunile sunt separate ntre ele,folosind ';' va trebui s delimitm secventa S. Pentru aceasta se utilizeaz constructia SEQ..ENDprezentat mai sus. Semnificatia acestei instructiuni este aceeasi ca pentru sub-schema logic

    While(p; S).

    3.

    Instructiunea If_then_else. Aceast instructiune are forma: if p then S1 [elseS2 ], unde p este unpredicat, iar S1 si S2 sunt secvente de instructiuni. Dac nendeplinirea predicatului p nu indicvreo actiune, portiunea elseS2 poate lipsi, fapt reprezentat prin includerea ntre paranteze drepte, exprimarea fiindechivalent cu IF0(p; S1). Atunci cnd att S1 ct si S2 sunt actiuni prevzute, instructiunea esteechivalent cu sub-schema logic IF(p; S1, S2).

    4.

    Instructiunile insert si extract. Aceste instructiuni sunt necesare pentru lucrul cu liste. Acesteasunt o prelungire a instructiunii de atribuire. Dac se specific o list L atunci insert i, L (sau L:=i)exprim introducerea elementului specificat prin i n lista L, iar instructiunea extract i, L (saui:=L) specific extragerea elementului curent din lista L si depunerea acestuia n i.

    5.

    Instructiunea apel de procedur. Apelarea unei proceduri se face prin instructiunea apel deprocedur care are una din formele:identificator_procedurasauidentificator_procedura(lista de argumente)unde identificator_procedura specific o procedur declarat, iar argumentele sunt expresiiseparate prin virgul.

    Se presupune c atunci cnd se ajunge la un apel de procedur se stabileste corespondenta ntreargumente si parametri, si se execut toate instructiunile specificate n definitia procedurii. Dupultima instructiune a procedurii se continu cu instructiunea urmtoare apelului de procedur.

    6.

  • 5/25/2018 Programare procedurala

    17/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    8 of 16 12/9/2007 7:20 PM

    Un apel de procedur este corect atunci cnd ntre argumente si parametri exist o concordant canumr, tip si mod de organizare. Convenim ca atunci cnd referim o variabil (ntr-o procedur)de fapt, facem o referire la locatia de memorie corespunztoare argumentului respectiv. Spunemc se realizeaz un transfer prin referint. Sunt posibile si alte moduri de transfer, dar acestea nusunt considerate momentan.

    Instructiunea return. Aceast instructiune provoac prsirea corpului unui subprogram. n cazuln care cuvntul return

    este urmat de o expresie, valoarea expresiei este folosit ca valoare de retur a subprogramului.Instructiunea returnfr valoare de retur este folosit pentru a prsi executia unei proceduri si a reveni n unitatea deprogram din care a avut loc apelul; si anume la instructiunea ce urmeaz imediat acestui apel.

    7.

    Pentru a usura descrierea algoritmilor admitem prezenta, ca instructiuni ale limbajuluialgoritmic, a instructiunilor Repeat si For. Instructiunea Repeat este modelat de structurarepetitiv REPEAT (p; S). Ea are forma:Repeat S until p;unde S este o secvent (eventual vid) de instructiuni, iar p modeleaz o expresie logic.

    Instructiunea For este modelat de structura iterativ FOR(p; a,b,c) si are forma simplificat

    For v := e1, e2, e3do Sunde: S este o secvent de instructiuni, iar expresiile e1, e2si e3au acelasi domeniu de valori cavariabila v. n forma prezentat, instructiunea determin executarea secventei S pentru v lundsuccesiv valorile e1, e1+e3, e1+2e3, ..., fr a trece dincolo de e2. Formei de mai sus i corespundestructura iterativ:FOR((v-v2)*v30; SEQ v:= e1; v1:=e2; v3:=e3END, S, v := v +v3).

    8.

    2.5. Analiza complexittii

    Existenta unui algoritm de rezolvare a unei probleme genereaz, imediat, ntrebri ca:Mai exist un alt

    algoritm de rezolvare? Este algoritmul gsit "cel mai rapid"? Acest paragraf introduce notiunilefundamentale privind complexitatea algoritmilor si prezint exemple simple de algoritmi pentru care sedetermin complexitatea.

    Analiza complexittii unui algoritm presupune determinarea resurselor de care acesta are nevoie pentrua produce datele de iesire. Prin resurs ntelegem timpul de executare, dar uneori este necesar sanalizm si alte resurse precum: memoria intern, memoria extern etc.Modelul masinii pe care va fiexecutat algoritmul nu presupune existenta operatiilor paralele; operatiile se execut secvential.

    Timpul de executare al unui algoritm reprezint numrul de operatii primitive executate. Trebuie,pentru fiecare algoritm, s definim notiunea de operatie primitiv, independent de masina secvential pe

    care se va executa algoritmul.n analiza complexittii unui algoritm avem n vedere cazul cel mai defavorabil din mai multe motive:

    Timpul de executare n cazul cel mai defavorabil ofer o limit superioar a timpului de executare(avem certitudinea c executarea algoritmului nu va dura mai mult).

    1.

    Situatia cea mai defavorabil este ntlnit des.2.Timpul mediu de executare este, uneori, apropiat de timpul de executare n cazul cel maidefavorabil, dar dificil de estimat.

    3.

    Analiza exact a complexittii unui algoritm conduce la formule extrem de complicate. De aceea sefolosesc notatii asimptotice, care evidentiaz doar termenul preponderent al formulei.

  • 5/25/2018 Programare procedurala

    18/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    9 of 16 12/9/2007 7:20 PM

    Fie f si g dou functii reale. Atunci:

    f(x) = o(g(x)) dac exist si este egal cu 0 (zero) limita:

    f(x) = O(g(x)) dac exist c si x0astfel nct

    f(x) = theta(g(x)) dac exist constantele C1si C2pozitive, si x0astfel nct pentru orice xx0:

    f(x) ~ g(x) dac

    f(x) = Omega(g(x)) dac exist M>0 si un sir x1, x2, ..., xn, ... Inf astfel nct pentru oricare j>0 areloc inegalitatea

    n general, se consider c un algoritm este mai rapid dect altul dac are un ordin de mrime pentrutimpul de executare mai mic. Pentru o dimensiune mic a datelor de prelucrat, aceste comparatii pot fi(ns) eronate.

    Notatia theta este utilizat pentru a specifica faptul c o functie este mrginit (inferior si superior).Semnificatia notatiei O este de limit superioar, n timp ce semnificatia notatiei Omega este de limitinferioar.

    Exemple: x3= o (x5); sin(x) = o (x); (x+1)2= theta (2x2); x2+3x ~ x2.

    Definitia 2.5.1.Fie A un algoritm, n dimensiunea datelor de intrare si T(n) timpul de executare estimat pentrualgoritmul A. Se spune c algoritmul A are comportare polinomial (apartine clasei P) dac exist p>0

    astfel nct T(n) = O(np).

    Definitia 2.5.2. O functie care creste mai rapid dect functia putere xp, dar mai lent dect functia

    exponential ax

    cu a>1 se spune c este cu crestere exponential moderat. Mai precis: f este cu crestere exponential

    moderat dac pentru oricare p>0 avem f(x) = Omega(xp) si oricare M>0 avem f(x) = o((1+ M)x).

    Definitia 2.5.3. O functie f are crestere exponential dac exist a>1 astfel nct f(x) = Omega(ax) si

    exist b>1 astfel nct f(x) = O(bx).

    Printre functiile n -> f(n), nemrginite, functiile ce cresc cel mai lent sunt, de exemplu, de forma log log n

    sau (log log n)1,02. Pentru n = 1000000, log log n ~ 2,6. Deci un algoritm a crui complexitate este log logn este preferabil unui algoritm (elaborat pentru rezolvarea aceleiasi probleme) de complexitate log n.Algoritmii de tip polinomial sunt mai lenti (cresterea functiei T(n) este mai rapid) dect algoritmii de

    tip logaritmic. Urmeaz apoi algoritmii moderati (cu T(n) de forma nlognetc.) si cei cu crestere

    exponential (2n, n33n

    etc.). Algoritmii cei mai lenti sunt cei pentru care functia T(n) este foarte rapid cresctoare (de exemplu:T(n) = n!).

    n informatic sunt interesanti numai algoritmii care conduc la un timp de calcul cel mult moderat.Dac un algoritm necesit timp de calcul exponential sau factorial, acesta va fi utilizat numai n cazuri

  • 5/25/2018 Programare procedurala

    19/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    10 of 16 12/9/2007 7:20 PM

    exceptionale. Tabelul urmtor ilustreaz cele de mai sus.

    n 10 100 1000 10000

    n2 100 10000 1000000 100000000

    n3 1000 1000000 1000000000 1000000000000

    log n 1 2 3 4

    log log n 0 0.30103 0.47712 0.60206

    Exemplul 2.5.1. (Produsul a dou numere complexe).Considerm numerele complexe a+bi si c+di (i2 =-1; a, b, c, d numere reale). Un algoritm pentru calculul produsului (a+bi)(c+di) este urmtorul:

    real a,b,c,d,p,q; real t1,t2; P1 SEQ Read a, b, c, d; t1:=a*c; t2:=b*d; p:=t1-t2; t1:=a*d; t2:=b*c; q:=t1+t2; write p,q; P1 END

    Acest algoritm (notat P1) necesit 4 nmultiri, o adunare si o scdere. n final p reprezint partea real,iar q furnizeaz partea imaginar a produsului celor 2 numere complexe. Urmtorul algoritm (notat P2)calculeaz acelasi produs folosind 3 nmultiri, 3 adunri si 2 scderi:

    real a,b,c,d,p,q; real t1,t2,t3,t4;P2 SEQ Read a, b, c, d; t1:=a+b; t2:=t1*c; t1:=d-c; t3:=a*t1; q:=t2+t3; t1:=d+c; t4:=b*t1; p:=t2-t4;

    write p,q;P2 END

    Algoritmul P1 necesit 2 locatii temporare, n timp ce algoritmul P2 necesit 4 locatii suplimentare. nplus, necesarul de memorie depinde de metoda de reprezentare a numerelor reale ntr-un sistem decalcul.

    (Determinarea valorii maxime si a indicelui corespunzator, dintr-un sir (tablou)). Fie X un tablou cu nelemente apartinnd unei multimi total ordonate Q: X = (x1, x2, ..., xn) cu xidin Q pentru i = 1, 2, ..., n.Fie y o variabil de tipul Q. Se caut un indice k, ntre 1 si n astfel cay := max{xi: i=1, 2, ..., n | = xk,

    iar k este cel mai mic numr cu aceast proprietate.Pentru rezolvarea acestei probleme putem utiliza urmtorul algoritm, denumit n continuare MAXIM,pentru Q = real.

    procedure maxim(x,n,y,k) integer n;real array x(n); real y; integer i,k; SEQ k:=1; y:=x[1]; for i = 2, n, 1 do if y < x[i] then SEQ y := x[i]; k:=i END; return END

  • 5/25/2018 Programare procedurala

    20/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    11 of 16 12/9/2007 7:20 PM

    Observm c T(n) = n-1. Necesarul de memorie pentru stocarea datelor de prelucrat se exprim nfunctie de metoda de reprezentare a informatiei n calculator.

    Propozitia 2.5.1.Pentru determinarea maximului dintre n elemente ale unei multimi total ordonate sunt necesare celputin n-1 comparri (T(n) = n-1).

    Exemplul 2.5.3. (Determinarea celui mai mare divizor comun).Fie m si n dou numere ntregi pozitive si,

    q si r ctul, respectiv restul mprtirii lui n la m, adic n = qm+r (0 r < m). Spunem c m divide n dacrestul mprtirii lui n la m este zero.

    Pentru determinarea celui mai mare divizor comun (cmmdc) a dou numere se poate utiliza algoritmullui Euclid. Dac d este un divizor oarecare al numerelor n si m, atunci d divide restul r. Reciproc, dac deste un divizor al numerelor m si r, relatia n = mq + r arat c d este divizor al numrului n. Deci:

    cmmdc(n, m) = cmmdc(m, r).

    Dac r = 0 atunci n = qm. Deci cmmdc(n, m) = m. Folosind notatia n mod m pentru r, putem scrie:

    cmmdc(n, m) = cmmdc(m, n mod m).

    Necesarul de memorie pentru stocarea numerelor n si m se poate exprima prin

    theta(log m) + theta(log n) ~ theta(log (mn)) biti.

    Timpul necesar executrii algoritmului este dat de urmtorul rezultat.

    Propozitia 2.5.2.Fie n si m dou numere ntregi pozitive. Algoritmul lui Euclid pentru a determina cmmdc(m, nefectueaz cel mult [2log2M]+1 operatii de mprtire ntreag, unde M = max (m, n).

    Exemplul 2.5.4. (Sortare prin insertie).Fiind dat o secvent de elemente caracterizate de valorile x1, x

    2,

    ..., xn apartinnd unei multimi total ordonate T, s se determine o permutare xi(1), xi(2), .., xi(n) asecventei date, astfel nct xi(j) xi(k)pentru i(j) i(k), unde " " este relatia de ordine pe multimea T. Metoda ce va fi prezentat continuare se mai numeste si "metoda juctorului de crti", si este una dintre cele mai cunoscute metodede sortare.

    Sortarea prin insertie se bazeaz pe urmtoarea procedur: Fie un tablou x cu n elemente (x[i] este ali-lea element din secventa de intrare). Pornim cu subtabloul x[1] si la primul pas cutm pozitia n carear trebui s se gseasc elementul x[2]. Dac x[2] < x[1], atunci x[2] trebuie s fie mutat n loculelementului x[1]. La un pas i (pentru i ntre 1 si n), avem subtabloul x[1..i-1] ordonat si ncercm s-l

    plasm pe x[i] astfel nct s obtinem un tablou sortat ntre pozitiile 1 si i. Pentru aceasta, se comparsuccesiv x[i] cu elementele tabloului x[1..i-1] pentru a se determina acea pozitie j pentru care x[i] x[j],indexul de plasare fiind j+1.

    Algoritmul prezentat n continuare utilizeaz insertia direct:

    procedure insert_sort(n,x); integer n; integer array x(n); integer i,j,temp; SEQ for i = 2, n, 1 do SEQ

  • 5/25/2018 Programare procedurala

    21/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    12 of 16 12/9/2007 7:20 PM

    temp :=x[i]; j:=i-1; while (j>=1) and (x[j] > temp) do SEQ x[j+1] :=x[j]; j:=j-1 END x[j+1]:=temp END; return

    END

    Este clar c, timpul de executie nu depinde doar de n, numrul de elemente de sortat, ci si de pozitiainitial a elementelor din secvent.

    Fie F(n) - numrul de comparri necesare, iar G(n) numrul de mutri necesare algoritmului insert_sortpentru sortarea unui tablou cu n elemente.

    Propozitia 2.5.3.

    Complexitatea metodei de sortare prin insertie direct este caracterizat prin: F(n) = O(n2), G(n) =

    O(n2).

    2.6. Elemente privind corectitudinea algoritmilor

    A verifica corectitudinea unui algoritm nseamn a verifica dac algoritmul conduce ntr-un intervalfinit de timp la obtinerea solutiei corecte a problemei pentru care a fost elaborat. Vom vedea n capitolul5 cteva metode de rezolvare a problemelor, deci de a elabora algoritmi. Metodele descrise n acestcapitol se vor exemplifica pentru algoritmi simpli. Pentru aspecte suplimentare legate de corectitudineaalgoritmilor se poate folosi lucrarea: Tudor Blnescu. Corectitudinea algoritmilor. Editura Tehnic,

    Bucuresti, 1995.

    Notatie. Constructia {P}A{Q}, numit si formul de corectitudine total contine urmtoarele elemente:

    P - comentariu care descrie propriettile datelor de intrare (preconditia);

    A - algoritmul (secventa de instructiuni) supus analizei;

    Q - comentariu care descrie propriet{tile datelor de iesire (postconditia).

    Definitia 2.6.1. Un algoritm {P}A{Q} este corect cnd propozitia urmtoare este valid:

    Dac

    datele de intrare satisfac preconditia P

    Atunci

    1) executarea lui A se termin (ntr-un interval finit de timp)si

    2) datele de iesire satisfac postconditia Q.

    Folosind elementele fundamentale ale logicii matematice rezult c urmtoarele observatii suntadevrate:

    Algoritmul {false}A {Q} este corect, oricare ar fi A si Q.1.

  • 5/25/2018 Programare procedurala

    22/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    13 of 16 12/9/2007 7:20 PM

    Algoritmul {P}A{true} este corect dac si numai dac executarea lui A se termin atunci cnddatele initiale satisfac proprietatea P.

    2.

    Dac{P}A{Q} si {R}A{Q} sunt formule corecte, atunci {P v R}A {Q} este formul corect.3.

    Pentru a stabili corectitudinea algoritmilor complecsi se procedeaz la descompunerea acestoraelemente simple a cror corectitudine se analizeaz. n continuare vor fi prezentate reguli pentruanaliza corectitudinea unor astfel de algoritmi. Pentru o formalizarea avansat a acestor reguli, cititorul

    interesat poate parcurge lucrarea: C. A. R. Hoare et al. Laws of Programming. Comm. ACM. 30(8), 1987,672-687.

    Regula compunerii secventiale (CS):

    Dac A este de forma SEQ B; C END atunci a verifica formula {P}A{Q}, revine la a verifica for{P}B{R} si {R}C{Q}, unde R este un predicat asupra datelor intermediare.

    Este evident c regula CS poate fi aplicat iterativ. Mai precis, dac A este de forma SEQ A1; A2; ..., AnEND atunci obtinem regula compunerii secventiale generale:

    &t9;CSG: Dac {P0} A1{P1}, {P1} A2{P2}, ...., {Pn-2}An-1{Pn-1} si

    {Pn-1}An{Pn} sunt algoritmi corecti,

    atunci{P0}A{Pn} este algoritm corect.

    Exemplul 2.6.1.Este usor de verificat c urmtorul algoritm este corect (presupunem c x si y sunt variabile ntregi, iara si b constante ntregi):

    { x = a si y = b} SEQ x:=x+y;

    y:=x-y; x:=x-y END{ x = b si y = a }

    Regula implicatiei (I):

    Aceast regul este util n cazul algoritmilor ce urmeaz a fi aplicati n conditii mai tari dect pentrucele care au fost deja verificati.

    O proprietate P este mai tare dect proprietatea Q dac este adevrat propozitia compus: P -> Q.Regula implicatiei are urmtoarea form:

    I: Dac{P} A {Q} este algoritm corect, P1-> P si Q -> Q1,

    atunci {P1} A {Q1} este algoritm corect.

    Regula instructiunii de atribuire (A):

  • 5/25/2018 Programare procedurala

    23/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    14 of 16 12/9/2007 7:20 PM

    Fie notatiile:

    x Variabil simpl

    e Expresie;

    Def(e) Proprietatea satisfcut de acele elemente pentru care evaluarea

    expresiei e este corect (Exemplu: pentru integer array b(10),

    Def(b(i)):= (i=1, 2, ..., 10));

    P(x) Formul n care apare variabila x;

    P(x/e) Formula obtinut din P(x) prin substituirea variabilei simple x cu

    expresia e, ori de cte ori x este variabil liber n P, iar dac e

    contine o variabil y care apare legat n P, nainte de substitutie

    variabila y se nlocuieste printr-o nou variabil (care nu mai apare

    n e).

    Valoarea de adevr a propozitiei P -> Q(x/e) nu se schimb dac n Q(x/e) se efectueaz substitutidescris de atribuirea x := e. Regula atribuirii este deci:

    A: Dac P -> (Def(e) and Q(x/e)) atunci algoritmul {P} x:=e {Q} este corect.

    Exemple de instructiuni corecte:

    a){x = n!} n:=n+1; x:=x*n {x = n!}

    b){(x = a) and (y = b)} t:=x; x:=y; y:=t {(x = b) and (y = a)}

    c){(1 Def(c) este adevrat

    Atunci formula

    {P} if c then A else B {Q} este corect.

    IFR: Dac

  • 5/25/2018 Programare procedurala

    24/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    15 of 16 12/9/2007 7:20 PM

    {P and c} A {Q} este corect, iar P and (not c) -> Q si P -> Def(c) sunt adevrate

    Atunci

    {P} if c then {Q} este formul corect.

    Se poate observa c aplicarea regulilor instructiunii de decizie nu este n sine dificil corectitudineacestei instructiuni se reduce la corectitudinea instructiunilor componente.

    Exemple de instructiuni corecte:

    a){true} if x>y then SEQ t:=x; x:=y; y:=t END {x =y then m:=x else m:=y {m = max(a,b)}

    c){x=a} if x Def(c)).

    Proprietatea I rezult prin executarea secventei A (adic, {P} A {I} este algoritm corect).

    La terminarea instructiunii while, proprietatea final Q poate fi dedus (adic, I and (not C) ->

    Q).

    I este proprietate invariant la executarea unei iteratii: dac I este adevrat nainte de executareasecventei S si expresia boolean c este adevrat, atunci executarea secventei S se termin ntr-uninterval finit de timp si I este adevrat la sfrsit (adic, {I and c} S {I} este algoritm corect).

    Dac rezultatul evalurii expresiei c este true si proprietatea I este adevrat, atunci exist celputin o iteratie de efectuat (adic, I and c -> (t > =1)).

    Valoarea lui t descreste dup executarea unei iteratii (adic, {(I and c) and (t=a)} S {t < a}).

    n aceste conditii, algoritmul considerat este corect.

    Exemplul 2.6.2. (Determinarea celui mai mare divizor comun a dou numere ntregi). Fie a si b dounumere ntregi, iar m = |a| si n = |b|. Atunci urmtorul algoritm este corect.

    {(x > 0) and (y > 0) and (x = m) and (y = n)}

    while x y do

    if x > y then x := x - y else y := y - x;

  • 5/25/2018 Programare procedurala

    25/88

    ALGORITMI I file:///C:/ACTIV/Proc/FINAL/C3.HTM

    16 of 16 12/9/2007 7:20 PM

    {x = cmmdc(m,n)}

    ntr-adevr, exist proprietatea invariant

    I: (cmmdc(x,y) = cmmdc(m,n)) and (x > 0) and (y > 0),

    iar ca functie de terminare se poate lucra cu: t(x,y) = x+y. Verificarea ipotezelor regulii W este simpl.

    Exemplul 2.6.3. (Al n-lea termen al sirului lui Fibonacci). Fie fn, al n-lea termen al sirului lui Fibonacci.

    Urmtorul algoritm este corect.

    {n >= 0}

    a:=0; b:=1; k:=n;

    while (k > 0) do

    SEQ

    temp := b;

    b := a + b;

    a := temp;

    k := k-1

    END;

    {a = fn}

    ntr-adevr, lum functia de terminare t(k) = k, iar proprietate invariant este:

    I: (a = fn-k) and (b = fn-k+1) and (temp = fn-k) and (0

  • 5/25/2018 Programare procedurala

    26/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    1 of 48 12/9/2007 7:21 PM

    3. Limbaje de programare

    3.1. Vocabularul si sintaxa limbajelor de programare3.2. Tipuri de date. Constante. Variabile. Expresii

    3.3. Programare n C

    3.1. Vocabularul si sintaxa limbajelor de programare

    Vocabularul unui limbaj de programare este format din cele mai simple elemente cu semnificatie lingvisticnumite entitti lexicale sau tokens. Elementele vocabularului sunt alctuite din caractere Unicode (constituie alfabetul limbajului). Standardul Unicode contine ca subset codul ASCII, dar reprezentareintern a caracterelor Unicode foloseste 16 biti. Cele mai utilizate simboluri sunt: literele mari sialfabetului englez, cifrele sistemului zecimal, diferite semne speciale.

    Unittile lexicale sunt separate, ntre ele, prin comentarii si spatii. Pentru aproape toate limbajeleprogramare se pot evidentia unitti lexicale precum: cuvinte cheie, identificatori, literali, separatoroperatori. Cuvintele cheie sunt secvente de caractere ASCII rezervate (nu pot avea alt semnificatie)utilizate pentru definirea unittilor sintactice fundamentale. Pentru exemplificare ne referim la limbajele deprogramarePascal siJava:

    Cuvinte cheie Pascal:absolute, and, array, begin, case, const, div, do, downto, else, end, external, file,for, forward, function, goto, if, implementation, in, inline, interface, interrupt, label, mod, nil, not, of,or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses,var, while, with, xor.

    1.

    Cuvinte cheie Java:abstract, boolean, break, byte, case, cast, catch, char, class, const, continue,default, do, double, else, extends, final, finally, float, for, future, generic, goto, if, implements, import,inner, instanceof, int, interface, long, native, new, null, operator, outer, package, private, protected,public, rest, return, short, static, super, switch, synchronized, this, throw, throws, transient, try, var,void, volatile, while, byvalue. Cuvintele cheie subliniate sunt prezente si in limbajul C alaturi de altele.

    2.

    Identificatorii sunt secvente, teoretic nelimitate, de litere si cifre Unicode, ncepnd cu o liter sau liniuta desubliniere (n limbajul C). Identificatorii nu pot fi identici cu cuvintele rezervate.

    Literalii ne permit introducerea valorilor pe care le pot lua tipurile de date primitive si tipul sir decaractere. Mai precis, lieralii sunt constante ntregi, flotante, booleene, caracter si, siruri de caractere.

    Literalii ntregi, n general, pot fi descrisi prin reprezentri n una din bazele de numeratie: 10, 16Lungimea reprezentrii interne depinde de implementarea limbajului. De exemplu, n limbajul Pascal,literal ntreg, cu semn, este reprezentat pe 16 biti, descrierea sa n baza 16 fiind o secvent a simboluasociate reprezentrii numrului ntreg n baza 16 avnd prefixul $.

    Literalii flotanti reprezint numere rationale. Ei sunt formati din urmtoarele elemente: partea ntreapartea fractionar si exponent. Exponentul, dac exist, este introdus de litera E sau e urmat optional deun semn al exponentului. Exemple: 3.14; 23.5 e+2; 3e-123.

    Literalii booleeni sunt TRUE si FALSE, primul reprezentnd valoarea boolean de adevr, iar cellvaloarea boolean de fals. Desi TRUE si FALSE nu sunt cuvinte rezervate, acestea nu pot fi folo

  • 5/25/2018 Programare procedurala

    27/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    2 of 48 12/9/2007 7:21 PM

    identificatori (n Pascal, Java s.a).

    Literalii caracter sunt folositi pentru a desemna caracterele codului Unicode (sau ASCII, acolo unde ecazul). Descrierea unui literal caracter se fie folosind o liter, fie o secvent special. Secventele speci(numite secvente escape n C, C++ si Java) permit specificarea caracterelor fr reprezentare graficprecum si a unor caractere speciale. Caracterele ce au reprezentare grafic pot fi descrise ntre apostrofuri,ca n exemplele: 'P', 'A', '3', '!'. Secventele speciale se descriu diferit de la un limbaj la altul. Vomexemplifica folosind limbajele Pascal si Java.

    Secvente speciale n limbajul Pascal: 1) Un ntreg din domeniul 0, ..., 255 precedat de simbolul #desemneaz un caracter dat prin codul su ASCII. 2) Un caracter imprimabil precedat de semnuldesemneaz un "caracter de control" avnd codul ASCII n domeniul 0, ..., 31.

    Secventele escape n limbajul Java se descriu folosind apostrofuri, semnul \, litere si cifre. Vom exeindicnd cteva secvente predefinite: '\b' (backspace = #8), '\n' (linefeed), '\r' (carriage return) etc.

    Un literal sir de caractere este constituit din zero sau mai multe caractere ntre delimitatori. Secvencaractere ce formeaz sirul poate contine att caractere imprimabile ct si secvente speciale. n limbajPascal se utilizeaz apostroful ca delimitator, iar n limbajul C( C++, Java) ghilimelele.

    Separatorii sunt caractere ce indic sfrsitul unui token si nceputul altuia. Acestia particip si laconstructia sintaxei limbajelor de programare. Ei nu trebuie confundati cu spatiile care si acestea sepunitti lexicale distincte. Separatorii sunt necesari cnd unittile lexicale diferite sunt scrise fr spatii ntreele. Cei mai ntlniti separatori sunt: ( ) { } [ ] ; , . Exemple: x[10], f(x,y), carte.autor etc. Operatorii suntsimboluri grafice ce desemneaz operatiile definite de un limbaj de programare. n unele limbajeprogramare este posibil redefinirea operatorilor, acelasi simbol fiind utilizat pentru operatii diferiterezult din contextul n care apar. Lista minimal a operatorilor aritmetici include: +(adunare),/(mprtire), *(nmultire). Mai sunt admise si operatii precum: % (C, Java) sau mod (Pascal, Modu(mprtire ntreag n limbajul Pascal). Alti operatori sunt: operatori logici, operatori relationali, operatoriasupra sirurilor de caractere etc. Toti operatorii pot fi priviti si ca separatori.

    O constructie aparte utilizat n programe pentru explicarea sau documentarea textului progra

    comentariul. Comentariile sunt delimitate de textul programului folosind anumiti delimitatori. n limPascal, un comentariu este scris ntre acoladele } sau ntre secventele (*, *). Programele C++, Javacontine comentarii pe o singur linie si ncep cu //, sau pe mai multe linii si sunt cuprinse ntre /* si */.

    Alte elemente lexicale ce pot fi prezente ntr-un program sunt etichetele si clauzele. Etichetele sunt siruri decifre zecimale/hexazecimale sau identificatori folosite n legtur cu o instructiune de salt (goto) pemarcarea unor instructiuni. Clauzele (numite si directive) sunt cuvinte cheie ce desemneaz instructiuniefect n timpul compilrii.

    Prin sintaxa unui limbaj de programare se ntelege, n general, un ansamblu de reguli privind agreunittilor lexicale pentru a forma structuri mai complexe (declaratii, instructiuni, module, progra

    Prezentarea acestor reguli se poate folosind limbajul natural sau mecanisme formalizate. Descriereasintaxei n limbaj natural poate conduce la neclaritti sau specificatii incomplete. Cu ajutorul mecanismelorformale sintaxa unui limbaj este complet specificat. Cea mai folosit notatie este cunoscut sub numenotatie BNF (Backus-Naum-Form) si a fost folosit pentru prima dat, n anul 1959, la specificarealimbajului Algol-60. Aceast notatie are aceeasi putere generativ cu gramaticile independente de cintroduse de N. Chomsky. Totusi, limbajele de programare nu sunt independente de context ci numaportiuni ale acestora pot fi modelate cu ajutorul limbajelor independente de context. Pentru a puteaspecifica un ntreg limbaj de programare se poate folosi notatia BNF extins. n prezentarea din acestcapitol vom utiliza opt metasimboluri: ::= < > { } [ ] | pentru a defini unittile sintactice ale limbajuluiPascal. Metasimbolurile < si > sunt folosite pentru delimitarea numelui unei unitti sintactice. Presupunem,de asemenea, existenta unei operatii de concatenare pe multimea unittilor sintactice. Metasimbolul ::

  • 5/25/2018 Programare procedurala

    28/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    3 of 48 12/9/2007 7:21 PM

    apare dup numele unei unitti sintactice si are semnificatia "se defineste prin". Metasimbolul | este utilizatpentru a delimita mai multe variante de definire ale unei unitti sintactice, aceasta fiind obtinut preuniunea variantelor. Metasimbolurile { si } indic repetarea posibil (de zero sau mai multe orisimbolurilor pe care le delimiteaz. Pentru a desemna prezenta optional a unor simboluri se utildelimitatori, metasimbolurile [ si ]. Vom admite, pentru prescurtare metasimbolul ... care indiccontinuarea unui sir de valori conform contextului n care apare. Iat cteva exemple:

    ::= A ... Z descrie multimea literelor mari;1.

    ::= 0 ... 9 descrie multimea cifrelor zecimale;2.

    ::= { | } descrie modul de formare a identificatorilor: un sir delitere si/sau cifre, primul semn fiind o liter.

    3.

    ::= { } descrie modul de formare a unei secvente de cifre;4.

    ::= defineste un numr ntreg fr semn;5.

    ::= + | -6.

    ::= [ spune c un ntreg cu semn este un ntreg fr semnprecedat de un semn: + sau -.

    7.

    Prin diagrame sintactice se realizeaz o reprezentare grafic a modului de agregare a unittilor sintactice.n cele ce urmeaz vom prefera limbajul natural (n anumite cazuri) si notatia BNF extins (n alte ccititorul interesat asupra diagramelor sintactice poate consulta, de exemplu: N. Wirth: SystematicProgramming: An introduction, Prentice Hall, 1972.

    3.2. Tipuri de date. Constante. Variabile. Expresii

    Un tip de date este o structur compus din: 1) o multime X de valori numite date si 2) o multimecompozitie pe X (operatii ce se pot efectua cu valori din X). O dat are un singur tip (apartine uneimultimi). Exist limbaje de programare puternic tipizate (n sensul verificrii cu regularitate a apartentunei date la multimea de valori a tipului su, nc din faza de compilare). Astfel de limbaje de programsunt: Pascal, Modula, Ada etc.

    Tipurile de date sunt standard sau definite de utilizator. Tipurile definite de utilizator se introducintermediul unei definitii folosind un cuvnt cheie precum type (n Pascal), typedef (n C) sau classlimbajele C++ si Java). De asemenea se vor utiliza diverse cuvinte cheie pentru a specifica structura tipDac pentru o anumit structur a unui tip nu este stabilit un identificator, spunem c avem de-a cuanonim.

    Valorile unui tip de date (elementele multimii X sunt referite fie prin variabile, fie prin constante (literalisau constante simbolice). O locatie de memorie care poate stoca o valoare a unui anumit tip de datenumeste, prin abuz de limbaj, variabil. Orice variabil trebuie s fie declarat pentru a putea fi folosit. Odeclaratie contine un tip de valori - ce indic: ce se stocheaz, cum se stocheaz si n ce operatii intervalorile stocate - si un identificator pentru a ne referi la variabila ce obiectul declaratiei. Practic o variabileste un obiect caracterizat de tip, adres si valoare, pentru care atributul valoare poate fi modificat.

    n limbajul Pascal declaratia variabilelor este precedat de cuvntul cheie var:

  • 5/25/2018 Programare procedurala

    29/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    4 of 48 12/9/2007 7:21 PM

    var { }

    unde

    ::= {,}: .

    n limbajele C, C++ si Java declaratia variabilelor arat astfel:

    {,} n functie de locul n care apare declaratia unei variabile, acesteia i

    se pot atribui atribute precum: local, global, static etc.

    Exist limbaje de programare (de exemplu Java) care definesc o valoare implicit pentru fiecare variaatunci cnd prin program aceasta nu "primeste" nici o valoare. Totusi, cele mai multe limbaje dprogramare nu ofer acest serviciu si este necesar s se realizeze operatii de "initializare" explicit.

    Initializarea unei variabile chiar n momentul declarrii acesteia, n limbajele de programare care peaceasta, se realizeaz folosind o descriere de forma:

    IdentificatorulTipului IdentificatorulVariabilei = ValoareInit;unde se presupune c ValoareInit este de acelasi tip cu tipul variabilei sau poate fi convertit (transformatfoarte usor) ntr-o valoare de acest tip.

    Prezentarea elementelor unui tip este posibil fie prin intermediul literalilor, fie prin intermediuconstantelor simbolice. Constantele simbolice sunt identificatori asociati unor elemente ale anumitomultimi. Declararea unei constante simbolice Pascal se realizeaz conform regulii:

    const = ;

    unde este un literal, o expresie constant (n care intervin literali) sau elemente structurlimbajul C, constantele simbolice se pot introduce prin intermediul directivei #define sau cuvntului cheieconst atunci cnd sunt declarate variabile ce nu pot fi modificate n program.

    Operatiile cu elemente ale unui tip sunt fie predefinite, fie sunt introduse prin declaratii function sauprocedure (n Pascal) sau operator(n C++). Agregarea variabilelor, constantelor si a operatorilor conduce la constructii numite exprExpresiile sunt evaluate n cursul executrii unui program. Rezultatul unei expresii depinde de vvariabilelor n momentul evalurii.

    Tipurile de date ntlnite n limbajele de programare actuale sunt clasificate n: tipuri de date simple; tipuride date structurate, tipuri referint (pointer), tipuri procedurale. n limbajele C, C++ si Java exist tipvoid. Aceast multime notat prin void nseamn fie multimea vid, fie o multime neprecizat.

    Tipurile de date simple numite si tipuri primitive (sau tipuri standard) se refer la multimi de elemeprecum: numere ntregi, numere rationale, valori de adevr (logice sau booleene), caractere, valo

    apartinnd unei enumerri sau unui interval (subdomeniu). O parte dintre tipurile simple sunt tipuordinale, adic tipuri caracterizate printr-o multime finit de valori, pe care este definit o ordine liniar si,prin urmare, pentru orice element al unei asemenea multimi se stabileste numrul de ordine ord(.),elementul predecesor pred(.) si cel succesor succ(.). Tipurile ordinale sunt cele care se refer la multprecum: multimea numerelor ntregi, multimea valorilor de adevr, multimea caracterelor, multimvalorilor unei enumerri, multimea valorilor dintr-un subdomeniu al uneia dintre multimile anterioTipurile rationale (simpl precizie, dubl precizie, precizie extins etc.) nu sunt considerate tipuri ordinadesi sunt tot multimi finite de elemente. Trebuie observat c metoda de reprezentare n memorcalculatorului a numerelor rationale ar permite considerarea unei ordini liniare si, elementele unei astfel demultimi ar avea un numr de ordine.

  • 5/25/2018 Programare procedurala

    30/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    5 of 48 12/9/2007 7:21 PM

    Tipurile ntregi ale limbajului Pascal sunt :

    a) Tipul Byte : reprezint multimea numerelor ntregi fr semn ncepnd de la 0 pn la 255, reprezeintern folosind 8 biti (un byte).

    b) Tipul ntreg scurt Shortint : reprezint multimea numerelor ntregi cu semn ncepnd de la -128 pn127, reprezentate n complement fat de doi, pe 8 biti.

    c) Tipul ntreg Integer : se refer la domeniul de valori dintre -32768 si 32767, reprezentate pe 16complement fat de doi.

    d) Tipul Word : reprezint multimea numerelor naturale de la 0 la 65535 reprezentate pe 16 biti.

    5) Tipul ntreg lung Longint : defineste un domeniu reprezentabil, cu semn, pe 32 de biti, n complementfat de doi.

    Tipuri ntregi ale limbajului Java sunt:

    a) Tipul byte : este echivalent cu tipul Shortint al limbajului Pascal.

    b) Tipul short (ntreg scurt): este acelasi cu tipul integer al limbajului Pascal.

    c) Tipul int (ntreg): corespunde tipului Longint al limbajului Pascal.

    d) Tipul ntreg lung (long): reprezint multimea numerelor ntregi, reprezentabile cu semn n complemefat de doi, pe 8 bytes adic 64 de biti.

    Tipurile de numere rationale ale limbajului Pascal suntdesemnate prin identificatorii standard real (6 bytes),single (4 bytes), double (8 bytes), extended (10 bytes) si comp (8 bytes) si descriu submultimi de nurationale reprezentate n memoria intern n virgul mobil. Tipul de date comp este o multime de nuntregi utilizate n calcule fr parte fractionar.

    Tipurile de numere rationale ale limbajului Javase mai numesc tipuri flotante. Sunt disponibile multimilefloat (4 bytes) si double (pe 8 bytes). Ca si pentru reprezentrile single, double, extended si comp alimbajului Pascal, n cazul tipurilor float si double se utilizeaz standardul IEEE 754.

    Tipul boolean

    este folosit pentru descrierea multimii valorilor de adevr desemnate prin literalii true si false. Pedeclararea unei variabile de tip boolean n limbajele Pascal si Java se foloseste cuvntul boolean. versiunea 7.0 a limbajului Turbo Pascal au fost introduse nc trei tipuri booleene: bytebool, wordblongbool. Lungimea reprezentrii este: boolean - 8 biti, bytebool - 8 biti, wordbool - 16 biti, longbool - 32biti. Referitor la tipul boolean, n Pascal, sunt adevrate: false < true, ord(false) = 0, ord(true) =1,succ(false) = true, pred(true) = false.

    Limbajul C++ nu are un cuvnt rezervat pentru variabile logice. Totusi, limbajul permite utilizaroperatiilor uzuale ale calculului cu propozitii: si, sau, negatia prin intermediul operatorilor: &&, ||,Limbajul trateaz orice valoare nenul drept true si valoarea zero drept false. Valoarea rezultat n urunei operatii logice este 1 pentru rezultat true si 0 pentru rezultat false.

    Pentru declararea variabilelor de tip caracterse utilizeaz cuvntul char. O variabil de tip caracter poateavea ca valori coduri Unicode (pe 16 biti, n Java) sau coduri ASCII (pe 8 biti, n Pascal, C, etc.).caracterelor fiind ordonat, au sens functiile: ord, pred si succ. Functia ord(.) ntoarce codul caracterudintre paranteze. O alt functie utilizat este chr, care transform o valoare ntreag ntr-un caracter ccodul Unicode corespunztor. Caracterele pot fi comparate ntre ele pe baza pozitiei lor n setul decaractere Unicode.

  • 5/25/2018 Programare procedurala

    31/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    6 of 48 12/9/2007 7:21 PM

    Tipul enumerare

    este reprezentat printr-o multime finit de identificatori separati prin virgule si inclusi ntre pComponentele acestui tip se consider ordonate, deci se pot aplica functiile: pred, succ si ord. De asemenease pot realiza comparatii ntre elemente. n limbajul Pascal, enumerarea (R, G, B) poate fi utilizat pentru aintroduce tipul RGB, iar ord(R) = 0, pred(B) = G, R

  • 5/25/2018 Programare procedurala

    32/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    7 of 48 12/9/2007 7:21 PM

    unde [ si ] sunt elemente ale limbajului Pascal, iar { si } sunt elemente ale metalimbajului, {,} descrie multimea I, iar descrie multimea T din definitie. Multimea I se poateobtine ca produsul cartezian al unui numr oarecare, dar finit de multimi de tip ordinal (fr longint), darzona din memoria intern utilizat pentru stocarea elementelor tabloului nu trebuie s depseasc oanumit dimensiune, dependent de implementare. Multimea T este orice tip de date cu exceptia tipuluifisier.

    Exemple:

    type a = array [1..10] of integer; b = array [-5..5, -10..7] of real; T = (r, g, b); c = array [T] of char; d = array [1..10] of array[-5..5] of array[char] of integer;

    Referirea unui element al unui tablou se prin identificatorul tabloului si indexul elementului scris paranteze drepte: x['a'] dac x este un tablou cu = char. Dac un tablou este multi-dimensional,referirea la o component se poate n mai multe moduri. De exemplu, dac x este un tablou bidimensioatunci x[i,j] si x[i][j] reprezint acelasi element.

    Limbajul Borland Pascal permite definirea unui tip numit sir de caractere (string). Lungimea sirurilor es

    cel putin 0 (null) si cel mult 255. Din punct de vedere al reprezentrii interne, pentru un sir de caracterealoc n+1 bytes (n conventia ASCII pe 8 biti), unde n este lungimea efectiv a sirului. Octetul cu adrrelativ zero este rezervat pentru memorarea lungimii efective. Declararea unui tip sir de caracter sesupune regulii:

    type identificator = string[lungime_maxima] | string;

    unde stabileste limita superioar a numrului de caractere ce pot fi stocate;parantezele drepte si aceast limit lipsesc se consider siruri de lungime maxim 255. Un caracter din sieste accesat similar ca elementul unui tablou, lungimea efectiv a sirului x este obtinut fie prin ord(x[0])sau prin length(x).

    Exemplu:Definitia Type T30 = string[30]; introduce T30 ca fiind multimea sirurilor de caractere cu cel multcaractere.

    Tipul de date nregistrare (record) se introduce n Pascal prin:

    type = ; unde este definit prin urmtoarele reguli BNF:

    ::= record [;]end

    ::= [; ] |

    ::= {; } ::= {, }:

    ::= case[ :] of {; }

    ::= {, } :[] [;])

    adic un element de tip record este n general format dintr-o parte fix si una variabil, fiecare dintreacestea fiind alctuit din cmpuri.

    Exemple:

  • 5/25/2018 Programare procedurala

    33/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    8 of 48 12/9/2007 7:21 PM

    1) Tipuri de date predefinite n Pascal:

    const maxim = 100000;{constanta este de tip longint}

    pi = 3.14159;

    mint:integer :=maxint-1; {o expresie constanta}

    pi2 = pi / 2; {o alta expresie constanta}

    stop:char = 'Z';

    type T1 = 0..maxint; { subdomeniu al tipului integer; maxint este constanta predefinita 32767}

    const st:T1 = 100;

    var x,y:T1; {x, y sunt variabile de tip T1}

    a, b : real; { a, b sunt variabile de tip real}

    flag, poz: boolean; {flag, poz sunt variabile logice}

    ch: char;

    i,j,k: integer; wi, wj, wk: word;

    li, lj,lk:longint;

    u:single; v:double; w:extended; {tipuri flotante - standardul IEEE 754}

    2) Tipuri de date structurate n Pascal:

    Type Data = record

    ziua: 1..31;

    luna: 1..12;

    anul: 1..9999

    end;

    Figura = (triunghi, patrulater, cerc, elipsa);

    Stare = array [Figura] of boolean;

    Rvariante = record

    {parte fixa}

    cod:byte;

    nume: string[30];

    dataNasterii: Data;

    {parte variabila}

  • 5/25/2018 Programare procedurala

    34/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    9 of 48 12/9/2007 7:21 PM

    case studii : (medii, superioare) of

    medii:(NrClase:byte; Scoala:string[30];);

    superioare: (Facultatea:string[20]; specializarea: string[15])

    end; {un singur end}

    Var d:Data; f: Figura; S: Stare; R: Rvariante;

    {Constante denumite impropriu constante cu tip, de fapt sunt variabile initializate}

    const d1:Data =(ziua:30; luna:5; anul:1999);

    d2:Figura = cerc;

    d3: Stare = (true, true, false, false);

    d4:Rvariante = (cod:123;

    nume:'Ionescu';

    dataNasterii: (ziua:12; luna:8; anul:2000);

    studii:medii;

    Nrclase:12;

    Scoala:'Liceul XXXX');

    Un identificator de cmp trebuie s fie unic numai n nregistrarea unde a fost definit. Un cmp al uvariabile de tip record este referit prin identificatorul variabilei si identificatorul cmpului separatprintr-un punct. Exemplu: R.cod, R.nume, R.dataNasterii.ziua, R.studii, R.Nrclase, R.Scoala, d.anul etc.

    Tipul multime (prezent n Pascal, Modula etc.) permite definirea multimilor ale cror elemente suntmultimi. Fie T un tip scalar diferit de real si de tipurile flotante. Se numeste tip set cu tipul de baz TmultimeaP(T)format din toate submultimile multimii T. Definitia unui tip set se prin:

    type = set of ;

    unde este tipul de baz. Constructia unui element de tip set urmeaz regulile:

    ::= [list de elemente] | []

    ::= {, }

    ::= | ..

    cu [ , ] elemente ale limbajului Pascal, |, { si } simboluri ale metalimbajului, iar reprezint oexpresie a crei valoare apartine tipului de baz. Astfel, pentru a ne referi la multimea vid folosim notatia[], pentru a definii multimea vocalelor scriem ['a', 'e', 'i', 'o', 'u'], iar pentru a definii primele cinci numerenaturale nenule putem scrie n una din formele: [1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [1..5], [1..3, 4, 5] etc.

    Cu variabile de tip set se pot efectua urmtoarele operatii: + (reuniune), - (diferent), * (intersectie) ce auca rezultat un element de tip set, sau operatii relationale cu rezultat de tip logic: = (egalitate), = (include pe), (diferit). Apartenenta unui element t la o multime A este dat de valoarea de adeexpresiei t in A. Aceast expresie este adevrat dac primul operand - element de tip ordinal - este element

  • 5/25/2018 Programare procedurala

    35/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    10 of 48 12/9/2007 7:21 PM

    al operandului al doilea - cu multimea de baz compatibil cu t.

    Dac tipul de baz are n valori, o variabil de tip set corespunztoare tipului de baz va fi reprezentmemorie folosind n biti, depusi ntr-o zon de memorie contigu cu lungimea (n div 8) + 1 bytes dac n neste divizibil cu 8, respectiv (n div 8) bytes dac n este multiplu de 8. Prin urmare tipul set of charreprezentat pe 32 de bytes.

    Operatorii sunt simboluri care specific operatii efectuate asupra unor variabile sau constante den

    operanzi. Combinatiile valide de operanzi si operatorii reprezint expresii.Limbajele de programare ofer o multitudine de operatori: operator de atribuire (simbolizat prin := sau =),operatori aritmetici unari (utilizarea semnului, incrementare, decrementare), operatori aritmetici(adunare, scdere, nmultire, mprtire, obtinerea ctului si restului mprtirii a dou numere ntreoperatori logici (si, sau, negare), operatori relationali (egal, diferit, mai mic, mai mic sau egal, mai mare,mai mare sau egal, apartine), operatori la nivel de bit (si, sau, negare, sau exclusiv, deplasare stngdeplasare dreapta), operatori combinati (n limbajele C, C++ si Java), operatori asupra multimilo(reuniune, intersectie, diferent), operatori asupra sirurilor de caractere (concatenare) precum si aoperatori.

    Evaluarea expresiilor trebuie s tin seama de pozitia parantezelor si de propriettile operatoril

    (precedent, asociativitate, conversii implicite n cazul tipurilor compatibile, conversii explicite). Precedentastabileste ordinea de evaluare a operatiilor n cazul expresiilor care contin mai multi operatori diferiti.Dac ntr-o expresie se ntlnesc operatii cu aceeasi precedent atunci ordinea de evaluare este dat de tipulasociativittii (de la stnga la dreapta sau de la dreapta la stnga). Cnd ntr-o expresie apar operatioperanzi de tipuri diferite, nainte de efectuarea operatiei are loc un proces de conversie implicit (cnd nuse semnaleaz explicit si nu apare fenomenul de incompatibiltate) prin care tipul cu cardinalul maipromovat ctre tipul mai bogat (se presupune aici c natura elementelor celor dou tipuri este aceasi).

    3.3. Programare n C

    Limbajul C a fost creat la AT & T Bell Laboratories in anul 1972 de Dennis Ritchie. Versiunea sta

    limbajului C pana in anul 1988 a fost cea furnizata odata cu sistemul de operare UNIX si descrisa in [14]. Inanul 1983 a inceput redactarea standardului ANSI pentru limbajul C. Standardul ANSI a fost finalizat ianul 1990.

    3.3.1.Structura programelor C

    In limbajul C programul este o colectie de module distincte numite functii, organizate in una sau maiunitati de translatare. Fiecare unitate de translatare poate fi compilata (analizata lexical si sintactic)separat. O unitate de translatare trebuie sa contina cel putin o declaratie sau o definitie de functie. Eaconsta din fisierul sursa impreuna cu oricare fisier antet si fisiere sursa incluse prin directiva #include. Ounitate de translatare, prin compilare, conduce la un fisier obiect (.obj) relocabil.

    Directivele precedate de delimitatorul # se numesc directive preprocesor, acestea specificand operanterioare procesului de compilare ce sunt efectuate de o componenta a mediului de programarepreprocesor.

    O declaratie C specifica atributele unui identificator sau multime de identificatori. Regulile sintactice cestau la baza scrierii declaratiilor sunt redate prin:

    ::=

    [ ];

  • 5/25/2018 Programare procedurala

    36/88

    Limbaje de programare - C Autor: Prof. Univ. Dr. Grigore Albeanu file:///C:/ACTIV/Proc/FINAL/C4.HTM

    11 of 48 12/9/2007 7:21 PM

    ::=

    [ ]| [ ]| [ ] ::= < declarator initializare> |

    ,

    ::= |

    =

    A face o declaratie nu presupune si alocarea memoriei pentru indentificatorul declarat. Exista situatalocarea se realizeaza in alta unitate de translatare (cazul datelor externe).

    Declaratia unui identificator asociaza numelui in mod explicit sau implici