TPcurs1

  • Upload
    perion1

  • View
    30

  • Download
    0

Embed Size (px)

Citation preview

Limbajul de programare Turbo Pascal si prelucrarea statistica a datelor experimentaleProf.univ.dr. Ani soara Constantinescu Facultatea de Fizic a a Universit at ii din Bucure sti February 4, 2008

2

Cuprins1 INTRODUCERE 7

Editorul Turbo Pascal 1.1 ....................7 Unit at i lexicale 1.2 . . . . . . . . . . . . . . . . . . . . . . . . . 11 Structura programelor n Turbo Pascal 1.3

. . . . . . . . . 13

TIPURI DE DATE (1) 172 2.1 Integer, Real, Char, Boolean . . . . . . . . . . . . . . . . . . . 17 2.1.1 tipul INTEGER . . . . . . . . . . . . . . . . . . . . . . 17 2.1.2 tipul REAL . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.3 tipul CHAR . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.4 tipul BOOLEAN . . . . . . . . . . . . . . . . . . . . . 20 2.2 enumerare, interval . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.1 tipul enumerare . . . . . . . . . . . . . . . . . . . . . . 21 2.2.2 tipul interval . . . . . . . . . . . . . . . . . . . . . . . 21

EXPRESII3

23

3.1 Operatori, nivele de prioritate . . . . . . . . . . . . . . . . . . 23 4 INSTRUCT IUNI 27 4.1 atribuire, procedur a, goto . . . . . . . . . . . . . . . . . . . . 27 4.1.1 instruct iuni de atribuire . . . . . . . . . . . . . . . . . 28 4.1.2 instruct iuni de apelare a unei pro ceduri . . . . . . . . . 28 4.1.3 instruct iunea goto . . . . . . . . . . . . . . . . . . . . 29 4.2 READ, WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.2.1 READ, READLN . . . . . . . . . . . . . . . . . . . . 29 4.2.2 WRITE, WRITELN . . . . . . . . . . . . . . . . . . . 30 4.3 Instruct iuni structurate . . . . . . . . . . . . . . . . . . . . . . 32 3

4

CUPRINS 4.3.1 instruct iunea compus a . . . . . . . . . . . . . . . . . . 33 4.3.2 instruct iunea condit ional a . . . . . . . . . . . . . . . . 33 4.3.3 instruct iuni repetitive . . . . . . . . . . . . . . . . . . 38

5 TIPURI DE DATE (2) 47 5.1 set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.2 array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.2.1 Tablouri cu o dimensiune . . . . . . . . . . . . . . . . . 50 5.2.2 Tablouri cu mai multe dimensiuni . . . . . . . . . . . . 51 5.2.3 Constantele tablou multidimensionale . . . . . . . . . . 51 5.3 string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.4 record . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 5.4.1 Instruct iunea WITH . . . . . . . . . . . . . . . . . . . 65 5.4.2 Constante de tip RECORD . . . . . . . . . . . . . . . 66 5.5 file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.5.1 Conceptul de fi sier . . . . . . . . . . . . . . . . . . . . 67 5.5.2 Scrierea fi sierelor . . . . . . . . . . . . . . . . . . . . . 68 5.5.3 Citirea fi sierelor . . . . . . . . . . . . . . . . . . . . . . 69 5.5.4 C ateva proceduri pentru manipularea fi sierelor . . . . . 69 5.5.5 Funct ii standard asupra fi sierelor . . . . . . . . . . . . 70 5.5.6 Fi siere de tip Text . . . . . . . . . . . . . . . . . . . . 72 6 PROCEDURI S I FUNCT II 77 6.1 Proceduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.1.1 Variabile lo cale si globale . . . . . . . . . . . . . . . . . 79 6.1.2 Domeniul de valabilitate al obiectelor . . . . . . . . . . 81 6.1.3 Parametri . . . . . . . . . . . . . . . . . . . . . . . . . 82 6.2 Funct ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 6.3 Parametri funct ii si parametri proceduri . . . . . . . . . . . . 93 6.4 Definit ii recursive. . . . . . . . . . . . . . . . . . . . . . . . . . 98 7 UNIT-uri Turbo Pascal 101 7.1 GRAPH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.1.1 Init ializare mod grafic . . . . . . . . . . . . . . . . . . 106 7.1.2 Erori grafice . . . . . . . . . . . . . . . . . . . . . . . . 108 7.1.3 Definire ferestre . . . . . . . . . . . . . . . . . . . . . . 108 7.1.4 Reprezentare puncte . . . . . . . . . . . . . . . . . . . 110

CUPRINS

5

7.1.5 Reprezentare linii, culori, stiluri si grosimi, deplasarea n fereastra grafic a . . . . . . . . . . . . . . . . . . . . 111 7.1.6 Reprezentare cerc, arc de cerc, elips a, sector de cerc, model de umplere a suprafet elor nchise . . . . . . . . . 113 7.1.7 Reprezentare poligoane . . . . . . . . . . . . . . . . . . 115 7.1.8 Scrierea grafic a . . . . . . . . . . . . . . . . . . . . . . 117 8 Statistic a 123 8.1 Valoare medie, variant a, abatere standard, uctuat ie . . . . . 123 8.2 Propagarea erorilor . . . . . . . . . . . . . . . . . . . . . . . . 125 8.3 Distribut ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 8.3.1 Distribut ia normal a . . . . . . . . . . . . . . . . . . . . 128 8.3.2 Distribut ia Poisson . . . . . . . . . . . . . . . . . . . . 131 8.4 Metoda celor mai mici p atrate pentru o dreapt a . . . . . . . . 134 8.5 Mcmmp pentru o parabol a si pentru un polinom de grad 3 . . 138

6

CUPRINS

Capitolul 1 INTRODUCERELimba jul PASCAL este un limbaj de programare de nivel nalt, proiectat de Niklaus Wirth de la Universitatea Tehnic a din Zurich n 1971 si numit astfel n cinstea lui Blaise Pascal, celebrul matematician si filozof francez. TURBO PASCAL cont ine o serie de facilit at i fat a de limbajul PASCAL: mediu integrat, ordonare liber a a sect iunilor in partea de declarat ie a programului, etc.

1.1 Editorul Turbo PascalEditorul Turbo Pascal se activeaz a tast and turbo si ENTER. Pe ecran apare urm atoarea figur a: FILE EDIT SEARCH RUN COMPILE ... program conversie; ... F1 HELP F2 SAVE F3 OPEN ALT-F9 COMPILE F10 MENU Primul r and cont ine un meniu. El este activat ap as and tasta F10 si deplas andu-ne cu tastele s aget i la st anga sau la dreapta pe una din componente. Ap as and tasta ENTER se deschide o fereastr a cu un submeniu n care 7

8

CAPITOLUL 1. INTRODUCERE

ne deplas am cu tastele s aget i n sus sau n jos p an a la comanda dorit a. Ap asarea tastei ENTER activeaz a comanda selectat a din submeniu. De exemplu ie sirea din editor se face tast and F10, deplas andu-ne pe FILE, tast and ENTER, deplas andu-ne pe EXIT si tast and ENTER ( sau direct cu ALT-X). In r andul de jos sunt date act iunile unor taste ( cel mai des folosite ): F3 OPEN deschide un fi sier cu extensia .PAS din directorul curent, F2 SAVE salveaz a programul n fi sierul curent, ALT-F9 COMPILE compileaz a programul, F10 MENU activeaz a r andul de sus. Alte taste de interes sunt: ALT-F5 determin a ie sirea temporar a din editor pentru a vedea rezultatele unui calcul. Revenirea n editorul TP se face tast and ENTER. ALT-n determin a trecerea n fereastra n (1 0 then begin writeln( intervalul nu contine o radacina ); goto 20; end; 10: c:=(a+b)/2; if f(c)=0 then begin writeln( x= ,c); goto 20; end; if f(a)*f(c) < 0 then b:=c else a:=c;3 2

9

10 CAPITOLUL 1. INTRODUCERE if abs(b-a) < eps then begin writeln( x= ,(a+b)/2); goto 20; end else goto 10; readln; 30: end. 4. Acest program simplific a o fract ie, a/b, (a si b sunt numere ntregi) prin mp art irea cu cel mai mare divizor comun al numerelor a si b. Cel mai mare divizor comun al numerelor ntregi a si b se calculeaz a folosind algoritmul lui Euclid. EX4.PAS program fractie; var a, b, x, y, z : integer; procedure cmmdc; begin if x < y then begin z:=x; x:=y; y:=z; end; while y 0 do {impartiri repetate} begin z:=x mod y; x:=y; y:=z; end; end; {end cmmdc} {programul principal} BEGIN writeln( introdu a si b ca numere intregi, pozitive); read(a,b); writeln( fractia nesimplificata: , a , /, b); x:=a; y:=b; cmmdc; { apelare procedura cmmdc } if x > 1 then { simplificare } begin a:=a div x; b:=b div x; writeln( fractia simplificata: , a, /,b); end else writeln( fractia nu se poate simplifica); end.

1.2

UNIT AT I LEXICALE 1.2. Unit at i lexicale

11

Un program n TP poate fi considerat ca un text care specific a act iunile executate de c atre un procesor. Acest text este format din caractere grupate n unit at i lexicale; acestea constituie cele mai mici unit at i ale programului. Caracterele (simboluri de baz a) folosite n TP sunt: literele alfabetului latin: A...Z, a...z si (subliniere) cifrele arabe: 0...9 simboluri speciale: + - * / = < > { } [ ] . , : ; # $ blanc perechi de caractere: =, :=, ... In Turbo Pascal, n scrierea programului, se pot folosi litere mici sau mari; compilatorul nu face distinct ie ntre ele. Unit at ile lexicale ale unui program n Turbo Pascal sunt: identificatori numere siruri de caractere delimitatori comentarii i) identificatori si cuvinte rezervate Identificatorii noteaz a etichete, constante, tipuri de date, variabile, funct ii, proceduri, unit-uri, programe si c ampuri n nregistr ari. Un identificator poate avea orice lungime dar sunt semnificative doar primele 63 caractere (primele 8 n Pascal standard). De si putem alege oricum identificatorii, e bine ca ei s a fie ale si astfel nc at s a sugereze semnificat ia m arimilor pe care le desemneaz a; de exemplu t sau timp pentru timp, v sau viteza pentru vitez a, l sau lungime pentru lungime. Un identificator trebuie s a nceap a cu o liter a sau cu caracterul (subliniere) si nu poate cont ine blancuri. Dup a primul caracter sunt permise litere, cifre si caractere .

12 CAPITOLUL 1. INTRODUCERE Anumit i identificatori, cunoscut i ca identificatori standard, sunt pre declarat i. Astfel sunt: ABS, ARCTAN, BOOLEAN, CHAR, CHR, COS, EOF, EOLN, EXP, FALSE, GET, INPUT, INTEGER, IN, MAXINT, NEW, ODD, ORD, OUTPUT, PACK, PAGE, PRED, PUT, READ, READLN, REAL, RESET, REWRITE, ROUND, SIN, SQR, SQRT, SUCC, TEXT, TRUE, TRUNC, UNPACK, WRITE, WRITELN, etc. Programatorul poate redefini funct ia lor. Limbajul Turbo Pascal interzice ns a ca anumite cuvinte, numite cuvinte rezervate, s a fie folosite n alt context dec at cel prev azut la definirea limbajului. Cuvintele rezervate nu pot fi folosite ca identificatori. Ele sunt: ABSOLUTE, AND, ARRAY, BEGIN, CASE, CONST, DIV, DO, DOWNTO, ELSE, END, EXTERNAL, FILE, FOR, FORWARD, FUNCTION, GOTO, IF, IMPLEMENTATION, IN, INLINE, INTERFACE, INTERRUPT, LABEL, MOD, NIL, NOT, OF, OR, PACKED, PROCEDURE, PROGRAM, RECORD, REPEAT, SET, SHL, SHR, STRING, THEN, TO, TYPE, UNIT, UNTIL, USES, VAR, WHILE, WITH, XOR ii) numere Pentru numerele care sunt constante de tip ntreg sau real se folose ste notat ia zecimal a obi snuit a. Constantele de tip ntreg trebuie s a fie n domeniul -2147483648...2147483547 (adic a 2 ..2 1). Constantele zecimale 31 31 pot fi scrise cu exponent; ele trebuie s a fie n intervalul 2.9 E-38..1.7E38. O constant a ntreag a hexazecimal a folose ste semnul $ ca prefix. Ea trebuie s a fie n domeniul $00000000..$FFFFFFFF ( 4 octet i ). iii) siruri de caractere. Un sir de caractere este o secvent a de zero ( sirul vid) sau mai multe caractere scris a pe o linie de program si inclus a ntre apostrofuri. Dou a apostrofuri succesive ntr-un sir de caractere semnific a un singur caracter, apostroful, ca n exemplul: youll see.

STRUCTURA13 iv) delimitatori.

PROGRAMELOR

IN

TURBO

PASCAL

1.3.

Delimitatorii servesc la separarea unit at ilor lexicale. Ei pot fi: unul sau mai multe blancuri, comentarii, semne de punctuat ie, operatori, cuvinte rezervate. Intre perechi de identificatori sau numere trebuie s a existe cel put in un separator, spat iile libere (blancuri) nu pot apare n interiorul unit at ilor lexicale cu except ia sirurilor de caractere. v) comentarii. Urm atoarele construct ii sunt comentarii si sunt ignorate de compilator: { Orice text intre acolade este un comentariu } (*Orice text ce contine * in dreapta si stanga parantezelor ronde este un comentariu*) ATENT IE Un comentariu care ncepe cu semnul dolar($) imediat dup a deschiderea cu { sau cu (* este o directiv a de compilare. Astfel {$N-} este o directiv a de compilare cu generare cod software oating point iar {$N+} este o directiv a de compilare cu generare cod 8087 oating point (pentru variabile reale cu precizie nalt a). vi)etichete. O etichet a este o succesiune de cifre n domeniul 0..9999 sau un identificator. Zerourile din fat a nu sunt semnificative. Etichetele sunt folosite cu instruct iuni GOTO.

1.3 Structura programelor n Turbo PascalDiagrame de sintax a. Reprezentarea sintaxei prin diagrame de sintax a utilizeaz a ca grafic a:

dreptunghiuri pentru desemnarea categoriilor sintactice ovaluri sau cercuri pentru cuvintele cheie sau simbolurile terminale Ca exemplu, structura unui program n Turbo Pascal se poate reprezenta

14 CAPITOLUL 1. INTRODUCERE astfel: . program - antet program - ; bloc Un program este compus dintr-un bloc precedat de un antet. antet program -

identificator program

-

PROGRAM

Un blo c cont ine o parte declarativ a care define ste propriet at ile datelor folosite de program si o parte executabil a care specific a act iunile asupra datelor conform algoritmului de calcul.-

parte declarativ a - parte executabil a - blo c

Obiectele (etichete, constante, tipuri de date, variabile, proceduri, funct ii) declarate n partea declarativ a a blocului sunt lo cale acestui bloc. Dau mai jos diagrama de sintax a a p art ii declarative a unui program n Pascal. - parte declarativa declarare etichete-

definire constante definire tipuri declarare variabile declarare pro ceduri si functii

In Turbo Pascal declarat iile sunt scrise n orice ordine (spre deosebire de Pascal standard unde ordinea declarat iilor este strict a si precizat a de diagrama de sintax a de mai sus).

STRUCTURA15

PROGRAMELOR

IN

TURBO

PASCAL

1.3.

Diagramele de sintax a pentru fiecare din sect iunile de mai sus sunt:

declarare etichete -

6

-

-

etichet a LABEL ,

;

Exemplu: LABEL 1, 5, unu, cinci; { singurele etichete permise in program sunt 1, 5, unu, cinci } Fiecare etichet a trebuie s a marcheze doar o singur a instruct iune. definire constant a 6 -; -

definire constant a CONST

Exemplu: CONST n=10; eps=0.1E-05;

definire tip

-

-

definire tip6

-

; - TYPE

Exemplu: TYPE vara=(iunie, iulie, august); litera=..Z; matricep=ARRAY[1..n, 1..n] OF REAL; declarare variabile 6 -; -

declarare variabile VAR

Exemplu: VAR i, j : INTEGER; sezon :vara; lit : litera; a, b, c :REAL; Diagrama de sintax a a p art ii executabile a unui program n Turbo Pascal

16 CAPITOLUL 1. INTRODUCERE este:6 -

instruct iune

-

BEGIN ;

END

Exemplu de program simplu n Turbo Pascal: EX5.PAS PROGRAM cerc; { antetul programului } { calculeaza aria cercului de diametru dat } {partea declarativa} CONST pi = 3.14158; { definirea constantei pi } VAR diam, arie : REAL; { declararea variabilelor diam si arie de tip real } { partea executabila } BEGIN write ( introdu diametrul ); { scrie mesaj pe ecranul de lucru} readln ( diam ); { citire valoare diametrul cercului introdusa de la tastatura } arie := pi * SQR(diam)/4.0 { calcul arie } writeln( arie=,arie); { afisare rezultat pe monitor } readln; { ramane in ecranul de lucru } { tasteaza ENTER pentru a reveni in ecranul de editare } END.

Capitolul 2TIPURI DE DATE (1) 2.1 Tipuri de date nestructurate predefinite: INTEGER, REAL, CHAR, BOOLEANIn memoria calculatorului, la nivel de cod ma sin a, datele se reprezint a ca siruri de cifre binare. Trecerea de la datele de intrare la aceast a reprezentare binar a si invers, trecerea de la reprezentarea intern a a datelor la cea a datelor de ie sire, nu ne intereseaz a n detaliu; pentru calculator informat ia asupra acestei transform ari e dat a de tipul de date. Un tip de date define ste o mult ime finit a de valori si o mult ime finit a de operat ii asociate. Fiec arei date i se asociaz a un tip unic. In limba jul PASCAL se pot defini tipuri de date structurate pe baza unor tipuri de date nestructurate si a unor tipuri definite de programator. Exist a patru tipuri de date nestructurate reprezentate prin identificatorii de tip predefinit i: INTEGER, REAL, CHAR, BOOLEAN.

2.1.1 tipul INTEGERTipul INTEGER reprezint a o submult ime a mult imii numerelor ntregi dependent a de implementare. In Turbo Pascal exist a 5 tipuri ntregi predefinite si anume:

17

TIPURI DE DATE (1)18 CAPITOLUL 2. Tip Domeniu memorie shortint -128..127 8-bit cu semn integer -32768..32767 16-bit cu semn longint -2147483648..2147483647 32-bit cu semn byte 0..255 8-bit f ar a semn word 0..65535 16-bit f ar a semn Operat iile aritmetice cu operanzi de tip ntreg folosesc precizia 8-bit, 16bit sau 32-bit conform urm atoarelor reguli: tipul unei constante de tip ntreg este predefinit tip ntreg cu domeniul cel mai mic care include valoarea constantei ntregi. pentru un operator binar, ambii operanzi sunt convertit i la tipul lor comun nainte de operat ie. Tipul comun este predefinit ca tipul ntreg cu cel mai mic domeniu care include toate valorile posibile ale ambelor tipuri. Operat ia este realizat a folosind precizia tipului comun si tipul rezultatului este tipul comun. expresia din partea dreapt a a unei instruct iuni de atribuire este eva luat a independent de domeniul si tipul variabilei din st anga. dac a rezultatul operat iei ntre valori ntregi se situeaz a n afara domeniului reprezent and tipul ntreg apare o eroare n faza de execut ie a programului. operatorii binari pentru operanzi ntregi sunt: +, -, *, DIV, MOD funct ii pentru operanzi ntregi sunt: ABS, SQR operatorii relat ionali sunt: =, , >=, , < tipul ntreg define ste o succesiune ordonat a de valori deci pentru fiecare valoare (cu except ia capetelor intervalului ) se pot defini un succesor si un predecesor cu funct iile: SUCC(x)=x+1 PRED(x)=x-1

2.1. INTEGER, REAL, CHAR, BOOLEAN 19

2.1.2 tipul REALTipul REAL reprezint a o submult ime finit a a numerelor reale. In Turbo Pascal exist a 5 tipuri reale predefinite dar n directiva de compilare {$N-} selectat a implicit, vom lucra doar cu variabile de tip real c arora li se aloc a 6 octet i/variabil a, au domeniul de valori 2.9 E-38..1.7E38 si 11-12 cifre semnificative. operatorii binari pentru tipul REAL sunt: +, -, *, / funct iile standard sunt: ABS, SQR, LN, EXP, SQRT, SIN, COS, ARCTAN funct iile de transfer sunt: TRUNC pentru conversia n ntreg cu trunchierea p art ii fract ionare a argumentului si ROUND pentru conversia n ntreg cu rotunjirea p art ii fract ionare a argumentului ROUND(x) = TRUNC(x+0.5) pentru x>=0 ROUND(x) = TRUNC(x-0.5) pentru x B funct ii matematice: sin, cos, arctan, exp, ln, sqrt, A = {real, integer}, B = {real} abs, sqr, A = {real, integr }, B = A funct ii de transfer: trunc, round, A = {real}, B = {integer} funct ii scalare: ord, A = {integer, char, enumerare, interval}, B = {integer} pred, succ, A = {integer, char, enumerare, interval }, B = A chr, A = {integer }, B = {char } EX7.PAS program operatii; var i, j, k, l, m, sl, sr : integer; n, o :byte; begin i := $123; j :=$ff; k:= i and j; writeln (i, and , j, = , k); l:= i or j; writeln(i, or , j, = , l); m:= i xor j; writeln(i, xor , j, = , m); n:=$34; o:= not n; writeln( not , n, = , o); sr:= $34 shr 4; writeln(shr $34 = , sr); sl:= $34 shl 4; writeln(shl $34 = , sl); end.

Capitolul 4 INSTRUCT IUNIDiagrama de sintax a pentru o instruct iune este urm atoarea:6 6

instruct iune simpl a-

-

: etichet a-

instruct iune I/O-

instruct iune structurat a -

4.1 Instruct iuni simpleDiagramele de sintax a pentru instruct iunile simple sunt urm atoarele: instruct iune simpl a - instruct iune de atribuire 6 -

instruct iune pro cedur a instruct iune goto-

27

28

CAPITOLUL 4. INSTRUCT IUNI

4.1.1 instruct iuni de atribuireDiagrama de sintax a pentru instruct iunea de atribuire este urm atoarea: instruct iune de atribuire - := -

expresie - identificator variabil a6

identificator funct ie

Exemple: radian := 1.5; gfr := radian 180.0/pi; grade := trunc(gfr); ( din EX1.PAS ) sau f := sqr(x) sqr(x) - 9 sqr(x) x - 2 sqr(x) + 120 x -130.; ( din EX3.PAS ) Instruct iunea de atribuire nlocuie ste valoarea curent a a unei variabile cu o valoare specificat a ca o expresie. Valoarea expresiei trebuie s a fie de acela si tip sau de un tip compatibil cu tipul variabilei.

4.1.2 instruct iuni de apelare a unei proceduriDiagrama de sintax a a instruct iunii procedur a este urm atoarea: instruct iune procedur a - identificator procedur a 6 -

lista parametrilor actuali

Exemplu cmmdc din EX4.PAS Instruct iunea procedur a specific a activarea unei proceduri notate prin identificatorul pro cedurii. Dac a declararea procedurii cont ine o list a de parametrii formali atunci instruct iunea pro cedur a trebuie s a aibe aceea si list a de parametrii actuali.

4.2. READ, WRITE

29

4.1.3 instruct iunea gotoDiagrama de sintax a a instruct iunii goto este urm atoarea: instruct iune goto-

etichet a goto

Exemple: goto 10; goto 20; goto 30 din EX3.PAS Instruct iunea goto transfer a execut ia programului la instruct iunea ce are ca prefix eticheta referent iat a n instruct iunea goto. La folosirea instruct iunii goto se urm are ste regula ca eticheta referit a n instruct iunea goto s a fie obligator n acela si blo c ca si instruct iunea goto. Cu alte cuvinte nu este posibil a face transfer n sau n afara unei proceduri sau funct ii.

4.2 Instruct iunile de transfer de date: READ, READLN, WRITE, WRITELNIntr-un program n Turbo Pascal se consider a predeclarate fi sierul standard de intrare (INPUT, tastatura) si fi sierul standard de ie sire (OUTPUT, ecranul monitorului).

4.2.1 READ, READLNTransferul datelor din fi sierul standard de intrare n memorie se face prin apelarea pro cedurii READ conform diagramei de sintax a: operat ie simpl a de intrare -( - ) - READ list a variabile list a variabile6 -

variabil a

, Variabilele din list a pot apart ine doar tipurilor simple INTEGER, REAL, CHAR. Prin execut ia operat iei de intrare se preiau valori din fi sierul standard de intrare si se atribuie variabilelor n ordinea dat a de lista de variabile.

30

CAPITOLUL 4. INSTRUCT IUNI

Datele de intrare sunt considerate de program ca un ux continuu; o operat ie de intrare preia o valoare de pe mediul de intrare din punctul imediat urm ator ultimei valori preluate prin operat ia de intrare precedent a. O form a deosebit a a operat iei de intrare are sintaxa:6

READLN

( -

) list a variabile

si se realizeaz a, dup a transferul de valori din fi sierul de intrare la lista de variabile, o pozit ionare la nceputul liniei urm atoare ignor andu-se prin aceasta informat ia r amas a n linia curent a. Procedura READLN f ar a list a de variabile nu realizeaz a un transfer de informat ie ci doar pozit ionarea la nceputul liniei urm atoare.

4.2.2 WRITE, WRITELNOperat ia de ie sire se realizeaz a prin apelarea procedurii WRITE conform diagramei de sintax a: operat ie simpl a de ie sire list a ie sire-

( -

-

) - list a ie sire WRITE-

-

expresie6

, Spre deosebire de lista de intrare ( care este o list a de variabile) n lista de ie sire pot apare expresii. Ca si la intrare datele de ie sire sunt transferate n ux continuu. Ele pot fi structurate pe linii folosind procedura WRITELN cu diagrama de sintax a:6

WRITELN

( -

list a ie sire

)

Forma WRITELN (f ar a list a ie sire ) realizeaz a doar trecerea la linia urm atoare n timp ce WRITELN( lis a ie sire ) scrie n linia curent a valorile

4.2. READ, WRITE

31

expresiilor din list a ie sire dup a care face trecerea la linia urm atoare. o valoare boolean a apare la ie sire sub forma sirului de caractere TRUE sau FALSE o valoare ntreag a apare ca un sir de cifre precedat, eventual, de semnul - (minus) o valoare real a apare la ie sire n virgul a mobil a normalizat a cont in and o mantis a si un exponent. Operat ia de ie sire permite specificarea num arului de pozit ii n care se transfer a valoarea de ie sire. n cazul n care valoarea de ie sire este de tip INTEGER, CHAR sau BOOLEAN se poate specifica un singur parametru si anume lungimea total a a zonei ca o expresie ntreag a. In acest caz valoarea respectiv a va fi plasat a n linia de ie sire aliniat a la dreapta n zona de lungime specificat a. Dac a lungimea zonei este mai mic a dec at lungimea valorii de tip arit, zona va fi extins a pentru a afi sa ntreaga valoare. c and valoarea de ie sire este de tip REAL sunt necesari doi parametri: lungimea total a a zonei si lungimea fract iei. Dac a sunt specificat i ambii parametri, valoarea real a e scris a f ar a exponent, cu punct zecimal si semn n zona rezervat a, aliniat a la dreapta, av and partea fract ionar a rotunjit a la num arul de cifre precizat ca lungime a fract iei. Exemplu: valoarea din memorie x=-15.864 va apare cu WRITE(x:6:1) ca -15.9 Dac a se specific a doar lungimea zonei, valoarea de tip REAL va fi afi sat a normalizat av and mantisa rotunjit a s a ncap a n lungimea total a a zonei minus 6. Exemplu: WRITE(x:8) afi seaz a, pentru aceea si valoare x de mai sus, -1.6 E+01 (unde - este semnul num arului, 1.6 este mantisa iar 01 puterea lui 10 cu care trebuie nmult it a mantisa pentru a avea valoarea din memorie; deci 1.6 10 )1 Diagrama de sintax a este:

32 expresie -

CAPITOLUL 4. INSTRUCT IUNI

6 -

: - lungime zon a-

-

: - lungime fract ie

lungime zon a - expresie lungime fract ie - expresie EX8.PAS

-

program racheta; var ore, min, sec, tzbor : 0..maxint; begin write( dati ora lansarii rachetei in ore/minute/secunde); readln( ore, min, sec ); writeln(lansare , ore:2, /,min:2,/,sec:2); write(dati in secunde durata de zbor a rachetei); readln(tzbor); writeln(durata de zbor: ,tzbor:6, secunde); sec := sec + tzbor; min := min + sec div 60; sec := sec mod 60; ore := ore + min div 60; min := min mod 60; ore := ore mod 24; { afisare moment sosire } writeln( sosire: ,ore:2, /,min:2,/,sec:2); end. Datele, ntregi, cerute de acest program se intro duc fie c ate una pe un r and ( valori numerice pentru or a ENTER, minut ENTER, secund a ENTER) fie toate valorile numerice separate cu blanc pe un singur r and.

4.3 Instruct iuni structurateInstruct iunile structurate sunt construct ii formate din alte instruct iuni executate fie secvent ial ( n instruct iunea compus a ) fie condit ional ( n instruct iunile condit ionale ) fie iterativ ( n instruct iunile repetitive ).

4.3. INSTRUCT IUNI STRUCTURATE 33

4.3.1 instruct iunea compus aInstruct iunea compus a reprezint a o secvent a de instruct iuni considerat a ca un tot si executat a n ordinea n care sunt scrise instruct iunile n secvent a. Instruct iunile din secvent a sunt separate prin ; si ncadrate n parantezele de instruct iune BEGIN si END conform diagramei de sintax a: instruct iune compus a 6

instruct iune

-

-

BEGIN ;

END

Instruct iunea compus a este tratat a sintactic ca o singur a instruct iune. Partea executabil a a unui program poate fi astfel considerat a ca o singur a instruct iune compus a.

4.3.2 instruct iunea condit ional aO instruct iune condit ional a selecteaz a pentru execut ie o singur a instruct iune ( sau nici o instruct iune ) din instruct iunile sale componente. instruct iunea IF Diagrama de sintax a a instruct iunii IF este urm atoarea:-

expresie 6

-

instruct iune 1

-

IF

THEN

-

-

instruct iune 2

-

ELSE

n care expresie este o expresie boolean a ce trebuie s a dea un rezultat de tip boolean. Dac a rezultatul evalu arii expresiei este TRUE se execut a instruct iune1. Dac a rezultatul evalu arii expresiei este FALSE si este prezent ELSE se execut a instruct iune2. Dac a rezultatul evalu arii expresiei este FALSE si nu este prezent ELSE atunci se trece la instruct iunea urm atoare instruct iunii IF. Atent ie: delimitatorul ; nu trebuie pus naintea lui ELSE deoarece ar duce la terminarea deciziei f ar a a considera si cea de a doua alternativ a.

34

CAPITOLUL 4. INSTRUCT IUNI dac a instruct iune1 sau/ si instruct iune2 sunt formate din mai multe instruct iuni, ele se reprezint a ca instruct iuni compuse n general un ELSE este aso ciat cu cel mai apropiat IF neasociat deja cu un alt ELSE. Ambiguitatea sintactic a ce apare din construct ii ca: if expresie1 then if expresie2 then instruct iune1 else instruct iune2 se rezolv a interpret and construct ia astfel: if expresie1 then begin if expresie2 then instructiune1 else instructiune2 end ( nu era necesar a paranteza begin..end ) sau, n cazul urm sit and pentru interpretarea corect a paranteza begin..end, : if expresie1 then begin if expresie2 then instructiune1 end else instructiune2 ator nece-

Exemple de folosire a instruct iuni IF 1. se consider a trei valori reale pozitive a lungimea maxim a a lui Target, caracterele n exces vor fi trunchiate exemplu: dac a St=abcdef atunci insert(xx, St, 3) d a pentru St valoarea abxxcdef dac a lungimea lui St permite. STR sintaxa: Str(value, St) scop: converte ste valoarea numeric a value ntr-un sir si rezultatul este memorat n St. value - variabil a de tip ntreg sau real

60 CAPITOLUL 5. TIPURI DE DATE (2) st - variabil a tip STRING exemplu: Str(5.25,st) d a st=5.25 VAL sintaxa: Val(St, Var, Code) scop: converte ste expresia de tip string St ntr-o valoare ntreag a/real a n funct ie de tipul lui Var) si o memoreaz a n var. St - tip STRING Var - tip ntreg sau real Code - tip ntreg; dac a nu sunt detectate erori, code are valoarea zero altfel este pozit ionat pe primul caracter ce produce eroarea si valoarea lui var este nedefinit a. exemplu: Val(12.25,var, code) d a var=12.25 si code=0 Funt ii pentru siruri: Copy sintaxa: copy ( St, Pos, Num) scop: d a un sub sir cont in and Num caractere din sirul St ncep and cu pozit ia Pos. St - tip STRING Pos, Num - tip ntreg - dac a Pos > Length(St) funct ia d a un sir vid - dac a Pos + Num > Length(St) funct ia d a doar caracterele din sir - dac a Pos este n afara domeniului 1..255 funct ia d a eroare n timpul execut iei exemplu: dac a St=abcdefg atunci copy(St,4,2) d a sub sirul de iar copy(St, 4, 10) d a sub sirul defg Length sintaxa: length(St) scop: d a lungimea real a a lui St St - tip STRING rezultat - tip ntreg exemplu: length(abcd)=4 Pos sintaxa: Pos(ob j, target) scop: scaneaz a sirul target pentru a g asi sirul obj n target obj, target - tip STRING

5.3. STRING

61

rezultatul este un ntreg si arat a pozit ia n target a primului caracter din ob j; dac a obj nu e g asit, Pos d a valoarea zero exemplu: dac a St este abcdefg atunci Pos(de, St) d a valoarea 4. EX27.PAS PROGRAM sir; VAR s1 : STRING[10]; s2 : STRING[20]; l : INTEGER; BEGIN s1 := turbo; s2 := s1 + pascal; l := length(s2); writeln(s2); writeln( lungimea reala = , l); END. EX28.PAS PROGRAM reversie_sir; VAR str : STRING; i : BYTE; BEGIN write( introdu un sir de caractere:); readln(str); writeln( sirul inversat este:); for i := length(str) downto 1 do write(str[i]); readln; END. EX1311.PAS program test_string; uses crt; var s:string[11]; s1,s2,s5:string[10]; s3,s4:string; v1,v2:string; v3,code:integer; v4:real; c1,c2:string; begin clrscr; s:=optsprezece;s1:=s;s2:=s1;s3:=s; s4:=s;s5:=s1; writeln( var. string[11], s=,s:11);

62 CAPITOLUL 5. TIPURI DE DATE (2) writeln( var. string[10], s1=,s1:10); readln; delete(s1,2,7); writeln( delete(s1,2,7)=,s1:10); delete(s2,12,7);writeln(delete(s2,12,7)=,s2:10); writeln; insert(abc,s3,2);writeln( insert(abc,s3,2)=,s3:10); insert(abc,s5,2);writeln( insert(abc,s5,2)=,s5:10); insert(abc,s4,15);writeln( insert(abc,s4,15)=,s4:10); writeln; v3:=14;str(v3,v1); writeln(v3=,v3:10,; str(v3,v1)=,v1:10); v4:=2.15;str(v4,v2); writeln(v4=,v4:10:3,; str(v4,v2)=,v2:10); writeln; val(v1,v3,code);writeln(code=,code:3); writeln( val(v1,v3,code)=,v3:10); val(v2,v4,code);writeln(code=,code:3); writeln( val(v2,v4,code)=,v4:10:3); writeln; v1:=12bc;v2:=2.1a; val(v1,v3,code);writeln(code=,code:3); writeln( val(v1,v3,code)=,v3:10); val(v2,v4,code);writeln(code=,code:3); writeln( val(v2,v4,code)=,v4:10:3); writeln;readln; c1:=copy(s,2,4); writeln(copy(s,2,4)=,c1:15); c1:=copy(s,length(s)+2,4); writeln(copy(s,length(s)+2,4)=,c1:15); c1:=copy(s,2,18); writeln(copy(s,2,18)=,c1:15); writeln; writeln( pos(opt,s)=,POS(opt,s):15); writeln( pos(opr,s)=,POS(opr,s):15); writeln; writeln(concat(eu am ,s,ani)=,concat(eu am ,s, ani)); writeln( eu am + s + ani= ,eu am + s + ani); readln; end.

5.4. RECORD

63

5.4 Tipul record( nregistrare)Tipul nregistrare este un tip compus format dintr-un num ar de componente, numite c ampuri. Spre deosebire de variabilele de tip ARRAY, c ampurile, elemente ale variabilelor de tip RECORD, pot fi de tipuri diferite. Fiecare c amp are un nume, identificatorul de c amp. Num arul componentelor poate fi fix sau variabil. In primul caz se spune c a avem o structur a fix a, n cel de al doilea caz avem o structur a cu variante. Diagrama de sintax a a definirii tipultui RECORD este urm atoarea:-

lista c ampurilor -

-

RECORD

END

unde lista c ampurilor n structura fix a are diagrama de sintax a:6

list a identificatori separat i cu , - : - tip ;

-

Referirea la o component a din nregistrarea cu structur a fix a se face conform urm atoarei diagrame de sintax a: . - variabil a tip nregistrare Exemple: TYPE data=RECORD an : 1900..2100; {tip interval} luna : (ian,feb, mar, apr, mai, iun, iul, aug, sep, oct, nov,dec); {tip enumerare} zi : 1..31; {tip interval} end; VAR astazi : data; Variabila astazi este o variabil a de tipul nregistrare, definit ca data, componentele ei pot fi selectate astfel: astazi.an, astazi.luna, astazi.zi EX29.PAS-

identificator c amp -

64 CAPITOLUL 5. TIPURI DE DATE (2) PROGRAM exrecord; TYPE data=RECORD an : 1900..2100; luna : (ian, feb, mar, apr, mai, iun, iul, aug, sep, oct, nov, dec); zi : 1..31; end; VAR astazi : data; i, j : BYTE; BEGIN astazi.an := 2003; astazi.luna := nov; astazi.zi :=3; for i := 0 to 11 do if ORD(astazi.luna)=i then j := i + 1; writeln(astazi.zi:2,/,j:2,/,astazi.an:4); END. Not a: dac a dou a variabile de tip nregistrare sunt de acela si tip (ca n exemplul VAR data1, data2 : data;) atunci copierea unei nregistr ari n cealalt a se poate face printr-o singur a instruct iune de atribuire ( data1 := data2). Alte exemple, folosite n grafic a, sunt: TYPE viewporttype=RECORD x1, y1, x2, y2 : integer; clip : boolean; END; TYPE pointtype=RECORD x, y : integer; END; Componentele unei nregistr ari pot fi la r andul lor nregistr ari (tipuri mbricate) ca n exemplul: TYPE data=RECORD an : 1900..2100; luna:(ian, feb, mar, apr, mai, iun, iul, aug, sep, oct,

5.4. RECORD nov, dec); zi:1..31; END; carte=RECORD titlu:ARRAY[1..20] of char; autor:ARRAY[1..15] of char; dateautor:data; END;

65

Declarat ia de variabile VAR c:carte; permite referirea la c ampurile variabilei de tip nregistrare, c, astfel: c.autor[3] reprezint a a 3-a liter a a numelui autorului c art ii c c.dateautor.zi reprezint a ziua na sterii autorului c art ii c.

5.4.1 Instruct iunea WITHInstruct iune WITH permite o referire prescurtat a la c ampurile unei variabile de tip nregistrare. Diagrama de sintax a a instruct iunii este urm atoarea: lista de variabile-

instruct iune - DO WITH

tip nregistrare

separate prin , In cadrul unei instruct iuni WITH, la nt alnirea unui nume de variabil a, prima dat a se testeaz a dac a variabila poate fi interpretat a ca un nume de c amp al unei nregistr ari. Dac a da, variabila va fi interpretat a a sa chiar dac a o variabil a cu acela si nume este de asemeni accesibil a. Iat a un exemplu: TYPE punct=RECORD x, y : integer; END; VAR x: punct; y : integer; ... WITH x DO begin

66 CAPITOLUL 5. TIPURI DE DATE (2) x := 10; y :=25; end; ... x ntre WITH si DO se refer a la variabila de tip punct iar compus a x si y reprezint a c ampurile x.x si x.y Dac a selectarea unei variabile de tip nregistrare necesit unei variabile de tip tablou atunci operat ia este efectuat cutarea instruct iunii situate dup a cuv antul cheie DO. Iat TYPE punct=RECORD x,y : Integer; END; tabel=ARRAY[1..10] of punct; VAR t : tabel; ... WITH t[5] DO begin x := 1; y := 2; end; ... este echivalent a cu t[5].x := 1; t[5].y :=2; n instruct iunea

a efectuarea indicierii a nainte de exea un exemplu:

5.4.2 Constante de tip RECORDDeclararea unei constante de tip nregistrare specific a identificatorul si valoarea fiec arui c amp, incluse n paranteze si separate prin ; Iat a un exemplu: TYPE punct=RECORD x, y : real; END; data=RECORD zi:1..31; luna:1..12;

5.5. FILE

67

an:1900..2100; END; vector=array[0..1] of punct; CONST origine : punct = (x:0.0; y:0.0); linie:vector = ((x:-3.1; y:1.5),(x:5.8; y:3.0)); azi:data=(zi:3; luna:11; an:2003); C ampurile trebuie s a fie specificate n aceea si ordine n care ele apar n definit ia tipului nregistrare.

5.5 Tipul fileIn paragraful 4.2 am v azut c a exist a dou a fi siere standard predeclarate: fi sierul standard de intrare (tastatura) si fi sierul standard de ie sire (ecranul monitorului). Dac a vrem s a citim sau s a scriem date folosind un fi sier de pe discul magnetic atunci trebuie s a definim o variabil a de tip FILE pe care s a o punem n corespondent a cu fi sierul dorit.

5.5.1 Conceptul de fi sierFi sierele constau dintr-o secvent a de componente de acela si tip. Num arul de componente ntr-un fi sier (dimensiunea fi sierului) nu este determinat prin definirea fi sierului. Tipul unui fi sier este definit de cuv antul rezervat FILE OF si urmat de tipul componentelor fi sierului. Componentele unui fi sier pot fi de orice tip except and tipul file. Diagrama de sintax a este urm atoarea: tip fi sier Exemple: TYPE f=file of byte; g=file of real; VAR a,b:f; c:g;-

FILE OF

-

tip

-

68 CAPITOLUL 5. TIPURI DE DATE (2) Corespondent a ntre variabila tip fi sier si numele fi sierului se face apel and procedura ASSIGN(FilVar, Str) unde FilVar este numele variabilei tip fi sier iar Str este numele fi sierului. Exemple: ASSIGN(f,date.in); ASSIGN(g,xdat.out); Dup a asignarea numelui fi sierului variabilei tip fi sier n instruct iunile READ sau WRITE va interveni doar numele variabilei tip fi sier.

5.5.2 Scrierea fi sierelorUn fi sier este preg atit pentru scriere prin apelarea procedurii standard REWRITE(g). Scrierea valorilor n fi sier se face cu procedura WRITE(g, x , ..., x ) unde1 n n

n prima pozit ie apare numele variabilei tip fi sier iar valorile x s a fie de acela si tip cu cel al componentelor fi EX30.PAS program testfile1; TYPE f=FILE OF real; VAR a:f; x:array[1..10,1..5] of real; i,j:byte; BEGIN assign(a,testfile.dat); rewrite(a); for i:= 1 to 10 do for j:= 1 to 5 do begin x[i,j]:=1.*i*j; { 1. transforma i*j intr-o valoare reala} write(a,x[i,j]); end; close(a); END. sierului g.

, ..., x trebuie1

5.5. FILE

69

5.5.3 Citirea fi sierelorPreg atirea unui fi sier pentru citire se face apel and procedura RESET(f). Citirea datelor dintr-un fi sier se face cu procedura standard READ(f,a,b,c) unde variabilele a,b,c trebuie s a fie de acela si tip cu cel al componentelor fi sierului f. EX31.PAS program testfile2; TYPE f=FILE OF real; VAR a:f; x:array[1..10,1..5] of real; i,j:byte; BEGIN assign(a,testfile.dat); reset(a); {citeste datele din fisierul testfile.dat} for i:=1 to 10 do for j:=1 to 5 do read(a, x[i, j]); { scrie datele citite pe ecran, o linie a matricii x pe un rand} for i := 1 to 10 do begin for j := 1 to 5 do write(x[i,j]:6:1); writeln; end; close(a); readln; END.

5.5.4 C ateva proceduri pentru manipularea fi sierelorSEEK Sintaxa: Seek(FilVar, n) Seek mut a pointerul de fi sier la a n-a component a a fi sierului asignat lui FilVar. n este o expresie de tip ntreg. Prima component a a fi sierului are n=0. Extinderea fi sierului asignat lui FilVar se poate face cu pro cedura SEEK n care n are valoarea num arul de componente din fi sier plus unu sau cu Seek(FilVar, FileSize(FilVar))

70 CAPITOLUL 5. TIPURI DE DATE (2) CLOSE Sintaxa: Close(FilVar) Fi sierul asignat lui FilVar este nchis. Close este necesar deschise pentru citire.

si asupra fi sierelor

5.5.5 Funct ii standard asupra fi sierelorEof Sintaxa: Eof(FilVar) Funct ia ntoarce valoarea TRUE dac a pointerul de fi sier este pozit ionat la sf ar situl fi sierului, peste ultima component a a fi sierului. Altfel ntoarce FALSE. FilePos Sintaxa:FilePos(FilVar) Funct ia ntoarce pozit ia curent a a pointerului de fi sier. Prima component a are num arul zero. FileSize Sintaxa:FileSize(FilVar) Funct ia ntoarce num arul de nregistr ari din fi sier. EX32.PAS program testfile3; var f : file of byte; nume : string; i, j : byte; BEGIN write(introdu nume fisier: ); readln(nume); assign(f, nume); rewrite(f); for i := 1 to 15 do begin j := i * i; write(f, i, j); end; close(f); reset(f); while not eof(f) do begin read(f, i, j); writeln(i : 3, j :4);

5.5. FILE

71

end; write(filesize(f)=,filesize(f)); writeln; close(f); reset(f); seek(f, 10); {pozitionare pointer la sfarsitul inregistrarii 10} writeln(filepos(f)=, filepos(f)); {scrie pozitia pointerului in fisier} read(f, i, j); writeln(i, :, j); { scrie inregistrarile 11 si 12} close(f) END. EX210.PAS program test_truncate; var f:file of INTEGER; i,j:integer; BEGIN assign(f,test.int); rewrite(f); for i:=1 to 6 do write(f,i); writeln( fisier inainte de trunchiere); reset(f); while not eof(f) do begin read(f,i); writeln(i); end; reset(f); for i:=1 to 3 do read(f,i); {citeste primele 3 inregistrari} truncate(f); { sterge restul fisierului din pozitia curenta a pointerului de fisier} writeln; writeln( fisierul dupa trunchiere); reset(f); while not eof(f) do begin read(f,i); writeln(i); end; close(f); erase(f); {sterge fisierul test.int din directorul curent} end.

72 CAPITOLUL 5. TIPURI DE DATE (2)

5.5.6 Fi siere de tip TextFi sierele descrise mai sus pot fi scrise sau citite doar ntr-un program n Turbo Pascal nu cu un editor DOS. Fi sierele de tip TEXT pot fi ns a scrise sau citite si n DOS. Fi sierele de tip TEXT sunt structurate n linii, fiecare linie se termin a cu End-Of-Line (EOL) iar fi sierul se termin a cu Enf-Of-File (EOF). Fi sierele de tip TEXT sunt fi siere secvent iale. Operat iile cu caractere se fac cu procedurile READ si WRITE. Liniile din fi sier sunt procesate cu pro cedurile READLN si WRITELN. Sintaxa de declarare a unei variabile de tip fi sier text este: VAR f:TEXT; EX1306.PAS program test_text; var f:text; s:array[1..20] of string; i:byte; nume:string[15]; begin writeln(introdu nume fisier output); readln(nume); assign(f,nume);rewrite(f); writeln(f,textul de inceput); close(f); append(f);writeln(f,text adaugat);writeln(f,text 2); close(f); reset(f); i:=0; while not eof(f) do begin i:=i+1; readln(f,s[i]); writeln(s[i]); {scrie pe ecran randurile din fisier} end; close(f); writeln(i=,i); {scrie pe ecran numarul de randuri din fisier} readln; end. EX33.PAS program testfile4; const n=10; var f : text; nume:string;

5.5. FILE

73

x, y, z, m : array [1..n] of real; xcm, ycm, zcm, mtot, sxm, sym, szm, sm : real; BEGIN write(introdu nume fisier cu x, y, z, m ale celor n puncte materiale) readln(nume); assign(f,nume); reset(f); for i:= 1 to n do readln(f, x[i], y[i], z[i], m[i]); close(f); {scrie pe ecran datele citite} writeln( i x y z m ); for i:= 1 to n do writeln(i:5,x[i]:10:2,y[i]:10:2,z[i]:10:2,m[i]:10:2); sxm := 0; sym :=0; szm := 0; sm := 0; {initializare sume} for i := 1 to n do begin sxm := sxm + x[i] * m[i]; sym := sym + y[i] * m[i]; szm := szm + z[i] * m[i]; sm := sm + m[i]; end; xcm:=sxm/sm; ycm:=sym/sm; zcm:=szm/sm; mtot:=sm; writeln(coordonatele centrului de masa sunt:); writeln(xcm=, xcm, ycm=, ycm, zcm=,zcm); writeln(masa totala=, mtot); readln; append(f); {deschide fisierul si adauga la sfarsitul sau} writeln(f,xcm=, xcm, ycm=, ycm, zcm=, zcm); writeln(f, mtot=, mtot); close(f); END. Urm atorul program citeste din fisierul text lista.in numarul de elevi dintr-o clasa, numarul de teste si elevii cu notele la teste. Ordoneaza alfabetic elevii pastrand informatia despre notele lor si face media Scrie pe ecran informatia citita din lista.in si scrie rezultatele in lista.out program ordstring; uses crt; label unu; var nume:array[1..30] of string[20]; prenume:array[1..30] of string[20]; note:array[1..30,1..10] of byte; aux:string[20]; ivechi:array[1..30] of byte;

74 CAPITOLUL 5. TIPURI DE DATE (2) media:array[1..30] of real; i, j, k, m, n, iaux:byte; s:real; f,g:text; begin clrscr; {introducerea datelor} assign(f,lista.in); reset(f); readln(f,n); readln(f,m); writeln(n:4,m:4); for i:=1 to n do begin readln(f,nume[i],prenume[i]); for j:=1 to m do read(f,note[i,j]); readln(f); end; {scrie datele introduse} writeln(datele initiale sunt:); for i:=1 to n do begin writeln(nume[i], prenume[i]); for j:=1 to m do write(note[i,j]:5); writeln; end; {ordonare alfabetica crescator} for i:=1 to n do ivechi[i]:=i; unu: k:=0; for i:=1 to n-1 do if nume[i]>nume[i+1] then begin aux:=nume[i]; iaux:=ivechi[i]; nume[i]:=nume[i+1]; ivechi[i]:=ivechi[i+1]; nume[i+1]:=aux; ivechi[i+1]:=iaux; k:=k+1; end else if nume[i]=nume[i+1] then if prenume[i]>prenume[i+1] then begin aux:=prenume[i]; iaux:=ivechi[i];

