Documente Academic
Documente Profesional
Documente Cultură
Marian Gheorghe,
Liviu Sofoea, prof. dr. Ion "Vduva
IPffiOGlMMAMEA N LMBAHELIE
PASCAL TURBO
PASCAL
volumul I
Limbajul Pascal. Concepte fundamentale
(Q)
EDITURA TEHNICA
Bucureti, 1992
B024779
Limbajul Pascal
- Concepte fundamentale
Limbajul Pascal
- Concepte fundamentale
INTRODUCERE................................................................................................
13
14
2.1.1................................................................Tipur
i de date predcfmitc................................................................. 14
2.1.2................................................................Tipur
i de date enumerare................................................................ 19
2.1.3................................................................Tipul
de date subdomeniu................................................................ 20
2.2. Tipuri de date structurate............................................................. 21
2.2.1................................................................Tipul
de date array (tablou).............................................................. 21
2.2.2................................................................Tipul
de date record (nregistrate)..................................................... 26
2.2.3................................................................Tipul
de date set (mulime)............................................................... 30
2.2.4................................................................Tipul
de date file (fiier).................................................................... 32
2.2.4.1.Fiiere secveniale........................................... 33
2.2.4.1.1. Operaii de intrare/ieire ............... 33
2.2.4.12........................................ Fiie
re text .................................................................38
2.2.4.13.
Fii
erele standard input i output . . . .
44
2.2.4.2. Asocierea fiierelor Pascal cu fiiere externe . . . 44
2.2.4.3. Fiiere cu acces direct..................................... 46
2.3.............................................................................Tipul
de date pointer (referin)..................................................................... 47
2.4.............................................................................Tipur
i de date recursive................................................................................ 49
2.5.......................Expresii..........................................................'. ($t)
2.6.............................................................................Exer
ciii ......................................................................................................................54
3. NSTOUCRJNI............................................................................................. 57
3.1.Instruciuni simple....................................................................... 57
3.1.1................................................................Instr
uciunea dc atribuire.............................................................. 57
3.1.2................................................................mstr
uciunea apel de procedur..................................................... 59
3.1.3................................................................Instr
uciunea de transfer necondiionat ......................................... 59
3.1.4................................................................Instr
uciunea de efect nul............................................................... 62
,3.2.Instruciuni structurate................................................................. 62
Limbajul Pascal
- Concepte fundamentale
3.2.1................................................................Instr
uciunea compus...................................................................
62
3.2.2................................................................Instr
uciuni iterative......................................................................
63
3.2.2.1....................................................Instr
uciunea while ..........................................................
63
3.2.2.2....................................................Instr
uciunea repeat..........................................................
66
3.2.2.3....................................................Instr
uciunea for ...............................................................
68
3.2.3.Instruciuni condiionale ...............................................
71
3.2.3.1....................................................Instr
uciunea if..................................................................
71
3.2.3.2....................................................Instr
uciunea case ............................................................
73
3.2.4.....................................................................................................Instruciunea with
74
3.3.............................................................................Exe
mple....................................................................................................
76
3.4.............................................................................Exer
ciii .....................................................................................................................80
4. PROCEDURL FUNCII, PROGRAME, MODULE ..........................................
84
84
4.1.............................................................................Meca
4.2.............................................................................Func
ii
.....................................................................................................................84
4.2.1................................................................Decl
ararea funciilor......................................................................
84
ul funciilor.............................................................................
85
4.2.2................................................................Apel
4.2.3................................................................Exe
mple ....................................................................................................86
4.3. Proceduri...................................................................................... 90
4.3.1................................................................Decl
ararea procedurilor................................................................. 90
4.3.2...............................................................Apelul
procedurilor.......................................................................... i
90
4.3.3................................................................Exe
mple ................................................................................................... 91
4.4. Programe...................................................................................... 92
4.4.1................................................................For
me sintactice; exemple . .'........................................................ 92
4.4.2................................................................Stru
ctura static a programelor..................................................... 93
4.4.3................................................................Dom
enii de vizibilitate a declaraiilor.............................................. 94
4.4.3.1...........................................Dom
enii de vizibilitate ale declaraiilor de identificatori
..................................................................................95
4.4.3.2.
98
4.4.3.3....................................................Cont
10
Limbajul Pascal
- Concepte fundamentale
4.7. Exerciii......................................................................................
155
158
ucere.................................................................................................
158
159
162
5.1...........................................................................Introd
5.2...........................................................................Sistem
5.2.1...............................................................Axiom
5.2.2...............................................................Axiom
196
deraii generale..................................................................................
196
6.1...........................................................................Consi
6.2...........................................................................Come
198
199
6.3.2...............................................................Comen
zi ce controleaz execuia programului......................................... 200
6.3.3...............................................................Comen
zi pentru trasarea execuiei........................................................ 201
6.3.4...............................................................Comen
zi relative la date......................................................................
201
6.3.5...............................................................Comen
zi informative.......................................................................... 202
6.3.6................................. Macrocomenzi..................,
203
6.3.7...............................................................Comen
zi referitoare la stiva programului................................................ 204
6.4. Lista comenzilor ............................................................................ 206
7. UTILIZAREA COMPILATORULUI PASCAL-OREGON-----------------_ .. .------------ 201
7.1...........................................................................Punere
a n lucru a compilatorului Pascal-Oregon................................................ 207
7.2...........................................................................Opiun
i de compilare...................................................................................... 208
7.3...........................................................................Exemp
le ...................................................................................................................209
7.4. Directive comentariu..................................................................... 211
7.5. Directiva % include ........................................................................ 212
Anexa 1. VOCABULARUL LIMBAJULUI PASCAL.....................................,............. 219
Anexa 2. SINTAXA LIMBAJULUI PASCAL N NOTAIA BNF..................................... 221
Anexa 3. DIAGRAMELE SINTACTICE PENTRU LIMBAJUL PASCAL.......................... 226
Anexa 4. CONSTANTE, TIPURI, VARIABILE, FUNCTH, PROCEDURI
PREDEFINITE ................................................................................... 233
4.1...........................................................................Const
ante ...................................................................................................................233
4.2...........................................................................Tipuri
...................................................................................................................233
4.3...........................................................................Variab
ile ...................................................................................................................233
4.4...........................................................................Funci
i
...................................................................................................................233
4.5...........................................................................Proce
duri ...................................................................................................................235
4.6...........................................................................Lista
simbolurilor echivalente......................................................................... 236
RSPUNSURI LA EXERCIII.............................................................................. 237
BIBLIOGRAFIE................................................................................................ 255
12
Limbajul Pascal
- Concepte fundamentale
INTRODUCERE
Acest capitol prezint cteva exemple de programe n limbajul Pascal, precum i unele caracteristici ale limbajului, avnd drept scop formarea unei viziuni de
ansamblu asupra acestuia nainte de a-i cunoate detaliile. n ncheiere snt
descrise pe scurt comenzile necesare executrii unui program scris n limbajul Pascal-Oregon sub sistemul de operare RSX-11M. Acest limbaj a fost proiectat i
implementat de ctre firma Oregon Software.
Menionm c la citirea i scrierea datelor n exemplele din acest capitol se
utilizeaz doar mediile standard de intrare / ieire, in implementarea Pascal-Ore-gon
read(x);
readln(y);
{citete o valoare in x }
{citete o valoare in y si trece la linia
urmtoare a ecranului} z := x + y ;
de atribuire; z primete
valoarea x + y }
writeln(z)
{este scris z }
{instruciune
~|
} antet de p r o g r a m
\ p a r te a d e c l a r a t i v J
1
|
\ i n st r u c i u n e a
|
J
end.
compus
Prin urmare, un program este alctuit n general dintr-un antet de program, o parte
declarativ n care snt descrise toate entitile folosite i o instruciune compus.
Instruciunea compus poate conine la rndul ei, alte instruciuni (condiionale,
iterative, etc.).
Spre exemplu, pentru a calcula valoarea absolut a unui numr real x se folosete
instruciunea condiional if, dup cum urmeaz:
program Valabs;
var x : r e a l ;
begin
readln(x);
if x < o
then x : = - x ;
{ s e c i te te x }
{daca x < 0 }
{atunci i se atr ibuie lui x
v a l o a r e a - x , a l t fe l x . r a m i n e n e s ch i m b a t }
w r i te l n C a b s ( x ) , x ) { s i n t s c r i s e m e s aj u l " a b s ( x ) = "
s i valoarea.x }
end.
Dintre instruciunile iterative ale limbajului Pascal vom alege spre exemplificare
instruciunea for care este folosit n programul urmtor pentru a calcula suma a n elemente
aflate ntr-un vector:
program Suma_n_elem;
const n - 10;
{ s e introduce constanta 10, c u numele n } var i : integer;
v : array [ l . . n ] of r e a l ; { s e d e c l a r a un ve c to r v c u
n componente numere r e a l e }
suma : r e a l ;
procedura Adun ( x : xe a l ; var y : r e a l ) ;
{Procedura Aduna c a l c u l e a z x + y s i intoaxce r e z u l t a t u l in y; detalii
despre proceduri in capitolul 4 i begin
y:= y + x
end;
{ Ad u n a }
begin { p r o g r a m p r i n c i p a l }
for i : = l to n do { p e n t r u i de la 1 la n j r e a d l n ( v [ i ) ;
c i te te v a l o a r e a v [ i ] , c i te una de p e o linie}
suma : - 0;
for i : = 1 to n do {pentru v a l o r i l e succesive
ale lui i}
Adun( v [ i ] , s u m a ) ; { a d u n a la suma a l i - l e a
element a l l u i v )
w r i te l n ( ' s u m a ' , suma)
end.
{se
14
Limbajul Pascal
end.
- Concepte fundamentale
J : = 0;
K : = 1;
->r-':
while K < 100 do begin
{ c i t t i mp u l t i m u l numr
F i b o n a c c i o b i n u t e ste
mai m i c dect 100}
w r i te l n ( K ) ;
{scr ie valoarea numr ului
Fibonacci}
K ; = K + J;
{ K v fi u r m to r u l n u m r
Fibonacci}
J := K - J
{ J este valoarea a n te r i o a r a
a lui K}
end { w h i l e }
mai jos este 81+c. Spre exemplu, codul caracterului 2 este 50. Mulimea de
caractere a limbajului Paseal-Oregon conine urmtoarele elemente: ale acestei
mulimi: literele alfabetului latin (mari sau mici), cifrele arabe, caracterul * '
(spaiu), '+*, *-', '>', etc.
16
Limbajul Pascal
- Concepte fundamentale
+
{
<
>
*
(
@
>
<>
>=
J
<=
:=
.0)
i cuvintele cheie:
and
array
begin
case
const
div
do
downto
else
end
file
for
function
goto
if
in
of
labei
or
mod
origin
nil
otherwise
not
packed
procedure
program
record
repeat
set
then
to
type
until
var
while
with
(2)
numerele de tipul integer pot fi reprezentate i n baza 8, irul de cifre octale fiind
urmat n acest caz de litera B (sau b). Spre exemplu +27 B , 27 b i 027 B snt
reprezentri ale valorii 23.
numr de tipul integer sau un numr fracionar i are urmtorul efect: valoarea
numrului de tipul real este valoarea numrului ntreg sau a celui fracionar,
nmulit cu 10 la puterea dat de factorul de scal.
Spre exemplu 31415 E -4, 314.15 E -2, 0.31415 E 1, 0.31415 E +leta.,
reprezint aceeai aproximare a numrului 7 C .
Numerele de tipul real pot fi precedate de semnele + sau -.
irurile de caractere snt iruri de caractere imprimabile, delimitate de
apostrof. n irul de caractere, apostroful apare dublat.
Exemple:
' i r de c ar a c te r e IMPRIMABILE '
' APOSTROFUL ESTE ' ' '
Etichetele snt iruri de cifre zecimale.
Exemple: 1, 01,20, 0. De notat c 1 i 01 reprezint aceeai etichet.
Comentariile snt iruri de caractere precedate de { i urmate de }.
Directivele snt cuvintele rezervate forward, externai, nonpascal (vezi
capitolul 4) i %include (vezi capitolul 7).
In scrierea oricrei uniti lexicale ce nu este literal alfanumeric nu se face
distincie ntre litere mari i litere mici. Astfel, identificatorul SUMA este identic cu
Suma, dar literalele alfanumerice 'SUMA' i 'Suma' snt distincte.
De asemenea orice unitate lexical (cu excepia comentariilor) se scrie pe
o singur linie.
' ;-,
Exemplu: Urmtorul mod de scriere a identificatorului SUMA: su MA . nu este
permis.
La scrierea consecutiv a identificatorilor, a cuvintelor cheie, a literalelor
numerice fr semn i a celor alfanumerice, nceputul unei uniti lexicale ar putea
fi luat n unele cazuri drept o continuare a celei precedente. n aceast situaie,
ntre ele se insereaz spaii (caracterul ' ') caractere de tabulare (ht din tabela
ASCII) sau de salt la rnd nou (f f i cr n aceeai tabel). Trebuie observat c
simbolurile speciale compuse de forma o, < = etc., identificatorii i literalele
numerice snt uniti lexicale ale programului; deci nu se pot introduce spaii ntre
caracterele componente.
Exemplu: nu se poate scrie < > , < = , su MA , I 23 pentru o , <=,
SUMA i 123 .
Uiii
13.
'.
.'
ii
Sintaxa limbajului
18
Limbajul Pascal
- Concepte fundamentale
>
te r m e n >
"
i
'
.
| <cifra> ] _ }
are semnificaia: un identificator ncepe cu o liter; dup aceast liter poate urma
o secven finit de litere,cifre sau caractere *_*. Astfel, A, a l , A 1 B , Al_b snt
conforme cu aceast definiie, dar 2 A nu.
Metasimbolurile [ i 3 denot prezena opional a simbolurilor pe care le
limiteaz. Spre exemplu, definiia < unu > [ + | --] l definete unitatea sintactic ce
conine elementele +1, - l i 1.
O definiie n notaia BNF poate fi privit ca o expresie n care snt evaluai,
n aceast ordine de prioritate, operatorii concatenare, | i : : = , cu convenia
uzual n ceea ce privete parantezele ( , } i [ , ] .
Sintaxa limbajului Pascal, n notaie BNF, este dat n anexa 2.
Frazele unitii sintactice <program> se numesc programe Pascal corecte
sintactic.
Exemplu. Urmtoarele fraze
p r o g r a m A (I ) ; b e g i n e n d .
program A (I, O); begin begin end end.
snt programe Pascal corecte sintactic.
Simbolurile { , } , [ i ] utilizate n notaia BNF snt n acelai timp i
elemente ale vocabularului limbajului Pascal. Pentru a evita confuziile, n anexa 2
aceste simboluri, ca elemente ale vocabularului, snt redate prin simbolurile echivalente (* , * ) , ( . i respectiv . ). n programele Pascal pot fi utilizate ambele
variante.
n notaia BNF se poate specifica i vocabularul unui limbaj de programare
dac prin <u> desemnm unitatea lexical u. Vocabularul limbajului Pascal este
descris in notaie BNF n anexa 1.
20
Limbajul Pascal
- Concepte fundamentale
11
I -------> * --------1
--------->
1------- y <-----J
22
iar
Limbajul Pascal
- Concepte fundamentale
< U ^ : : = [ X ] prin
<U>
--------1----> X -----1------>
L ______________I
i
< l i te r a > < -------j
< c if r a > <
<------U
I A . Exerciii
1. Limbajul Pascal are cuvinte rezervate. Dar FORTRAN? Dai exemple de limbaje care au
cuvinte rezervate.
2.
PI ,
-----,----------------,----->
,--------> C "--------,----->
I- - - B <'
'------- c <-------1
'
-------------,-----------------------------------------------i--------------->
<-----
--------> C -----> D
>
b)
const
type
const
var
c)
begin
- 1;
T = 0 .. 2;
C A;
X , Y : T;
:- A + 1;
: = A * C
end.
24
Limbajul Pascal
- Concepte fundamentale
rc(x) - j
Rezult c cel mai mare numr reprezentabil n cod complementar este 2 lM, adic
32767 (maxint); cel mai mic numr este -21S, adic -32768. Tipul real este mulimea
de numere reale
{ x f x - 0 , x 0Xi. . . x - b* i x . s n t c i f r e n b a z a b i l,SeSl,J
unde baza b a sistemului de numeraie, limitele lt i 1 ale exponentului e i
numrul n + l de cifre ale prii fracionare snt dependente de implementare iar
x0*o pentru x*o. n cazul de fal, b = 2 , -128 e < 127, iar n - 2 3 (sau, opional,
n = 5 5 - vezi cap. 7, opiunea / DOUBLE ).
Elementele tipului real se reprezint n programe prin literale numerice de
formele i. f, i. f Es sau iEs, eventual precedate de semnul + sau -, unde i i f snt
numere zecimale ntregi fr semn reprezentnd partea ntreag i respectiv partea
fracionar a literalului numeric. Dac este specificat i factorul de scal s (zecimal
ntreg, eventual cu semn), atunci literalul reprezint valoarea real i, f io" sau ir
io?.
Spre exemplu, elementul -0,25 al tipului real poate apare n programe Pas cal n una din formele -0.25, -25E-2, -25.0E-2 etc.
Se observ c n programele Pascal elementele tipului real se presupun a fi
scrise n baza 10.
+1.0 se scrie 0,1-2' (adic xc=l, b=2 i e-l); caracteristica este c = l?B+e ~ 2 7+.l =
o o o o o o i . Deci primul cuvnt al reprezentrii n calculator este o 10000001
o o o o o o o , iar al doilea cuvnt este o o o o o o o o o o o o o o o o (n baza 2). Reprezentarea
octal este 4 0200, respectiv o. n mod analog, -5.0 se va reprezenta prin numerele
octale 14 0 6 4 0 i o.
Cel mai mare numr real reprezentabil n simpl precizie este
0 , l l l l . l l l l l l J . l l l l l l l l l - l l . i l . ' 2.A-,*l- 2'27*1038.
Cel mai mic numr real pozitiv reprezentabil este
123
0,1-2'127=2
ip3%
.
Numerele reale de fonna o, l x t . . . x2, mpart intervalul n 223 subintervale de
lungime (l-^)'2"23=224. n consecin, eroarea maxim de aproximare a unui
numr real printr-un numr real reprezentabil este zS-2" 2* < IO"7. De aici rezult
o precizie de 7 cifre zecimale semnificative pentru numerele reale reprezentate n
precizie simpl.
--.
Tipul boolean conine dou elemente referite prin constantele predefinite
false i true. Operaiile predefinite ale acestui tip (and, or i not) definesc o
structur de algebr booleana.
Tipul char este o mulime finit i ordonat de caractere ce conine, printre
altele, litere, cifre i caracterul spaiu. n cazul de fa, toate caracterele ASCII
(vezi paragraful 1.1) aparin tipului ch a r.
n programe, un element al acestui tip se desemneaz prin includerea
caracterului ntre dou semne ' (apostrof). Spre exemplu, ' A ' , ' 0 ' , ' + ' , ' '
desemneaz litera A, cifra o, caracterul + i caracterul spaiu. Caracterul ' se
reprezint prin
26
Limbajul Pascal
- Concepte fundamentale
. c.
urmtoare:
'4
end.
,
,
8 div
- 8 div
8 div
- 8 div
8 mod
3 );
3 );
( - 3 ) );
( - 3 ) );
3):
- -
' :' -ii .; * . TOt
ilustreaz aplicarea operatorilor div i mod.
;>'
V - -"
Operatorii relaionali uzuali , o (diferit de), <, < (mai mic sau egal), >, > conduc la
rezultate de tip boolean. Ambii operanzi trebuie s fie de acelai tip (integer, r e a l , char
sau boolean). Ca excepie, se admite in locul unui operand de tipul r e a l un operand de
tipul integer.
Pe tipurile integer i real relaia de ordine <* este cea uzual;
elementele tipului char snt ordonate prin valorile asociate n codul ASCII, iar
fa l s e < tiue.
.
Operatorii not, and i or se aplic asupra operanzilor de tip boolean, cu semnificaia
logic uzual. n plus, operanzii pot fi i de tip integer; rezultatul este tot de tip integer i
Alte operaii snt implementate prin funcii pnedefinite. Spre exemplu, abs ( x ) este
valoarea absolut a lui x, iar sqr ( x ) este ptratul lui x. Tipul rezultatelor este acelai cu tipul
argumentului x, care poate fi integer sau real.
Urmtoarele funcii: s i n , c o s , a r c t a n , exp (exponeniala de baz e), In, s q x t
(rdcina ptrata) admit argumente de tipul Integer sau r e a l , dar rezultatul este totdeauna
de tipul real. Predicatul odd (x.;, cu argument de tip integer ia valoarea t r u e dac x este
impar i fa l s e n caz contrar. Trunchierea i rotunjirea numerelor reale se realizeaz prin
funciile trunc i respectiv round. Astfel, t r u n c ( x ) -n dac x este de tipul real, n numr
ntreg i nix<n+l n cazul cnd x kosaun- l < x S n n cazul cnd x < 0. De asemenea,
round ( x ) este t r u n c ( x +0.5) pentru x^o i trunc ( x - o . 5) pentru x <0.
Pentru tipurile integer, char i boolean exist funciile succ (succesor) i pred
(predecesor), cu semnificaia uzual. Funcia bijectiv ord, cu argument de tip char ia valori
de tip integer cuprinse ntre 0 i 127 i realizeaz codificarea caracterelor. Spre exemplu,
ord('0' ) = 4 8 , ord( ' 1' ) - 4 9 etc., o r d ( ' A ' ) = 6 5 , o r d ( ' B ' ) - 6 6 etc.. Inversa acestei funcii
este ch r. De fapt, relaia de ordine o pe mulimea char este definit astfel:
a <- b dac i numai dac ord ( a ) < - o r d ( b ) .
De asemenea, pred ( c ) -chr ( o r d ( c ) -1) i s u c c ( c ) =chr ( o r d ( c ) + l ) . Toate
aceste operaii snt prezentate sintetic n anexa 4.
Trebuie remarcat c tipurile de date snt mulimi finite, prin urmare cea mai mare
parte a operaiilor discutate anterior snt doar parial definite; spre exemplu, succ (maxint) ,
maxint+1, pred ( - maxint -1) etc, nu au sens. n general operaiile nu snt definite pentru
acele argumente care provoac depirea limitelor impuse de tipurile de date. Executarea
programelor n aceste situaii conduce la obinerea unor rezultate incorecte. Evitarea acestor
cazuri este n sarcina programatorului, deoarece numai o parte a lor este sesizat i
semnalat de calculator.
Tipurile de date i operaiile predefinite prezint o seric de abateri de la proprietile
matematice cunoscute. Astfel, tipul integer nu este considerat o submulime a tipului rea 1,
datorit modurilor diferite de reprezentare n calculator. Acest fapt este reflectat n programe
prin forma diferit a literalelor cate desemneaz elementele celor dou tipuri (spre exemplu,
numrul real 1 se reprezint prin 1.0).
Pentru a corecta aceast anomalie, operaiile asociate tipului real snt extinse astfel
nct admit i operanzi de tip integer; n acest caz, calculatorul realizeaz o conversie de la
reprezentarea integer la cea de tip real. Spre exemplu, operaia 1/2 este precedat de
conversia lui 1 n 1.0 i a lui 2 n 2.0. Aceast conversie nu cade n sarcina programatorului.
De asemenea, multe proprieti familiare ale operaiilor nu se mai pstreaz. Astfel,
adunarea ntregilor nu este totdeauna asociativ; spre exemplu, maxint+(maxint-maxint) d
rezultatul maxint, dar (maxint maxint) - maxint conduce la depirea limitelor tipului
integer. Totui, cu excepia cazului n care apare depirea limitelor, axiomele aritmeticii
numerelor ntregi se consider a fi satisfcute pentru tipul integer, cu operaiile predefinite
ataate. Deoarece depirea este semnalat de calculator, se poate presupune c un program
28
Limbajul Pascal
- Concepte fundamentale
care s-a terminat fat aceast eroare a executat operaiile asupra tipului integer respectnd
proprietile matematice uzuale.
Situaia este mai complicat n cazul tipului real, deoarece astfel de abateri pot apare
n absena fenomenului de depire a limitelor. Pentru ilustrare, s considerm ca
reprezentare a tipului real mulimea {x | x-i o, XgXiXgX, io*}. Fie elementele x-o,9554-IO0, y
= 0,3000* 10 i z - -0,2555*10 de acest tip. Dac se evalueaz n aceast reprezentare
expresia x (y + z) se obine rezultatul corect 0.9999. ntr-adevr, s = y+ + z = 0,0445 i se
reprezint prin 0,4450*IO"1, iar x + s - 0.9999 i se reprezint prin o,9 9 9 9 io0. Pentru
expresia (x + y)+z, suma s=x+y-i,2554 i se reprezint prin 0,9995*10. Aceasta este o
aproximare a rezultatului corect Estimarea erorilor de calcul n cazul tipului real cade n
responsabilitatea programatorului.
Urmtorul exemplu ilustreaz utilizarea variabilelor de tipurile prezentate mai sus,
precum i a operatorilor i funciilor predefinite asociate.
Exemplu: var
7
a
b
c
d
: integer; "
! real;
: char;
: boolean;
bagin
nd.
feb, m a r, a p r, m a i, iun,
i u l , aug, sep, o c t , nov, d e c ) ; var L , X , Y, z :
b : boolean; begin
w r i te l n (ord( i a n ) ) ;
L : - feb;
X
pred(L);
Y
succ(X); b
X < Y;
w r i te l n ( b , fe b < o c t , i a n = dec)
end.
Observaie. Variabilele de tip enumerare nu pot apare in instruciunile de
intrare - ieire; ele pot ti utilizate, spre exemplu, pentru indexarea tablourilor.
begin
b : natural;
c, a :
a .. a ;
^ ;:,
a : 0 ; a : = succ( p r e d ( a ) ) ;
b
65535; b := pred(b)
c := 'a'; d = 'd';
+ 1;
,:. _
30
Limbajul Pascal
- Concepte fundamentale
w r i te l n ( a , b , c , d ) ;
c : = chr( s u c c ( o r d ( c ) ) ) ;
d
chr(pred( o r d ( d ) ) ) ;
w i i te l n ( c d )
Observaie. Toate tipurile de date simple snt mulimi finite i ordonate de valori.
Tipurile de date simple diferite de r e a l se mai numesc i tipuri ordinale. O caracteristic a
acestor tipuri este prezena operaiilor predecesor (pred) i succesor (succ).
Pentru tipurile ordinale diferite de integer i care nu snt subdomenii ale acestuia se
poate aplica funcia bijectiv o r d care asociaz valorilor tipului numerele naturale 0,1 etc.
Relaia de ordine este cea indus de funcia ord i este notat prin <.
azzay ti] of T
packed azzay [ I ] of T
Tipurile I i T pot fi predefinite, anonime sau definiia lor trebuie s precead, n textul
programului, definiia tipului azzay.
Dac x este numele unei variabile sau constante de tip azzay, atunci elementul x ( i )
se noteaz n programe prin x [ i ] .
Atributul packed indic n general cerina de optimizare a spaiului de memorare
pentru elementele tipului azzay.
Un caz special l reprezint tipurile de date string (ir de caractere), declarate prin
packed azzay [I ] of char
eo
write.
nd.
se realizeaz atribuirea irurilor de caractere ' lonescu' , ' popescu' variabilelor a i respectiv
b, iar n urma executrii instruciunii if se tiprete irul de caractere ' Popescu'. Trebuie
menionat c dac a i b ar fi fost declarate tar atributul packed atunci expresia a < b i
instruciunea w r i te l n ( b ) nu ar mai fi avut sens, necesitind substituirea referirilor la
variabilele a, b cu referiri la componente ale acestora.
Optimizarea spaiului de memorie ocupat de elemente de tipul packed
azray poate provoca accesul ineficient la componentele acestora. Din acest motiv,
se recomand efectuarea unei operaii de despachetare a acestor elemente prin
invocarea procedurii predefinite unpack, nainte de prelucrarea elementelor lor.
Dup aceast prelucrare, spaiul de memorie ocupat de elementele respective poate
fi din nou optimizat prin operaia de mpachetare apelnd procedura predefinit
pack. Re
i.
. . . .
A : array (m . . n ] of T;
B : packed axzay [ u . . v ] of T;
in-m >= v- u . Dacm <= i <= n, atunci prin operaia de mpachetare pack (A, i , B) tabloul
B ia valorile B t j ] - A [ j - u + i ] pentru u <- j <= v, iar prin operaia de despachetare
unpack(B , A , i ) tabloul A ia valorile A [ j ] - B [ j + u - i ] , pentru i < = j <= i+vru.
- arxay [ 1 . . 5 ] of r e a l ;
B - axzay [ - 1 . . 3 ] of r e a l ; corist ca - A (1.1,
cb - B ( l . l , 2 . 1 , 0 . 1 , 3 . 1 , 2 E - 1 ) ; Var
y
begin
2.1,
0.1,
3.1,
: B;
: 1. . 5 ;
w r i te l n ( c a [ l ] , c b [ l ] ) ; X ; =
ca; y := cb;
fox i : = 1 to 5 do
w r i te l n ( x [ i ] , y [ i - 2 ] )
end.
Snt definite aici dou tipuri azxay (a si B) ale cror elemente reprezint vectori, avnd
cte 5 componente numere reale. n timp ce componentele variabilei x i ale constantei ca snt
referite n program prin x [l ] , . . . , x [ 5 ] i respectiv ca [1], ca 12] etc., cele ale lui y i c b
snt referite prin y [ - 1 ], t . . , y [ 3 ] , respectiv c b [ -1], cb [ol, etc. Constantele ca i cb,
dei conin aceleai componente, snt totui de tipuri diferite.
Exemplu.
type T - ( r o u , verde, a l b a st r u ) ; vax e :
axxaytT] of integer; begin
e [ r o s u ] : = 1;
e [ s u c c ( r o u ) 3 '" succ ( e [ r o u ] ) ;
e [ a l b a st r u ] : = 3 ;
32
Limbajul Pascal
w r i te l n ( e [ ve r d e ] )
- Concepte fundamentale
[valoarea 2}
end.
Exemplu. Fie programul
vax a , b : paeked axzay [ i . .1] of ch a r ;
d : paeked azzay VI -- 2 ] of char ; c : ch a r ;
begin
b [ l ] : = ' a ' ; [ ' a ' e ste constanta d e t i p ch a r } d
:= 'ab';
{ ' a b ' e ste c o n st a n t a de t i p st r i n g } w r i te l n ( b , d ) [ i r u r i de
c a r a c te r e i n w r i te }
end.
Trebuie subliniat c tipul char nu este identic cu tipul paeked axxay [ 1 . . 1 ] of char.
Astfel, instruciunea b 1 = ' a ' este incorect, deoarece b este variabil de tipul ir de
caractere, dar ' a ' este constant de tipul char. Din acelai motiv i instruciunea b : - c este
incorect.
n exemplele de mai sus, tipul de baz a fost de fiecare dat un tip prdfinit (deci
simplu). Considerm acum un exemplu n care tipul de baz este el nsui un tip structurat.
type N - axxay [ 1 . . 3 ] of r e a l ;
type M = axxay [1. . 2 ] of N;
const C - M ( N (1.1,
1. 2 , 1. 3 ) , N ( 2 .1, 2 . 2 , 2 . 3 ) ) ;
i- ;
array [T_0] of array[T_l,
T _k ] of T
se poate scrie ca
array [T_0, . . . , T_k] of T Deci x [ i _ o , i_i, . . . , i_k] are sensul x [i_p] [i_i, , i_k].
Exemplu.
. .
type B
= array [1. . 3 ] of r e a l ;
end.
Constantele CT i cu au proprietatea CT [ i ] [ j ] = C T [ i , j ] - CU[ i , j ] = CU[ i ] [ j ]
pentru orice l <- i <= 2 s i 1 <= j <- 3. Ele snt totui de tipuri diferite; astfel, variabila
VT de tipul T nu poate lua niciodat valoarea c u (de tipul u) dar poate lua valoarea CT.
Exemplu. Mulimea matricilor ptrate de ordinul 2 cu elemente numere
reale poate fi definit prin
>
>r >
= azzay [1..2,
-'rVfcfc
1..2] of r e a l ;
(1.0,
3 4
2.0), LINIE(3.0, 4.0)), prin
w r i te l n ( V T [ l ] [ 2 ] , VT[1, 2 ] > ;
34
Limbajul Pascal
- Concepte fundamentale
( L I N I E d .0,
se definete tipul record cu numele c, avnd ca proiecii funciile r e i im. Tipurile si T, snt
ambele r e a l . Partea real i partea imaginara a variabilei x apar n program n notaia x . r e
i respectiv x.im.
Exemplu. Fie programul
type d a t a - record
luna : ( i a n , fe b , m a r, a p r, m a i , i u n ,
i u l , a u g , s e p , o c t , n o i , d e c ) ; ziua ; 1 . . 3 1 ;
a n u l : integer end;
persoana = record
nume: packed array [1..10] of ch a r ; d a t a n : data
____________________________22. Tipuri de date structurate_______________________27
nd;
var data_cr : d a t a ;
p : persoana; begin
data_cr.l u n a i a n ;
data_cr.ziua:-24;
data_cr. a n u l :-1859;
p.nuine:-'IONESCU p.da
ta_n.luna: = fe b ;
p.data_n.ziua:=2; p.da
ta_n.anu1: = 1947
nd.
n acest program este introdus tipul record cu numele d a t a i cu proieciile luna,
z i u a i anul. Tipul T x este un tip enumerare, T2 un tip subdomeniu, iar T, un tip predefinit
Variabila data_cr are componentele data_cr. l u n a , d a t a _ c r. z i u a idata_cr.anul.
Exemplu. Poziia unui punct material n spaiul cu trei dimensiuni poate fi descris n
funcie de timp, prin elemente ale unui tip de date racord, n programul:
fcype POZIIA = racord
x , y, z : r e a l ; timp
: 0..3600
and;
var punct, origine : POZIIA; begin
origine: = P O Z I T I A ( 0 . 0 , 0 . 0 , 0 . 0 , 0 );
p u n c t . x : = 1 . 0 ; punct.y : = 1 . 0 ; punct.z: = 1 . 0 ; pune t.timp: - 19 89
and.
Componentele variabilei punct se obin prin proieciile x , y, z i timp i snt
urmtoarele: punct. x, punct.y, punct. z, i punet. timp.
36
Limbajul Pascal
- Concepte fundamentale
ntr-adevr, indicele unui tip axxay poate fi orice tip scalar (diferit de i n te ge r i
r e a l ) n timp ce proieciile canonice ale unui tip record snt desemnate prin identificatori.
Mai mult, un indice poate fi o expresie ce se evalueaz n timpul execuiei
programului dar identificatorii ce indic proieciile canonice snt stabilii la momentul scrierii
programului.
Cazul particular de tip record obinut prin T4 = T, i < = i < = m poate fi
definit ca un tip array, n care indicele este un tip enumerare. Astfel
type RT = zacord
end;
x, y, z : T
reuniune_disj( b , 3 , 1 )
reuniune_disj( b , 3 , 2 ) .
end;
packed . .10] of ch a r
nume : nume__persoana;
sex : (femeie, b r b a t ) ;
o
case st a t u t : ( c s to r i t , n e c s to r i t ,
d i vo r a t , vduv) of
c s to r i t ,
vduv
: (data_casatoriei: d a t a ) ;
divorat
: (data_cas,
d a t a _ d i vo r t: d a t a ) ;
n e c s to r i t : ( ) end;
Urmtoarele
articole:
persoana(nume_persoana('Popescu
',
'Ion
' ), b r b a t , c s to r i t , d a t a ( i a n ,
2,
1 9 4 0 ) ),
persoana ( n u m e _ p e r s o a n a ( ' I o n e s c u
',
'Mria
' ), fe m e ie ,
d i vo r a t , d a t a ( m a r, 2 , 1 9 5 0 ), d a t a ( o c t , 1 0 , 1 9 6 0 ) ), p e r s o a n a " (
mime_persoana( ' P o p a
'Ion
'), brbat,
n e c s to r i t ) , aparin tipului record cu variante persoana.
Asupra acestui tip de date se pot aplica urmtoarele operaii de selectare: nume,
nume.primul, nume.u l t i m u l , st a t u t , d a t a _ c a s a to r i e i . l u n a , data_cas. luna
etc.
38
Limbajul Pascal
- Concepte fundamentale
Unul din conceptele noi impuse de limbajul Pascal l reprezint tipul de date ale crui
elemente snt mulimi asupra crora se pot aplica operaiile uzuale.
Fie un tip scalar diferit de r e a l j e numete tip eet cu tipul de baza , mulimea
( T ) , format din toate submulimile lui . Definiia unui tip eet se face printr-o declaraie
sau
set of T
packed aet of T
2,
type st a r e - ( i n i i a l a , o a r e c a r e , fi n a l a ) ;
s: st a r e ;
end.
. .var
m : set of st a r e ; begln
s : - i n i i a l a ; m: =
[s];
w r i te l n ( i n i i a l a in m ) ; { s c r i e t r u e } m : = m + [ fi n a l a ] ;
writeln ( fi n a l a in n i ) ; { s c r i e t r u e ] n i : = m - [ i n i i a l a ] ;
w r i te l n ( i n i t i a l a in m ) { s c r i e fa l s e }
n paragraful 3.2.2.1 poate fi gsit un alt exemplu de utilizate a tipului de date set.
'. ~ . ;
....
40
Limbajul Pascal
- Concepte fundamentale
Se observ c dac f=< EOF > (fiierul este vid), dup deschiderea fiierului f prinreset( f ) avem
eof (f) =true.
get este procedura de citire a unei componente din fiier. Apelul de procedur get ( f )
este permis numai dac eof ( f ) = fa l s e . Dac f = x , f d = y, atunci dup execuia
instruciunii get ( f ) avem: f = x p r im u l ( y ) , f d - r e st ( y ) . n consecin, f " = p r i m u l
( r e st (y ) ). Vom nota acest fapt prin:
{ n ot e o f ( f ) , f = x , f d = y } get ( f >
t f a = x p r im u l (y ) , f d = r e st (y ) }
l f A = p r im u l ( f d ) = p r i m u l ( r e st ( y ) } }
Se observ c dac y = < c , EOF > (adic f * are ca valoare ultima component a
fiierului f ) atunci dup instruciunea get ( f ) , f * este nedefinit i eof ( f ) are valoarea
true.
Exemplu.
var f; file of integer;
begin
{ f = < 0 , - l , E OF > }
r e s et ( f ) ;
42
Limbajul Pascal
- Concepte fundamentale
..."
{ f e = x , f d - < E OF > , f =c )
put(f)
{ f , = xc , f d - < E O F > , f * n e d e fi n i t )
Exemplu, var f : file of i n te ge r ;
begin
r e w r i te ( f ) ; { f =e,
f d - < E OF > ) f*:=0;
put(f);
{f8 = < 0 > , fd-<EOF>l
{ f n e d e fi n i t ; a st fe l f * i - f * - l e ste i n c o r e c t } f - : - - l ; p u t ( f ) ;
{fa = < 0 , - 1 > ,
f d = < E OF > } ? f = < 0 , 1,E0F>}
end.
Observaii.
Dup apelul de procedur p u t (f), f * rmne nedefinit.
Prin execuia instruciunii p u t (f), valoarea lui f * se adaug l a
sfritul fiierului ca ultim component.
3.
O component deja scris nu se poate modifica dect prin rescrierea
ntregului fiier, validat prin r e w r i te .
Schema de utilizare a acestor proceduri pentru crearea unui fiier este
urmtoarea:
var f : file of T; . . . begin
1.
2.
r e w r i te ( f ) ; repeat
{atr ibuie valoare lui f * }
put(f)
until u l t i m a component a fo st a d u ga t ' end.
44
procedur nu exist n limbajul Pascal standard. De notat c fiierele snt automat nchise la
terminarea execuiei programului sau cnd apar ca argumente ntr-un nou reset sau rewrite.
Utilizarea procedurilor de intrare/ieire este ilustrat n exemplul 1 din paragraful
3.3.
Sintetic, operaiile de creare i citire a unui fiier secvenial snt prezentate n schema
urmtoare:
->
(f)
rewrite
revrite(f)
<-
<get(f)
I
h-<->
>1
. _____f
.
1
----------1
i
reset(f)
i>
put(f)
1
*/---------
45
1.
2.
Spre deosebire de fiierele declarate fila of ch a r, scrierea ntr-un fiier te x t
f trebuie s se ncheie printr-o instruciune w r i te l n ( f ) ; n caz contrar, ultima linie de text
nu este totdeauna scris n fiier din motive dependente de implementare.
46
xeadln este o procedur prin care la citire se avanseaz la nceputul liniei urmtoare
celei curente. Apelul de procedur r e a d l n ( f ) este echivalent cu secvena:
while not e o l n ( f )
do get ( f ) ; get ( f )
Astfel, f * primete ca valoare primul caracter din linia urmtoare celei curente. Dac linia
urmtoare este vid (const doar din eol), atunci f * primete valoarea spaiu i e o l n ( f ) ia
valoarea true.
paga este o procedur cu urmtorul efect: textul scris n fiierul f dup apelul page
(f) va apare pe o nou pagin atunci cnd coninutul fiierului f este imprimat De fapt, apelul
p a ge ( f ) are ca efect inserarea n text a caracterului ff ("form feed"), interpretat de
r e a d ( i ) ; w r i te ( i )
and
cod.
IM
-,*
.ti
prin care snt citite i scrise numere ntregi pe fiierele text input i o u t p u t (vezi paragraful
2.2.4.1.3). Trebuie observat c la introducerea datelor, ultima cifr a ultimului numr va fi
urmat imediat de sfritul de fiier (caracterul CTRL/Z); n caz contrar, dup ultimul numr
citit, condiia eof este fals; prin urmare, se execut nc o dat instruciunea r e a d ( i ) .
Deoarece n acest moment nu mai exist numere ntregi n fiierul input, va fi semnalat
eroare.
- dac a este un ir de caractere, atunci se citesc attea caractere cte snt
var f : te x t;
a : packed array [ 1 . . 3 ] of ch a r ;
47
C!
begin
ch a r ;
r e s et ( f ) ;
r e a d ( f , a ) ; { c a r a c te r u l curent e ste e o l } w r i te l n ( a , e o l n ( f ) ) ;
r e a d ( f , a ) ; { c a r a c te r u l curent nu s - a m o d ifi c a t
deoarece a e ste s ir }
w r i te l n ( a , e o l n ( f ) ) ;
r e a d ( f , c ); { c a r a c te r u l curent s - a m o d i fi c a t
deoarece c e ste ch a r }
w z i te l n ( c , e o l n ( f ) ) ; r e a d ( f , c ) ;
w r i te l n ( c , e o l n ( f ) )
Apelul xead(f,
undea este o expresie de tip char, integer, real, boolean sau packed azray of char (ir de
caractere), a crei valoare trebuie scris n fiierul f n format extern; ij i i2 snt expresii de
tipul integer, numite specificatori de format
i, specific prin valoarea sa absolut numrul minim de caractere ce vor fi folosite la
scrierea valorii lui a n fiierul f; dac Snt necesare mai puin de I ij | caractere, atunci
forma extern a valorii lui a este completat cu spaii la sting pn la | i t | caractere. Dac o
valoare numeric necesit mai mult de J it | caractere, se scriu attea caractere cte snt
necesare (valoarea numeric nu este trunchiat). irurile de caractere i valorile booleene snt
trunchiate la primele | i11 caractere. Valoarea implicit a lui it este dependent de
i i i mp l i c i t
7
13
48
| lungimea i r u l u i
2.2.
Tipuri
structurate
dc
date
43
O valoare ij. negativ are sens numai n cazul cnd e este de tip integer, packed
azzay of char sau char: ntregii snt scrii n baza 8, tar scrierea irurilor de caractere
(caracterelor) este suprimat
i, are sens numai n cazul cnd expresia a este de tip real i specific prin valoarea sa
absolut numrul de cifre care urmeaz punctului zecimal n scrierea valorii lui a n virgul fix. n
lipsa lui i2, valoarea lui a se scrie In virgul mobil (cu factor de scal). Exponentul este format din
litera ' E ', semnul ' ' sau ' - ' i dou cifre zecimale. Dac i2 are valoare negativ, atunci valoarea
expresiei a este scris n virgul mobil.
Apelul write(f ,a) are urmtorul efect: valoarea expresiei a din argumentul a este scris
in fiierul f de tip text, convertit la formatul extern conform specificatorilor de format ilf i2.
Apelul wzite (v, al,..., a) este echivalent cu secvena:
write(f, a l ) ; . . . ; w r i te ( f , a m ). Apelul zitain(f, al,..., an) este echivalent cu
secvena:
w z i te ( f , a l , . . . , am); wiiteln(f) . Exemplu.
Programul var
i : integex; r : real;
s i packad array [ 1 . . 1 0 ] of char; b s boolean;
begin
i:- 323;
r : 3 . 1 4 1 5 9 2 6 ; { r primete valoarea 3 . 1 4 1 5 9 3 } s : = 'specificat'; b : = true;
writelnCi-', i , ' ; ' , i : 4, ' ; ' , i : 2 , ' ; ' , l : - 4 ) ;
writelnCr-', r,
r:10, ';', 1:4, ';', r:4:6,
'.ii*.
and.
afieaz rezultatele:
i323; 323;323; 503
r- 3 . 1 4 1 5 9 3 E + 0 0 ; 3 . 1 4 1 5 9 3 E + 0 0 ; 3 . 1 4 1 5 9 3 E + 0 0 , - 3 . 1 4 1 5 9 3 ;
1=
3.142;3.14159300;3.14159E+00
s =specificat; specificat;specific
'<
b- TRUE;TRU;
TRUE
2.24.U. Fiierele standard input i output
Exist dou fiiere text cu numele input i o u t p u t , predeclarate astfel: var i np u t , o u t p u t:
te x t; i asociate implicit cu mediile standard de intrare i respectiv ieire ale sistemului de calcul.
n implementarea descris, ambele stnt asociate cu terminalul utilizatorului (TI:). Dat fiind
utilizarea lor frecvent, numele lor snt luate ca valori prin lips ale numelui de fiier text n operaiile
de intrare/ieire. Prin urmare, apelurile urmtoare snt respectiv echivalente:
read(al, . .., a)
cu
readln ( a i y . . . , a )
cu
49
readln
w r i te ( a i ,
aj
w r i te l n ( a l f . . . , a )
w r i te l n ;
r e a d ( i np u t , a x , . . . , a m )
readln( i np u t , a1#. . . , ' aj
cu
cu
cu
cu
readln( i np u t )
w r i te ( o u t p u t , a l f
a)
w r i te l n ( o u t p u t , a w . . . , a m )
w r i te l n ( o u t p u t ) .
I
Observaii.
1.
La deschiderea pentru citire a unui fiier text asociat cu un terminal
interactiv (de exemplu input asociat cu i i : ) , variabila asociat (n exemplu i np u t * )
primete valoarea spaiu, iar funcia e o l n primete valoarea fa l s e , fr s se
transmit efectiv vreun caracter.
2.
Conform standardului Pascal, variabilele input i output trebuie considerate variabile globale dac apar ca argumente n antetul de program. n implementarea
descris, antetul de program este ignorat i variabilele input, output snt predeclarate ca
variabile globale. Deci la nivelul global, programatorul nu poate declara o variabil sau o
procedur cu numele input sau output.
2.2.4.2. Asocierea fiierelor Pascal cu fiiere externe
Fiierele existente independent de programul Pascal se numesc fiiere externe.
Acestea snt recunoscute i gestionate de sistemul de operare. Exist posibilitatea de asociere a
fiierelor Pascal cu fiiere externe. Standardul Pascal prevede ca aceast asociere s se
realizeze prin specificarea fiierelor externe ca argumente n antetul de program. n
45
50
/ SEEK : permite apelul procedurii seek (vezi 22.4.3) n programul Pascal pentru
exploatarea unui fiier n acces direct
/WR: permite operaii de citire i scriere ntr-un fiier secvenial, indiferent de
modul de deschidere. Opiunea /WR poate fi utilizat la adugarea unei componente noi la
sfiritul unui fiier extern deja existent la nceputul execuiei programului.
/si m: n specific numrul de blocuri de 512 bytes ce se vor aloca fiierului creat
prin r e w r i te .
/VARm: fiierul va avea nregistrri de lungime variabil, cu lungimea maxim n.
i (opional) este o variabil de tip integer, n care procedurile reset, r ewr i te ntorc
dimensiunea fiierului n blocuri de 512 bytes, sau valoarea -l n cazul unei erori la
deschiderea fiierului.
Exemple:
1. Prin instruciunea
rewrite( fi s , ' F is . DAT ' )
se deschide pentru scriere fiierul Pascal fi s asociat cu fiierul extern Fis .DAT din catalogul
curent
2. Prin instruciunea
r e w r i te ( f ,'FILEl/SEEK',*.DAT/SI: 2' )
se deschide fiierul cu acces direct f asociat cu fiierul extern FILEI . DAT, cruia i se aloc
2 blocuri.
3. Prin instruciunea
r e w r i te ( f , , '/SEEK')
se deschide fiierul cu acces direct f.
4. Prin instruciunea
r e w r i te (output,' L P O : ' )
se asociaz fiierul standard output cu imprimanta LPO: a sistemului de calcul. Observaii.
1.
La deschiderea prin reset a unui fiier asociat cu un fiier extern pe disc
fr specificarea versiunii, sistemul de operare alege dintre toate fiierele cu numele specificat
n xe s et existente n catalog pe cel cu versiunea maxim.
2.
La deschiderea prin xewr i te a unui fiier asociat cu un fiier extern pe
disc tar specificarea versiunii, sistemul de operare creeaz un fiier cu versiunea cu 1 mai
mare dect versiunea maxim a fiierelor cu acelai nume existente n catalog n acel moment:
dac un astfel de fiier nu exist, numrul de versiune este 1.
51
nenta i.
s e e k ( f , i ) ; a : - f ; . . . { m o d i fi c a a }
seek(f,i); f.*:-a; put(f);
Jii
...
:i
52
- "T;
se introduce un nou tip PT care este o mulime de variabile de tipul T. PT se numete tip
de date pointer. O variabil de tipul PT declarat prin:
var p : PT;
ia ca valori variabile de tipul T. Variabila de tipul T desemnat de p la un anumit moment
al execuiei se noteaz cup*. Atribuirea unei variabile de tipul T lui p se face prin procedura
predefinit nev. Variabila p * obinut prin instruciunea new ( p ) este distinct de toate
variabilele de tip T create anterior. Executarea repetat a instruciunii new ( p ) conduce la
crearea unui ir vL, . . . . . . . . v de
variabile de tipul T. Numai ultima variabil creat, v, este referit prin p *.
Procesul dinamic de creare de variabile de un anumit tip T presupune i existena
unui mecanism de distrugere a lor i de eliberare a spaiului de memorie ocupat Acest lucru
se realizeaz prin utilizarea procedurii predefinite dispoae.
' Dup executarea unei instruciuni dispose ( p ), variabila p * devine nedefinit De
asemenea, p nu este definit atunci cnd nu s-a executat nici o instruciune new ( p ) . Dac
dorim ca p s nu indice nici o variabil, atunci i asignni valoarea constantei predefinite nil.
Dac y este o variabil de tipul T, p poate lua ca valoare aceast variabil printr-o
instruciune de atribuire p: ref (v ) .
Exemplu: var
p
: * i n te ge r ; x , y :
integer; begin
p : = nil; { p * nu e x i st a i n a c e st moment, dar p a r e valoarea n i l !
new(p); {a fost creata o variabila p* de tip intreg} p * := 0 ;
writeln(p*); { scrie numrul 0 }
x :~ 1;
y :- 2 ;
p : - ref( x ) ;
writeln(p'); { scrie numrul 1 } p := e f (y ) ;
53
end.
Alte aplicaii ale tipului de date pointer sint prezentate n legtur cu tipurile de date
recursive n paragraful urmtor.
2A.
54
<element>
< l i st a >
7
poate fi obinut prin urmtorul program:
type legtura - " l i st a ; l i st a
= record
element : 0. . 9 ;
s u b l i st a : legtura
and;
var.p, g , r t legtura; begin
and.
new (p);
q : = p; q * . element: = 1;
r : = q ; n e w ( q ) ; r * . s u b l i st a : - q ; q * . e l e m e n t: = 5 ; r : = q ; n e w ( q ) ;
r A . s u b l i st a : = q ; q * . e l e m e n t: - 7 ; q * . s u b l i st a : = nil;
/ \
1
/ \
definii prin
<arbore> i : = (<nod> , <arbore>, < a r b o r e > ) | <nod> | a <nod> : : =
0 | l | 2 | 3 | 4 | 5 | 6 r 7 | 8 | 9 .
ies--,
55
end
and;
var p , q , st , d r : legtura; begin
new ( p ) ;
q : - p;
q * . fe l : - complex; q * . n o d : = 2 ; new( st ) ; new( d r ) ; q*.a_sting:- st;
q * . a _ d r e pt: - d r ; q : = st;
q ' . fe l : - s i mp l u ; q * .nod_terminai: = 1; q : = d r ;
q * . fe l : complex; q * . n o d : = 3 ; new(st ) ; new(dr) ; q * . a _ st i n g : - st;
q * . a _ d r e pt: = d r ; q s = st;
q * . fe l : - s i mp l u ; q A .nod_terminai: - 7 ; q t - d r ;
q * . fe l : = complex; q ' . n o d : - 4 ; n e w ( st ) ; dr:
nil; q * . a _ st i n g : - st; q * . a _ d r e pt: = d r ; q : - St;
q * . fe l : - s i mp l u ; q * . n o d _ te r m i n a i : - 5;
ud.
Alte ilustrri ale tipurilor de date recursive se gsesc n exemplul 4 din paragraful 3.3
i n exemplele 5, 6, 7 din paragraful 4.5.4.
2.5. Expresii
n timpul execuiei unui program pe calculator, instruciunile sale prelucreaz
elemente ale tipurilor de date predefinite (integer, r e a l , etc), sau ale celor definite de
programator (array, racord etc.). Aceste elemente snt referite prin intermediul variabilelor i
constantelor i asupra lor snt aplicate anumite operaii. Variabilele snt identificatori ce apar
ntr-o declaraie var sau snt referite prin intermediul unei alte variabile de tipul pointer (vezi
paragraful 2.3 pentru detalii). Constantele snt numere, iruri de caractere (vezi 1.2),
constante structurate (vezi anexa 3, diagrama 3.9), constante predefmite ( m a x i n t , nil,
t r u e , fa l s e ) sau identificatori declarai prin const. Numele operaiilor, paritatea i sensul
lor pot fi de asemenea predefinite ca n cazul , -, div, mod pentru tipul integer etc, sau
definite de programator, ca n cazul numelor proieciilor canonice ale tipurilor record i ale
operaiilor introduse prin funcii i proceduri (vezi capitolul 4).
Se poate deci considera c execuia unui program se desfoar n cadrul unui
model logic de signatur dat, al crui domeniu D este format de tipurile de date. Signatura
acestui model cuprinde mulimea simbolurilor operaiilor predefinite (+, - , succ etc) sau
definite de programator (proiecii canonice, identificatori de funcii i proceduri etc.), mulimea
simbolurUor predicat predefinite ( < , > , >-, in etc.) sau definite de programator i mulimea
simbolurilor constant (numere, iruri de caractere, identificatori de constante predefmite
precum m a x i n t , nil, false, t r u e i identificatori definii prin const). Interpretarea acestor
simboluri este fie predefinit, fie stabilit de programator.
Se pune deci n mod natural problema modului n care aceste elemente pot fi
agregate n limbajul Pascal pentru a obine expresii. Sintaxa acestor expresii este descris n
anexa 3, diagramele 3.24-3.25. Se poate observa c cele mai simple expresii snt constantele
fr semn i variabilele. Astfel, numrul l. 2E -10, caracterul ' A ' , constantele predefinite
m a x i n t , nil, t r u e , fa l s e , constantele structurate M2RA (LINIE (I.O, 2.0),
LINIE (3.0, 4. o) ) , variabilele x, Y, v * snt expresii n limbajul Pascal. Expresiile de la
urmtorul nivel de complexitate se numesc factori (anexa 3, diagrama 3.28) i se obin prin
aplicarea opional a simbolurilor funcie, a simbolului predicat no t i a parantezelor ( , ) sau
[, 1. Astfel X, s i n (XI), a r c t a n ( V ) , zound(2.8), not fa l s e , (2),
[ a , b , c ] (desemneaz mulimea cu elementele a, b i c), [ 1 . . 5 ] (desemneaz intervalul
de numere ntregi n, 1 <- n <= 5) snt factori.
56
operaia
1
2
3
<
not
* / div mod and
+ - or
<=
>
>
in
/
<termen>
I
<factor>
I
<variabil>
I
<expresie_simpl>
I
\
<operator_aditiv>
<termen>
I
/
1
\
+
<factor> <operator_multiplicativ> <factor>
I
I
I
<variabil>
*
<variabil>
Din plasarea celor doi operatori n acest arbore (+ mai aproape de rdcin dect *)
rezult c operaia * se execut naintea operaiei +.
Secvenele de operaii care au aceeai prioritate snt evaluate de la sting la dreapta.
Expresiile dintre parantezele ( , ) sau [ , ] snt evaluate independent de operaiile care le preced
sau care le urmeaz. Se observ c operaiile not, and i or au aceeai ordine a prioritilor
ca n algebra booleana;
Trebuie remarcat c operaiile relaionale <, <-, etc. snt definite i pentru operanzi de
tipul predefinit boolean, deoarece false < true. Prin urmare, operaia < - are sensul de
implicaie logic, iar = are sensul de echivalen logic. Aceast ncrcare cu sensuri
suplimentare a operatorilor relaionali are ca efect o scriere mai complicat a expresiilor logice
n limbajul Pascal dect n matematic sau n alte limbaje de programare (spre exemplu, n
AlgoloO exist simbolurile predicat implicaie logic i echivalen logic). Astfel, n cazul
declaraiei
var x , y, z : r e a l ;
57
expresia
(x <- y ) and ( y <" z ) <= ( x <- z )
este evaluat totdeauna a valoarea true i exprim proprietatea de tranzitivitate a relaiei <-.
Omiterea parantezelor conduce la expresia
x <= y and y <= z <= x <- z
care este incorect semantic, deoarece se evalueaz mai nti operaia y and y care nu are
sens pe tipul r e a l . Mai mult, dac x , y i z Snt de tipul integer, ultima expresie este corect
semantic dar evaluarea ei se face ncepnd cu operaia and (vezi paragraful 2.1.1).
2.6. Exerciii
1.
2.
Dac un numr pozitiv x se reprezint n virgul mobil prin x o . i x x . . . x n * 2" (vezi paragraful 2.1.1 tipul r e a l ) , atunci s se reprezinte
numrul ntreg i o ... 01 (scris n baza 2, avnd n zerouri).
2.6.
Exerciii
55
3.
4.
Fie declaraiile:
type T = i n te ge r ; var
A , B : integer; C
: integer; D
: T;
E
: T;
Fie declaraiile
type R - record I , J : integer end;
A - array [ 1 . . 2 ] of integer; var
R; AR : A;
RE :
58
Fie declaraiile
type numr - ( u n u , d o i ) ;
complex = record
r e , im : r e a l end;
v a r i a n t a = record
A : integer;
case alege : numr of
unu : ( B , C : c o mp l e x ) ;
doi : (D : c o mp l e x )
end;
Care dintre urmtoarele constante structurate snt conforme cu definiiile de mai sus:
a) v a r i a n t a (1,unu,complex(1.1 , 0.IEI),complex(- l . 0 , 0 . 5 ) ) ;
b)
complex ( - 1 . 0 , 2.3E5);
c) v a r i a n t a (2, d o i , (1.1, 1 . 1 ) )
7.
8.
5, 6} ,
Re declaraiile
type p i = " i n te ge r ; var
integer; vp : p i;
a)
vp este referin la o variabil de tip integer egal cu 1;
b)
i este egal cu 1;
c) vp este referin la i .
9.
10.
Exprimai
numere reale.
limbajul
Pascal
expresia
algebric
xy,
unde
snt
Sintaxa instruciunilor limbajului Pascal este descris n anexa 2, definiiile 2.22 2.23 i n anexa 3, diagramele 3.22 - 3.23.
O instruciune este alctuit dintr-o etichet opional prin intermediul creia poate
fi referit din alte instruciuni, urmat de instruciunea propriu-zis, prin care este descris
aciunea realizat n momentul execuiei sale. Se face distincie ntre instruciunile simple
(instruciunea de atribuire, apelul de procedur, instruciunea de transfer necondiionat i
instruciunea de efect nul) i instruciunile structurate (instruciunea compus, instruciunile
iterative, instruciunile condiionale i instruciunea with).
ip
'
60
3. Instruciuni
complex( 1 . 0 , 1 . 0 ),
complex( 0 . 1 , 1 . 0 ) ) ;
var k : integer; v l 2 : l f . 2;
v l 3 : 1 . . 3 ; VS6 :
5 . . 6 ; al2 : T12; a l 3
: T13; v_logic :
boolean; r
: real;
v_tab : tab; z :
complex;
n acest caz instruciunile
k : = v l 2 ; vl3
:= al2; al2
:= vl2
snt corecte;
instruciunea v l 3 : = k este corect numai pentru l < - k < = 3; instruciunea vi2
vl3
este corect dac l < vl3 <= 2; instruciunile
v 5 6 v l 2 ; vl2
:=
v56;
i
:= z
snt incorecte;
instruciunea a l 3 : - loophole ( T 1 3 , a ) este incorect, deoarece rezultatul evalurii este 0
i deci nu este din T13 (detalii privind funcia loophole snt in anexa 4);
instruciunea a 13 : = loophole (T13, b ) este corect i hii a 13 i se atribuie
valoarea 1;
instruciunile
v_logic : = ( a l 2 < = v l 2 ) = ( a l 2 < v l 2 ) or ( a l 2 = v l 2 ) ; v_logic : = a p r e d ( b ) ; v_logic : = b = s u c c ( a ) ;
v_ l o g i c : = a - p r e d ( c ) snt toate corecte; primele trei atribuie variabilei
v_ l o g i c valoarea t r u e iar ultima valoarea fa l s e ;
instruciunea r : = s i n ( r ) + c o s ( k ) este corect;
instruciunea k : = r este incorect, dar instruciunile
r :k : = k round(r ) ;
trunc(r)
snt corecte;
instruciunile
z .re
z. im
z
v tab
0;
i;
i;
c tab
snt corecte.
61
p ( a , b , u, v)
p (3 , 5 , u, v)
62
3. Instruciuni
labei 1 0 0 1 , 1 0 0 2 , 1 0 0 3 ;
conat nmax-9; type
tip=integer;
index=0. . n m a x ;
fi i =array [ l . . n m a x ] of index; i n fo r m =array
[ l . . n m a x ] of t i p ; var st . d r : fi i ; i n fo :
i n fo r m ; r a d : index; procedura inordine( p :
i n d e x ) ; labei 1 , 2 , 3 ; const s m a x - 5 ;
var st i v a : array [ L . s m a x ] of index;
k: 0..smax;
begin
k:=0;
begin
goto 1 0 0 2 ; { c o n d i i a 2 } 1 0 0 1 : w r i te l n ( ' D e p a s i r e
i n t r e r u pt * ) ;
goto
1003;
{condiia
2}
1002:
{iniializare arbore}
st: - fi i ( 2 , 3 , 0 , 5 , 0 , 7 , 8 , 0 , 0 ) ;
d r : - fi i ( 6 , 4 , 0 , 0 , 0 , 0 , 9 , 0 , 0 ) ;
i n fo : - i n fo r m ( 7 , 3 , 1 , 6 , 5 , 1 1 , 9 , 8 , 1 0 ) ;
rad:-l;
{vizitare in inordine} inordine(rad) ;
{ te r m i n a r e p r o g r a m } 1 0 0 3 : e n d .
E xe mp l u . Secvenele de program urmtoare snt incorecte:
"
st i v a ;
program
a) goto 1 ; ...begin 1: a : = b ; . . . e n d
b) i f a = b then begin x : = a ; goto 2 end else 2 :
c) procedure p;
63
y:-b
: = i + 1 ; ; ; goto 10
compus
64
3. Instruciuni
a : = ve c to r (1, 2, 3 , 4 , 5 ) ;
b : = ( e r e , c . i m , 1, 0 , 2)
end.
'
|
|
Instruciunea for este indicat n situaiile n care numrul de execuii repetate este
cunoscut. n caz contrar se pot folosi instruciunile iterative while sau zepeat.
65
i>0
s , t : r e a l ; k : i n te ge r ;
x , x 2 , e p s i l o n : r e a l ; begin t : = x ;
k : = 1 ; s : = t;
epsilon
0 . 0 0 0 1 ; x2 : = sqr ( x ) ; falle a b s ( t ) > e p s i l o n * abs(s)
do begin
k := k + 2; .
t : = - t * x 2 / ( k * ( k- D ) ; s
s+t
end
end.
= f t v j . i ) ; 12:1
66
3. Instruciuni
w r i te l n C Frecventa l u i
end.
Exemplu. Programul urmtor calculeaz cu aproximaie valoarea c o s ( x )
[W721:
{ c a l c u l e a z cos( x ) = l - x 2/2! + x 4 / 4 ! - . . . }
program c o s ; const e p s = l e -6; var
x,sx,s,t : real;
i,k
i i n te ge r ;
begin
w r i te l n C F u r n i z a i v a l o a r e a l u i x ' ) ; r e a d ( x ) ; t: - l ; k :=0; s : = l ;
s x : = s q r ( x ) ; while a b s { t ) > eps * a b s ( s ) do begin
k : = k +2; t : - - t * s x / ( k * ( k- 1 ) ) ;
s:=s+t
end;
writeln('cos C , x , ' ) = ' , s )
end.
O alt ilustrare a utilizrii instruciunii while apare n exemplul 1 din paragraful
3.3, la prelucrarea informaiilor dintr-un fiier.
; In
until B
Instruciunile aflate intre repeat i until snt executate pn cnd expresia booleana B
care controleaz repetiia devine adevrat. Execuia se poate ns ncheia i printr-un transfer
necondiionat Aceast instruciune este echivalent cu secvena de instruciuni
Ii. . ; IB
while not B do begin Ij . . .
; In and
<.
67
write(v,a) until
a- 0 ; reset( v );
suma:= 0;
while not eof(v) do begin
suma : = suma + y ";
get(v)
end;
writeln('Suma=', suma)
end.
Exemplu. Programul urmtor citete doi vectori cu componente ntregi i
scrie pe ecran TRUE sau FALSE dup cum vectorii snt identici.sau nu:
const n='i;
type vector = airay | L . . n ] of integer; var a , b :
vector;
i: integer; begin
for i : - J to n do read(a[ i ] ) ; for i : = l
to n do read ( b |'i ] ) ;
repeat i : = L * i until ( i = n ) or ( a i i ] o b i i ) ; write(a[i]=bfi l) ;
end.
begin
end.
a , b, c
: char;
integer; t
repeat
68
3. Instruciuni
:-
to [ do I
fo r v : - i downto f do l.
: X; T
_
69
v : - i ;
while v <' f do b e g i n I ; v : = s.ucc(v) end i a r i n st r u c i u n e a
fo r v : - i downto f do T
cu
. .
v := i;
while v > = f do begin I ;
v : = pied(v)
end
a n .,
- f(an), n> -0 .
1 to n do v
'
: = f (v)
,a* (nKI.)
programul urmtor
v a r i, v : integer; begin
v
1 ;
fo r i :
1 to V do -v : = v *. i..
end.
v:
t y p e EH -
(A_l,
A_7.,
A_~\, A_4) ;
P( A_ i ) ;
P( h_ Z ) ;
P(A_l) .
= 1; p = 3; n - 2 ;
70
3. Instruciuni
1. .m;
: Integer;
A
B
:
:
: n;
1 . :
J . .p!
J . .n]
l.-.n]
si B}
mat
rit
i: l to m do
begin for k : - 1 to p do
begin r e a d ( s ) ; w r i t o ( s ) ; A | i , k } : - S end;
wr i. teln
end;
{ a f o s t c i t i t A } writeln;
for k : -1 to p do
begin for j : --1 to n do
begin
read(s);
write(s);
B[k,;j|
end;
v.
writeln
end;
{ a tost, citit Bl w r i t e l n ;
ise calculeaza C = A * B) wri teln('A *
B - ' ) ; for i : - 1 to m do begin
for j : = . l to n do begin s := o;
for k : - 1 to p do
s
s * A]i,k] * B[k,j1;
C fi . j J
s; write(s)
end;
writeln
end;
w r i teln
:=
3.2.3.1. Instruciunea if
Instruciunea i f are forma (vezi anexa 2, definiia 2.23.h): i f B then I
sau
if 15 then I else J
E xe c u i a instruciunii i f ncepe p r i n evaluarea condi;iei B. Dac
r e z u l t a t u l e v a l u r i i este t r u c , atunci se execut instruciunea 1 . Dac
71
1.Dac
i f B_l
then i f B_2 then
else ] _ 2
I_l
(else face parte din primul i f sau din cel de-al doilea?) este rezolvat p r i n
interpretarea construciei c a fiind echivalent cu
i f 13__3
then begin
i f B_2 then I _ l
else I._2 end
> kM
72
3. Instruciuni
unde found este o variabil booleana Evident, acelai efect se obine prin execuia
instruciunii
found
nenul.
law
a=b
Exemplu. Prin programul urmtor se calculeaz xy, unde y este numr natural
var e , y : 0 . . 1 0 0 ;
u , x , z : r e a l ; begin
readln(x); readln(y);
z := 1 ; u
x; e != y;
while e > 0 do begin
while not o d d ( e ) do begin e : - e
div 2 ; u :- sqr ( u ) ;
end;
e :- e, - 1; z := z * u
and;
w r i te l n { x , ' l a puterea ' , y, i z - x * *
y}
z)
end.
Observm c o variant mai simpl dar mai puin eficient se poate obine omind
instruciunea while interioar, rezultatul z este astfel obinut prin y multiplicri ale lui x.
Alte ilustrri ale utilizrii instruciunii if pot fi gsite n exemplul 2 din paragraful 3.3.
div
and
end.
3.3.
wr iteln(
a,
wr iteln(
a,
wr iteln(
73
Observaii
1.Constantele ce prefixeaz componentele unei instruciuni casa nu snt etichete n
sensul din paragraful 1.2 i nu pot prin urmare s fie referite printr-o instruciune goto i nici
nu pot s apar ntr-o declaraie labei.
2.Ordinea acestor constante este arbitrar, dar fiecare nu poate apare dect o
singur dat ca prefix de componente.
3.Dintr-o instruciune component nu se poate face transfer la o alt component.
74
3. Instruciuni
var n : n u m r ;
33. Exemple
75
if
33.
77
Exemple
while not eof(fa) do
begin
if e o l n ( fa ) then
begin
r e a d l n ( fa ) ; w r i te l n ( f b )
end Is*
begin
read( fa , c ) ;
if c < > ' a ' then w r i te ( f b , c ) else if eof( fa ) then w r i te ( f b , c )
else if e o l n ( fa ) then begin
76
3. Instruciuni
w r i te ( f b , c ) ;
r e a d l n ( fa ) ;
w r i te l n ( f b )
end.
end
end
end
IB*
begin
read( fa , c ) ;
if c - ' a ' then w r i te ( f b ,
else
begin
w r i te ( f b , ' a ' ) ;
w r i te ( f b , c )
end
end
'b')
*-
77
end.
end
ud;
otherwise
end;
w r i te ( ' c o d o p e r a i e ( e , l , a , u ) : ' ) ; l e a d l n ( c o d o p e r ) end
78
3. Instruciuni
q * . u r m to r u l : - p ;
{ i n a c e st moment p i n d i c a p r i m u l nod din l i st a s i q u l t i m u l ;
s e determina p r i m u l nod de e l i m i n a t; p va indica nodul de
e l i m i n a t s i q nodul precedent d i n l i st a }
for i : = 1 to m - 1 do
begin
q : = p ; p': = p * . urma to r u l
and;
{incepe eliminarea}
w r i te l n ( ' ordinea de e l i m i n a r e e ste : ' )
for i : = 1 to n -1 do
begin
w r i te l n ( p * . n u m r ) ; { e l im i n a nodul
din l i st a } q * . u r m to r u l : =
p * . u r m to r u l ; ; d is p o s e ( p ) ;
{determina u r m to r u l nod de e l i m i n a t }
p:- q;
fox j : = 1 to k do begin
q : = p ; p : = p * . u r m to r u l
and
and;
w r i te l n ( p * . n u m r ) ; d i s p o s e ( p )
and.
3.4. Exerciii
1.
4.
Fie suma s _ i o o = l/l - 1/2 + 1/3 - . . . -1/100. Scriei cte un program Pascal
care s calculeze s _ i o o a) evalund de la sting la dreapta
81
3.4.
Exerciii
5.
79
A *,'
i
ti'-'' l
end.
6.
Fie declaraiile
var a : i n te ge r ; b :
record
a , b : integer end;
a) Suit corecte instruciunile
b.a := a ;
b.b : = b.a
b) Dac se execut instruciunile
a : = 0 ; with
b do
valoare are a ?
a := 1; ce
8.
Fi T un tip de date pe care s-a definit o relaie de ordine total <,. Se
numete sortare (n ordine cresctoare) a fiierelor din T* o aplicaie S : T*---------------->T*,
definit astfel: oricare ar fi u = f l i 4 . f n e T, s ( u ) - f p l . . . f p n , unde (p_l, . . . ,p_n) este o
permutare a lui ( i , . . . , n ) , astfel nct f p t f p j pentru 1 i <, j <, n. Practic, se poate
construi fiierul sortat s ( u ) , eventual n aceeai arie de memorie ca u, sau numai
permutarea (p_i, . . . , p_n).
80
3. Instruciuni
Fie mei un natural fixat, i un tip de date cu ordinea total i T - i". Pe T definim
ordinea lexicografic astfel: kt. . . k lt.. .1 * k j - 1 pentru 1 i m sau exist p ,
l i p i m , astfel nct lq = l t pentru l 5 i S p - l i kp < lp. S se scrie un program de
sortare n ordine lexicografic a unui fiier cu componente de tipul T, pentru I - integer.
9.
Re definiiile Pascal:
type candidat = zecozd
10.
Fie T un tip de date pe care s-a definit o relaie de ordine total <, i F = im s, unde
s este aplicaia de sortare din exerciiul 8 (F este mulimea fiierelor sortate din T*). Se
numete interclasare o aplicaie I : F x F r^-> F definit prin i ( u , v ) - s ( u v ). Scriei un
program de interclasare a dou fiiere cu componente de tip integer.
11.
unde sp este caracterul spaiu, eol este caracterul sfrit de linie, EOF este sfrirul de fiier,
iar < c if x a > este o cifr zecimal S se scrie un program care s transfere constantele ntregi
mai mari ca -100 din fiierul fi ntr-un fiier text f o. Compararea va fi fcut n binar, iar
conversiile vor ii efectuate prin program. Fiierul fo va pstra structura de linii a fiierului fi .
12.
Scriei un program care s adauge componente la sfrirul unui fiier
extern deja existent, utilizind
13.
Fie programul:
var
l i n i e : packed axxay [ 1 . . 7 2 ] of ch a r ; contor: integer;
begin
c o n to r : - 0 ; bila not
eoln do begin
81
c o n to r : - contor + 1 ;
read( l i n i e [ c o n to r ] )
and;
readln;
w r i te l n ( c o n to r )
and.
Care este valoarea variabilei contor afiat pe terminal ca urmare a execuiei acestui
program cu datele de intrare urmtoare:
a) o linie vid, constnd din RETURN;
b) spaiu urmat de RETURN;
c) sfrit de fiier (CTRL/Z)?
(n legtur cu observaia 1 de la paragraful 2.2.4.1.3).
14.
S se scrie un program pentru rezolvarea problema lui Josephus (vezi
exemplul 4 din paragraful 3.3), folosind o list circular cu legturi duble, definit
prin:
type l e g t u r a - * n o d ;
nod- record
inapoi: l e g t u r a ; { s p r e nodul precedent] numr:
integer;
n a i n te : l e g t u r a { s p r e nodul u r m to r ]
and;
4.2. Funcii
Pascal.
<functie>
i> <antet_functie> > ; ,--------> <corp> - - - - -,- -,> ; - - ->
!
I> <diiectiv> '
|
> function -> <identificator> -> , -> <corp> 1
4.2. Funcii
<ancet_functie>
83
i--------- ; <-----------1
L
) -,
I_____
1
--->
. .-: .
<corp>
________________:---------------:____________________l
:.
{f}
labei
const
type var
function / piocedure
Aceste cerine snt mai puin stricte n Pascal Oregon vezi 4.6.1. -begin . . .
f : = e ; . . . e n d ; : instruciune compus specificnd prelucrrile de date ce se produc
prin execuia funciei; numele f al funciei (fr parametri) apare cel puin o dat n
partea sting a unei instruciuni de atribuire care se execut: f: '- e. Rezultatul
ntors de funcie, de tipul t, este ultima valoare atribuit lui f.
. - fi
f(a1( . .. ,a)
f: numele funciei;
( a t , . . . , a n ) : lista (opional) de parametri actuali reprezentnd expresii ale cror valori sau
adrese snt furnizate funciei.
Apelul de funcie este un operand ntr-o expresie; el se insereaz n locul n care este
dorit valoarea produs de funcie. Cnd expresia este evaluat, funcia este activat, iar
valoarea operandului devine valoarea ntoars de funcie.
4.2.3. Exemple
84
Vom scrie pentru nceput un program extrem de simplu, pentru calculul ariei unui
triunghi ABC cunoscnd lungimile laturilor:
program P I ;
var a , b , c , p , s : r e a l ; bag in
- 3
; =
5;
6;
= ( a + b + c ) / 2;
= sqrt (p * (p - a) * (p - b) * (p - c) ) ;
{Pl}
ab
cPs
w r i te l n ( s ) and;
{arial
* ( p - c ) ) end;
4.2. Funcii
85
: real;
86
* (p - z)) end;{aria}
b)A);
43. Proceduri
Conceptul de procedur extinde pe cel de instruciune. Formele sintactice ale
declaraiei i apelului snt similare celor pentru funcii.
4.2. Funcii
87
<procedura>
i--------> <antet_piocedura> ; |------> <corp> -------1---,> ; ----->
|
l> <directiva> 1
|
> procedure > <identifi cator> > ; > <corp> 1
<antet^procedura>
i-------------; <-----------^
begin
end; { p }
n antetul procedurii apar:
- p: numele procedurii;
- (x1(- . . ; x ) : list (opional) de parametri formali, n corpul
cu
- p: numele procedurii;
- ( a , . . . , a ) : lista (opional) de parametri actuali.
4.3.3. Exemple
Textul de program din 4.2.3 pentru calculul ariei unui triunghi poate fi rescris ca o
procedur Pascal astfel:
pxoceduxe a r i a ( a , b , c : r e a l ; var s : r e a l ) ; var p : r e a l ; begin
p := (a + b + c) / 2 ;
s : = s q r t ( p * ( p - a ) * ( p - b ) * ( p - c ) ) end; { a r i a }
.
Anteml procedurii
88
procedure a r i a ( a , b , c : r e a l ; var s : r e a l ) ;
conine numele ei i declaraiile parametrilor formali a , b , c i s. Restul textului este corpul
procedurii; el conine o declaraie i o instruciune compus. Observm c, spre deosebire de
funcii, n antet nu mai apare o specificaie a tipului rezultatului; de asemenea, numele
procedurii nu apare n partea sting a unei instruciuni de atribuire din corpul ei. Notm n
sfrit forma special n care este declarat parametrul formal s n antet:
var s : r e a l ;
Acesta este acum parametru variabil i va fi folosit pentru ntoarcerea unui rezultat
din procedur; a , b , c snt parametri valoare i servesc, ca i la funcii, pentru acceptarea de
valori transmise procedurii.
Programul are acum forma:
program P4;
var s i : r e a l ;
procedure a r i a ( a , b , c : r e a l ; var s : r e a l ) ; var p : r e a l ;
begin
p
(a + b + c) / 2;
s : = s q r t ( p * ( p - a ) * ( p - b ) * ( p - c ) ) end;
{aria}
begin
a r i a ( 3 , 4 , 6 , s i ) ; w r i te l n
( s i ) end; {P4}
Execuia instruciunii a r i a ( 3 , 4 , 6 , si) determin transmiterea valorilor
primilor trei parametri actuali drept valori ale parametrilor'formali a , b, c i a locaiei
parametrului actual si drept locaia parametrului formal s. Observm c sl este o variabil.
Ea corespunde parametrului formal s, declarat cu vax. Invocarea procedurii determin efecte
echivalente urmtoarei instruciuni compuse:
begin
end;
p : = (3 + 4 + 6 ) / 2 ;
sl : = sqrt(p * (p - 3 ) *
(p - 4 )
(p - 6 ) )
mai puin stricte (vezi 4.6.1.2). De asemenea, antetul programului este opional.
4.2. Funcii
89
Parametrii formali specificai n lista (xv, . . . ,x) denot entiti (de regul fiiere) de
comunicare a programului cu mediul su. Aceste entiti (n afara fiierelor standard input
i output) trebuie declarate n program.
Specificarea identificatorilor input sau output ca parametri formali ai
programului are ca efect declararea implicit a acestora ca fiiere text i executarea implicit a
apelurilor de procedur reset (input), respectiv rewri te (output) la nceputul fiecrei
activri a programului (vezi 2.2.4.1.2).
Corpul programului este urmat de ' . ' i nu de ' ; " ca n cazul funciilor i
procedurilor.
Exemple:
program copie ( f , g ) ;
var f , g : fi l e of real; begin reset(f);
rewrite(g); while not e o f ( f ) do
4.4.
Programe
begin g "
ond.
end
{copie}
93
: =f * ;
p u t ( g ); get ( f )
Parametrii formali f i g din antet snt declarai n corpul programului drept fiiere de
numere reale. Instruciunea compus care urmeaz descrie partea de aciune a programului:
copierea fiierului f n fiierul g.
Programul c o p i ete x t care urmeaz folosete parametrii formali i np u t i o u t p u t
predefinii ca fiiere standard de intrare / ieire. Ei nu vor fi declarai n program. Partea de
instruciuni determin la execuie copierea, linie cu linie, a fiierului de intrare n fiierul de ieire,
pstrnd structura liniilor.
program c o p i ete x t ( i np u t , o u t p u t ) ; var
ch : ch a r ; begin
while not eof do begin
while not e o l n do
begin
r e a d ( ch ) ; w r i te ( ch )
end;
w r i te l n ; i e a d l n
end
end. { c o p i ete x t }
90
- dac P conine declaraiile lui Q i R, n aceast ordine, reprezentm structura static a lui p
prin arborele
P
Exemplu. Fie programul:
program P;
procedura Q; begin
...
end; { Q }
procedure R;
function S ; begin
end;
{S}
begin
end;
end.
{P
{R
} begin
/
Q
\
R
4.2. Funcii
91
info: char;
sting: " arbore; {eroare, referin nainte
ca arbore s devin vizibil}
dreapta:* arbore; end;
{numai de aici arbore devine vizibil}
Domeniul de vizibilitate al unei declaraii d x nu este neaprat o poriune continu din
textul programului. Apariia ntr-un subprogram Q, din domeniul de vizibilitate al declaraiei d,, a
unei alte declaraii d'x (ce implic acelai identificator x) provoac acoperirea domeniului de
vizibilitate al declaraiei prin domeniul de vizibilitate al declaraiei d'x. Acoperirea se produce de la
nceputul declaraiei d x , n timp ce noul domeniu de vizibilitate ncepe de la terminarea declaraiei
d;.
Exemplu. Re programul urmtor:
program P ; const c = 1;
{ a i c i ncepe domeniul de v i z i b i l i t a te a l l u i d c } procedure q ; const
{ a i c i ncepe acoperirea l u i dc p r i n d j }
c=
.
c + l ; { e x p r e s i e i n c o r e c t a } { a i c i ncepe domeniul de v i z i b i l i t a te
a l u i d'c}
begin
end { q } ; b e g i n
. . . end.
E x p r e s i a c + l este incorect: referirea Ia c se face dup acoperirea declaraiei
din programul principal i nainte de a deveni vizibil declaraia din procedura q.
E xe mp l u . n programul
program P ; type t =
0 . . 1 0 ; procedure q ;
var t : t; { e r o a r e }
begin
end;
end.
declaraia din procedura q este eronat. Intenia a fost de a se declara o variabil iocal t,
de tipul global t (definit n programul principal). Referirea ia identificatorul t de dup ' : '
nu este ns n nici un domeniu de vizibilitate; cel din programul principal a fost acoperit
(la nceputul declaraiei var t: t;), iar cel din procedura q ncepe de abia la sfritul acestei
declaraii.
Deci n Pascal domeniul de vizibilitate ai unei declaraii se deterrnin static; el
depinde doar de poziia declaraiei n textul programului i se poate stabili la compilare
ca i n Algol, PL/1 i alte limbaje cu structur d e bloc; conceptul de bloc din aceste
92
limbaje (instruciune compus cu declaraii locale ei) difer ns de cel din Pascal (funcie
/ procedur cu eventuale declaraii locale i o instruciune compus). n alte limbaje de
programare (Lisp, Snobol, APL,...) domeniile de vizibilitate se stabilesc dinamic (la
execuie).
Exemplu. n programul
program P ; type i =
integer;
{1}
procedure Q; var
{2}
{2.1}
x: i;
i : real;
begin
end;
{3} begin
end
{4}.
mo
domeniul de vizibilitate al declaraiei i - integer este textul cuprins intre punctele marcate
{1} i {4} mai puin textul cuprins ntre punctele {2} i {3}. Domeniul de
vizibilitate al declaraiei i : real este cuprins ntre punctele {2.1} i {3}.
. Exemplu. Stabilirea domeniului de vizibilitate este important pentru corectitudinea
apelurilor de funcii / proceduri. n programul program p;
procedura q;
procedura r;
procedura u;
begin { u }
u ; r ; q ; and; { u }
begin { r }
U ; r ; q ; end;
{ r } proceduie s;
procedura t ; begin
t ; s ; q ; r ; end;
{ t } begin { s }
s ; q ; r ; t ; and; { s }
begin { q }
and;
begin
end.
q;r;s;
{q}
{p}
{p}
cu arborele de structur static
P
''>
rot
XQ
q
r
i l
snt peimise numai apelurile specificate n program.
O consecin a regulii de stabilire a domeniului de vizibilitate este faptul c orice
referire r, n P trebuie precedat de o declaraie d, n P sau ntr-un program / funcie /
4.2. Funcii
93
procedur care include P. Singura excepie o constituie referirea tipului d baz T din definiia
unui tip pointer, care poate precede declaraia lui T; totui, declaraia lui T trebuie s apar
n aceeai parte de declaraii de tip cu tipul pointer.
Exemplu. Declaraiile urmtoare:
type
ptr = * nod;
nod = xecoxd
Sting: ptr; informaie:
real; drept: ptr; end; tf
snt corecte, dei declaraia tipului nod apare dup referirea sa n declaraia tipului pointer
ptr.
4.43.2. Domenii de vizibilitate pentru alte declaraii
Ca i identificatorii, etichetele pot fi definite i referite n program. Domeniul de
vizibilitate al unei definiii de etichet se stabilete similar cu cel al declaraiilor identificatorilor.
Specificaia unui identificator constant drept component a unui tip enumerare are
acelai domeniu de vizibilitate cu declaraia acestui tip.
Domeniul de vizibilitate pentru o specificaie de identificator selector de cmp
(proiecie canonic) ntr-o nregistrare este textul definiiei tipului nregistrare n care apare.
Acest domeniu poate fi extins la textul eventualei instruciuni with n care se specific numele
nregistrrii. Un astfel de identificator poate fi referit i n afara domeniului de vizibilitate, dar
nu direct ci calificat de numele nregistrrii. O astfel de referire poate fi fcut n tot domeniul
de vizibilitate al declaraiei nregistrrii.
Exemplu: n programul
program p ;
typo rec = record
(1}
{2}
{2.1}
x : real;
y : record
end; { 3 }
end;
{4}
var x : boolean;
{5}
v : rec;
begin
x : = true;
v. x : = 1.2;
v. y. x : = 1 2 ;
with v do
{6}
begin
x:= 12.5;
y. t : = 7 ;
end;
{7}
end.
{8}
- declaraia x:
x : integer;
t : integer;
94
ik3
4.2. Funcii
95
7.) ;
:
{
7 div 3) ;
i, j, k : real}
96
Observaii:
1. Aceast substituie a parametrilor formali valoare este cunoscut sub numele de
transmitere (referire, apel, chemare ...) prin valoare. Ea este folosit i de alte limbaje de
programare (ALGOL60, SIMULA, Ada...) [WaGo84].
2. Dac parametrii actuali sint de tipuri structurate i de dimensiuni mari, un
spaiu de memorie de aceeai mrime este irosit pentru parametrii formali, iar copierea
valorilor celor actuali n acest spaiu consum timp. Transferul prin parametrii variabili est
preferabil n astfel de cazuri, cu deosebire dac nu se fac atribuiri asupra parametrilw formali
(vezi 4.5.2.2 i 4.5.3).
3. Fiierele sau Variabilele structurate cu componente fiiere nu pot fi parametri
actuali valoare.
4.5.2.2. Parametri variabil
Parametrii variabil reprezint mijlocul principal de recuperare a rezultatelor din
procedura apelat.
Parametrul formal se declar n antet sub forma
vai n :
t;
4.2. Funcii
97
: integer);
z : = z + 1;
1;
11,1,1}
{0,0,0}
{1,0,1}
begin x : = x + 1; y : = y + writeln ( x , y, z )
end; { Q } begin x : = 0 ; y : - 0; z : - 0 ;
writeln ( x , y, z ) ;
0(x, y);
writejn (x, y, z) ; end. {P}
Relativ la procedura 0, identificatorul x este global, y este parametru valoare, iar z
parametru variabil.
n program x , y , z primesc valorile o care snt scrise: 0, 0 , 0 .
Prin execuia apelului Q (x, y), variabilele desemnate prin identificatorii x (global),
y (din procedur i din program) i z (din procedur) primesc valorile l care snt scrise: l , l ,
l. La revenirea n program variabila cu numele x (global) pstreaz valoarea l dobndit n
procedur; variabila y din procedur dispare, valoarea sa nefiind pstrat n vreun fel, deci y
din program continu s aib valoarea o pe care o dobndise aici; z din program dispare dar
valoarea 1 atribuit lui n procedur se recupereaz ca valoare a lui z din program. Valorile
lui x , y, z din program snt scrise: 1, o, l. Valoarea lui y difer de cele ale lui x i z, dei
de flecare dat s-au specificat transformri similare asupra identificatorilor x, y, z. Chiar
valorile variabilelor x i z, dei egale, snt dobndite pe ci diferite.
4.5.2.3. Parametri formali funcie / procedur
O funcie / procedur poate fi desemnat drept parametru formal al altei funcii /
proceduri prin specificarea ei n lista L din antetul acesteia. O specificaie de funcie /
procedura ca parametru formal are forma antetului acelei funcii / proceduri incluznd
parametrii si formali i tipurile lor, iar pentru funcii i tipul rezultatului. De exemplu function
f( x , y : integei) : r e a l ;
i
procedure p ( z : r e a l ) ;
apar ca parametri formali in antetul procedurii cp
procedura q (function f ( x , y : integex) : r e a l ;
procedura p ( z r e a l ) ; vax n :
real);
Un apel al lui q ar putea fi
q ( u , r, a )
unde parametrul actual u este numele unei funcii
function u ( m , n : integer) : r e a l ; begin . . .
and; { u }
iar parametrul actual r este numele unei proceduri r cu antetul
procedura r ( b : r e a l ) ;
98
{sini}
procedurii
Runge
care
.
y : real) : real;
: real;
-tt- integer;
: ve c to r ) ;
progxan Ecdif;
{ n piogram se declar procedura Runge i f u n c i i l e g l i g2; se apeleaz
Runge de dou o r i pentru integrarea ecuaiilor difereniale y ' = g l ( x , y ) ,
respectiv y' - g2(x, y).1
4.2. Funcii
bagin x
99
x O ; y : - y O { i n i i a l i z r i ] for i : = 1 to
n do { n i te r a i i } bagin kl
h * f(x, y);
k2 h * f(x + h/2, y + kl/2); k3 h * f ( x + h/2, y + k2/2); k4 : -
h * f ( x + h, y + k 3 ) ;
type vector
procedure Runge
10;
...)
100
<dimensiuni>
- - - -.> identifi cator>..> identifi ca tor> : > <id_de_tip> ------->
4.5.2.5. Structura dinamic a programelor
n 4.4.2. am mtrodus structura static a programelor. Ea are n vedere textul surs*
al programului, punnd n eviden unitile de program componente i este unic pentru un
program dat. Toate consderaiile care au urmat au avut n vedere aceast structur static i
este remarcabil c principalele informaii necesare la compilare (domeniile de vizibilitate a
declaraiilor, legarea identificatorilor la declaraii^..) snt obinute prin explorarea acestei
structuri.
Folosirea funciilor /procedurilor face util luarea n considerare i a structurii
dinamice (la execuie) a programelor.
Structura dinamic este unic pentru o activare a programului (a prii sale de
instruciuni) n condiii iniiale date, dar poate s difere la schimbarea condiiilor iniiale. Ea
are n vedere succesiunea activrilor unitilor de program (funcii / proceduri) componente (a
prii lor de instruciuni) i poate fi reprezentai folosind graful apelurilor (pentru exemple vezi
4.5.4.2) sau modelul conturului al mi Dijksrra [WaGo84].
Fiecare activare a unei funcii / proceduri produce ipostaze proprii ale contextului asociat (vezi
4.4.3) obinute prin:
a) crearea de copii proprii ale entitilor locale (etichete, variabile, funcii, proceduri);
b) crearea de variabile proprii pentru identificatorii folosii ca parametri formali
valoare;
c) stabilirea de legturi (referine) de la identificatorii folosii ca parametri formali
variabil / funcie / procedur la parametrii actuali corespunztori.
Copii multiple de entiti cu declaraii identice pot s existe n acelai timp, n
contexte proprii ale activrilor recursive (vezi 4.5.4).
Dac Q este declarat n p, atunci contextul propriu unei activri a lui Q este
scufundat n contextul asociat (declaraiei) lui p, nu n contextul propriu activrii unitii de
program care a provocat activarea lui Q.
O referire r x a identificatorului x ntr-o activare a unitii de program P
are n vedere obiectul specificat prin declaraia d x vizibil n acel loc; el se
determin la compilare explornd structura static a programului. Specificarea
atributelor acestui obiect este ns, de regul, incomplet la momentul compilrii.
Astfel, pentru o variabil definit prin cvadruplul
'
4.2. Funcii
<nume, tip,
101
locaie, valoare>
doar numele i tipul snt specificate n declaraia corespunztoare din textul programului;
locaia i valoarea vor fi determinate la execuie, folosind structura dinamic a programului
corespunztoare acelei execuii. ;:.
Regulile de completare a informaiei de legare a identificatorilor l a entitile ce le
corespund se numesc reguli de activare i, pentru Pascal, ele snt urmtoarele:
- dac identificatorul este local, el corespunde ipostazei coninute n contextul
propriu al activrii;
- dac identificatorul este parametru formal valoare, el se refer la variabila creat
pentru acesta, n contextul propriu al activrii;
- dac identificatorul este un parametru formal variabil / funcie / procedur, el
se refer la entitatea la care conduce legtura (referina) stabilit n contextul propriu al
activrii.
Observaie. Dac identificatorul numete o entitate extern, legarea lui la acea
entitate se completeaz la momentul editrii task-ului (vezi 4.7 i 7).
].
,-,
, . tr.i -.
-jft<a
102
Valorile dobndite n program de parametrii formali variabil devin cunoscute n locul de chemare c a valori a l e variabilelor globale folosite drept
parametri a c t u a l i n apel.
Execuia unei funcii c u parametri formali variabil produce deci i efectul
secundar de alterare a valorilor acestor variabile globale.
Folosirea v a r i a b i l e l o r globale ca parametri actuali corespunztori
parametrilor formali variabil este deci descurajat n c a z u l funciilor.
Comunicarea standard a funciilor cu mediul de chemare const deci n :
transmiterea de valori spre funcie prin parametri v a l o a r e i ntoarcerea u n u i
( s i n g u r ) rezultat din funcie prin numele ei.
Folosirea variabilelor globale c a mijloc suplimentar de comunicare este
permis. Variabilele globale pot fi deci folosite n f u n c i i , dar se recomand ca
valorile lor s nu fi e schimbate d e acestea.
Observaii:
1. Spre deosebire de funcie, o procedur poate s ntoarc mai mult dect o valoare n mediul
de chemare. Procedura nu conine vreo atribuire asupra numelui ei, deci nici o valoare nu este
ntoars din procedur prin acest nume. Mijlocul standard de ntoarcere de valori din
procedur este prin parametri formali variabil: valorile dobndite de acetia n procedur
devin cunoscute n afara ei ca valori ale parametrilor actuali corespunztori.
2. Atribuirile n procedur asupra variabilelor globale produc efecte secundare similare celor
discutate pentru astfel de atribuiri la funcii. Ele nu snt recomandate nici n acest caz. Astfel
de atribuiri introduc abateri de l a procedeul standard de comunicare dinspre procedur prin
care variabilele participante snt desemnate explicit ca parametri formali variabil (n
declaraie) i parametri actuali (n apel). Efectele lor se propag l a distan (n domenii de
vizibilitate a l e variabilelor globale) i pot interfera cu cele similare produse l a execuia altor
proceduri din acelai program, fcnd riscant utilizarea acestor variabile.
4.53.3. Parametri actuali c u acelai nume pentru parametri formali variabil distinci
Folosirea de parametri actuali cu acelai nume nu este recomandat dac ei
corespund la parametri formali variabil. Se evit astfel o surs de efecte secundare subtile.
Parametrii actuali cu acelai nume ar desemna cte o singur variabil, care la
execuia apelului ar fi cunoscut sub mai multe nume (ale parametrilor formali corespunztori
celor actuali cu acelai nume). O atribuire asupra unuia din aceti parametri formali ar avea
ca efect secundar i alterarea valorilor celorlali.
Exemplu. Programul urmtor ilustreaz efectele secundare produse de folosirea de
parametri actuali cu acelai nume pentru parametri formali variabil.
program P ;
var a : real;
procedure p l 2 (var x , y : r e a l ) ;
begin
x := 1; y
2 and;f p l 2 l
procedure p21 (var x, y : r e a l ) ; begin
y := 2 ; X := 1 end;{p21}
r.
;
begin
pl2( a , a ) ; w r i t e l n ('a- ', a ) ; p21( a , a ) ; writeln ( ' a = ' , a )
end.
{P}
Procedurile pl2 ip21 difer doar prin s i mp l a permutare a instruciunilor
de atribuire x : = l i y : - 2. Dup apelul lui pl2 se scrie a - 2. Dup apelul l u i
p?l se scrie a = l.
4.2. Funcii
103
real)
4.5.4. Recursie
4.5.4.1.
Recursia indirect
ntr-o structur de program reprezentat prin arborele
I
P
Q
i n t e q e r ) ; fo r wa r d ; procedure
104
begin
end. { P $
Reprezentm noua structur a programului prin arborele
P
fo r wa r d Q
\ R
dac n -
X n - f (n-1)
dac n > = 1
4.2. Funcii
105
f'(10)
10 f ( 9 )
i
1
..
i
f (1)
f(0)
Apelul f (o) determin evaluarea direct a funciei oprind astfel procesul repetitiv;
urmeaz revenirile din apeluri i evaluarea lui f pentru l , 2 ,
9, 10,
ultima valoare fiind ntoars la locul primului apel f (l o). Se observ c apelul recursiv al lui
f este ultima aciune care se execut la activarea funciei factorial. Acesta este un exemplu de
recursie l a sfrit ("tail - end recursion") care, n general, poate fi uor nlocuit prin iteraie
[Kru84] i implementat eficient. Funcia factorial poate fi rescris iterativ folosind dou
variabile auxiliare i i p pentru controlul procesului repetitivi respectiv pentru acumularea
rezultatelor
intermediare:
function f(n:natural): natural; var
i, p: natural; begin
end;
p i - i;
for i: 2 to n do p:- p*i;
f:= p i ffl
{f}
Exemplul 2. Funcia
fib:N - ->,
fib(n)
dac
dac n - 1
dac n >-
fib(n-i) + fib(n-2)
2
are ca valori numerele lui Fibonacci. Forma ei Pascal derivat nemijlocit din definiie nu
ilustreaz cazul recursiei la sfrit:
function fib(n: natural): natural;
begin
if n - 0 then fib:= 0
elae if n = 1 then fib:= 1
elae fib:- fib(n-l) + fib(n-2)
end; {fib}
Fiecare apel al funciei pentru n > - 2 genereaz dou apeluri .a.m.d., de exemplu:
fib(4)
fib(l)
fib(3)
/
\
fib(2)
fib(l)
fib(O)
fib(2)
/
\
fib(l)
1
fib(O)
I
106
ond
fib:- b
dac m = o
=
dac n - 0
dac m>0 i n>0
''
1)
Funcia ia valori foarte mari chiar pentru valori mici ale parametrilor, de exemplu a
(4,2) i o20000. AmM programat, execuia ei necesit timp de calcul mare (datorit
numrului mare de apeluri recursive) i un spaiu de memorie prohibitiv (datorit "adineimii"
rscursiei), astfel c a devenit un test al calitii implementrii recursiei ,n> limbaje de
programare [Wic82]; graful apelurilor ei pentru m=2, n=l este sugestiv n acest sens: