Turbo Pascal Algoritmi Si Limbaje de Programare
Turbo Pascal Algoritmi Si Limbaje de Programare
Turbo Pascal Algoritmi Si Limbaje de Programare
Teora
Tudor Sorin
TU BO PfiSCfiL
Algoritmi i limbajv dv programarcz
Manual pvntru clasa a IX-a
Teora
Teora
CP 79-30, cod 72450 Bucure ti, Romania
Tel.: 619.30.04
Fax: 210.38.28
Distributie
8-dul AI. I. Cuza nr. 39
Tel.: 222.45.33
Fax: 222.45.33
Cuprins
1. Notiunea de algoritm, caracteristici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.1. Obiectele cu care lucreaza algoritmii: date, variabile, expresii,
operatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 11
1.1.1. Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.1.2. Variabile
. . . . .. . . . . . . . . . . . . . . . . . .. . . . . . . . .
11
1.1.3. Expresii .................................. 12
1.1.3.1. Expresii intregi . . . . . . . . . . . . . . . . . . . . . . .
12
1.1.3.2. Expresii reale ........................ 12
1.1.3.3. Expresii logice
...................... 13
1.1.3.4. Expresii de tip !?ir de caractere . . . . . . . . . . . . 13
1.1.4. Operatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.1.4.1. Operatii de intrare-ie!?ire . . . . . . . . . . . . . . . . 13
1.1.4.2. Operatii de decizie . . . . . . . . . . . . . . . . . . . . 14
1.1.4.3. Operatii de atribuire ................... 14
2. Principiile programarii structurate
. . . . . . . . . . . . . . . . . . . . .. . . . . . . . .
15
2.1. Structuri de baza. Descrierea acestora cu ajutorul schemelor logice
15
2.1.1. Operatii de intrare-ie!?ire . . . . . . . . . . . . . . . . . . . . . . .
15
2.1.2. Operatii de atribuire .......................... 16
2.1.3. Operatii de decizie ........................... 16
2.1.4. Reguli de detaliere a unei operatii complexe . . . . . . . . . . 18
2.1.5. Structura alternativa ......................... 18
2.1.6. Structura repetitiva .......................... 19
2.2. Structuri de baza. Descrierea acestora cu ajutorul unui limbaj de tip
pseudocod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.2.1. Prezentarea lirtlbajului ......................... 22
2.2.1.1. Variabile ........................... 22
2.2.1.2. lnstructiuni ......................... 23
2.3. Aplicatii ......................................... 27
3..5.
3.6.
3.7.
3.8.
1 22
122
122
.
123
129
130
130
8.2.
8.3.
8.4.
8.5.
8.6.
. 230
. 230
231
. .
234
. . . . . . . . . . 299
Capitolul 1
I X *X-2, X<O
f(x)
-l
3, x=O
X
+2, X>0
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.
1.1.2. Variabile
In 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
pentru
ca 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 ca
ca
1.1.3. Expresii
Cu ajutorui constantelor, variabilelor i operatorilor se pot construi diverse
xpresii. 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.
Folosesc operatorii +, -, ' (pentru inmul ire), DIV (pentru catul Tmpartirii
intre"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.
Exemple:
a OR b, unde a l?i b sunt variabile logice;
(a> =b)AND(c<d).
Pentru folos-irea corecta a expresiilor logice trebuie sa avem cuno tinte de
logica matematica.
1.1.3.4. Expresii de tip ir de caractere
Se folosesc constante l?i variabile de tip ir de caractere. Singurul operator
permis este operatorul + avand semnificatia de concatenare (scrierea a celor
doua iruri unul dupa altul).
ir de caractere avand
1.1.4. Operatii
Tn linii mari, operatiile care se fac intr-un algoritm se pot clasifica Tn trei categorii:
operatii de intrare-ie ire;
operatii de atribuire;
operatii de decizie.
1.1.4.1. Operatii de intrare-ie ire
Am aratat ca orice algoritm lucreaza cu date de intrare i de ie ire.
Acestea pot fi citite sau scrise.
Prin operatia de intrare (de citire) se Tntelege preluarea unei date de Ia un
dispozitiv de intrare catre memoria interna a calculatorului, Tn spa iul rezervat pen
tru aceasta (spatiul rezervat pentru variabila care prime te ca valoare acea daHi).
Dispozitivele de intrare pot fi urmatoarele:
tastatura (eel mai des utilizata);
unitatea de discheta;
unitatea de disc.
Prin operatia de ie ire (scriere) se in elege trecerea unei date din memoria
interna catre un dispozitiv de ie!?ire.
Dispozitivele de iel?ire pot fi urmatoarele:
monitorul;
unitatea de discheta;
unitatea de disc.
fntrebari recapitulative:
1. Dorim sa calculam suma 99 + 1. Concepem un procedeu de calcul astfel:
se pune 1 pe prima pozitie;
se pun doua cifre 0.
Este acesta un algoritm?
2. Exista un algoritm capabil sa calculeze toate zecimalele numarului pi?
3. Care va fi valoarea variabilei x dupa secventa de atribuiri care urmeaz<P
x: = 3; -Af: = 1;
x: = x+x; y: =x+y;
x: =y.
Capitolul 2
( _S_TO_P
..)
Figura 2.1.2.
Am aratat caIn orice algoritm se executa trei tipuri de opera ii: de intrare-ie
:;;ire, de atribuire :;;i de decizie. Toate aceste operatii se pot reprezenta cu
ajutorul unor simboluri speciale.
Cite te A, B
Figura 2.1.3.
Serle C
Figura 2.1.4.
C :=A+ B
Figura 2.1.5.
rezulta din
fiyura
DA
NU
Figura 2.1.6.
II
PREL
II
Figura 2.1.7.
de. parcurgere (arce). in situatia Tn care sensul de parcurgere este de sus Tn jos,
marcarea nu mai este necesara.
Cum se reprezintc':i algoritmii cu ajutorul schemelor logice? Grice schema
logic a contine obligatoriu cele doua blocuri START i STOP, Tntre care sunt
reprezentate toate operatiile necesare prelucrarii propriu-zise.
Figura 2.1.8.
Figura 2.1.9.
Observa.tii:
structurile din figurile 2.1.8 i 2.1.9 sunt structuri secventiale;
forma generala a unei structuri secventiale este cea din figura 2.1. 10.
Figura 2.1.10.
Figura 2.1.11.
Figura 2.1.12.
Figura 2.1.13.
NU
DA
Figura 2.1.14.
Exemplu: Sa presupunem ca avem de calculat suma primelor n numere naturale.
Mai jos este prezentata schema logica completa pentru aceasta problema.
STOP
Figura 2.1.15.
Cum a fost alcatuita l?i cum se cite!?te aceasta schema?
Trebuie sa rezolvam urmatoarele probleme:
citirea lui n;
0;
i este mai mic decat n (3), deci s va lua valoarea 0 + 1 = 1 iar i va lua
valoarea 2;
i este mai mic decat n, deci s va lua valoarea 1 + 2 = 3 iar i va lua valoarea 3;
Figura 2.1.16.
Variabile intregi
Au capacitatea de a retine numere intregi. Pentru recunoa$terea :or se
folose9te cuvantul cheie INTEGER.
2.
Variabile reale
Cu ajutorul lor se retin numere cu virgula (ra ionale). Pentru recunoa!?terea
lor folosim cuvantul cheie REAL.
Exemplu : REAL c, d, e.
3.
2.2.1.2. lnstructiuni
In capitolul anterior am aratat faptul ca un algoritm executa trei tipuri de
operatii !?i anume: de intrare-ie!?ire, de atribuire !?i de decizie. Fiecarei operatii,
in limbaj ii corespunde o instructiune.
1.
a.
INTEGER a
REAL b
READ a,b
Se citesc doua numere, unul intreg, altul real. Dupa citire cele.doua numere
se gasesc in va'riabilele a i b.
b.
lnstructiunea WRITE
Preia o informatie din memorie (din cadrul unei variabile) si o scrie in exterior.
Pentru simplitate,consideram faptul ca informatia este sc.risa pe monitor.
Exemp/u:
INTEGER a
READ
WRITE a.
I
lnstructiunea de atribuire
e - o expresie.
in acest caz trebuie ca tipul expresiei sa coincida cu tipul variabilei.
Exemp/e:
INTEGER a;
a:
=2
a: =a+3.
c:=a>b.
lnstructiunea STOP
lnstructiuni de decizie
lnstructiunea de ramificare
THEN sl
[ELSE s2]
END IF
Se citesc doua variabile Tntregi. Sa se tipareasca cea mai mare dintre ele.
INTEGER a,b;
READ a, b
IF a>b THEN WRITE a
ELSE WRITE b
END IF
STOP.
b.
lnstructiunea repetitiva DO
Corespunde structurii
urmatoarea:
DO
ei
este
se executa secvena s;
se evalueaza expresia logica;
daca in urma evaluarii expresiei se ob ine valoarea TRUE, se trece ia
urmatoarea instructiune;
in cazul in care expresia ia valoarea FALSE, se reia executia secventei s
.a.m.d. Secvena s este executata pana cand expresia logica ia valoarea
TRUE.
Pentru exemplificare, reluam problema anterioara:
INTEGER n,i,s;
READ n
i:=l
s:=o
DO
s:=s+i
i:=i+l
UNTIL i>n
WRITE s
STOP
I
6.
REPEAT
!NTEGER n,s,i;
READ n
s:=o
FOR i:=l,n
s:=s+i
REPEAT
WRITE s
STOP.
2.3. Aplicatii
in 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 1
a: =b
b: =a
WRITE a,b
STOP.
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;
Figura 2.3.1.
INTEGER a,b,c;
READ a,b
c:=a
a: =b
b: =c
WRITE a,b
STOP.
a: =a+b
b: =a-b a:
=a-b WRITE
a,b
STOP.
Problema 2
Sa se elaboreze algoritmul pentru rezolvarea unei ecuatii de gradul 1 .
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. Schema
devine:
Figura 2.3.3.
Figura 2.3.4.
in pseudocod, algoritmul arata astfel:
REAL a,b,x;
READ a,b
IF a<>O THEN
x: =-b/a
WRITE x
ELSE
IF b=O
THEN WRITE 'infinitate de solutii'
ELSE WRITE nu avem solutii
ENDIF
ENDIF
STOP.
Problema 3
Se dau trei numere reale a, b, c.
Sa se calculeze valoarea expresiei:
Ia b, daca
e
c>O
Dupa ce citim a, b, c vedem daca c este mai mare decat 0. In caz afi::,na iv,
calculam a+ b. Tn caz contrar se efectueaza operatia PREL, pe care o vom deta
lia ulterior. 0 prima forma a schemei logice se gase!?te mai jos.
Figura 2.3.5.
Daca c nu este mai mare decat 0, inseamna ca este mai mic sau ega! cu 0.
Testam daca el nu este 0. in caz afirmativ calculam produsul a*b, in caz con
trar calculam a-b. Acum putem scrie schema logica finala.
Figura 2.3.6.
in pseudocod algoritmul arata astfel:
REAL a,b,c,e;
READ a,b,c
IF c>O THEN
e:=a+b
ELSE
IF c=O
ENDIF
ENDIF
WRITE e
STOP.
THEN e:=a*b
ELSE e: =a-b
Problema 4
Se 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:
.
STOP
Figura 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,c
IF a<b THEN
IF c<a THEN WRITE c,a,b
ELSE .IF c<b THEN WRITE a,c,b
ELSE WRITE a,b,c
ENDIF
ENDIF
ELSE
IF c<b THEN WRITE c,b,a
ELSE
IF c<a THEN WRITE b,c,a
ELSE WRITE b,a,c
ENDIF
ENDIF
ENDIF
STOP.
DA
Figura 2.3.8.
0 alta modalitate (mai generala) de rezolvare a acestei probleme va fi
descrisa in continuare. Consideram trei numere oarecare, spre exemplu 7, 4,
1. Avem dreptul de a inversa pozitiile a doua numere alaturate. Dorim ca, In
final, numerele sa fie scrise in ordine crescatoare.
lata cum procedam:
7 este mai mare decat 4, deci se inverseaza cele doua numere, obtinand 4 7 1;
7 este mai mare decat 1, deci se inverseaza cele doua numere 4 1 7;
4 este mai mare decat 1, deci obtinem 1 4 7.
Acest exemplu numeric ne sugereaza posibilitatea de a rezolva altfel
problema anterioara:
In locul numerelor consideram variabilele a, b, c;
,
comparam pe rand a cu b, b cu c !?i din nou a cu b, iar daca este cazul
interschimbam continutul acestor variabile.
in pseudocod, algoritmul propus arata astfel:
NOT 1167
Figura 2.3.9.
INTEGER a,b,c;
READ a,b,c
IF a>b THEN
m:=a
a:=b
b: =m
ENDIF
IF b>c THEN
m:=b
b: =c
c:=m
ENDIF
IF a>b THEN
m:=a
a: =b
b: =m
ENDIF
WRITE a,b,c
STOP.
Problema 5
Pentru n citit (n natural mai mare sau egal cu 1) sa se calculeze suma
5=1 +1*2+1*2*3+ ... +1*2* ... *n.
Pentru rezolvare, observam ca putem adauga Ia o suma s (care are initial
valoarea 0) pe rand valorile calculate 1, 1 *2,...,1 *2* ...*n (adica n valori).
Aceasta nu inseamna ca trebuie calculata de fiecare data valoarea 1 *2* ...*i.
Daca am
calculat 1 * 2 * ... * i, valoarea urm1:itoare care trebuie adaugata este 1 * 2 * ... * i* (i
+ 1)
i se poate obtine inmultind valoarea calculata cu i + 1. Pentru calcuiul acestor
valori se utilizeaza variabila p. Din cele aratate rezulta schema logica de mai jos:
DA
STOP
Figura 2.3.10.
35
p: =1
FOR i:=l,n
s:=s+p
REPEAT
WRITE s
STOP.
Problema 6
41
Figura 2.3.11.
s:=s+n MOD 10
n:=n DIV 10
REPEAT
WRITE s;
STOP.
Problema 7
Pe de alta parte, daca cunoa!?tem cifrele unui numar putem calcula numarul
respectiv.
Exemplu: din cifrele 2, 6 i 1 putem obtine numarul 261. Aici nu este vorba
de alaturarea cifrelor, cum am fi tentati sa credem, ci de calculul numarului sub
forma:
2
1
2 * 10 + 6 * 10 + 1 * 101
aa cum cunoa tem din teoria bazelor de numeratie. Cum procedam pentru
rezolvarea acestei probleme? Consideram o variabila (notata ninv, care initial
va avea valoarea 0). Pentru fiecare cifra noua valoare a lui ninv va fi vechea
valoare 'fnmuiJita cu 10 Ia care se adauga cifra:
ninv: =0* 10+2 = 2;
ninv: = 2* 10+6= 26;
ninv:=26*10+1 =261.
Figura 2.3.12.
MOD 10;
Problema 8
Se cite:;;te n numar natural. Sa se precizeze daca este pdm sau nu.
Pentru rezolvare, o prima idee de lucru consta In a considera toti divizorii
posibili ai numarului n. Daca nici unul din ace!?tia nu-l divide, lnseamna ca
numarul este prim. Dar care sunt ace!?ti divizori posibili?
o prima posibilitate ar fi sa-i consideram cuprin!?i lntre 2 :;;i n-1;
o a doua posibilitate este de a-i considera cuprin:;;i lntre 2 l?i jum<'Hatea lui n
(n DIV 2) solutie mult mai avantajoasa decat prima lntrucat consideram mai
putini divizori !?i implicit se calculeaza mai putin;
o a treia posibilitate consta 'fn a considera toti divizorii cuprin!?i lntre 2 !?i
parte lntreaga din radical din n (presupunand cunoscuta teorema care afirma
ca, daca un numar nu are nici un astfel de divizor, el este prim).
Ultima varianta este cea mai buna. Spre exemplificare, vom considera
numarul 999; in prima varianta trebuie verificati 997 de divizori, in a doua 447
iar 'fn a treia numai 29 de divizori. Corespunzator acestei ultime variante
redactam, in figura 2.3.13, algoritmul.
NU
Figura 2.3.13.
REPEAT
IF prim THEN WRITE numarul este prim'
ELSE WRITE numarul nu este prim
ENDIF
STOP.
Figura 2.3.14.
READ n
i:=2
WHILE (i<n) AND (n MOD i<>O)
i:=i+l
REPEAT
IF i=n THEN WRITE numarul este prim'
ELSE WRITE numarul nu este prim'
ENDIF
STOP.
Acest algoritm are dezavantajul ca, atunci cand numarul este prim, se
45
lncearca toi divizorii posibili cuprini lntre 2 i n-1 . Un ait dezavantaj este
acela ca pentru n = 1 se tipare!?te mesajul corespunzator pentru numar naprim.
Puteti gasi un algoritm care sa elimine aceste dezavantaje?
Problema 9
Sa se scrie un algoritm care tipare!?te primele nr numere prime (nr se cite te).
In problema anterioara, am vazut cum putem stabili daca un numar este
prim. Acum, se pune problema sa asiguram un cantor In care sa se caute
numerele prime printre numerele 1, 2, !?.a.m.d., pana se tiparesc cele nr cerute
(figura 2.3.15.).
In pseudocod, algoritmul arata astfel:
INTEGER n,i,j,nr
BOOLEAN prim;
READ nr
n:=l;
j: =0;
DO
prim:=true
FOR i: =2, [/ri]
IF n MOD i =0 THEN prim:=false
ENDIF
REPEAT
IF prim THEN
WRITE n
j : =j+1
ENDIF
n: =n+l
UNTIL j=nr
STOP.
Problema 10
Se citel?te n, numar natural. Sa se descompuna In factori primi.
Algoritmul consta In urmatoarele:
se cite te n;
se initializeaza primul divizor (i = 2);
secventa urmatoare se repeta pana cand n = 1:
) se initializeaza fm cu 0 (factor de multiplicitate, arata puterea ia care se
gase te factorul prim);
r_o atat timp cat i II divide pe n, se executa urmatoarele:
se mare te cu 1 factorul de multiplicare;
se lmparte n Ia i;
> 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).
o
NU
NU
NU
Figura 2.3.15.
Figura 2.3.16.
INTEGER n,i,fm;
READ n
i:=2;
DO
fm:=O;
WHILE
MOD i =0
fm:=fm+l;
n:=n div i
REPEAT
IF fm<>O THEN
WRITE i, la puterea fm
ENDIF
i:=i+l
UNTIL n=l
STOP.
Problema 11
Sa 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
sau3 nu
3
descompune
3
3 in doua feluri ca suma de cuburi (de exemplu, 1729 = 1 + 12 =
= 9 + 10 si este eel mai mic numar natural care admite o astfel de descom
punere). intr-o structura repetitiva de tip FOR se incearca, pe rand, sa se
descompuna 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 intre
i !?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,max
FOR j:=i,max
IF i*i*i+j*j*j=n THEN
IF nr=O THEN
il:=i
j1: =j
ELSE
i2:=i
j2:=j
ENDIF
nr:=nr+l;
ENDIF
REPEAT
REPEAT
IF nr>l THEN
WRITE n,il,jl,i2,j2
ENDIF
REPEAT
STOP.
DA
Figura 2.3.17.
Capitolul 3
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 BEGIN
i
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).
PROGRAM nume;
definitii de constante;
definitii de tipuri;
declaratii de variabile;
declaratii de proceduri i funqii;
BEGIN
instruqiuni
END.
+ 4.. .
Figura 3.1.3.1.
..
Figura 3.1.3.2.
:=r
-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:
motiv, verificarea se face dupa reguli care trebuie descrise foarte clar iar
aceasta descriere este realizata de diagramele de sintaxa.
@,
_, i blanc (spatiu).
3.2.2. ldentificatori
Prin 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:
--IDENTIFICATORt LI A
CIFRA
Figura 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.3. Constante
Constantele 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 CARACTERE
CONSTANTA SIMBOLICA
Figura 3.3.1.
+ 31,
$a1, -a1.
CIFRA HEXAZECIMALA
Figura 3.3.1.1.
+ 23,
-45.1 E-3.
Figura 3.3.2.1.
57
SIR
-CARACTERE
CARACTER
CONSTANTAiNTREAGA
Figura 3.3.3.1.
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.
53
Are 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 char
Multimea 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 unitate
mai 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 intregi
Tn 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 2
octeti;
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 DIV
60
-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 produsului
dintre 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.
Ia
Cu 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 OR
Fie b 1 !?i b2 continutul a doi biti. Definim disjunqia astfel:
b 1 OR b2 =
o ?aca. b1 =0b2=0
1 1n once alt caz
Operatorul OR face disjunctia bit cubit asupra reprezentarii celor doua numere.
1
Exemplu: 3 OR 7 = 7.
XOR b
Exemplu: 3 XOR 7 = 4.
reprezentam numarul 3:
reprezentam numarul 7:
rezulta:
00000011;
00000111;
00000100,adica 4.
'
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, referitor
Ia exemplul dat, marti < miercuri)).
3.4.2.2. Tipul subdomeniu
Se 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, tipul
de 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,
I1---.tllt .. 1-----.t..J,
CONSTANTA 1
..---
...
CONSTANTA 2
Figura 3.4.2.2.
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.
DE TIPURI-------.,
_DEFINITIE
.f TYPE
IDENTIFICATOR
I
BOOLEAN
CHAR
TIP SIMPLU
TIP STRUCTURAT
TIP
-SIMPLU
iNTREG
REAL
TIP REPER
ENUMERAT
SUBDOMENIU
SHORTINT
INTEGER
TIP
-iNTREG
LONGINT
TABLOU
TIP
-STRUCTURAT
STRING
MULTIME
BYTE
ARTICOL
WORD
FI!;>IER
REAL
SINGLE
TIP
-REAL
DOUBLE
EXTENDED
COMP
Figura 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;
-
DECLARATIA
-- VARIABILA
IDENTIFICATOR
Figura 3.5.1.
3.7. Expresii
Regulile de formare a expresiilor sunt acelea!?i din matematica.
mult
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.
Capitolul 4
-INSTRUCTIUNE
WHILE
REPEAT
FOR
WITH
PROCEDURALA
Figura 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.
1.
x: =3;
1.
2.
i: = i +a unde i este o variabila de tip integer, iar a de tip real. in acest caz
expresia este de tip real iar variabila i este de tip integer. La compilare
apare un mesaj de eroare ('type mismatch');
i: = i/2, unde i este de tip integer. Cu toate ca rezultatul ar putea fi de tip
integer (daca i este par), forma nu este permisa pentru ca expresia este
de tipul real. Corect, ar fi trebuit scris i: = i div 2.
IDENTIFICATOR
(VARIABILA)
INSTRUCTIUNE
ATRIBUIRE
EXPRESIE
ID
w
r
i
t
e
(
'
b
=
)
;
r
e
a
d
l
n
(
b
)
;
c
:
=
a
;
a
:
=
b
;
72
b
:
=
c
;
w
r
i
t
e
l
n
(
a
=
'
e
p
e
r
,
a
)
;
w
r
i
t
e
l
n
(
'
b
=
f
e
c
lnstruqiunea
se scrie astfel:
IF expresie
logica
THEN
instructiune 1
EL
E
in
uq
ne
s
t
r
u
c
,
b
)
;
end.
t
u
r
i
4.2
.
lnst
ruc
tiun
ea
IF
i
a
l
t
e
r
Acea
sta
instr
uctiu
ne
core
spun
Principiul de
executie este
urmatorul:
se evalueaza
expresia logica;
daca aceasta
ia valoarea
TRUE, se
executa
instructiunea
plasata dupa
THEN, in caz
contrar se
executa
instruc iunea
plasata dupa
ELSE.
Aten_tie! Atat
dupa THEN cat
9i dupa ELSE
avem voie sa
punem o
singura
instruqiune.
Exemplu:
Programul care
urmeaza
calculeaza
maximul dintre
doua numere
73
citite:
program max;
var a,b:integer;
be
g
i
n
w
r
i
t
e
(
'
a
=
)
;
r
e
a
d
l
n
(
a
)
;
w
r
i
t
e
(
'
b
=
'
)
;
r
e
a
d
l
n
(
b
)
74
if
a>b
then
writeln
(a)
end.
else writeln(b)
a
b
,
c
<
O
Programul p3, care rezolva aceasta problema, exemplifica
folosirea unei instructiuni IF, plasata in corpul altei instructiuni
IF.
program p3;
var a,b,c,e:real;
begin
wr
it
e
('
a=
)
;
re
ad
l
n
(
a
)
;
if c>O
then e:=a+b
else if c=O
t
h
e
n
w
r
i
t
e
e
:
=
a
(
'
b
=
)
;
r
e
a
d
l
n
(
b
)
;
w
r
i
t
e
(
'
c
=
)
;
r
e
a
d
l
n
e
l
s
e
writeln('e=,e:3:2)
end.
e
:
=
a
b
;
4.2.2.
Forma IF
THEN
Aceasta instructiune se
scrie sub forma: IF expresie
logica THEN instructiune.
Principiul de executie este urmatorul:
se evalueaza expresia logica;
In situatia In care aceasta.ia valoarea TRUE, se executa
instructiunea aflata
dupa THEN, in caz contrar se trece Ia instructiunea urmatoare.
lata :;;i diagrama de sintaxa care prezinta instructiunea IF:
INSTRUCTIUNEA
IF.
INSTRUCTIUNE
I
N
S
T
R
U
C
T
I
U
N
E
Aici, i1,..., in reprezinta instruc iunile care se gasesc In corpul instruc iunii
compuse. Acestea sunt separate prin virgula.
Exemplu: Sa se scrie un program care rezolva ecuatia de gradul 1
(a* x + b = 0). Modul de rezolvare a acestei ecuatii a fost discutat pe larg atunci
cand am exemplificat elaborarea algoritmilor prin utilizarea schemelor logice i
a limbajului de tip pseudocod. Aici prezentam programul Pascal care rezolva
aceasta problema. Se observa folosirea unei instruqiuni compuse Ia calculul
radacinii l?i tiparirea ei.
program p2;
var a,b,x:real;
begin
write( 1 a= 1 );
readln(a);
write( 1 b= 1
);
readln(b);
if a<>O then
begin
x:=-b/a;
writeln(1 x= 1 , x: 3:2);
end
else if b=O then writeln( 1 infinitate de solutii 1 )
else writeln( 1 nu avem solutii 1 )
end.
INSTRUCTIUNE
COMPUSA
END
Figura 4.4.
THEN
ELSE instructiune;
EXPRESIE
ORDINALA
ALTERNATIVA
(CASE)
INSTRUCTIUNE
ALTERNATIVA
(CASE)
CONSTANTA
INSTRUCTIUNE
CONSTANTA
Figura 4.5.
1 ,
ninv);
81
EXPRESIE
LOGICA
INSTRUCTIUNEA
WHILE
INSTRUCTIUNE
Figura 4.6.
p
e
a
t
i
1
;
i
2
;
i
3
;
in
until expresia logica.
Aici, i1,...,in
reprezinta
instructiuni.
Principiul de
executie este
urmatorul:
se efectueaza secventa de instructiuni i1,...,in
pana cand, Ia evaluare,
expresia logica ia valoarea TRUE.
Observatie: Secventa se executa eel putin o
data, dupa care se pune problema daca sa se repete
sau nu (prin
evaluarea
expresiei !ogice).
Exemp/ul 1:
Se cite te un
numar natural n,
mai mare sau egal
cu 1. Sa se
calculeze suma
primelor n numere
naturale.
program swna;
var
n,s,i:integer;
begin
write( 1 n=
);
readln(n);
i
:
=
l
;
s
:
=
o
;
r
e
p
e
a
t
s
:
=
s
+
i
;
i
:
=
i
+
l
until i>n;
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;
repeat
fm:=O;
while n mod i =0 do
begin
fm:=fm+l;
n: =n div i
end;
if fm <>o then writeln
i:=i+l
until n=l
end.
)aoj INSTRUCTIUNE
., I. .---{G) ---'-
Figura 4.7.
84
Exemp/u/2:
a 1 to
z 1 do write(i);
end.
program f4;
var i:char;
begin
for 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);
begin
for i:=ianuarie to martie do
case i of
ianuarie: writeln('ianuarie);
februarie: writeln('februarie);
martie: writeln(martie')
end
end.
program f6;
var i:(ianuarie,februarie,martie);
begin
for i:=martie downto ianuarie do
case i of
ianuarie: writeln('ianuarie);
februarie: writeln('februarie');
martie: writeln('martie')
end
end.
begin
p:=pi;
s:=s+p
end;
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)) do
if 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)) do
if 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;
begin
n: =1;
j: =0;
write(nr= );
readln(nr);
repeat
prim:=true;
74
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;
begin
for n:=1 to 10000 do
begin
max:=trunc(exp(1/3ln(n)));
nr:=O;
for i:=1 to max do
for j:=i to max do
if i*i*i+j*j*j=n then
begin
if nr=O then,
begin
i1:=i;
j 1:=j
end
else
begin
i2:=i;
j2: =j
end;
nr:=nr+1;
end;
if nr>1 then writeln(n,' ',i1,' ,j1,' ,i2,' ,j2)
end
end.
FOR.
IDENTIFICATOR
EXPRESIE
Figura 4.8.
88
EXPRESIE
INSTRUCTIUNE
'i
Algoritmi simpli
Pentru 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.
IX *X-3,
X<5
1I
5 s X s 25
X *X-5 *X +6,
X>25
= \ X+
a
E=
b.
c +d>O
a-b, c +d=O
a *b, c +d<O
1
1
1
E = 1 +- + -- +,.. + --
22
E2= 1
-+
23
32
n2
---- + ... +
34
(n+1)(n+2)
n!=123... n
1
1
E3 =
+ ... +
1
1
+- +-,
1! 2!
n!
13. Sa se calculeze produsul a doua numere naturale prin
adunari repetate.
14. Efectua!iimpartirea intreaga a doua numere citite, far a a
utiliza operatorii
MOD !?i DIV.
15. Se cite!?te o succesiune de cifre 1 l?i 0 in care prima este
1. Aceasta are semnificatia unui numar In baza 2. Sa se
tipareasca numarulln baza 10.
16. Se cite!?te o succesiune de caractere ('fntr-o variabila de tip
char) '0', '1 ',
..., '9', 'a', 'b', ..., 'f' In care primul caracter citit nu este 0.
Aceasta are
semnificatia unui numar 'fn baza 16. Sa se tipareasca numarulln
baza 10.
17. Se considera !?irul definit astfel (FIBONACCI):
1, daca
n=1 sau n=2 u(n)
= { u(n-1) +u(n2), altfel
Se cite!?te o valoare naturala a. Sa se calculeze u(a).
18. Se considera !?irul definit Ia problema anterioara. Sa
se tipareasca numarul lui de termeni care sunt strict mai mici
decat o valoare citita.
19. Se citesc doua numere naturale m i n; Sa se calculeze
eel mai mare divizor comun al lor:
a) prin utilizarea algoritmului lui EUCLID;
b) prin utilizarea relatiei de mai jos:
cmmdc{a
-b,b), cmmdc(a,b) =
cmmdc{a,b-a),
_
d
a
c
a
a
>
b
;
d
a
c
a
a
<
b
;
d
a
c
a
a
=
b
.
20. Se
cite!?te
un numar
natural.
Cate cifre
contine?
21.
Calculati
suma !?i
produsul
divizorilor
primi ai
unui
numar
citit.
22. Se
citesc, pe
30. Un numar este perfect daca este egal cu suma divizorilor sai
(excluzandu-1 pe el). Exemplu: 6 = 1 + 2 + 3. Tiparii toate numerele perfecte
pana Ia un Tntreg citit.
31. Pana Ia un intreg citit, tipariti toate numerele naturale care sunt egale cu
suma patratelor cifrelor lor.
32. Determinati numarul de zile trecute intre doua date calendaristice citite
(anii bisecti sunt cei divizibili cu 4).
33. Afi ati primele n perechi de numere prime care sunt consecutive in
multimea numerelor impare. Exemplu: (3,5), (5,7).
34. Se cite!?te un numar natural par. Sa se descompuna in suma de numere
prime (conjectura GOLDBACH).
35. Se citesc doua numere naturale formate din cate 4 cifre distincte. Care
este numarul cifrelor comune celor doua numere (nu coincid obligatoriu !?i ca
pozitie)?
36. Se citesc 2 numere naturale n i m. Calculai n Ia puterea m efectuand,
pe cat posibil, mai putin de m-1 inmultiri.
37. Se citesc n numere naturale. Sa se tipareasca eel mai mare divizor
comun al lor.
Indicatie:
ax, + bx, + c = 0
x1 radaeina - A
2
2
2
b c
- aSn+2+bSn+1 +cSn=O, dar S,=--,
S2=x,
+X2=(X,tX2)
-2X1X2=--2--.
a
ProgramaJi
relaJie
recurenJa.
o
de
a2
a
a;
+ y = b;
Rezulta: x = (a + b) I 2;
y = (b - a) I 2.
Pe alta parte, a i b trebuie sa fie divizori ai lui k. De asemenea
se tine cont de faptul ca, daca ecuatia admite solutia (x,y)
admite i solutiile (-x, -y), (-x, y), (X, -y).
40. Se citesc pe rand n numere naturale !Ji un numar p.
Se cere sa se gaseasca k maxim, astfel incat p Ia puterea k
divide produsul celor n numere naturale. Se va evita
efectuarea produsului celor n numere naturale.
94
Capitolul 5
Observatii:
Observatii:
Este indicat ca Ia citirea unei componente sa se tipareasca !?i numarul ei de
ordine (pentru ca acela care introduce datele sa !?tie de fiecare data ce
componenta introduce);
Nu este obligatoriu ca indicele sa fie continut intr-o variabila. El poate fi
trecut printr-o valoare (am procedat astfel cand am tiparit componenta doi).
Teoretizand, tipul array se declara dupa diagrama de sintaxa de mai jos:
TIP
-TABLOU
Figura 5.1.1.
Dupa cum rezulta din diagrama, indicele poate fi de un tip ordinal (cu un
numar finit de elemente). Nu poate fi indice un tip INTEGER dar este admis
pentru indici un subdomeniu al tipului INTEGER a!?a cum de altfel am folosit In
toate exemplele de pana acum.
Tn diagrama, prin TIP se intelege tipul de baza al tabloului, adica tipul
componentelor acestuia.
Sa exemplificam cele prezentate in diagrama, aratand astfel !?i extraordinara
diversitate a tipurilor de date ale limbajului. Programul care urmeaza cite!?te !?i
tipare!?te o variabila cu componente de tip intreg, dar indicele componentelor
este tipul char (care este un tip ordinal).
program a3;
type vector=array
var a:vector;
i:char;
[char] of integer;
begin
for i:= 1 a 1 to 1 C 1
do begin
write(1 a[1 ,i, 1 ] = 1 ) ;
readln(a[i])
end;
for i:= 1 a 1 to 1 C 1 do writeln( 1 a[ 1 ,i, 1 ]= 1 ,a[i]);
end.
Componentele unei variabile de tip array pot fi Ia randul lor variabi!e de tip
array.
Tn programul urmator tipul matrice are trei componente de tip vector.
Programul cite te i tipare te o variabila de tip matrice. Observati modul de
adresare a componentelor.
program as;
type vector=array[l..2] of integer;
matrice=array[l..3] of vector;
var i,j: ipteger;
a:matrice;
begin
for i:=l to 3 do
for j:=l to 2 do
readln(a(i]
[j]);
for i:=l to 3 do
for j:=l to 2 do
writeln(a[i][j])
end.
gasit:=false;
i:=1;
while not gasit and(i<=n) do
begin
j:=i+1;
while (j<=n) and not gasit do
begin
if a[i]=a[j] then gasit:=true;
j: =j+1
end;
i:=i+1
end;
if gasit then writeln( 1 elementele nu sunt distincte
else writeln( 1 elementele sunt distincte 1 )
end.
Daca .numerele retinute de un vector sunt distincte, rezulta ca ele pot alcatui
o multime. Din acest motiv, un astfel de test se mai numel?te !?i test de mul
time.
Problema 3
readln(a[i])
end;
writeln(multimea B');
write('m=');
readln(m);
for i:=1 tom do
begin
Write (Ib [I 1 i 1 I ] I ) i
readln(b[i])
end;
for i:=1 ton do c[i]:=a[i];
k:=i+1;
for i:=1 tom do
begin
gasit:=false;
j:=1;
while not gasit and (j<=n) do
begin
if a[j]=b[i] then gasit:=true;
j:=j+1
end;
if not gasit then
begin
c[k]:=b[i];
k:=k+1
end end;
writeln('reuniunea);
for i:=1 to k-1 do writeln(c[i]);
end.
Problema 4
readln(a[i])
end;
writeln(multimea B');
write('m=);
readln(m);
for i:=1 to m do
begin
write( b[',i, ]= );
readln(b[i])
end;
k:=O;
for i: =1 to n do
begin
gasit:=false;
j : =1;
while not gasit and (j<=m) do
begin
if a[i]=b[j] then gasit:=true;
j : =j+1
end;
if gasit then
begin
k:=k+1;
c[k]:=a[i]
end
end;
writeln ('intersectia ');
for i:=1 to k do writeln(c[i])
end.
Pro.blema 5
write( 1 n= 1 );
readln(n);
for i:=1 to n do
begin
Write (IV [I IiI I ] =I ) ;
readln(v[iJ)
end;
for i:=1 ton do s[i]:=1;
for i:=1 to n .do
begin
j: =1;
while s[j]=O do j:=j+1;
if j<=n then
begin
max: =v[j];
poz:=j;
for k:=j+1 ton do
if s[k]=1 then
if v[k]>max then
begin
max:=v(k];
po:i:: =k
end;
s[poz]:=0;
vs[i]:=max
end;
end;
for i:=1 ton do writeln(vs[i]);
end.
Problema 6
Care este modificarea ce trebuie facuta astfel Tncat vectorul sa fie sortat
descrescator?
program sort2;
type vector=array[l..10]
var n,i,m:integer;
v:vector;
inversari:boolean;
begin
write( 1 n= 1 );
readln(n);
for i:=1 ton do
begin
Write (IV [I 1 i 1 I
)
of integer;
] :I
readln(v[i])
end;
repeat
inversari:=false;
for i:=1 to n-1 do
if v[i]>v[i+l] then
begin
m:=v(i];
v[ij :=v[i+1];
v[i+1]:
=m;
inversari:=true
end;
until not inversari;
writeln('vectorul sortat ');
for i:=1 ton do writeln(v[i])
end.
of char;
begin
for i:=1 to 10 do read(a[i]);
writeln;
writeln(a);
end.
0 variabila de tip STRING poate retine maximum 255 de caractere !?i pentru
ea se rezerva in memorie 256 de octeti (in primul octet se retine lungimea
efectiva a cuvantului citit).
Mai mult, nu suntem obligati sa declaram variabile de acest tip care sa
contina 256 de octeti. Exista posibilitatea sa declaram variabile de tip STRING
cu un numar mai mic de octeti. De exemplu, daca Ia problema propusa !?tim de
Ia inceput ca lungimea cuvantului citit nu depa9e9te 20 de caractere, putem
proceda ca in programul urmator:
program st3;
var a:string[20];
begin
readln(a);
writeln(a);
end.
writeln(a[2]);
writeln('cuvantul
end.
citit,are
,ord(a[O]),
litere')
Variabilelor de tip STRING li se pot aplica operatori relationali. Ace tia sunt:
= (egal), < >'(diferit), < (mai mic), <= (mai mic sau egal), > (mai mare),>=
Se procedeaza astfel:
se compara codul primului caracter al primului l?ir c'u codul primului caracter
al celui de-al doilea !?ir, In urma comparatiei se poate ajunge intr-una din
situatiile urmatoare:
primul cod este mai mare, caz In care se considera primul !?ir mai mare decat
celalalt;
primul cod este mai mic, astfel ca primul !?ir este mai mic;
cele doua coduri sunt egale (avem acela!?i caracter), se trece Ia comparatiile de
cod pentru al doilea caracter al primului !?ir cu al doilea caracter pentru 9irul al
doilea !?i in urma comparatiei se procedeaza Ia fel ca pentru primul caracter.
Presupunem cain urma comparatiei primelor m caractere ale celor doua l?iruri
am avut tot timpul egalitate. Daca m = n, rezulta ca cele doua l?irurisunt egale,
iar daci:i m < n rezulta ca primul !?ir este mai mic decat al doilea.
Programul st6 tipare!?te de doua ori TRUE.
program st6;
var a: string[lO];
b: string[3];
begin
a:= act';
b:=act;
writeln(a=b);
a:=ma;
b:= mal';
writeln(a<b);
end.
of string[lO];
begin
write('n=');
readln(n);
for i:=l ton do
beg;.n
Write (IV [I i 1 I ]: I ) j
readln(v[i])
end;
repeat
inv:=false;
for i:=l to n-1 do
if v[i]>v[i+l] then
1
107
begin
man: =v[i];
v[i]: =v[i+l];
v[i+l]:=man;
inv:
=true end
until not inv;
for i:=l ton do
writeln(v[i])
end.
Exista mai multe proceduri !?i functii care pot Iuera cu variabile de tip string.
Pana In acest moment, noi nu am studiat nici procedurile, nici funqiile.
Acestea se vor studia ulterior. Pentru moment,lntelegem ca acestea reprezinta
secvente de program, scrise de altii, care efectueaza anumite calcule !?i
returneaza anumite rezultate. Rezultatele funqiilor le regasim prin numele lor
(Ia fel cum continutul unei variabile se obtine referind variabila prin numele ei)
iar rezultatele procedurilor le regasim continute in anumite variabile pe care le
transmitem atunci cand apelam procedurile. La apel, atat pentru proceduri cat
!?i pentru functii, se transmit (de cele mai multe ori) ca parametri variabile ale
programului nostru. Lucrurile vor fi mai bine lamurite, prin exemple, iar in acest
an vom lnvata pe larg despre proceduri !?i funqii.
5.1.2.1. Functia COPY
Se presupune urmatoarea problema, care apare de multe ori In practica. A
vern o variabila de tip string ce contine un !?ir cum caractere. Se cere sa se ga
seasca sub!?irul care incepe In pozitia i < = m !?i care are n caractere. De exem
plu, variabila a contine !?irul 'calculator' !?i se dore9te sa extragem sub!?irul care
lncepe de Ia pozitia 3 !?i are 4 caractere. Aceasta problema se poate rezolva In
felul urmator:
program st8;
var a,b:string;
i:integer;
begin
a:=calculator;
b:=";
for i:=3 to 6 do b:=b+a[i];
writeln(b)
end.
begin
a:= 1 calculator 1 ;
b:=copy(a,3,4);
writeln(b)
end.
Functia COPY extrage un sub ir dintr-un !?ir dat. La apel, funqia COPY are
trei parametri care trebuie scrii in ordinea de prezentare:
!?irul din care se face extragerea;
pozitia primului caracter al 9irului extras;
numarul de caractere care se extrag.
Observa,tii:
Este mult mai bine sa lucram utilizand aceasta functie datorita faptului ca,
prin parametri convenabil ale9i, se poate extrage sub!?irul dorit din orice
pozitie pe orice lungime.
In exemplu am folosit valori efective pentru pozitie !?i numar de caractere,
dar se pot folosi 9i variabile (acest lucru este adevarat in general pentru orice
procedura 9i functie). Daca avem m = 3, n = 4 (m, n variabile de tip
integer) putem pune COPY(a,m,n).
In situatia in care lungimea sub!?irului cerut este mai mare decat numarul de
caractere existente in ir incepand din pozitia solicitaHi, se extrag numai
caracterele din pozitia curenta pana Ia sfar9it. Exemplu: variabila a contine
cuvantul 'tasta'. Funqia Copy(a,3,5) returneaza 9irul 'sta'.
if i>length(a)-length(b)+l
writeln(i)
end.
then i:=O;
Acela:;;i lucru, dar mai general i mai simplu se realizeaza prin utilizarea
functiei POS. Aceasta are doi parametri: subl?irul cautat i l?irul unde se cauta.
Rezultatul este de tip byte. Daca rezultatul este 0, lnseamna ca subl?irul nu a
fost gasit iar daca rezultatul este < > 0, sub irul a fost gasit l?i s-a returnat
numarul octetului de lnceput al sub irului in cadrul irului.
program stll;
var a,b:string;
i:integer;
begin
a:=calculator;
b:='lat;
i:=pos(b,a);
writeln(i)
end.
begin
b:=-23.25;
str(b:6:2,a);
writeln(a); c:=127;
str(c: 3,a);
writeln(a)
end.
informatiile
program reel;
type material=record
cod,mag:integer;
den:string(30];
wn:string[3];
cant,pu:real
end;
var m:material;
begin
write ('cod'); readln(m.cod);
write ('magazie '); readln(m.mag);
write ('denumire '); readln(m.den);
write ('unitate masura' ); readln(m.wn);
write ('cantitate '); readln(m.cant);
write ('pret unitar '); readln(m.pu);
writeln ('informatiile citite ');
writeln ('cod ',m. cod);
writeln(magazie ',m.mag);
writeln('denumire ',m.den);
writeln('unitate de masura ,m.wn);
writeln(cantitate ,m.cant:5:2);
writeln(pret unitar ,m.pu:5:2)
end.
Tipul material este un tip inregistrare. Descrierea unui astfel ddt1p incepe
prin cuvantul cheie RECORD $i se termina prin END. intre aceste doofi cuvinte
cheie sunt trecu te toate campurile continute cu tipurile lor. Partea cuprinsa
intre RECORD
END se nume9te parte fixa. Figurile de mai jos prezinta
descrierea unui "tip inregistrare cu ajutorul diagramelor de sintaxa.
TIP
-INREGISTRARE FIXA
RECORD
DESCRIERE
PARTE FIXA
Figura 5.2.1.1.
DESCRIERE
-PARTE FlxA
TIP
F
ig
u
ra
5
.
2
.
1
.
2
.
material). Adresarea unui camp
al acestei variabile se face prin
numele ei, urmat de punct l?i
numele campului. Astfel, pentru
a adresa campul dense scrie
m.den..
Acest mod de adresare
deranjeaza prin faptul ca se
pierde timp Ia scrierea
programelor (de fiecare data
scriem numele variabilei).
Limbajul pune Ia
dispozitie o instructiune
numita WITH care are rolul
de a U!?Ura adresarea
campurilor. Rescriem
programul anterior utilizand
aceasta instructiune.
program rec2;
type material=record
cod,mag
:intege
e
n
d
;
var m:material;
begin
with m do
begin
w
r
i
t
e
(
'
c
o
d
'
)
;
r
e
a
d
l
n
(
c
o
d
)
;
w
r
i
t
e
(
'
m
a
g
r;
den:
stri
ng[J
O];
um:s
trin
g[J]
;
cant
,pu:
real
a
z
i
e
'
)
;
r
e
a
d
l
n
(
m
a
g
)
;
w
r
i
t
e
(
'
d
e
n
u
m
i
r
e
'
)
;
r
e
a
d
l
n
(
d
e
n
)
;
write
('uni
tate
masu
ra'
);
readl
n(um);
w
r
i
t
e
(
'
c
a
n
t
i
t
a
t
e
'
)
;
r
e
a
d
l
n
(
c
a
n
t
)
;
w
r
i
t
e
(
'
p
r
e
t
u
n
i
t
a
r
'
)
;
r
e
a
d
l
n
(
p
u
)
;
w
r
i
t
e
l
n
(
'
i
n
f
o
r
m
a
t
i
i
l
e
c
i
t
i
t
e
'
)
;
w iteln ('cod
,cod);
writeln('magazie
',mag);
.
writeln('denumire
',den);
writeln('unitate
de masura ,um);
writeln(cantitate
,cant:5:2);
writeln('pret
unitar ,pu:5:2)
end
end.
Forma
generala a
instructiun
ii WITH
este:
INSTRUCTIUNE
INSTRUCTIUNEA
WITH
Figura 5.2.1.3.
Aplicatia propusa Ia inceputul acestui paragraf presupune lucrul cu rnamulte
inregistrari, dar programele prezentate pana aici lucreaza cu una singura. In cele
ce urmeaza, se prezinta o modalitate de lucru cu mai multe inregistrari.
Se cere sa se scrie un program care sa citeasca n inregistrari de tip material
!Ji sa calculeze valorile totale pe magazii. De asemenea se va tipari valoarea
tuturor materialelor det.inute de fir.ma.
0 posibilitate de a retine cele n inregistrari este data de declararea unui
vector (structura de tip ARRAY) ale carui componente sunt inregistrari.
Declaratia acestui tip este:
type vector= array[ 1..100] of material.
Cum putem adresa un camp al unei componente? Pentru aceasta, se
precizeaza componenta urmata de punct, urmata de numele campului.
Exemplu: campul den al componentei 3 se adreseaza prin v[3].den, unde v este
o variabila de tip vector. $i in acest caz se poate folosi instructiunea WITH sub
forma WITH v[i] do instructiune, evitand astfel o adresare greoaie. in program
folosim aceasta instructiune atunci cand scriem secventa citirii celor n Tnregistrari.
Pentru calculul totalurilor pe magazii, s-a retinut un alt vector, cu componente
reale, numit vectot. Acest vector are un numar de componente egal cu numarul
de magazii pe care le detine firma (numar pe care programul il cite!?te). Pentru
fiecare inregistrare de tip material se calculeaza valoarea materialului ca produs
intre cantitate !?i pret unitar. Aceasta valoare se adaugtotalului pe magazia careia
iiapartine materialul (campul mag al unei inregistrari). In final, se calculeaza valoa
rea totala a materialelor retinute de firma prin insumarea totalurilor pe magazii.
program reel;
type material=record
cod,mag:integer;
den:string[JO];
um:string[J];
cant,pu:real
end;
vector=array[1..100] of material;
vectot=array[1..10] of real;
var v:vector;
n,i,nr_mag:integer;
tot:vectot;
total:real;
begin
write(n=');
readln(n);
write('numar de magazii=');
readln(nr mag);
for i:=l to nr mag do tot[i]:=0;
for i: =1 to n
do with v[i] do
begin
writeln(inregistrarea ',i);
write ('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);
end;
for i:=l ton do
tot[ [i].mag]:=tot[v[i].mag]+v[i].cantv[i].pu;
total:=o;
for i:=l to nr mag do
begin
writeln(total magazia ,i, ' ,tot[i]:4:2);
total:=total+tot[i]
end;
writeln('total general ,total:5:2)
end.
Observatii:
Programul prezentat este unul didactic, motiv pentru care secvenla de citire
se face separat (pentru a a rata cum se cite!?te un vector de Tnregistrari). Se
putea evita retinerea unui vector pentru aceasta problema. Rescrieliprogra
mul tinand cont de aceasta observatie. De asemenea, multe informatii sunt
inutile in program (de exemplu denumirea fiecarui material se cite!?te pentru
fie care Tnregistrare).
in practica, pentru astfel de aplicatii se folose!?te un alt tip de Tnregistrare numit
FISlER care permite memorarea informatiilor pe suport magnetic. Ce ne facem
daca Ia fiecare prelucrare de materiale trebuie sa le introducem pe toate? Dar
in constructia tipului fi9ier se folose!?te tipul Tnregistrare prezentat aici.
Programul care urmeaza utilizeaza din plin structura de tip vector de Tnregistrari. Se citesc n Tnregistrari de tip material. Acestea se sorteaza alfabetic. in
final, Tnregistrarile sortate sunt tiparite (pentru fiecare Tnregistrare se tipare!?te
denumirea materialului !?i cantitatea). Metoda de sortare a fost prezentata pe
cazul unui vector cu numere Tntregi (se nume!?te metoda bulelor).
program rec4;
type material=record
cod,mag:integer;
den:string[30];
um:string[3];
cant,pu:real
end;
vector=array[1..100] of material;
var v:vector;
n,i:integer;
inversari:boolean;
m:material;
begin
write('n=); readln(n);
for i:=1 fo n do
with v [i] do
begin
writeln('Inregistrarea ,i);
write (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);
end;
repeat
inversari:=false;
for i:=1 to n-1 do
if v(i].den>v[i+1].den then
begin
m:=v[i];
v(i]:=v[i+1];
v(i+1]:
=m;
inversari:=true
end
until not inversari;
for i:=1 ton do
with v [i] do
begin
writeln('Inregistrarea' i); writeln(den);
writeln(cant:4:2);
end
end.
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=record
cod,mag:integer;
den:string[JO];
um:string[J];
cant,pu:real;
dataf:record
zi:l..31;
luna:l..12;
an:integer
end
end;
var m:material;
begin
with m do
begin
write ('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
begin
write('ziua fabricatiei '); readln(zi);
write('luna fabricatiei 'l; readln(luna);
write('anul fabricatiei '); readln(an)
end
end
end.
in programul
variabila) selec
campul STUDII.
C ampul dupa
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 lua
campul 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=record
nume:string[JO];
varsta:byte;
case studii:char of
If
I : ();
g 1 : (nr cl:integer);
1 11 : (an-t:integer;
oras:string);
1
s 1 : (fac:record
nume f:string[20];
an s7byte
end)1
\
end;
var p:persoana;
begin
write( 1 nume 1 ); readln(p.nume);
write( 1 varsta); readln(p.varsta);
write( 1 studii '); readln(p.studii);
case p.studii of
'g1 : begin
write( 1 numar clase 1 );
readln(p.nr_cl)
end;
1: begin
write( 1 anul terminarii liceului 1 );
readln(p.an t);
write( 1 orasul 1 );
readln(p.oras)
end;
s1 : begin
write( 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!i
Observatii:
Este preferabil ca citirea unei variabile de acest tip sa se faca prin utilizarea
instruqiunii 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
CU VARIANTE
RECORD
DESCRIERE
PARTE FIXA
IDENTIFICATOR
DESCRIERE
PARTE
VARIANTE
CONSTANTA
DESCRIERE
PARTE FIXA
DESCRIERE
PARTE
VARIANTE
Figura 5.2.2.1.
123
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 a 1 1 i 1 , 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;
begin
V 1:
I 11
= ( Ia I
, , I
d1
IU I
, , I
zI
v1:=a; v2: =
(] ;
v2:=(1uni];
v3: = ( o, 1, 7 .. 9] ;
v4: = ( 9 o .. 1o o] ;
end.
TIP ORDINAL
-MULTIME
Figura 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.2. Operatori
Variabilelor de tip multime li se pot aplica urmatorii operatori:
+ pentru reuniune (reuniunea a doua multimi A i B este o multime formata din
elementele multimii A Ia care se adauga elementele multimii B care nu
apartin multimii A);
* pentru intersectie (intersectia a doua multimi A i B, reprezinta multimea
formata 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:
pentru apartenenta;
< > pentru a testa daca doua multimi sunt diferite (nu contin aceleai elemente);
<= peritru a testa daca o multime este inclusa in alta;
>= pentru a testa daca o multime include alta muiJime.
in
5.3.3. Constante
in 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 a
putea 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 aceasta
multime 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 unui
ciclu FOR care are ca valoare initiala prima valoare posibila a multimii i ca
valoare 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 do
begin
write('elementul ',i, ');
readln(nr);
a:=a+[nr]
end;
writeln(multimea A');
for i:=O to 255 do
if i in a then writeln(i);
readln;
write(card(b)=');
readln(n);
b:
= [] ;
c:=ab;
writeln('multimea intersectie');
for i:=l to 255 do
if i inc then writeln(i);
readln;
c: =a-b;
writeln('A-B');
for i:=l to 255 do
if i inc then writeln(i);
readln
end.
Observatii:
Nu orice tip de baza al unei multimi poate fi citit sau tiparit (exemplu: tipul
enumerare). 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 de
valoarea 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 fi
altfel. 0 multime se construie!?te utilizand numai operatii cu multimi care au
ca rezultat multimi. Sa presupunem ca atunci cand se ruleaza programul
MUL1, 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 multi
mea 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.
/ndicatii:
8. Nu putem efectua produsul celor n numere pentru ca, apoi, sa vedem cu
cate cifre de 0 se termina, pentru ca lntr-un astfel de caz numarul obtinut poate
fi foarte mare (nu poate fi retinut lntr-o variabila de tip integer sau longint).
Solutia este urmatoarea:
se determina k 1, exponentul maxim al cifrei 2 astfel Inc at 2 Ia puterea k
1 divide pe V[1];
a1 a2 a3 a4 ... an.
Acestuia i se ata!?eaza un vector ale carui componente pot lua numai valori 0
sau 1 (pentru inceput 0). Un astfel de vector se nume!?te vector caracteristic.
Astfel avem:
0 0 0 0 ... 0.
Pentru ca acest vector sa reprezinte o submultime, facem urmatoarea
conventie: elementul continut in componenta k a primului vector apartine sau
nu submultimii considerate dupa cum componenta k a vectorului caracteristic
are valoarea 1 sau 0. Astfel, a genera toate submultimile multimii considerate
se reduce Ia generarea in cadrul vectorului caracteristic a tuturor combinatiilor
posibile de 0 sau 1. Cum rezolvam aceasta ultima problema? Simplu,
consideram ca vectorul caracteristic retine un numar in baza 2 (initial 0,
corespunzator submuJtimii vide). La fiecare pas se aduna 1 acestui numar (se
simuleaza adunarea cu 1 a numarului continut in vectorul caracteristic) !?i se
tipare!?te submultimea obtinuta (se tiparesc acele componente ale primului
vector carora le corespunde 1 Tn cadrul vectorului caracteristic). Astfel avem:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1 1 1 1 1 1 ... 1 1 1 1 {a 1,a2,...an}.
Daca tinem seama de faptul ca eel mai mare numar care se poate scrie in baza
2 prin utilizarea a n componente care retin 0 sau 1 este doi Ia puterea n-1,
regasim faptul ca o multime cu n elemente are doi Ia puterea n submultimi
(inclusiv cea vida), rezultat bine cunoscut de Ia matematica.
14. lnterclasare. Sa presupunem ca se citesc 2 vectori A !?i B, primul cu m
componente, al doilea cu n componente. Cei doi vectori se introduc deja
sortati. 0 prima posibilitate de lucru r fi sa-i trecem pe amandoi in cadrul
vectorului C, pe care apoi sa-l sortain. In acest fel nu beneficiem in nici un fel
de faptul ca cei doi vectori sunt deja sortati (se consuma mult timp inutil).
Prezentarea algoritmului se va face pe un exemplu:
A 1 3 4 58 (m = 5);
8 24567910(n=7);
Variabila i va retine indicele componentei Ia care s-a ajuns in vectorul A.
Variabila j retine indicele Ia care s-a ajuns in parcurgerea vectorului B. Variabila
k retine indicele elementului care urmeaza a fi scris in cadrul vectorului C.
Initial avem i = 1, j = 1, k = 1.
Se compara A[1] cu 8[1]. Este mai mic A[1], deci C[1] va fi 1, iva fi 2,
k=2.
Se compara A[2] cu 8[1]. Este mai mic 8[1], deci C[2]=2, k=3, j=2.
Se compara A[2] cu 8[2], este mai mic A[2], C[3] = 3, k = 4, i =
3.
Procedeul se repeta atat timp cat !?i i este mai mic sau egal cu m !?i j este mai
mic sau egal cu n. Este clar ca, Ia un moment dat, unul din vectori a fost
analizat complet (componentele sale au fost trecute in vectorul
C).
Compon.entele ramase din celalalt vector se copiaza !?i ele in vectorul C.
p ogram interclas;
type vector=array[1..100]
var a,b,c:vector;
i,j 1k1m 1n:integer;
of integer;
begin
1
write( 1
m=
);
readln(m); write( 1 n= 1 );
readln(n); for i:=1 tom
do
begin
Write (I a [I 1 i1 I ] :I) j
readln(a[i]);
end;
for j:=l ton do
begin
Write (I b [I I jI I:I) j
readln(b[j])
end;
i:=1; j:=1; k:=1;
while(i<=m) and (j<=n) do
begin
if a[i]<b[j] then
begin
c [k] :=a (i] ;
i:=i+1
end
else
begin
c [k] : =b [j] ;
j:=j+1
end;
k:=k+1
end;
if i<=m then
for j:=i tom do
begin
c [k] : =a [j1 ;
k:=k+l
end
else
for i:=j to n do
begin
c[k]:=b[i];
k:=k+1
end;
fori :=1 to k-1 do writeln(c[i]);
end.
superioara (Is);
initial li = 1 !?i Is=
n;
se compara valoarea lui m cu valoarea componentei din mijloc (mai corect,
de indice (li +Is) DIV 2) !?i apar trei posibilitati:
o egalitate, caz in care se tipare!?te indicele !?i algoritmul se termina;
o componenta din mijloc este mai mica decat valoarea cautata (aceasta
inseamna ca avem !?anse sa gasim valoarea cautata de Ia componenta cu
indicele imediat superior componentei care a fost comparata !?i cea de
indice Is), caz in care li va lua ca valoare indicele componentei care a fost
comparadi, Ia care se aduna 1, iar limita superioara ramane nemodificata;
o componenta din mijloc este mai mare decat valoarea cautata !?i, din
motive asemanatoare celor expuse anterior, limita superioara devine
in<Jicele componentei care a fost comparata, din care se scade 1, iar limita
interioara ramane nemodificata;
in ultimele doua cazuri algoritmul se reia pana cand limita inferioara
devine mai mare decat limita superioara, sau pana cand componenta a
fost gasita.
end
then li:=lin+l
else if v[1m]=m
then
begin
writeln(1m);
gasit:=true
end
else ls:=lm-1
begin
write (1 n= 1 ); readln(n);
for i:=O to n
do begin 1
write(1 a , i, 1 .. 1 ) ;
readln(c[i])
end;
p: 1;
write( 1 a= 1 ); readln(a);
f: =c [n] ;
for i:=n-1 downto o do
begin
p:=pa;
f:=f+c[i]p
end;
Writeln(If(I a:3:21
f:3:2)
I)I:
end.
1
tipul
egale cu 5. In cazul in care pe ultimul loc avem mai muli elevi cu aceea!?i
medie, toti ace!?tia sunt considerati admi!?i. Programul va afi!?a numarul de
locuri necesare in plus.
5. Un serviciu de evidenta a populatiei retine pentru fiecare persoana
urmatoarele:
nume: string[30];
varsta: byte;
apartenenta politic a ( 1 daca persoana este inscrisa intr-un partid, 0 In caz
contrar). in ituatia apartenentei persoanei Ia un partid politic se retine !?i
numele partidului (string [20]).
Scrieti un program care sa citeasca informatii despre n astfel de persoan !?i sa
tipareasca structura persoanelor pe optiuni politice.
citim
1 2
45
23
67
7 1
Se obtine partitia: {1, 2, 3, 6, 7} {4, 5} a multimii {1, 2,...,7}.
Vom prezenta un algoritm neperformant din punct de vedere al timpului de
calcul, insa accesibil in acest moment. in ce consta acest algoritm?
Toate elementele multimii considerate sunt citite sub forma (x,y). Printr-o
astfel de relatie se intelege ca x este echivalent cu y. Numarul de perechi care
se citesc este cunoscut de Ia inceput (n). 0 variabila (m) retine multimile care
se formeaza (este un vector de multimi). 0 alta variabila (nr m) retine indicele
maximal multimilor create (initial a;e valoarea 0). La citirea-unei perechi (x,y)
se ajunge intr-una din cele trei situatii care vor fi analizate in continuare.
Nici x, ci y nu apartin unei muliimi a partitiei. in acest caz se creeaza o
noua multime care va include cele doua elemente considerate (nr m cre!?te
cu o unitate).
Numai x sau numai y se gase!?te intr-una din multimile partitiei. in acest caz,
celalalt element este adaugat acelei multimi (de fapt multimea in care a fost
gasit un element se reune te cu multimea formata din cele doua elemef\te
!?i dupa regulile incluziunii elementul deja continut nu se mi adauga).
Elementul x se gase!?te intr-o multime !?i elementul yin alta. In acest caz cele
doua multimi se reunesc in cadrul multimii care are eel mai mic indice in vector.
in cazul in care cealalta rnultime era cu indicele eel mai mare nr m scade cu o
unitate, in caz contrar acea ta multime capata ca valoare multimea vida.
Pentru a testa apartenenta elementelor x !?i y multimilor considerate, se folosesc doua variabile GASIT !?i INDICE M. De cate ori este gasit un element in
tr-o multime, continutul variabilei GASIT cre!?te cu o unitate. in final, aceasta
poate avea trei valori: 0, 1 sau 2. Variabila INDICE M (vector cu componente
!ie tip byte) retine de fiecare data indicele multimiiincare se gase!?te x sau y.
In cazul in care GASIT are valoarea 0 continutul variabilei INDICE_M nu
intereseaza, daca GASIT are valoarea 1 intereseaza numai continutul primei
componente a variablei INDICE_M, iar daca GASIT are vaharea 2 ambele
m (iir mJ :-;[x, y] ;
Capitolul 6
Subprograme
6.1. Conceptul de subprogram
Blocul este unitatea de baza a oricarui program Pascal. El este format din
doua par!i:
o parte de declara!ii (constante, tipuri, variabile, proceduri !?i functii), optionala;
o instructiune compusa, obligatorie.
Exemplu: Multe programe (din domeniile cele mai diverse), pentru a putea
ajunge Ia rezultat, trebuie sa rezolve un sistem de ecua ii liniare. in acest caz,
se va scrie un subprogram care rezolva un astfel de sistem.
6.3. Proceduri
6.3.1. Declarare i apel
Procedura este un subprogram care se caracterizeaza prin faptul ca
rezultatele prelucrarii (exceptie facand operatiile de ie!?ire) se gasesc depuse
exclusiv in anumite variabile.
Unii autori diferentiaza procedura de functie, prin aceea ca procedura poate
returna mai multe rezultate.
DeclaratiaAprocedurii (procedurilor) se face in blocul apelant dupa declaratia
variabilelor. In acest paragraf vom considera numai proceduri fara parametri.
ln acest caz, o declaratie consta in a scrie cuvantul cheie PROCEDURE u'rmat
de numele procedurii.
Cu exceptia declaratiei, structura unei proceduri este aceea!?i cu structura
unui program, deci aceea de bloc.
Apelul unei proceduri se face prin numele ei. Atunci cand in blocul apelant
a fost intalnit un astfel de apel (se mai nume!?te !?i instructiune de apel), se
intrerupe secventa .Tn curs, se preda controlul procedurii !?i dupa executla
acesteia se revine Ia instructiunea imediat urmatoare celei de apel. In
Programul pr1 cite!?te doua numere a i b !?i calculeaza suma lor. Calculul
sumei se face in procedura 'suma'.
Programul ruleaza astfel:
se citesc variabilele a !?i b;
se preda controlul procedurii care atribuie variabilei c suma dintre a !;>i b;
se revine in programul apelant, unde se tipare!?te valoarea variabilei c.
Din studiul acestui exemplu mai observam ca:
variabilele a, b,c sunt variabile ale blocului apelant;
ele sunt recunoscute in procedura (dadi am fi declarat o variabila in
procedura, ea nu ar fi fost recunoscuta in programul apelant).
Exemp/u/2
program pr2;
var a,b,c,d:integer;
procedure adun;
begin
d:=a+b
end;
procedure scad;
begin
d:=d-e
end;
begin
write(1 a= 1 ) ;
readln(a);
write( 1 b= 1 );
readln(b);
write( 1 c=);
readln(c);
adun;
scad;
writeln{1 d=
end.
d)
readln(c);
b: =be end;
begin
write( 1 b= 1 );
readln(b);
sd;
a: =a+b
end;
begin
write( 1 a= 1 );
readln(a);
ad;
writeln(1 a= 1 I a)
end.
145
Exemplu/ 6
in acest exemplu se demonstreaza cum se redefine!?te o variabila. Valoarea
tiparita de program va fi 0. Variabila a este declarata de doua ori: in programul
principal !?i in procedura 'b'. in acest caz, compilatorul rezerva doua spatii In
memorie: unul pentru variabila a declarata in programul principal, altul pentru
variabila a declarata in procedura. Procedura lucreaza asupra
variabilei
declara te in cadrul
ei. Tn acest
caz,
variabila globala
a nu este
recunoscuta in procedura.
program pr6;
var a:integer;
procedure b;
var a: integer;
begin
a: =1
end;
begin
a: =o;
b;
writeln(a)
end.
Contraexemplu:
program pr7;
procedure a;
procedure b;
begin
writeln('merge');
end;
begin
end;
begin
end.
a)
in situatia In care procedura care este apelata se afla plasata dupa procedura
care o apeleaza !?i daca nu se iau masuri suplimentare, acest lucru nu este
posibil. Programul urmator da eroare de sintaxa.
program pr9;
var a:integer;
procedure pl;
begin
p2
end;
procedure p2;
begin
a:=a+l
end;
begin
write(a=');
readln(a);
pl;
writeln(1 a=' 1 a)
Pentru a putea realiza, din cadrul unei proceduri, apelul unei proceduri
plasate dupa procedura apelanta, antetul procedurii care este apelata se declara
Ia inceput, urmat de clauza FORWARD iar descrierea ei poate fi pusa dupa
procedura apelanta. Programul urmator demonstreaza acest fapt.
program pr9;
var a:integer;
procedure p2; forward;
procedure pl;
begin
p2
end;
procedure p2;
begin
a: =a+l
end;
begin
write( 1 a= 1 );
readln(a);
pl;
writeln(1 a= 1 , a)
end.
);
begin
s:=O;
for i:=l ton do s:=s+i
end;
begin
write( 1 n= 1 );
readln(n);
suma(s,n);
writeln(1 suma = 1 , s);
suma(s,lO);
writeln(suma primelor 10 numere = 1 ,s);
swna(s1,4);
writeln( 1 suma primelor 4 numere= 1 , sl)
end.
149
writeln(n)
end.
of integer;
procedure suma(n:integer;v:vector;var
begin
s:=o;
for i:=l ton do s:=s+v[i]
end;
begin
write( 1 n= 1 );
readln(n);
for i: =1 to n do
begin
Write( IV [ I 1 i 1 I ] =
readln(v[i])
end;
suma(n,v,s);
writeln( 1 S= 1 ,s);
end.
I )
s:integer);
DECLARATIE
-DE PROCEDURA
ANTET PROCEDURA
BLOC
Figura 6.3.2.1.
ANTET
PROCEDURE
IDENTIFICATOR
LISTA
PARAMETRI
-PROCEDURA
j
f)>
Figura 6.3.2.2.
INSTRUCTIUNE
--PROCEDlJRALA
IDENTIFICATOR
Figura 6.3.2.3.
LISTA
--PARAMETRI
FORMALl
LISTA
--PARAMETRI
EFECTIVI
IDENTIFICATOR TIP
IDENTIFICATOR
151
s:=o;
Pare mai simplu, nu-i a a? Gre eala Tn aceasta secvena se gase:?te ia linia
inv: = inv* 10 + n mod 10. Numele funqiei figureaza i In dreapta instruqiu:1ii
de atribuire. Deci se Tncearca apelul ei. Dar pentru apel functiei li sunt necesari
parametri pe care nu-i are preciza1i. in concluzie, compi!atorui va gener:1 o
eroare de sintaxa.
(concat(1 studiul
functiilor'))
BLOC
ANTET FUNCTIE
r---,
,/
_rJ
153
r---------,
I """
'"""
LISTA
NRAMETRI
:!._
FORMA...;
L - - - - -
,_
)_j-;o:
- - -
,... - - - - - -- - - ---'
IDENTIFICA
DETIP_J
tp
Figura 6.4.1.2.
APEL
IDENTIFICATOR
FUNCTIE
-FUNCTIE
.J .
1-usrA.I
"'
PARAMETRI 1-+! )
EFECTIVI
Figura 6.4.1.3.
procedure
begin
);
);
01
)
end.
Procedurile se pot apela i una pe alta, daca este Tndeplinita una din conditiile:
procedura care apeleaza se gase te plasata dupa procedura apelata;
nu este Tndeplinita conditia anterioara, dar s-a utilizat clauza FORWARD.
Denumirea provine de Ia faptul ca programul principal rezuita. Tn esenta, c:'
apelul acestor proceduri.
...(
);
procedure...(
);
begin
end;
begin
end;
begin
end.
155
IMPLEMENTATION
ltipuri de date i variabile locale (valabile numai pentru unitatea de program)]
procedurile !?i functiile utilizate de unitatea de program
[BEGIN o eventuala secventa de
program care se executa
in momentul declararii
unitatii de program in
programul care o utilizeaza.
END.]
writeln
end;
(c:3:2)
procedure scad(a,b:real);
begin
c: =a-b;
writeln(c:3:2)
end;
procedure produs(a,b:real);
begin
c:=a*b;
writeln (c:3:2)
end;
procedure
begin
if b=O
end;
impart(a,b:real);
then writeln ('Impartirea nu se poate face ')
else begin
c: =a/b;
writeln(c:3:2)
end
begin
write('a=');
write(b=');
end.
readln(a);
readln(b);
scad(c,d);
produs(c,d);
impart(c,d);
end.
majoritatea procedurilor
for i:=1 to 3 do
for j:=i+1 to 4 do
if nr[i]=nr[j] then nr corect:=false;
if nr[1]=o then nr_corect: false;
end;
procedure c n(nr1,nr2:numar;var c,n:integer);
var i,j:integer;
begin
c:=o;
n: =0;
for i:=1 to 4 do
if nr1[i]=nr2[i] then c:=c+1;
for j:=1 to 4 do
if (nr1[i]=nr2[j])and(i<>j) then n:=n+1
end;
procedure ascund(var nr:numar);
var i:integer;
begin
for i:=1 to 4 do nr[i]:=random(10)
end;
begin
randomize;
repeat
ascund(nr ascuns);
until nr_corect(nr_ascuns);
repeat
repeat
readln(nr);
i:=4;
while nr<>o do
begin
nr citit[i]:=nr mod 10;
nr:=nr div 10;
i:=i-1
end
until nr corect(nr citit);
c n(nr ascuns,nr citit,c,n);
writeln(centrate=,c, necentrate=,n)
until c=4
end.
6.8.
end.
admit
posibilitati:
In functie de tipul telefonului l?i modul de transmitere a numarului, In cadrul
lnregistrarii sa se memoreze un text care sa descrie acest algoritm, solutie
extrem de ineficienta;
programul sa contina o procedura care analizand lnregistrarea pentru un
telefon sa furnizeze algoritmul sau de funqionare (In ac st caz legatura lntre
procedura !?i date nu se realizeaza In cadrul unei constructii sintactice unice,
iar In cele ce urmeaza se vor evidentia !?i alte dezavantaje).
Aceste neajunsuri lncearca sa le rezolve programarea pe obiecte.
Pentru aceasta, limbajul TURBO PASCAL 6.0 dispune de un mecanism
specific. Astfel, apare un nou tip !?i anume tipul obiect.
Prin obiect se lntelege o constructie sintactica unica In care se pun Ia un loc
datele !?i procedurile care lucreaza cu aceste date !?i care este recunoscut de
compilator prin cuvantul cheie OBJECT.
Procedurile sau functiile existente lntr-un obiect se numesc ,METODE".
Rezulta ca, pentru exemplul nostru, avem nevoie de o variabila obiect pe
care o putem numi TELEFON !?i care sa contina toate informatiile 1)...4) precum
!?i !!letoda (procedura care descrie algoritmul de folosire a acestuia).
In ultimii ani au aparut telefoane moderne cu facilitati suplimentare (memorie,
robot etc.). Este evident faptul ca algoritmul de utilizare a unui astfel de telefon
contine In plus !?i alte elemente cum ar fi memorarea unui numar de telefon,
efectuarea unui apel dupa un numar deja memorat, lansarea unui mesaj pe
robot etc. Aceasta lnseamna ca algoritmul de folosire a telefonului se complica
deci avem nevoie de noi metode pe langa cele vechi. Rezulta ca este absurd
sa rescriem aceste proceduri lntr-un alt tip de obiect TELEFON M. Tn cadrul
limbajului exista posibilitatea de a construi un nou obiect (In -cazul nostru
TELEFON_M) pornind de Ia unul vechi, preluand toate datele !?i metodele
acestuia Ia care se pot adauga date !?i/sau metode noi. Revenind Ia ipoteza In
care nu folosim programarea pe obiecte !?i avem o procedura din exterior care
furnizeaza algoritmul, aceasta ar trebui modificata, fapt ce presupune un efort
suplimentar de programare.
tipului
obiect
OBJECT
metoda 1;
{metoda_2};
{metoda_n}
PRIVATE
164
object
lista 1 campuri :tip;
{lista 2 campuri :tip;}
{lista_p campuri :tip:}
metoda 1;
{metoda_2};
{metoda_n}
end
of integer;
implementation
procedure vector.cit;
var i:integer;
begin
write(lung=');
readln(lung);
for i:=l to lung do
begin
write('elem[' I i 1 ' l =');
readln(vec[i])
end
end;
procedure vector.tip;
var i:integer;
begin
for i:=l to lung do
begin
write('elem[' 1 i,']=' 1 vee[i]);
writeln
end
end;
end.
a.cit;
a. tip;
end.
6.9.2.2. Mo9tenirea
in cele ce urmeaza exemplificam mecanisul de ,MO$TENIRE". Sa
presupunem ca ne intereseaza o situatie privind notele obtin!;Jte de elevii unui
liceu Ia un examen (notele sunt considerate numere intregi). In acest exemplu
avem o noua variabila obiect (ELEV) care trebuie sa contina :
numele elevului;
o procedura de citire a acestui nume;
notele elevului 9i procedura de citire a acestora.
Notele obtinute de elev Ia examen constituie un vector. Pentru acesta avem
deja un obiect (VECTOR) ce include !?i metoda de citire a componentelor
vectorului (a notelor obtinute de elev). Rezulta ca obiectul VECTOR ne este de
mare folos In construirea noului obiect ELEV. Limbajul permite acest lur:ru.
Analizand unitatea de program in care construim acest nou obiect se desprind
urmatoarele :
noua unitate de program OBIECT2 utilizeaza unitatea OBIECT1, acest lucru
se specifica utilizand clauza USES.
noul obiect il utilizeaza pe eel vechi 9i acest lucru se specifica plasand
numele obiectului utilizat, a9ezat intre paranteze, dupa cuvantul cheie
OBJECT (in acest mod, noul obiect preia toate datele 9i metodele vechiului
obiect);
datele 9i metodele care apar pentru prima data aici se descriu in clar in
noul tip dupa regulile deja specificate.
unit obiect2;
interface
uses obiectl;
type elev=object(vector)
procedure cit_nume;
private
nume:string[20];
end;
implementation
b:elev;
begin
b.cit;
b.cit nume;
a:=b; a.tip
end.
Observafie: Atribuirea unei variabile obiect de un tip descendent a valorii
unei variabile de un tip stramo!ji nu este posibila. De exemplu, unei variabile de
tip elev nu i se poate atribui valoarea unei variabile de tip vector. Care este
ra Junea acestui fapt?
In ipoteza ca aceasta atribuire este posibila, raman campuri necompletate in
variabila de un tip descendent. Ce semnifica ie logica poate avea con inutul
unei varia bile de tip elev care con ine un elev tara nume dar cu note?
test2(m:vector);
begin
testl(a);
test2(a);
testl(b);
test2(b)
end.
6.9.2.5. Polimorfism
in biologie, prin polimorfism se. intelege fenomenul prin care indivizi
apartinand aceleiai specii apar sub forme diferite.
Prin analogie, In programarea pe obiecte, prin polimorfism se inte!ege ca o
procedura, recunoscuta printr-un nume, poate sa apar2 sub mai mu!te forme
(mai multe proceduri cu acelai nume).
in procesul de ,MO$TENIRE" poate aparea problema redefinirii unor r11etode
(pentru un obiect descendent dorim 7nlocuirea :.mei metode a unui obiect
stramo!ji cu o metoda noua). Pentru aceasta, Tn noui obiect se scrie o metoda
cu acelasi nume ca acela al metodei ce se lnlocuieste.
in exe plul urmiHor vom construi doua obiecte numar i numar 1 . Pentru
obiectul numar1 am redefinit procedura tip (modificand mesajul Ia afi are).
unit obpoll;
interface
type numar=object
nr:integer;
procedure cit;
procedure tip;
end;
implementation
procedure numar.cit;
begin
write( 1 numar= 1 );readln(nr)
end;
procedure numar.tip;
begin
writeln(1 numar= 1, nr)
end;
end.
unit obpol2;
interface
uses obpoll;
type numarl=object(numar)
procedure tip;
end;
implementation
procedure numarl.tip;
begin
writeln( 1 numarl= 1 ,nr);
end;
end.
interface
uses obpolll;
type numarl=object(numar)
procedure tip;
end;
implementation
procedure numarl.tip;
begin
writeln( 1 numar1= 1 , nr);
end;
end.
Observatii:
end;
implementation
constructor numarl.init;
begin
end;
procedure numarl.tip;
begin
writeln('numarl=',nr);
end;
end.
10. Sa se tipareasca toate numerele prime af!ate intre doi intregi cititi.
Programul va folosi o functie booleana care returneaza daca un numar este
prim sau nu.
11. Scrieti un program care tipare te numerele intregi gasite intre doua vi'llori
citite care se divid cu suma cifrelor lor. Programul va utiliza o functie care
returneaza suma cifrelor unui numar intreg primit ca parametru.
12. Sa se scrie o procedura care permuta doua linii ale unei matrice
patratice.
13. Sa se scrie o procedura care permuta doua coloane ale unei matrice
patratice.
14. Sa se scrie un program care sorteaza descresciHor elementele situate pe
diagonala secundara a unei matrice patratice prin permutari de linii !?i coloane.
Programul va utiliza procedurile de Ia problemele 1 2 i 1 3.
17. Cititi doua polinoame de grade m !?i n !?i calculati polinomul produs.
18. Cititi un polinom F de gradul n !?i m valori reale a 1, a2, ..., am. Calculati
valoarea polinomului pentru cele m valori citite.
x 1 1 , daca x :5 - 3 ;
1
a) F(x)='j 3*X. daca -3<X<=100;
1
= sin(x) +
c) H(x)
= 10
cos(X)*COs(2*x);
21. Sa se scrie o procedura care calculeaza valorile uneia din cele trei funqii
din problema 20 In cele n + 1 puncte rezultate din lmpaqirea intervalului [a,b]
In n paqi egale.
lndicatie. Procedura va avea un parametru formal de tip functie.
22. Sa se scrie o unitate de program care contine urmatoarele proceduri !?i
funqii utile In calculul cu matrice:
procedura de citire a unei matrice cu m linii !?i n coloane;
procedura de tiparire a unei matrice cu m linii !?i n coloane;
23. Scrieti un program care utilizeaza o parte din subprogramele din pro
blema anterioara. Apelarea acestora se va face din cadrul unitatii de program.
24. Scrieti un program care creeaza o inregistrare (de tip RECORD) care are
urmatorul continut:
nr de tip integer (retine un numar intreg);
o variabila de tip procedura numita CIT care va contine o procedura ce
cite!?te un numar intreg (de fapt adresa catre o astfel de procedura);
o variabila de tip procedura numita TIP care contine o procedura ce tipare!?te
un numar intreg.
Considerati doua variabile de tipul descris anterior. Cu ajutorul lor cititi !?i
tipariti doua numere intregi. Nu gasiti o mare asemanare intre acest mod de
lucru !?i variabilele obiect? $i o variabila de tipul de date creat acum !?i o
variabila de tip obiect contin date !?i proceduri (metode).
25. Creati un obiect numit MATRICE. Acesta va contine urmatoarele date
l?i metode:
N - numarul de linii ale matricei; M - numarul de coloane ale matricei;
MAT - o structura de tip matrioe cu elemente numere reale;
CIT - o metoda care cite!?te o matrice;
TIP- o metoda care tipare!?te o matrice.
Observatie. Cele doua metode vor fi preluate din unitatea de program creata
Ia problema 22. De fapt, in dezvoltarea aplicatiilor se scriu intai unitati de
program care contin diverse subprograme utile !?i cu ajutorul acestora se scriu
diverse obiecte, care apoi se mol?tenesc, !?.a.m.d.
26. Scrieti o procedura care aduna doua variabile de tip MA TRICE.
27. Creati un obiect numit ABSOLVENT care contine urmatoarele:
Numele bsolventului (string[30]);
Situatia !?Colara - o matrice in care liniile reprezinta cei 4 ani de studiu iar
coloanele notele obtinute de acesta Ia diverse materii, in ordinea in care
acestea au fost trecute in catalog;
o metoda in care se cite!?te situatia !?COiara;
o metoda de tiparire a situatiei;
o metoda care calculeaza media generala pe diveri ani de studiu;
o mete:da care calculeaza media generala;
o metoda care valideaza notele (sa fie intre 5 si 1 0).
Se cere ca acest obiect sa mo!?teneasca obiec.tul MATRICE.
28. inzestrati obiectul creat Ia problema 27 cu o alta metoda de tiparire a
situatiei !?Colare (mai eleganta decat tiparirea unei matrice) i care are acela i
nume cu metod3 care tipare!?te matricea. Cum putem selecta dupa dorinta, o
Capitolul 7
RO j U
Verde
Albastru
Valoare
Intens
Negru (Black)
Albastru (Blue)
Valoare
lntens
Ro u
Verde
Albastru
Verde (Green)
Turcoaz (Cyan)
Rou (Red)
Violet (Magenta)
Maro (Brown)
Vernil (LightGreen)
10
11
Roz (LightRed)
12
13
Galben (Yellow)
14
Alb (White)
15
Culoarea
..
De multe ori este necesar sa adresam octe ii memoriei video in doua moduri:
ca octeti care retin caractere;
ca octei care re in numere.
: Din acest motiv se face o dubla declarare a memoriei video (este numai una
din modalita i). in programul urmator, se umple memoria video cu spa ii (pe
fond negru) !?i se scrie in prima linie !?i prima coloana caracterul 'a'. Scrierea se
face negru, pe fond 8lb. Pentru aceasta scriere, octetul de atribute culoare ia
valoarea 112 (01110000).
program mv2;
type mv=array[1.25,1.80,1.2] of char;
mvb=array[1..25,180,1..2] of byte;
var
ecran: mv absolute $b800:0;
ecran1:mvb absolute $b800:0;
i,j:integer;
begin
for i:=1 to 25 do
for j:=1 to 80 do
begin
ecran1[i,j,2]:=0;
ecran[i,j,l] :=' ';
end;
ecran1[1,1,2]:=112;
ecran1,1,1]:='a';
end.
7.2. Ferestre
0 fereastraJeprezinta o portiune dreptunghiulara a ecranului in care se fac
citiri !?i scrieri. lntreg ecranul este o fereastra implicita (daca nu se declara alte
ferestre). Procedurile si functiile unitatii CRT se refera Ia o anumita fereastra
(cea care este activa (a un moment dat).
Observatie: o singura fereastra este activa Ia un anumit momen .
Deschiderea unei ferestre se face utilizand procedura WINDOW care are
forma urmatoare:
WINDOW (x1,y1,x2,y2).
Perechile (x1,y1), (x2,y2) reprezinta coordonatele colturilor din stanga sus
i dreapta jos. Este de mentionat faptul ca x1, x2 reprezinta coloane i y1,y2
reprezinta linii. Coltul din stanga sus al unei ferestre are coordonatele ( 1,1 ) .
in programul f1, deschidem o fereastra.
program f1;
uses crt;
begin
window
end.
(10,10,20,20)
Daca vom analiza efectul acestui program, vom ramane surprini de faptul
ca fereastra nu este vizibila. Cu toate acestea cursorul este pozitionat in coiJul
din stanga sus al ferestrei deschise.
Faptul ca fereastra deschisa este invizibila se explica prin culoarea ei de
Dupa rularea lui, nu observam nimic diferit fata de modul in care a decurs
executia Tn programul anterior. Culoarea de fond devine vizibila Tn doua cazuri:
dupa rularea procedurii CLRSCR;
dupa ce am scris efectiv Tn fereastra.
Procedura CLRSCR nu are p rametri !jii are urmatoarele efecte:
umple fereastra cu blancuri (curata fereastra);
atribuie Tntregii ferestre culoarea sa de fond (declarata cu TEXTBACK
GROUND); pozitioneaza cursorul Tn coltul din stanga sus.
Prin rularea programului urmator va veti convinge de acest lucru.
program 3;
uses crt;
begin
_
window (10,10,20,20);
textbackground(3);
clrscr;
end.
begin
window (10,10,20,20);
textbackground(3);
textco1or(O);
write('text')
end.
Exista posibilitatea ca fiecare text scris intr-o fereastra sa fie identificat prin
propriile culori de fond l?i de scriere a caracterelor. Tocmai acesta este motivul
pentru care, dupa executia procedurii TEXTBACKGROUND, intreaga fereastra
nu capata culoarea de fond solicitata.
program 6;
uses crt;
begin
window (10,10,20,20);
textbackground(3);
textcolor(O);
-:,.clrscr;
'writeln('text1');
textbackground(O);
textcolor(15);
writeln('text2')
end.
clrscr; write('a='l;
readln(a);
window(ll,l1,40,25);
textbackground(2);
textcolor(7);
clrscr;
write('a=',a);
window(l,l,lO,lO);
textbackground(3);
textcolor(lS);
clrscr;
write('a=',a)
end.
');
end.
clreol;
{$i-} read(a) {$i+}
until ioresult=O
write('am scris un
mesaj');
gotoxy(l,wherey+l
); write('scriu
alt mesaj');
gotoxy(l,wherey+l
); write('al
treilea mesaj');
gotoxy(l,wherey1);
delline
end.
i
n
c
:
=
r
e
a
d
k
e
y
end.
Utili
zata In
mod
intelige
nt,
aceasta
functie
se
dovede!
jite a fi
extrem
de
utila.
Multe
program
e
raman
in a!
j>teptare
pana se
apasa o
anumita
tasta.
Unele
taste
returnea
za
caracte
re cu
codul
cuprins
intr-un
octet,
altele
(special
e)
returne
aza
caracte
re cu
codul
pe doi
sus');
jos');
stanga');
d eapta')
DELAY(n:word).
Parametrul n exprima timpul de a!jiteptare exprimat in milisecunde.
Combinate, cele trei proceduri pot produce un sunet o anumita durata de timp.
program a6;
uses crt;
begin
sound(lOOO);
delay(2000);
nosound
end.
7.4. Aplicatii
7.4.1. Unitatea de program UTIL
in paragrafele anterioare s-a aratat modul de lucru cu ferestre. Pentru a
scrie cu U!?urinta programe in care intervin aceste ferestre vom prezenta o
unitate de program (numita UTIL) care contine o serie de proceduri utile in
acest caz. Tot aici se gasesc definite constante, o serie de caractere din codul
ASCII cu care vom Iuera des. in continuare, prezentam pe larg procedurile
continute in unitate.
7.4.1.1. Procedura DESCHID F
Are rolul de a deschide o fereastra Ia care au fost precizate culorile de fond
!?ide scriere a caracterelor. Odata deschisa, fereastra capata culoarea de fond.
Forma generala de apel pentru aceasta procedura este:
DESCHID_F (xc1,yc1,xc2,yc2,fd,cnl);
Toti parametrii sunt de tip byte, sunt transmi!?i prin valoare l?i au urmi'hoarea
semnificatie:
xc 1,yc 1 _ coordonatele coltului din stanga sus al ferestrei;
yc1,yc2 - coordonatele coltului din dreapta jos al ferestrei;
fd,cnl
- culorile de fond !?i de scriere a caracterelor.
Programul urmator deschide o fereastra utilizand aceasta procedura.
program ul;
uses util;
var a:integer;
begin
deschid f(3,3,20,20,rosu,verde);
write ('a=') i
readln(a);
end.
-,
A_D_BARA(xc,yc,coloana,linia,lungime).
Toti parametri formali sunt de tip byte !jii au semnificatia:
(xc,yc)
- coordonatele coltului din stanga sus al ferestrei de meniu;
(coloana,linia)
- coordonatele primului caracter caruia i se vor inversa
atributele de culoare;
lungime
- numarul de caractere pentru care se inverseaza atributele de
culoare (lungimea barei).
Care este principiul de lucru al acestei proceduri? Aparitia barei luminoase
se face prin inversarea culorilor de fond !jii de scriere a caracterelor (ne aducem
aminte ca pentru fiecare caracter ce apare pe ecran exista in memoria video un
octet care retine atributele de culoare) iar daca bara este prezenta, reinversarea
culorilor va duce Ia disparitia ei.
program u3;
uses util,crt;
var xb,yb,c:byte;
begin
deschid f(50,20,53,23,rosu,negru);
seriu f('opt1',50,20,1,1);
scriu-f('opt2',50,20,1,2);
scriu-f('opt3',50,20,1,3);
scriu-f('opt4',50,20,1,4);
cursor(false);
ad bara(50,20,1,1,4);
xb:-;1; yb:=1;
plimb bara v(50,20,53,23,4,xb,yb,c);
desehid f(l,l,80,25,negru,alb);
cursor(true);
gotoxy(1,1);
if c=enter then
case yb of
1: writeln('optiunea 1');
2: writeln('optiunea 2');
3: writeln('optiunea 3');
4: writeln('optiunea 4')
end {ease}
end.
#201;
#187;
#188;
#200;
#205;
#186;
#179;
#196;
colt s s1
= #218;
co1t-s-j1
= #192;
co1t-d-s1
= #191;
colt d j1
#217;
Negru=O; Albastru=l; Verde=2; Bleu=3; Rosu=4; Mov=S; Maro=6;
GriDeschis=7; Griinchis=8; AlbastruDeschis=9; VerdeDeschis=10;
BleuDeschis=ll; RosuDeschis=12; RozDeschis=13; Galben=14;
Alb=15; Clipitor=16;
procedure deschid f(xc11yc11 XC21 yC21 fd1 cn1:byte);
.
procedure
scriu
f(sir:string;XC1
YC1
Coloana1
linie:byte);
procedure
ad
bara(xc
yclcoloanalliniellung:byte);
procedure pfimbbara v(x11y11 X21 y21 lung:byte;var xb1yb1c:byte);
procedure plimb-bara o(x11y11x21y21lunglp:byte1var
.
xb I yb 1 c:bytef j
procedure cursor(afisare:.boolean);
implementation
uses CRT1DOS;
type aleg=(caracter atribute);
var ecran :array[1251 1.801 caracteratribute] of char
absolute $b800:0;
ecran1 :array[l..251 1..801 caracteratribute] of
byte
absolute $b800:0;
procedure deschid ;
begin
Window(xc11yc1 xc21yc2);
TextBackground(fd);
TextCo1or(cnl);
clrscr
end;
procedure scriu f;
var x1y1i:byte;
begin
x:=xc+coloana-1;
y:=yc+linie-1;
for i:=O to length(sir)-1 do ecran[y1 X+i1 caracter]:=sir[i+1];
end;
procedure a_d_bara;
var
ilxlylcnl1fd:integer;
begin
X::XC+COloana-1;
y:=yc+1inie-1;
cnl:=ecran1[yx1 atribute] mod 16;
fd:=(ecran1[y x atribute] div 16) mod 8;
for i:=O to lung-1 do
ecran1[ylx+ilatribute]:=cnl*16+fd;
end;
function codu1:byte;
var c:char;
begin
c:=readkey;
if ord(c)=O then,c:=readkey;
codul:=ord(c)
end;
procedure plimb_bara_v;
begin
repeat
c::codul;
case c of
sus: if yb=l then
begin
ad bara(x1,yl,xb,yb,lung);
yb:-;y2-y1+1;
ad bara(x1,yl,xb,yb,lung)
end-else
begin
ad bara(x1,y1,xb,yb,lung);
yb:-;yb-1;
a d bara(x1,y1,xb,yb,lung)
end;- jos: if yb=y2-y1+1 then
begin
ad bara(x1,y1,xb,yb,lung);
yb:-;1;
a d bara(x1,y1,xb,yb,lung)
end - else
begin
ad bara(xl,y1,xb,yb,lung);
yb:;yb+l;
ad bara(x1,y1,xb,yb,lung)
end;- end; {case}
until (c=esc) or (c=enter);
end;
procedure plimb bara o;
begin
repeat
c:=codul;
case c of
stanga: if xb=l then
begin
ad bara(xl,y1,xb,yb,lung);
xb:;x2-xl-lung+2;
a d bara(x1,yl,xb,yb,lung)
end-else
begin
ad bara(x1,y1,xb,yb,lung);
xb:;xb-lung-p;
ad bara(x1,y1,xb,yb,lung)
end;-
dreapta:
if xb+lung-2 = x2-xl then
begin
ad bara(xl,yl,xb,yb,lung);
xb:;l;
ad bara(x1,yl,xb,yb,lung)
end-else
begin
ad bara(xl,yl,xb,yb,lung);
xb:;xb+lung+p;
a d bara(xl,yl,xb,yb,lung)
end;- end; {case}
until (c=esc) or (c=enter);
end;
procedure cursor;
var r:registers;
begin
r.ah:=l;
if afisare then
begin
r.ch:=6;
r.cl:=7;
end
else
begin
r.ch:=32;
r.cl:=7
end;
intr(16,r);
end;
end.
7 .4.2.1. Metoda
DESCHID Se apeleaza
astfel:
nume variabila.DESCHID(x1,y1,x2,y2,fd,cl,n,tip,vizibil);
Parametrii au urmatoarea semnificatie:
x1 ,y1,x2,y2: coordonatele colturilor din stanga sus !jii dreapta jos ale
ferestrei;
fd,cl - culorile de fond !?i cerneala;
n - numarul ferestrei;
tip - tipul ferestrei (fara chenar- 0, chenar simplu- 1,chenar dublu - 2);
vizibil - parametru ce precizeaza daca este vizibil sau nu cursorul in fereastra.
Cu exceptia ultimului parametru (care este de tip boolean) restul sunt de tip
byte. Toti parametrii sunt transmi!?i prin valoare.
7.4.2.2. Metoda SALVEZ
Are rolul de a salva continutul unei ferestre (salvarea se face in memoria
interna a calculatorului; de fapt se salveaza intregul ecran pentru a nu pierde
:?i contextul in care se gase:?te fereastra). Se apeleaza prin:
nume variabila.SALVEZ
7.4.2.3. Metoda RESTAUREZ
Are rolul de a reface o fereastra pe ecran (o aduce din locul de unde a fost
salvata). Apelui se face prin:
nume variabila.RESTAUREZ.
Mecanismul de realizare al ultimelor doua proceduri il vom invata anul
urmator.
Programul urmlHor exerr.plifica lucrul cu acest obiect 9i realizeaza:
se declara doua variabile de tip fereastra;
pentru intreg ecranul se stabile9te fondul negru !?i culoarea de scriere a
caracterelor- alba.
se deschide o fereastra pe care se scrie o linie (fereastra are chenar simplu
iar cursorul este prezent);
e aceasta fereastra se salveaza;
se deschide o alta fereastra cu chenar dublu in care cursorul nu este prezent;
se scrie prima linie a acestei ferestre;
se restaureaza prima fereastra.
program ferl;
uses fers,util,crt;
var a,b:fereastra;
begin
textbackground(negru);
textcolor(alb);
clrscr;
a.deschid(l,l,S,S,negru,rosu,l,l,true);
write(l,2,3);
delay(3000);
a.salvez;
b.deschid(l,l,lO,lO,rosu,negru,2,2,false);
write(1,2,3,4,5,6,7,8);
delay(3000);
a.restaurez;
end.
of ref;
procedure fereastra.deschid;
var i:integer;
begin
nr f:=n;
tip_f:=tip;
xcs:=xl;
ycs:=yl;
xcj:=x2;
ycj:=y2;
fond:=fd;
culoare:=cl;
viz:=vizibil;
cursor(vizibil);
deschid f(xl,yl,x2,y2,fd,cl);
if tip >0 then
begin
if tip=l
then write(colt s all
else write(colt-s-s);
for i:=2 to xcj-xcs do
begin
gotoxy(i,l);
if tip=l
then write(orizontall)
else write(orizontal);
gotoxy(i,ycj-ycs+l);
if tip=l
then write(orizontall)
else write(orizontal);
end;
gotoxy(xcj-xcs+l}l);
if tip=l
then write(colt d sl)
else write(colt-d-s);
for i:=2 to ycj-ycs do
-begin
gotoxy(l,i);
if tip=l
then write(verticall)
else write(vertical);
gotoxy(xcj-xcs+l,i);
,
if tip=l
then write(verticall)
end;
else write(vertical);
gotoxy(l,ycj-ycs+l);
if tip=l
then write(colt s jl)
else write(colt-s-j);
if tip=l then scriu f(colt djf:.xcs,ycs,xcj-xcs+l,ycj-ycs+l)
else scriu-f(colt-dj,xcs,ycs,xcj-xcs+l,ycjycs+l);
deschid f(xcs+l,ycs+l,xc]-l,ycj1,3,7);
,i7
end;
end;
proced
ure
ferea
stra.
salve
z; var
b:ecra
n
absolu
te
$b800
:0;
begin
new(v[nr ]);
v[nr f]...:=b;
xcursor:=wherex;
ycursor:=wherey;
end;
procedu
re
fereas
tra.re
staure
z; var
b:ecran
absolut
e
$b800:
0;
begin
b:=v[nr ] ... ;
dispose(v[nr ]);
window(xcs+l ycs+l,xcj-l,ycj-1);
gotoxy(xcursor,ycursor);
cursor(viz);
end;
end.
7
.
4
.
3
. Meniul
obiect
Pentru
scrierea cu
U!?Urinla a
meniurilor, In
cele ce
urmeaza e
prezinta
obiectul MEN
(obiect de tip
meniu) care
se gase!?te
plasat in
unitatea
MENU. Acest
obiect
mosteneste
obiectul
FEREASTRA
(deci toate
datele si
metodele
prezentate In
cadi-ul acelui
obiect se
regasesc aici).
Tn plus, acesta
a're alte date
!?i metode.
Datele noi
sunt:
xb,
yb:
coordonat
ele
In
cadrul
ferestrei
ale
primului
caracter
al
barei
luminoase;
lung, hi:
lungimea !?i
inaltimea
ferestrei de
meniu;
rasp:
raspunsul
operatorului in
cadrul
selecliei
begin
textbackground(negru);
c1rscr;
a.deschidm(1011014141verde
rosul1141
1false);
if a.selectat then
begin
deschid f(1111 801251 negru1 a1b);
case a.cityb of
1: writeln('optiunea 1 1 );
2: writeln( 1 optiunea 2 1 );
3: writeln( 1 optiunea 3 1
);
4: write1n( 1 0ptiunea 41 )
end {case}
end
end.
1 opt1opt2opt3opt4 1
procedure impartire;
begin
end;
if a.se1ectat then restaurezm
until a.inchis
end.
a:string; vizibi1:boolean);
procedure restaurezm;
function se1ectat:boo1ean;
function citxb:byte;
function cityb:byte;
function inchis:boolean;
end;
implementation
procedure men.des hidm;
var
i:byte;
c:string;
begin
lung:=1;hi:=h;lbar:=1b;
deschid(x1,y1,xl+l-1,y1+h-1,fd,cl,n,O,vizibil);
cursor(false);
if h=1 then
begin
scriu f(a,x1,y1,1,1);.
ad bara(x1,y1,1,1,1b);
xb: 1;yb:=1;
.
plimb bara o(x1,y1,x1+l-l,y1+h-1,lb,O,xb,yb,rasp);
end
else
begin
for i:=1 to 1er..gth(a) div 1 do
begin
c:=copy(a,(i-1)*1+1,1);
scriu f(c,x1,y1,1,i);
end;
ad bara(x1,y1,1,1,1);
xb: 1;
.
yb:=1;
plimb bara v(x1,y1,x1+1-1,y1+h-1,l,xb,yb,rasp)
end;
end;
function men.se1ectat:boo1ean;
begin
se1ectat:= (rasp=enter)
end;
function men.citxb:byte;
begin
citxb:=xb
end;
function men.cityb:byte;
begin
cityb:=yb
end;
function men.inchis:boolean;
begin
inchis:= (rasp=esc);
end;
procedure men.restaurezm;
begin
restaurez;
if hi<>l then
plimb_bara_v(xcs,ycs,xcs+lung-l,ycs+hi-l,lung,xb,yb,rasp)
else
plimb bara_o(xcs,ycs,xcs+lung-l,ycs+hi-1,lbar,O,xb,yb,rasp);
end;
end.
5. Sa se scrie o procedura care cite!;ite o matrice de trei linii !?i trei coloane.
Citirea se va face intr-o fereastra care are o culoare distincta de restul
ecranului. Elementele se introduc in pozitia curenta a cursorului (acesta va fi
pozitionat in a!?a fel incat elementele citite sa fie pozitionate Tn fereastra ca !?i
in matrice).
6. Sa se scrie o procedura care tipare!?te o matrice cu trei linii i trei coloa
ne. Tiparirea se face Tntr-o fereastra cu o culoare de fond diferita de restul
ecranului. in cadrul ferestrei elementele vor fi pozitionate intocmai ca intr-o
matrice.
end;
begin
parl:='Costinesti';
citpar(par);
if par=parl then writeln
end.
('ok')
2.
program citnum;
uses crt;
var n,i_o: integer;
pro9edure citn(var n:integer);
beg1n
repeat
gotoxy(lO,lO);
write('n=');
clreol;
{$i-} read(n) {$i+};
J._o:=ioresult;
if i o <>0 then
begin
sound(SOOO);
delay(lOO);
nosound
end
unt;il i o =0;
end;
begin
citn(n);
writeln('valoarea
end.
a:=c;:opy(a,l,wherex-l)+C+Copy(a,wherex+l, n-wherex);
scr1u f(a,xl,yl,l,l);
gotox(wherex+l, wherey)
end
else
.
if(a[wherex]<>'')and(ord(c)<>B)and(ord(c)<>enter)
then begin
a:=c;:opy(a,l,wherex-l)+C+Copy(a,wherex,n-wherex);
scr1u f(a,xl,yl,l,l);
gotox(wherex+l;wherey)
end;
{bs}
if (c=#S) and (wherex>l) then
begin
a:=copy(a,l,wherex-2)+copy(a,wherex,n-1)+' ';
scriu (a, l,yl,l,l);
gotox(wherex-l,wherey)
end;
end
until ord(c)=enter;
end;
begin
textbackground(negru);
textcolor(alb);
clrscr; a:='l2345678';
cit(a,verde,rosu,37,10);
window(l,l,S0,25);
textbackground(negru);
textcolor(alb);
clrscr;
write(a)
end.
Capitolul 8
Fiiere Pascal
8.1. Fiiere text
Se nume te fiier text o succesiune de caractere ASCII terminata cu carac
terul AZ . Putem considera fiierul ca fiind alcatuit din linii separate prin doua
caractere (CR i LF) i care nu au in mod obligatoriu lungimea egala, dei, in
practica, intalnim de multe ori fiiere text cu o singura linie.
Fi ierele text au o importanta deosebita din doua motive:
sunt direct afiabile;
orice editor de texte lucreaza cu fi iere de acest tip.
Structura generala a unui fiier text se observa in figura de mai jos.
TIP
.,_
-FI$1ERTEXT
Figura 8.1.1.
Exemplul 1:
var a:text;
assign(a,'fl.dat')
Exemplul 2:
var a:text;
b:string;
b:='fl.dat'
assign(a,b)
Exemplul 3:
Fi!?ierul se gase!?te sau se va gasi pe a !?iva avea numele t.txt.
var a:text;
assign
(a,'a:\t.txt')
Exemplul 4:
Fi!?ierul se gase!?te sau se va gasi pe C in subdirectorul v al directorului h
!?i se nume te util. .
var a:text;
assign(a,c:\h\v\util).
while not eo do
begin
readln(a);
writeln(f,a)
end;
close()
end.
1
2
3
4
asdfghj
1 2weh
ag
1
Oare variabilele de tip string sunt singurele care se pot scrie i citi din
fi!?iere? Raspunsul Ia aceasta intrebare este negativ, i acum este momentul sa
Acest program listeaza fi!?ierul creat Ia inceputul acestui capitol. Liniile apar
listate exact in ordinea in care au fost introduse (se stie ca f1.dat a fost creat
pe mai multe linii).
tipul numeric).
Procedura Readln fara parametri de tip variabila produce saltul pe linia
urmatoare (exemplu READLN (F) ), iar cu parametri, dupa ce a reu!?it tentativa
de citire se sare pe linia urmatoare.
Pentru scriere, se folosesc procedurile WRITE i WRITELN. Forma generala
a acestor proceduri WRITE este:
WRITE(var nume fi ier,v1 [,v2,...,vn])
unde v1, v2,...,vn reprezinta nume de variabile sau date ce se scriu in fi!?ier.
Procedura WRITELN are forma generala:
WRITELN(var nume fi!?ier,v1[v2,...,vn]).
Parametrii au aceeai semnificatie ca Ia procedura WRITE. Spre deosebire de
WRITE, dupa scriere procedura WRITELN inchide linia in fil?ier (scrie CR !?i LF)
!}i trece pe linia urmatoare (pointer-ul este pozitionat pe primul caracter alliniei
urmatoare). Se pot scrie date de tipul:
numeric (intreg sau real);
char;
string;
boolean.
Scrierea se poate face in doua feluri:
cu format implicit;
cu format explicit.
numarul de pozitii este mai mic, se ignora, iar daca este mai mare, acestea se
scriu aiiniat dreapta, In fa!a se pun blancuri (ex. WRITE(f,TRUE:9)).
) ;
read(f,a);
Exemp/u/2:
Sa presupunem ca dorim crearea unui fisier text. Deschiderea lui pentru scriere
se face utilizand procedura REWRITE. in situatia in care pe suport se gase!?te alt
fi!?ier cu acelai nume, acesta din urma este :;;ters. Este bine sa fim avertizati in
acest sens. Prin urmare, se incearca deschiderea fi!?ierului care urmeaza a fi creat
(prin RESET). Daca el se gase:;;te pe sueort, functia IORESULTva lua valoarea 0
iar In caz contrar va lua valoarea 1. In cazul In care aceasta ia valoarea 0,
operatorul va decide daca fi:;;ierul se va crea (deci eel vechi se distruge) sau nu.
program v2;
var f: text;
a: string;
rasp:char;
begin
write('Dati numele fisierului ce se va crea ');
readln(a);
assign(f,a};
{$i-} reset(f) {i+};
if ioresult<>O then
begin
write (Fisierul se gaseste pe suport. continuam? (y/n)');
readln(rasp)
end;
if rasp='y' then
begin
writeln ('Fisierul a fost sters');
rewrite()
end
end.
E emp/u/3:
Dorim sa scriem un text Ia imprimanta. Exista mai multe motive pentru care
tentativa noastra poate e:?ua:
e imprimanta nu este deschisa;
o imprimanta nu este ON LINE;
e nu am pus hartie.
'un mesaj');
alfabetului);
date alfanumerice (contin ath literele alfabetului cat $i cifre).
Sa presupunem ca se dore!?te citirea unor nume de persoane. Evident,
acestea sunt date alfabetice. Curn putem testa daca nu cumva, din gre$eala,
In cadrul unor nume nu s-au introdus !?i cifre? Exemplele de acest tip ar putea
continua.
8.2.1.2. Testarea naturii numerice a datelor
0 modalitate de test numeric a fost deja prezentata (prin introducerea unei
litere Ia citirea unei variabile numerice functia IORESULT ia valoarea 0).
Exista ;;i o alta modalitate de a efectua acest test. Pentru aceasta se
procedeaza astfel:
citirea datei s..: face lntr-o variabila de tip string (deci se pot introduce orice
fel de date);
se face o tentativa de conversie din tipul string Tn tipul numeric solicitat
(procedura VAL);
Tn situatia in care tentativa reu!?e!?te, data introdusa a fast numerica;
Tn caz contrar, data introdusa nu a fost numerica deci se reia citirea.
Aceasta modalitate de lucru prezinta !?i marele avantaj de a ne oferi
posibilitatea sa testam numarul de cifre introduse, prin analiza lungimii $irului
de tip string (funqia LENGTH).
in programul care urmeaza se cite!?te o data care trebuie sa fie numerica $i
sa fie scrisa pe trei cifre (care pot fi !?i 0).
program v4;
var a: string;
c_er,b:integer;
begin
repeat
write( 1 b= 1 ) ;
readln(a);
val(a,b,c er)
until (c er O)and(length(a)=3)
end.
-
IDENTIFICATOR DE TIP
Figura 8.3.1.
Exemple de declarare:
Se declara doua fi:;;iere ale caror articole sunt constituite dintr-un singur
octet:
type fisoct=file of
byte var fl,f2:fisoct;
Acelea!?i doua fi iere se pot declara printr-un tip anonim:
var fl,2 : file of byte
Se declara un fi!?ier ale carui articole sunt numere lntregi:
type fisint=file of integer;
var a:fisint;
inreg=record
nume:string[JO];
varsta:byte
end;
fi ier=file of inreg;
var f:fi ier;
CLOSE(var fi ier)
i are rolul de a Tnchide fi ierul.
in programul care urmeaza, dupa fiecare Tnregistrare citita de Ia tastatura i
scrisa Tn fi ier, utilizatorul este Tntrebat daca sa se continue sau nu. Dupa ce
au fost scrise toate Tnregistrarile, fi ierul se Tnchide.
program ftl;
type inr= record
nume:string[lO];
varsta:byte
end;
fisier=file of inr;
var inreg:inr;
fl:fisier;
c:char;
begin
assign(fl, 1 fdat 1 );
rewrite(fl);
repeat
write( 1 nume 1 ) ;
readln(inreg.nume);
write( 1 varsta 1 );
readln(inreg.varsta);
write(fl,inreg);
write( 1 continuati? (y/n)
readln (c);
unti1 c= 1 n 1 ;
close(fl)
end.
);
program ft2;
type in.r = record
nume:string[lO];
varsta;byte
end;
fi9ier=file of inr;
var inreg: inr;
fl:fisier;
begi:1.
assign(fl, 'fdat');
reset(fl);
while not eof(fl) do
begin
read (fl,in eg);
writeln(inreg.nume,
' ',inreg.virsta)
e!'"Jr.;
close(fl)
end.
Aplica,tie:
Concatenare de fi!jiiere
Daca se dau doua fi iere, prin opera ia de concatenare a ior se ln elege
crearea cu ajutorul lor a unui ai treilea fi ier care con ine lnregistrarile celor
doua In odinea urmatoare: lnregistrarile primului fi ier urmate de lnregistrarile
celui de-al doilea fi ier.
Programul care urmeaza concateneaza doua fi iere. in esenta, pentru a
realiza aceasta operatie, se procedeaza astfel:
se deschid toate fi ierele (doua pentru citire, unul pentru scriere);
e toate !nror;istrarile primului fi ier se copiaza In cadrul celui de-al treilea;
toate lnregistrariie celui de-al doi1ea fi ier se copiaza, In continuare, In
cadrul celui de-al treilea;
In final, se lnchid cele trei fi iere.
program ft3;
type inr= record
nume:string[lO];
virsta:byte
end;
fisier=file of inr;
var inreg:inr;
fl,f2,f3:fisier;
begin
assign(1,'fdat');
assign(2,'fdatl');
assign(f3,'fdat2');
reset(fl);
reset(2);
rewrite(3);
while not eof(fl) do
begin
read (f1,inreg);
write(f3,inreg);
end;
while not eo(2) do
begin
read(f2,inreg);
write(f3,inreg);
end;
close(1);
close(2);
close(3);
end.
begin
read (fl,inreg);
writeln(inreg.nume,
end;
close(fl)
end.
,inreg.varsta)
1 );
a:
program ft6;
type inr= record
nume:string[lO];
varsta:byte
end;
fisier;file of inr;
var inreg: inr;
fl,f2:fisier;
c:char;
i:integer;
begin
assign(fl, 1 fdat2');
reset(fl);
assign(2, 1 fisl 1 );
rewrite(f2);
for i:=l to 3 do
begi:1
read(fl,inreg);
write(f2,inreg);
end;
repeat
write( 1 nume 1 ) ;
readln(inreg.nume);
write('v rsta 1 );
readln(inreg.v rsta);
wr.ite(f2. in:r.:eg) ;
eadln
un '(. .i.l
=..:
'i
(c);
ai
I'
I
'
De multe ori, este necesar sa modificam ur: camp (sau mai multe) al unei
inregistrari (sau ale mai rnultor inregistrari). P: ograrnul ft7 face modificare 1n
campul v8rst2 a! inregistrarii cu numele de ordine 4. Pentru aceasta, se
procedeaza Tn felul urmiHor:
dupa deschiderea fi!?ierului (cu RESET), pozi ionam pointer-ui pe
inregistrarea
care urmeaza a fi modificata (cu SEEK):
se cite!?te inregistrarea;
se
face
modificarea
in
campul
corespunziHor;
Tntrucat, Ia citire, pointer-ul s-a pozitionat pe inregistrarea urmatoare, acesta
se repozitioneaza pe inregistrarea care a fost citita;
aceasta inregistrare este suprascrisa (campul a fost modificat) cu procedura
WRITE.
program ft7;
type inr= record
nume:string[1o];
varsta:byte
end;
fisier=file of inr;
var inreg:inr;
f1:fisier;
begin
assign(f1,'fdat2');
reset(f1);
seek(f1,4);
read(f1,inreg);
inreg,varsta:=70;
seek(f1,4);
write(f1,inreg);
close(f1)
end.
Cum putem sterge una sau mai multe lnregistrari aie fi$ierului? In practica,
pentru aceasta se poate proceda in doua feluri:
inregistrarile se $terg fizic;
lnregistrihile se !?terg lo pic
.
$tergerea fizica nu este posibila decat prin a crea un nou fi$ier care sa nu
cantina inregistrarile care se !?terg. Vechiul fi!?ier este !?ters iar noul fi$ier capata
numele fi$ierului initial (eel din care s-au !?ters inregistraril. Programul care
urmeaza !?terge inregistrarea a patra din fi;;ier.
Din pacate, aceasta modalitate de !?tergere cere mult timp (pentru a !?terge
o inregistrare am creat un alt fi!?ier).
program ftB;
type inr= record
nume:string[10];
varsta:byte
end;
fisier=file of inr;
var inreg:inr;
f1,f2:fisier;
i:integer;
begin
assign(f1, 1 fdat2 1 );
assign(f2,'fman');
reset(fl);
rewrite(f2);
for i:=l to 3 do
begin
read(fl,inreg);
write(f2,inreg) end;
seek(f1,filepos(f1)+1);
while not eof(1) do
begin
read(f1,inreg);
write(f2,inreg)
end;
close (1);
close(f2);
erase(f1);
rename(f2,'fdat2')
end.
end.
write(nwne ');
readln(inreg.nume);
write(varsta ');
readln(inreg.varsta);
inreg.is:=1;
write(f1,inreg);
write(continuati? (y/n) ');
readln(c);
until c=n;
close(1)
end.
program ft10;
type inr= record
is:byte;
nume:string[10];
varsta:byte
end;
fisier=file of inr;
var inreg:inr;
f1:fisier;
c:char;
begin
assign(f1,'fdat2');
reset(1);
while not eof(1) do
begin
read(1,inreg);
if inreg.is=1 then writeln(inreg.nume,
end;
close(1)
end.
' ,inreg.varsta)
program ft11;
type inr= record is:byte;
nume:string[10];
varsta:byte;
end;
fisier=file of inr;
var inreg:inr;
f1:fisier;
begin
assign(f1,'fdat2');
reset(f1);
seek(1,5);
read(f1,inreg);
seek(f1,filepos(f1)-1);
inreg.is:=O;
write(f1,inreg);
close(1)
end.
:- r e: string (10];
varsta:byte
end;
fisier=file of inr;
var fl:fisier;
i:integer;
inv:boolean;
inrl,inr2:inr;
begin
assign(fl, dat2');
reset(fl);
repeat
in ::: :.:al.se;
for i: o to filesize(fl)-2 do
begin
seek(fl,i);
read(fl,inrl,inr2);
if inrl.nume>inr2.nume then
begin
seek(fl,i);
write(fl,inr2,inrl);
inv: =true
end
end
until not inv;
close(fl)
end.
informatica trebuie sa aiba cuno tin!e care sa-i permita 0 in1elegere prcfunda
a ceea ce se lntarnpla de fapt i nu doar cuno tine de suprafa a.
Programul realizeazurmatoarele:
crec;rea fi ierului;
adaugarea uno: Tn:egistrari;
tergere de lnregistrari;
modificarea Tn:egistrarilor;
!> sortarea fi$iert !ui In ordmea descrescatoare a mediilor;
w listarea lui pe monitor, Tn vederea verificarii informatiiio:;
e listarea Ia imprimanta a candida ilor admi i.
...,
e
$terge ecranui;
21::\
240
procedure interfata;
begin
window(l,l,80,25);
textbackground(negru);
textcolor(alb);
clrscr;
cursor(true);
gotoxy(25,1);
write(' inregistrarea ',i);
gotoxy(3,3);
write('nume candidat');
gotoxy(3,5);
write('nota proba 1');
gotoxy(3,7);
write('nota proba 2');
repeat
gotoxy(20,3);
clreol;
readln(nume)
until nume<>
; repeat
gotoxy(20,5);
clreol;
readln(bu);
val(buf,nl,c er)
until (c_er=O)-and (buf<>'') and (nl> O) and (nl<=lO);
repeat
gotoxy(20,7);
clreol;
readln(buf);
val(buf,n2,c er)
until (c_er=O)-and (buf<>'') and (r..2>=0) and (::2<=10);
end;
procedure citire_tast;
var c:char;
begin
repeat
interfata;
gotoxy(3,2 o) ;
write('corect (y/n));
gotoxy(17,20);
c:=readkey;
until c<>'n'
end;
procedure creare;
var c: char;
begin
rewrite();
i:=O;
repeat
i:=i+l;
citire_tast;
inreg.nume:=nume;
inreg.notal:=nl;
inreg.nota2:=n2;
inreg.media:=(nl+n2)/2;
write(f,inreg);
gotoxy(3,21)..;
write(continuati (y/n)
gotoxy(20,21);
c:=readkey;
until c='n';
close()
end;
1 );
procedure dialogl;
var c:char;
begin
textbackground(negru);
textcolor(alb);
clrscr;
gotoxy(10,4);
write(numele fisierului);
repeat
gotoxy(J0,4);clreol;
read(nwne f);
gotoxy(lo-;20};
write(corect (y/n)');
gotoxy(25,20);
readln;
c:-=readkey;
delline until
c='Y';
assign(f,nume ');
{$i-} reset(fi; {$i+}
gotoxy(l0,20);
if ioresult=O then
begin
close(); gotoxy(l0,20};
write('fisierul exista ')
end
else write(fisierul trebuie creat );
delay(2000);
end;
procedure adaugare;
var c:char;
begin
assign(f,nume f);
reset(f);
i:=filesize(f);
seek(f,i);
repeat
i:=i+l; citire tast;
inreg.nume:=nume;
inreg.notal: l;
inreg.nota2:=n2;
inreg.media:=(nl+n2)/2;
242
write(f,inreg);
gotoxy(3,21);
write(continuati
gotoxy(20,21);
c:=readkey;
until c='n';
close();
end;
(y/n)
1 );
procedure stergere;
var c:inr;
num:string[SO];
gasit:boolean;
a:string[l];
begin
window(l,l,80,25);
textbackground(negru);
textcolor(alb);
clrscr;
write('numele candidatului pe care il stergeti: );
readln(num);
assign(f,nume f);
reset(f);
assign(h,man.dat);
rewrite(h);
gasit:=false;
while not eo() do
begin
read(f,c);
if pos(num,c.nume)<>O
then gasit:=true
else write(h,c);
end;
if gasit
then writeln ('succes-inregistrare stearsa)
else writeln ('inregistrare negasita ');
close();
close(h);
erase(f);
rename(h,nume f);
gotoxy(l,20);
writeln('apasati'o tasta...);
a:=readkey
end;
procedure modificare;
var c:inr;
num:string[SO];
gasit:boolean;
a:string[l];
begin
window(l,l,89,25);
textbackground.(negru);
textcolor(alb)";
clrscr;
cursor(true);
then
procedure titlu(t:integer);
var c:char;
begin
if t=o then
');
begin clrscr;
gotoxy(14,1);
write(tit)
end
else
begin
writeln('deschideti imprimanta');
writeln('apasati o tasta ');
c:=readkey;
repeat
{$i-}
writeln(imprim,tit);
{$i+}
until ioresult=O
end;
end;
procedure captab(t:integer);
var a,b:string[60];
begin
a:= '**************Y*********************************;
b:= '*nc*
nume elev
*notal* nota2 *media*';
titlu(t);
if t=o then
begin
gotoxy(l,2);write(a);
gotoxy(1,3);write(b);
gotoxy(l,4);write(a):
end
else
begin
a:='
'+a; b:='
'+b;
writeln(imprim,a);
writeln(imprim,b);
writeln(imprim,a;;
end
end;
procedure listare_p;
var nr rand,j:integer;
c:string[l];
begin
tit:='lista de verificare';
repeat
window(l,l,B0,25);
textbackground(negru);
texccolor(alb);
clrscr;
cursor(true);
write('cite randuri sa se tipareasca pe ecran?
readln(nr rand)
until (nr rind>=4) and (nr_rand<=20);
');
c: = 'y';
i:=l;
while (not eo()) and (c<>'n') do
begin
j: =5;
captab(O);
while (j<=nr rand) and (not eof(f)) and (c<>'n') do
begin
read(f,inreg); gotoxy(2,j);
write(i); gotoxy(S,j);
write(inreg.nume);
gotoxy(26.,j); write(inreg.notal:2:2);
gotoxy(34,j); write(inreg.nota2:2:2);
gotoxy(42,j); write(inreg.media:2:2);
j:=j+1 i
i:=i+l end;
gotoxy(1,21);
write('continuati? (y/n) ');
gotoxy(20,21);
readln(c);
end;
clbse(f)
end;
procedure listare a;
var c:char;
n,j,k:integer;
rand :string[60];
man:string[3];
manl:string[S];
begin
if nr adm<>O then
beginclrscr;
assign(f,nume );
reset();
t:epeat
write('cate randuri pe pagina (5..55) ');
{$i-} readln(n) {$i+}
until (ioresult=O) and (n>=5) and(n<=55);
j: =1;
assign(imprim,prn');
rewrite(imprim);
repeat
k:=5;
tit:=' candida i admi i;
captab(l);
repeat
read(f,inreg);
rand:='
I'
man:='
I
manl:='
';
str(j,man);
insert(man,rand,2);
insert(inreg.nume,rand,S);
str(inreg.notal:2:2,manl);
insert(manl,rand,26);
str(inreg.nota2:2:2,manl);
insert(manl,rand,34);
str(inreg.media:2:2,manl);
insert(manl,rind,42);
rand::I
I +rand;
writeln(imprim,rand);
j:=j+l;
k:=k+l
until (k=n) or (j=nr_adm+l)
until j=nr adm+l;
close();close(imprim)
end
end;
procedure dialog;
var c:char;
begin window(l,1,80,25);
textbackground(negru);
textcolor(alb);
cursor(true);
clrscr;
repeat
repeat
write( 1 cate locuri sunt? ');
{$i-} readln(nr loc);{$i+}
until ioresult=o7
write (1 corect (y/n) 1 );
readln(c);
until c= 1 y 1
end;
procedure admresp;
var c:inr;
n:real;
d:char;
begin
nr adm:=o;
assign(f,nume );
reset(f);
repeat
read(f,c);
if c.media>=S then nr adm:=nr adm+l
until eof(f) or (c.media<S) or(nr_adm=nr_loc);
n:=c.media;
while (c.media=n) and (n>=S) and (not eof\f))do
begin
read(f,c);
if c.media=n then nr_adm:=nr_adm+l;
end;
nr resp:=filesize(f)-nr adm;
clrscr;
221
STERGERE
I;
'
Figura 8.4.1.
SORTARE
8.5. Fi iere
fara tip
Fi!?ierele fara tip sunt constituite din blocuri de lungime fixa, motiy pentru
care acestea sE: iilai nurnesc i fi iere cu prelucrare Ia nivel de bloc. In cadrul
blocurilor, inforrnatia se scrie direct sub forma in care apare In memoria interna,
fara a se converti.
Blocurile se numeroteaza cu numere cuprinse intre 0 !?i n. Din acest motiv
se poate folosi procedura SEEK in forma cunoscuta !?i ea are rolu! de a
pozi iona pointer-ul pe un anume bloc. 0 variabila de tip fi ier fara tip se
declara cu ajutorul cuvantului cheie FILE.
Exemplu: a:file;
Asignarea fi ierului Ia suportul extern se face cu ajutorul procedurii ASSIGN,
exact cum se procedeaza !?i in cazul celorlalte tipuri de fi iere.
Deschiderea fi ierelor pentru creare se realizeaza cu ajutorul procedurii
REWRITE. Forma generala a acestei proceduri este:
REWRITE(var nume fi!?ier,[numar de octeti pentru un bloc))
in cazul in care al doilea parametru este absent. blocul va avea o lungime
standard de 128 octeti.
Scrierea blocurilor se face cu ajutorul procedurii BLOCKWRITE care are
urmatoarea forma generala:
BLOCKWRITE(nume fi9ier, nume variabila In care se face citirea, numar de
blocuri care se citesc [,variabila ce retine numarul de blocuri efectiv citite]).
in cazul in care ultimul parametru este absent !?i se citesc mai putine blocuri
decat au fost solicitate, procedura se termina cu eroare de intrare I ie9ire.
Programul care urmeaza creeaza un fi ier tara tip cu n inregistrari.
program fftl;
type inreg= record
nume:string[16];
varsta:integer;
end;
var f:file;
inr:inreg;
n,i:integer;
begin
assign(f,'fblk');
write( 1 n= 1 ) ;
readln(n);
rewrite(,19);
for i:=l ton do
begin
write('nume= 1 );
readln(inr.nume);
write( 1 varsta= 1 );
readln(inr.varsta);
249
end;
close()
end.
inr.varsta)
Nu este obligatoriu sa citim un fi ier fara tip intr-o variabila de tip record.
Blocul se memoreaza incepand cu o anumita variabila, pe toata lungimea lui
(acolo trebuie sa se gaseasca alte variabile in care sa se faca memorarea). Un
exemplu,in acest sens, il constituie programul urmator (listeaza acelai fi ier).
program fftl;
{$a-}
var :file;
nume:string[16];
varsta:integer;
begin
assign(, 1 fblk 1 );
reset(,19);
while not eo() do
begin blockread(f,nume,l);
1 , Varsta)
Writeln(nume, I
end;
close()
end.
Observatie. Un fi!?ier text poate fi creat !?ide Ia tastatura prin comanda COPY
CON, dupa care se introduc liniile acestuia (liniile se separa prin enter, iar Ia
sfar!?it se apasa simultan tastele (CTRL + Z).
2. Se considera un fi!?ier text cu mai multe inregistrari. Sa se afi!?eze pe
monitor (se va tine cont ca dupa scrierea a 20 de randuri sa se a!?tepte
apasarea unei taste).
3. Aceea!?i problema, numai ca fi!?ierul se va copia Ia imprimanta (pentru o
pagina de format A4 se vor scrie 55 de randuri).
lndicatii:
7.
program maxim;
var a:text;
n,i,max,v:integer;
begin
assign(a,'f.dat);
reset(a);
read(a,n);
read(a,max);
for i:=2 ton do
begin
read(a,v);
if max<v then max:=v
end;
writeln('maximul este ,max);
end.
5.
Sa se scrie un program care scoate Ia imprimanta situatia caracterizata
astfel:
titlul va fi "SITUATIA MATERIALELOR PE MAGAZII";
subtitlul 1 va fi "MAGAZIA ...'';
cap tabel (cuprinde informatii referitoare Ia o lnregistrare);
lnregistrarile cu materialele din prima magazie;
total valoric pe magazie;
subtitlul 2 va fi "MAGAZIA ..."
cap tabel;
inregistrari cu materiale din cea de-a doua magazie;
total valoric pe magazie;
total valoric general (suma valorilor pe toate magaziile);
Programul va fi realizat in urmatoarele conditii:
se a!?teapta ca imprimanta sa fie operationala;
dupa ce au fost scrise datele referitoare Ia o magazie se sare Ia pagina noua,
fara tip
1. Scrieti o procedura care creeaza un tisier fara tip care are o singura
inregistrare !?i anume o imagine ecran.
program fft;
var a,b: file:
inr:byte;
nume,numel:string;
begin
write('numele fisierului care se copiaza:');
readln(nume);
write('numele noului fisier:');
readln(numel):
assign(a,nume);
assign(b,numel);
reset(a,1):
rewrite(b,l);
while not eof(a) do
begin
blockread(a,inr,l);
blockwrite(b,inr,l)
end;
close(a);
close(b)
end.
Capitolul 9
4 proceduri
care permit
citirea !?i
Procedura SETDA TE(an, luna, zi: word) modifica data curenta retinuta de
sistem.
Procedura SETTIME(ora, minut, secunda, sutimi:word) modifica ora exacta
retinuta de sistem.
Cateodata este utiI sa cautam un fi!?ier in toate caile definite prin PATH in
fi!?ierul AUTOEXEC.BAT (aici, se dau caile de cautare separate PJin ";"). Funqia
GETENV returneaza valoarea unei variabile din mediul DOS. Cum valoarea acestei
variabile este l?irul de cai precizat mai sus, cautarea se face prin utilizarea lor.
program cautl;
uses dos;
begin
writeln(fsearch( 1 tpc.exe,getenv('path')));
end.
Revenim Ia problema initiala !?i anume cum putem apela spre executie, din
cadrul unui program, un altul. Acest apel este realizat de procedura EXEC.
Aceasta procedura are doi parametri:
primul este dat de !?irul ce contine numele programului care urmeaza sa se
execute;
al doilea reprezinta !;iirul parametrilor de apel ai programului care se va
executa (daca acest !?ir este vid se presupune ca programul nu este folosit
cu parametri de apel).
Procedura EXEC trebuie sa fie precedata l?i urmata de apelul unei alte
proceduri numita SWAPVECTORS. Rolul acestei proceduri este mai greu de
explicat cu ajutorul cuno tintelor pe care le avem in acest moment. Retinem ca
ea salveaza i restaureaza sistemul de intreruperi ale programului care face
apelul. Programul care urmeaza sa fie rulat are nevoie de memorie interna unde
sa fie lncarcat. Din acest motiv, se folose te directiva de compilare $M.
Cu ajutorul acestei directive se reduce marimea stivei pe care o ocupa progra
mul (dimensiunea ei este data de primul parametru) i se precizeaza de asemenea
minimul i maximul zonei HEAP (ultimii doi parametri). Despre stiva !?i heap se
invata in anul urmator, aa ca, aici, ne multumim sa afirmam ca dimensiunea
end
end.
Capitolul 10
Grafica pe calculator
10.1. lntroducere
in perioada actuala este de neconceput sa realizam programe care se pot
utiliza in practica, tara sa folosim grafica pe calc1,1lator. De multe ori un desen
valoreaza mai mult decat o mie de vorbe. Explicai cuiva cum se ajunge acasa
Ia dumneavoastra 9i veti observa ca in elege mai u9or acest lucru dupa un
desen.
Limbajul TURBO PASCAL contine o serie de proceduri 9i functii care, chiar
daca nu stralucesc di(l_punct de vedere al moduluiin care func ioneaza, permit
realizarea unor aplicatii grafice. Acestea sunt reunite in unitatea GRAPH care
se gase9te In subcatafogul BGI. in cadrul acestui capitol se vor prezenta o serie
de proceduri 9i func ii, des folosite, cu rol didactic, care se gasesc intr-o
unitate de program numita UTILG, prezentata Integral Ia sfar9itul acestui
capitol.
corespunde driverul VGA care poate Iuera in mai multe moduri de lucru:
1. modul VGALo cu o rezolu\ie de 640 * 200, poate folosi 16 culori Ia un
moment dat 9i retine 4 pagini video;
2.
modul VGAMED cu o rezolutie de 640* 350, 16 culori, 2 pagini video;
3. modul VGAHI cu rezolutie 640*480, o singura pagina video, 16 culori.
Selectarea driverului !?i a modului de lucru se face prin utilizarea procedurii
INITGRAPH. Aceasta are trei parametri: gdriver (integer) care contine driverul
(codul asociat acestuia), gmode (integer) care con ine modul de lucru !?i ova
riabila de tip string care arata calea catre unitatea GRAPH. Forma generala a
acestei proceduri este: INITGRAPH(gdriver,gmode,'cale'). Primii doi parametri
sunt transmi!?i prin referinta. lnitializarea sistemului grafic se poate face in doua
moduri:
prin a solicita sa se identifice automat placa grafica !?i corespunzator ei sa
se incarce un anumit driver !?i sa se selecteze un anumit mod de lucru (in
acest caz se alege acel mod de lucru care are cea mai buna rezolutie
grafica);
prin indicarea cu ajutorul primilor doi parametri a unui driver !?i a unui mod
de lucru solicitate de programator (un astfel de program nu se poate executa
daca nu avem placa grafica corespunzatoare);
In cazul primului mod de initializare se poate folosi procedura INITG care se
gase9te in unitatea UTILG.
procedure initg;
begin
gdriver: =detect;
initgraph(gdriver,gmode,c:\tp\bgi');
if graphresult<>o then
begin
writeln('tentativa esuata);
halt
end
end;
Constanta DETECT
are
valoarea 0
!?i ii specifica procedurii
identificarea automata a driverului !?i a modului de lucru.
Tentativa de initializare 9 dfica poate e!?ua din diverse motive cum ar fi: Iipsa
uniHitii GRAPH, calea indicata este gre!?ita etc. Pentru a testa daca initializarea
modului grafic a reu!?it se folose!?te functia intreaga GRAPHRESULT care
returneaza valoarea 0 in caz afirmativ si o valoare diferita de 0 in caz contrar.
in caz de nereu!?ita se opre!?te fortat p ogramul (halt). in acest caz se renunta
Ia programarea structurata, insa este absurd sa scriem intregul program sub
clauza ELSE.
in cazul modului 2 de initializare se poate folosi o secventa ca aceea de mai
jos:
gdriver:=VGA; gmode:=VGALo;
initgraph(gdriver,gmode,c:\tp\bgi');
if graphresult<>O then
begin
writeln('tentativa
halt
end;
esuata);
VGA, VGALo sunt constante de tip integer care reprezinta numerele asociate
modului !?i driverului solicitate. Driverele !?i modurile pot fi adresate prin
utilizarea acestor constante.
Odata intrati intr-un mod grafic nu se mai poate scrie pe monitor, ca pana
acum (cu WRITE !?i WRITsLN). le!?irea din modul grafic se face prin utilizarea
procedurii CLOSEGRAPH. In cazul in care nu folosim aceasta procedura, dupa
executia unui program grafic riscam disparitia cursorului.
1 0.3. Culori
Cum putem programa culorile cu care urmeaza sa apara un desen pe moni
tor? Aceasta este intrebarea Ia care ne propunem sa raspundem In acest para
graf. De Ia bun inceput trebuie sa precizam faptul ca programarea culorilor tine
cont de placa grafica folosita (in concluzie, de driverul folosit) precum !?i de
modul grafic In care se lucreaza. Astfel, exista moduri grafice monocrome in
care avem numai doua culori !?i moduri gralice care dispun de mai multe culori.
Fiind data o placa grafica, putem folosi memoria ei in mai multe moduri.
Astfel (Ia placa CGA), putem renunta Ia utilizarea culorilor (de fapt vom utiliza
numai doua). in a._cest caz,intrucat pentru fiecare pixel se retine doar daca este
aprins sau stins, in memoria video se pot reprezenta mai multi biti, deci se
ob!ine o rezolutie superioara.
In situatia In care se folosesc mai multe culori reprezentam pe ecran mai
putini pixeli.
in cele ce urmeaza,,vom presupune ca dispunem de o placa grafica VGA,
caz in care pentru culoarea unui pixel se retin 4 biti. Rezulta de aici ca putem
utiliza maximum 16 culori, numerotate intre 0 !?i 15. Nu este cam putin? Nu ati
observat ca jocurile folosesc uneori mai multe culori? Daca le-am folosi, ar fi
necesara o memorie video mult mai mare. Pentru a putea reprezenta mai multe
culori (dar nu in acela!?i timp) se poate schimba setul de culori folosite. Acum
intervine notiunea de paleta de culori. Acea ta este, in esenta, multimea
culorilor care pot fi folosite Ia un moment dat pentru a reprezenta o imagine
grafica. Culorile sunt date prin codullor si sunt retinute intr-un vector. Fiecare
componenta a .._a cestui vector retine codul unei 'anumite culori. in acest fel,
continutul celor 4 biti rezervati pentru culoare este un indice de adresare in
paleta de culori (nu culoarea). Astfel, daca presupunem continutul celor 4 biti
de culoare ai unui pixel de pe ecran ca fiind 0011 (3 in baza 10), culoarea cu
care apare efectiv pixelul pe monitor depinde de codul culorii care se gase!?te
in componenta de indice 3 a paletei. Schimbarea paletei de culori atrage
modificarea instantanee a culorilor cu care apare. un desen pe ecran. 0 paleta
de culori poate fi retinuta intr-o variabila de un tip predefinit in unitatea GRAPH
!?i anume tipul PALETTETYPE:
type palettetype
= record
size:byte;
colors [d maxcolors] of shortint
end
Maxcolors este o constanta definita in graph care are valoarea 15. Campul
SIZE contine numarul de culori din paleta (in cazul placilor VGA are valoarea 1 6).
Culoarea de fond este intotdeauna culoarea care se gaseste in componenta
de indice 0 a paletei. in absenta unei alte optiuni, culoarea cu care se face
desenul este culoarea al carei cod se gase!?te in componenta 1 5 a paletei. La
seleqia unui mod grafic se selecteaza automat o anumita paleta, numita paleta
implicita. Aceasta poate fi schimbata. Paleta care da culorile de pe ecran Ia un
moment dat se nume!?te paleta activa.
Programul care urmeaza deseneaza 16 zone dreptunghiulare care sunt
colorate cu ajutorul culorilor continute in paleta implicita (care este !?i cea
activa).
program coll;
uses graph,crt;
var gdriver,gmode,i:integer;
begin
gdriver:=vga;
gmode:=vgalo;
initgraph(gdriver,gmode,c:\tp\bgi);
if graphresult<>O then halt;
for i:=O to 15 do
begin
setfillstyle(l,i);
bar(o,i*l0,200,i*lO+lO);
end;
readln;
end.
Cele mai multe programe folosesc numai culori apartinand paletei implicite.
In cazul paletei implicite, pentru selectia culorilor se pot folosi constantele de
culoare continute in GRAPH. Astfel, fiecare culoare din paleta are un nume
caruia i se atribuie o constanta intre 0 !?i 1 5 care reprezinta indicele compo
nentei din paleta care retine codul culorii (vezi tabelul).
in cazul in care schimbam paleta, aceste constante nu mai pot fi folosite.
Culoare
Constanta
Valoare
negru
black
albastru
blue
verde
green
turcoaz
cyan
rO!?U
red
Culoare
Constanta
Valoare
violet
magenta
maro
brown
gri deschis
lightgrey
gri inchis
darkgrey
albastru deschis
lightblue
verde deschis
lightgreen
10
turcoaz deschis
lightcyan
11
ro!?u deschis
lightred
12
violet deschis
lightmagenta
13
galben
yellow
14
alb
white
15
end;
begin initg;
setbkcolor(white);
desen(blue);
readln
end.
Cum putem schimba paleta !?i cum putem selecta culorile in cadrul ei? Pentru
a putea raspunde acestor intrebari trebuie sa analizam modul de formare a
culorilor (codurile lor).
Fiecare culoare se obtine ca o combinatie intre 3 culori fundamentale: rosu,
verde, albastru. Culorihfundamentale a'u !?i ele mai multe nuante, dec( !?i
pentru reprezentarea lor sunt necesari mai multi biti. De exemplu, in modul
VGA fiecare culoare fundamentala poate avea un cod intre 0 !?i 63 (in functie
de nuanta ei). Codul final al culorii se obtine din combinarea culorilor funda
mentale (fiecare cu nuanta ei).
Procedura SETRGBPALETTE atribuie culorii din paleta care are codul C, cadul
obtinut din combinatia culorilor fundamentale Ia gradele de intensitate (nuante) n1,
n2, n3 (n1 este codul asociat pentru nuanta de rO!?U, n2 pentru verde !?i n3 pentru
albastru). Aceasta procedura are forma SETRGBPALETTE(C, n1, n2, n3).
Procedura SETPALETTE are rolul de a modifica in paleta culoarea care are
indicele de intrare In paleta i, cu un cod de culoare notat C, !?i are forma
generaIa SETPALETTE(i,C1).Evident, prin utilizarea acestei proceduri se obtine
o alta paleta. Pentru a ilustra acestea, sa consideram programul urmator:
program col2;
uses graph;
var gdriver,gmode,i:integer;
procedure schimb_pal;
begin
for i:=O to 15 do setpalette(i,i);
for i:=O to 15 do setrgbpalette(i,0,0,4i);
end;
begin
gdriver:=vga;
gmode:
=vgalo;
initgraph(gdriver,gmode,c:\tp\bgi');
if graphresult<>O then halt;
schimb_pal;
for i:=O to 15 do
begin
setfillstyle(1,i);
bar(O,i10,200,i*10+10);
end;
readln;
closegraph;
end.
begin delay(40);
setpalette(lS,paleta.colors[i]);
end;
closegraph;
end.
Paleta de culori
poate fi modificata 9i prin intermediul procedurii
SETALLPALETTE(paleta), unde paleta este o variabila de tipul PALETTETYPE.
Cum poate fi folosita aceasta procedura? Variabila paleta este incarcata de
utilizator cu codurile culorilor care se vor folosi. Procedura SETALLPALETTE
face ca paleta definita de utilizator sa devina activa (deci, in situatia in care era
desenat ceva, culorile de fond si desen se schimba instantaneu).
Functia GETMAXCOLOR este. de,tip WORD 9i intoarce eel mai mare indice
de intrare in paleta (pentru modul VGA 15).
Funqia GETBKCOLOR este de tip word 9i intoarce indexul in paleta al culorii
de fond active.
Procedura GETDEFAULTPALETTE(paleta) atribuie variabilei paleta (de tipul
palettetype) valoarea paletei implicite pentru modul grafic curent. Aceasta
procedura poate folosi In refacerea paletei implicite dupa ce aceasta a fost
schimbata (pentru refacere se utilizeaza 9i SETALLPALETTE).
Valoare
Cod constanta
continua
SOLIDLN
punctata
DOTTEDLN
linie punct
CENTERLN
linie intrerupta
DASHEDLN
definita de utilizator
USERBITLN
program stil;
uses graph,utilg;
begin initg;
setlinestyle(dottedln,normwidth,l);
moveto(O,lO);
lineto(200,10);
setlinestyle(userbitln,$,3);
moveto(0,20);
lineto(200,20);
readln;
closegraph
end.
tara
program ra;
uses graph;
var gdriver,gmode:integer;
nl,n2:word;
begin
gdriver:=vga;
gmode:=vgalo;
initgraph(gdriver,gmode,c:\tp\bgi');
if graphresult<>O then halt;
moveto(O,O);
lineto(O,lOO);
lineto(lOO,lOO);
lineto(100,0);
lineto(O,O);
readln; clearviewport;
getaspectratio(nl,n2);
moveto(O,O);
lineto(O,round(lOO(nl/n2)));
lineto(lOO,round(lOO(nl/n2)));
lineto(lOO,O);
lineto(O,O);
readln;
closegraph;
end.
record
x,y:integer
end
un parametru de tip word !?i transmite numarul de puncte ce se vor um, 1ar
varfuri este un vector de componente POINTTYPE, care retine coordonatele
eelor n puncte.
Programul urmator traseaza o linie franta:
program 1;
uses graph,utilg;
var varfuri:array[1.. 4] of pointtype;
begin initg;
varfuri[1].x:=1;
varfuri[1].y: =1;
varfuri[2].x:=100;
varfuri[2].y:=200;
varfuri[3].x:=SO;
varfuri[l].y:=SS;
varfuri[4].x:=200;
varfuri[4].y:=200;
drawpoly(4,varfuri);
readln;
closegraph
end.
ide elipsa
Valoare
Descriere interior
EMPTY FILL
culoare de fond
SOLIDFILL
LINEFILL
cu linii ortzontale
LTSLASHFILL
SLASHFILL
BKSLASHFILL
LTBKSLASHFILL
HATCHFILL
XHATCHFILL
INTERLEAVEFILL
Constanta
Descriere interior
Valoare
WIDEDOTFILL
10
cu puncte rare
CLOSEDOTFILL
11
cu puncte dese
= array[1..8] of
integer;
274
CAPAC =TRUE
CAPAC = FALSE
h
a
ha
ur
Figur
a
10.1.
Parametrii sunt
aceia!?i cu cei ai
procedurii
DRAWPOLY.
se
Programul care
urmeaza arata modul
cum se poate realiza
grafic o situatie
statistica. Se
considera o firma
care are n magazine.
in fiecare luna
raprteaza vanzarile
efectuate in cele n
magazine. Acestea se
reprezinta procentual
faa de total vanzari
firma, prin sectoare de
cere, aa cum rezulta
din figura urmatoare.
Figura
10.2.
Observatie: Programul
nu scrie texte. Pentru a
rezolva aceasUi
problema, vezi paragraful
urmator.
program statisl;
uses graph,utilg;
var i,n,s,u i,u :integer;
realiz:array[l..15] of integer;
begin
write('n=);
readln(n);
s:=O;
for i:=l ton do
begin
write('realizari magazin ,i, ');
readln(realiz[i]);
s:=s+realiz[i];
end;
initg;
u i:=O;
u-:=0;
for i:=l ton do
begin
if i=n then u_:=360
else u f:=u f+round(realiz[i]/s360);
setfillstyle(solidfill,i);
pieslice(getmaxx div 2,getmaxy div 2,u_i,u_f,lOO);
u i:=u ;
end;
readln;
closegraph
end.
Nume constandi
Valoare
DEFAULTFONT
TRIPLEX FONT
SMALLFONT
SANSSERIFFONT
GOTHICFONT
4
-
Valoare
Textul se gase te
LEFTTEXT
CENTERTEXT
RIGHTTEXT
Valoare
Textul se gase te
TOPTEXT
CENTERTEXT
BOTTOMTEXT
Programul care urmeaza scrie de doua ori cuvantul text, orizontal:;;i vertical,
in centrul ecranului (cuvintele se intersecteaza).
program text2;
uses graph,utilg;
begin initg;
setcolor(yellow);
se textstyle(triplexfont,horizdir,lO);
settextjustify(centertext,bottomtext);
outtextxy(getmaxx div 2, getmaxy div 2, text);
settextstyle(triplexfont,vertdir,lO);
. outtextxy(getmaxx div 2, getmaxy div 2, text);
readln;
closegraph
end.
Ap/icatie:
Se considera o firma care dispune den (n mai mic sau egal cu 8) magazine.
Fiecare magazin raporteaza lunar citra vanzarilor In milioane lei (lntre 0 !?i 999).
Se cere sa se reprezinte grafic vanzarile efectuate in cele n magazine (repre
zentari prin paralelipipede de lnaltime proportionala cu vanzarile efectuate).
Pentru rezolvarea problemei propuse procedam astfel:
se considera
o matrice
binara (numai cu 1 sau 0) de .8 *8,
corespunzatoare unui patratel de cate 8*8 pixeli in care se reprezinta un
astfel de caracter. Pentru orice element 1 din matrice, pixelul corespunzator
se considera aprins (are culoarea tabilita de SETCOLOR) iar pentru orice
element 0 pixelul se considera stir:; (are culoarea fondului). Pentru fiecare
linie a matricei se obtine un oct .t care reprezinta un numar. in acest fel se
obtine !?irul celor 8
Tehnica 2
Pentru a intelege aceasta tehnica, trebuie sa prezentam in prealabil cateva
proceduri.
Orice imagine care se afla pe ecran poate fi salvata in memoria interna. Sa
fim mai expliciti. Exista posibilitatea ca anumite informatii (cum ar fi cele care
permit vizualizarea unei imagini) sa fie salvate in memoria interna, alocand
spatiul necesar pentru aceasta in timpul executiei programului. 0 astfei de
alocare a memoriei poarta numele de alocare dinamica i se va studia in detaliu
in clasa a zecea. Totu i, acum ne sunt necesare cateva cuno!?tinte minima!e.
Tehnica 3
Aceasta tehnica nu este aplicabila in general, ci numai in cazul in care se
lucreaza intr-un mod grafic, cu un driver grafic ce permite utilizarea mai multor
pagini video. 0 pagina video este memoria necesara (existenta fizic pe placa
grafica) ce permite retinerea unei imagini.
Un exemplu in care putem folosi aceasta tehnica este atunci cand folosim
driverul VGA !?i lucram in modul VGALo, caz in care dispunem de 4 pagini
video. Apar doua notiuni noi !Ji anume pagina vizualizata i pagina activa.
Pagina vizualizata este aceea care se vede pe ecran, iar cea activa este cea Tn
care actioneaza proce_durile grafice. Daca avem o singura pagina video, cele
doua notiuni coincid. In cazul Tn care se lucreaza cu mai multe pagini video,
una poate fi vizualizata 9i alta poate fi activa. Stabilirea paginii care se
vizualizeaza se face cu ajutorul procedurii SETVISUALPAGE(nr), unde nr
reprezinta numarul paginii. Facem precizarea ca paginile se numeroteaza
Tncepand cu 0 (astfel, daca dispunem de 4 pagini video, acestea sunt
numerotate Tntre 0 !?i 3). Stabilirea paginii active se face cu procedura
SETACTIVEPAGE(nr), unde parametrul nr este de tip integer !?i are semnificatia
de numar al paginii.
Sa analizam exemplul urm<'Hor:
se vizualizeaza pagina 0 (fara altprecizare, aceasta este !?i pagina activa);
se deseneaza un segment de dreapta, care este vizibil pe ecran;
se a!?teapta citirea unei taste spre a ne convinge de cele prezentate;
pagina activa devine pagina 1;
.
in pagina activa se deseneaza un alt segment de dreapta (acesta nu este
vizibil);
se a!?teapta citirea unei taste spre a ne convinge de aceasta;
se vizualizeaza pagina 1, moment Tn care apare pe ecran noul desen.
program tpl;
uses graph,utilg,crt;
var gdriver,gmode:integer;
begin
gdriver: =vga; gmode:=vgalo;
initgraph(gdriver,gmode,c:/tp/bgi');
if graphresult<>o then halt;
setvisualpage(O);
moveto(l,l);
lineto(getmaxx,getmaxy);
readln;
setactivepage(l);
moveto(l,l);
lineto(lOO,lOO);
readln;
setvisualpage(l);
readln;
end.
i c
x2:=xb;
y2:=yb;
cc:=codc;
cf:=cfond;
clip:=tai;
maxx:=x2-xl;
maxy:=y2-yl;
setfillstyle(l,cf);
bar(xl,yl,x2,y2);
setcolor(cc);
setviewport(xl,yl,x2,y2,clip);
end;
function fers.citmaxx:integer;
begin
citmaxx; =maxx;
end;
function fers.citmaxy:integer;
begin
citmaxy:=maxy;
end;
procedure fers.salvez;
begin
setviewport(O,O,getmaxx,getmaxy,false);
cod:=imagesize(xl,yl,x2,y2);
if cod<>O then
begin
lung:=cod;
getmem(adresa,lung);
getimage(xl,yl,x2,y2,adresaA);
clearviewport
end
end;
procedure fers.restaurez;
begin
setviewport(o,o,getmaxx,getmaxy,false);
putimage(xl,yl,adresaA,O);
setviewport(xl,yl,x2,y2,true);
setcolor(cc);
freemem(adresa,lung);
end;
procedure fers.inchid;
begin
clearviewport;
setviewport(O,O,getmaxx,getmaxy,false);
end;
realizeaza
salveaza fereastra;
deschide o a doua fereastra in care traseaza un segment;
restaureaza prima fereastra In care traseaza un nou segment;
lnchide cele doua ferestre.
program test;
uses graph,utilg,tfer;
var a,b:fers;
cod: integer;
begin initg;
a.init(30,lOO,J00,200,red,green,true);
moveto(O,O);
lineto(a.citmaxx,a.citmaxy);
readln;
a.salvez(cod);
readln;
b.init(lOO,l00,200,200,yellow,black,true);
moveto(o,b.citmaxy);
lineto(b.citmaxx,o);
readln;
b.inchid;
a.restaurez;
readln;
moveto(lO,lO);
lineto(SO,SO);
readln;
a.inchid;
readln;
closegraph
end.
program gra1;
uses utilg,graph;
var i:integer;
begin initg;
moveto(O,round(getmaxy/2));
lineto(getmaxx,round(getmaxy/2));
moveto(round(getmaxx/2),0);
lineto(round(getmaxx/2),getmaxy);
moveto(O,round(getmaxy/2-sin(-pi)getmaxy/2));
for i:=l to getmaxx do
lineto(i,round(getmaxy/2-sin(-pi+2pi/getmaxxi)getmaxy/2))
end.
GETMAXX, 0
0,0
(
M (.1 [ GETMAXY - sIn-rc
'
2rc
GETMAXX
)]
!_
0, GETMAXY
GETMAXX, GETMAXY
Figura 10.3.
Programul care urmeaza traseaza graticul unei funqii care se gase!?te Tn
unitatea de program FSTAND l?i care este definita pe intervalul [a,b]. Programul
trebuie sa funqioneze oricare ar fi functia continuta Tn unitatea de program.
Cum se procedeaza? Initial, se cite!?te domeniul de definitie al functiei
(valorile a !?i b), se trece in mod grafic !?i se traseaza axa OX. Trasarea axei OY
se face numai in situatia in care intervalul [a,b] contine valoarea 0 (in caz
contrar, axa OY nu este vizibila pe ecran). A!?a cum de altfel a rezultat !?i din
programul anterior, graficul se traseaza utilizand getmaxx + 1 puncte (de Ia 0
Ia getmaxx). lntervalul [a,b] se imparte 'fn getmaxx paqi egale (avem pasul de
lucru (b-a)/getmaxx). Se
calculeaza f(a + pas*i), pentru i = 0,
1,...getmaxx. Cand i ia valoarea 0 se calculeaza f(a) iar cand i ia
valoarea getmaxx se
calculeazaf(a + (b-a)/getmaxx*getmaxx) = f(a + b-a) = f(b). Toateaceste
valori
se retin intr-un vector cu componente numere reale, numit VALF. Problema
care apare este de a stabili unitatea de masura pe axa OY. Problema nu este
banala. Pentru programul anterior se !?tia faptul ca funqia sinus ia valori Tntre
-1 !?i 1, dar aici avem o functie oarecare, pentru care nu cunoa!?tem in
prealabil multimea valorilor ei. Mai mult decat atat, chiar daca am cunoa!?te
funqia, daca aceasta are o expresie complicata nu putem, prin procedee strict
matema tice, sa determinam multimea valorilor ei. Din cele prezentate, rezulta
faptul ca singurul mecanism posibil de lucru este de a calcula Tn vectorul
VALF
toate valorile pe care le ia functia Tn punctele din intervalul
= getmaxy/2-getmaxy/(2*abs(minf))*min(f) = getmaxy,
daca tinem cont de faptul ca, In acest caz, minimul este ne ativ. in oricare din
situalii, restul valorilor se reprezinta proportional pe ecran. In final, se traseaza
graficul prin unirea prin segmente a oricaror doua perechi de puncte
consecutive, secventa pe care, datorita simplitatii ei, nu o comentam.
program curba;
uses crt,graph,utilg,fstand;
var a,b,pas,minf,maxf:real;
valf:array[O..1000] of real;
i:integer;
begin
clrscr;
writeln(domeniul de definitie [a,b] ');
write(a=);readln(a);
write('b=');readln(b);
initg;
moveto(O,getmaxy div 2);
lineto(getmaxx,getmaxy div 2);
if (a<O) and (b>O) then
begin
moveto(round(abs(a)/(abs(a)+b)getmaxx),O);
lineto(round(abs(a)/(abs(a)+b)getmaxx),getmaxy)
end;
pas:=(b-a)/getmaxx;
for i:=O to getmaxx do valf[i]:=f(a+pasi);
minf:=valf[O]; maxf:=valf[O];
for i:=l to getmaxx do
begin
if minf>valf[i] then minf:=valf[i];
if maxf<valf[i] then maxf:=valf[i];
end;
if abs(maxf)>=abs(minf)
then for i:=O to getmaxx do
valf[i]:=getmaxy/2-getmaxy/(2maxf)valf[i]
else for i:=O to getmaxx do
valf[i]:=getmaxy/2-getmaxy/(2abs(minf))valf[i]
i:=O;
moveto(0 1 round(valf[O]));
repeat
lineto(i1 round(valf[i]));
i:=i+l;
until i>getmaxx;
repeat
until keypressed
end.
A!?a cum am conceput pana in acest moment programul, pentru a putea sa-l
rulam trebuie sa cream in prealabil unitatea de program FSTAND care contine
functia ce se reprezinta grafic. De cate ori dorim sa reprezentam grafic o alta
functie, unitatea FSTAND trebuie recreata. Sa recunoa!?tem ca acest procedeu
este destul de greoi !?i se pierde mult timp. Din pacate, limbajul TURBO
PASCAL nu permite citirea unei functii oarecare, careia sa-i putem calcula
valorile. Ce artificii ar trebui sa facem pentru ca acest fapt sa devina posibil?
Exista posibilitatea sa scriem noi un program care sa citeasca expresia unei
funqii !?i sa genereze o secventa de calcul care, Ia executie, sa calculeze
valorile functiei in diverse puncte. Despre modul in care se realizeaza un astfel
de program vom invata in anul urmator (sunt necesare cuno!?tinte care depa
sesc nivelul clasei a noua).
Pentru moment, vom folosi o alta metoda. in ce consta aceasta?
Programul GRAFIC F se apeleaza de cate ori dorim sa facem graficul unei noi
functii. Acesta realizeaza urmatoarele:
apeleaza, spre a fi executat, programul CITF;
apeleaza programul compilator TPC spre a compila programul de realizare a
graficului unei functii oarecare (program numit CURBA !?i care a fost
prezentat anterior);
apeleaza spre executie programul CURBA.
program grafic f;
uses dos;
{$m 40001 01 0}
begin swapvectors;
exec(citf.exe 1 1' 1 );
swapvectors;
exec(c:\tp\tpc.exe' 1 1 Curba);
swapvectors;
exec(curba.exe,
'); swapvectors;
end.
{$m 4000,0,0}
uses dos;
var f: text;
exp:string;
tpc,numep:string;
begin
assign(,'fstand.pas');
repeat
writeln;
rewrite();
writeln(f,unit stand;);
writeln(f,'interface');
writeln (,function f(x:real):real;);
writeln(f,'implementation)-;
writeln (,'function f(x:real):real;');
writeln(f, begin);
write('f:=');readln(exp);
write(f,'f:=);writeln(f,exp);
writeln(f,end;');
writeln(f,end.');
close();
tpc:=fsearch ('tpc.exe,getenv('path'));
numep:=fstand.pas;
swapvectors;
exec(tpc,numep);
swapvectors
until dosexitcode=O
end.
2 1/2
Q=-(r -x)
.,xE[-r,r]
Nu este _cam greu? Dar daca o curba are o ecua ie mult mai complicata, din
care nu mai rezulta a$a de U!?Or funqiile care trebuie reprezentate? Din acest
motiv, s-a ajuns Ia concluzia ca este necesar un alt mecanism prin care sa fie
data o curba. Astfel, putem alege (deloc U!?or) doua func ii, f !?i g, de variabila
t, cut apaqinand intervalului [a,b], astfel incat x = f(t) !?i y = g(t). Prin
eliminarea lui t, se ajunge Ia ecuatia initiala a curbei. Astfel, cercul poate fi
reprezentat ca
fiind dat de ecuatiile x: = r*sin(t) !?i y: = r*COs(t), cu t apaqinand intervalului
[0,2 * "]. Eliminarea lui t se face ca mai jos, obtinand astfel ecua ia cercului.
300
close();
tpc:=fsearch ('tpc.exe',getenv('path'));
numep:='fstand.pas;
swapvectors;
exec(tpc,numep);
swapvectors
until dosexitcode=O
end.
Programul CURBAP deseneaza curba pe monitor, dupa ce, in prealabil,
cere domeniul de definitie al celor doua funqii.
Care este mecanismul prin care se traseaza desenul curbei?
in primul rand, intervalul [a,b] se imparte in o mie de parti egale. in
fiecare punct astfel obtinut, se calculeaza x = f(t) i y = g(t). In acest fel
obtinem
coordonatele reale ale unui punct apartinand curbei, coordonate care se retin
in cadrul a doi vectori XE (pentru valorile lui x) 9i YE (pentru valorile lui y).
Coordonatele astfel obtinute trebuie transformate in coordonate ecran. Pentru
aceasta, se procedeaza astfel:
se calculeaza valoarea minima i maxima a lui
x;
se calculeaza valoarea minima !?i maxima a lui y;
se calculeaza r1 ca fiind variatia lui x (din maximul lui x se scade valoarea
minima a lui x);
se calculeaza, in mod asemanator, r2 ca fiind variatia lui y;
se calculeaza rca fiind maximul dintre r1 !?i r2 impartit Ia getmaxy.
Pentru ce am procedat astfel? Acest procedeu a fost aplicat pentru a stabili
unitatea de masura (astfel, daca x a avut o variatie mai mare, curba
reprezentata va ocupa intreg spatiul disponibil pentru x, !?i numai cat este
necesar pentru y, !?i invers, daca y a avut o variatie mai mare, curba va ocupa
intreg spatiul disponibil pentru y !?i numai cat este :1ecesar pentru x). Care este
motivul pentru care r a fost obtinut prin impartirea Ia getmaxy !?i nu prin impar
tirea Ia getmaxx ? Am dorit sa obtinem aceasta reprezentare intr-un patrat !?i
patratul de latura maxima continut pe ecran este cu getmaxy + 1 puncte
adresabile (daca acceptam sa reprezentam curba pe dreptunghiul continut de
intregul ecran, un cere ar fi aratat ca o elipsa ...).
in continuare, se transforma efectiv coordonatele gasite in XE !?i YE in
coordonate ecran. in acest scop, se folosesc formulele de mai jos:
xe[i]: =(xe[i]-minx)/r;
ye [i] : =getmaxy-(ye [i] -miny)/r;
end;
Sa presupunem ca x a avut variatia maxima. in punctul in care x este
maxim, xe[i] va fi:
(maxx-min) *Qetmaxy/(maxx-min) = getmaxy;
in punctul in care x este minim, xe[i] va fi 0. Restul valorilor se raspandesc
proportional in intervalul [O,getmaxy]. intrucat variatia lui y este mai mica
decat aceea a lui x, ye[i] va avea valori in acela!?i interval, tara sa-l
acopere in
'fntregime (in transformarea lui y se tine cont de faptul ca un punct cu y minim
t:=a;
t:=t+(b-a)/nrt;
end;
minx:=xe[1];maxx:=xe[1];
miny:=ye[1];maxy:=ye[1];
for i:=1 to nrt do
begin
if xe[i]<minx then
if xe[i]>maxx then
if ye[i]<miny then
if ye[i]>maxy then
end;
minx:=xe[i];
maxx:=xe(i];
miny:=ye(i];
maxy:=ye[i];
initg;
r1:=(maxx-minx);
r2:=(maxy-miny);
;if rl>r2
then r: =r1/getmaxy
else r:=r2/getmaxy;
for i:=1 to nrt do
begin
xe[i]:=(xe
[i]
-minx)/r;
ye[i]:=getmaxy-(ye[i]-miny}/r;
end;
moveto(round(xe(1]),round(ye(1])};
for i:=2 to nrt do
begin
lineto(round(xe[i]),round(ye(i]));
end;
readln;
closegraph;
end.
Xc
+ MT1
Xc
sin8)
4
y ------------------- - ------------------
p' (X, y)
--------
Y1 --------------------
Ta
Yc
""""
'\
\P (
----------
X1, Y1 )
X
0
Figura 10.4.
Dar MP= MP' (raza); MT 2 = x 1 -xc; MT 3 = y 1-vc;
xcl/MP';
1-Yc)costp+
(x 1-xc)sintp
(xc,yc,xl,yl:integer;
var x,y:integer;unghi:real);
begin
x:=round(xc+(xl-xc)cos(unghi)-(yl-yc)sin(unghi));
y:=round(yc+(xl-xc)sin(unghi)+(yl-yc)cos(unghi))
end;
begin
y1:=y1+1;
y2:=y2+1;
y3:=y3+1;
y4:=y4+1;
desen(x1,y1,x2,y2,x3,y3,x4,y4);
delay(100);
desen(x1,y1,x2,y2,xl,y3,x4,y4);
end;
desen(x1,y1,x2,y2,x3,y3,x4,y4);
x: =x1; y: =y1;
l:=x2-x1;
for i:=1 to 100 do
begin desen(x1,y1,x2,y2,x3,y3,x4,y4);
rotplan(x,y,x+l,y,x2,y2,pi*i/SO);
rotplan(x,y,x+l,y+l,x3,yl,pi*i/SO);
rotplan(x,y,x,y+l,x4,y4,pi*i/SO);
desen(x1,y1,x2,y2,x3,y3,x4,y4);
delay(100);
end;
readln;
closegraph;
end.
A ( x1,
y1 j
Figura 10.5.
z
p
---
z*
Z 0* <--
--- ---
---
---
I
I
I
---
I
I
I
x. y. z )
'frrc,
I
'
I
I
I
'
I
f
0* ,
, '
'
'
I
I
I
I
2o)
I
I
I
I
I
I
''
'
'
--: ------
---
''
'I '1
Figura 10.6.
matematica din liceu !?i, dupa cum vom vedea in continuare, este chiar util sa
ne lipsim de acest calcul.
Din cele prezentate, retinem faptul ca avem un sistem de axe (intr:un plan
oarecare P) 0 *X*Y*Z*,rezultat din proieqia sistemului de axe OXYZ. In acest
sistem putem reprezenta un punct oarecare M(x,y,z) in sistemul OXYZ
masurand pur !?i simplu x, y, z unitati pe axele O*X*, O*Y*, O*Z*. A!?a cum
putem reprezenta un punct in cadrul acestui sistem de axe, putem reprezenta
!?i un obiect din spatiul cu 3 dimensiuni. Tn cele ce urmeaza vom Iuera numai
'fn planul P.
Problema care apare in continuare este urmatoarea: pentru a putea
reprezenta un punct pe monitor, nu putem folosi 'fn mod direct coordonatele
punctului masurate Tn sistemul O*X*Y*Z*, deoarece avem nevoie numai de
2 coordonate !?i nude 3. Tn concluzie, trebuie gasita o modalitate de trecere de
Ia 3 coordonate Ia 2 coordonate. Pentru a putea rezolva aceasta problema, se
consider a un sistem de axe cu centrul Tn 0 *, prin trasarea dreptelor
perpendiculare 0 *XO, 0 *YO !?i se gase!?te o relatie de transformare a
coordonatelor punctului Tn acest sistem ((x 0 *, y 0 *, z 0 *)- (x 0 , y 0 )) .
. in figura 10.7. punctul N (x0 *, y *, z *) 'fn sistemul 0 *X *Y*Z* are
coordo natele (x0;y0) .in sistemul 0 0* X0 Y 00 . Notam cu alfa, beta, gama
unghiurile formate 'fn sens trigonometric intre axa 0 * X 0 !?i axele 0 *X*,
respectiv 0 *Y*,
0 *Z *. Trebuie gasite relatiile care dau pe x0 , Yo in functie de x 0 *, Yo*, z 0 *,
alfa, beta, gama..
intrucat vom utiliza calculul vectorial, mai putin folosit in orele de
matematica, vom prezenta cateva notiuni strict necesare intelegerii
demonstratiei.
.
Fie M(xm,ym) !?i N(xn,yn) doua puncte Tn sistemul de axe OXY. Acestor
doua puncte le corespund doi vectori !?i
care se obtin prin unirea punctului
0 cu cele doua puncte.
?upa cum !?tim, cei doi vectori t fi insumati
utilizand
regula paralelogramului. In acest mod, obtinem vectorul v cu extremitatile Tn 0
!?i P. Se cere sa aflam coordonatele punctului P (figura 10.8.).
Vi
xp=xm+xn; yp=ym+yn.
......
......
......
z*
z
, 4
',,,, N
------ \
I
I
I
I
I
I
I
I
I
I
I
I
I
I
I
I
Figura 10.7.
unde XT2 , XT 1 XT 4 reprezinta coordonatele pe axa OX0 ale punctelor T2 1
T 3, T4 iar YT2 , 3YT 3 , YT 4 reprezinta coordonatele pe axa OY
0 ale punctelor T2
, T 3, T 4 . Dar avem:
XT 3 = x 0 * *Cos(alfa); XT 2 = y0 * *COs(beta); XT4 = z0 * *COs(gama),
intrucat lungimea proieqiei unui segment este egala cu lungimea segmentului
inmultita cu cosinusul un hiului fo mat de dreapta care contine segmentul !?i
dreapta pe care se face proieclia. In mod analog avem:
y
Yp ----------------------------------------
I
I
I
YN -----------
----- -----=-----;-->
XM
XN
Xp
Figura 10.8.
y=y+Z*COS(45).
Pentru a face calcule mai rapid prezentam !?i procedura d3d2, procedura de cal
cui al coordonatelor x !?i yin cazul proieqiei cabinet. Este de mentionat faptul ca
aceasta procedura furnizeaza direct coordonatele de ati are pe ecran (se tine cont
de taptul ca punctul de coordonate (0,0) se gase!?te in centrul ecranului).
procedure d3d2(xl,yl,zl:integer;var x,y:integer);
begin
x:=getmaxx div 2 + round(xl+sqrt(2)zl/4);
y:=getmaxy div 2 - round(yl+sqrt(2)zl/4)
end;
Y0 ,Y*
X0 ,X*
Figura 10.9.
Un alt triplet de valori pentru unghiurile alta, beta !?i gama (In grade) este:
alta= 165, beta= -135, gama = 135.
Acest triplet de valori este des folosit in reprezentarea suprafetelor in spatiu.
in continuare ne propunem sa desenam o prisma cu lungimile laturilor x1,
y1, z1 unitati. Modul de realizare a acestui program este foarte simplu. Se
reprezintii prisma intr-un sistem de axe !?i se tree pe desen coordonatele
tiecarui punct.
Cele 3 coordonate ale fiecarui punct sunt convertite in 2 coordonate prin
procedura D3D2G. Aceste puncte sunt unite prin segmente. in plus, programul
ere !?i unghiurile alta, beta gama, unghiuri necesare conversiei din 03 in 02.
lncercati programul pentru tripletele:
alta= 0, beta= 90, gama = 45 (proiectia cabinet);
alfa = 165, beta= -135, gama = 135.
x1,y1,z1 nu se face o
z........ ....
........
.... ....
....
....
........
....
I
I
"
v
*
0
Fi
g
u
r
a
1
0.
1
0.
315
y
Figura
316
var alfa,beta,gama:integer;
xl,yl,zl,x,y:real;
begin
1
write( 1
alfa=
);
readln(alfa); write(1 beta= 1 )
;
readln(b_eta); write( 1 gama=
1
); readln(gama);
1
1
write(
xl=
);
readln(xl); write( 1 yl= 1
);
readln(yl);
write( 1
zl= 1 ); readln(zl); initg;
d3d2g(rad(alfa),rad(beta),rad(gama),o,o,o,x,y);
moveto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,yl,O,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,yl,O,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,O,O,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),o,o,o,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,O,zl,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,yl,zl,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,yl,O,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,O,zl,x,y);
moveto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,O,O,x,y),;
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,o,zl,x,y);
moveto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,yl,zl,x,y);
lineeo(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,yl,zl,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
dld2g(rad(alfa),rad(beta),rad(gama),xl,yl,zl,x,y);
moveto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,yl,O,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),xl,O,zl,x,y);
moveto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
d3d2g(rad(alfa),rad(beta),rad(gama),O,O,zl,x,y);
lineto(getmaxx div 2 +round(x),getmaxy div 2+round(y));
readln;
closegraph
end.
3d(xr y zr p(il811]1p[i1812])
1:=1+1;
j:=j+15;
until
end;
i>24;
p cedure desen(i:integer);
var j:integer;
begin
moveto (p [i, 1, 1] ,p [i, 1, 2]);
for j:=2 to 4 do lineto(p[i,j,1],p[i,j,2]);
lineto (p [i, 1, 1] ,p [i, 1,2]);
moveto(p[i,5,1] ,p[i,5,2]);
for j:=6 to a do lineto(p[i,j,1],p[i,j,2]);
lineto(p[i,5,1] ,p[i,5,2]);
moveto (p [i, 1, 1] ,p [i, 1, 2]); lineto (p [i, 5, 1] ,p [i, 5,
2]); moveto(p[i,2,1] ,p[i,2,2]) ;lineto(p[i,6,1]
,p[i,6,2]); move to (p [ i, 3, 1] , p [ i, 3, 2] ) ; line to (p [ i,
7, 1] , p [ i, 7, 2] ) ;
move to (p [ i, 4, 1] , p [ i, 4, 2] ) ; line to (p [ i, a, 1] , p [i, 8, 2] ) ;
end;
begin initg;
coord(50,50,50);
setwritemode(xorput);
for j:=1 to 10 do
for i:=1 to 24 do
begin
desen(i);
delay(100);
desen(i)
end;
desen(24);
closegraph
end.
Se considera
expresie de forma z=f(x,y), unde perechea (x,y) apartine lui
[a,b] * [c,d]. Funqia f este o functie de doua variabile.
Exemp/u: z=x+y-3 (x, y) apartine [0, 5]*[8, 10]. Pentru fiecare pereche (x,
y), unde x apartine intervalului [0, 5] !?i y apartine intervalului [8,10] se poate
obtine o valoare pentru z. Astfel, x = 2, y = 9 rezulta z = 2 + 9-3 = 8.
Obtinem
astfel un triplet (2, 9, 8), care reprezinta coordonatele unui punct in spatiu.
Avem o infinitate de triplete (care verifica aceasta expresie), deci avem o
infinitate de puncte date prin coordonatele lor. Tn cadrul cursurilor de
matematica (din facultate) se arata ca aceste puncte se gasesc plasate pe o
suprafata din spatiu (in cazul expresiei considerate, suprafata este un plan).
Problema care se pune in continuare este urmiHoarea: se da o astfel de functie
!?i se cere sa se reprezinte pe monitor suprafata pe care o reprezinta. Pentru
asigurarea generalitatii programului, procedam 'fntocmai ca Ia desenmea
graficelor de functii.
Un program numit GRAFIC S lanseaza In executie un altul numit CITSUPR
care are rolul de a crea !?i compila o unitate de program numita FSTAND care
contine o functie data de utilizator, dupa care compileaza !?i lanseaza 'fn
{$m 4000,0,0}
begin swapvectors;
exec('citsupr.exe','');
swapvectors;
exec(c:\tp\tpc.exe,supra);
swapvectors;
exec(supraf.exe','');
swapvectors;
end.
program citsupr;
{$m 4000,0,0}
uses dos;
var f:text;
exp:string;
tpc,numep:string;.begin
assign(f,fstand.pas);
repeat
writeln;
rewrite();
writeln(f,'unit stand;');
writeln(f,'interface);
writeln (,function f(x,y:real):real;');
writeln(f,'implementation);
writeln (,'function f(x,y:real):real;');
writeln(f,begin');
write(':='); readln(exp);
write(,:=); writeln(f,exp);
writeln(f,'end;);
writeln(f,end.');
close();
tpc:=fsearch (1 tpc.exe,getenv( 1 path 1 ));
numep:=fstand.pas;
swapvectors;
exec(tpc,numep);
swapvectors
until dosexitcode=O
end.
program supra;
uses graph,utilg,fstand;
var nrx,nry,alfa,beta,gama,i,j:integer;
a,b,c,d,x,y,minx,miny,maxy,maxx,rl,r2:real;
var xe,ye:array[l..50,1..SO] of real;
begin
write(numar valori x =');
readln(nrx);
write('numar valori y=');
readln(nry);
write('a='); readln(a);
write('b='); readln(b);
write(c=); readln(c);
write(d='); readln(d);
write('alfa='); readln(alfa);
write(beta='); readln(beta);
write('gama=); readln(gama);
x:=a;
for i:=1 to nrx do
begin
y:=c;
for j:=1 to nry do
begin
d3d2g(rad(alfa)1 rad(beta)1 rad(gama),xlylf(x
y),xe[ilj]l ye [i, j]) ;
y:=y+(d-c)/(nry-1)
end ;
x:=x+(b-a)/(nry-1)
end;
minx:=xe(1 1];
maxx:=xe[11
1]; miny:=ye[1
1];
maxy:=ye[111];
for i:=1 to nrx do
for j:=1 to nry do
begin
if xe[ilj]<minx then minx:=xe[i1 j];
if xe[i j]>maxx then maxx:=xe[i1 j];
if ye[ilj]<miny then miny:=ye[i1 j];
if ye(i 1 j] >maxy then maxy:=ye[ilj];
end;
initg;
r1:=(maxx-minx)/ getmaxx;
r2:=(maxy-miny)/getmaxy;
for i:=1 to nrx do
for j:=1 to nry do
begin
xe[i I j]:=(xe[i I j]-minx)I r1;
ye[i I j]: =getmaxy-(ye[i1 j]miny)/r2;
end;
for i:=1 to nrx do
begin
moveto(round(xe[i 1]) round(ye[i 1]));
for j:=2 to nry do lineto(round(xe[i j]) round(ye[ilj]))
end;
X
I I
J_LJ....J_
Figura 10.12.
x = Rcos(s) cos(t); y
= Rcos(s) sin(t);
z = Rsin(s)
Figura 10.13.
Putem obtine coordonatele oricarui punct M din spatiu, dad! tE [0, 2")
sE [-"/2, "/2].
y = g(s,t);
z = h(s,t).
zt
',,, M
.,
I
I
I
I
I
T (.x0(u), yJu))
Figura 10.14.
program grafic sr;
uses dos;
{$m 4000 1 01 0}
begin
swapvectors;
exec( citsuprp.exe','');
swapvectors;
exec(c:\tp\tpc.exe,suprafp');
swapvectors;
exec(suprafp.exe,'');
swapvectors;
end.
program citsupr;
{$m 4000,0,0}
uses dos;
var f:text;
exp:string;
tpc,numep:string;
begin
assign(,'fstand.pas);
repeat
writeln;
rewrite();
writeln(f,'unit stand;');
writeln(f,'interface);
writeln (,unction f(x,y:real):real;');
writeln(f,implementation);
writeln (,'function f(x,y:real):real;);
writeln(f,'begin');
write(':='); readln(exp);
write(,:=); writeln(f,exp);
writeln(f,end;);
writeln(f,'end.');
close(f);
tpc:=fsearch ('tpc.exe,getenv('path'));
numep:='fstand.pas;
swapvectors;
exec(tpc,numep);
swapvectors
until dosexitcode=O
end.
program suprafp;
uses graph,utilg,fstand;
var nrs,nrt,i,j:integer;
a,b,c,d,s,t,mins,mint,maxs,maxt,r1,r2,
alfa,beta,gama:real;
var xe,ye:array[1..50,1.. so] of real;
begin
write(numar valori s ='); readln(nrs);
write('numar valori t='); readln(nrt);
write ('a=); readln(a);
a:=rad(trunc(a));
write('b=');readln(b);
b:=rad(trunc(b)); c:=O; d:=2*pi;
alfa:=rad(210); beta:=rad(-30);gama:=rad(90);
s: =a;
for i:=1 to nrs do
begin
t:=c;
for j:=1 to nrt do
begin
d3d2g(alfa,beta,gama,f(s,t),g(s,t),h(s,t),xe[i,j],
ye [i, j] ) ;
t:=t+(d-c)/(nrt-1)
end ;
s:=s+(b-a)/(nrs-1)
end;
mins:=xe[1,1]; maxs:=xe[1,1];
mint:=ye[1,1]; maxt:=ye[1,1];
for i:=l to nrs do
for j:=1 to nrt do
begin
if xe[i,j]<mins then mins:=xe[i,j];
if xe[i,j]>maxs then maxs:=xe[i,j];
in PLAN$ELE
gdriver:=detect;
initgraph(gdriver,gmode,c:\tp\bgi);
if graphresult<>O then
begin
writeln('tentativa esuata);
halt
end
end;
function rad;
begin
rad:=pix/180
end;
procedure d3d2;
begin
x:=getmaxx div 2 +round(xl+sqrt(2)z1/4);
y:=getmaxy div 2 -round(y1+sqrt(2)z1/4)
end;
procedure d3d2n;
begin
x:=round(x1+sqrt(2)z1/4);
y:=round(y1+sqrt(2)z1/4)
end;
procedure rotplan(xc,yc,x1,y1:integer; var x,y:integer;
unghi:real);
begin
x:=round(xc+(xi-xc)cos(unghi)-(y1-yc)*sin(unghi));
y:=round(yc+(x1-xc)sin(unghi)+(y1-yc)cos(unghi))
end;
procedure citimg;
var f1:text;
f2:file;
dim: integer;
a:pointer;
begin
assign(f1,fdim);
assign(f2,fimg);
reset(1);
read(f1,dim);
reset(2,dim);
getmem(a,dim);
blockread(f2,aA,1);
putimage(x,y,aA,xorput);
close(1);
close(2);
end;
procedure scrimg;
var a:pointer;
dim:integer;
fl:text;
f2:file;
begin assign(fl,fdim);
assign(f2,fimg);
dim:=imagesize(xl,yl,x2,y2);
if dim<> o then
begin
getmem(a,dim);
getimage(xl,yl,x2,y2,aA);
rewrite(fl);
rewrite(f2,dim);
write (fl, dim);
blockwrite(f2,aA,l);
close(fl);
close(2);
cod:=O
end
else cod:=l
end;
procedure d3d2g;
begin
x:=xlcos(alfa)+ylcos(beta)+zlcos(gama);
y:=xlsin(alfa)+ylsin(beta)+zlsin(gama);
end;
de dumneavoastra. Verificati
numele unei persoane !?i varsta sa. ealizati o situatie statistica privind
repartizarea persoanelor pe grupe de varsta (0-20, 21-30, 31-40 !?.a.m.d.).
Situatia se va realiza in doua feluri:
prin utilizarea procedurii BAR3D;
prin utilizarea procedurii PIESLICE.
10. Realizati un meniu prin utilizarea unei ferestre grafice. Selectarea optiunii
se va face prin plimbarea unei bare luminoase deasupra optiunilor.
11. Aceea!?i problema ca Ia problema 10, dar selectarea optiunii se va face
prin pla,sarea unui cadru dreptunghiular deasupra optiunii, urmata de apasarea
tastei ENTER.
12. Realizati un program in care o bila se mi!?ca aleator pe ecran. Programul
va fi conceput de trei ori, utilizand cele trei variante de animatie.
13. Realizati un program in care un omulet stilizat i!?i mi!?Ca picioarele !?i mai
nile.
14. Afi!?ati Tn mod grafic numele persoanelor continute in fi!?ierul PERSONAL
(vezi problemele de Ia fi!?iere).
15. Dintr-un pachet de carti de joe se extrag aleator 4, care vor fi afi!?ate pe
ecran.
16. SimulaJi un jocde carti in care un participant Ia joe este calculatorul.
17. Exprimati grafic notiunea de arc capabil de un unghi dat.
18. Rezolvati grafic problema mi!?carii Tn plan a unui punct, astfel Tncat suma
piHratelor distantelor Ia doua puncte fixe este o constanta.
19. Considerati, Ia alegere, o problema de loc geometric din manual.
lntocmiti un material didactic pentru orele de matematica, in care sa se vada
efectiv mi!?carea pe ecran.
ANEXA
Fereastra de lucru
Orice text sursa PASCAL se scrie intr-o fereastra. De cele mai multe ori se
lucreaza cu una singura !?i acesta este cazul pe care-1 vom discuta in
continuare. De regula (daca nu au fost precizate alte optiuni) Ia apelul
editorului !?i compilatorului TURBO PASCAL se deschide o fereastra care are un
nume pus de editor !?i anume NONAMExx.pas (xx reprezinta un numar de
ordine). Exista !?i posibilitatea de a deschide direct o fereastra cu un anumit
nume (apelul se face cu TURBO nume).
in aceasta fereastra se scrie textul sursa. Pentru inceput retinem faptul ca
Ia comanda CTRL + F9 textul este compilat !?i rulat. Pentru a vedea rezultatele
rularii se tasteaza ALT + F5 iar pentru a reveni Ia textul sursa se tasteaza
ENTER sau ALT + F5.
in partea de sus a ferestrei apare meniul cu care este inzestrat mediul
integrat al limbajului. Astfel apar optiunile urmatoare:
FILE EDIT SEARCH RUN COMPILE DEBUG OPTIONS WINDOW HELP
F3
F2
ALT+X
Facilitati de editare
Meniul SEARCH
Acesta are urmatoarele optiuni care U!?ureaza procesul de editare:
FIND
REPLACE
SEARCH AGAIN
GO TO LINE NUMBER
FIND PROCEDURE
FIND ERROR
Optiunea FIND
Are rolul de a cauta un !?ir in textul programului sursa. in mod practic, se
afi!?eaza o fereastra in care suntem solicitati sa introducem textul care se va
cauta.
De asemenea, in fereastra se prezinta alte cateva optiuni (se ajunge Ia ele
prin apasarea tastei TAB !?i se marcheaza cu spatiu):
CASE SENZITIVE - daca este marcata (cu X) se face distinctie intre !iterele
mari i cele mici;
WHOLE WORDS ONLY- considera textul ca un cuvant separat (prin blanc uri
sau alti separatori);
REGULAR EXPRESION - textul poate contine !?i caractere de control;
DIRECTION- stabile!?te directia in care se face cautarea:
o FORWARD- spre sfar!?it;
o BACKWARD- spre lnceput;
ORIGIN - stabile!?te locul de unde incepe cautarea:
o FROM CURSOR - lncepand de Ia cursor;
o ENTIRE SCOPE - intregul domeniu.
OK - s-au terminat optiunile, se inchide fereastra !?i se fac inlocuirile;
CANCEL - se renunta Ia cautare;
SHIFT-DEL
CTRL-INS
SHIFT-INS
CTRL-DEL
In care lucram.
Optiunea PASTE - reia blocul din CLIPBOARD !?i il scrie in fereastra activa,
incepand din pozitia curenUi a cursorului.
Din cele prezentate se poate trage lesne concluzia ca, in acest fel, putem
muta blocuri dintr-un text in altul sau in cadrul aceluia!?i text.
Optiunea SHOW CLIPBOARD - se vizualizeaza
CLIPBOARD.
Optiunea CLEAR - se !?terge din text blocul selectat.
continutul
ferestrei
CTRL-F5
F5
F6
SHIFT-F6
ALT-F3
Atunci cand am terminat aranjarea unei ferestre se tasteaza ENTER iar fereastra
revine Ia culorile normale. in continuare se poate Iuera In ea in mod obi nuit.
Optiunea ZOOM - are rolul de a maximiza fereastra activa. Daca exista
deschise mai multe ferestre acestea devin invizibile.
Optiunea TILE - are rolul de a afia in prim plan toate ferestiele deschise.
Toate ferestrele au dimensiuni egale.
Optiunea CASCADE - are rolul de a dispune ferestrele una peste alta (in
stiva) iar fereastra activa este in prim plan.
Optiunea NEXT- are rolul de a activa fereastra urmatoare celei curente.
Optiunea PREVIOUS - activeaza fereastra ce a fost activa anterior celei
curente.
Optiunea CLOSE- Ia activarea acestei optiuni se inchide fereastra curenta.
Daca in cadrul textului s-au facut modificari, utilizatorul este intrebat daca se
salveaza sau nu continutul.
Autodocumentarea
Se poate lntampla sa nu !?tim cum functioneaza o anumita procedura, functie
sau sa avem alte nelamuriri. Prin activarea meniului HELP sistemul integrat
TURBO PASCAL ne ofera posibilitatea sa ne autodocumentam (fara a ne mai
uita lntr-o carte sau sa intrebam pe altcineva).
in cadrul acestui meniu exista urmatoarele optiuni:
CONTENTS INDEX
TOPIC SEARCH
PREVIOUS TOPIC
HELP ON HELP
SHIFT-F1
CTRL-F1
ALT-F1
Depanarea programelor
De multe ori, de:;;i credem ca avem un program corect, acesta nu furnizeaza
rezultatele cerute sau se intrerupe ca urmare a unei erori de programare.
Trebuie sa aflam unde am gre!?it. Mecanismele puse Ia dispozitie ne ajuta mult
in acest caz (problema este cu atat mai importanta cu cat programul este mai
mare).
Pentru a depana un program, avem urmatoarele posibilitati:
rularea pas cu pas;
vizualizarea unor variabile;
crearea punctelor de intrerupere.
a.
b.
De fapt, cele prezentate pna acum constituie optiuni ale meniului RUN.
Acestea sunt:
RUN
PROGRAM RESET
GO TO CURSOR
TRACE INTO
CTRL-F9
CTRL-F2
F4
F7
STEP OVER
PARAMETERS
F8
Acesta cicleaza (nu se termina niciodata). De multe ori, din grel?eala, facem
astfel de programe. Trebuie sa gasim o modalitate sa-l oprim. Pentru aceasta
se tasteaza CTRL + BREAK(PAUSE). Programul se intrerupe, iar pe una din
liniile
textului sursa apare o bara care indica instructiunea Ia care s-a oprit programul
nostru. Aceasta informatie ne este de mare folos, deoarece astfel putem
identifica secventa unde programul cicleaza. Daca dorim sa relansam
programul in executie (eventual cu alte date de intrare, ca sa vedem daca !?i in
acest caz programul cicleaza), constatam ca rularea programului porne!?te
din punctul
unde aceasta a fost intrerupta (I ansarea a fost facuta cu CTRL+ F9). Deci
tentativa noastra e!?ueaza. Avem insa posibilitatea de a porni rularea de Ia
inceput, daca tastam, in prealabil, optiunea PROGRAM RESET.
Crearea unui punct de intrerupere se poate face l?i cu ajutorul optiunii GO TO
CURSOR (in loc de F4).
Optiunile TRACE INTO !?i STEP OVER au fost prezentate Ia rularea
pr'ogramului pas cu pas.
Optiunea PARAMETERS permite introducerea unui !?ir care are acelasi rol ca
!?irul ce urmeaza numelui program in cazul apelului din DOS al unui program
care prime!?te anumiti parametri pe linia de intrare (vezi unitatea de program
DOS).
.
Exista !?i posibilitatea crearii mai multor puncte de intrerupere, de Ia inceput.
Pentru a realiza aceasta, se procedeaza astfel:
se pozitioneaza cursorul pe linia Ia care, cand se ajunge, se dore!?te crearea
primului punct;
se apeleaza optiunea TOGGLE BREAKPOINT, din meniul DEBUG, optiune
care are rolul de a marca primul punct de intrerupere (pe ecran apare o bara
ro!?ie);
se pozitioneaza cursorul pe urmatorul punct de intrerupere;
se tasteaza optiunea TOGGLE BREAKPOINT.
in acest fel se marcheaza toate punctele de intrerupere.
Rularea programului se face cu F4.
a considerm c
Compilarea programelor
Daca se dore!?te numai compilare, fara lansare In executie, se poate tas!a F9.
Cand compilarea a decurs fara erori se afi:;;eaza un mesaj corespunzator. In caz
contrar, apare un mesaj de eroare iar cursorul se pozitioneaza acolo unde se
banuie te a fi eroarea.
Observatie: nu se poate identifica cu precizie locul In care a aparut eroarea.
Vom lntelege motivul care duce Ia aceasta,in cursul anului viitor. Este sarcina
programatorului sa identifice cu precizie cauza erorii.
in anumite cazuri, dorim sa cream un program executabil (extensia .exeL in
acest caz se procedeaza astfel:
se apeleaza meniul COMPILE;
se tasteaza D (in mod normal, un program compilat se gase:;;te in memoria
interna) care dete mina ca programul compilat sa se gaseasca pe suportul
magnetic.
Crt:
N
.-t
Q
-c
CVJ
['f)M
C
\
1
o
r
I
a
344
II)
'
c
N
r
u
I
a
v
=
4
0::
CJ
rcJ
ttl
rn
III u
.Q
()
<
(
a:
345
- 'E'
II)
ca
.c
ca
c
ca
ii:
'ii)
N
I
N
II)
II \.V
-><
:;::
><
*
(' t)
c
"iii
('t)
ca
II)
a
:
ca
> *<
'E'
-* ..!..t::
-*
"iii
"iii
-><
II
:;::
\.V
-c:
0
or-
><
I
><
Q)
'1:1'
fl)o
ca
>*<
>*<
.!!
II)
>*<
*
I (
'ii)
II
N
'E
I
t::
.._...
\.V
X
-...*
(' t)
u;
0
u
-.
*..
N*
II)
*;:
u;
0
Ln
ca
c
II)
ICft
<0
-.
..
II
ca
it
-... ...!..
0
\!)
+-'
'ii)
.*..
N*
:5
-. .
I I )
"E
--
!::.
313
314
.....
co11)
co
Q..
1
1
1
1
1
1
1
1
1
LP
(")
1
\\
1
('LP
1
(")
1
I
\\
(!).. 1
>
*> LP<D 1
+) (
1
... ( II
1
a11),...:;
0 1
c:
1
'0 ci
1
\I I
N \1)
> 1
0 1
1
0
1
I
IJ)
1
)(
1
1
1
1
1
1
1
1
315 1
-..- .
--
1
1
1
1
1
1.0
\\
(.(..).
<1.0
(..(.).
\1
en .
- !.!)
>< 0
0 .. .. 1
-c*
co
<
1
l
<
0
Q
)(
'ii)
II
N
\\
C:l
..-.
0
....
o....
w
1
1
>
....
0
....I
..-.
... .....
IJ)
)(
1
1
1
1
1
1
316
>
.::
0
iii
>
0
LC')
II)
II
><
;::
u; ..2
113
":E >
0
LC')
II)
II
II)
;::
v
II
n
0
II
ca
317
>
;::
0
ctl
>
0
1.0
c
;;
II
0
;::
0
ctl
>
or-
..c 0
1.0
0::
.,
.cac
ca
II)
u
II 0
0)
u;
;
II
.0
0)
II
ctl
318
-c
>
u; ;::
..Q
ctl
c >
u; 0
10
u*;
u; X
rr-
caVI
c
ca
5:
;::
II
u; >co
-.c
U")
VI
-*
(.)
VI
0)
(.)
"
u*;
iii 0
0
(.)
II
u;
:;:::-
0)
II
ctl
119
Bibliografie
T. Balanescu
Horia Georgescu
M. Gheorghe
I. Vaduva
Doina Rancea
Constantin Apostol
loan Ro!?ca
Bogdan Ghilic
V. Cristea
& colectiv
lon Ivan
,Structuri de date"
1992
'
'
'
Le18000