5.5. FILE

75

prenume[i]:=prenume[i+1]; ivechi[i]:=ivechi[i+1]; prenume[i+1]:=aux; ivechi[i+1]:=iaux; k:=k+1; end; if k0 then goto unu; for i:=1 to n do begin s:=0; for j:=1 to m do s:=s+note[ivechi[i],j]; media[i]:=s/m; end; assign(g,lista.out); rewrite(g); writeln(g, elev note media); for i:=1 to n do begin write(g,nume[i]+prenume[i]:40); for j:=1 to m do write(g,note[ivechi[i],j]:3); writeln(g,media[i]:6:2); end; close(g); {altfel nu scrie ultimul rand in fisier!} readln; end. Fisierul lista.in poate arata asa: 10 5 ionescu alexandra 10 10 10 10 10 adam ion 10 9 10 8 9 adam alexandru 56845 andrei violeta 88978 ionescu ioana 10 9 6 9 10 popescu mihai 67851 constantinescu ana

76 CAPITOLUL 5. TIPURI DE DATE (2) 10 8 9 10 8 constantinescu ioan 10 10 10 10 10 matei alexandru 88789 matei marin 96518 Atunci lista.out va arata asa: elev note media adam alexandru 5 6 8 4 5 5.60 adam ion 10 9 10 8 9 9.20 andrei violeta 8 8 9 7 8 8.00 constantinescu ana 10 8 9 10 8 9.00 constantinescu ioan 10 10 10 10 10 10.00 ionescu alexandra 10 10 10 10 10 10.00 ionescu ioana 10 9 6 9 10 8.80 matei alexandrua 8 8 7 8 9 8.00 matei marin 9 6 5 1 8 5.80 popescu mihai 6 7 8 5 1 5.40

Capitolul 6 PROCEDURI S I FUNCT IIPro cedurile si funct iile permit structurarea programelor complexe, fiecare procedur a sau funct ie realiz and complet o sarcin a concret a n cadrul programului n care apare. Fiecare declarat ie de procedur a sau funct ie, ce apare n partea declarativ a a unui program, are un antet urmat de un bloc ( ca n EX3.PAS si EX4.PAS ). O procedur a este activat a printr-o instruct iune de procedur a ( cmmdc din EX4.PAS); o funct ie este activat a ca orice funct ie standard ( f(a) sau f(b) n EX3.PAS).

6.1 ProceduriO declarat ie de procedur a asociaz a un identificator cu un bloc de procedur Diagrama de sintax a pentru cazurile simple, pe care le vom studia, este urm atoarea: declarat ie de procedur a - antet procedur a - ; - corp pro cedur a n care: antet procedur a -

a.

identif. procedur a6

-

PROCEDURE?

lista param.

77

78 CAPITOLUL 6. PROCEDURI S corp procedur a-

I FUNCT II bloc6

FORWARD

In antetul procedurii scriem identificatorul procedurii si, dac a exist a, parametri formali. Pro cedura este apelat a n cadrul programului prin numele ei urmat, dac a exist a, de parametri actuali. In locul blocului poate s a apar a declarat ia FORWARD. Se stie c a una din regulile de baz a ale limba jului este c a locul de definit ie al unui nume trebuie s a precead a textual utiliz arile numelui respectiv. Respectarea acestei reguli nt ampin a greut at i n unele cazuri. De exemplu un program declar a dou a proceduri P si Q ns a P apeleaz a procedura Q si Q apeleaz a pro cedura P. Este clar c a n acest caz oricare ar fi forma programului utilizarea numelui unei pro ceduri precede locul ei de definit ie. Pentru a rezolva aceast a problem a s-a introdus directiva FORWARD prin care se pot separa fizic cele dou a componente de baz a ale declarat iei unei proceduri sau funct ii: antetul si corpul procedurii sau funct iei. Vom avea: PROCEDURE Q(x, y, z : INTEGER); FORWARD; PROCEDURE P(u, v, w : INTEGER); BEGIN ... Q(1, 2, 3) ... END; PROCEDURE Q; { nu se repet a declararea parametrilor lui Q} ... BEGIN ... P(5, 7, 9); ... END; ...

6.1. PROCEDURI

79

6.1.1 Variabile locale si globaleS a amintim programul fract ie din EX4.PAS ce utiliza procedura de calcul al celui mai mare divizor comun (cmmdc) pentru a simplifica o fract ie rat ional a exprimat a ca un raport de dou a numere ntregi, a/b. Deoarece algoritmul lui Euclid, folosit pentru g asirea celui mai mare divizor comun al numerelor a si b, modific a numerele a si b, ele vor fi copiate n x si y. Etapele programului vor fi: citirea si afi sarea num ar atorului a si numitorului b copierea lui a n x si a lui b n y algoritmul lui Euclid cere x > y calculul cmmdc ntre x si y dac a cmmdc > 1 atunci a si b se mpart la el afi sarea num ar atorului si numitorului simplificate EX4P.PAS PROGRAM fractie; {simplificare fractie a/b prin impartire cu cmmdc} VAR a, b, x, y, z : INTEGER; PROCEDURE cmmdc; {calcul cmmdc cu algoritmul lui Euclid} begin if x < y then { asigurare x > y } begin z:=x; x:=y; y:=z; end; while y0 do {impartiri repetate} begin z:=x mod y; x:=y; y:=z; end; end; {end procedura cmmdc} BEGIN {programul principal} writeln(introdu numaratorul si numitorul ca numere intregi pozitive); read(a,b); writeln(fractie nesimplificata: ,a,/,b);

80 CAPITOLUL 6. PROCEDURI S x:=a; y:=b; cmmdc; {apelare procedura cmmdc} if x>1 then {simplificare fractie} begin a:=a div x; b:=b div x; writeln(fractie simplificata: ,a,/,b); end else writeln(fractia nu se poate simplifica); END.

I FUNCT II

In exemplul dat mai sus declarat ia de procedur a nu cont ine partea de declarat ie de aceea toate variabilele, declarate n programul principal, sunt variabile globale. Exist a posibilitatea de a scrie o parte de declarat ie n interiorul procedurii la fel ca n orice program n Turbo Pascal. Identificatorii introdu si n partea de declarat ie a procedurii sunt locali, ei pot fi referit i si cunoscut i numai n blocul n care au fost declarat i, acesta reprezent and domeniul acestor identificatori. Iat a cum arat a programul de mai sus cu variabile locale. EX4S.PAS PROGRAM fractie2; VAR a, b, c : integer; {variabile globale} PROCEDURE cmmdc; VAR x, y, z : integer; {variabile locale} begin x:=a; y:=b; if x < y then begin z:=x; x:=y; y:=z; end; while y 0 do begin z:= x mod y; x:=y; y:=z; end; c:=x; { cmmdc e transmis intr-o variabila globala} end; {end cmmdc} BEGIN {programul principal} writeln(introdu numaratorul si numitorul ca numere intregi pozitive); read(a,b); writeln(fractie nesimplificata: ,a,/,b);

6.1. PROCEDURI cmmdc; {apelare procedura cmmdc} if c>1 then {simplificare fractie} begin a:=a div c; b:=b div c; writeln(fractie simplificata: ,a,/,b); end else writeln(fractia nu se poate simplifica); END.

81

6.1.2 Domeniul de valabilitate al obiectelorFiecare corp de procedur a poate cont ine n partea sa de declarat ie o declarat ie de pro cedur a sau funct ie ( numit a procedur a sau funct ie inclus a sau lo cal a). Prin obiecte nt elegem constante, tipuri, variabile, proceduri, funct ii identificate prin identificatorul aso ciat. Exist a c ateva reguli ce determin a domeniul de valabilitate si durata de viat a ale unui identificator. Ele sunt urm atoarele: 1. domeniul unui identificator l constituie blocul n care a fost declarat si toate blocurile incluse n el 2. dac a un identificator a, declarat ntr-un bloc x, este redeclarat ntr-un bloc y atunci blocul y si blo curile incluse lui se exclud din domeniul de valabilitate al identificatorului a declarat n x EX34.PAS program test_var; var x, y:real; procedure citit_scris; var x, u:real; begin write( introdu x si u, numere reale: ); readln(x, u); writeln( x=,x:5:1; u=,u:5:1); end; begin write( introdu x si y, numere reale: ); readln(x, y); citit_scris; writeln(x=,x:5:1, y=,y:5:1); end.

82 CAPITOLUL 6. PROCEDURI S

I FUNCT II

Dac a am introdus x=1.5, y=2.5 si apoi x=10.5 si u=20.5 pe ecran va apare: x= 10.5 u= 20.5 valorile citite si scrise in procedura citit_scris x= 1.5 y= 2.5 valorile citite inainte de apelarea procedurii si scrise dupa apelarea ei 3. identificatorii de proceduri se supun acelora si reguli de domeniu ca si ceilalt i identificatori, deci o procedur a poate fi folosit a doar n blocul n care ea a fost declarat a si n blocurile incluse n acesta 4. o procedur a se poate referi la ea ns a si (apelare recursiv a) Aceste reguli determin a si durata de viat a a identificatorilor; o variabil a declarat a ca local a ntr-o procedur a exist a numai n timpul execut iei procedurii fiind creat a la activarea procedurii prin alocarea de memorie si distrus a la ie sirea din procedur a prin eliberarea memoriei ocupate.

6.1.3 ParametriFolosirea parametrilor formali permite apelarea acelora si pro ceduri n puncte diferite cu valori diferite ale variabilelor. Un parametru formal reprezint a un obiect local al procedurii. Lista parametrilor formali are diagrama de sintax a urm atoare:

