ALGORITMI ŞI PROGRAMARE

Prof. univ dr. GRIGORE ALBEANU Lector univ. SILVIU BÂRZĂ I. INTRODUCERE
I.1. Ce este informatica? În anul 1642, matematicianul şi fizicianul Blaise Pascal (1623-1662) a inventat prima masină mecanică, cu roŃi dinŃate, capabilă să realizeze operaŃii de adunare şi scădere a numerelor naturale. Totuşi, de-abia după apariŃia maşinilor electromecanice, în 1944, John von Neumann a formulat principiul programului înregistrat şi a sugerat constructorilor de calculatoare trei principii care trebuie avute în vedere pentru realizarea unui calculator: • programele şi datele trebuie să fie codificate sub formă binară; • programele şi datele trebuie stocate într-o memorie a maşinii de calcul; • trebuie să existe o componentă (unitate centrală de prelucrare, procesor) specială care ştie atât să execute operaŃii de calcul, cât şi să extragă, să decodifice şi să execute instrucŃiunile programului. Astfel, aproape toate tipurile de sisteme de calcul ce au apărut mai târziu sunt calculatoare de tip von Neumann. ApariŃia sistemelor de calcul a dus la apariŃia şi dezvoltarea unei noi ştiinŃe: informatica (Informatique, Informatics, Informatik în Europa, respectiv Computer Science în SUA). Informatica reprezintă un complex de discipline prin care se asigură prelucrarea informaŃiilor cu ajutorul sistemelor de calcul. Astăzi, informatica este prezentă în industrie, bănci, ferme, artă, medicină, ştiinŃe sociale etc. şi este structurată în mai multe domenii precum: • arhitectura sistemelor de calcul: studiază modul de organizare a sistemului fizic (hardware) pentru a se obŃine o mai mare eficientă, siguranŃă şi utilitate. • sisteme de operare: studiază modalităŃile de gestiune eficientă a resurselor fizice şi a programelor. • algoritmi si structuri de date: studiază metodele de rezolvare a problemelor şi modurile de organizare a datelor pentru a obŃine programe eficiente. • limbaje de programare: studiază modalităŃile prin care algoritmii şi structurile de date sunt prezentate calculatorului pentru a fi prelucrate. • ingineria programării: studiază metodele de automatizare a proceselor de proiectare, analiză, testare şi reutilizare a programelor. • calcule numerice şi simbolice: studiază modalităŃile de reprezentare a informaŃiei numerice pentru implementarea unor algoritmi numerici robuşti, eficienŃi şi de mare precizie. • sisteme de gestiune a bazelor de date: studiază modalităŃile de structurare şi organizare eficientă a colecŃiilor mari de date ce vor fi supuse diverselor prelucrări. • inteligenŃa artificială: studiază modalităŃile de reprezentare şi manipulare a cunoştinŃelor în vederea obŃinerii de noi cunoştinŃe. • animaŃia şi robotica: studiază modalităŃile de reprezentare, prelucrare şi analiză a informaŃiei audiovizuale. În sfera sa de preocupări, informatica a atras şi dezvoltat o mare varietate de discipline precum: logica matematică, teoria automatelor, limbaje formale, cercetări operaŃionale, teoria grafurilor şi reŃelelor, calcul numeric, teoria fiabilităŃii, geometrie computaŃională, teoria calculabilităŃii, baze de date, baze de cunoştinŃe, sisteme expert . I.2. Ce este un program? NoŃiunea de algoritm SoluŃia unei probleme, din punct de vedere informatic, este dată printr-o mulŃime de comenzi (instrucŃiuni) explicite şi neambigue, exprimate într-un limbaj de programare. Această mulŃime de instrucŃiuni prezentată conform anumitor reguli sintactice formează un program. Un program poate fi privit şi ca un algoritm exprimat într-un limbaj de programare. Totuşi, un algoritm descrie soluŃia problemei independent de limbajul de programare în care este redactat programul. Există mai multe definiŃii ale noŃiunii de algoritm. A. A. Markov, a considerat algoritmul ca fiind o noŃiune matematică primară şi a descris-o astfel: Un algoritm este o reŃetă care descrie precis şi clar un proces de calcul. El a descris un mecanism formal pentru a specifica o clasă largă de activităŃi şi anume:
215

algoritmii normali. Alte modalităŃi de descriere a algoritmilor ce au mai fost propuse sunt: maşina Turing, sistemele Post, funcŃiile recursive etc. În această lucrare, prin algoritm vom înŃelege o secvenŃa finită de comenzi explicite şi neambigue care, executate pentru o mulŃime de date (ce satisfac anumite condiŃii iniŃiale), conduce în timp finit la rezultatul corespunzător. Observăm că se face distincŃie între algoritm (care se termină în timp) şi procedură (care poate continua nedefinit). Conform lui D. Knuth (The art of computer programming, Vol. I, 1997) un algoritm posedă cinci caracteristici importante: • Un algoritm are caracter finit. El este descris printr-o secvenŃa finită de etape şi trebuie ca, ori de câte ori sunt parcurse etapele algoritmului pentru anumite date, procesul să se încheie în timp finit. • Un algoritm are caracter determinist. AcŃiunile specificate de paşii algoritmului sunt clare, fiind riguros prezentate. • Un algoritm are date de intrare. Se poate admite că întotdeauna un algoritm lucrează asupra unor date de intrare. Acestea pot fi evidenŃiate din contextul în care este formulată problema a cărei soluŃie o reprezintă algoritmul. • Un algoritm furnizează cel puŃin o valoare de ieşire ce se află într-o relaŃie specifică cu datele de intrare. • Un algoritm este eficace. Trebuie spus că nu orice problemă admite soluŃie descrisă algoritmic. Problemele pentru care există un algoritm de rezolvare se numesc probleme decidabile. Problemele pentru care s-a demonstrat (matematic) că nu admit un algoritm de rezolvare se numesc probleme nedecidabile. Nu este suficient ca o anumită problemă (clasă de probleme) să admită soluŃii (chiar si o singură soluŃie). Din punctul de vedere al informaticii, interesează dacă există soluŃie ce poate fi descrisă algoritmic, deci dacă soluŃia problemei poate fi construită efectiv. De asemenea, pentru rezolvarea anumitor probleme pot exista mai mulŃi algoritmi. Stabilirea celui mai bun dintre aceştia se realizează în urma unui proces de analiză prin care se determină performantele fiecăruia dintre algoritmi. Am văzut că algoritmii acceptă date de intrare şi furnizează rezultate (date de ieşire). Introducerea unei valori sau a unui şir de valori se va descrie folosind verbul citeşte. Afişarea unei valori sau a unui şir de valori va fi descrisă prin verbul scrie. Vom conveni să numerotăm paşii (etapele) unui algoritm. Această numerotare va fi utilizată eventual în alŃi paşi. Acest mod de prezentare a algoritmilor se numeşte descriere în limbaj convenŃional. În unele lucrări, limbajul convenŃional mai este numit şi limbaj pseudocod. Exemplul 1. Fie a şi b două variabile întregi. Dorim să schimbăm între ele valorile celor două variabile. Mai precis, dacă a = 640 şi b = 480, dorim să obŃinem a = 480 şi b = 640. Un mod de a realiza această schimbare presupune utilizarea unei variabile suplimentare, cu rol de intermediar. Folosind trei operaŃii de atribuire, algoritmul are următorii paşi: 1. citeşte a, b 2. t := a 3. a := b 4. b := t 5. scrie a,b I.3. Cum rezolvăm probleme cu ajutorul calculatorului? Am văzut că există probleme pentru care nu poate fi dat un algoritm de rezolvare. Totuşi cele mai multe probleme cu care se confruntă informatica sunt probleme decidabile. Toate temele tratate în această lucrare formulează probleme decidabile. Se ştie că nu învăŃarea unui limbaj de programare este o sarcină dificilă, ci rezolvarea algoritmică a problemelor decidabile. Este clar că, înainte de a începe scrierea unui program trebuie, mai întâi, să găsim (sau să cunoaştem deja) soluŃia algoritmică a problemei puse. Cum se găseşte soluŃia? Etapele descrise de G. Pólya (Cum rezolvăm o problemă? Editura ŞtiinŃifică, Bucureşti, 1965), pentru rezolvarea unei probleme de matematică, sunt valabile şi în informatică. Înainte de a începe să vedem cum se face, trebuie să înŃelegem atât ipotezele problemei, cât şi ceea ce se cere. Deci, înŃelegerea problemei, ocupă primul loc în procesul căutării unei metode de rezolvare a acesteia cu ajutorul calculatorului. Trebuie evidenŃiate datele de intrare si condiŃiile pe care acestea trebuie să le îndeplinească. Este important să identificăm esenŃialul. De multe ori un enunŃ al unei probleme conŃine foarte multe elemente descriptive privind importanta problemei, consideraŃii de natură istorică, exemple, uneori chiar şi etape distincte pentru obŃinerea soluŃiei. CerinŃa problemei furnizează, de multe ori, chiar idei privind modul de a ajunge la soluŃie. Considerarea unor configuraŃii particulare pentru datele de intrare şi încercarea de a lucra asupra lor, pentru a găsi soluŃia, va contribui întotdeauna la o înŃelegere mai bună a enunŃului.
216

