turbo pascal algoritmi si limbaje de programare

Download Turbo Pascal Algoritmi Si Limbaje de Programare

If you can't read please download the document

Upload: buzoianu-stefan

Post on 26-Sep-2015

138 views

Category:

Documents


18 download

DESCRIPTION

Pascal

TRANSCRIPT

Turbo Pascal - Algoritmi si limbaje de programarelr!formatica pentru clasale IX""'XUManual pentru clasa a IX-aTeoraConceput in conformitate cu programa colara in vigoare, pentru disciplinele Algoritmii limbaje de programare i Aplicatii practicede laborator - clasa a IX-a, profil informatica - manualul este rezultatul indelungatei experiente didactice a autorului.Fiecare capitol este insotit de un set de probleme propuse, prezentatein functie de complexitatea lor. Elevilor li se'ofera acum posibilitatea de a acoperi dintr-osingura sursa, atat programa cat i aplicatii din afara ei, pentru care exista un interesdovedit: unitati de program, programare pe'obiecte, crearea meni urilor, format areaecranelor, validarea datelor de intrare, reprezentari grafice de functii i suprafete, salvarea imaginilor etc.TudorSorinTU BO PfiSCfiLAlgoritmi i limbajv dv programarczManual pvntru clasa a IX-aTeoraAcopera programa cursurilor de algoritmi, limbaje de programare i lucrari practice de laborator.Nu a facut obiectul unei avizari a Ministerului lnvatamantului i tiinteiTeoraCP 79-30, cod 72450 Bucure ti, RomaniaTel.: 619.30.04Fax: 210.38.28Distributie8-dul AI. I. Cuza nr. 39Tel.: 222.45.33Fax: 222.45.33Teora - Cartea prin po taCP 79-30, cod 72450 Bucure ti, RomaniaTel.: 635.14.41Copyright 1995 TeoraPrima editie 1995Retiparita: octombrie 1995Reproducerea integrala sau partiala a textului sau a ilustratiilor din aceasta carte este posibila numai cu acordul prealabil scris al editurii Teora.Coperta: Valentin TanaseISBN: 973-601-212-3.Tipar executat Ia ROMFEL S.R.L. Bucure ti, str. Lizeanu nr. 35 A, sect. 2Tlparlt Ia ROMFE:L S.R.LStr. Llzeanu nr. 35A, sector 2Cuprins1. Notiunea de algoritm, caracteristici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.1. Obiectele cu care lucreaza algoritmii: date, variabile, expresii,operatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.1. Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.2. Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.3. Expresii .................................. 121.1.3.1. Expresii intregi . . . . . . . . . . . . . . . . . . . . . . . 121.1.3.2. Expresii reale ........................ 121.1.3.3. Expresii logice ...................... 131.1.3.4. Expresii de tip !?ir de caractere . . . . . . . . . . . . 131.1.4. Operatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.1.4.1. Operatii de intrare-ie!?ire . . . . . . . . . . . . . . . . 131.1.4.2. Operatii de decizie . . . . . . . . . . . . . . . . . . . . 141.1.4.3. Operatii de atribuire ................... 142. Principiile programarii structurate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1. Structuri de baza. Descrierea acestora cu ajutorul schemelor logice 152.1.1. Operatii de intrare-ie!?ire . . . . . . . . . . . . . . . . . . . . . . . 152.1.2. Operatii de atribuire .......................... 162.1.3. Operatii de decizie ........................... 162.1.4. Reguli de detaliere a unei operatii complexe . . . . . . . . . . 182.1.5. Structura alternativa......................... 182.1.6. Structura repetitiva .......................... 192.2. Structuri de baza. Descrierea acestora cu ajutorul unui limbaj de tip pseudocod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.2.1. Prezentarea lirtlbajului ......................... 222.2.1.1. Variabile ........................... 222.2.1.2. lnstructiuni ......................... 232.3. Aplicatii ......................................... 273. Elemente de baza ale limbajului Pascal ........................... 463.1. Notiuni introductive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.1.1. Evolutia limbajelor de programare ................. 463.1.2. Structura programelor Pascal .................... 473.1.3. Descrierea sintaxei cu ajutorul diagramelor de sintaxa ... 483.2. Vocabularul limbajului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.2.1. Setul de caractere ........................... 503.2.2. ldentificatori ............................... 503.2.3. Separatori l;ii comentarii....................... 513.3. Constanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513.3.1. Constanta intregi ............................ 513.3.2. Constanta reale ... .......................... 523.3.3. Constanta !?ir de caractere ..................... 523.3.4. Constanta simbolice .......................... 533.4. Notiunea de tip de data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.4.1. Tipuri simple standard . . . . . . . . . . . . . . . . . . . . . . . . 543.4.1.1. Tipul boolean ........................ 543.4.1.2. Tipul char .......................... 543.4.1.3. Tipuri intregi ........................ 543.4.1.4. Tipuri reale . . . . . . . . . . . . . . . . . . . . . . . . . 563.4.2. Tipuri ordinale definite de utilizator ................ 573.4.2.1.Tipul enumerat ....................... 573.4.2.2. Tipul subdomeniu ..................... 583.4.3. Definirea tipurilor ........................... 583..5. Declararea variabilelor .......................... ..... 583.6. Definirea constantelor ............................... 603.7. Expresii ......................................... 603.8. Citirea i scrierea datelor............................. 603.8.1. Citirea datelor .............................. 613.8.2. Scrierea datelor ............................. 614. lnstructiunile limbajului Turbo Pascal ............................ 624.1. lnstructiunea de atribuire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634.2. lnstruqiunea IF .................................... 644.2.1. IF THEN ELSE .............................. 644.2.2. Forma IF THEN ............................. 654.3. lnstruqiunea compusa ............................... 664.4. lnstructiunea vida .................................. 674.5. lnstructiunea CASE ................................. 674.6. lnstructiunea WHILE ................................ 684.7. lnstructiunea REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.8. lnstructiunea FOR .................................. 714.9. Aplicatii Ia capitolele 3 i 4 ............................ 765. Tipuri structurate de date .................................... 815.1. Tipul tablou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.1.1. Tipul ARRAY .................. : ........... 815.1.2. Tipul. STRING .............................. 905.1.2.1. Functia COPY ....................... 945.1.2.2. Funqia POS ........................ 955.1.2.3. Procedura DELETE .................... 965.1.2.4. Procedura INSERT .................... 965.1.2.5. Procedura STR ...................... 975.1.2.6. Procedura VAL ...................... 985.2. Tipullnregistrare (RECORD) ........................... 985.2.1. Tipullnregistrare fixa ......................... 985.2.2. Tipullnregistrare cu variante ................... 1045.3. Tipul de date multime .............................. 1065.3.1. Constructori de tip multime .................... 1075.3.2. Operatori ......\ .......................... 1085.3.3. Constante .......... : . .................... 1085.3.4. Constante de tip multime ..................... 1105.4. Aplicatii Ia capitolul 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.4.1. Tipul ARRAY ............................. 1115.4.2. Tipul STRING ............................. 1185.4.3. Tipul RECORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185.4.4. Tipul multime . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 1196. Subprograme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 226. 1. Conceptul de subprogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226.2. Domeniul de vizibilitate a identificatorilor ................. 1226.3. Proceduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1236.3.1. Declarare i apel ........................... 1236.3.2. Parametri formali, parametri efectivi ............. 1296.3.2.1. Transmiterea parametrilor prin referinta . . . . . 1306.3.2.2. Transmiterea parametrilor prin valoare . . . . . . 1306.4. Functii (declarare !?i apel) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336.4.1. Tipul funqiei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1346.5. Dezvoltare ascendenta, dezvoltare descendenta . . . . . . . . . . . . . 1356.5. 1. Dezvoltarea ascendenta . . . . . . . . . . . . . . . . . . . . . . 1356.5.2. Dezvoltarea descendenta . . . . . . . . . . . . . . . . . . . . . 1366.6. Unitati de program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1366.6.1. Forma generala !?i constructia unei unitati de program . . 1366. 7. Proceduri !?i functii predefinite . . . . . . . . . . . . . . . . . . . . . . . . 1396.8. Parametri formali de tip procedura sau functie . . . . . . . . . . . . . 1406.8.1. Tipul de date procedural . . . . . . . . . . . . . . . . . . . . . . 1406.9. Programarea pe obiecte .............................. 1436.9.1. Logica !?i mecanismul programarii pe obiecte . . . . . . . . 1436.9.2. Mecanismul de realizare a programarii pe obiecte . . . . . 1446.9.2.1. Sintaxa tipului obiect !?i incapsularea . . . . . . . 1446.9.2.2. Mo tenirea . . . . . . . . . . . . . . . . . . . . . . . . 1476.9.2.3. Atribuirea in cazul variabilelor obiect ....... 1486.9.2.4. Proceduri cu parametri formali de tip obiect . . 1496.9.2.5. Polimorfism . . . . . . . . . . . . . . . . . . . . . . . . 1506.1 0. Aplicatii Ia capitolul 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 546.1 0.1. Proceduri, funqii, unitati de program, obiecte . . . . . . 1547. Unitatea de program CRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1597.1. Memoria video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1597.2. Ferestre .......................... '" ............ 1617.3. Alte proceduri !?i functii specifice unitatii CRT . . . . . . . . . . . . . . 1647.4. Aplicatii ........................... . . . . . . . . . . . . . 16 77 .4.1. Unitatea de program UTIL . . . . . . . . . . . . . . . . . . . . . 1677.4.1.1. Procedura DESCHID F ................ 1677.4.1.2. Procedura SCRIU F-.................. 1677.4.1.3. Procedura A D SARA . . . . . . . . . . . . . . . . . 1687.4.1.4. Procedura P[IMS SARA V ............. 1697.4.1.5. Procedura PLIMS-SARA-0 ............. 1707.4.1.6. Procedura CURSOR .. -:- ............... 1707.4.2. Fereastra obiect . . . . . . . . . . . . . . . . . . . . . . . . . . . 1747.4.2.1. Metoda DESCHID ................... 1747.4.2.2. Metoda SALVEZ .................... 1757.4.2.3. Metoda RESTAUREZ ................. 1757.4.3. Meniul obiect ............................. 1777 .5. Aplicatii Ia capitolul 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1827 .5.1. ,Aplicatii ale unitatii de program CRT . . . . . . . . . . . . . . 1828. Fi!?iere Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1878.1. Fi iere text .................. \ . . . . . . . . . . . . . . . . . . 1878.1.1. Crearea !?i exploatarea fi!?ierelor text . . . . . . . . . . . . . . 1888.1.3. Citirea variabilelor de tip string . . . . . . . . . . . . . . . . .1928.1.4. Citirea variabilelor de tip numeric . . . . . . . . . . . . . . . .1928.1. 5. Scrierea cu format implicit . . . . . . . . . . . . . . . . . . . .1938.1.6. Scrierea cu format explicit . . . . . . . . . . . . . . . . . . . .1938.1.6.1. Scrierea datelor de tip intreg . . . . . . . . . . . .1938.1.6.2. Scrierea datelor de tip real . . . . . . . . . . . . . .1948.1.6.3. Scrierea datelor de tip caracter . . . . . . . . . . .1948.1.6.4. Scrierea datelor de tip string . . . . . . . . . . . .1948.1.6.5. Scrierea datelor de tip boolean . . . . . . . . . . .1948.1.7. Alte proceduri !?i functii care lucreaza cu fi!?iere text . . .1958.1.2. Citirea variabilelor de tip char .................. 1918.1.7.1. Procedura APPEND .................. 1958. 1. 7.1. Functia EOLN . . . . . . . . . . . . . . . . . . . . . .1958.1.8. Fi iere text standard . . . . . . . . . . . . . . . . . . . . . . . .1968.1.8.1. Fi ierele INPUT !?i OUTPUT . . . . . . . . . . . . .1968.1.8.2. Fi!?ierul PAN . . . . . . . . . . . . . . . . . . . . . . .1968.2. Validarea operatiilor de intrare I ie!?ire . . . . . . . . . . . . . . . . . . . .1968.2.1. Alte tipuri de validari . . . . . . . . . . . . . . . . . . . . . . . .1988.2.1.1. Validarea naturii datelor . . . . . . . . . . . . . . .1988.2.1.2. Testarea naturii numerice a datelor ........1998.2.1.3. Testarea naturii alfabetice a datelor . . . . . . .1998.3. Fi!?iere cu tip ..................................... 2008.3.1. Crearea fi!?ierelor cu tip ....................... 2018.3.2. Procedura SEEK !?i functia FILESIZE .............. 2048.3.3. Adaugarea de articole ........................ 2058.4. Un exemplu de lucru cu un fi!?ier ....................... 2108.5. Fi!?iere fara tip .................................... 2238.6. Aplicatii Ia capitolul 8 .............................. 2258.6.1. Aplicatii ale fi!?ierelor........................ 2258.6.1.1. Fi!?iere text . . . . . . . . . . . . . . . . . . . . . . . . 2258.6.1.2. Fi!?iere cu tip ....................... 2268.6.1.3. Fi!?iere fara tip ...................... 2289. Unitatea de program DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2309.1. Prelucrarea datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2309.2. Cautarea unui fi!?ier ................................ 2319.3. Executia unui program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2319.4. Probleme propuse ........................ ........ 23410. Grafica pe calculator ..................................... 23510.1. lntroducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23510.2. lnitializarea modului grafic .......................... 23510.3. Culori ........................................ 23710.4. Coordonate ecran !?i reprezentarea punctelor .............. 24210.5. Punct curent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24310.6. Trasarea segmentelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24310.7. Raportul aspect .................................. 24410.8. Desenarea obiectelor grafice . . . . . . . . . . . . . . . . . . . . . . . . . 24510.8.1. Desenarea unei linii frante .................... 24510.8.2: Desenarea cercurilor, arcelor de cere !?ide elipsa .... 24610.8.3. Desenarea unor obiecte ha!?urate ............... 24710.9. Afi!?area textelor ................. : ............... 2501O.lO. Tehnici de animatie .............................. 25410.11. Fi!?iere imagine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26010.12. Ferestre grafice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26210.13. Elemente de grafica 20 ........................... 26510.13.1. Desenarea graficului unei functii . . . . . . . . . . . . . . 26510.13.2. Desenarea curbelor plane ................... 27110.13.3. Rotatii ....... : ................ . . . . . . . . 27510.13.4. Curbe BSPLINE .......................... 27710.14. Elemente de grafica 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . 27810.14.1. Rotatia unei figuri In spatiu . . . . . . . . . . . . . . . . . . 28510.14.2. Reprezentarea unei suprafete in spatiu .......... 28710.14.3. Coordonatele sferice !?i aplicatiile lor ............ 29110.14.4. Prezentarea integrala a unitatii UTILG . . . . . . . . . . . 29510.15. Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297ANEXA Utilizarea meniurilor In limbajul TURBO PASCAL . . . . . . . . . . 299Capitolul 1Notiunea de algoritm, caracteristiciSa presupunem ca dispunem de un 'calculator electronic de buzunar, fara program. Se cere sa se calculeze vaiorile funqiei de rnai jos, definita pe rnul!imea numerelor reale, pentru 10 valori date ale lui x (-3.1, 7, 0, 2.23, .a.m.d.).I X *X-2, X0Ce avem de facut? Consideram prima valoare a lui x, i anume -3.1. Obser vam ca aceasta valoare este mai midi dedit 0. Avem de calculat X*X-3. Pen tru a face acest calculll introducem pe x, II ridicam ia puterea a cioua (am pre supus ca acest calculator poate efectua direct ridicarea Ia puterea a doua), din rezultat scadem 2 !?i obtinem rezultatul dorit. Repetam caiculul pentru urmatoa rele 9 valori. Sa nu uitam faptui ca pentru fiecare valoare a !ui x, noi trebuie sa decidem care din cele trei variante de calcul va fi aleasa. Sa recunoa!?tem ca o astfel de modalitate de lucru este plicticoasa i cere mult timp. Trebu!e gasit un mod de lucru eficient. Care este acesta? Raspunsul Ia lntrebare constituie subiectul actualului capitol.Presupunem ca dispunem de un calculator programabil. Trebuie sa respectam urmatoarele etape de lucru: elaborarea unui algoritrn d9 rezo:vae a problernei; transpunerea flCestuia lntr-un lirnbaj de programa;e,: rularea programului i ob!inerea rezuitatelor.Ce este un algoritm i cum se elaboreaza?In primul rand, trebu1e sa ne fie toart8 clar de !a ce pornim i ce avem de facut. Cunoa!?tem funqiai 10 valori ale lui x. Trebuie calcuiata valoarea func!iei pentru fiecare din cele 10 valori. Sarcina noastra poate fi sistematizata astfel:1- se parcurg urmatoarele etape, de zece ori : se cite te valoarea lui x; Tn functie de valoarea propriu-zisa a lui x, se procedeaza astfel: daca este negativa, se calculeaza f=x*x-2; daca este 0, valoarea tunctiei este 3; daca este pozitiva, se caiculeaza f = x + 2; se scrie valoarea calculata pentru f.Aceasta sinteza a ceea ce avem de facut se r,ume;;te algoritmul de rezoivare a problemei propuse.Notiuhea de algoritm este primara, nu se define te, intocmai ca i no iunea de multime.Tn matematica. Cu toate acestea, ca i multimea, algoritmul poatefi descris. In esen a, este vorba de o succesiune de etape care se pot aplicamecanic pentru rezolvarea unei clase de probleme (pornind de Ia datele ini iale sa conduca Ia solutie).fn exemplul ante.rior, algoritmul poate fi aplicat pentru oricare 10 valori ale lui x i nu numai pentru cele 10 date ini ial. Daca vom considera ca pentru fiecare 10 valori avem o problema, Tnseamna ca algoritmul nostru este capabil sa rezolve o infinita.te de probleme.Pentru redactarea algoritmi!or se folosesc schemele logice i limbajele de tip pseudocod. Despre acestea vom discuta In capitolul urmator.Un algoritm bun trebuie sa satisfaca urmatoare!e cerinte: claritate, generalitate 9i finititudine.Claritatea este acea proprietate a algoritmului prin care procesul de calcul este descris precis, tara ambiguita i.Generalitatea este proprietatea algoritmului de a rezolva o lntreaga clasa de probleme.Revenind Ia problema prezentata Ia Tnceputul acestui capitol, se observa ca algoritmul poate fi u9or modificat pentru a calcula valoarea func iei lntr-un numar oarecare de puncte 9i nu numai In cele 1 0 presupuse initial. Mai general, se poate obtine un algoritm care sa primeasca drept date de intrare atat nu'lla rul de puncte cu valorile lor, cat 9i functia ale carei valori trebuie calculate.Finititudinea este proprietatea algoritmilor de a furniza rezultate Tntr-un timp finit. Referitor Ia aceasta ultima proprietate, se impun anumite precizari. Exista probleme pentru care nu se cunosc algoritmi de rezolvare rapizi. Pentru anumite seturi de date de intrare, este necesar un timp de calcul de ordinul sutelor sauchiar miilor de ani i aceasta pe calculatoare ultramoderne. Din acest motiv, In practica se considera ca pentru aceste probleme nu exista algoritmi de rezolvare,chiar daca timpul de lucru este finit.Observatii:1. Nu exista un algoritm cu ajutorul caruia sa putem elabora oricare alt algoritm. Acest fapt ne arata ca activitatea de e!aborare a algoritmilor nu este u9oara. Ea presupune multa munca i fantezie.2. 0 problema poate avea mai multi algoritmi de rezolvare. Unii dintre ei conduc mai rapid Ia rezultat. Este sarcina noastra sa cautam un algoritm caresa rezolve rapid problema. Aceasta lnseamna ca, atunci cand avem de elaborat un algoritm, nu ne vom opri Ia prima solutie gasita.Odata scris, un algoritm este codificat Tntr-un limbaj de programare co.nvena bil ales i astfel se obtine programul. Acesta se ruleaza ori de cate ori este necesar. Exista multe limbaje de programare, ca de exemplu FORTRAN, COBOL, C, PASCAL.in acest manual vom studia limbajul PASCAL.1.1. Obiectele cu care lucreaza algoritmli: date, variabile,expresiL op;::ra ii1.1.1. DateA9a cum am vazut, orice aigoritm porne9te.de Ia anurnite date de intrare, ie prelucreaza, iar In final obtine date de ie9ire. In exemplu! prezentat, datele de intrare sunt reprezentate de cele 10 valori ale lui x, iar date!e de ie ire sunt cele10 valori ale lui f(x).Datele pot fi clasificate dupa tipul lor: lntregi; reale; logice; 9ir de caractere.Datele din primele doua tipuri poarta nume!e de date numerice.Datele intregi sunt n mere apar1inand mul!irr.ii numereior In tragi.Dupa cum 9tim din matematica, mu!timea numerelor reale este o reuniune Tntre multimea numerelor rationale i mul imea numere!or ira1ionale. Nici un calculator din lume nu poate retine un numar irational, Tntrucat acesta are o infinitate de zecimale. Din acest motiv, In informatica, printr-o data rea!a Tntelegem un numar cu zecimale. La o astfel de data, In loc de virgula se fo!ose te punctul.Exemplu: In loc de 3,25 se scrie 3.25.0 data logica poate avea numai doua vaiori: TRUE (adevarat) sau FALSE (fals). Dupa cum indica 9i nume!e, o dati:i de tip ir de caractere !nseamna un ir decaractere cuprinse lntre doua semne apostrof.Exemplu: 'un text'.Aici este momentul sa vorlJim de o categorie aparte de date 9i anume constantele. Acestea pot fi date de oricare dintre tipurile precizate. Eie se caracterizeaza prin faptul ca sunt con inute In algoritm, fara a fi citite sau obtinute din calcule.Se folosesc Tn calculele care se fac sau sunt mesaje care trebuie sa apara Iafiecare rulare a programului rezultat In urma algoritmu!ui.1.1.2. VariabileIn problema analizata avt3am de citit 10 valori de intrare. fn maternatica acestea ar fi fost notate x 1, x2,...,x 1 0. fn prelucrare, pentru orice data de intrare de acest tip se fac aceiea9i operatii. Este lipsit de sens sa explicam ce facem cu x'l pentruca apoi sa explicam ce facem cu x2 etc. Din aces1 motiv, In algoritm se explica ce se face cu un snume x, oricare ar fi el dintre cele -, 0. De asemenea, nu are rost sa precizam ca se tipare9te f(x1) a poi f(x2) $.a.m.d. Se noteaza pur $i simplu case tipare te f. Pentru algoritmul nostru, x if sunt variabile. Orice aigoritm lucreaza cu varia bile. Cu toate ca o variabila ai e un nume unic, con inutui ei poate fi diferitde Ia un moment Ia aitt.il Lh ,:: rcursul executiei programului. De aici provine i denumirea de variabiUL D2daci'L l:l mod abstract, este posibil sa notam o intrarecu x i o ie ire cu f, curn este posibil sa folosim aceasta abstractizare in momentulin care algoritmul este transpus lntr-un limbaj de programare obtinandu-se unprogram ce urmeaza a fi rulat pe calculator? Practic, in memoria calculatorului se rezerva pentru fiecare variabila dite un spatiu de memorie. Aceasta inseamna caam rezervat un singur spariu pentru X i un singur spatiu oentru f. Tntr-un astfel de spatiu se poate retine Ia un moment de timp o singura valoare. Tipurile de variabile coincid cu tipurile de date. Estf! normal sa fie aa intrucat intr-o variabila se poate re ine numai un anurnit tip de date. In concluzie, printro variabiia intelegem un ansamblu de patru elemente: numele variabilei; tipul ei; valoarea ei Ia un moment dat; locul in memoria ca!culatorului unde poate fi gasita variabila (adresa ei).1.1.3. ExpresiiCu ajutorui constantelor, variabilelor i operatorilor se pot construi diversexpresii. Acestea se scriu dupa reguli precis determinate, dar (in general),:ceste reguli sunt preluate din matematica. In scrierea expresiilor este permisa fo!osirea para ntezeior.Ca i variabilele, expresiile sunt Je mai multe tipuri: intregi; reale; logice; de tip ir de caractere.1.1.3.1. Expresii lntregi,/Folosesc operatorii +, -, ' (pentru inmul ire), DIV (pentru catul Tmpartiriiintre"i), MOD (pentru restrlllnrar irii intregi) .a.Rezultatul evaluarii !or este un n'-lrnar intreg.Exemp!e:3 x + 7, unde x este o vari:Jbiia htreaga;a .. (b +c), unde a,b,c sunt var,abi!e 1ntreg1.1.1.3.2. Expresii realeOperanzii care le a!ci:lt ,iesc slmt constante $i variabiie Tntregi sau reale. Pe lana operatorii utilizai In c2drul expresiilor Tntregi putem utiliza i altii ca ar fide exemplu I (pentru lmpar irea cu zecimale). Rezultatu1 evaiuarii lor estelntotdeauna un numar rea!.1.1.3.3. Expresii logiceRezultatul lor poate avea numai doua valori: TRUE sau FALSE.Operatorii sunt cei din logica matematica: OR, AND, NOT. De asemenea este permis sa folosim i operatorii , >= (mai mare sau egal), =b)AND(cb.in urma executiei acestei secvente, c va avea valoarea FALSE.3. lnstructiunea STOPAre rolul de a marca sfarl;iitul unui program.4. lnstructiuni de decizieAceste instructiuni se Impart Tn doua categorii: instructiuni de ramificare; instructiuni repetitive.a. lnstructiunea de ramificareCorespunde structurii alternative de Ia scheme logice. Forma ei aste urmatoarea:IF conditie THEN sl[ELSE s2]ENDIFAici, s 1, s2 reprezinta secvente de alte instructiuni.Ceea ce este Tncadrat Tntre paranteze drepte este optional.Principiul de funqionare al acestei instruqiuni (Tn cazul formei complete)este urmatorul: se evalueaza conditia;o daca aceasta este Tndeplinita se executa secventa s 1;o Tn caz contrar se executa secventa s2. se trece Ia instructiunea urmatoare.in cazul Tn care clauza ELSE lipse!?te, principiul de funqionare este: se evalueaza conditia; ,. daca aceasta este Tndeplinita, se executa secventa de instruqiuni s 1; Tn caz contrar, se trece mai departe.Exemplu de program:Se citesc doua variabile Tntregi. Sa se tipareasca cea mai mare dintre ele.INTEGER a,b;READ a, bIF a>bTHEN WRITE aELSE WRITE bEND IFSTOP.b. lnstructiunea repetitiva (WHILE) Forma generala este:WHILE expresie logica sREPEAT.s reprezinta o secvena de instruc iuni. Principiul de func ionare este urmatorul: se evalueaza expresia logica; daca aceasta are valoarea FALSE se trece Ia instruc iunea urmatoare; daca valoarea ei este TRUE, se executa secvena s dupa care se pornel?te din nou cu evaluarea expresiei logice.Procedeul continua pana cand, Ia evaluare, expresia logica are valoareaFALSE. Aceasta instruqiune corespunde Tn limbajul schemelor logice structurii repetitive condi ionate anterior.Sa se scrie un program care calculeaza suma primelor n numere naturale(se presupune ca nu se cunoal?te formula directa).INTEGER n,i,s; READ ns:=o i:=lWHILE inWRITE sSTOPISa vedem cum decurge algoritmul dupa citirea lui n (citim 3): i ia valoarea 1 iar s ia valoarea 0; s ia valoarea 0 + 1 = 1 iar i ia vaJoarea 2; i nu este mai mare decat 2, deci s va lua valoarea 1 + 2 = 3 iar i va luavaloarea 3; i nu este mai mare ca 3 deci s va lua valoarea 3 + 3 = 6 iar i va lua valoareaI 4; i este mai mare decat n deci se trece Ia instruqiunea urmatoare unde se tipare:;;te valoarea 6.6. lnstructiunea repetitiva FORForma gener?la a as;estei instruc iuni este urmatoarea:FOR variabila de ciclare:= valoare ini iala, valoare finalasREPEATVariabila de ciclare trebuie sa fie de tipuiiNTEGER. Valoare ini iala, valoare finala sunt expresii aritmetice de tipul INTEGER.Principiul de funqionare este urmatorul: variabilei de ciclare i se atribuie valoarea initiala; se executa secvena s; variabilei de ciclare i se adauga 1; daca 'nu s-a depal?it valoarea finala se executa secvena s; procedeul continua pana cand variabila de ciclare depa:;;e:;;te valoarea finala.In situatia in care, de Ia bun ir)t:eput valoarea initiala depal?e te valoareafinala, se trece Ia instructiunea urmatoare.Reluam problema referitoare Ia calculul sumei primelor n numere naturale:) .!NTEGER n,s,i; READ ns:=oFOR i:=l,ns:=s+i REPEAT WRITE s STOP.Algoritmul decurge astfel: se cite9te n ( presupunem n = 3); s ia valoarea 0, iar i valoarea 1; se calculeaza s = 0 + 1 = 1; i ia valoarea 2; se calculeaza s = 1 + 2 = 3; i ia valoarea 3; se calculeaza s = 3 + 3 = 6; i ia valoarea 4 l?i Tn acest fel se depa:;;el?te valoarea lui n; se trece Ia instruc iunea urmatoare unde se tipare:;;te valoarea 6.2.3. Aplicatiiin acest paragraf se prezinta cateva probleme rezolvate. Algoritmul propus pentru ele este prezentat atat sub forma de schema logica cat :;;i 'fn limbaj pseudocod.Problema 1Se citesc doua variabile de tip intreg, A :;;i B. Sa se interschimbe con inutul celor doua variabile :;;i sa se tipareasca.La prima vedere, am fi tentati sa scriem secventa urmatoare:INTEGER a,b; READ a,ba: =bb: =aWRITE a,bSTOP.Aceasta secventa este gre:;;ita. Atunci cand variabilei a i se atribuie valoarea variabilei b, con inutul variabilei a se pierde. Sa presupunem ca am citit a= 3 l?i b=4.Prin atribuirea a:= b, con inutul lui a va fi 4 iar al lui b va fi tot 4: Prinatribuirea b: =a continutul celor doua variabile va fi acela:;;i. Din acest motiv,in urma executiei acestui algoritm se va tipari 4 :;;i 4. Pentru a Iuera corect, trebuie considerata o variabila intermediara c de acelal?i tip ca a :;;i b. Secventa corecta este urmatoarea:c:=a a: =b b: =cin acest mod, continutul variabilei a se salveaza 'fn c (deci nu se pierde Ia a doua atribuire). Pentru valorile 3l?i 4 presupuse ca citite pentru a :;;i b vom avea In ordine: lui c i se atribuie valoarea 3; lui a i se atribuie valoarea 4; lui b i se atribuie valoarea 3.Prezentam mai jos algoritmul sub forma de schema logica l?i pseudocod.Figura 2.3.1.INTEGER a,b,c; READ a,bc:=a a: =b b: =cWRITE a,bSTOP.in anumite cazuri se poate evita folosirea unei variabile intermediare. Sa con sideram algoritmul urmator realizat Tn pseudocod. Acesta rezolva aceea i problema.INTEGER a,b; READ a,ba: =a+bb: =a-b a: =a-b WRITE a,bSTOP.Pentru valorile citite ale lui a l?i b algoritmul functioneaza astfel: lui a i se atribuie valoarea 3 +4 = 7; lui b i se atribuie valoarea 7-4 = 3; lui a i se atribuie valoarea 7-3 = 4; se tipare te a= 4 l?i b = 3 (rezultat corect).Problema 2Sa se elaboreze algoritmul pentru rezolvarea unei ecuatii de gradul 1 .Forma generala a ecuatiei de gr_?dul 1 este a* x + b = 0. In matematica se presupune ca a este diferit de 0. In programare acest lucru nu este posibil intrucat, din gre:;;eala, eel care il introduce pea ii poate da acestuia valoarea 0. Din acest motiv se va lua in discutie si acest caz. Din analiza problemei rezulta ca a poate avea valoarea 0 sau vaiori.diferite de 0. In cazul in care a este diferit de 0 se calculeaza solutia x: = -b/a. Daca a este 0, trebuie sa vedem cum este b: Daca i b este 0, inseamna ca orice numar real verifica ecuatia, in caz contrar ecuatia nu are solutie.Trebuie sa citim variabilele a :;;i b, sa le prelucram dand solutia sau mesajele corespunzatoare. 0 prima schema logica ar arata astfel:Figura 2.3.2.Analizam ce avem de facut in operatia PREL. Vom proceda in mod diferit pentru cazurile a = 0 i pentru a diferit de 0. Daca a este diferit de 0, putem calcula x i sa-l tiparim. Cazul in care a= 0 nu-l analizam pe moment. Schemadevine:Figura 2.3.3.Analizam PREL1. Acum 9tim ca a este 0. Procedam diferit 'in funqie de valorile lui b. Daca b este 0, avem o infinitate de solutii, in caz contrar nu avem nici una. Rezulta schema finala:Figura 2.3.4.in pseudocod, algoritmul arata astfel:REAL a,b,x; READ a,bIF aO THENx: =-b/aWRITE xELSEIF b=O THEN WRITE 'infinitate de solutii'ELSE WRITE nu avem solutiiENDIF ENDIF STOP.Problema 3Se dau trei numere reale a, b, c.Sa se calculeze valoarea expresiei:Ia b, daca c>Oe = 1ab, daca C=Oa-b, daca cO THENe:=a+bELSE IF c=O THEN e:=a*bELSE e: =a-bENDIF ENDIFWRITE eSTOP.Problema 4Se citesc trei numere intregi a, b, c. Sa se tipareasca in ordine crescatoare. ldeea de lucru este urmatoarea: se compara primele doua (a !?i b); dupa ce se cunoaste ordinea intre acestea, se incearca plasarea lui c fata de ele. in prima forma, schema logica arata astfel:.STOPFigura 2.3.7.Daca a este mai mic decat b trebuie vazut unde il plasam pe c. El poate fi mai mic decat a, deci ordinea ar fi c, a, b, sau mai mare sau egal cu a. In acest din urma caz, c trebuie comparat cu b. Daca el este mai mic decat b, ordinea este a, c, b, in caz contrar - este a, b, c. Tot asa se rationeaza In situatia in care a nu este mai mic decat b (este mai mare. sau egal). Tn final se obtine schema logica din figura 2.3.8. Tn pseudocod, algoritmul arata astfel:INTEGER a,b,c; READ a,b,cIF a daca fm este diferit de 0 (deci i a fost gasit divizor allui n) se tiparesc i $i fm;:) se aduna 1 Ia i (se incrementeaza).Sa presupunem ca am citit n = 12. Algoritmul dec urge astfel:o se initializeaza i cu 2; se initializeaza fm cu 0; lntrucat 2 divide pe 1 2, fm va lua valoarea 1 iar n valoarea 6; lntrucat 2 divide pe 6, fm va lua valoarea 2 i n valoarea 3;NUNUNUFigura 2.3.15. 2 nu divide pe trei, deci se trece mai departe; fm este diferit de 0, se tipare te 2 'Ia puterea' 2; se mare te i cu 1; n nu este 1, deci secventa se reia; fm va lua valoarea 0; 3 divide pe 3 (i divide pe n) deci fm va lua valoarea' 1 i n va deveni 1; 3 nu divide pe 1, deci se trece mai departe; fm este diferit de 0, deci se tiparel?te 3 'Ia puterea' 1; i devine 4; n este 1 i algoritmul se incheie.in continuare se prezinta schema logica i algoritmul realizat in pseudocod.Figura 2.3.16.INTEGER n,i,fm; READ ni:=2;DOfm:=O;WHILE n MOD i =0fm:=fm+l;n:=n div iREPEATIF fmO THENWRITE i, la puterea fmENDIFi:=i+lUNTIL n=lSTOP.Problema 11Sa se tipareasca toate numerele naturale mai mici sau egale cu 10000 care se pot descompune in doua moduri diferite ca suma de cuburi.Adevarata problema consta in a afla daca un numar natural se poate sau nu descompune in doua feluri ca suma de cuburi (de exemplu, 1729 = 13 + 123 == 93 + 103 si este eel mai mic numar natural care admite o astfel de descompunere). intr-o structura repetitiva de tip FOR se incearca, pe rand, sa sedescompuna numerele intre 1 l?i 10000..Se considera n, numar natural. Presupunand ca acest numar se descompune in i + j, apare ca evident faptul ca i !?i j nu pot lua valori mai mari decat radical in dice 3 din n. Pe de alta parte, pentru a nu gasi o pereche (i,j) de doua ori (de exemplu 3,5 9i 5,3), iva lua valori intre 1 l?i limita maxima, iar j va lua valori intrei !?i limita maxima. 0 variabila (nr in exemplul nostru) va re ine numarul de perechi(i,j) gasite.Prezentam in continuare algoritmui in pseudocod l?i schema logica.INTEGER n,nr,max,i,j,il,jl,i2,j2;FOR n:=l,lOOOO max:= l3/n1 nr:=O;FOR i:=l,maxFOR j:=i,maxIF i*i*i+j*j*j=n THENIF nr=O THENil:=ij1: =jELSEi2:=ij2:=jENDIFnr:=nr+l;ENDIFREPEAT REPEATIF nr>l THENWRITE n,il,jl,i2,j2ENDIF REPEATSTOP.DAFigura 2.3.17.Capitolul 3Elemente de baza ale limbajului Pascal3.1. Notiuni introductive3.1.1. Evolutia limbajelor de prOgramareEvolu ia limbajelor de programare cunoa!?te trei perioade distincte de timp!?i anume: anii 1950-1959, 1960-1969, dupa 1970.Anii '50 reprezinta etapa de pionierat in domeniul programarii calculatoarelor.Tn aceasta perioada s-a cristalizat no iunea de program. Initial, programela erauscrise in cod ma incl (instructiunile, datele de intrare-ie9ire erau formate din succesiuni de 0 :;;i 1, a:;;a cum de fapt le prelucreaza orice calculator din lume). Datorita acestui fapt, scrierea programelor, introducerea datelor erau activitati deosebit de migaloase !?i pu in productive. Un pas important in evolutie este dat de apari ia limbajelor de asamblare. Acestea folosesc pentru fiecare instructiune In cod ma!?ina o abreviere din limba engleza ce sintetizeaza efectul instruc iunii respective. De!?i mult U!?Urata, activitatea de programare intr-un limbaj de asamblare ramane dificila. Cu toate acestea, :;;i astazi limbajele de asamblare sunt utilizate cu succes datorita unor avantaje cum ar fi: posibilitatea scrierii unor programe specifice calculatorului pe care se ruleaza un anumit program (deci cu mare viteza de executie), posibilitatea scrierii unor secvente de program care nu se eot scrie lntr-un limbaj evoluat (din lipsa unor instructiuni specifce) etc.In aceasta perioada apar !?i limbajele de nivelinalt (FORTRAN, COBOL). De aceasta data, scrierea programelor se face cu ajutorul unor expresii din limba engleza (de:;;i extrem de restrictive). De asemenea, formulele_ prin care se solicita calculul unor expresii sunt asemanatoare formulelor matematice. Un mare avantaj al limbajelor de nivellnalt Tl constituie portabilitatea programelor scrise cu ajutorul lor (posibilitatea ca un program scris sa poata fi rulat pe diverse tipuri de calculatoare).Tn anii '60 se dezvolta cu precadere aparatul matematic necesar crearii 9i utilizarii limbajelor de programare. Astfel, regulile de scriere a programelor In limbajele respective sunt formalizate matematic. De asemenea, apare cor.ceptuide recursivitate in programare (acest concept era utilizat de mult timp in mate matica). Pentru prima data apare no iunea de alocare dinamica a n:er. ori&i (a!o carea spatiului de memorie pentru diverse variabile se face in timpul execu iei programului, atunci cand este cazul, l?i tot in acest timp se poate !?terge l.in spatiu alocat, cand nu mai este necesar). Toate acestea a par pentru prima data Ia limbajui.ALGOL. Acest limbaj, mai pu in utilizat de practicanti, a avut un ro! fundamental in dezvoltarea ulterioara a informaticii. Tot in aceasta perioada au a parut :;;i alte limbaje de programare evoluate care s-au raspandit in intreaga !ume.La lnceputul anilor '70 a aparut programarea structurata (initiatorii ei fiind E. W. Dijkstra l?i C. A. Hoare). Pentru prima data apar metode standardizate de elaborare a programelor, activitatea de programare depa9ind stadiul artizanal. Redactarea oricarui program se poate face utilizand cateva structuri simple (secventiala, alternativa, repetitiva). 0 problema complexa se descompune In subprobleme, care Ia randul lor se descompun din nou, pana cand sunt sufi cient de simple pentru a fi transpuse In programe (programare descendenta).La sfarl?itul anilor '80 apare un nou concept !?i anume programarea pe obiecte (in care datele l?i rutinele pentru ele sunt unificate in 'obiecte' care se pot utiliza ca a tare sau dezvolta ulterior far a a finevoie de a lua munca de Ia capat sau de a le cunoa!?te In mecanismul lor intim). Timpul va decide daca acestea vor deveni sau nu indispensabile in activitatea de programare.limbajul Pascal a aparut Ia inceputul anilor '70 !?i a fost elaborat de mate maticianul N. Wirth. Initial, limbajul a fost conceput pentru predarea sistema tica a disciplinei de programare a calculatoarelor (structurile clasice din progra marea structurata au fost transformate in instruqiuni). Cu timpul, limbajul a lnceput sa fie folosit 9i in activitatea practica de programare a calculatoarelor. Un rol fundamental pentru aceasta 1-a avut firma americana Borland, care a implementat o varianta numita Turbo Pascal, care pe langa instructiunile clasice ale limbajului contine l?i multe altele. Un mare avantaj al acestui limbaj este acela ca utilizatorul are posibilitatea sa-!?i declare propriile tipuri de date. Ultimele versiuni ale limbajului permit l?i realizarea programarii pe obiecte.3.1.2. Structura programelor PascalSa consideram eel mai simplu program Pascal:program fara_actiune;begin end.Acesta este un program care se poate rula. Efectul sau este nul. Nu cite9te, nu scrie, nu efectueaza nici un calcul. Totu!?i, din analiza acestuia rezulta urmatoarele: orice program lncepe printr-un cuvant numit PROGRAM care este urmat de numele propriu-zis al programului (nume ales de utilizator) !?i de semnul ';' ; orice program contine eel putin o data cuvintele cu un inteles special BEGINi END; orice program se termina prin punct.Observa.tii: orice cuvant al programului poate fi scris cu litere mari sau mici (nu are importanta); in versiunea Turbo, prima linie a programului poate lipsi (dei nu este recomandabil acest lucru, din ratiuni de ordine); plasarea cuvintelor pe linie i numarul de spatii dintre ele sunt Ia alegerea programatorului (putem scrie intreg programul pe o singura linie, insa este bine ca programul sa fie scris in aa fel incat sa fie u or de inteles).Un program scris in Pascal (oricat de complex ar fi) are structura urmatoare:PROGRAM nume;definitii de constante;definitii de tipuri;declaratii de variabile;declaratii de proceduri i funqii; BEGIN instruqiuniEND.Nu este obligatoriu ca intr-un program sa figureze toate acestea, dar dac2 ele figureaza, trebuie sa apara In aceasta ordine.3.1.3. Descrierea sintaxei cu ajutorul diagramelor de sintaxaOrice limbaj de programare se caracterizeaza prin sintaxa i semantica. Sintaxa limbajului este data de totalitatea regulilor de scriere corecta (In sertsul acceptarii sale de programul traducator (compilator) care are rolul de a converti programulln cod ma ina pentru a fi executat). Dar un program corect din punct de vedere sintactic nu este automat un program bun. Corectitudinea sintactica este numai o cerinta a programelor, tot al?a cum pentru a fi campion mondial Ia alergari este necesar sa nu ai picioarele amputate. Cel mai greu este ca programul sa execute lntocmai ce i-a propus eel care 1-a realizat. Prin semantica unui limbaj se intelege ce anume realizeaza fiecare instruqiune a sa.Sintaxa este formalizata perfect din punct de vedere matematic dar nu acela i lucru se intampla cu semantica. Sintaxa poate fi descrisa cu ajutorul diagramelorde sintaxa. Acestea nu reprezinta singura forma de descriere a sintaxei unui limbaj(mai exista de exemplu forma BNF), dar se remarca prin faptul ca sunt sugestive. in ce consta o descriere cu ajutorul diagramelor de sintaxa?+4.....Sa presupunem ca dorim sa descriem riguros cum arata scris un numar in baza 16. Daca folosim o descriere de genul: un numar in baza 16 are in componenta sa cifre l?i litere, cifrele pot fi de Ia 0 Ia 9 iar literele a, b, c, d, e, f, A, 8, C, D, E, F i dam cateva exemple, nu suntem suficient de riguro i. lmediat pot aparea intrebari de genul: A reprezinta un numar In baza 16? Mai mult, daca dorim sa facem un program care sa recunoasca daca un numar citit este sau nu in baza 16, situatia se complica. Reluam descrierea unui numar in baza 16, cu ajutorul diagramelor de sintaxa.Definim o citra dupa cum se vede mai jos:-CIFRA..Figura 3.1.3.1.Se observa ca o astfel de schema are un nume (In cazul nostru cifra). Pentru a putea obrine o cifra trebuie sa urmez un drum prin acest desen (in matematica se numel?te graf orientat), de Ia intrare (din dreptul numelui) pana Ia iel?ire, urmand sensul sagetilor. Problema se poate pune ;;i invers: fiind dat un caracter oarecare sa se precizeze daca este sau nu cifra. Caracterul dat este cifra daca in diagrama prezentata exista un drum care trece printr-un cerculet ce prezinta caracterul.Acum am definit riguros cifra. Putem defini riguros cifra hexa:CIFRA HEXAZECIMALAFigura 3.1.3.2.In noua diagrama apare un dreptunghi in care este scris cuvantul CIFRA. Dreptunghiul se folose te atunci cand se folose!?te o no iune ce a fost definita printr-o alta diagrama de sintaxa. Orice drum folosim in acest desen (de Ia intrare Ia ie ire) obtinem sau o cifra sau una din literele care pot face parte din:=rstructura unui numar in hexa.Acum se poate defini un numar hexa:-HEMZNEUMCAJRMAL"' CIFRA HEXAZECIMALA_Figura 3.1.3.3.in acest ultim desen observam ca este permisa de mai multe ori trecerea prin acelai loc.in esenta, intr-o diagrama de sintaxa putem lntalni urmatoarele simboluri grafice: cercuri - lncadreaza anumite simboluri speciale; elipse - incadreaza cuvinte rezervate (nu pot fi folosite in alt context); dreptunghiuri -lncadreaza elemente definite prin alte diagrame de sintaxa:Ne-am putea lntreba care este motivul unei descrieri atilt de riguroase? Un program scris intr-un limbaj de programare trebuie tradus de catre programul numit compilator in cod ma ina. in primul rand programul trebuie sa fie corect din punct de vedere sintactic (altfel nu poate fi tradus). A verifica corectitudi nea nu este un lucru simplu (pot fi foarte multe forme de programe). Din acestmotiv, verificarea se face dupa reguli care trebuie descrise foarte clar iar aceasta descriere este realizata de diagramele de sintaxa.3.2. Vocabularul limbajuluiVocabularul oricarui limbaj este format din: setul de caractere; identificatori; separatori; comentarii;3.2.1. Setul de caractereReprezinta ansamblul caracterelor cu ajutorul carora se poate realiza un program Pascal.Acesta este alcatuit din: literele mari i mici ale alfabetului englez (A-Z, a-z); cifrele sistemului de numeratie in baza 10 (0-9); caractere speciale: +, -, *, ';, =, ", , (, ), [, ], {, }, ., , :, ;, #, $, @,_, i blanc (spatiu).3.2.2. ldentificatoriPrin identificator intelegem o succesiune de litere sau cifre sau caracterul special ' ' din care prima trebuie sa fie Tn mod obligatoriu litera. Cu ajutorul identificatorilor se asociaza nume constantelor, variabilelor, procedurilor etc.Exemp/e de identificatori: a 1, tasta, un_numar.Contraexemple: 1ar, mt& (primul incepe cu o litera, al doilea contine un caracter special).Diagrama de sintaxa a unui identificator este urmatoarea:--IDENTIFICATORtLI A CIFRAIFigura 3.2.2.1.. 0 categorie speciala de identificatori este data de cuvintele cheie ale limbajului (au un inteles bine definit i nu pot fi folosite in alt context). Acestea sunt: and, array, begin, case, const, div, do, downto, else, end, file, for, function, goto, if, in, label, mod, nill, not, procedure, program, record, repeat, set, of, or, origin, otherWise, packed, then, to, type, until, var, while, with.3.2.3. Separatori i comentariiCele mai simple elemente alcatuite din caractere cu semnificatilingvistica poarta denumirea de unitai lexicale. Acestea se separa intre ele, dupa caz, prin blanc, sfan?it de linie sau caracterul ';'.Pentru ca un program sa fie u9or de inteles se folosesc comentariile. Acestease plaseaza oriunde in program. Un comentariu poate fi scris in doua feluri: intre acolade, exemplu: {un comentariu}; intre paranteze rotunde urmate de *, exemplu: (* un comentariu *).3.3. ConstanteConstantele Pascal reprezinta valori care pot fi continute de un program scris in acest limbaj (nu sunt citite de program). Ele folosesc in calculul diverselor expresii (numerice, logice, siruri de caractere) sau pentru scrierea unor mesaje.Exemplu: in program tr.ebuie realizata atribuirea y: = 2 * x + 1. in acest caz,2 l?i 1 sunt constante.Constantele limbajului Pascal se impart in 4 categorii: constante intregi; constante reale; constante l?ir de caractere; constante simbolice.Prezentarea notiunii de constanta prin utilizarea unei diagrame de sintaxa arata astfel:CONSTANTAiNTREAGA-CONSTANTA CONSTANTA REALA!?IR CARACTERECONSTANTA SIMBOLICAFigura 3.3.1.3.3.1. Constante intregiSunt alcatuite dintr-o submultime a numerelor intregi care pot fi reprezentate in memoria calculatorului.Observa_tie: Nu se pot reprezenta in calculator numere oricat de mari sau oricat de mici (orice numar ocupa un spatiu in memoria interna a calculatoru lui). Prin utilizarea limbajului Turbo Pascal se pot reprezenta numere intregi cuprinse in intervalul [-2.147.483.648, 2.147.683.647]. Numerele se pot reprezenta in baza 10 sau baza 16 (mai rar utilizata). Pentru baza 16, numarul este precedat de caracterul special '$'.Exemple: 32, -164, + 31, $a1, -a1.Pentru eliminarea oricaror ambiguitati, utilizam diagrama de sintaxa pentru a defini un astfel de numar.CIFRACIFRA HEXAZECIMALAFigura 3.3.1.1.3.3.2. Constante realeSunt alcatuite dintr-o submultime a numerelor reale (mai precis a numerelor rationale) care pot fi reorezentate in calculator. Numerele se gasesc in intervalul [3:41o-4352, 1,1 1o4932J.in locul virgulei se folose te P,unctul.Exemple: 2.34, -45.26, 512E + 23, -45.1 E-3.Ultimele doua numere folosesc o scriere neintalnita In matematica. Ele reprezinta numerele 5211023 i -45,11 o- 3 .Figura 3.3.2.1.3.3.3. Constante ir de caractereDupa cum reiese i din denumire, cu ajutorul lor se reprezinta l?iruri de car ctere. $irurile de caractere se pot reprezenta In doua forme.In prima forma se scrie l?irul cuprins intre apostrofuri.Exemp/u: 'acesta este un text'.in forma a doua se scrie irulln cod ASCII (fiecarui caracter i se ata eaza un cod cuprins intre 0 l?i 255 i este precedat de caracterul'#'.Exemp/u: #1#2sau, echivalent (in baza 16), #$1#$2.SIR-CARACTERE CARACTER CONSTANTAiNTREAGAFigura 3.3.3.1.3.3.4. Constante simboliceAcestea sunt constante care au in program un anumit nume. Numele dat acestor constante poate fi cunoscut de limbaj (de exemplu: false, true, maxint) sau dat de utilizator atunci cand definel?te constantele. Acest din urma aspect il vom analiza in paragraful 3.6.3.4. Notiunea de tip de dataTn procesul de calcul intervin diverse date (intregi, reale etc.) Prin tip de data vom intelege o multime de valori. Pe tipurile de date se introduc anumite operatii.Exemplu de tip: integer.Multimea valorilor acestui tip este o submultime a numerelor intregi. Cu aceste valori se pot efectua o serie de operatii cum ar fi: adunarea, scaderea etc.Avem trei categorii de tipuri: simple; structurate; reper.Tipurile simple de date (nu necesita structurare) se pot clasifica din doua puncte de vedere.Un tip ordinal reprezinta o multime finita de valori intre care exista o relatie de ordine.Conform acestui criteriu, tipurile simple se clasifica in: tipuri ordinale; tipuri reale (chiar daca se ia o submultime a numerelor reale situata intr-un anumit interval, acesta nu are un numar finit de elemente).Din punct de vedere al modului de definire a tipului, tipurile simple se clasifica in: tipuri standard (este cunoscut, nu este necesar sa fie definit de programator); tipuri definite de utilizator.533.4.1. Tipuri simple standardAcestea se clasifica in: tip boolean; tip char; tipuri lntregi; tipuri real.Dintre acestea, primele trei sunt tipuri ordinale.3.4.1.1. Tipul booleanAre numai doua valori: true si false. Operatorii care lucreaza cu acest tip sunt: AND, OR, NOT. Tn versiunea Turbo a limbajului s-a introdus i operatoiul XOR. Fiind date doua valori oarecare ale acestui tip, a i b, avem a XOR b=true daca :;;i numai daca ele sunt diferite.3.4.1.2. Tipul charMultimea valorilor a cestui tip este fermata de toate caracterele reprezentate in codul ASCII extins. Fiecare din aceste caractere se reprezinta pe un octet. Relatia de ordine intre aceste caractere este data de relatia de ordine dintre codurile prin care se reprezinta aceste caractere (cuprinse intre 0 i 255).Limbajul contine anumite funqii care se pot aplica tipului char. Acestea sunt: SUCC(caracter) - returneaza caracterul care are codul ASCII cu o unitatemai mare (succ('c') = 'd'); PRED(caracter)- returneaza caracterul care are codul ASCII cu o unitate mai mica (PRED('d') = 'c'); ORD(caracter) - returneaza codul ASCII al caracterului; CHR(cod) - returneaza caracterul care are codul specificat.3.4.1.3. Tipuri intregiTn funqie de submultimea considerata a numerelorintregi, avem urmatoarea clasificare: tipul SHORTINT, numere din intervalul [-128, 127] care se reprezinta in memoria interna pe un octet; tipul INTEGER, numere in intervalul [-32768, 32767], se reprezinta pe 2octeti; tipul LONGINT, numere din intervalul [-2.147.483.648,2.147.483.647},se reprezinta pe 4 octeti; tipul BYTE, numere din intervalul [0, 255], se reprezinta pe un octet; tipul WORD, numere din intervalul [0, 65535], se reprezinta pe 2 octeti.Variabilelor de tip intreg li se pot aplica urmatorii operatori aritmetici: + (adunare, operator binar), - (scadere, operator binar), * (inmultire, operator bin;!r), DIV l?i MOD (operatori binari). Ace:;;ti ultimi doi operatori merita analizati.In cazul a doua valori naturale (deci intregi pozitive), operatorii MOD !?i DIVfurnizeaza catul i restul impartirii intregi.Exemplu: 14 DIV 5 = 2;14MOD5 =4.Daca eel putin un operand este negativ, lucrurile se complica.Exemp/u: -13 DIV 4=-3-13MOD4=-1.$tim din matematica faptul ca restul impartirii a doua numere Tntregi este pozitiv. In acest caz, cei doi operanzi nu furnizeaza rezultatul corect.Pentru operandul DIV rezultatul se obtine astfel: se impart cele doua numere in valoare absoluta (pentru exemplul dat, catul este 3); semnul catului se stabile!?te dupa regula semnelor ( + cu + rezultat +, -cu + rezultat -, etc.).Pentru MOD rezultatul se obtine din scaderea din delmpaqit a produsuluidintre impartitor i cat (pentru exemplificare se calculeaza -13-4* 3 = -1.Operanzilor de tip intreg lise pot aplica i operatorii pe biti (lucreaza asupra bitilor din reprezentarea interna a numarului). Ace!?tia vor fi prezenta1i In continuare.Operatorul NOT (operator unar)Bitii care au valoarea 0 vor avea valoarea !?i invers.Exemplu: NOT 7 = -8.Presupunem numarul 7 reprezentat pe un octet. El va arata astfel:00000111. Aplicand operatorul NOT obtinem: 11111000. Acesta reprezintaun numar negativ. Dupa cum tim, pentru a obtine valoarea lui, se transforma bitii cu 1 in biti cu 0 i se adauga 1. Rezulta: 00000111 + 1 = 00001OOO.Uiti mul rezultat este numarul 8, iar daca tinem seama ca era negativ, obtinem -8.Operatorul AND (operator binar) ,Fie continutul a doi biti, b 1 i b2. Definim operatia de conjunctie a supra continutului lor, astfel:b 1 AND b 2 J Ia?aca.b1=1b2=1I 1n once alt cazCu ajutorul lui AND se face conjunqia bit cu bit a celor doi operanzi.Exemplu: 3 AND 7=3. 3 se reprezinta astfel: 00000011; 7 se reprezinta astfel: 00000111; 'fn final, rezulta: 00000011,adiea numarul 3.Operatorul ORFie b 1 !?i b2 continutul a doi biti. Definim disjunqia astfel:b 1 OR b2 = o ?aca. b1 =0b2=01 1 I 1n once alt cazOperatorul OR face disjunctia bit cubit asupra reprezentarii celor doua numere.Exemplu: 3 OR 7 = 7.Operatorul XOR (operator binar)Fie b1,b2 continutul a doi bi!i. Definim operaria sau exclusiv asupra con!inutului celor doi biti astfel:b 1 XOR b 2 = 1. ?aca b1=1 i b2=0 sau b1=0 i b2=11 0, 1n caz contrarPrin aplicarea operatorului XOR se face operatia sau exclusiv bit de bit asupra reprezentarii binare a celor doua numere.Exemplu: 3 XOR 7 = 4. reprezentam numarul 3: reprezentam numarul 7: rezulta: 00000011;00000111;00000100,adica 4.Operatorul SHL (operator binar)Deplaseaza Ia stanga toti bitii primului operand, cu un m.:mar de biti ega! cu a!doilea operand. Continutul primilor biti se pierde, iar continutul ultimilor biti deJine 0.Exemp/u: 11 SHL 2 = 44. 11 se reprezinta 00001 011; prin deplasarea cu doua pozitii Ia stanga se obtine: 00101100, adica numarul 44.Observa.tie: Prin deplasarea Ia stanga cu o pozitie (daca primul bit al numarului nu este 1) numarul se lnmulte9te cu 2.Operatorul SHRDeplaseaza tori bi!ii primului operand Ia dreapta cu un numar de pozitii egalcu al doilea operand, ultimii biti ai primului operand se pierd, iar pe primele pozi!ii se pune 0.Exemplu : 44 SHR 2 = 11. Aratati cum s-a obtinut acest rezultat.Observa.tie: Deplasarea Ia dreapta cu o pozitie este echivalenta cu impaqirea lntreaga Ia doi.Tipurile lntregi sunt tipuri ordinale deci lise pot aplica functiile SUCC, PRED, ORO 9i operatorii relationali.FUNCTIA ABS(nr)- furnizeaza modulul numarului (abs(-12) = 12);3.4.1.4. Tipuri realeTntr-o data de tip real se pot retine numere rationale. Numerele reale, cunoscute de noi din matematica, cuprind l?i numere irationale. Acestea din urma au o infinitate de zecimale, deci nu pot fi retinute in calculator. Totu9i, ele pot fi suficient de bine aproximate prin numere rationale. Operatiile cu numere reale au rezultate aproximative (nu se pot retine oricat de multe zecimale). Limbajul TURBO PASCAL are urmatoarele tipuri reale: tipul REAL - numerele se reprezinta pe 6 octeti 9i pot avea maxim 11, 1 2 cifre; tipul SINGLE - numerele se reprezinta 'fn memorie pe 4 octeti l?i pot avea maxim 7, 8 cifre; DOUBLE, numerele se reprezinta pe 8 octeti 9i pot avea maxim 15, 16 cifre; EXTENDED, numerele se reprezinta pe 10 octeti i pot avea 19, 20 de cifre; COMP se retin numai numere pozitive pe 8 octeti 9i numerele pot avea pana in 19, 20 de cifre.Datelor de tip real li se pot aplica urmlHorii operatori:+ pentru adunare;-pentru scadere;* pentru inmultire;I pentru impartire.Datelor de tip realli se pot aplica operatorii relationali 9i urmatoarele functii: ABS(x) - are ca rezultat modulul numarului x; SQR(x) - x Ia patrat; SQRT(x) - radical din x; SIN(x) -sinus din x (x este exprimat In radiani); COS(x) - cosinus din x; ARCTAN(x)- arctangent din x; LN(x) - logaritm natural din x; EXP(x) - e Ia puterea x ( e are valoarea aproximativa 2.71); INT(x) - partea intreaga din x; FRAC(x) - partea fractionara a lui x; pi -numarul " ( aproximativ 3.14).0 data de tip real nu este de tip ordinal.3.4.2. Tipuri ordinale definite de utilizator'Utilizatorul are posibilitatea sa declare doua tipuri de date ordinale: tipul enumerat; tipul subdomeniu.3.4.2.1.Tipul enumeratAvand in vedere faptul ca acest limbaj a fost creat In scopuri pur didactice, s-a avut In vedere posibilitatea scrierii unor programe care sa fie inteles cu Ul?urinta. Din acest motiv a aparut tipul de date enumerat.Exemple de astfel de tipuri: (luni, marti, miercuri, joi, vineri, sambata, duminica); (ieri, azi, maine).LPrin diagrame de sintaxa acest tip se reprezinta astfel:TIP-ENUMERAT( IDENTIFICATOR'--- G)Figura 3.4.2.1.Datele de acest tip nu pot fi scrise sau citite. Ele se reprezinta Tn memorie prin numarullor de ordine (ORD(Iuni) = 0, ORD(marli) = 1 etc. Acestor date lise pot aplica func iile PRED, SUCC precum 9i operatorii relationali (avem, referitorIa exemplul dat, marti < miercuri)).3.4.2.2. Tipul subdomeniuSe ob ine dintr-un tip ordinal definit anterior sau predefinit (numit tip de baza) din care se extrage un numar de valori consecutive (precizand prima l?i ultima valoare). Cu acest tip se pot face acelea9i opera ii care se pot face l?i cu tipul de baza).Exemple: 2..20- o variabila de acest tip ia valori Tntregi cuprinse Tntre 2 9i 20, tipulde baza fiind tipul integer; luni..vineri - o variabila de acest tip poate lua toate valorile dintre luni l?i vineri ale tipului de baza enumerat, definit anterior.Prezentam acest tip prin intermediul diagramelor de sintaxa:--SUBDOTMIPENIU-------..1, CONSTANTA 1 I1---.tllt .. 1-----.t..J,CONSTANTA 2 L..---...Figura 3.4.2.2.3.4.3. Definirea tipurilorDupa ce am vazut principalele tipuri de date ale limbajului, trebuie sa cunoal?tem 9i modulln care se fac declaratiile de tipuri.Pentru declararea unui tip se folose9te declara ia TYPE.Exemple: TYPE zile = (luni, mar i, miercuri, joi, viner1, sambata, duminica);an_na9tere = 1900..1994;litere ='A'..'Z';Observa_tii: Tntr-un program putem defini mai multe tipuri de date prin utilizarea unui singur cuvant TYPE (toate declara iile de mai sus pot fi facute lntr-un singur program); atunci cand declaram un tip, declaram de fapt o mul ime de valori posibile pe care le-ar putea lua variabilele programului.Declaratia tipurilor cu ajutorul diagramelor de sintaxo prezentam mai jos.3.5. Declararea variabilelorNotiunea de variabila a fost prezentata 'fn primul capitol. Aici se prezinta modul Tn care se declara o variabila de un anumit tip. Pentru declarare se folose9te cuvantul cheie VAR.DE TIPURI-------.,L IDENTIFICATORI_DEFINITIE .f TYPEBOOLEANTIP SIMPLUTIP STRUCTURAT TIP REPERSHORTINT TIP-SIMPLU CHAR iNTREG REAL ENUMERATSUBDOMENIUTABLOUTIP-iNTREG INTEGER LONGINT BYTEWORD TIP-STRUCTURAT STRING MULTIME ARTICOLFI!;>IERREALTIP-REAL SINGLE DOUBLE EXTENDED COMPFigura 3.4.3.1.Exemple: TYPE zile = (luni, marti, miercuri, joi, vineri, sambata, duminica);an nastere = 1900..1994;litere,;'A'..'Z';Var a: integer;zi: zile;an1, an2: an nastere;ch: litere; - Prezentam declararea variabilelor cu ajutorul diagramelor de sintaxa:DECLARATIA-- VARIABILAIDENTIFICATORFigura 3.5.1.3.6. Definirea constantelorSe face prin utilizarea cuvantului cheie CONST.Exemple: Const nota max= 10;r = 3:-25.Exista posibilitatea de a defini o constanta prin precizarea tipului ei (care poate fi !?i un tip structurat). in acest manual se vor da astfel de exemple de cate ori va fi cazul.3.7. ExpresiiRegulile de formare a expresiilor sunt acelea!?i din matematica.0 mare importanra in evaluarea expresiilor o are prioritatea operatorilor. Aceasta este urmiHoarea: prioritatea 1 (maxima): NOT, +, - (operatori unari); prioritatea 2: AND, *, /, DIV; (operatori multiplicativi); prioritatea 3: OR, XOR, +, - (operatori aditivi); prioritatea 4; > ,> =, b) AND (b b AND b < c (aceasta din urma nici nu are sens deoarece se efectueaza inirial b AND b, dupa care expresia l!?i pierde sensul).3.8. Citirea i scrierea datelorAcestea se realizeaza utilizand procedurile standard READ, READLN,WRITE, WRITELN.3.8. 1. Citirea datelorSe face cu ajutorul procedurilor READ !?i READLN.in acest paragraf se prezinta aceste proceduri lntr-o forma mult simplificata. Pentru amanunte, vezi fi!?iere text.Procedura READ are forma READ(var), unde var are semnificaria de variabila (variabilele de tip boolean !?i enumerare nu se citesc). Se cite te de Ia tastatura o data care se depune in variabila var. Procedura READLN se folose te exact ca READ, cu deosebirea ca, dupa citire, cursorul sare pe linia urmatoare a ecranului.3.8.2. Scrierea datelorSe face cu ajutorul procedurilor WRITE !?i WRITELN.in ambele cazuri se scrie lncepand cu pozitia curenta a cursorului pe ecran. Diferenta lntre WRITE !?i WRITELN este aceea ca, dupa scriere, prin utilizarea procedurii WRITE cursorul ramane dupa ultimul caracter scris, iar prin utilizarea procedurii WRITELN el sare pe prima pozitie a randului urmator.Exemp/e: WRITE (a), unde a este o variabila intreaga care contine numarul 3 - scrie3 incepand din pozitia curenta a cursorului. WRITE (a,b), unde a !?i b sunt variabile lntregi care au continutul 2 respectiv3- va avea ca efect scrierea numarului 2 urmat de numarul 3 (apare 23). WRITE(' a= ',a)- areca rezultat scrierea !?irului de caractere 'a=' urmat de data retinuta de variabila lntreaga a. Presupunem ca b este o variabila reala care contine numarul 3.25.WRITELN (b:4:2) va determina aparitia pe monitor a numarului 3.25. Ci-Fra4 are semnificaria de numar total de pozitii pe care sa se scrie numarui real, iar citra 2 numarul de pozitii pe care se va scrie partea zecimala (in absenta acestor parametri, data reala se va scrie intr-o forma greu inteligibila). In situatia In care partea intreaga a datei reale nu incape in formatul prestabilit, nu se mai tine cont de acest format.Capitolul 4lnstructiunile limbajului Turbo PascalTnainte de a incepe prezentarea instructiunilor acestui limbaj, amintim conditiile In care acesta a fost elaborat.1. Limbajul a fost conceput special pentru scrierea de programe structurate.Din acest motiv, instruqiunile reproduc structurile fundamentaie ale programarii structurate. Exista !?i o exceptie 9i anume instructiunea GO TO (salt Ia o anumita eticheta). Motivul includerii acesteia in setul de instructiuni ale limbi=iiu.lui este a_cela de a permite programatorilor, obil?nuiti sa lucreze nestructurat, folosirea acestui limbaj (o gluma care circula Ia aparitia limbajului spune ca aceasta instructiune a fost in!rodusa spre a permite programatorilor sa scrie programe BASIC in PASCAL). lntrucat elevilor nu le este permis sao foloseasca, nu va fi prezentata in acest manual.DE ATRIBUIRE IFCOMPUSAVIDA-INSTRUCTIUNE CASE WHILE REPEAT FOR WITHPROCEDURALAFigura 4.1.2. Din fericire, autorul limbajului este de formatie matematician, fapt ce i-a permis sa realizeze urmatoarele: definirea riguroasa (matematica) a sintaxei limbajului; mari posibilitati de extindere a tipurilor de date; introducerea instruqiunii vide, cu mari consecinte asupra programelor.3. Limbajul a fost conceput sa fie unul didactic (introducerea in programare se face cu ajutorul lui, in multe universitati).Din acest motiv, el este extrem de apropiat de un limbaj de tip pseudocod, fapt care permite programatorilor cu anumita experienta sa redacteze algoritmii direct in Pascal. Ulterior, datorita marilor sale calitc':iti, limbajul a fost extins Ia varianta Turbo Pascal, varianta ce este folosita cu succes de profesioni9ti.Conceptul de instruqiune rezulta din diagrama de sintaxa din figura 4.1.4.1. lnstruc1iunea de atribuireEste de forma:v: = expresie, unde v este numele unei variabile. Principiul de executie este urmatorul: se evalueaza expresia; variabila via aceasta valoare.Regula fundamentala este urmatoarea: tipul expresiei trebuie sa coincida cu tipul variabilei.Exemple:1.x: =3;x: = x + 2 unde x este o variabila de tip integer sau real.in urma executiei acestei secvente, variabila x va contine valoarea 5.2. a:= i bthen writeln (a)end. else writeln(b)Se citesc trei variabile reale a, b, :;;i c. Se cere sa se calculezela+b,c>O9='8*b,C=0I a-b, cn;writeln(1 s= 1 , s)end.Exemplu/ 2:Se cite te n, numar natural. Sa se descompuna In factori primi.program plO;var n,i,fm:integer;begin write('n='); readln(n); i:=2;repeatfm:=O;while n mod i =0 do beginfm:=fm+l;n: =n div iend;if fm o then writeln (i, ' la puterea ',fm);i:=i+luntil n=l end.lata cum arata instruqiunea REPEAT prezentata cu ajutorul diagramei de sintaxa:_INST: ;J! NEA-c REPEAT )aoj INSTRUCTIUNE., I. .---{G) ---'-Figura 4.7.4.8. lnstructiunea FORDe multe ori trebuie repetata o anumita secventa de un numar cunoscut de ori. Tn acest caz se recomanda folosirea instructiun(i FOR. lnstruqiunea FOR are doua forme.Forma 1:FOR variabila : = expresie 1 TO expresie 2 DO instruqiune.Cuvantul variabila semnifica variabila de ciclare i ea poate fi de orice tip ordinal. Expresie 1, expresie 2 sunt expresii care au acelai tip ca 9i variabila de ciclare.Principiul de executie este urmatorul: se evalueaza cele doua expresii; daca expresia 1 are un ordin mai mare decat expresia 2 se trece mai departe, iar variabila de ciclare are valoarea expresiei 1; daca cele doua expresii au aceeai valoare, se executa o singura d 1ainstructiunea, variabila de ciclare ia valoarea comuna celor doua expresii; daca expresia 1 are un ordin mai mic decat eel al expresiei 2 se procedeaza astfel:o variabila de ciclare ia valoarea expresiei 1 i se executa instructiunea;o variabila de ciclare ia valoarea succ (din vechea valoare a variabilei deciclare) l?i se executa instructiunea;o procedeul continua,repetitiv,pana cand se executa instructiunea !?i pentruvariabila de ciclare egala cu valoarea expresiei 2 (In acest caz, dupa ie!?ireadin ciclu variabila de ciclare va avea valoarea expresiei 2).Forma 2:FOR variabila ciclare: = expresie 1 DOWNTO expresie 2 DO instructiune. Diferenta fata de forma 1 este ca Ia fiecare pas variabila de ciclare va lua cavaloare pred (vechea valoare).Exemp/u/1:Sa se calculeze suma primelor n numere naturale utilizand instructiunea FOR. Se prezinta doua programe care calculeaza aceasta suma (se utilizeaza cele doua forme ale instructiunii FOR).program f1;var n,s,i:integer;beginwrite(1 n= 1 );readln(n);s:=O;for i:=1 ton do s:=s+i;writeln(1 s=1 , s)end.program 2;var n,s,i:integer;beginwrite(1 n= 1 ) ;readln(n);s:=O;for i:=n downto 1 do s:=s+i;writeln(1 s= 1, s)end.Exemp/u/2:Sa se listeze alfabetul. Se prezinta doua variante de listare in ordine normala!?i inversa.program 3;var i:char;beginfor i:= 1 a1 to 1 z1 do write(i);end.program f4;var i:char;beginfor i:='z' downto a do write(i);end.Exemplul 3:Este unul tara efect deosebit, dar demonstreaza varietatea tipurilor de date care pot fi folosite de FOR. in acest exemplu se listeaza primele trei luni ale anului In ordine naturala !?i in ordine inversa.program fS;var i:(ianuarie,februarie,martie);beginfor i:=ianuarie to martie docase i ofianuarie: writeln('ianuarie);februarie: writeln('februarie);martie: writeln(martie')end end.program f6;var i:(ianuarie,februarie,martie);beginfor i:=martie downto ianuarie docase i ofianuarie: writeln('ianuarie);februarie: writeln('februarie');martie: writeln('martie')endend.Pentru exemplele care urmeaza, algoritmii au fost prezentati in capitolul 2.Exemp/u/ 4:Pentru n citit (n natural mai mare sau egal cu 1) sa se calculeze sumaS= 1 + 1 *2 + 1 *2*3+ ... + 1 *2* ... *n.program pS;var n,i,s,p:integer;begin write('n='); readln(n); s:=O;p:=l;for i:=l ton dobegin p:=pi; s:=s+pend;writeln('s=,s)end.Exemp/u/5:Se citel?te n numar natural. Sa se precizeze daca este prim sau nu.Se prezinta doua variante de program care rezolva aceasta problema.program p8;var n,i:integer;prim:boolean;begin write('n='); readln(n); prim: =true;for i:=2 to trunc(sqrt(n)) doif n modi =o then prim:=false;if prim then writeln(numarul este prim')else writeln('numarul nu este prim')end.program p8;var n,i:integer;prim:boolean;begin write('n='); readln(n); prim:=true;for i:=2 to trunc(sqrt(n)) doif n modi =0 then prim:=false;if prim then writeln(numarul este prim')else writeln('numarul nu este prim')end.Exemplul 6:Sa se scrie un program care tipare te primele nr numere prime (nr se cite te).program p9;var n,i,j,nr:integer;prim:boolean;beginn: =1;j: =0; write(nr=); readln(nr); repeatprim:=true;74 \for i:=2 to trunc(sqrt(n)) doif n mod i=o then prim:=false;if prim then beginwriteln(n);j: =j+1end;n:=n+1until j=nr end.Exemplu/ 7:Sa se tipareasca toate numerele naturale mai mici sau egale cu 10000 care se pot descompune in doua moduri diferite ca suma de cuburi.program p11;var n,nr,max,i,j,i1,j1,i2,j2:integer;beginfor n:=1 to 10000 do beginmax:=trunc(exp(1/3ln(n)));nr:=O;for i:=1 to max do for j:=i to max doif i*i*i+j*j*j=n then beginif nr=O then, begini1:=i;j 1:=jendelsebegini2:=i;j2: =jend;nr:=nr+1;end;if nr>1 then writeln(n,' ',i1,' ,j1,' ,i2,' ,j2)endend.Prezentam instructiunea FOR cu ajutorul diagramelor de sintaxa.INSTRUCTIUNE-FOR.IDENTIFICATOREXPRESIEEXPRESIE INSTRUCTIUNEFigura 4.8.4.9. Aplicatii Ia capitolele 3 'i 4Algoritmi simpliPentru aplica1iile de mai jos, algoritmii se vor redacta utilizilnd schemele logice, un limbaj de tip pseudocod i programe PASCAL.1. Se cite:;;te o valoare intreaga. Sa se precizeze daca ese pozitiva sau nu.2. Se citesc 3 valori reale a, b, c. Sa se precizeze daca ele pot fi laturile unui triunghi.3. Sa se scrie un program care rezolva o ecua1ie de gradul 2.4. Se citesc 4 numere intregi. Sa se tipareasca in ordine descrescatoare.5. Sa se calculeze valoarea func1iei F, definita pe mu11imea numerelor reale, pentru un x citit:IX *X-3, X256. Se citesc 4 valori reale a, b, c, d. Sa se evalueze expresia:a b. c +d>O E= a-b, c +d=O a *b, c +db; daca av[i+1].den thenbeginm:=v[i];v(i]:=v[i+1];v(i+1]: =m;inversari:=true enduntil not inversari;for i:=1 ton do with v [i] do beginwriteln('Inregistrarea'i); writeln(den);writeln(cant:4:2);endend.Sunt situatii in care unul din campurile unei structuri de tip inregistrare este tot de tip inregistrare. De exemplu,in aplicatia noastra, pentru fiecare materiC!I trebuie sa se retina !?i data fabricatiei. Aceasta este compusa din zi, luna i an deci are o structura de tip inregistrare.Limbajul permite ca o structura de tip RECORD sa cantina o alta structura de tip RECORD.Analizati programul urmator care cite!?te o singura inregistrare din noul tip de structura. Pentru a adresa campul an al inregistrarii m ar trebui sa folosim adresarea m.dataf.an, adresare extrem de greoaie. Din acest motiv, in program, se folose te de doua ori instructiunea WITH.program recs;type material=recordcod,mag:integer;den:string[JO];um:string[J];cant,pu:real;dataf:recordzi:l..31;luna:l..12;an:integerendend;var m:material;beginwith m do beginwrite ('cod'); readln(cod); write ('magazie '); readln(mag); write (denumire '); readln(den);write ('unitate masura ); readln(um); write ('cantitate '); readln(cant); write ('pret unitar '); readln(pu);with data do beginwrite('ziua fabricatiei '); readln(zi);write('luna fabricatiei 'l; readln(luna);write('anul fabricatiei '); readln(an)end endend.5.2.2. Tipul inregistrare cu varianteNu toate inregistrarile au o structura fixa (acela!?i numar de campuri) a!?a cum au fost cele prezentate ca exemplu In paragraful anterior. Sunt cazuri cand un tip inregistrare are o parte fixa urmata de o parte variabiliLSa presupunem ca ne intereseaza o situatie referitoare Ia studiile unei p.ersoane. 0 astfel de inregistrare are o parte fixa data de campurile care retin numele, varsta !?i tipul de studii. 0 persoana poate sa nu aiba studii, caz in care nu mai este necesar sa avem alte informatii, poate sa fi facut cateva clase de!?COala generala (ne-ar putea interesa cate clase), sa fi terminat liceul (caz In care dorim sa !?tim anul terminarii !?i ora!?ul) sau sa aiba studii superioare (!?i atunci ne intereseaza numele facultatii si numarul de ani de studiu In cadrul facultatii respective). in concluzie, infunctie de tipul de studii, inregistrarea arata altfel.Limbajul permite ca lnregistrarile sa aiba o structura variabila. Cum se realizeaza aceasta? in primul rand trebuie retinut ca partea variabila este plasata In cadrul lnregistrarii dupa partea fixa. 0 parte variabila se dezvolta in cadrullnregistrarii dupa valorile pe care le ia un camp situat in cadrul partii fixe.in programul care urmeaza (ce exemplifica descrierea unui tip de inregistrare variabila) selec ia partii variabile se face In functie de valorile pe care le ia campul STUDII. Pentru selectare, se folose!?te o clauza speciala numita CASE.C.ampul dupa care se face selectia apare descris in aceasta clauza.Campul selector trebuie sa fie de tip ordinal cu un numar finit de elemente(tipul INTEGER nu este permis). in functie de valorile pe care le poate luacampul selector se va dezvolta partea v riabila. in esenta, se scriu pe rand valorile posibile ale campului selector. in dreptul fiecarei valori se trece partea pe care trebuie sa o con ina inregistrarea in acest caz. Aceasta se incadreaza intre paranteze rotunde !?i poate fi chiar vida. CampJrile prezente intre paranteze rotunde se scriu separate prin ';'.Analizati programul urmator (care cite!?te o singura inregistrare):program rec6;type persoana=recordnume:string[JO];varsta:byte;case studii:char ofIf I : ();1 g1 : (nr cl:integer);1 11 : (an-t:integer;oras:string);1 s1 : (fac:record\nume f:string[20];an s7byte end)-end;var p:persoana;beginwrite( 1 nume 1 ); readln(p.nume);write(1 varsta); readln(p.varsta);write(1 studii '); readln(p.studii);case p.studii of'g1 :beginwrite(1 numar clase 1 );readln(p.nr_cl)end;1: beginwrite(1 anul terminarii liceului 1 );readln(p.an t);write(1 orasul 1 );readln(p.oras)end;s1 :beginwrite(1 numele facultatii 1 );readln(p.fac.nume f);writeln(1 ani studii facultate 1 );readln(p.fac.an s)end -end {case}end.10!iObservatii: Este preferabil ca citirea unei variabile de acest tip sa se faca prin utilizareainstruqiunii CASE. Pentru fiecare inregistrare de acest tip compilatorul rezerva un numar de octeti necesar inregistrarii celei mai lungi posibile. Toate celelalte operatii cu inregistrari de un tip variabil sunt similare cu cele prezentate pentru inregistrari de tip fix. Cu ajutorul diagramelor de sintaxa tipul inregistrare cu variante se descrie astfel:TIP iNREGISTRARE RECORD DESCRIERECU VARIANTE PARTE FIXADESCRIERE PARTE VARIANTE IDENTIFICATORCONSTANTA DESCRIERE PARTE FIXA DESCRIERE PARTE VARIANTEFigura 5.2.2.1.5.3. Tipul de date multimeSa presupunem ca se cite!?te o variabila de tip char. Se cere sa se precizeze daca a fost citita o litera mica a alfabetului. Cum am putea rezolva aceasta pro blema?0 posibilitate de rezolvare consta in a testa daca am citit 'a' sau 'b' sau ...'z'. Nu credeti ca un astfel de test este cam lung? Altfel cum am putea proceda? Sa retinem toate literele mici ale alfabetului intr-un vector de caractere, pentru ca apoi caracterul citit sa fie comparat, pe rand, cu fiecare componenta a vectorului. Nici aceasta solutie nu straluce!?te prin simplitate. Limbajul Turbo Pascal ofera posibilitatea de a rezolva eficient astfel de probleme utilizand tipul de date multime.Evident, o variabila de un tip multime poate retine o multime de elemente. De Ia bun inceput precizam ca multimea nu poate avea mai mult de 256 de elemente. Oricum, este un numar suficient de mare pentru a putea rezolva cu succes o clasalarga de probleme. Ce natura au elementele care constituie multimile?Aceste elemente trebuie sa apartina unui tip ordinal standard (char,boolean)sau unui tip definit de utilizator. Tipul ordinal caruia li apaqin elementele ce constituie multimile nu trebuie sa cantina mai mult de 256 de caractere i se nume te tip de baza. Ordinul elementelor ce alcatuiesc tipul de baza trebuie sa fie cuprins intre 0 !?i 255. Tipul integer nu poate fi tip de baza dar pot fi folosite subdomenii ale acestuia care au elemente lntre 0 i 255.Sa analizam programul de mai jos:program mul;const a:set of char=(1 a1 1 i1 , 1 m 1 ];type zile=(luni,marti,miercuri,joi);cifre=O..9;cifre mari=10..200;var v1:set of char;v2:set of zile; v3:set of cifre; v4:set of cifre_mari;begin1V 1: = ( Ia I , , I d Iv1:=a; v2:= (] ; v2:=(1uni]; I111 IU I , , I z I ] iv3: = ( o, 1, 7 .. 9] ;v4: = ( 9 o ..1o o] ;end.Variabila v1 retine o multime de caractere. Variabila v2 retine o multime de elemente apartinand tipului enumerare mai sus definit. Analizati singuri natura elementelor multimilor ce pot fi retinute in variabilele v3 i v4.Declararea tipului multime se face aa cuni arata diagrama de sintaxa de mai jos:TIP-MULTIMETIP ORDINALFigura 5.3.1.Singura operatie permisa asupra variabilelor de tip multime este operatia de atribuire in care variabila capata valoarea unei expresii de tip multime.0 expresie de tip multime poate contine: variabile de tip multime; constructori de tip multime; operatori; constante de tip multime.5.3.1. Constructori de tip multimeAce!?tia definesc valori de tip multime. Orice constructor incepe prinT !?i se termina prin ']'. Tn esenFi, intre paranteze drepte se trece valoarea multime definita de constructor. Elementele multimii sunt date prin enumerare.Sa analizam constructorii prezenti In programul de mai sus: [] reprezinta muiJimea vida; [luni] reprezinta multimea formata dintr-un singur element i anumeelementul luni; [0,1,7..9] reprezinta multimea formata din elementele 0, 1, 7, 8 i 9.5.3.2. OperatoriVariabilelor de tip multime li se pot aplica urmatorii operatori:+ pentru reuniune (reuniunea a doua multimi A i B este o multime formata dinelementele multimii A Ia care se adauga elementele multimii B care nuapartin multimii A);* pentru intersectie (intersectia a doua multimi A i B, reprezinta multimeaformata din elementele comune celor doua multimi);- pentru diferenta (prin diferenta dintre multimile A i B se intelege multimea formata din elementele muiJimii A care nu sunt i elemente ale multimii 8_).Mai avem Ia dispozitie i operatori relationali:in pentru apartenenta;< > pentru a testa daca doua multimi sunt diferite (nu contin aceleai elemente);= pentru a testa daca o multime include alta muiJime.5.3.3. Constantein primul program al acestui paragraf se define te o constanta de tip multime. Aceasta se declara prin definirea tipului multime, urmat de semnul'= ', dupa care se trece valoarea multime sub forma de constructor.Elementele unei multimi nu pot fi scrise i nici citite In mod direct. Pentru aputea realiza aceste operatii se recurge Ia mici artificii.Cum citim o variabila multime?Pentru a realiza acest lucru se procedeaza astfel: variabila multime se initializeaza (acesteia i se atribuie multimea vida); se cite te un element (intr-o variabila avand acelai tip ca tipul de baza al multimii); elementul citit este privit ca multime cu un singur element, iar aceastamultime se reune te cu multimea care se cite te; se cite te un alt element cu care se procedeaza Ia fel, pana cand au fost citite toate elementele.Pentru a realiza tiparirea, element cu element, a unei multimi se procedeaza astfel: se considera o variabila de acelai tip cu tipul de baza al multimii; aceasta variablla este folosita (ca variabila de ciclare) in constructia unuiciclu FOR care are ca valoare initiala prima valoare posibila a multimii i cavaloare finala, ultima valoare posibila a multimii.. Ia fiecare pas se testeaza daca valoarea de ciclare apartine : au nu multimii(in caz afirmativ aceasta se tipare te).Programul care urmeaza cite!?te doua multimi A !?i B dupa care tipare!?te reuniunea, intersectia si diferenta celor doua multimi. Elementele celor doua muiJimi sunt numere naturale cuprinse lntre 0 !?i i55.program mull;type m int=set of o ..255;var a,b,c:m int;m,n,i,nr:integer;begin write(card(a)='); readln(m);a:=[];for i:=l to m dobeginwrite('elementul ',i, ');readln(nr);a:=a+[nr]end;writeln(multimea A');for i:=O to 255 doif i in a then writeln(i);readln; write(card(b)='); readln(n);b: = [] ;for i:=l ton dobeginwrite('elementul i,' ');readln(nr);b:=b+[nr];end;writeln('multimea B');for i:=l to 255 doif i in b then writeln(i);readln;c:=a+b;writeln ('multimea reuniune);for i:=l to 255 doif i inc then writeln(i);readln; c:=ab;writeln('multimea intersectie');for i:=l to 255 doif i inc then writeln(i);readln;c: =a-b;writeln('A-B');for i:=l to 255 doif i inc then writeln(i);readlnend.Observatii: Nu orice tip de baza al unei multimi poate fi citit sau tiparit (exemplu: tipulenumerare). Pentru cazuri in care avem de citit sau scris multimi cu ace.ste tipuri de baza se recurge Ia urmatoarele artificii:Citirea. Se cite!?te, de exemplu, o variabila de tip string !?i in functie devaloarea citita se reune!?te multimea care trebuie citita cu elementul corespunzator cuvantului citit.Scrierea. Se tipare!?te un cuvant corespunzator elementului care trebuie tiparit. De Ia matematica, stim ca o multime are elemente distincte. Orice variabila de tip multime va avea numai elemente distincte. De fapt, nici nu poa::e fialtfel. 0 multime se construie!?te utilizand numai operatii cu multimi care au ca rezultat multimi. Sa presupunem ca atunci cand se ruleaza programulMUL1, Ia citirea mul"timii A se introduce de doua ori elementul 2. La fiecare introducere, multimea A este reunita cu acel element, deci se va reuni multimea A de doua ori cu elementul 2. Rezulta ca multimea nu va contine decat o singura data elementul 2 (In caz contrar nu se efectueaza corect operatia de reuniune). Acest fapt nu este lipsit de importanta. Sa presupunem ca dorim sa !?tim cate litere distincte are un cuvant. Este suficient sa construim multimea literelor lui. Cum o litera nu poate figura de doua ori intr-o multime de litere, numarul de elemente al multimii va fi egal cu numarul de litere distincte ale cuvantului.5.3.4. Constante de tip multimein primul program propus in acest paragraf am definit o constanta de tip multime. Declararea unei constante se face prin declararea tipului ei, urmat de semnul egal, dupa care se scrie constructorul multime.De!?i tipul multime este folosit rar In scrierea programelor, sunt cazuri cand este de maxim folos. De exemplu, daca dorim sa !?tim daca o variabila de tip string contine numai litere (test alfabetic), se verifica apartenenta fiecarui caracter Ia multimea literelor. Ganditi-va cum ar arata un program C!are face un astfel de test tara a utiliza tipul multime.Programul MUL2 numara vocalele dintr-un text citit.program mul2;const v:set of char=['a','e','i','o','u','A','E','I','O','U'];var a:string;i,s:integer;beginwrite(' Dati textul ');readln(a);s:=o;for i:=l to length(a) doif a[i] in v then s:=s+l;writeln('avem ,s, vocale' );end.5.4. Aplicatii Ia capitolul 5Aplicatii asupra tipurilor de date structurate5.4.1. Tipul ARRAY1. Sa se citeasca 9i sa se tipareasca un vector cu componente de tip CHAR.2. Sa se citeasca 9i sa se tipareasca o matrice cu componente de tip REAL.3. Se cite!?te un numar natural N. Sa facem conversia acestui numar in baza2. Cifrele de 1 sau 0 se vor retine intr-un vector. Sa se tipareasca vectorul(atentie, nu se vor tipari cifrele zero nesemnificative).4. Aceea!?i problema ca precedenta pentru conversia in baza 16.5. Se cite!?te un numar intreg N (atentie, poate fi !?i negativ). Sa se converteasca in cod complementar pe 16 pozitii binare. Cifrele de 1 sau 0 se vor retine intr-un vector. Sa se tipareasca rezultatul.6. Se cite!?te un numar natural N (citirea se va face Tntr-o variabila de tipINTEGER). Sa se scrie acest numar Tntr-un vector.Exemplu: Citim 1231. Vom avea V[1] = 1, V[2] = 2, V[3] = 3, V[4) = 1.7. Se cite!?te un vector 'Cu n componente numere naturale. Sa se tipareasca eel mai mare divizor comun al celor n numere.8. Se cite!?te un vector cu componente numere naturale. Sa se tipareasca numarul cifrelor de 0 cu care se termina numarul format din produsul celor n componente.9. Sa se calculeze 2 Ia puterea 100;10.Un numar natural se retine intr-un vector astfel inc at fiecare componenta a vectorului contine o citra a numarului. Exemplu: daca vectorul V are 5 componente iar numarul este 128, V[1]=0, V[2)=0, V[3]=1, V[4]=2, V[5] = 8. Sa se Tnmulteasca numarul cu un alt numar natural format dintr-o singura citra.11. Aceea!?i problema ca precedenta, insa deinmultitul are mai multe cifre!?i este reprezentat Tntr-un vector. -12. Se citesc intr-un vector n numere naturale: a 1, a2, ..., an. Sa se calculeze:S 1 =a 1 + a2 + ... +an;52= a 1 *a2 + ... +a 1 *an+ a2 *a3 + ... + a2 *an+ ... + an-1 *anSn=a1 *a2* ...*an.13. Se cite!?te un vector cu n componente numere naturale distincte. Acestea alcatuiesc o multime de numere naturale. Se cere sa se tipareascatoate submultimile acestei multimi.14. Se citesc doi vectori cu componente numere naturale. Fiecare vector are elementele sortate crescator. Se cere sa se construiasca un al treilea vector care contine componentele celor doi In ordine crescatoare. Aceasta este problema interclasarii !?i are o mare importanta practica.15. Se considera un vector cu componente numere naturale distincte i sortate crescator. Se cite!?te un numar natural M. Se cere sa se precizeze daca numarul citit se gase te sau nu lntre componentele vectorului considerat, iar In caz afirmativ sa se tipareasca indicele componentei care 11 contine (cautare binara).16. Se considera F un polinom de gradul n, unde cei n + 1 coeficienti sunt retinuti lntr-un vector. Se cite te o valoare reala a. Sa se tipareasca F(a).17. Se dau doua polinoame ai caror coeficienti sunt retinuti In doi vectori. Sa se calculeze coeficientii produsului celor doua polinoame.18. Se considera un vector care contine n numere naturale. Sa se tipareasca o submultime a acestora a carei suma se divide cu n.19. Tipariti suma elementelor aflate deasupra diagonalei principale a unei matrice patratice.20. Tipariti suma elementelor aflate sub diagonala principa