lista param.6

) - ( - declarat ie parametru ;

-

declarat ie parametru-

6

-:

lista identif.6

VAR

id tip

6.1. PROCEDURI

83

Exist a trei feluri de parametri (valoare, variabile, variabile f ar a tip) caracterizat i astfel: 1. un grup de parametri separat i prin virgul a, f ar a a fi precedat i de cuv antul cheie VAR dar urmat i de identificatorul de tip este o list a de parametri valoare 2. un grup de parametri separat i prin virgul a, precedat i de cuv antul cheie VAR si urmat de identificatorul de tip este o list a de parametri variabile 3. un grup de parametri separat i prin virgul a, precedat i de cuv antul cheie VAR dar neurmat de identificatorul de tip este o list a de parametri variabile f ar a tip Act iunea lor este urm atoarea: 1. Un parametru formal valoare act ioneaz a ca o variabil a lo cal a pentru procedur a cu diferent a c a la activarea procedurii si ia valoarea init ial a din parametrul actual corespunz ator. Din aceast a cauz a se mai nume ste si parametru de intrare. Modific arile f acute asupra parametrului formal valoare n procedur a nu afecteaz a valoarea parametrului actual corespunz ator. Parametrul actual trebuie s a fie de un tip compatibil atributiv cu tipul parametrului formal valoare. 2. Un parametru formal variabil a este folosit c and valoarea trebuie transferat a de la procedur a la programul apelant. Parametrul actual corespunz ator n instruct iunea procedur a ( care activeaz a procedura ) trebuie s a fie o referire de variabil a. Orice schimb ari ale parametrului formal variabil a sunt re ectate n parametrul actual. Tipul parametrului actual trebuie s a fie identic cu tipul parametrului formal variabil a (aceast a restrict ie se poate evita prin folosirea unor parametri formali f ar a tip). 3. C and un parametru formal este o variabil a f ar a tip, parametrul actual corespunz ator poate fi orice referire de variabil a indiferent de tipul ei. S a rescriem programul fract ie2 cu pro cedura cmmdc cu parametri valoare si apoi cu parametri valoare si variabile (EX35.PAS si, respectiv, EX36.PAS).

84 CAPITOLUL 6. PROCEDURI S

I FUNCT II

EX4T.PAS PROGRAM fractie3; VAR a, b, c : integer; PROCEDURE cmmdc(x, y:integer);{x si y sunt parametrii valoare} VAR z:integer; begin if x < y then begin z:=x; x:=y; y:=z; end; while y < > 0 do begin z:=x mod y; x:=y; y:=z; end; c:=x; { cmmdc e transmis intr-o variabila globala c} end; { end cmmdc} BEGIN {program principal} writeln( introdu a si b, numere intregi, pozitive); readln(a,b); writeln(fractie nesimplificata: ,a,/,b); cmmdc(a,b); if c > 1 then begin a:= a div c; b:=b div c; writeln(fractia simplificata: ,a,/,b); end else writeln(cmmdc=,c); readln; END. EX4Q.PAS PROGRAM fractie3prim; VAR x, y, c : integer; PROCEDURE cmmdc(x, y:integer);{x si y sunt parametrii valoare} VAR z:integer; begin if x < y then begin z:=x; x:=y; y:=z; end;

6.1. PROCEDURI

85

while y < > 0 do begin z:=x mod y; x:=y; y:=z; end; c:=x; { cmmdc e transmis intr-o variabila globala c} end; { end cmmdc} BEGIN {program principal} writeln( introdu x si y, numere intregi, pozitive); readln(x,y); writeln(fractie nesimplificata: ,x,/,y); cmmdc(x,y); {x si y nu sunt modificati in procedura} if c > 1 then begin x:= x div c; y:=y div c; writeln(fractia simplificata: ,x,/,y); end else writeln(cmmdc=,c); readln; END. EX4C.PAS PROGRAM fractie4; VAR a, b, c :integer; PROCEDURE cmmdc(x, y :integer; VAR w:integer); VAR z:integer; PROCEDURE swap; begin z:=x; x:=y; y:=z; end; {end swap} begin {begin cmmdc} if x < y then swap; while y < > 0 do begin z:=x mod y; x:=y; y:=z; end; w:=x end; {end cmmdc} BEGIN {program principal}

86 CAPITOLUL 6. PROCEDURI S

I FUNCT II

write( introdu a, b numere intregi, pozitive); readln(a, b); writeln( fractia nesimplificata: ,a,/,b); cmmdc(a, b, c); if c > 1 then begin a:= a div c; b:=b div c; writeln(fractie simplificata:, a, /,b); end else writeln(cmmdc=,c); readln; END. Dar adev arata folosire a unei proceduri cu parametri valoare (apelarea ei n diverse locuri din program cu valori de intrare diferite) este ilustrat a de EX37.PAS. Programul converte ste o sum a ( ntre 0 si 999) din cifre n cuvinte. EX35.PAS PROGRAM lei_cuvinte; TYPE suma=0..999; VAR lei:suma; PROCEDURE convincuv(x:suma); {converteste un numar >0 si 0 then begin rang:=suta; unitati(sute); if sute = 1 then write( suta ) else write( sute ); end; {prelucrarea cifrei zecilor} if zeci > 0 then begin rang:=zece; if zeci < > 1 then begin unitati(zeci); write( zeci ); end; end; {prelucrarea cifrei unitatilor} if unitate > 0 then begin rang:=unu; if zeci > 1 then write( si ); unitati(unitate); if zeci - 1 then write(sprezece ); end else if zeci=1 then write( zece ); end {end convincuv} BEGIN {programul principal} write( introdu suma in cifre < 999:); readln(lei); convincuv(lei); writeln( lei); readln; END. Alt exemplu de proceduri cu parametri valoare sunt cele din programul ce realizeaz a trecerea unui num ar real din baza 10 intr-o alt a baz a dat a de utilizator. EX36.PAS program baza;

88 CAPITOLUL 6. PROCEDURI S

I FUNCT II

label 1, 2, 3; const n=100; type sir=array[1..n] of char; var nr:real; ba:byte; ta:char; procedure intgr(nr:real; ba:integer); var de, re, im, i, m:integer; x:sir; a:char; begin i := 1; m := 0; de := trunc(nr); repeat re := de mod ba; im := de div ba; if re >= 10 then x[i] := chr(ord(A)+(re mod 10)) else x[i] := chr(re+48); i := i+1; m :=m+1; de := im; until de=0; for i :=m downto 1 do write(x[i]); write(.); end; {end procedure intgr} procedure frac(nr:real; ba:integer); var de, m, re, i:integer; x:sir; a:char; ra, im:real; begin i := 1; m := 0; de :=trunc(nr); ra := nr-de; repeat im :=ra*ba; re := trunc(im); if re >= 10 then x[i] :=chr(ord(A)+(re mod 10)) else x[i] := chr(re+48); ra := im-re; i := i+1; m := m+1; until m=10; for i:=1 to m do write(x[i]); end; { end procedure frac} BEGIN { programul principal} 1: writeln(introduceti numarul in baza 10 ); read(nr); writeln(introduceti baza in care doriti sa treceti numarul); read(ba); writeln(Numarul scris in baza , ba, este:); intgr(nr, ba); frac(nr, ba); writeln; 2: writeln(doriti reluarea programului?(d/n)); readln(ta); if upcase(ta)=N then goto 3; if upcase(ta)=D then goto 1 else goto 2; 3: readln;

6.2. FUNCT II END.

89

6.2 Funct iiIn afara funct iilor standard programatorul si poate defini funct ii proprii. Diagrama de sintax a pentru declararea unei funct ii este urm atoarea: declarat ie funct ie - antet funct ie - ; - corp funct ie n care: antet funct ie - FUNCTION 6 -

: - tip rez. - id. func. ( - lista par - )

corp funct ie -

-

bloc-

tip rezultat - tip nestructurat

Not a: lista parametrilor formali cont ine doar parametri valoare (ei av and rolul datelor de intrare din declarat ia de procedur a) si parametri variabil a f ar a tip. tip rezultat apare n plus fat a de declarat ia de pro cedur a si specific a tipul rezultatului transmis prin numele funct iei. Corpul funct iei fiind un blo c poate include declarat ii de constante, tipuri, variabile, pro ceduri si funct ii lo cale. In partea executabil a a funct iei trebuie s a apar a cel put in o atribuire prin care se transfer a identificatorului funct iei valoarea rezultatului calculat. Apelarea (activarea) funct iei se face conform urm atoarei diagrame de sintax a:6 -

id. func

( - lista par. actuali - )

90 CAPITOLUL 6. PROCEDURI S

I FUNCT II

Exemple: 1. Un program ce g ase ste pentru ecuat ia: x 9x 2x + 120x 130. = 0. 4

3

2

o r ad acin a n intervalul [ai,bi] dat ( programul rezec4 din EX3.PAS). Acum s a scriem programul ce g ase ste toate cele patru r ad acini reale ale ecuat iei fiind date intervalele n care ele se a a. EX37.PAS PROGRAM rezec4; LABEL zero; VAR a, b : real; i:byte; ai:array[1..4] of real; {limita inferioara a intervalului} bi:array[1..4] of real; { limita superioara a intervalului} FUNCTION f(x:real):real; begin f:=sqr(x)*sqr(x) - 9*sqr(x)*x - 2*sqr(x) + 120.*x - 130. end; PROCEDURE solutie(a,b:real; i:byte); label unu, doi; CONST eps=1.E-05; var c:real; begin unu: c:=(a+b)/2; if f(c)=0 then begin writeln( x(,i:2,)=,c); goto doi; end; if f(a)*f(c) < 0 then b:=c else a:=c; if abs(b-a) 0 then begin writeln( interval dat gresit, reintrodu a si b: ); goto zero; end; ai[i]:=a; bi[i]:=b; end; for i:=1 to 4 do solutie(ai[i], bi[i],i); readln; END. 2. Un algoritm mai general de g asire a r ad acinilor unui polinom este metoda Birge-Vieta (vezi /4/, pag.46-49 ). Programul EX38.PAS folose ste 2 funct ii, b0 si c1 pentru a calcula valoarea polinomului si a derivatei sale pentru o valoare x0. EX38.PAS program Birge_Vieta; label 10, 20, 30; const eps=1.E-05; itermax=30; var x0, x:real; {variabile globale} a,b:array[0..20] of real; i, iter, m, ic:byte; function b0(x:real):real; var j:byte; {variabila locala} begin b[m]:=a[m]; for j:=m-1 downto 0 do b[j]:=b[j+1]*x+a[j]; b0:=b[0]; end; function c1(x:real):real; var k:byte; {variabile locale} c:array[1..20] of real; begin c[m]:=b[m];

92 CAPITOLUL 6. PROCEDURI S

I FUNCT II

for k:=m-1 downto 1 do c[k]:=c[k+1]*x+b[k]; c1:=c[1] end; BEGIN write( introdu gradul polinomului,m=);readln(m); writeln( introdu coef. polinom am*x^m+...+a1*x+a0); for i:=m downto 0 do begin write( introdu a(,i:2,)=); readln(a[i]); end; writeln(polinomul dat este:); writeln(a[m],*x^,m,+,a[m-1],*x^,m-1,+...,a[0]); 30: write( introdu x0 =); readln(x0); for iter:=1 to itermax do begin 20: x:=x0-b0(x0)/c1(x0); if abs(x-x0)k); readln(m,k); c:=fact(m)/fact(k)/fact(m-k); writeln( comb. de ,m:3, luate cate ,k:3, = , c); readln; END.

6.3 Parametri funct ii si parametri proceduriO procedur a sau funct ie poate apela o alt a procedur a sau funct ie dac a aceasta din urm a a fost deja declarat a. Sunt ns a situat ii n care numele si efectul procedurii sau funct iei apelate nu sunt cunoscute la scrierea pro cedurii sau funct iei apelante ci doar n momentul execut iei programului. In aceste cazuri numele procedurii/funct iei apelate va fi transmis ca parametru. Astfel funct ia ce calculeaz a prin metoda Simpson integralab

f (x)dxa

va avea antetul: FUNCTION Simpson(a, b:real; n:integer; f:fct):real; Tipul fct este definit n programul apelant astfel: TYPE fct=function(x:real):real; Parametrii formali funct ii si procedur a pot fi numai parametri de tip valoare. Funct iile si procedurile standard nu pot fi transmise ca parametri actuali. La apelarea unei funct ii/proceduri care are printre parametri formali o funct ie sau pro cedur a, parametrul actual corespunz ator trebuie s a fie un identificator de funct ie sau procedur a. Observat ie: Folosirea parametrilor de tip procedur a sau funct ie se face

94 CAPITOLUL 6. PROCEDURI S

I FUNCT II

sub controlul directivei de compilare {$F+} a sezat a fie nainte de antetul programului fie naintea declar arii funct iei actuale si, n acest ultim caz, se folose ste la sf ar situl declar arii funct iei directiva de compilare {$F-}. Exemple 1. S a se calculeze, folosind metode Simpson, integrala d /2 K()= 1 sin ( )sin ( ) 0 2 2 pentru = 30 si 60 grade. EX40.PAS Program calcul_int_simpson; uses crt; const pi=3.14159; type fct=function(x:real):real; var a, b, t1, t2, t, s1, s2:real; {$F+} function k(x:real):real; begin k:=1/sqrt(1-sin(t)*sin(t)*sin(x)*sin(x)) end; {$F-} function simpson(a, b:real; n:integer; f:fct):real; var s, h:real; i:integer; begin h:=(b-a)/n/2; s:=f(a)+f(b); i:=1; while i 0) polinoamele Legendre P (u) = 1 (u) (m 1)P (u)] m m [u(2m 1)P m 1 m2 cu P (u) = 1 si P (u) = u0 1

Apel recursiv nseamn a folosirea numelui pro cedurii (funct iei) n cadrul textului procedurii (funct iei); apelul recursiv este permis n Turbo Pascal. Puterea recursiv a st a n posibilitatea de a defini o mult ime infinit a de obiecte printr-o declarat ie finit a; un num ar infinit de calcule poate fi descris printr-un program recursiv finit chiar dac a programul nu cont ine repetit ii explicite. Pentru terminarea programului apelarea recursiv a a unei proceduri trebuie condit ionat a fie printr-o condit ie ce la un moment dat devine fals a fie aso ciind procedurii un parametru n si apel and-o recursiv cu parametrul n-1.

6.4. DEFINIT II RECURSIVE.

99

Iat a dou a exemple pentru aceste dou a posibilit at i. 1. Fiind dat un num a ntreg si pozitiv s a se scrie num arul obt inut prin citirea cifrelor num arului dat de la dreapta la st anga (num arul r asturnat). EX43.PAS program nr_rasturnat; uses crt; var m:longint; procedure invers(n:longint); begin write(n mod 10); if n div 10 0 then invers( n div 10); end; begin clrscr; write(introdu numarul intreg: );readln(m); writeln(numarul dat este ,m); wrute(numarul rasturnat este: ); invers(m); readln; end. 2. Introducet i n EX40.PAS forma recursiv a a funct iei fact(n). FUNCTION fact(n:integer):longint; begin if n=0 then fact:=1 else fact:=n*fact(n-1); end; Recursivitatea poate fi ntotdeauna transformat a n iterat ie. In majoritatea cazurilor forma nerecursiv a a unui program este mai eficient a dec at forma recursiv a n ceea ce prive ste timpul de execut ie si memoria ocupat a. Varianta recursiv a este preferat a acolo unde nlocuirea ei cu iterat ia ar cere un efort deosebit sau tehnici speciale de programare, algoritmul pierz andu- si claritatea exprim arii. Un astfel de exemplu n care folosirea funct iei recursive e justificat a este problema partit iilor unui num ar natural N, prin care se nt elege totalitatea posibilit at ilor de exprimare a num arului N ca o sum a de alte numere naturale, fiecare din ele nedep a sind o valoare M.

100 CAPITOLUL 6. PROCEDURI S

I FUNCT II

Algoritmul este urm atorul/1/: se ata seaz a o funct ie P(n, m) num arului de partit ii, valoarea ei fiind dat a de urm atoarele reguli: P(n, m) = 1 dac a m=1 sau n=1 P(n, m) = 1 + P(n, n-1) dac a n m Varianta iterativ a ar fi greoaie n timp ce varianta recursiv simpl a.

a este foarte

EX44.PAS program partitii; uses crt; var l, k:integer; function p(n, m:integer):longint; begin if (n=1) or (m=1) then p:=1 else if nm ); readln(L, K); writeln( numar de partitii p(, L:3,,, K:3,)=, p(L,K)); readln; end. Exemple cunoscute de apelare recursiv a justificat a sunt programele ce rezolv a probleme ca turnurile din Hanoi si asezarea pe tabla de sah a opt regine, probleme descrise n /1/.

Capitolul 7 UNIT-uri Turbo Pascal, unit-ul GRAPHPrimele versiuni ale compilatorului Turbo Pascal nu permiteau scrierea programelor mai mari de 64 kbytes deoarece procesorul 8086 limita dimensiunea unui segment la aceast a valoare. Incep and cu versiunea a 4-a s-a introdus not iunea de unit. Prin unit se nt elege o colect ie de constante, declarat ii de tip si variabile, proceduri si funct ii, care poate fi compilat a separat si care poate fi utilizat a de un program principal sau de un alt unit prin specificarea numelui unit-ului ntr-o claus a uses. Lungimea unui unit r am ane limitat a la 64Kb dar un program poate folosi un num ar arbitrar de unit-uri funct ie doar de memoria disponibil a a calculatorului folosit. Prin utilizarea unit-urilor cre ste viteza de compilare. Exis a opt unit-uri standard n Turbo Pascal, fiecare cu un profil si o structur a bine delimitate: SYSTEM, DOS, OVERLAY, CRT, GRAPH, PRINTER, GRAPH3, TURBO3. Unit-ul System cont ine toate procedurile si funct iile standard din Turbo Pascal. El se ncorporeaz a automat n toate programele f ar a a fi necesar a o clauz a Uses pentru el; Unit-ul Dos cont ine proceduri si funct ii echivalente cu apelurile DOS cele mai obi snuite: citire de date, sistemul de ntreruperi, etc. Folosirea lui se face cu clauza Uses Dos; Unit-ul Overlay permite folosirea tehnicii de scriere a programelor mari din buc at i. Se folose ste cu clauza Uses Overlay;. 101

102 CAPITOLUL 7. UNIT-URI TURBO PASCAL Aceste trei unit-uri se g asesc n fi sierul Turbo.tpl Unit-ul Crt (character) permite utilizarea funct iilor si procedurilor pentru comanda funct ion arii ecranului alfanumeric: stergerea ecranului cu pro cedura clrscr (clear screen), funct iile KeyPressed:boolean; si ReadKey:char; Se folose ste cu clauza Uses crt; dup a antetul programului. Unit-ul Graph cont ine procedurile si funct iile grafice. Acest unit se a a n fi sierul Graph.tpu. Subprogramele din acest unit au nevoie de informat iile din fi sierele *.BGI si *.CHR Unit-ul Graph se folose ste cu clauza Uses Graph; Unit-ul Printer permite redirectarea scrierilor n fi sierul text cu numele lst direct la imprimant a. Unit-urile Graph3 si Turbo3 permit folosirea subprogramelor grafice din versiunea a 3-a a compilatorului Turbo Pascal. Exemplu: Uses Dos, Crt, Graph; Programele n Turbo Pascal permit at at folosirea unit-urilor standard enumerate mai sus c at si scrierea si folosirea unor unit-uri scrise de programator. Structura unui unit este asem an atoare cu a unui program dar exist a c ateva diferent e semnificative. unit identificator unit; interface uses list a de unit-uri; { opt ional } { declaratii publice } implementation uses lista de unit-uri { opt ional } { declaratii locale } { implementarea procedurilor si functiilor } begin { codul de calcul } end. Antetul unit-ului ncepe cu cuv antul rezervat unit urmat de numele unitului (un identificator) ca si un program n Turbo Pascal. Imediat dup a

103 antet urmeaz a cuv antul cheie interface care semnaleaz a nceputul sect iunii interface a unit-ului adic a a p art ii vizibile pentru orice program ce folose ste acest unit. Un unit poate folosi alte unit-uri specific andu-le ntr-o clauz a uses. Clauza uses poate apare imediat dup a cuv antul cheie interface; n acest caz orice constant a sau tip de date declarate n sect iunile interface ale acelor unit-uri poate fi folosit a n sect iunea interface a acestui unit. Clauza uses poate apare imediat dup a cuv antul cheie implementation; n acest caz declarat iile din acele unit-uri pot fi folosite doar n sect iunea implementation. Partea public a a unui unit ncepe cu cuv atul rezervat interface si se termin a la cuv antul rezervat implementation. Aceast a parte este vizibil a oric arui program ce folose ste acest unit. In aceast a sect iune declarat iile de constante, tipuri de date, variabile, proceduri, funct ii pot fi f acute n orice ordine ca si ntr-un program. Procedurile si funct iile sunt declarate aici dar corpul lor se gase ste n sect iunea implementation f ar a a fi necesar a declarat ia forward. A sa dar n interface apare doar antetul procedurilor si funct iilor. Sect iune implementation (partea privat a) a unui unit ncepe cu cuv antul rezervat implementation. Tot ce s-a declarat n interface este vizibil n implementation. Mai mult aici pot fi f acute si declarat ii suplimentare proprii, invizibile pentru programul ce folose ste unit-ul dar folosite la scrierea procedurilor si funct iilor declarate n interface. Exemplu: unit sir; interface type vector=array[1..100] of real; procedure ordonare(x:vector; n:byte; VAR xo:vector); function xmin(x:vector; n:byte):real; function xmax(x:vector; n:byte):real; implementation

104 CAPITOLUL 7. UNIT-URI TURBO PASCAL procedure ordonare; var i, j:byte; aux:real; begin for j:=n-1 downto 1 do for i:=1 to j do if x[i] > x[i+1] then begin aux:=x[i]; x[i]:=x[i+1]; x[i+1]:=aux; end; for i:=1 to n do xo[i]:=x[i]; end; function xmin; var i:byte; xm:real; begin xm:=x[1]; for i:=2 to n do if xm > x[i] then xm:=x[i]; xmin:=xm; end; function xmax; var i:byte; xm:real; begin xm:=x[1]; for i:=2 to n do if xm < x[i] then xm:=x[i]; xmax:=xm; end; end. Salv am fisierul sub numele sir.pas apoi trecem n fereastra COMPILE si schimb am Destination Memory n Destination Disk plas andu-ne pe Destination Memory si tast and ENTER. Compilarea programului din fi sierul sir.pas va conduce la crearea fi sierului sir.tpu Urm atorul program folose ste unit-ul sir pentru a ordona vectorul a si a g asi valorile minim a si maxim a din vector. Num arul de elemente ale vectorului a si valorile elementelor sale sunt citite dintr-un fi sier creat de utilizator astfel: pe prima linie este scris a valoarea lui n iar pe liniile urm atoare valoarea c ate

105 unui element al vectorului a. In total n+1 linii. EX45.PAS program test_unit_sir; uses sir; var a, aord:vector; {tipul vector e definit in unit sir} i, j, n:byte; f:text; nume:string; amin, amax:real; begin write( introdu nume fisier input: ); readln(nume); assign(f, nume); reset(f); readln(f, n); for i:=1 to n do readln(f, a[i]); close(f); writeln( sirul ordonat este: ); ordonare(a, n, aord); for i:=1 to n div 8 do begin for j:=8*(i-1)+1 to 8*(i-1)+8 do write(aord[j]:9:2, ); writeln; end; for i:=n+1 - n mod 8 to n do write(aord[i]:9:3, ); writeln; { pentru a vedea ca vectorul a este parametru valoare si deci nu e mdificat in procedura ordonare, sa-l scriem} writeln( sirul initial este: ); for i:=1 to n div 8 do begin for j:=8*(i-1)+1 to 8*(i-1)+8 do write(a[j]:9:2, ); writeln; end; for i:=n+1 - n mod 8 to n do write(a[i]:9:3, ); amin:=xmin(a,n); amax:=xmax(a,n); writeln; writeln( amin=,amin:9:3); writeln( amax=, amax:9:3); readln; end.

106 CAPITOLUL 7. UNIT-URI TURBO PASCAL

7.1 Unit-ul GRAPHProgramele care utilizeaz a subprogramele din acest unit trebuie s rectiva Uses Graph; dup a antetul programului. Subprogramele din unit-ul Graph realizeaz a: 1. init ializarea modului grafic 2. tratarea erorilor grafice 3. definirea de ferestre si pagini 4. reprezentarea punctelor 5. reprezentarea liniilor 6. reprezentarea de cercuri si alte curbe 7. reprezentarea de poligoane si ha sur ari 8. scrierea grafic a Ecranul grafic pentru plac a VGA (640x480 pixeli) este: (0, 0) (639, 0) a aibe di-

(0, 479) (639, 479)

7.1.1 Init ializare mod graficPentru init ializarea modului grafic se poate folosi: procedure grstart; begin gd:=detect; InitGraph(gd, gm, \TP\BGI); If graphresult grok then halt(1); end;

7.1. GRAPH

107

cu antetul procedurii InitGraph: procedure InitGraph( var gd:integer; var gm:integer; cd:string); n care gd si gm reprezint a codul corespunz ator driverului si modului grafic iar cd reprezint a calea spre fi sierele de grafic a. Variabila gd a fost init ializat a cu constanta predefinit a const detect=0 pentru a se omite apelarea procedurii DetectGraph naintea apel arii procedurii InitGraph. Procedura DetectGraph cu antetul: procedure DetectGraph(var gd, gm:integer); determin a valorile pentru variabilele gd si gm. Funct iile GetMaxX si GetMaxY dau valorile maxime pentru X si, respectiv, Y n modul grafic actual. Pentru placa VGA cu 640x480 pixeli aceste valori sunt respectiv 639 si 479. Funct ia GetDriverName, apelat a dup a activarea procedurii InitGraph, d a numele driverului grafic actual. Antetul ei este: function GetDriverName:string; Funct ia GetGraphMode d a codul mo dului grafic actual. Antetul ei este: function GetGraphMode:integer; Valoarea ei variaz a ntre 0 si 5 n funct ie de driverul grafic actual. Procedura GetAspectRatio d a rezolut ia ecranului grafic din care se poate calcula raportul Xasp/Yasp ce d a alungirea formelor circulare; raportul Xasp/Yasp e necesar la unele rotunjiri n trasarea cercurilor, sectoarelor de cerc, arcelor. Procedurile folosite pentru aceasta sunt: GetAspectRatio(var Xasp, Yasp:word); SetAspectRatio(Xasp, Yasp:word); Revenirea la ecranul alfanumeric se face cu pro cedura CloseGraph EX46.PAS Program verifgraph; Uses dos, graph; Var ggm, gd, gm:integer; Xaspect, Yaspect:word; aspratio:real;

108 CAPITOLUL 7. UNIT-URI TURBO PASCAL gdn:string; Procedure grstart; begin gd:=detect; InitGraph(gd, gm, \tp\bgi); if graphResult grok then halt; end; Begin grstart; ggm:=GetGraphMode; gdn:=GetDriverName; GetAspectRatio(Xaspect, Yaspect); aspratio:=Xaspect/Yaspect; CloseGraph; writeln(graphdriver=, gdn); writeln(graphmode=, ggm); writeln(aspectratio: , aspratio:2:2); readln; End.

7.1.2 Erori graficeErorile n modul grafic sunt returnate de funct ia GraphResult sub forma unui cod de eroare. Dac a codul returnat este zero nseamn a c a operat ia grafic a a reu sit; dac a codul este mai mic dec at zero nseamn a c a operat ia grafic a a e suat. Antetul funct iei este: function GraphResult:integer; C ateva valori predefinite ale funct iei sunt: Const grOK=0; {operat ie grafic a reu sit a, nici o eroare} grNoInitGraph=-1; { grafica BGI neinstalat a cu InitGraph} grNotDetected=-2; {grafica hardware nedetectat a} grFileNotFound=-3; {fi sierul driver *.BGI nu a fost g asit} De notat c a GraphResult e pus la zero dup a ce este apelat a sa c a rezultatul trebuie stocat ntr-o variabil a temporar a pentru a fi testat.

7.1.3 Definire ferestrePentru a defini si lucra cu ferestre, prin fereastr a nt eleg andu-se o zon a dreptunghiular a a ecranului ( n particular tot ecranul), se folosesc pro cedurile:

7.1. GRAPH

109