mai nou. L este ciclu dacă x=y. 1 ≤ secvenŃa de vârfuri D: v0. se numeşte abordare bottomup. Atributele : trivial. Dacă nu se specifică etape. Multe din problemele de programare pot fi rezolvate uşor dacă soluŃia verifică anumite principii.. bazată pe subprograme sau. pentru un digraf se definesc similar. euristica etc. atunci trebuie să aflăm soluŃia algoritmică corespunzătoare fiecărei etape. E) este un graf (digraf) G1 = (V. COMPLEXITATE. v1. iar x şi y două vârfuri. iar y se numeşte destinaŃie sau extremitate finală. se spune că drumul este unul deschis.y) cu x diferit de y. iar E este o parte a produsului cartezian V x V ale cărei elemente le numim arce. II. x].. pornind de la soluŃii algoritmice ale unor probleme cunoscute. vi+1] aparŃine mulŃimii E. iar în final. Dacă soluŃia problemei este o mulŃime de elemente care se poate obŃine pas cu pas. Numărul elementelor mulŃimii V determină ordinul grafului finit. urmând aceeaşi modalitate construim soluŃia problemei a cărei soluŃie se cere.. iar E este o mulŃime (posibil vidă) de perechi neordonate cu componente distincte ale lui V care se numesc muchii (edges). dar putem descompune problema în subprobleme mai simple. E1). sunt distincte două câte două. arcele (muchiile) sunt etichetate. sensul fiind de la sursă spre destinaŃie. Circuitul este elementar dacă toate vârfurile circuitului. DefiniŃie. este foarte important să ştim să rezolvăm probleme simple. Un arc este notat prin (x. E). Dacă E este mulŃimea vidă spunem că G este trivial. E' este submulŃime a mulŃimii E. ALGORITMI: DESCRIERE. construim soluŃii ale altor probleme care au însă legătură cu problema de rezolvat. atunci soluŃia algoritmică a problemei iniŃiale se va obŃine prin "compunerea" soluŃiilor subproblemelor. unde V este o mulŃime nevidă de elemente numite vârfuri (vertex). respectiv finit. Un drum fără nici un arc este un drum trivial. Spunem că vârfurile x şi y sunt incidente muchiei [x. eventual probleme reprezentative pentru anumite clase de aplicaŃii şi să ştim să descompunem (respectiv. O muchie cu vârfurile x şi y (numite extremităŃi) se notează prin [x. 217 . Un x-y drum se numeşte circuit (sau drum închis) dacă x=y. Uneori. Un subgraf (subdigraf) al unui graf (digraf) G este un graf (digraf) H = (U.E) un digraf. Această metodă permite reutilizarea programelor existente şi este tot mai importantă odată cu apariŃia tehnicilor orientate obiect. iar x şi y două vârfuri. la o soluŃie orientată obiect.Dacă în enunŃ se sugerează etapele rezolvării. conduc la o soluŃie modulară. pentru un lanŃ. Fie G = (V. care au ambele extremităŃi în mulŃimea de vârfuri U.. În continuare vom considera numai grafuri (digrafuri) finite. . y] sau [y. II. Deci.1. iar i ≤ n-1. . Vârfurile x şi y se numesc extremităŃile drumului D. Dacă etichetele sunt numere reale pozitive se spune că digraful (graful) este ponderat. unde U este submulŃime a mulŃimii V.y]. unde E este submulŃime a mulŃimii E. Numim x-y drum (de lungime n) o (vi. În cazul în care mulŃimea V este finită spunem că avem un graf finit. Un graf (digraf) parŃial al unui graf (digraf) G = (V. Abordarea prin care. oricare din metodele de abordare top-down sau bottom-up. Pentru probleme de complexitate ridicată. metoda backtracking. să reducem) problema iniŃiala în (la) subprobleme uşor de rezolvat şi apoi să construim soluŃia finală. pentru a obŃine o soluŃie a unei probleme este util să privim problema şi comparativ cu alte probleme întâlnite. Numai după investigarea acestor variante putem trece la stabilirea metodei de abordare. 0 ≤ i ≤ n-1. deci este graful (digraful) G însuşi sau se obŃine din G prin suprimarea anumitor muchii (arce). Un digraf este definit printr-o pereche G=(V. De obicei un graf se reprezintă prin indicarea unor puncte din plan (ce corespund vârfurilor) şi a unor segmente de curbă (sau de dreaptă) pentru indicarea muchiilor. cu detaliere pas cu pas se numeşte abordare top-down sau rafinare iterativă. vn = y . În cazul digrafurilor arcele sunt segmente de curbă orientate. iar muchiile (arcele) din E' sunt toate muchiile (arcele) din E. unde V este o mulŃime nevidă de vârfuri. vn dacă v0 = x. NoŃiuni de teoria grafurilor CORECTITUDINE Un graf neorientat G este definit prin perechea G = (V. unde x se numeşte sursă sau extremitate iniŃiala. Alte strategii pentru elaborarea algoritmilor sunt: metoda divide et impera.. DefiniŃie. Pentru probleme în care se cere o soluŃie optimă care satisface principiul optimalităŃii (principiul lui Bellman) se va aplica metoda programării dinamice. E'). Atributul elementar. poate fi introdus similar. prin adăugarea celui mai bun element neconsiderat încă (şi ales conform unui anumit criteriu) spunem că avem de-a face cu o abordare de tip greedy.. De asemenea. vn este un x-y lanŃ (de lungime n) dacă [vi. pornind de la mulŃimea vidă. acestea implicând rezolvarea unor subprobleme. dacă x diferit de y. SecvenŃa de vârfuri L: v0. iar x=v0 si y=vn. Abordarea prin descompuneri repetate. Fie G = (V. vi+1) aparŃine mulŃimii E pentru toŃi i. E) un graf neorientat. pentru toŃi i. E). v1. cu excepŃia primului şi a ultimului vârf care coincid.

3.. CITESTE. Un digraf G cu proprietatea că pentru oricare două vârfuri x şi y există atât un x-y drum. atunci execută a altfel execută b. or pn = TRUE (adevărat) şi pi and pj = FALSE (fals) pentru oricare i şi j diferiŃi. a. Acesta va indica punctul de unde începe execuŃia unui program. II. chiar pentru un digraf. Se pot pune în evidentă structuri fundamentale precum: 1.) a unei secvenŃe de valori (numite date de intrare). O structură secvenŃială formată din două arce etichetate prin a. InstrucŃiunea SCRIE: etichetează un arc ce indică înregistrarea la mediul de ieşire (display. Orice schemă logică are un unic arc iniŃial. De cele mai multe ori este folosită denumirea de "schemă logică". atunci a. iar e este o expresie de acelaşi tip (numeric sau logic) cu variabila v.) a rezultatelor (datelor de ieşire). Scheme logice structurate O transcriere grafică a etapelor (paşilor) unui algoritm este numită organigramă. extremitatea iniŃiala a arcului trebuie să coincidă cu extremitatea iniŃiala a unei instrucŃiuni de ramificare. Acestea indică oprirea execuŃiei programului descris prin intermediul schemei logice. InstrucŃiunea de atribuire: etichetează un arc cu eticheta v := e. cât si un y-x drum în G se numeşte graf tare conex. p2. i se asociază un bloc ce constituie eticheta unui arc. Cuvântul CITESTE este însoŃit de variabilele ce descriu datele de intrare.b) şi are semnificaŃia " execută a urmat de b". STOP.Dacă p este verificat. atunci există cel puŃin două componente conexe (subgrafuri conexe maximale. InstrucŃiunea de ramificare: este caracterizată prin n arce ce pleacă din acelaşi punct. DefiniŃie.Uneori. SCRIE. arce etichetate cu predicatele p1. disc etc. Schemele logice sunt folosite pentru descrierea algoritmilor.. InstrucŃiunea CITESTE: etichetează un arc ce indică introducerea de la mediul de intrare (tastatură.. Se numeşte schemă logică (sau program sub formă de schemă logică) un graf orientat. • IF0(p.. 2. pn definite astfel încât p1 or p 2 or . Cuvântul SCRIE este însoŃit de variabilele sau constantele ce desemnează datele de ieşire. în care: • există o unică instrucŃiune START şi cel puŃin o instrucŃiune STOP. • orice vârf (diferit de extremitatea finală a unei instrucŃiuni STOP) este extremitatea iniŃiala a unei unice instrucŃiuni. Spunem că x. DefiniŃie. Celelalte instrucŃiuni sunt: 1. 2. O schemă logică poate avea mai multe arce finale. 4.Dacă p este adevărat. y din V sunt conectate în G dacă există un x-y lanŃ în G.formată din arce conectate etichetate cu instrucŃiuni distincte de cea de ramificare. ..conŃin. atribuire sau cu un predicat. se termină cu o instrucŃiune STOP şi conŃine arcul considerat. Dacă G nu este conex. • orice arc este etichetat cu una dintre instrucŃiunile: START. DefiniŃie. a) . Structurile decizionale sunt de următoarele forme: • IF(p. InstrucŃiunea START: etichetează arcul iniŃial (acel arc în a cărui extremitate iniŃiala nu pot sosi alte arce). cel puŃin un predicat şi cel puŃin un bloc funcŃional (instrucŃiune alta decât START sau ramificativă). Blocurile folosite într-o schemă logică descriu instrucŃiuni (comenzi) sau predicate (expresii logice). dacă se verifică proprietatea că oricare două arce vecine au o extremitate comună. 218 .2. În ultimul caz. structura secvenŃială . respectiv b se va nota prin SEQ(a. InstrucŃiunea STOP: etichetează un arc final (acel arc din a cărui extremitate finală nu pot pleca alte arce). 6. structuri decizionale (alternative) . • pentru orice arc există cel puŃin un drum care începe cu instrucŃiunea START. putem folosi noŃiunea de lanŃ. obligatoriu. unde v este o variabilă. Predicatele apar în cadrul instrucŃiunii de ramificare. Graful G este un graf conex dacă oricare două vârfuri din V sunt conectate în G. E) un graf netrivial. Dacă G este un graf trivial (E mulŃime vidă) se acceptă că este graf conex. În secŃiunea următoare prezentăm o metodă de reprezentare a algoritmilor folosind schemele logice. Fie G = (V. disc etc. Fiecărui pas. b) . 5. al algoritmului. disjuncte două câte două relativ la vârfuri). Acestea sunt introduse folosind terminologia teoriei grafurilor. Numim lanŃ (drum) hamiltonian un lanŃ (drum) elementar al unui graf care conŃine toate vârfurile grafului.

Componentele unei structuri de date pot fi de tip elementar sau pot fi.Dacă p1 atunci a1. dar de o deosebită importantă. Pentru a transforma o schemă logică (nestructurată) într-o schemă logică structurată se poate folosi regula variabilei booleene (ce rezultă din demonstraŃia teoremei Bohm-Jacopini). Un mod special de organizare a datelor este întâlnit când avem de prelucrat liste. la rândul lor.. Important este ca numărul instrucŃiunilor goto folosite să fie foarte mic. Comm. Listele pot fi stocate în memoria unui sistem de calcul în două moduri: secvenŃial şi înlănŃuit. Una din consecinŃele importante ale programării structurate este eliminarea instrucŃiunii de salt necondiŃionat (goto) din programe. precizia reprezentării) şi valorile datei (pot fi enumerate sau indicate printr-o proprietate comună). an) . apoi se continuă cu următoarea instrucŃiune. depinde eficienta algoritmilor de prelucrare. Alte date sunt descrise prin componente.. modul de reprezentare în sistemul de calcul. . • date de tip record (structură cu componente oarecare. Un rezultat foarte important afirmă: Orice algoritm poate fi transformat într-un algoritm structurat.• CASE(p1. Unele date sunt de tip simplu: data apare ca o entitate indivizibilă atât din punct de vedere a informaŃiei pe care o reprezintă. Lungimea programelor nu va creste. DefiniŃie. SEQ(b. există situaŃii când instrucŃiunea goto este utilă. iar salturile să fie locale. identificate prin nume).p2.3. Se va retine adresa de 219 . a2. a) . O listă liniară este o structură de date omogenă.. IF şi WHILE se numeşte structurat. Din punct de vedere al domeniului de valori asociat unei date se disting următoarele clase: • date de tip integer (numere întregi).pn. formată din elemente aparŃinând unei mulŃimi date. Modul înlănŃuit presupune că fiecare element al listei este înlocuit cu o celulă formată dintr-o parte de informaŃie (corespunzătoare elementului listei) şi o parte de legătura ce conŃine adresa celulei următorului element din listă. Această afirmaŃie are la bază teorema BohmJacopini. 9 (May. Blocul b descrie instrucŃiunea ce se va executa când condiŃia p este adevărata.Cât timp condiŃia p este adevărata se execută a. iar componentele secvenŃei sunt instrucŃiuni Pascal. este un proces complex. cât şi în raport cu unitatea centrală de prelucrare. ACM... Structuri repetitive (structuri de tip ciclu. 3. cu acelaşi tip sau cu tipuri diferite. Blocul a este un bloc funcŃional de iniŃializare. NoŃiuni introductive privind organizarea datelor Organizarea datelor. De modul în care sunt structurate datele. schema logică asociată se numeşte schemă logică structurată.Este echivalentă cu SEQ(a. c) . dacă p2 atunci a2. SecvenŃa descrie citirea a trei numere. Un algoritm exprimat în funcŃie de structurile SEQ. a. b. Modul secvenŃial presupune stocarea elementelor listei în locaŃii succesive de memorie conform ordinii elementelor din listă şi reŃinerea adresei primului element al listei (adresa de bază).Repetă a până când condiŃia p este adevărata. Turing Machines and languages with only two formation rules. să inserăm sau să ştergem un element etc. . • date de tip char (cu elemente ale mulŃimilor ASCII sau Unicode). 1966).Flow-diagrams. Totuşi. identificate prin poziŃie). false (fals)). a) .. iar claritatea algoritmului nu va avea de suferit. structuri. dacă pn atunci an. calculul mediei aritmetice şi afişarea rezultatului. • date de tip boolean (se referă la valorile de adevăr true (adevărat). Giuseppe Jacopini . structuri iterative) .. • date de tip real sau float (cu elemente din mulŃimea numerelor raŃionale). II. apoi execută instrucŃiunea următoare. secvenŃială. Eticheta secvenŃei de mai sus este ET1. a1. în vederea prelucrării acestora. c))). • FOR(p. Identificarea unei componente se poate face prin poziŃia pe care o ocupă în structură sau prin nume. atribute (domeniul de valori. Evident... iar programul corespunzător se numeşte program structurat. Sunt posibile trei situaŃii: • WHILE(p. Pentru o dată elementară trebuie specificate: un identificator. O colecŃie de date pe care s-a evidenŃiat un anumit mod de structurare şi s-au stabilit procedeele de înregistrare/identificare a componentelor se va numi structură de date. Cititorul interesat de detalii poate consulta lucrarea: Corrado Bohm.conŃin obligatoriu un bloc predicativ şi un bloc funcŃional care se execută de un număr finit de ori până când predicatul îşi schimbă valoarea. WHILE(p. Blocul c (prezentat explicit în această structură) va descrie actualizarea stărilor variabilelor programului cu rol deosebit în evaluarea condiŃiei p. • date de tip array (structură cu componente de acelaşi tip ce ocupă locaŃii succesive din memoria sistemului de calcul. O listă poate fi vidă (nu are nici un element) sau plină (nu mai există spaŃiu pentru stocarea unor componente suplimentare). • date de tip string (obŃinute prin concatenarea datelor de tip caracter). • REPEAT(p. familia algoritmilor structuraŃi este nevidă. Este foarte important să putem accesa un element al listei. 366-371..

Acestea sunt o prelungire a instrucŃiunii de atribuire.. Subprogramele se împart în proceduri şi funcŃii.. în declaraŃii. OperaŃia de := (E1. porŃiunea else S2 poate lipsi. ... . En) sunt compatibile (se referă la aceeaşi clasă de obiecte). numite în continuare cuvinte cheie. Pentru aceasta se utilizează construcŃia SEQ.. cât şi S2 sunt acŃiuni prevăzute. iar ultima celulă va indica. Subprogramul poate fi apelat ori de câte ori este necesară efectuarea acestor operaŃii. 2. InstrucŃiunile insert şi extract. O expresie conŃine paranteze (opŃional). Dacă neîndeplinirea predicatului p nu indică vreo acŃiune. char. S1). Forma instrucŃiunilor de intrare/ieşire este: read v1. Atunci când atât S1.4. . array. folosind caracterul '. respectiv vârf. O listă liniară în care inserările se efectuează la baza listei. instrucŃiunea este echivalentă cu subschema logică IF(p.. InstrucŃiunea repetitivă While. iar S1 şi S2 sunt secvenŃe de instrucŃiuni. Spre deosebire de proceduri. 3. Ele apar înaintea instrucŃiunilor ce descriu paşii algoritmului. El permite atât descrierea instrucŃiunilor algoritmului. Deoarece instrucŃiunile sunt separate între ele. Structura de date elementară adecvată reprezentării secvenŃiale a listelor este tabloul unidimensional.. En) ce realizează simultan atribuirile atribuire este permisă când variabila v (variabilele v1... .. . Vom presupune că citirea datelor (de intrare) se face de la un mediu de intrare (de exemplu: tastatura sistemului de calcul). vn) din membru stâng şi expresia E (expresiile E1.. Această instrucŃiune are forma: if p then S1 [elseS2 ]. InstrucŃiunile vor fi separate. Această instrucŃiune are forma: while p do S.. unde p este un predicat.. Un subprogram este identificat printr-un nume şi o listă de parametri. v2. vn write v1. apar evidenŃiate pentru a fi deosebite de numele variabilelor. SemnificaŃia acestei instrucŃiuni este aceeaşi ca pentru subschema logică While(p.. Limbaj algoritmic O altă modalitate de reprezentare a algoritmilor o constituie utilizarea limbajului algoritmic. E2. funcŃiile întorc obligatoriu un rezultat. Variabilele prezente într-o listă au tipul şi organizarea precizată prin cuvântul cheie respectiv. declararea unei funcŃii începe cu specificarea mulŃimii de valori ce corespunde rezultatului. Această instrucŃiune are forma: v := E (atribuire simplă) sau (v1.. DefiniŃia unui subprogram presupune descrierea (prin instrucŃiuni) modului în care se efectuează calculele şi se transmit rezultatele..bază a listei. Listele liniare pot fi transformate în liste circulare considerând că legătura ultimului element indică adresa bazei listei. între ele.. II. o instrucŃiune poate ocupa mai multe rânduri sau pe un rând pot fi scrise mai multe instrucŃiuni. boolean. 2.. a cuvântului function. 4. În rezolvarea multor probleme apare necesitatea executării repetate a aceloraşi calcule pentru date diferite.'. cât şi descrierea exactă a tipului datelor cu care lucrează algoritmul. Din punct de vedere al scrierii instrucŃiunilor. Cuvintele care identifică un tip de date sau o instrucŃiune. v2.'. S2). v2. O declarare utilizează unul dintre cuvintele cheie integer. vn) vi :=Ei. folosind '. imprimanta. O listă liniară la care inserarea şi extragerea elementelor se face prin vârful listei se numeşte stivă (stack). plotterul etc. iar extragerile prin vârful listei se numeşte coadă (queue). queue. Subprogramele permit descrierea acestor calcule o singură dată. unde p este un predicat.). în partea de legătura. Un algoritm descris folosind limbajul algoritmic este o succesiune finită de declarări si instrucŃiuni. O importantă deosebită o au declarările de subprograme.END prezentată mai sus. InstrucŃiuni de intrare/ieşire. InstrucŃiunile limbajului algoritmic sunt următoarele: 1. Un algoritm este complet cunoscut dacă este descrisă şi definiŃia subprogramelor folosite. . S1. De aceea... string. operanzi (inclusiv apeluri de funcŃii) şi operatori adecvaŃi. între ele. atunci insert i. stack. Declarările precizează tipul şi organizarea datelor.. v2. pentru oricare i = 1.. vn sunt variabile de tip elementar. a unui identificator al procedurii şi a unei liste de declarări (între paranteze rotunde) ce indică informaŃiile ce fac obiectul transferului între apelant şi apelat. 5. iar scrierea rezultatelor (de ieşire) se face la un mediu de ieşire (de exemplu: ecranul. Pentru declararea unei funcŃii se foloseşte cuvântul cheie function. real. Mai multe detalii prezentăm în finalul acestei secŃiuni. Aceste instrucŃiuni sunt necesare pentru lucrul cu liste. Declarările sunt separate. fapt reprezentat prin includerea între paranteze drepte. . InstrucŃiunea If_then_else. vn unde v1. v2. urmat de o listă de nume de variabile... E2.. Orice listă liniară are un început şi un sfârŃit pe care le numim bază. exprimarea fiind echivalentă cu IF0(p. iar S este o secvenŃa de instructiui. L (sau L:=i) exprimă 220 . n. Limbajul algoritmic foloseşte o scriere similară limbajelor de programare moderne. Declararea unei proceduri constă în specificarea cuvântului procedure. a identificatorului funcŃiei şi a listei parametrilor (similar ca la o procedură). o valoare specială (ce nu poate desemna o legătura). InstrucŃiunea de atribuire. folosind caracterul '. S).' va trebui să delimităm secvenŃa S. Dacă se specifică o listă L. . record.

în timp ce semnificaŃia notaŃiei Omega este de limită inferioară. uneori. Modelul maşinii pe care va fi executat algoritmul nu presupune existenŃa operaŃiilor paralele.b. Convenim ca atunci când referim o variabilă (într-o procedură) de fapt. atunci când se ajunge la un apel de procedură. se stabileşte corespondenta între argumente şi parametri. v3:=e3 END. În forma prezentată. SituaŃia cea mai defavorabilă este întâlnită des. n dimensiunea datelor de intrare şi T(n) timpul de executare estimat pentru algoritmul A. v := v +v3). 3. întrebări ca: Mai există un alt algoritm de rezolvare? Este algoritmul găsit "cel mai rapid"? Acest paragraf introduce noŃiunile fundamentale privind complexitatea algoritmilor şi prezintă exemple simple de algoritmi pentru care se determină complexitatea. e1+2e3. InstrucŃiunea return fără valoare de retur este folosită pentru a părăsi execuŃia unei proceduri şi a reveni în unitatea de program din care a avut loc apelul. DefiniŃie. iar instrucŃiunea extract i. . Apelarea unei proceduri se face prin instrucŃiunea apel de procedură care are una din formele: identificator_procedura sau identificator_procedura(lista de argumente) unde identificator_procedura specifică o procedură declarată. a instrucŃiunilor Repeat şi For. 6. SemnificaŃia notaŃiei O este de limită superioară. S. imediat. 8. pentru fiecare algoritm. Se presupune că. Ea are forma: Repeat S until p. S). Fie A un algoritm. Analiza complexităŃii ExistenŃa unui algoritm de rezolvare a unei probleme generează. dar acestea nu sunt considerate momentan. independent de maşina secvenŃiala pe care se va execută algoritmul. Trebuie. Analiza complexităŃii unui algoritm presupune determinarea resurselor de care acesta are nevoie pentru a produce datele de ieşire. Pentru a uşura descrierea algoritmilor admitem prezenŃa. operaŃiile se execută secvenŃial. 221 . între argumente şi parametri există o concordantă ca număr.5. tip şi mod de organizare. Timpul mediu de executare este. InstrucŃiunea For este modelată de structura iterativă FOR(p. e2. e2 şi e3 au acelaşi domeniu de valori ca variabila v. instrucŃiunea determină executarea secvenŃei S pentru v luând succesiv valorile e1. ca instrucŃiuni ale limbajului algoritmic. InstrucŃiunea apel de procedură. 2. e1+e3. să definim noŃiunea de operaŃie primitivă. L (sau i:=L) specifică extragerea elementului curent din lista L şi depunerea acestuia în i. Această instrucŃiune provoacă părăsirea corpului unui subprogram. valoarea expresiei este folosită ca valoare de retur a subprogramului. iar p modelează o expresie logică. facem o referire la locaŃia de memorie corespunzătoare argumentului respectiv. II.introducerea elementului specificat prin i în lista L. iar argumentele sunt expresii separate prin virgulă. Timpul de executare al unui algoritm reprezintă numărul de operaŃii primitive executate. e3 do S unde: S este o secvenŃa de instrucŃiuni. InstrucŃiunea return.. a. NotaŃia theta este utilizată pentru a specifica faptul că o funcŃie este mărginita (inferior si superior). Sunt posibile şi alte moduri de transfer.. InstrucŃiunea Repeat este modelată de structura repetitivă REPEAT (p. În cazul în care cuvântul return este urmat de o expresie. Se spune că algoritmul A are comportare polinomială (aparŃine clasei P) dacă există p>0. şi se execută toate instrucŃiunile specificate în definiŃia procedurii. memoria externă etc. 7. fără a trece dincolo de e2. 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). v1 :=e2. După ultima instrucŃiune a procedurii se continuă cu instrucŃiunea următoare apelului de procedură. Un apel de procedură este corect atunci când. iar expresiile e1. şi anume la instrucŃiunea ce urmează imediat acestui apel. astfel încât T(n) = O(np).c) şi are forma simplificată For v := e1. dar uneori este necesar să analizăm şi alte resurse precum: memoria internă. Prin resursă înŃelegem timpul de executare. apropiat de timpul de executare în cazul cel mai defavorabil. În analiza complexităŃii unui algoritm avem în vedere cazul cel mai defavorabil din mai multe motive: 1.. SEQ v:= e1. Spunem că se realizează un transfer prin referinŃă. unde S este o secvenŃa (eventual vidă) de instrucŃiuni. Formei de mai sus îi corespunde structura iterativă: FOR((v-v2)*v3≤0. dar dificil de estimat.

nemărginite. O funcŃie f are creştere exponenŃiala dacă există a>1 astfel încât f(x) = Omega(ax) şi există x b>1 astfel încât f(x) = O(b ). Algoritmul {P}A{true} este corect dacă şi numai dacă executarea lui A se termină. numită şi formulă de corectitudine totală conŃine următoarele elemente: P .30103 1000000 3 0. n33n etc. ACM. Printre funcŃiile n -> f(n). NotaŃie.DefiniŃie. Un algoritm {P}A{Q} este corect când propoziŃia următoare este validă: Dacă datele de intrare satisfac precondiŃia P Atunci 1) executarea lui A se termină (într-un interval finit de timp) şi 2) datele de ieşire satisfac postcondiŃia Q. funcŃiile ce cresc cel mai lent sunt. 222 . ConstrucŃia {P}A{Q}. R. 2. Tabelul următor ilustrează cele de mai sus. Deci un algoritm a cărui complexitate este log log n este preferabil unui algoritm (elaborat pentru rezolvarea aceleiaşi probleme) de complexitate log n.comentariu care descrie proprietăŃile datelor de intrare (precondiŃia). 3. Regula compunerii secvenŃiale (CS): Dacă A este de forma SEQ B. Pentru n = 1000000. atunci a verifica formula {P}A{Q}.6. 1995. Vom vedea în capitolul 5 câteva metode de rezolvare a problemelor. DefiniŃie. dar mai lent decât funcŃia exponenŃiala ax cu a>1 se spune că este cu creştere exponenŃiala moderată. de exemplu.algoritmul (secvenŃa de instrucŃiuni) supus analizei. Hoare et al. Dacă un algoritm necesită timp de calcul exponenŃial sau factorial. revine la a verifica formulele {P}B{R} şi {R}C{Q}. II. unde M = max (m. Pentru o formalizarea avansată a acestor reguli. Urmează apoi algoritmii moderaŃi (cu T(n) de forma nlogn etc. În continuare vor fi prezentate reguli pentru a analiza corectitudinea unor astfel de algoritmi. Algoritmul lui Euclid pentru a determina cmmdc(m. În informatică sunt interesanŃi numai algoritmii care conduc la un timp de calcul cel mult moderat. C END.6. 672-687. Laws of Programming. n). oricare ar fi A şi Q. Fie n şi m două numere întregi pozitive.) şi cei cu creştere exponenŃiala (2n.02. Pentru aspecte suplimentare legate de corectitudinea algoritmilor se poate folosi lucrarea: Tudor Bălănescu. O funcŃie care creşte mai rapid decât funcŃia putere xp. unde R este un predicat asupra datelor intermediare. Pentru a stabili corectitudinea algoritmilor complecşi se procedează la descompunerea acestora în elemente simple a căror corectitudine se analizează.). Comm. n 10 100 1000 10000 n2 n 3 100 1000 1 10000 1000000 2 0. cititorul interesat poate parcurge lucrarea: C. Algoritmii de tip polinomial sunt mai lenŃi (creşterea funcŃiei T(n) este mai rapidă) decât algoritmii de tip logaritmic. Corectitudinea algoritmilor. A . Folosind elementele fundamentale ale logicii matematice rezultă că următoarele observaŃii sunt adevărate: 1.60206 1000000000 1000000000000 log n log log n 0 PropoziŃie. Mai precis: f este cu creştere exponenŃiala moderată dacă pentru oricare p>0 avem f(x) = Omega(xp) şi oricare M>0 avem f(x) = o((1+ M)x). 1987. log log n ~ 2. acesta va fi utilizat numai în cazuri excepŃionale. deci de a elabora algoritmi.comentariu care descrie proprietăŃile datelor de ieşire (postcondiŃia). Editura Tehnică. Elemente privind corectitudinea algoritmilor A verifica corectitudinea unui algoritm înseamnă a verifica dacă algoritmul conduce într-un interval finit de timp la obŃinerea soluŃiei corecte a problemei pentru care a fost elaborat. Dacă {P}A{Q} şi {R}A{Q} sunt formule corecte. Algoritmii cei mai lenŃi sunt cei pentru care funcŃia T(n) este foarte rapid crescătoare (de exemplu: T(n) = n!). Algoritmul {false}A {Q} este corect. DefiniŃie. atunci {P v R}A {Q} este formulă corectă. Q . A. n) efectuează cel mult [2log2M]+1 operaŃii de împărŃire întreagă. de forma log log n sau (log log n)1. 30(8).47712 100000000 4 0. Bucureşti. Metodele descrise în acest capitol se vor exemplifica pentru algoritmi simpli. atunci când datele iniŃiale satisfac proprietatea P.

{P and not c} B {Q} sunt corecte.CSG: Dacă {P0} A1 {P1}. An END. O proprietate P este mai tare decât proprietatea Q dacă este adevărată propoziŃia compusă: P -> Q. înainte de substituŃie variabila y se înlocuieşte printr-o nouă variabilă (care nu mai apare în e). • Proprietatea I rezultă prin executarea secvenŃei A (adică... atunci obŃinem regula compunerii secvenŃiale generale: &t9. Regula instrucŃiunii if (IF si IFR): Dacă c este o expresie booleană şi A şi B sunt algoritmi.. iar P -> Def(c) este adevărata Atunci formula {P} if c then A else B {Q} este corectă. Regula instrucŃiunii while (W): Regula instrucŃiunii while trebuie să precizeze dacă nu apare fenomenul de ciclare. proprietatea finală Q poate fi dedusă (adică. IFR: Dacă {P and c} A {Q} este corectă. {P} A {I} este algoritm corect)... Regula atribuirii este deci: A: Dacă P -> (Def(e) and Q(x/e)) atunci algoritmul {P} x:=e {Q} este corect. P1 -> P si Q -> Q1. P(x) P(x/e) Valoarea de adevăr a propoziŃiei P -> Q(x/e) nu se schimbă dacă în Q(x/e) se efectuează substituŃia descrisă de atribuirea x := e. dacă A este de forma SEQ A1. I and (not C) -> Q). 2. Regula implicaŃiei are următoarea formă: I: Dacă{P} A {Q} este algoritm corect. atunci executarea secvenŃei S se termină într-un interval finit de timp şi I este adevărata la sfârşit (adică.. iar prelucrările sunt corecte (în paranteze rotunde apare descrierea formală).. A2. ori de câte ori x este variabilă liberă în P. . iar P and (not c) -> Q si P -> Def(c) sunt adevărate Atunci {P} if c then {Q} este formulă corectă. • La terminarea instrucŃiunii while. Mai precis. Regula instrucŃiunii de atribuire (A): Fie notaŃiile: x e Def(e) Variabilă simplă Expresie. {I and c} S {I} este algoritm corect). atunci {P1} A {Q1} este algoritm corect. {Pn-2}An-1{Pn-1} si {Pn-1}An{Pn} sunt algoritmi corecŃi. . 223 . Formula obŃinută din P(x) prin substituirea variabilei simple x cu expresia e. iar dacă e conŃine o variabilă y care apare legată în P. Regula implicaŃiei (I): Această regulă este utilă în cazul algoritmilor ce urmează a fi aplicaŃi în condiŃii mai tari decât pentru cele care au fost deja verificaŃi. Formulă în care apare variabila x. pentru cele două forme ale instrucŃiunii if sunt valabile regulile de corectitudine: IF: Dacă {P and c} A {Q}. . {P1} A2 {P2}. atunci {P0}A{Pn} este algoritm corect. Fie algoritmul {P} A. Proprietatea satisfăcută de acele elemente pentru care evaluarea expresiei e este corectă (Exemplu: pentru integer array b(10).. • I este proprietate invariantă la executarea unei iteraŃii: dacă I este adevărată înainte de executarea secvenŃei S şi expresia booleană c este adevărată.. while c do S {Q}..Este evident că regula CS poate fi aplicată iterativ. Presupunem că există o proprietate invariantă I (vezi mai jos) şi o funcŃie de terminare t cu valori numere întregi care satisfac următoarele condiŃii: • Când I este adevărata atunci expresia booleană c este bine definită (adică I -> Def(c)). 10)). Def(b(i)):= (i=1. Se poate observa că aplicarea regulilor instrucŃiunii de decizie nu este în sine dificilă corectitudinea acestei instrucŃiuni se reduce la corectitudinea instrucŃiunilor componente.

begin. extends. Vom exemplifica indicând câteva secvenŃe predefinite: '\b' (backspace = #8). case. dacă există. function. throw. acestea nu pot fi folosite ca identificatori (în Pascal. final. int. package. do. primul reprezentând valoarea booleană de adevăr. class. Pentru exemplificare ne referim la limbajele de programare Pascal si Java: 1. null. with. Identificatorii nu pot fi identici cu cuvintele rezervate. operator. future. program. I and c -> (t > =1)). finally. downto. Descrierea unui literal caracter se fie folosind o literă. not. external. while. Cuvinte cheie Pascal: absolute. şiruri de caractere. while. iar celălalt valoarea booleană de fals. De exemplu. div.. public. byvalue. if. În aceste condiŃii. else. generic. Literalii booleeni sunt TRUE si FALSE. const. descrierea sa în baza 16 fiind o secvenŃa a simbolurilor asociate reprezentării numărului întreg în baza 16 având prefixul $. între ele. interrupt. boolean. Deşi TRUE si FALSE nu sunt cuvinte rezervate. caracter şi. double. Literalii caracter sunt folosiŃi pentru a desemna caracterele codului Unicode (sau ASCII. const.. este reprezentat pe 16 biŃi. 224 . continue. algoritmul considerat este corect. outer. or. var. acolo unde este cazul). booleene. protected. file. prin comentarii şi spatii. '\n' (linefeed).. then. goto. III. interface. în general. mod. 2) Un caracter imprimabil precedat de semnul ^ desemnează un "caracter de control" având codul ASCII în domeniul 0. if. Exponentul. float. catch. throws. short. dar reprezentarea internă a caracterelor Unicode foloseşte 16 biŃi. Cele mai utilizate simboluri sunt: literele mari şi mici ale alfabetului englez. inline.. type. unit.1. goto. interface. uses. in. to. label. static. of. în limbajul Pascal. set. Cuvintele cheie subliniate sunt prezente şi în limbajul C alături de altele. else. Un literal şir de caractere este constituit din zero sau mai multe caractere între delimitatori. atunci există cel puŃin o iteraŃie de efectuat (adică. flotante. case. default. this. var. este introdus de litera E sau e urmată opŃional de un semn al exponentului. record. native. implements. Literalii ne permit introducerea valorilor pe care le pot lua tipurile de date primitive şi tipul şir de caractere. 'A'. În limbajul Pascal se utilizează apostroful ca delimitator. Literalii întregi. rest. private. volatile. cu semn. 16 sau 8. diferite semne speciale. shr. Identificatorii sunt secvenŃe. instanceof. teoretic nelimitate. Standardul Unicode conŃine ca subset codul ASCII. SecvenŃa de caractere ce formează şirul poate conŃine atât caractere imprimabile. Cuvintele cheie sunt secvenŃe de caractere ASCII rezervate (nu pot avea altă semnificaŃie) utilizate pentru definirea unităŃilor sintactice fundamentale. Vom exemplifica folosind limbajele Pascal şi Java. Java). switch. procedure. void. LIMBAJE DE PROGRAMARE III. '!'. new. Elementele vocabularului sunt alcătuite din caractere Unicode (care constituie alfabetul limbajului). partea fracŃionară şi exponent. repeat.• • Dacă rezultatul evaluării expresiei c este true şi proprietatea I este adevărata. '3'. Caracterele ce au reprezentare grafică pot fi descrise între apostrofuri. SecvenŃele speciale (numite secvenŃe escape în C. transient. Literalii flotanŃi reprezintă numere raŃionale. fie o secvenŃa specială. return. break. cast. Mai precis. try. {(I and c) and (t=a)} S {t < a}). semnul \. nil. packed. . 2. super. începând cu o literă sau liniuŃa de subliniere (în limbajul C). end. forward. array. until. Vocabularul şi sintaxa limbajelor de programare Vocabularul unui limbaj de programare este format din cele mai simple elemente cu semnificaŃie lingvistică numite entităŃi lexicale sau tokens. Valoarea lui t descreşte după executarea unei iteraŃii (adică. cât şi secvenŃe speciale.. for. SecvenŃe speciale în limbajul Pascal: 1) Un întreg din domeniul 0. un literal întreg. char. litere şi cifre. Pentru aproape toate limbajele de programare se pot evidenŃia unităŃi lexicale precum: cuvinte cheie. lieralii sunt constante întregi. SecvenŃele speciale se descriu diferit de la un limbaj la altul. import. 255 precedat de simbolul # desemnează un caracter dat prin codul său ASCII. Lungimea reprezentării interne depinde de implementarea limbajului. . de litere şi cifre Unicode. do. pot fi descrişi prin reprezentări în una din bazele de numeraŃie: 10. identificatori. xor. ca în exemplele: 'P'. literali. Ei sunt formaŃi din următoarele elemente: partea întreagă.. string. SecvenŃele escape în limbajul Java se descriu folosind apostrofuri. UnităŃile lexicale sunt separate. inner. C++ şi Java) permit specificarea caracterelor fără reprezentare grafică precum şi a unor caractere speciale. 31. long. '\r' (carriage return) etc. Cuvinte cheie Java: abstract. separatori şi operatori. Java) ghilimelele. cifrele sistemului zecimal. implementation. shl. and. for. synchronized. byte. iar în limbajul C( C++.

. Modula. Ada etc. în general. . sau pe mai multe linii . f(x. Prentice Hall. Constante. Clauzele (numite . 2. pentru prescurtare metasimbolul . ci numai porŃiuni ale acestora pot fi modelate cu ajutorul limbajelor independente de context. existenta unei operaŃii de concatenare pe mulŃimea unităŃilor sintactice. 225 . 5. separă unităŃi lexicale distincte. Exemple: x[10]. încă din faza de compilare). în anul 1959. Chomsky. <literă> ::= A . Cu ajutorul mecanismelor formale sintaxa unui limbaj este complet specificată. <întreg fără semn> ::= <secvenŃa cifre> defineşte un număr întreg fără semn. Prezentarea acestor reguli se poate folosind limbajul natural sau mecanisme formalizate.i sunt cuprinse între /* si */. <cifră> ::= 0 . Pentru a desemna prezenta opŃională a unor simboluri se utilizează. <identificator> ::= <literă> { <literă> | <cifră>} descrie modul de formare a identificatorilor: un şir de litere şi/sau cifre. Ei nu trebuie confundaŃi cu spatiile care. metasimbolurile [ şi ]. operatori asupra şirurilor de caractere etc.y).). Separatorii sunt necesari când unităŃile lexicale diferite sunt scrise fără spatii între ele. Metasimbolul | este utilizat pentru a delimita mai multe variante de definire ale unei unităŃi sintactice.. Alte elemente lexicale ce pot fi prezente într-un program sunt etichetele . Pentru a putea specifica un întreg limbaj de programare se poate folosi notaŃia BNF extinsă. Metasimbolurile { şi } indică repetarea posibilă (de zero sau mai multe ori) a simbolurilor pe care le delimitează. *(înmulŃire). Variabile. Prin sintaxa unui limbaj de programare se înŃelege. Wirth: Systematic Programming: An introduction. div (împărŃire întreagă în limbajul Pascal). Z descrie mulŃimea literelor mari. Descrierea sintaxei în limbaj natural poate conduce la neclarităŃi sau specificaŃii incomplete. <întreg cu semn>::= [ <semn><întreg fără semn> spune că un întreg cu semn este un întreg fără semn precedat de un semn: + sau -. operatori relaŃionali. Java) sau mod (Pascal. AlŃi operatori sunt: operatori logici. Metasimbolul ::= apare după numele unei unităŃi sintactice şi are semnificaŃia "se defineşte prin". instrucŃiuni. Cei mai întâlniŃi separatori sunt: ( ) { } [ ] .i a fost folosită pentru prima dată. 6. carte. O construcŃie aparte utilizată în programe pentru explicarea sau documentarea textului programului este comentariul. Cea mai folosită notaŃie este cunoscută sub numele de notaŃie BNF (Backus-Naum-Form) . /(împărŃire). În unele limbaje de programare este posibilă redefinirea operatorilor. Iată câteva exemple: 1. şi acestea. Există limbaje de programare puternic tipizate (în sensul verificării cu regularitate a apartenŃei unei date la mulŃimea de valori a tipului său. Mai sunt admise şi operaŃii precum: % (C. Programele C++. Aceştia participă şi la construcŃia sintaxei limbajelor de programare. un ansamblu de reguli privind agregarea unităŃilor lexicale pentru a forma structuri mai complexe (declaraŃii. Comentariile sunt delimitate de textul programului folosind anumiŃi delimitatori. un comentariu este scris între acoladele { } sau între secvenŃele (*.i încep cu //. III. . Etichetele sunt şiruri de cifre zecimale/hexazecimale sau identificatori folosite în legătura cu o instrucŃiune de salt (goto) pentru marcarea unor instrucŃiuni. de asemenea. ToŃi operatorii pot fi priviŃi şi ca separatori. 3.. În prezentarea din acest capitol vom utiliza opt metasimboluri: ::= < > { } [ ] | pentru a defini unităŃile sintactice ale limbajului Pascal.i directive) sunt cuvinte cheie ce desemnează instrucŃiuni cu efect în timpul compilării. care indică continuarea unui şir de valori conform contextului în care apare. ca delimitatori. limbajele de programare nu sunt independente de context. primul semn fiind o literă. <secvenŃa cifre> ::= <cifră> { <cifră>} descrie modul de formare a unei secvenŃe de cifre. *). Totuşi. În cele ce urmează vom prefera limbajul natural (în anumite cazuri) şi notaŃia BNF extinsă (în alte cazuri). O dată are un singur tip (aparŃine unei singure mulŃimi). 1972. Modula). Metasimbolurile < şi > sunt folosite pentru delimitarea numelui unei unităŃi sintactice.. module. Tipuri de date. Java pot conŃine comentarii pe o singură linie .2. acelaşi simbol fiind utilizat pentru operaŃii diferite ce rezultă din contextul în care apar.. la specificarea sintaxei limbajului Algol-60. Lista minimală a operatorilor aritmetici include: +(adunare). -(scădere).autor etc. 9 descrie mulŃimea cifrelor zecimale. Operatorii sunt simboluri grafice ce desemnează operaŃiile definite de un limbaj de programare. de exemplu: N. Această notaŃie are aceeaşi putere generativă cu gramaticile independente de context introduse de N.. Astfel de limbaje de programare sunt: Pascal. Presupunem. Prin diagrame sintactice se realizează o reprezentare grafică a modului de agregare a unităŃilor sintactice. aceasta fiind obŃinuta prin reuniunea variantelor.Separatorii sunt caractere ce indică sfârşitul unui token şi începutul altuia. cititorul interesat asupra diagramelor sintactice poate consulta. <semn> ::= + | 7. În limbajul Pascal. programe etc. 4.i clauzele. Expresii Un tip de date este o structură compusă din: 1) o mulŃime X de valori numite date şi 2) o mulŃime de legi de compoziŃie pe X (operaŃii ce se pot efectua cu valori din X). Vom admite.

operatori relaŃionali (egal. valori aparŃinând unei enumerări sau unui interval (subdomeniu). asociativitate. Rezultatul unei expresii depinde de valorile variabilelor în momentul evaluării. deplasare dreapta). III. tipuri de date structurate. pentru care atributul valoare poate fi modificat.). adică tipuri caracterizate printr-o mulŃime finită de valori. incrementare. Trebuie observat că metoda de reprezentare în memoria calculatorului a numerelor raŃionale ar permite considerarea unei ordini liniare şi. operatori aritmetici unari (utilizarea semnului. fie sunt introduse prin declaraŃii function sau procedure (în Pascal) sau operator (în C++). o linie uses. Partea declarativă indică un antet. deşi sunt tot mulŃimi finite de elemente. mulŃimea valorilor dintr-un subdomeniu al uneia dintre mulŃimile anterioare. O declaraŃie conŃine un tip de valori . Dacă într-o expresie se întâlnesc operaŃii cu aceeaşi precedentă. elementul predecesor pred(.3. operatori aritmetici binari (adunare. operatori asupra mulŃimilor (reuniune. O parte dintre tipurile simple sunt tipuri ordinale. Tipurile de date simple numite şi tipuri primitive (sau tipuri standard) se referă la mulŃimi de elemente precum: numere întregi. sau exclusiv. conversii implicite în cazul tipurilor compatibile. Limbajele de programare oferă o multitudine de operatori: operator de atribuire (simbolizat prin := sau =). mai mare sau egal. negare). cea mai populară aparŃine firmei Borland International şi este destinată calculatoarelor compatibile IBM-PC. În limbajele C. tipuri procedurale. înmulŃire. spunem că avem de-a face cu un tip anonim. Tipurile de date întâlnite în limbajele de programare actuale sunt clasificate în: tipuri de date simple. sau. mai mic sau egal.ce indică: ce se stochează. Tipurile ordinale sunt cele care se referă la mulŃimi precum: mulŃimea numerelor întregi. operatori asupra şirurilor de caractere (concatenare) precum şi alŃi operatori. Valorile unui tip de date (elementele mulŃimii X sunt referite fie prin variabile. Când într-o expresie apar operaŃii cu operanzi de tipuri diferite. Operatorii sunt simboluri care specifică operaŃii efectuate asupra unor variabile sau constante denumite operanzi. Partea declarativă conŃine o descriere a datelor ce vor fi prelucrate pe calculator.şi un identificator pentru a ne referi la variabila ca obiectul declaraŃiei. Practic o variabilă este un obiect caracterizat de tip. Precedenta stabileşte ordinea de evaluare a operaŃiilor în cazul expresiilor care conŃin mai mulŃi operatori diferiŃi. fie prin constante (literali sau constante simbolice). mai mic. Dacă pentru o anumită structură a unui tip nu este stabilit un identificator.) nu sunt considerate tipuri ordinale. precizie extinsă etc. tipuri referinŃă (pointer). pentru orice element al unei asemenea mulŃimi se stabileşte numărul de ordine ord(. CombinaŃiile valide de operanzi şi operatorii reprezintă expresii. atunci ordinea de evaluare este dată de tipul asociativităŃii (de la stânga la dreapta sau de la dreapta la stânga). intersecŃie. Partea principală (numită şi corpul programului) descrie secvenŃa de instrucŃiuni ce se execută în momentul lansării programului pentru executare. Tipurile raŃionale (simplă precizie. Evaluarea expresiilor trebuie să tină seama de poziŃia parantezelor şi de proprietăŃile operatorilor (precedentă. operatori combinaŃi (în limbajele C. operatori la nivel de bit (şi. Tipurile definite de utilizator se introduc prin intermediul unei definiŃii folosind un cuvânt cheie precum type (în Pascal). diferit. se vor utiliza diverse cuvinte cheie pentru a specifica structura tipului. Această mulŃime notată prin void înseamnă fie mulŃimea vidă. De asemenea. mulŃimea caracterelor. împărŃire. negare. Agregarea variabilelor. cât si o descriere a operaŃiilor ce se pot efectua asupra datelor.Tipurile de date sunt standard sau definite de utilizator. prin urmare. OperaŃiile cu elemente ale unui tip sunt fie predefinite.) şi cel succesor succ(. C++ şi Java există tipul void. Structura unui program Turbo Pascal conŃine o parte declarativă şi o parte principală.). constantelor şi a operatorilor conduce la construcŃii numite expresii. conversii explicite). obŃinerea câtului şi restului împărŃirii a două numere întregi). Elvetia) în anul 1971. aparŃine). elementele unei astfel de mulŃimi ar avea un număr de ordine. prin abuz de limbaj. una 226 . Orice variabilă trebuie să fie declarată pentru a putea fi folosită. fie o mulŃime neprecizată. valori de adevăr (logice sau booleene). O locaŃie de memorie care poate stoca o valoare a unui anumit tip de date se numeşte. sau. diferenŃă). dublă precizie. mulŃimea valorilor unei enumerări. operatori logici (şi. mulŃimea valorilor de adevăr. AcŃiunile (reprezentate de instrucŃiuni) asupra datelor efective sunt descrise în partea principală. scădere. mai mare. C++ şi Java). caractere. Există foarte multe implementări ale acestui limbaj. înainte de efectuarea operaŃiei are loc un proces de conversie implicită (când nu se semnalează explicit şi nu apare fenomenul de incompatibiltate) prin care tipul cu cardinalul mai mic este promovat către tipul mai bogat (se presupune aici că natura elementelor celor două tipuri este aceeaşi). cum se stochează şi în ce operaŃii intervin valorile stocate . pe care este definită o ordine liniară şi. numere raŃionale. variabilă. deplasare stânga. Expresiile sunt evaluate în cursul executării unui program. typedef (în C) sau class (în limbajele C++ şi Java). decrementare). adresă şi valoare. Programare în Turbo Pascal Limbajul Pascal a fost definit de profesorul Niklaus Wirth (Universitatea Tehnică din Zürich.

Apelul PROC(X. InstrucŃiunea de transfer necondiŃionat. sau tipul uneia să fie un subdomeniu al celeilalte. va continua indefinit. transferă controlul execuŃiei programului în alt loc din textul sursă implementând mecanismul "Mergi la pasul ". în notaŃia BNF. constante (const) şi variabile (var)) precum şi una sau mai multe declaraŃii şi definiŃii de subprograme. case) şi instrucŃiunea with (în contextul prelucrării datelor de tip record). se poate utiliza instrucŃiunea compusă indicată prin secvenŃa begin . instrucŃiunea repeat (ciclul cu test final) şi instrucŃiunea for (ciclul cu contor).. Pentru specificarea acestui aspect se utilizează iteraŃia (ciclul sau bucla) concretizată într-o instrucŃiune iterativă.Z. unde C este o expresie logică. While i<10 do read(x).. end. PROC(L1. Totuşi.. atunci instrucŃiunea S nu se execută.45. S). Astfel. end sau repeat . tipuri de date (type).1. un algoritm exprimă execuŃia de zero sau mai multe ori a unui grup de operaŃii. AcŃiunile simple sunt: instrucŃiunea de atribuire.0. cazul în care <variabilă> are tipul real. atunci reprezintă o instrucŃiune compusă.L2. SecvenŃa corectă este: 227 .ARIA). while. dar nu este recomandabil). apelează procedura write pentru şirul 'Apel !'. InstrucŃiunea de atribuire. PROC(2. InstrucŃiunile repetitive Pascal sunt: instrucŃiunea while. Dacă expresia logică C este falsă execuŃia continuă cu următoarea instrucŃiune (imediat după while). pentru fiecare i pentru care este adevărată condiŃia i<=N se vor executa instrucŃiunile dintre begin şi end. 5. InstrucŃiunea apel de procedură se inserează în program în locul în care se doreşte executarea instrucŃiunilor specificate de o declaraŃie de procedură asupra unor date efective transmise procedurii în locul de apel. end". Trebuie observat că blocul S trebuie să asigure o schimbare. . În exemplul: begin i:=i+1. .sau mai multe declaraŃii (etichete (label). s:=s+x.0. Pentru a asigura terminarea ciclului trebuie să modificăm valoarea variabilei i. InstrucŃiunile dintre begin şi end se execută în ordinea în care apar. pentru uzul programatorilor. ca o excepŃie. c:real. O procedură cu antetul procedure PROC(a.3.. InstrucŃiuni Pascal InstrucŃiunile limbajului Turbo Pascal sunt grupate în două clase: instrucŃiuni simple şi instrucŃiuni structurate.Y. instrucŃiunea de transfer necondiŃionat (goto) şi instrucŃiunea vidă (cu efect nul). Dacă de la început expresia C are valoarea false. InstrucŃiunea compusă. Y. until. while <=n do begin read(x). nu are efect asupra variabilelor programului (nu schimbă starea programului). Conform teoremei fundamentale a programării structurate. b. InstrucŃiunea while are forma While C do S.0). A). Dacă S exprimă mai multe operaŃii. iar <expresie> conduce la un rezultat de tip întreg. sau ambele trebuie să fie subdomenii ale aceluiaşi tip. De foarte multe ori. instrucŃiunea apel de procedură. InstrucŃiuni iterative (repetitive). deci şi a oricărui program pentru calculator.L3. limbajele de programare includ şi alte construcŃii. În secvenŃa de mai jos. InstrucŃiunea S se execută cât timp expresia logică C este adevărată. i:=1. altfel se obŃine o buclă infinită. prezenta acesteia este marcată de apariŃia acestui delimitator. Când într-o instrucŃiune este necesară specificarea unei alte instrucŃiuni. instrucŃiunile iterative (for.. III.0. InstrucŃiunea de efect nul (instrucŃiunea vidă)." şi între ". execuŃia secvenŃei: i:=1. Următoarele apeluri sunt corecte: PROC(3. repeat). InstrucŃiunea către care se realizează transferul trebuie să fie una etichetată Există anumite restricŃii privind utilizarea instrucŃiunii goto (se transferă controlul în acelaşi bloc de instrucŃiuni redat prin begin . write(i). are forma descrisă prin: <instrucŃiune de atribuire> ::= <variabilă> := <expresie> unde <variabilă> şi rezultatul dat de <expresie> trebuie să fie de tipuri identice. transferul către o instrucŃiune din interiorul unei instrucŃiuni compuse este permis. în timp.. iar S este o instrucŃiune. a valorii de adevăr a condiŃiei C. var s:real) se poate apela în mai multe moduri. AcŃiunile structurate sunt reprezentate de: instrucŃiunea compusă.". instrucŃiuni condiŃionale (if. instrucŃiunea repetitivă cu test iniŃial (while) este suficientă pentru exprimarea oricărui algoritm. Se acceptă. i:=i+1 end. end instrucŃiunea cu efect nul apare între cei doi delimitatori ". Din punct de vedere sintactic. Ea nu este redată printr-un cuvânt cheie. InstrucŃiunea write('Apel!'). Z. nu este un apel corect deoarece al patrulea parametru nu poate fi o constantă. 4.0. dar deoarece instrucŃiunile Pascal sunt separate prin delimitatorul ". o instrucŃiune este alcătuita dintr-o etichetă (opŃională) pentru a putea fi referită de alte instrucŃiuni urmată de instrucŃiunea propriu-zisă (care descrie acŃiunea realizată în momentul executării sale).

| directivă INLINE | directivă ASM ) 228 . Limbajul Pascal. Variabila v. III. (o buclă infinită) şi While false do I. | far . <element case>}] [else <instructine>][. Identificatorul unei proceduri (urmat. NoŃiunile de expresie şi instrucŃiune pot fi generalizate prin intermediul subprogramelor (funcŃii şi proceduri). unde S este o secvenŃa de instrucŃiuni (nu neapărat incluse într-o instrucŃiune compusă). eventual. iar i şi f trebuie să fie expresii compatibile cu tipul variabile v. Dacă valoarea de adevăr a acestei condiŃii este true se va executa secvenŃa de pe ramura then (S1). InstrucŃiunea repeat are forma repeat S until C. <constantă2>: <instrucŃiune> Expresia ce defineşte selectorul are valori ordinale cuprinse între –32768 şi 32767. Elementele introduse anterior: tip de date.] (bloc | forward. Conform notaŃiei BNF. Declararea unei proceduri Pascal se realizează conform urmă-toarelor reguli: <procedură> ::= <antet_procedură>. de o secvenŃa declarativă. iniŃial se evaluează expresia logică C. fiecare element din listă fiind precedat de o constantă cu un subdomeniu de valori din mulŃimea de bază a selectorului. Acestă instrucŃiune simplifică modul de referire la componentele înregistrărilor. InstrucŃiuni condiŃionale (instrucŃiuni de decizie). Subprograme Pascal Proceduri Pascal.] end <element case> ::= <constantă> {<constantă>} <constantă1> . while v>=f do begin S.i:=1. InstrucŃiunea case utilizează o expresie numită selector şi o listă de instrucŃiuni.secvenŃa I nu se execută niciodată).2. iar C este o expresie logică. Pentru oricare dintre forme. Identificatorul unei funcŃii urmat. expresie. de o listă a argumentelor efective. În <instrucŃiune> se folosesc numai identificatorii câmpurilor înregistrărilor specificate în lista dintre with şi do. alături de instrucŃiunea if. iar forma for v:=i downto f do S este echivalentă cu secvenŃa: v:=i. numită contor. eventual.. forma instrucŃiunii case este: <instrucŃiunea case> ::= case <selector> of [ <element case> {. în loc de repeat S until C. v:=pred(v) end. putem scrie S. while v<= f do begin S. (instrucŃiune de efect nul . Forma for v:=i to f do S este echivalentă cu secvenŃa: v:=i. InstrucŃiunea for are una din formele: for v:=i to f do S sau for v:=i downto f do S. v := succ(v) end.<variabilă record>} do <instrucŃiune> unde: lista dintre cuvintele rezervate with şi do conŃine identificatorii variabilelor de tip înregistrare (record) cărora li se aplică instrucŃiunea ce apare după cuvântul do. DeclaraŃia unui subprogram Pascal asociază un identificator unui bloc de instrucŃiuni precedat. Se poate introduce tipul subprogram (numit şi tip procedural). Identificatorul subprogramului poate fi urmat de o listă de parametrii formali. poate fi folosit în expresii sau în orice loc unde poate fi prezentă o expresie. i:=i+1 end. variabilă. execuŃia ei continuând până când condiŃia C este îndeplinită (valoarea de adevăr a expresiei C este true). <corp> ::= [ interrupt . SecvenŃa S se execută cel puŃin o dată. while (not C) do S. Alte construcŃii interesante sunt: While true do I. while < 10 do begin read(x).<corp> <antet_procedură> ::= procedure <identificator> [ (<listă_parametrii>)]. Valoarea finală a variabilei v se consideră a fi nedefinită după terminarea normală a instrucŃiunii for. Practic. instrucŃiune permit codificarea riguroasă a prelucrărilor de date sub formă de programe.3. InstrucŃiunea with are forma generală: with <variabilă record>{ . trebuie să fie de tip ordinal (pe mulŃimea de definiŃie trebuie să aibă sens funcŃiile succ(esor) şi pred(ecesor)). | near . iar în al doilea caz se execută secvenŃa de pe ramura else (S2). O instrucŃiune condiŃională selectează o singură instrucŃiune dintre mai multe alternative posibile. | external. InstrucŃiunea if are una din forma: if C then S1 sau forma if C then S1 else S2. de o listă a parametrilor efectivi) poate fi folosit prin intermediul instrucŃiunii apel de procedură. eventual. altfel în primul caz se execută instrucŃiunea de efect nul. permite şi utilizarea unei instrucŃiuni de selecŃie multiplă: instrucŃiunea case.

parametri fără tip. Un parametru actual corespunzător unui parametru valoare. Zona de instrucŃiuni a corpului specifică instrucŃiunile ce urmează a-tilde. şi tipul rezultatului.| external . La evaluarea expresiei. Odată definit un tip procedural. FuncŃii Pascal. Un parametru valoare. Orice schimbare asupra unui parametru valoare nu va afecta valoarea parametrului actual. Din punct de vedere sintactic. DeclaraŃia unui tip procedural include parametri. declararea parametrilor formali urmează regulile: <listă_parametri_formali>::= (<declaratie_parametru>{ . a fi executate la apelul funcŃiei. <corp>::= [ near . Regulile avute în vedere la o astfel de declarare sunt descrise prin: <tip_procedural> ::= <tip_procedure>| <tip_function> <tip_procedure> ::= procedure. Apelul de funcŃie constă din identificatorul funcŃiei urmat.InstrucŃiunile ce se execută la activarea unei proceduri (în general. în subprogram. presupune o conversie de tip pentru a suporta corespondenta cu parametrul actual. reprezintă chiar parametrul actual. trebuie să fie declarat ca variabilă în unitatea apelantă sau mai sus. precum si comunicarea între subprograme se poate face prin entităŃi globale şi prin parametri. valoarea returnată de funcŃiei nu este precizată. La execuŃia apelului subprogramului valorile parametrilor de apel sunt substituite parametrilor formali (blocul primeşte semnale concrete) astfel că acŃiunile instrucŃiunilor subprogramului au loc asupra acestor valori. Comunicarea prin intermediul parametrilor permite tratarea subprogramelor ca pe nişte blocuri specializate având un anumit număr de linii de intrare şi un anumit număr de linii de ieşire.| procedure (<listă_parametri_formal>). Parametrul actual corespunzător unui parametru fără tip trebuie să fie declarat în unitatea apelantă sau mai sus ca variabilă. Comunicarea între unităŃi de program.| directivă INLINE | directivă ASM) Tipul rezultatului returnat este fie un nume de tip simplu. într-un apel de subprogram. fie string. Această comunicarea este posibilă prin specificarea listei parametrilor la declararea şi definirea unui subprogram.| 229 . Borland Pascal permite ca subprogramele să fie tratate ca elemente ale unor mulŃimi de subprograme. Un parametru variabilă este utilizat atunci când subprogramul trebuie să furnizeze valori apelantului. Un astfel de tip de date se numeşte tip procedural. cu operatorul =. <declaratie_parametru>} ) <declaratie_parametru> ::= <listă_identificatori> : <tip> | var <listă_identificatori> : <tip> | var <listă_identificatori> <tip> ::= <tip_simplu> | string | file Un grup de identificatori neprecedaŃi de var. Parametrul actual. în timpul unui apel. putem declara variabile de acest tip . de lista argumentelor funcŃiei. Parametrul formal de tip variabilă. nu de tip file şi nici de tip structurat altul decât string. Un grup de parametri precedaŃi de var. în liniile INLINE sau în blocul ASM. iar pentru funcŃii. Parametrul actual şi cel formal trebuie să aibă tipuri compatibile. când este vorba de un identificator global. Un apel de funcŃie apare ca un operand într-o expresie. Fişierele pot fi transmise numai ca parametrii variabilă.| far . într-un apel de subprogram. iar valoarea operandului devine valoarea returnată de funcŃie. dar urmaŃi de un tip reprezintă parametri valoare. între paranteze. cu operatorul <> şi ca parametri în apelurile de subprograme. Un subprogram function este activat printr-un apel de funcŃie. Utilizarea unui parametru fără tip. Rezultatul întors este ultima valoare asociată. Există trei categorii de parametri formali: parametri valoare. Extinzând limbajul Pascal standard. se apelează şi se execută subprogramul function. iar aceste variabile pot fi folosite în atribuiri. dar neurmaŃi de tip reprezintă parametrii fără tip. pentru subprogram. deci orice modificare asupra parametrului formal se va reflecta asupra parametrului actual. trebuie să fie o expresie. eventual. Acest bloc trebuie să conŃină cel puŃin o instrucŃiune de atribuire care asociază o valoare identificatorului funcŃiei. parametri variabilă.] (bloc | forward . cu excepŃia faptului că la execuŃie va fi iniŃializat cu valoarea parametrului actual corespunzător.numite variabile procedurale. Declararea unei funcŃii Pascal se supune regulilor următoare: <funcŃie> ::= <antet>. Când o astfel de instrucŃiune lipseşte. Cu ajutorul acestora se pot realiza prelucrări generice. <tip_function> := function : <tip_rezultat>. Tipuri procedurale. Comunicarea între programul principal şi subprograme. deci se pot definii tipuri de date asociate subprogramelor. a unui subprogram) sunt descrise în blocul subprogramului. <corp> <antet> ::= = function <identificator> [ (listă_parametrii_formali) ] : <tip_rezultat>. se comportă ca o variabilă locală. Un grup de parametri precedaŃi de var şi urmaŃi de un identificator de tip reprezintă parametri variabilă. Parametrul formal şi parametrul actual corespunzător trebuie să fie de acelaşi tip.

Clasa de memorare este specificată prin unul dintre cuvintele cheie: typedef. b: real. char.). • Legătura . acestea specificând operaŃii anterioare procesului de compilare ce sunt efectuate de o componenta a mediului de programare numită preprocesor.localizează zona de memorie în care este plasat elementul declarat (zona de date. • Domeniul numelui . auto. integer si variantele. funcmat = function(x: real):real.4. DeclaraŃia unui identificator asociază numelui în mod explicit sau implicit o serie de atribute din mulŃimea următoare: • Clasa de memorare . III. organizate în una sau mai multe unităŃi de translatare. procstr = procedure(var s:string). Ea constă din fişierul sursă împreuna cu oricare fişier antet şi fişiere sursă incluse prin directiva #include. • Durata de stocare .function (<listă_parametri_formali>):<tip_rezultat>.1. extern. cu domeniul 230 . Structura programelor C În limbajul C programul este o colecŃie de module distincte numite funcŃii. static. Regulile sintactice ce stau la baza scrierii declaraŃiilor sunt redate prin: <declaraŃie> ::= <specificator declaraŃie> [ <lista declaratori de iniŃializare> ] . O unitate de translatare trebuie să conŃină cel puŃin o declaraŃie sau o definiŃie de funcŃie. Exista situaŃii când alocarea se realizează în altă unitate de translatare (cazul datelor externe). proc2int = procedure(var a. În anul 1983 a început redactarea standardului ANSI pentru limbajul C.descrie informaŃia conŃinută de elementul definit de identificator. III. Standardul ANSI a fost finalizat în anul 1990. f:funcmat): real. • Tipul datei (standard sau definit de utilizator) . prin compilare. O declaraŃie C specifică atributele unui identificator sau mulŃime de identificatori. O variabilă procedurală se declară ca orice altă variabilă. boolean. O unitate de translatare. Programare în C Limbajul C a fost creat la AT & T Bell Laboratories în anul 1972 de Dennis Ritchie. Exemple: type proc = procedure. pointer (referinŃă) şi enumerare (definit de utilizator). <specificator declaraŃie> ::= <clasa de memorare> [ <specificator declaraŃie> ] | <specificator tip> [ <specificator declaraŃie> ] | <calificator tip> [ <specificator declaraŃie> ] <lista declaratori de iniŃializate> ::= < declarator iniŃializare> | <lista declaratori iniŃializare>. real şi variantele. Nu putem scrie subprograme de tip funcŃie care să returneze variabile procedurale. Identificatorii parametrilor în <listă_parametri_formali> sunt pur decorativi. în procesul de editare a legăturilor. Eqfunc = function (a. executarea unei funcŃii sau a unui bloc etc. <declarator iniŃializare> <declarator iniŃializare> ::= <declarator> | <declarator> = <iniŃializare> A face o declaraŃie nu presupune şi alocarea memoriei pentru identificatorul declarat.reprezintă perioada cât elementul asociat există efectiv în memorie. stiva mediului de programare. funcmat2 = function(x.4. ei nu au o semnificaŃie deosebită în partea declarativă. zona de alocare dinamică) şi delimitează durata alocării (întreg timpul de executare a programului. Directivele precedate de delimitatorul # se numesc directive preprocesor. un registru al procesorului.indică modul de asociere a unui identificator cu un anumit obiect sau funcŃie. DeclaraŃia auto se poate utiliza pentru variabile temporare . b:integer). conduce la un fişier obiect (. Versiunea standard a limbajului C până în anul 1988 a fost cea furnizata odată cu sistemul de operare UNIX şi descrisă în [14].obj) relocabil. FuncŃiile pot returna valori din următoarele categorii: string.reprezintă porŃiunea din program în care poate fi utilizat identificatorul pentru accesarea informaŃiei asociate şi este determinat de poziŃia declaraŃiei.alocate folosind stiva. y: real):real. Fiecare unitate de translatare poate fi compilată (analizată lexical şi sintactic) separat. register.

se supune implicit legării externe. sintaxa declaraŃiei unei structuri este: <declaraŃie structura> ::= struct < id _tip> { <tip _camp _1> <id _camp _1>. Efectul sufixului asociat unui literal întreg este ilustrat prin situaŃiile: U sau u . Pentru identificatorii cu legătura externă sunt permise mai multe declaraŃii de referinŃă. Acestui tip i se poate asocia un nume. Tabloul este o listă de elemente de acelaşi tip plasate succesiv într-o zona contiguă de memorie. 231 . deci auto este rar utilizat. O declaraŃie de structura precizează identificatorii şi tipurile elementelor componente şi constituie o definiŃie a unui tip de date nou. FuncŃiile au implicit legătura externă şi durata statică. În categoria tipurilor aritmetice intră mulŃimile de elemente specificate prin cuvintele cheie: char. va fi considerat de tip long double. L. În C (precum şi în Pascal). u. ci se asociază un nume tipului de date. de tip structurat sau de tip uniune. O declaraŃie a unui identificator este vizibila în tot domeniul sau mai puŃin blocurile sau funcŃiile în care identificatorul este redeclarat. el se supune legării interne.unsigned long int. uL . Dacă un identificator are domeniul fişier şi clasa de memorare static. long.long int sau unsigned long int (în funcŃie de valoare). extinse cu ajutorul modificatorilor de tip: signed. • Domeniul funcŃie . PoziŃia declaraŃiei determina următoarele domenii: • Domeniul bloc . tipuri de variabile şi tipul void. semnificaŃia apelului fiind de optimizare a timpului de acces. Specificatorul extern este utilizat pentru declaraŃii de funcŃii sau variabile locale sau globale pentru a indica legătura externă şi durata statică. În C. parametrii formali din definiŃia unei funcŃii au ca domeniu blocul funcŃiei). dacă se utilizează sufixul F sau f va fi considerat de tip float. UL. de mai multe ori.caracterizează identificatorii declaraŃi în exteriorul oricărei funcŃii .caracterizează identificatorii locali (identificatorii declaraŃi în interiorul unui bloc şi au domeniul cuprins între declaraŃie şi sfârşitul blocului. el se supune aceluiaşi tip de legare precum orice declaraŃie vizibila a identificatorului cu domeniu fişier. Tipul void indică absenŃa oricărei valori şi este utilizat în următoarele situaŃii: declaraŃia unei funcŃii fără parametrii sau fără rezultat.definit pentru identificatorii specificaŃi în lista de parametrii din prototipul unei funcŃii . există următoarele categorii de tipuri: tipuri de funcŃii. Structura este o colecŃie de date eterogene (corespunde tipului record din limbajul Pascal). În limbajul C clasic. • Domeniul fişier . l. Sintaxa este: typedef <definiŃie tip> <identificator>. Literalii sunt şi ei afectaŃi de existenta modificatorilor de tip prin indicarea unui sufix (U. Legarea poate fi internă. int.local. Ea poate apărea în exteriorul oricărei funcŃii. Domeniul numelui este regiunea dintr-un program C în care identificatorul este "vizibil". structuri). o declaraŃie register reprezintă un apel la compilator pentru a stoca o variabilă int sau char într-un registru al procesorului pentru a creste viteza de executare. sau redeclarat în acelaşi domeniu se poate referi la acelaşi obiect sau funcŃie prin procesul numit legare. ul. double. Tot tip aritmetic este considerat a fi şi tipul obŃinut prin enumerare. în lista de parametri formali ai unei funcŃii sau la începutul unui bloc. Partea din domeniu în care informaŃia asociata este accesibila se numeşte zona de vizibilitate. Un identificator declarat în diferite domenii. este automat de tip double. iar dacă se utilizează sufixul L sau l. Nu există limită pentru numărul dimensiunilor tabloului.şi care au domeniul cuprins între declaraŃie şi sfârşitul fişierului.aplicabil pentru etichetele instrucŃiunilor şi este blocul funcŃiei. Variabilele declarate în interiorul unui bloc sunt implicit locale. Daca un identificator are clasa de memorare extern. Tipurile scalare sunt tipuri aritmetice şi tipul pointer. Variabilele pot fi de tip scalar.şi care au domeniul limitat la acel prototip.numiŃi identificatori globali .unsigned int sau unsigned long int (în funcŃie de valoare). declaraŃia unei variabile trebuie să preceadă orice referire a ei. Specificatorul typedef indică faptul că nu se declară o variabilă sau funcŃie de un anumit tip. Tipurile structurate cuprind tablourile şi înregistrările (numite în C. float. dar trebuie să existe o singură definiŃie. F). În cazul general. unsigned. Pentru identificatorii globali se poate repeta declaraŃia. L sau l . externă sau unică. f. short. Un literal de tip număr zecimal. Specificatorii de tip indică modul de alocare asociat unei variabile sau tipul rezultatului unei funcŃii. Versiunile actuale permit specificarea register pentru orice tip. dar iniŃializarea trebuie să se facă o singură dată. Specificatorul static poate să apară în declaraŃii locale de variabile pentru a indica durata statică sau în declaraŃii globale de funcŃii şi de variabile pentru a indica legătura internă. Ul. • Domeniul prototip . tipul pointer generic şi conversii de tip pentru pointeri. dacă nu există declaraŃii vizibile cu domeniul fişier.

este cuvânt cheie pentru construirea unui tip înregistrare. Practic. în fişiere antet.. cu sintaxa generală: 232 . . • <id_tip> . deoarece organizarea memoriei depinde de sistemul de calcul. SpaŃiul alocat în memorie corespunde tipului cu dimensiune maxima. <tip_ var_2> <id_ var_2>. <tip_ var_i> <id _var_i>. primul element are asociată valoarea 0. .<tip_parametru> <id _parametru>] Acoladele { } sunt delimitatori ce încadrează o instrucŃiune compusă (bloc) alcătuita din declaraŃii şi instrucŃiuni.identificatorul câmpului i (câmpurile structurii se mai numesc şi membrii structurii). } <lista identificatori de tip union>.h.. • <lista identificatori de tip struct> . fie explicit. Printre funcŃii trebuie să existe una cu numele "main " cu care va începe executarea programului. FuncŃiile din bibliotecile C sunt declarate împreuna cu constantele... mai multe variabile sunt suprapuse în acelaşi spaŃiu de memorie. <id _funcŃie> reprezintă numele (identificatorul) funcŃiei.este un identificator ce desemnează numele tipului structură ce este declarat. numai într-un singur fişier. Fişierele antet ale programatorului vor fi încadrate folosind delimitatorul ". dar identificatorii declaraŃi ca membrii reprezintă numele cu care sunt referite diferitele tipuri de variabile ce ocupă aceeaşi zona de memorie: <declaraŃie uniune> ::= union <id_tip> { <tip_var_ 1> <id_var_1>. Sintaxa declaraŃiei este similară cu cea a structurii. Uniunile sunt entităŃi care pot conŃine (la momente de timp diferite) obiecte de tipuri diferite.. } <lista identificatori de tip struct>. trebuie să conŃină o instrucŃiune return. in care: • struct . • <tip_camp_i> . tipurile şi variabilele globale asociate. • <id_camp_i> . SecvenŃa de instrucŃiuni a funcŃiilor pentru care <tip _rezultat> este diferit de tipul void. . fiecare fiind asociată câte unui identificator.) Într-o expresie care precizează identificatorul variabilei şi al câmpului. cu extensia ". Chiar dacă programul este organizat pe mai multe fişiere sursă. O funcŃie C are structura: <tip_ rezultat> <id_functie> (<lista _parametri_ formali>){ declaratii_locale secventa_instructiuni } unde <tip_ rezultat> indica tipul rezultatului returnat de funcŃie. Alocarea câmpurilor poate ridica probleme de portabilitate. Implicit. Tipul enumerare constă dintr-un ansamblu de constante întregi (cel puŃin un element). <tip _camp _n> <id _camp _n>. OperaŃiile de intrare-ieşire necesită specificarea fişierului stdio. în implementarea programelor de comunicaŃie etc. iar pentru restul este valoarea _precedenta+1. numai o singura funcŃie poate purta numele "main".h".tipul câmpului i. încadrat de delimitatorii < şi >.. . <tip _camp _i> <id _camp _i>.. într-o directiv{ # include. Limbajul C nu conŃine funcŃii predefinite cum sunt cele din unitatea System a mediului Borland Pascal.<tip _camp _2> <id _camp _2>. iar <lista_parametri_ formali> constă în enumerarea declaraŃiilor parametrilor funcŃiei sub forma: <tip_ parametru> <id_ parametru> [ . declaraŃii globale şi funcŃii. <tip_ var_ n> <id_ var_n>.lista identificatorilor declaraŃi. situate în subarborele include al arborelui asociat mediului de programare. Cel mai simplu program C este constituit din directive preprocesor. Constanta unui element al enumerării este fie asociată implicit. Referirea unui membru al unei variabile de tip structură se face folosind operatorul de selecŃie (. Celelalte funcŃii sunt subprograme definite de programator sau funcŃii din biblioteca de subprograme.. Tipurile uniune sunt utile pentru conversii de date.

lista_adrese_ variabile] ). Dacă sunt mai puŃine caractere de scris.).return <expresie> Rezultatul funcŃiei este valoarea expresiei. int getche(void ) şi int getch( void).4. formatarea specifică conversia datelor de la reprezentarea externă în reprezentarea binară. OperaŃii de citire/scriere fără formatare.stdin) şi ecran (zonele de date . FuncŃia printf întoarce numărul de octeŃi transferaŃi sau EOF în caz de eşec. FuncŃia cu prototipul char *gets (char *s) citeşte caractere din stdin şi le depune în zona de date de la adresa s. Argumentul corespunzător va fi afişat pe un câmp cu latine cel puŃin width. tab ('\t'). ultimele două variante nefiind prevăzute de standardul ANSI. tastei Enter îi va corespunde caracterul '\0'. La succes. se va 233 . scrierea) şirurilor de caractere se lucrează cu funcŃia gets (respectiv puts). caracterele de tip II şi III se afişează pe ecran aşa cum apar în şirul format.h). linie noua ('\n'). 2. Dacă operaŃia reuşeşte. Sunt posibile operaŃii de citire/scriere fără formatare şi operaŃii de citire/scriere cu formatare. + : numerele vor fi obligatoriu tipărite cu semn. FuncŃia getch este similara cu getche(). Pentru scrierea unui caracter la stdout se utilizează funcŃia int putchar (int c) care afişează pe ecran caracterul cu codul ASCII c. În şir. Forma generală a unui descriptor pentru scriere este: % [ flags] [ width] [ . funcŃia întoarce adresa şirului. Acestea permit lucrul cu caractere (char ) sau cu şiruri de caractere (* char). FuncŃia main poate avea parametri şi poate întoarce un rezultat. FuncŃiile de intrare-ieşire pentru consolă Consola sau dispozitivul standard de intrare-ieşire reprezentate de tastatură (zona de date . FuncŃia getchar întoarce primul caracter din stdin. altfel valoarea NULL ( = 0 ). iar pentru scrierea datelor se utilizează funcŃia printf cu prototipul: int printf( const char *format. dar nu afişează ecoul pe ecran. dar sunt prezente în versiunile Borland (fişierul antet conio.stdout şi stderr) permit utilizatorului interacŃiunea cu programul aflat în executare. 0 : indică completarea la stânga cu zerouri (la numere). dacă s-a specificat flag-ul -. width: este un număr care specifica lăŃimea minima a câmpului. III.prec] [ lmod] type specificaŃiile dintre [ şi ] fiind opŃionale. PrezenŃa unui caracter de tip III determină citirea fără stocare a caracterului curent de la tastatură. Dacă nu s-a stocat nici o valoare. iar în caz de eşec valoarea EOF (-1). Fiecărei variabile din lista îi corespunde o specificaŃie de format (tipul I. dacă este identic. În cazul unei erori sau la întâlnirea combinaŃiei EOF (sfârşit de fişier) funcŃia întoarce valoarea -1 (codificată prin EOF). Pentru citirea unui caracter din stdin pot fi utilizate funcŃiile: int getchar(void). spaŃiu. FuncŃia getche aşteaptă apăsarea unei taste şi întoarce caracterul corespunzător pe care îl afişează pe ecran (nu e nevoie de Enter ). FuncŃia scanf întoarce numărul de câmpuri citite şi depuse la adresele din listă. lista_valori). Dacă s-a specificat flagul 0. altfel valoarea EOF. FuncŃia cu prototipul int puts( const char *s) afişază pe ecran şirul de la adresa s sau o constantă şir de caractere (secvenŃa de caractere între ghilimele) şi apoi trece la linie noua. Elementele de mai sus au următoarea semnificaŃie: flags . se va afişa un spaŃiu. #. caractere de spaŃiere: spaŃiu (' '). 3. La scriere. Pentru operaŃia de scriere se efectuează conversia inversă. FuncŃia scanf citeşte succesiv caractere din stdin pe care le interpretează prin compararea succesivă a caracterului citit cu informaŃia curentă din şirul format. care corespunde primei taste apăsate. până la apăsarea tastei Enter. întoarce caracterul afişat. se va completa câmpul cu spatii la stânga (implicit) sau la dreapta. OperaŃii de citire/scriere cu formatare. -. Pentru citirea (resp.poate fi unul dintre semnele: +.2. Dacă operaŃia reuşeşte. dar numai după apăsarea tastei Enter. La citire. spaŃiu: daca primul caracter nu e semnul . orice alt caracter Unicode. specificatori de format: şiruri precedate de caracterul '%' care descriu fiecare câmp aşteptat. funcŃia întoarce ultimul caracter. PrezenŃa unui caracter de tip II determină citirea fără memorare a secvenŃei până la întâlnirea unui caracter de tip I sau III. Pentru citirea datelor se utilizează funcŃia scanf cu prototipul: int scanf( const char * format [ . Şirul de caractere format poate conŃine în general: 1. Semnele au următoarea semnificaŃie: : aliniere la stânga a argumentului în cadrul câmpului. Caracterul este transformat în întreg fără semn. funcŃia întoarce valoarea 0. 0.

/= (atribuire cu împărŃire). e. expresia fiind scrisă prescurtat: <variabila> <operator>= <var _sau_const>. Există. * (înmulŃire). p (void *) . s (char *) . Operatorii aritmetici sunt: + (adunare). valoarea 1 fiind generată atunci când relaŃia este adevărată.întreg zecimal.numere în virgulă mobilă.(scădere). E. G (double ) . i (int *) . x. c (int ) . << (deplasare stânga). ! (NU logic). O combinaŃie corectă de operatori. %E si %f prec indică numărul de zecimale. care trebuie sa fie de tip int. o (int *) . type: este descriptorul propriu-zis. long . X (int ) . width.un caracter. && (SI logic).notaŃie zecimală fără semn. Cele mai importante specificaŃii de conversie sunt: d (int *) . şi un operator de decrementare (--): <variabila>--. operatorul ++ fiind numit operator de incrementare.descrie tipul de conversie.întreg hexa. e. Forma generală a unui descriptor pentru citire este: % [ *] [ width] [ lmod] type unde: * . prec: este un număr care specifica precizia de scriere. lmod . i (int ) .întreg octal. Operatorul de atribuire (=) permite crearea unei expresii de forma: <variabila> = <expresie> ce se evaluează de la dreapta la stânga. / (împărŃire). long sau unsigned long (l). octal sau hexa). Pentru realizarea atribuirii <variabila> = <variabila> <operator> <var _sau_const>. c (char *) .1. type . se poate utiliza forma prescurtată <variabila>++. != (diferit de).numărul în virgulă mobilă cu format exponenŃial. NotaŃia tip * înseamnă adresa unei locaŃii de tipul tip. s (char *) . -= (atribuire cu scădere). >= (mai mare sau egal). % . Pentru scrierea instrucŃiunii de atribuire <variabila> = <variabila> + 1.notaŃie zecimală cu semn.se tipăreşte argumentul ca adresă.4. Operatorii relaŃionali întâlniŃi în limbajul C sunt următorii: < (mai mic strict). p (void *) . pentru %g si %G prec indică numărul de cifre semnificative. Operatorul de atribuire. Există trei operatori logici: || (SAU logic . g. atunci se consideră că lăŃimea de scriere este dată de următorul argument din listă. limbajul C oferă o gamă foarte largă de operatori. int. Daca prec este *. iar întreaga construcŃie are valoarea variabilei după înscriere. se pot utiliza operatorii de atribuire combinaŃi: += (atribuire cu adunare). variabile. constante. Operatori la nivel de bit. . iar la descriptorii pentru întregi indică numărul minim de cifre. E (double ) . Operatori de atribuire combinaŃi.caractere. 0 (int ) .ca mai sus. f.şir de caractere terminat cu '\0' . f (double ) .suprimă atribuirea următorului câmp din stdin la următoarea variabila. >> (deplasare dreapta) şi ∼ (negare la nivel de bit). Trebuie evidenŃiat că operatorii aritmetici au prioritate faŃă de operatorii relaŃionali. short. Operatorii la nivel de bit se pot aplica operanzilor de tip întreg (char. 234 . u (unsigned int *) întreg zecimal fără semn.şir de caractere (se va încheia cu '\0 '). Operatori şi expresii Operatorii sunt simboluri care descriu operaŃii efectuate asupra unor variabile sau constante (numite generic operanzi).valoarea unei adrese aşa cum e tipărită de printf. *= (atribuire cu înmulŃire). Dacă width este caracterul *. Ori de câte ori relaŃia este falsă se generează valoarea 0. Se utilizează următoarele caractere: d. După evaluarea membrului drept. cu sau fără semn): & (SI logic la nivel de bit). Pentru scrierea expresilor booleene se utilizează operatorii logici şi operatorii relaŃionali.se tipăreşte %. x (int *) . lmod: este un specificator de lungime care corespunde unui argument short sau unsigned short (h).  (SAU logic la nivel de bit). respectiv long double (L).numărul în virgulă mobilă cu format standard. Ordinea operaŃiilor este cea binecunoscută. pentru %e. pentru %s prec indică numărul maxim de caractere ce se va scrie.completa la stânga cu zero. de asemenea.în loc de f.întreg oarecare (zecimal. > (mai mare strict). dar se pot utiliza paranteze pentru schimbarea ordinii operaŃiilor. apeluri de funcŃii reprezintă o expresie. În descrierea de mai sus. atunci lăŃimea este dată de următorul argument din listă (trebuie să fie neapărat un int). valoarea rezultata este înscrisa în <variabila>. Între paranteze se indica tipul argumentului supus operaŃiei de intrareieşire.3. == (egal cu). III. % (împărŃire modulo împărŃitor). Operatori logici şi relaŃionali. ^ (SAU exclusiv la nivel de bit). e. g (float *) .notaŃie în baza 16 fără semn cu abcdef pentru x şi ABCDEF pentru X. Operatori aritmetici. ce este echivalentul instrucŃiunii: <variabila> = <variabila> . u (int ) .SAU INCLUSIV).notaŃie în baza 16 fără semn. %= (atribuire cu împărŃire modulo). Pentru construcŃia expresiilor. <= (mai mic sau egal).

sunt constante de selecŃie. În limbajul C.] . InstrucŃiunea dintre do şi while se execută cel puŃin o dată şi se repetă cât timp <expresie> este compatibilă cu valoarea logică “adevărat”.. <expresie_2> este una corectă. O secvenŃă de instrucŃiuni încadrată de acolade este considerată ca o singură instrucŃiune şi este numită instrucŃiune compusă sau bloc.. în C. InstrucŃiunea break întrerupe lista de instrucŃiuni şi duce la încheierea instrucŃiunii switch . Asocierea operatorului virgulă se face de la stânga la dreapta. În mod implicit.. apel de procedură.. un pseudo-echivalent C a construcŃiei Pascal case . operatorul condiŃional (?:) şi instrucŃiunea switch. în caz contrar. cât şi instrucŃiuni. instrucŃiunea vidă.else: if (e1) e2. .) este un operator binar.. Dacă valoarea expresie nu apare în lista constantelor de selecŃie. iar timpul de viaŃă este limitat la timpul de executare a blocului. atunci întreaga expresie condiŃională are valoarea <expresie_1>. ce oferă un echivalent în C pentru următoarele instrucŃiuni Pascal: atribuire. InstrucŃiuni C Cea mai simplă instrucŃiune C este instrucŃiunea <expresie>. pentru aceeaşi secvenŃa de instrucŃiuni. scrise consecutiv. care leagă expresii oarecare.. Sintaxa instrucŃiunii switch este: <instructiune_switch> ::= switch ( <expresie>) { case <const_ 1> : <lista_ instrucŃiuni> [ break. declaraŃiile fiind poziŃionate la începutul blocului.e2.. AlŃi operatori: În această categorie includem operatorii specifici tipului referinŃă.. else e3. Programarea ciclurilor poate fi realizată folosind instrucŃiunile de ciclare: ciclul cu test iniŃial (instrucŃiunea while ).while este: do <instrucŃiune> while (<expresie>)..else . ConstrucŃia <expresie_ 1>... dacă există. Spre deosebire de instrucŃiunea compusă a limbajului Pascal. se poate utiliza instrucŃiunea switch . iar <lista _instructiuni> este o secvenŃă de instrucŃiuni C. În particular. dar se pot asocia mai multe etichete case . Operatorul condiŃional (?:) Operatorul condiŃional este o construcŃie decizională a limbajului C care are următoarea forma generală: <Expresie-booleana> ? <expresie_ 1> : <expresie _2>. <const _2>. Programarea unei structuri decizionale. e3. valoarea expresiei condiŃionale fiind valoarea <expresie_2>. [ default:] <lista_instructiuni> [ break .  if ( <Expresie>) <InstrucŃiune_ T> else <InstrucŃiune_ F> unde: <Expresie> are o valoare de tip scalar reprezentând o constructe de tip expresie. poate înlocui instrucŃiunea if. în ordinea în care apar. valoarea întregii construcŃii fiind dată de valoarea lui <expresie_2>. 235 .4. astfel încât o expresie de forma e1.. <const_1>.Operatorul virgulă.] } unde: <expresie> este o expresie cu valoare întreagă (tip întreg sau enumerare).e3 este echivalentă cu: (e1. convertibile la tipul expresiei <expresie>. III. Fiecare etichetă case indică o singură constantă. cu valori distincte..else este: <instructiune_if> ::= if ( <Expresie>) <InstrucŃiune _T>.while ) şi ciclul cu test iniŃial şi contor (instrucŃiunea for ). Atunci când o selecŃie multiplă este controlată de valoarea unei singure expresii. <instrucŃiune> poate fi chiar instrucŃiunea vidă.] case <const_2> : <lista _instrucŃiuni> [ break. constând din evaluarea celor două expresii. având următorul înŃeles: Dacă <Expresie-booleana> este adevărată. Sintaxa instrucŃiunii if. e2). precum şi operatorii introduşi de extensia C++. ciclul cu test final (instrucŃiunea do. poate fi realizată folosind: instrucŃiunea if. Forma instrucŃiunii while este: while (<expresie>) <instruc#iune>. <InstrucŃiune_ T> reprezintă o instrucŃiune C care se va executa când <Expresie> are o valoare nenulă (adevărat). identificatorii declaraŃi în blocul delimitat de acolade. virgula (. se execută instrucŃiunile asociate etichetei default .4. iar <InstrucŃiune_ F> reprezintă acea instrucŃiune C ce se va executa pentru valoare 0 (false) a lui <Expresie>. Conform celor de mai sus. instrucŃiunea compusă din limbajul C poate conŃine atât declaraŃii. au ca domeniu de vizibilitate blocul. construcŃia: e1 ? e2 : e3. operatorii pentru selectarea elementelor unui tip de date structurat. Sintaxa instrucŃiunii do.

Forma instrucŃiunii for este: for ( <expresie_1> . 2000. Arta programării calculatoarelor. Bucureşti.. Editura Teora. iar pentru instrucŃiunea for se va continua cu evaluarea. indiferent de valoarea condiŃiei de ciclare) şi continue (în cadrul blocului instrucŃiunilor de ciclare pentru a întrerupe execuŃia iteraŃiei curente). 2. Editura FundaŃia România de Mâine. Editura FundaŃiei România de Mâine. 5. 2000. Knuth D. 236 . Culegere de probleme de algoritmică şi programare.} Cele trei expresii dintre paranteze pot fi toate vide. Algoritmică şi programare. 6. Albeanu G. Întreruperea necondiŃionată a unei secvenŃe de instrucŃiuni şi continuarea dintr-un alt punct al programului este posibilă prin utilizarea instrucŃiunilor de salt: goto (salt la o instrucŃiune etichetată).. <expresie_2>.. Editura FundaŃiei România de Mâine. expresiilor <expresie_3>. Albeanu G. vol... Algoritmi si limbaje de programare. <expresie_3> .. Bârză S. oferă cea mai compactă metodă pentru scrierea ciclurilor cu test iniŃial şi are o definiŃie care îi extinde domeniul de aplicare faŃă de alte limbaje de programare. 7. Algoritmica şi programare în Pascal. Bucureşti. Editura ŞtiinŃifică şi Enciclopedică. Analiza şi sinteza algoritmilor. Programare statică.. I. 2001. caz în care avem de-a face cu un ciclu infinit. 1974.. instrucŃiunea continue determină activarea testului condiŃiei de ciclare. În această ordine. 4. Note de curs. vol I. Tehnici de programare. break (în contextul instrucŃiunii switch cât şi în instrucŃiunile de ciclare pentru a determina ieşirea forŃată din ciclu. I. Bârză S.while. Lucrări practice de programarea calculatoarelor. Algoritmi fundamentali. Georgescu H.. Editura UniversităŃii Bucureşti. BIBLIOGRAFIE 1.InstrucŃiunea for. while (<expresie_2>) { <instrucŃiune> <expresie_3>. <expresie_3> ) <instrucŃiune> şi are efectul similar cu al secvenŃei: <expresie_1>. În cazul instrucŃiunilor while şi do. vol. 2003. Luminita Radu. Programare statică. 2001. Albeanu G. 2001. Editura UniversităŃii Bucureşti. 3. Livovschi L.

Sign up to vote on this title
UsefulNot useful