procedure SetViewPort(x1,y1,x2,y2:integer; clip:bo olean); unde: x1, y1 sunt coordonatele absolute st anga-sus ale ferestrei active x2, y2 sunt coordonatele absolute dreapta-jos ale ferestrei active clip determin a dac a liniile din afara ferestrei sunt sau nu vizibile. Constantele predefinite pentru stabilirea valorii variabilei clip sunt: const clipon=true; {t aierea este activ a; exterior invizibil} clipo =false; {t aierea este pasiv a; exterior vizibil} Pro cedura define ste fereastra grafic a. procedure GetViewSettings(var infofer:ViewPortType); permite obt inerea de informat ii referitoare la fereastra actual a si felul t aierii. Variabila infofer este de tipul predefinit ViewPortType si va cont ine informat ii referitoare la fereastr a. Type ViewPortType = RECORD x1, y1, x2, y2 : integer; clip : boolean; END; procedure ClearDevice; sterge ecranul grafic actual si pozit ioneaz a pointerul n pozit ia (0, 0). procedure ClearViewPort sterge fereastra grafic a actual a. Culoarea ferestrei va fi culoarea de fond; este apelat a procedura rectangle pentru trasarea unui dreptunghi corespunz ator ferestrei si pointerul este mutat n colt ul st anga-sus al ferestrei, punctul de coordonate relative (0, 0). EX47.pAS program ex_viewport; uses graph; var gd,gm,centrux,centruy,i:integer; inf:viewporttype; cx1,cy1,cx2,cy2:string[5]; begin gd:=detect; initgraph(gd,gm,\tp\bgi); centrux:=getmaxx div 2; centruy:=getmaxy div 2; rectangle(centrux-179, centruy-169, centrux+179, centruy-1);

110 CAPITOLUL 7. UNIT-URI TURBO PASCAL setviewport(centrux-180,centruy-170, centrux+180,centruy, clipon); {incercati si clipoff} randomize; readln; for i:=1 to 10 do lineto(random(getmaxx)-180,random(getmaxy)-180); getviewsettings(inf); readln; str(inf.x1,cx1); str(inf.y1,cy1); str(inf.x2,cx2); str(inf.y2,cy2); outtextxy(10,30,cx1); outtextxy(10,50,cy1); outtextxy(10,100,cx2); outtextxy(10,120,cy2);readln; setviewport(0,0,getmaxx,getmaxy,clipon); rectangle(centrux-179,centruy+10,centrux,centruy+170); {a doua fereastra} setviewport(centrux-180,centruy+10,centrux,centruy+170,clipon); randomize; readln; for i:=1 to 10 do lineto(random(getmaxx)-180,random(getmaxy)-180); readln; setviewport(0,0,getmaxx, getmaxy,clipon); rectangle(centrux+10,centruy+10, centrux+181,centruy+171);readln; setviewport(centrux+10,centruy+10,centrux+181,centruy+171,clipon); readln; for i:=1 to 10 do lineto(random(centrux),random(centruy)); readln; clearviewport; readln; cleardevice; readln; closegraph; end.

7.1.4 Reprezentare punctePentru a desena puncte se folose ste procedura: procedure PutPixel(x, y:integer; cul:word); care pune un punct, de culoarea dat a de variabila cul n punctul de coordonate x, y. Variabila cul ia valori ntre zero si valoarea dat a de funct ia GetMaxColor. (max=15 pentru placa VGA). Antet funct ie: function GetMaxColor:word; EX48.PAS program test_pixel; uses graph;

7.1. GRAPH

111

var gd, gm:integer; xMax, yMax, MaxColor:integer; i:word; x, y, culoare :word; procedure grstart; begin gd:=detect; InitGraph(gd, gn,\tp\bgi); if graphresult grOK then halt(1); end; function ranCul:word; begin randCul:=random(MaxColor)+1; end; BEGIN grstart; xMax:=getMaxX; yMax:=getMaxY; MaxColor:=getMaxColor; randomize; i:=0; while i < 100 do begin i:=i+1; putpixel(random(xMax)+1, random(yMax)+1, randCul); end; readln; closegraph; writeln(program executat); END.

7.1.5 Reprezentare linii, culori, stiluri plasarea n fereastra grafic a

si grosimi, de-

Pentru a desena linii se folosesc procedurile: Line(x1,y1,x2,y2:integer): deseneaz a o linie ntre punctele de coordonate (x1, y1) si (x2, y2). Atent ie: pointerul nu r am ane n punctul de coordonate (x2, y2) ci revine la pozit ia (0, 0). Culoarea n care este desenat a linia poate fi stabilit a cu procedura: SetColor(color:word): Culorile de desen merg de la 0 la 15 si sunt funct ie de driverul grafic curent si de modul grafic curent. Ele sunt definite de constantele: CONST

112 CAPITOLUL 7. UNIT-URI TURBO PASCAL black=0; blue=1; green=2; cyan=3; red=4; magenta=5; brown=6; lightgray=7; darkgray=8; lightblue=9; lightgreen=10; lightcyan=11; lightred=12; lightmagenta=13; yellow=14; white=15; blink=128; iar stilul si grosimea se stabilesc cu procedura: SetLineStyle(linestyle:word; pattern:word; thickness:word); Constantele pentru LineStyle sunt: CONST solidln=0; dottedln=1; centerln=2; dshedln=3; userbitln=4; {user-define line style} iar pentru grosime: CONST normwidth=1; thickwidth=3; Variabila pattern este ignorat a c at timp linestyle este diferit de 4. C and linestyle = 4, linia este trasat a folosind un model 16-bit definit de parametrul Pattern. De exemplu dac a pattern=$AAAA atunci mo delul 16-bit arat a astfel: 1010101010101010 {pentru normwidth} 1010101010101010 1010101010101010 1010101010101010 {pentru thickwidth} EX49.PAS program ex_line; uses graph; var gd,gm,i:integer; x1,y1,x2,y2:integer; BEGIN gd:=detect; InitGraph(gd,gm,\tp\bgi); line(0,0,100,0); outtextxy(150,0,standard); setlinestyle(dottedln,0,normwidth); line(0,50,100,50); outtextxy(150,50,dottedline, normwidth); setlinestyle(dottedln,0,thickwidth);

7.1. GRAPH

113

line(0,100,100,100); outtextxy(150,100,dottedline, thickwidth); setlinestyle(userbitln,$c3,thickwidth); line(0,150,100,150); outtextxy(150,150, userbitln, thickwidth); for i:=0 to 3 do begin setcolor(i+2); setlinestyle(i,0,normwidth);line(10,20*i+250,210,20*i+250); setlinestyle(i,0,thickwidth);line(310,20*i+250,510,20*i+250); end; readln; closegraph; end. LineTo(x, y:integer); deseneaz a o linie din pozit ia curent a a pointerului p an a la un punct de coordonate (x, y). Acelea si observat ii pentru culoare si stil ca la pro cedura Line. LineRel(Dx, Dy:integer); deseneaz a o linie din pozit ia curent a a pointerului p an a la un punct definit de distant ele Dx, Dy. Acelea si observat ii pentru culoare si stil ca la pro cedura Line. Deplasarea pointerului n punctul de co ordonate (x, y) se face cu: MoveTo(x, y:integer): Dac a este definit a o fereastr a, valorile (x, y) sunt relative la fereastr a. MoveRel(Dx, Dy:integer); mut a pointerul din pozit ia curent a la un punct definit de distant ele Dx, Dy.

7.1.6 Reprezentare cerc, arc de cerc, elips a, sector de cerc, model de umplere a suprafet elor nchisePentru a desena un cerc, un arc de cerc, un arc de elips a sau un sector de cerc se folosesc urm atoarele proceduri. procedure Circle(x, y:integer; raza:word); deseneaz a un cerc cu centru n punctul de coordonate (x, y) si cu raza dat a. procedure Arc(x, y:integer; ustart, ufinal,r:word); deseneaz a un arc de cerc cu centrul n punctul de coordonate (x, y) si raza dat a ncep and de la unghiul ustart si sf ar sind la unghiul ufinal, ambele unghiuri date n grade si merg and n sens trigonometric. procedure Ellipse(x,y:integer;ustart,ufinal:word;xraza,yraza:word); deseneaz a un arc de elips a, (x, y) sunt coordonatele centrului, ustart, ufinal

114 CAPITOLUL 7. UNIT-URI TURBO PASCAL sunt unghiurile de nceput si sf ar sit luate n sens trigonometric, xraza, yraza sunt axele orizontal a si, respectiv, vertical a ale elipsei. procedure PieSlice(x, y:integer; ustart, ufinal,r:word); deseneaz a si ha sureaz a un sector de cerc. Modelul si culoarea de ha surat sunt definite cu: procedure SetFillStyle(pattern:word; color:word); Mo delul implicit este compact (solid) si culoarea implicit a este culoarea cu cod maxim din palet a. Constantele de ha surare sunt: CONST emptyfill=0; {umple in culoarea de fond} solidfill=1; {umple cu culoare\} linefill=2; {umple aria cu modelul - - -} ltslashfill=3; {umple aria cu modelul /// } slashfill=4; {umple aria cu modelul /// mai groase } bkslashfill=5; {umple aria cu modelul \\\ } ltbkslashfill=6; {umple aria cu modelul \\\ dar mai subtiri} hatchfill=7; {umple aria cu modelul ||| } xhatchfill=8; {umple aria cu modelul xxx } ... ... userfil=12; {modelul e dat de programator } procedure SetFillPattern(pattern:FillPatternType; color:word); umple figura grafic a cu un model definit de programator n culoarea definit a de parametrul color. Type FillPatternType=array[1..8] of byte; Motivul de umplere se bazeaz a pe valoarea celor 8 bytes (octet i) cont inut i n vectorul pattern; fiecare octet corespunde la 8 pixeli de motiv. Dac a un bit are valoarea 1 pixelul are culoarea cernelii, dac a el are valoarea 0 pixelul are culoarea fondului. EX50.PAS program ex_setmodel; uses graph; const dungi:fillpatterntype=($aa,$55,$aa,$55,$aa,$55,$aa,$55); var gd,gm,i:integer;

7.1. GRAPH

115

begin gd:=detect; InitGraph(gd,gm,c:\tp\bgi); setcolor(4); setfillpattern(dungi,3); pieslice(100,100,0,270,100); for i:=0 to 11 do begin setfillstyle(i,i);pieslice(300,200,0,270,100);readln; end; readln; closegraph; end. procedure FillEllipse(x, y:integer; xraza, yraza:word); deseneaz a si ha sureaz a o elips a n culoarea curent a si modelul de ha surare definit de procedurile SetFillStyle sau SetFillPattern.

7.1.7 Reprezentare poligoanePentru a desena poligoane se folosesc urm atoarele proceduri. rectangle(x1, y1, x2, y2:integer); deseneaz a un dreptunghi cu (x1, y1) co ordonatele colt ului st anga-sus (x2, y2) co ordonatele colt ului dreapta-jos Bar(x1, y1, x2, y2:integer); deseneaz a un dreptunghi si l ha sureaz a n culoarea si mo delul stabilite cu procedurile SetFillStyle sau SetFillPattern. (x1, y1) si (x2, y2) au aceea si semnificat ie ca n pro cedura rectangle. Bar3d(x1, y1, x2, y2:integer; ad:word; top:boolean); deseneaz a un paralelipiped dreptunghi si l ha sureaz a n culoarea si modelul curente. (x1, y1) si (x2, y2) au aceea si semnificat ie ca n procedurile rectangle si bar ad este ad ancimea corpului top = TRUE nseamn a c a deasupra paralelipipedului se poate a seza un alt paralelipiped top = FALSE nseamn a c a deasupra paralelipipedului nu se poate a seza alt paralelipiped. Exist a predefinite constantele: CONST topon = TRUE; topo =FALSE; DrawPoly(nrpct:word; var puncte); deseneaz a o linie poligonal a n culoarea si stilul curente.

116 CAPITOLUL 7. UNIT-URI TURBO PASCAL nrpct reprezint a num arul v arfurilor liniei poligonale puncte este un parametru variabil a f ar a tip care cont ine coordonatele fiec arui v arf n linia poligonal a. De notat c a pentru a desena o figur a nchis a cu n v arfuri trebuie s a se transmit a n+1 coordonate si puncte(n+1)=puncte(1) EX51.PAS program ex_poligon; uses graph; const triunghi:array[1..4] of pointtype= ((x:50;y:100), (x:200; y:100), (x:200; y:250), (x:50; y:100)); var gd, gm:integer; BEGIN gd:=detect; InitGraph(gd, gm, \tp\bgi); if graphresult grOK then halt(1); drawpoly(sizeof(triunghi) div sizeof(poittype), triunghi); readln; closegraph; END. Not a: funct ia Sizeof(x) d a num arul de octet i ocupat de argument; x poate fi o referire de variabil a sau un identificator de tip. procedure FillPoly(nrpct:word; var puncte); deseneaz a si ha sureaz a un polinom n culoarea si modelul curente. EX52.PAS program ex_poligon2; uses graph; const triunghi:array[1..4] of pointtype=((x:50;y:100),(x:200;y:100), (x:200;y:250),(x:50;y: