Documente Academic
Documente Profesional
Documente Cultură
Limbajul de Programare Pascal. Sergiu Istrati
Limbajul de Programare Pascal. Sergiu Istrati
Programare
Ciclu de prelegeri
Chiinu 2001
Adnotare
U.T.M.,2001
caracterele afiate pe ecran pot fi: litere mari i mici ale alfabetului latin, cifre, semne
de punctuaie i matematice, precum i alte litere din alte alfabete. Regimul grafic al
monitorului este destinat afirii pe ecran desenelor, graficelor, diagramelor i
textelor. Ecranul e alctuit din puncte numite pixeli, fiecare punct poate fi pe
monitorul monocrom iluminat sau ntunecat, sau de una din culorile de care dispune
monitorul color. Numarul de puncte pe orizontal i vertical determin rezoluia
monitorului. Ex: 640x480, 800x600, 1024x768.
Din punct de vedere al rezoluiei i graficii exist mai multe norme
internaionale pentru monitoare. Ex: CGA, EGA, VGA, SVGA.
Tastatura este dispozitivul care permite introducerea informaiei n calculator
i gestiunea sistemului. Tastaturile se clasific n funcie de ara creia i snt destinate.
Tastatura are mai multe tipuri de taste:
- alfa-numerice (a,b,c,,z,0,1,,9,(,.,:,",*,$,@, etc.);
- funcionale (F1-F10);
- speciale (Shift, Alt, Ctrl, Enter).
Mouseul are destinaia de a mri comoditatea lucrului la calculator, de a
gestiona sistemul. Mouse-ul poate fi cu 2 sau 3 clape. Cele mai rspndite snt cele cu
2 clape. Clapa din stnga are funcia confirmrii unei comenzi i este echivalent cu
tasta <ENTER> de pe tastatur. Clapa din dreapta deschide meniuri adugtoare
ajuttoare, avnd specificaii diferite pentru fiecare obiect n particular.
2.3 Bazele aritmetice ale calculatorului.
2.3.1 Sistemele de numeraie.
n calculatoarele digitale informaia de orice categorie este reprezentat,
stocat i prelucrat n form numeric. Numerele se reprezint prin simboluri
elementare numite cifre.Totalitatea regulilor de prezentare a numerelor mpreun cu
mulimea cifrelor reprezint un sistem de numeraie.Numarul cifrelor folosite
servete drept baz a sistemului de numeraie. Cel mai frecvent snt folosite
sistemele:
- Zecimal: sistem de numeraie n baza 10, cifrele utilizate: 0. . 9;
- Binar: baza-2, numarul de cifre utilizate 2: 0,1. Cifrele se numesc bii;
- Ternar: baza-3, cifre: 0,1,2;
- Octal: baza-8, cifre 0..7;
- Hexazecimal baza-16, 16 cifre:0,1,9, A(zece), B,C,D,E,F(15)
Regula de reprezentare a numerelor din sistemul zecimal rezult din urmatorul
exemplu: (3856,43) 10 =3*10 3 +8*10 2 +5*10 1 +6*10 0 +4*10 1 +3*10 2 . Se observ, c
n aceast reprezentare semnificaia(valoarea) fiecrei cifre depinde de poziia pe care
o ocupa n numar (sute, mii,sutimi,miimi etc).
Sistemele n care semnificaia cifrelor depinde de poziia ocupat n cadrul
numerelor se numesc sisteme de numeraie poziionale.
Presupunem c numrul N are partea ntreg format din n+1 cifre , iar partea
fracional din m cifre: N=Cn*Cn-1C1*C0, C-1Cm.
Valoarea acestui numar se evalueaz n funcie de baza sistemului de
numeraie: (N)b=Cnbn + Cn-1bn-1 + + C0b0 + C-1b-1+ C-mb-m .
7
Scaderea binar
00=0
10=1
11=0
10 1 = 1
Inmulirea binar
0*0=0
0*1=0
1*0=0
1*1=1
{a := b + c D
a := b
.
+
c
e identic cu
1. Antet
Program nume;
2. Partea declarativ
{$}
directive globale ale compilatorului
USES
bibliotecile (pentru folosire) incluse
LABEL declararea etichetelor globale
CONST declararea constantelor globale
TYPE declararea tipurilor globale
VAR
declararea variabilelor globale
3. Partea procedurilor i funciilor:
Procedure (function) antetul procedurii(funciei)
LABEL
declararea etichetelor locale
CONST
declararea constantelor locale
TYPE
declararea tipurilor locale
VAR
declararea variabilelor locale
BEGIN
blocul principal al procedurii (funciei)
END;
4.Partea blocului principal
BEGIN
blocul principal al programului
END.
1. n prima parte se afl rndul antetului programului. El const din cuvntul
rezervat PROGRAM i denumirea programului. n Borland Pascal antetul nu este
obligatoriu, dar e preferabil de-l folosit pentru o comoditate n citirea programului i
informaiei suplimentare despre program.
2. n partea a doua se comunic compilatorului cu ce identificatori se noteaz
datele, deasemenea se determin tipurile noi create de programator. n aceast parte a
programului se poate de-i dat compilatorului unele indicaii, ce determin regimurile
de lucru la translarea programului. Aceste indicaii se oformeaz n textul
programului ca comentarii, ce se ncep cu simbolurile {$ i se termin cu }.
Aceste comentarii pot conine indicaii la includerea n textul programului a
fragmentelor din alte programe (din fiierele corespunztoare), informaie despre
necesitatea folosirii coprocesorului aritmetic.
Operatorul USES joac un rol important n includerea n textul programului
a modulelor de sistem din biblioteci. n acest operator se indic compilatorului, din ce
bibliotec se folosesc module n cadrul programului dat, pentru a fi includse n
program. Bibliotec este un set de module, fiecare din care este nchis, i are
numele su, se compileaz aparte i se include n program ca un tot ntreg cu o
interfa cunoscut. Fiecare modul (bloc,UNIT) reprezint un program ce conine
declaraii de tipuri i variabile, proceduri i funcii. Denumirea bibliotecilor, ce se
includ n program cu ajutorul operatorului USES se despart prin virgul:
Ex.: USES CRT,GRAPH,DOS,SYS;
Dup rndul operatorului USES urmeaz declararea etichetelor, constantelor,
tipurilor, variabilelor. (Ele pot fi amplasate n ordine aleatoare).
16
enumerate
Var a:string[15];
Begin a:=student; n:integer;
Writeln (primul caracter:,a[1]);
{ca rezultat litera s}
n:=Length(a); Writeln(Ultimul caracter:, a[n]); {ca rezultat litera t}
writeln(caracterul din mijloc:, a[n-(ndiv2)]);
{ca rezultat litera d} end.
Asupra irurilor de caractere se poate efectua operaia de concatenare, notat
cu +. Dac s i t snt doi operanzi de tip ir de caractere sau char, rezultatul
concatenrii s+t este compatibil cu orice tip ir de caractere (dar nu i cu tipul char).
Dac lungimea irului rezultant depete 255 de caractere, irul se trunchiaz dup
caracterul cu numrul de ordine 255. Exemplu:
Program sir;
var s1:string[10]; s2:string[20]; l:integer;
begin s1:'Turbo'; s2:=sl+'Pascal'; 1:=length(s2);
writeln(s2);
writeln('Lungime actuala =',1); end.
Operatorii relaionali =, <>, <,> , =, >= i <= compar iruri de caractere, n
conformitate cu ordonarea setului extins de caractere ASCII. Deoarece toate irurile
de caractere snt compatibile, pot fi comparate dou valori arbitrare de tip ir.O
valoare de tip caracter este compatibil cu o valoare de tip ir de caractere; cnd
aceste valori snt comparate, valoarea de tip caracter este considerat ca i cum ar fi
un ir de lungime 1.
4.2.2.3 Tipul set
n Pascal o variabil de tip set este echivalat cu o mulime. Un tip set
(mulime) se definete n raport cu un tip de baz, care trebuie s fie un tip ordinal.
Fiind dat un asemenea tip de baz, valorile posibile ale tipului set snt formate din
mulimea tuturor submulimilor posibile ale tipului de baz, inclusiv mulimea vid.
Tipul mulime se definete astfel: type numeTip=set of tip_de_baza
unde tip_de_baz este tip ordinal (char, interval, enumerare, boolean, byte). Cu
toate c tipurile ntregi snt ordinale, nu este permis dect tipul set of byte.
Dac tipul de baz are n valori, tipul mulime va avea 2 la puterea n valori, cu
restricia c n<=256.
Exemplu:
Type cifre=5..7; {tip interval}
mult=set of cifre; {tip mulime}
var m:mult;
{variabil de tip mulime}
Variabila m de tip mulime poate avea 8 valori, i anume mulimea tuturor
submulimilor posibile ale tipului mult, inclusiv mulimea vid. Aceste valori snt:
[5], [6], [7], [5,6], [5,7], [6,7], [5,6,7] i [ ], ultima valoare reprezentnd mulimea
vid.
O valoare de tip mulime poate fi specificat printr-un constructor (generator)
de mulime. Un constructor conine specificarea elementelor separate prin virgule i
nchise ntre paranteze ptrate. Un elemnt poate s fie o valoare precizat sau un
interval de forma inf. - sup., unde valorile inf i sup precizeaz valorile limitelor
inferioare i superioare. Att elementul ct i limitele de interval pot fi expresii.
Dac sup<inf, nu se genereaz nici un element.
23
Exemplu:
Program exemplu;
type octet=0..255;
{tip interval}
numar=set of octet;
{tip mulime}
cuvint=set of char;
{tip mulime}
culoare=(alb,gri,negru); {tip enumerare}
nuanta=set of culoare; {tip mulime}
var: n:numar; c:cuvint; a:nuanta; i:integer;
begin n:=[2..4,8,10..12];
{elementele din constructor:2,3,4,8,10,11,12}
i:=10; n:=[i-1..i+1, 2*i, 30]; {elemente:9,10,ll,20,30}
c:=['A'..'C','K','S'];
{elementele:'A','B','C','K','S'}
a:=[alb,gri];
{ elementele: alb, gri}
end.
Dac tipul de baz are n valori, o variabil de tip mulime corespunztoare
tipului de baz va fi reprezentat n memorie pe n bii, depui ntr-o zon de memorie
continu de: (n div 8)+1 octei, dac n nu este divizibil cu 8; i (n div 8) octei, dac
n este divizibil cu 8. De exemplu, set of char va fi reprezentat pe 256 div 8, adic pe
32 octei.
Operaiile care se pot face cu valorile tip mulime snt:
Reuniunea: o valoare de tip ordinal c este n a+b, dac c este n a sau b.
Diferena: o valoare de tip ordinal c este n a-b dac c este n a i nu n b.
Intersecia: o valoare de tip ordinal c este n a*b, dac c este n a i n b.
Relaii referitoare la mulimi: Dac a i b snt operanzi tip mulime, relaia
a = b este adevrat numai dac a i b conin exact aceiai termeni; altfel aob.
a <= b este adevrat dac fiecare termen al lui a este de asemenea un termen al lui b.
a >= b este adevrat dac fecare termen al lui b este de asemenea un termen al lui a.
Relaia de apartenen este aplicabil n cazul mulimilor. Fiind X o variabil
de tip ordinal t, iar a o variabil de tip mulime (a crei mulime de baz este
compatibil cu t), relaia (X in a) este adevrat, dac X este element al mulimei a.
n operaiile i relaiile de mai sus a i b trebuie s fie mulimi compatibile.
Dac notm cu elmin cea mai mic valoare ordinal a rezultatului unei operaii
cu mulimi, iar cu elmax cea mai mare valoare ordinal a operaiei, tipul rezultatului
este set of a..b. Constructorii pot fi folosii pentru scrierea mai complet a unor
condiii. De exemplu, dac ch este o variabil de tip caracter, condiia:
if (ch= T) or (ch='U') or (ch='R') or (ch='B') or (ch='O') then {...}
poate fi exprimat prin: if ch in ['T','U','R','B','O'] then {...}
iar condiia
if (ch='0') and (ch<='9') then {...} poate f exprimat prin:
r
if ch in [ 0'..'9'] then {...}
Exemplu: Verificarea operaiilor cu mulimi:
program opmult;
type multime=set of 1.. 10;
var a,b,int,reun,dif: multime; i:integer;
begin a:=[1..3,7,9,10]; b:=[4..6,8..10];
int:=a*b; {9,10} reun:=a+b; {1..10} dif:=a-b; {l,2,3,7}
writeln(''intersecie'); for i:=1 to 10 do if i in int then writeln(i);
writeln('reuniune'); for i:=1 to 10 do if i in reun then writeln(i);
24
writeln('diferena');
end.
unde:string[20];
end;
var a:ntlnire;
Un nume de cmp trebuie s fie unic numai n tipul articol n care a fost definit.
Deci, dac n program evem declarate mai multe articole, atunci numele cmpurilor
din eceste articole pot s se repete, adic s fie aceleai, cu condiia c numele
articolelor vor fi unice. Exemplu:
Type student1=record
Nume: string; Grupa: string; Nota1: integer; Nota2:integer; Media: real;
End;
student2=record
Nume: string; Grupa: string; nota1: integer; nota2:integer; nota3:integer;
media: real;
End;
Pentru uurarea redactrii programelor, declararea cmpurilor de acelai tip ale unui
articol se face ca i n cazul declarrii ctorva variabile simple de acelai tip ele snt
desprite prin virgul. Exemplu:
Type student=record
Nume, Grupa: string; nota1, nota2, nota3: integer; media: real;
End;
Valorile variabilelor de tip articol pot lua parte la diferite operaii, calcule,
formule. ns aceste valori nu snt valorile articolului ntreg, ci valorile concrete ale
cmpurilor articolului. Un cmp al unei variabile de tip articol este referit prin numele
variabilei i numele de cmp, separate printr-un punct. Exemplu:
Astzi.an:=1991; astzi.luna:=nov; astzi.ziua:=13; a.ora:=13,40; a.cnd.ziua:=5;
Operatiile care pot fi efectuate asupra cmpurilor tipului articol snt operaiile
aplicabile tipului de date, crui i aparine cmpul corespunztor. Exemplu:
Calcularea balului mediu la sesiune al unui student
Program p1;
Type student=record
Nume, Grupa: string; nota1, nota2, nota3: integer; media: real;
End;
Var a:student;
Begin a.nume:=vasile; a.grupa:=ABC-981;
a.nota1:=8; a.nota2:=9; a.nota3:=7;
a.media:=( a.nota1+ a.nota2+ a.nota3) / 3; writeln(media=,a.media);
end.
Pentru a uura scrierea anevoioas n cazul referirii unui cmp al articolului
prin nume de variabile i cmpuri separate prin punct se poate folosi instruciunea
with. Ea permite o referire prescurtat a cmpurilor unui articol. n interiorul unei
instruciuni with cmpurile uneia sau a mai multor variabile de tip articol pot fi
referite folosind numai numele cmpurilor lor. Sintaxa instruciunii este: with
list_de_variabile_tip_articol do instruciune;
unde" list_de_variabile_tip_articol" este una sau mai multe variabile tip articol,
referirea crora va avea loc prin intermediul instruciunii with. Exemplu:
26
componena articolului acest cmp lipsete. Astfel de tipuri snt articole cu variante.
Forma general a unei astfel de structuri este:
Nume_articol = record
nume_cmp_l :tip_l; {cmpurile fixe}
nume_cmp_n:tip_n;
case
cmp_sel:tip_sel of {cmpuri variabile}
const_1:(cmp_var1_1 : tip_var1_1; cmp_var1_2 : tip_var1_2; cmp_var1_n :
tip_var1_n) const_2:(cmp_var2_1 : tip_var2_1; cmp_var2_2 : tip_var2_2;
cmp_var2_m : tip_var2_m)
end;
Diferitele variante snt selectate de valorile posibile ale lui tip_sel (tip selector)
al cmpului cmp_sel (cmp selector). Fiecare din variant este "etichetat". Aceste
"etichete" notate mai sus cu const_l, const_2, ... conin diferite valori ale tipului
selector; valorile specificate pot fi scrise i sub forma de interval de valori, astfel:
inf. - sup. Fiecare valoare a tipului selector trebuie s apar ntr-una din aceste
"etichete".
Dac o variant este vid, adic nu are nici un cmp, forma ei este const: ( ) O
list de cmpuri poate s conin numai o singur clauz case, plasat dup cmpurile
fixe. Tipul selector trebuie s fie ordinal.
Exemplu: Type studii =(elem,medii,sup);
inform=record
Nume:string[20];
salar:5000..15000;
Case preg : studii of
{preg-cmp selector, studii-tip selector. Cpmul preg de tip studii}
elem:();
{nu avem nici un cmp, variant vid}
medii:(bal: real);
{ dac cmpul selector = medii, atunci apare un cmp nou: bal tip real}
sup:(an_abs:1950..2000; licena:boolean) {cnd preg=sup}
end;
var x,y,z:inform;
begin
x.nume:='JOHN'; x.salar:=6 0 0 0; x.preg:=elem;
y.nume:='MARY'; y.salar:=7000; y.preg:=medii; y.bal:=8.50;
z.nume:='BILL'; z.salar:=8000; z.preg:=sup;z.an_abs:1990; z.licena:=true;
end.
Numai o singur variant poate s fie activ la un moment dat. Astfel, dac este
activ varianta medii, prin y.preg: = medii, nu are sens o atribuire de forma
y.anabs:=1980.
Lungimea unei variabile de tip articol este egal cu lungimea prii fixe propriu
zise plus lungimea cmpului selector, plus lungimea celei mai mari pri variabile ( n
caz c exist).
28
astfel:
Var a:pointer; Variabilele de tip pointer nu pot fi dereperate: scrierea
simbolului ^ dup o astfel de variabil constituie o eroare. Variabilele de tip pointer
snt utilizate pentru memorarea valorii unor variabile de tip reper legat. Unei variabile
de acest tip i poate fi atribuit i valoarea predefinit nil. Observaie: Valori de tip
reper pot fi create i cu operatorul @ ,i cu funcia standard Ptr. Aceste valori snt
tratate ca i cum ele ar fi repere pentru variabile dinamice.
Exemplu: program test;
type e=integer; pe=^e; pin=^integer;
var alfa:e; beta:integer; p,p1:pointer; vpe:pe; vpi:pin;
begin writeln(Test cu tipul pointer);
alfa:=5; beta:=6;
vpe:=@alfa; vpi=@beta;
writeln('alfa=',vpe^, 'beta=', vpi^);
p1:=@alfa;
{writeln('alfa=',p2^); {eroare 64: Cannot Read or Write variables of this type }
{(Nu pot fi citite sau scrise variabile de acest tip) }
{alfa1^:=p1^};
{eroare 26:Type mismatch (Incompatibilitate de tip) }
p:=@beta; vpi:=p; vpe:=p1; writeln('alfa=',vpe^,'beta=',vpi^);
readln; end.
Pe ecran vor fi afiate urmtoarele rezultate:
Test cu tipul pointer
alfa=5 beta=6
alfa=5 beta=6
4.2.2.7 Fiiere n Pascal
4.2.2.7.1 Generaliti despre fiiere.
Prin fiier n general se nelege o structur de date care const dintr-o secven de
componente. Fiecare component din secven are acelai tip. Numrul acestor
componente nu este fixat. Aceasta este o caracteristic prin care se distinge clar
fiierul de tablou. La un moment dat ns, este accesibil direct numai o singur
component a secvenei. Celelalte componente snt accesibile progresnd secvenial n
fiier. Progresarea n componentele unui fiier se realizeaz prin subprograme de
citire i de scriere. Datele fiierului snt stocate de obicei pe un suport magnetic. n
limbajul Pascal, pot fi definite trei structuri de tip fiier: 1)fiier cu tip; 2)fiier text;
3)fiier fr tip.
S notm cu f o variabil de tip fiier. nainte ca variabila s fie utilizat, ea
trebuie asociat cu un fiier extern, prin apelul procedurii Assign. n general, fiierul
extern este un fiier pe disc, dar variabila de fiier poate fi asociat i cu un dispozitiv
(de exemplu tastatura, ecran). Fiierul extern marcheaz informaiile scrise n fiier
sau furnizeaz informaiile depuse. Dup ce s-a stabilit asocierea cu un fiier extern,
fiierul trebuie "deschis". Aceast deschidere pregtete fiierul pentru citire i/sau
scriere. Un fiier existent poate fi deschis cu ajutorul procedurii Reset. Un fiier nou
poate fi deschis cu procedura Rewrite. Fiierele de tip text deschise cu Reset permit
doar operaii de citire; fiierele de tip text deschise cu procedura Rewrite sau Append
permit numai operaii de scriere. Fiierele cu tip sau fr tip permit att citirea ct i
31
scrierea, indiferent dac ele au fost deschise cu Rewrite sau cu Reset. Fiierele text
standard Input i Output snt deschise automat n momentul n care ncepe execuia
programului. Input este un fiier text care permite numai operaii de citire i este
asociat cu claviatura. Output este un fiier text care permite numai operaii de scriere
i este asociat cu ecranul. Fiecare fiier este o secven liniar de componente,
fiecare component avnd tipul de baz al variabilei fiier. Fiecare component a
fierului are asociat un numr, numit numrul componentei. Prima component a
fierului este considerat avnd numrul de component zero. Cea de a doua
component are numrul 1 .a.m.d. n mod normal accesul la componentele fiierului
este secvenial. Aceasta nseamn, c atunci cnd se citete o component cu ajutorul
procedurii standard Read, sau cnd se scrie o component cu ajutorul procedurii
standard Write, poziia curent de fiier se deplaseaz la urmtoarea component, n
sensul ordonrii numerice. In afar de acest mod de acces, fiierele cu tip i fiierele
fr tip permit i accesul direct (aleator) la componentele fiierului. Accesul direct se
bazeaz pe procedura de cutare Seek, care mut poziia curent n fiier pe o
component specificat. Dup aceast poziionare componenta astfel aleas poate fi
citit. Funciile standard FilePos i FileSize permit determinarea poziiei curente n
fiier, respectiv a dimensiunii actuale a fiierului. Cnd prelucrarea componentelor
unui fiier se termin, fiierul trebuie nchis cu procedura standard Close. Dup ce
fiierul a fost nchis, se vor actualiza datele fiierului extern asociat. Dup fiecare
apel de procedur i funcie stndard de intrare/ieire se testeaz automat reuita
operaiei de intrare/ieire. n cazul n care apare o eroare, programul se termin i se
afiaz un mesaj de eroare n execuie. Directiva de compilare $I permite ca aceast
eroare s fie tratat n program. n stare decuplat {$I-}, programul nu se oprete la o
eroare de intrare/ieire. Pentru a analiza cauza erorii, se apeleaz funcia standard
IOResult, care n caz de operaie reuit returneaz valoarea zero, iar n caz de eec
returneaz o valoare diferit de zero, care codifc natura erorii.
tergerea fiierului extern asociat unui fiier nchis poate fi realizat cu
procedura Erase. n procesul de citire a unui fiier, faptul c s-a ajuns la sfritul
fiierului poate fi urmrit cu funcia Eof. Aceast funcie returneaz valoarea logic
true dac s-a ajuns la sfritul fiierului, respectiv false n caz contrar.
4.2.2.7.2 Fiiere cu tip
Fiierul cu tip este o secven de componente, fiecare component avnd
acelai tip, numit tipul de baz al fiierului. 0 vanabil de acest tip poate fi declarat
printr-o declaraie de forma:
var nume_fiier : file of tip_de_baz; unde tip_de_baz este un tip arbitrar,
exceptnd tipul fiier.
Exemplul 1: Crearea unui fiier cu tip cu nume extern persoana.txt. Componentele
snt de tip articol, cu informaiile referitoare la angajaii unui institut.
Program fiiercutip;
type angajat=record
marca:integer; nume:string[20]; salar:integer; end;
var f:file of angajat;
{ variabila f este un fiier tip articol}
a:angajat; contin:char; k:integer; {rspunsul operatorului}
32
begin
assign(f , 'persoana.txt'); {asocierea variabilei f cu fiierul de pe disc persoana.txt}
rewrite(f);
{deschiderea fiierului pentru prima dat}
repeat writeln('marca='); readln(a.marca);
writeln('nume=' ); readln(a.nume);
writeln('salariu='); readln(a.salar);
write(f,a);
{scriere de componenta n fiier}
writeln('Continuam? d/n' ); readln(contin);
until upcase(cont)='N';
k:= filesize(f)
{funcia FilSize determin mrimea actual a fiierului}
writeln('Numarul de componente n fiier=',k);
close(f);
{nchiderea fiierului}
end.
Exemplul 2. Acces direct la fiierul persoana.txt. Se livreaz informaiile referitoare
la un angajat, pe baza numrului de component asociat unui angajat.
Program accesdirect;
type angajat=record
marca:integer; nume:string[20]; salar:integer; end;
var f :file of angajat; a:angajat; fs:integer; nr:integer;
begin
assign(f,persoana.txt) {asocierea variabilei f cu fiierul de pa disc persoana.txt}
reset(f);
{deschiderea fiierului existent pentru citire/scriere}
fs:=filesize(f);
{funcia FilSize determin mrimea actual a fiierului}
writeln('nr.componentei='); readln(nr);
if nr>fs then writeln('eroare, fiierul e mai mic') else
begin seek(f,nr);
{poziionare pe componenta cu numrul nr.}
read(f,a);
{citirea compnentei selectate din fiier}
writeln('marca=',a.marca); writeln('nume=', a.nume); writeln('salar=',a.salar);
end; close(f);
{nchiderea fiierului}
end.
4.2.2.7.3 Fiiere de tip text
Fiierul text conine caractere structurate pe linii, fiecare linie fiind terminat
cu un caracter de sfrit de linie (EOLN caracter). Lungimea liniilor este variabil.
Caracterul de sfrit de linie este de regul CR[ENTER] (ASCII #13). Un fiier text
este terminat cu un caracter de sfrit de fiier CTRL-Z. Un fiier text este declarat
prin tipul predefinit text, de exemplu: var f:text. Un fiier text nu este echivalent cu
un fiier de tip file of char. Lungimea liniilor fiind variabil, poziia unei linii n
cadrul fiierului nu este calculabil. n consecin, la fiiere text accesul nu poate fi
dect secvenial. Asocierea numelui fiierului la suportul extern este realizat cu
procedura Assign. Deschiderea fiierului poate fi realizat prin trei subprograme
standard. Un fiier nou se deschide cu procedura Rewrite, un fiier existent poate fi
deschis fie la nceputul fiierului, fie la sfritul lui, n vederea adugrii liniilor noi.
Deschiderea la nceput se realizeaz cu procedura Reset, iar la sfrit cu procedura
Append. Pentru fiiere text, formele speciale ale subprogramelor Read i Write permit
33
program copiere;
var sursa,dest:file;
citit,scris:word; tampon:array[1..2048] of char;
numsurs,numdest:string[14];
begin
writeln('Fisierul sursa:');
readln(numsurs);
assign(sursa,numsurs);
reset(sursa,1);
{lungimea componenta = 1}
writeln('Fisierul destinatie:'); readln(numdest);
assign(dest,numdest); rewrite(dest,1);
writeln (' Copiere de', FileSize (sursa), ' octeti...');
repeat
BlockRead(sursa,tampon,2048,citit);
BlockWrite(dest,tampon,citit,scris);
until (citit = 0) or (scris <> citit); close(sursa); close(dest);
end.
4.3 Instruciuni
O instruciune este alctuit dintro 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 instruciuni simple (instruciunea de atribuire, apelul de procedur, instruciunea
de efect nul i instruciunea de transfer necondiionat) i instruciunile structurate
(instruciunea compus, instruciunile iterative, instruciunile condiionale,
instruciunea with .a.).
4.3.1 Instruciuni simple.
O instruciune se numete simpl dac nu conine alte instruciuni.
4.3.1.1 Instruciunea de atribuire.
Aceast instruciune are forma V:=E; unde V o variabil, iar E o expresie.
Prin execuia instruciunii de atribuire, expresia E este evaluat i rezultatul se
atribuie variabilei V. Variabila i rezultatul evalurii trebuie s fie de tipuri identice
sau tipul uneia s fie un subdomeniu al celeilalte, sau ambele s fie subdomenii ale
aceluiai tip, iar rezultatul n subdomeniul variabilei. Se admite ca excepie cazul cnd
variabila este de tipul real, iar rezultatul de tipul integer sau un subdomeniu al
acestuia. n dependen de tipul variabilei i rezultatului exist: atribuire aritmetic,
logic, caracterial. Atribuirea aritmetic servete pentru atribuirea unei valori
variabilei de tipul real sau integer. n calitate de expresie pot fi diferite funcii i
operaii ce pot fi aplicate asupra tipurilor real i integer. n cazul atribuirii logice de
partea stng se afl o variabil de tipul boolean, iar n partea dreapt o expresie
logic pentru calcularea unei valori logice(true sau false).De obicei la atribuirea
caracterial n partea stng se afl o variabil tip char, iar n dreapta - o expresie
caracterial ce red regula de determinare a valorii de tipul char, adic un caracter
aparte. Ex.: a: = l; b: =succ (l);
36
37
..
Cn: <instruciunea n>;
Cn: <instruciunea n>;
OTHERWISE <instruciune>
ELSE<indtruciune>;
end;
end;
unde i este selector; c1,cn-constante. n standardul iniial al limbajului Pascal
construcia case este folosit cu cuvntul cheie otherwise. n Turbo Pascal n loc de
otherwise se folosete else. n calitate de selector poate fi o variabil de tipul
INTEGER sau CHAR, ns nici ntr-un caz de tipul real. n cazul, cnd selectorul I
coincide cu constanta c1 se ndeplinete <instruciunea 1>, n caz contrar
compilatorul trece la controlul condiiei din ramura 2. Dac selectorul coincide mcar
cu una din constantele c1cn atunci se ndeplinete instruciunea respectiv, n caz
contrar se ndeplinete instruciunea ce urmeaz dup OTHERWISE sau ELSE.
Ex.: var I, s: integer;
Begin writeln (culege I); case I of 1: s:=3+I; 2: s:=3+sqrt(I);
3: s:=3+sqr(I); else s:=3+exp(I) end;
4.3.2.3 Instruciuni iterative(ciclice)
Instruciunile precutate mai sus redau operaii care trebuie efectuate conform
algoritmului i fiecare din ele se ndeplinesc numai o dat. n cazul, cnd una i
aceiai instruciune trebuie s fie executat de n ori cu diferite valori ale parametrilor
se folosesc instruciunile ciclice. Distingem 3 instruciuni ciclice n Pascal:
1) Instruciunea ciclic cu parametru (FOR)
39
acest ciclu e numit ciclu cu postcondiie. De asemenea ca i ciclul for, ciclul repeat
conine un parametru, care conduce cu numrul de repetri al ciclului. Acest
parametru trebuie s fie prezent n expresia logic B. Spre deosebire de ciclul for
unde parametrul nu poate fi schimbat n corpul ciclului, n cazul ciclului repeat
valoarea parametrului neaprat trebuie s fie schimbat spre majorare sau micorare.
Adic parametrul ciclului se va schimba n ordine cresctoare sau descresctoare.
Valoarea cu care se mrete(micoreaz) parametrul ciclului se numete pasul
ciclului. i n comparaie cu ciclul for, n cazul dat pasul ciclului poate fi i de tip
real i mai mare ca 1. Ex. : I:=1; repeat y:=y+x; I:=I+1 until I>n;
Deoarece n instruciunea repeat - until condiia se controleaz numai la
sfritul ciclului, setul de instruciuni S din care este compus corpul ciclului este
executat mcar o singur dat. i n cazurile, cnd conform algoritmului este necesar
ca un set de operatori s fie ndeplinii cel puin o dat, este binevenit ciclul repeat until.
Instruciunea ciclic precedat de condiie(while).
n cazul ciclului repeat setul de instruciuni S va fi executat cel puin o dat.
ns destul de frecvente snt cazurile cnd numrul de iteraii nu este cunoscut, dar
pentru nite valori concrete ale datelor iniiale aciunile prevzute pentru executarea
n cadrul ciclului nu trebuie s fie executate nici o dat i chiar ndeplinirea de o
singur dat a ciclului poate duce la rezultat incorect sau nedeterminat. Pentru a reda
astfel de procese de calcul n Pascal este folosit ciclul WHILE, sintaxa crui este
urmtoarea: WHILE B DO S ;
unde while i do snt cuvinte cheie, bexpresie logic, s-operator. Aici operatorul S
se execut de 0 sau mai multe ori, ns nainte de fiecare urmtoare executare se
evalueaz valoarea expresiei B i operatorul S este executat numai n cazul, cnd
expresia B are valoarea TRUE. Executarea operatorului ciclului ia sfrit atunci, cnd
expresia B pentru prima dat se egaleaz cu FALSE. Dac expresia B se egaleaz cu
FALSE chiar la prima evaluare a sa, atunci operatorul S nu va fi executat nici o dat.
Din cauz c condiia de terminare a procesului ciclic este controlat pn la
executarea operatorului S, aceast instruciune poart denumirea de proces ciclic
precedat de condiie. Este remarcabil faptul, c operatorul ciclic precedat de condiie
este cel mai universal dintre toi operatorii ciclici. Cu ajutorul lui este posibil de redat
procese ciclice determinate de instruciuni ciclice cu parametru i cu postcondiie. De
exemplu ciclu cu parametru for i:=E1 to E2 do S; este echivalent cu urmtoarea
succesiune de instruciuni: i:=E1; while i<=E1 do begin S; i: = succ (i); end; i n
primul caz, i n al doilea rezultatul executrii acestor fragmente de program va fi
acelai, diferena fiind numai n sintax i succesiunea de instruciuni. Operatorul
ciclului cu postcondiie de obicei de asemenea se poate de redus la operatorul ciclic
precedat de condiie, corespunztor schimbnd condiia, adic expresia logic. Avnd
la dispoziie ciclul cu postcondiie n urmtoarea componen:
i:=E1 repeat S; i:=i+1 until i>E2;
l putem reda cu ajutorul operatorului precedat de condiie while:
i:=E1 while i<=E2 do begin S; i:=i+1 end;
Deci, fiind cunoscute cele 3 instruciuni ciclice FOR,WHILE i REPEAT le
putem folosi n diferite scopuri aparte pentru cazuri concrete. n cazul cnd
41
42
Program patrulater4;
Var AB, BC, CD, DA, BD,s1,s2:real;
Procedure aria(a,b,c:real; var s:real;);
Var p:real;
Begin p:=(a+b+c)/2; S:= sqrt(p*(p-a)*(p-b)*(p-c)); end;
Begin readln(AB,BC,CD,DA,BD);
aria(AB,DA,BD,S1);
aria(BC,CD,BD,S2);
writeln(S=,S1+S2);
End.
Se vede c transmiterea parametrilor ntre AB i a; DA i b; BD i c etc. a fost
fcut prin valoare, iar dintre S1 i S (S2 i S) prin adres.
Declaraii anticipate
Una dintre regulile de baz ale limbajului Pascal este c locul de definiie al
unui nume trebuie s fie naintea utilizrii numelui respectiv. Astfel, compilatorul
poate s efectueze, printr-o singur trecere peste programul surs, toate verifcrile
necesare. Respectarea acestei reguli n unele cazuri ntmpin greuti. S considerm
urmtorul exemplu: un program declar dou proceduri P i Q astfel nct nici una nu
este declarat n cadrul celeilalte. n afar de aceasta, s presupunem c procedura P
activeaz procedura Q, iar procedura Q activeaz la rndul ei pe P. n acest caz,
oricare ar fi forma textual a programului, utilizarea numelui uneia dintre proceduri
apare naintea locului de definire a ei.
Pentru rezolvarea acestei probleme, n limbajul Pascal a fost introdus
directiva forward prin care se pot separa fizic cele dou componente de baz ale
declaraiei unei proceduri: antetul procedurii de blocul procedurii. Directiva forward,
aezat imediat dup antet, nlocuiete blocul programului i permite apariia textual
a blocului undeva mai jos n program, unde va fi precedat numai de identificatorul
subprogramului. Astfel, lista parametrilor formali se specific numai n declaraia
forward (i nu se mai repet i n declaraia de procedur sau funcie).
procedure Q(x,y,z:integer); forward;
procedure P (u, v, w: integer);
Begin Q(2,3,4); end;
procedure Q;{nu se repeta tipul parametrilor lui Q}
begin P(5,6,7); end;
4.4.2 Funcii
n Pascal funciile snt aceleai subprograme ca i procedurile. Adic ca i n
cazul procedurilor, redactnd corpul unui subprogram-funcie o singur dat n partea
declaraiei subprogramelor, mai apoi putem apela la aceast funcie n orice loc al
programului principal, folosind numai numele funciei respective. ns exist i
diferene dintre proceduri i funcii. S-a spus c procedura calculeaz cteva valori, pe
cnd funcia- numai una, permind ca apelul ei s se fac chiar din expresia care are
nevoie de valoarea calculat. Adic n Pascal funcia este un subprogram, care
calculeaz i ntoarce programului apelant o singur valoare. n acelai timp snt
permise numai aa funcii, valorile crora snt de tipuri simple. n aa fel valoarea
46
unei funcii nu poate fi nici ntr-un caz un masiv, o mulime sau o orecare alt valoare
de tip compus.
n particular, orice expresie aritmetic sau logic n Pascal, care poate nici nu
folosete noiunea de funcie, determin o dependen funcional orecare. ns nu
orice dependen funcional poate fi redat n limbajul algoritmic folosind regulile
sintaxice matematice. n unele cazuri valoarea funciei este determinat de un proces
de calcul destul de complicat. De exemplu binecunoscuta dependena funcional din
matematc n! (factorial) este imposibil de redat n Pascal cu ajutorul unei expresii
aritmetice de forma 1*2*3**n din cauza restriciilor impuse de ctre sintaxa
acestui limbaj. Aceast problem este uor de rezolvat cu ajutorul unei consecutiviti
de operatori. De exemplu: y:=1; for i:=1 to n do y:=y*i;
i dac necesitatea folosirii acestei dependene funcionale ntr-un program Pascal
este ntlnit de mai multe ori, ar fi raional determinarea unei funcii pentru
calcularea ei i apelarea funciei n locul dorit. Sintaxa de declarare a unei funcii n
Pascal este urmtoarea: Function nume(parametri formali): tip_funcie; unde prin
parametri formali se subnelege lista numelor i tipurilor acestor parametri.
n Pascal este posibil declararea unei funii i fr parametri ca i n cazul
procedurii. Parametrii funciei (n caz c snt necesari) pot fi i parametri-valori i
parametri-adrese. Lista parametrilor are sintaxa identic ca i la procedur. Mai mult
ca att, tot ceea ce a fost spus la procedur despre parametri formali i actuali sau
domeniul de vizibilitate este aplicabil i n cazul funciei. Antetul funciei se termin
cu indicarea tipului valorii funciei descrise. Acest tip trebuie s fie un tip deja
predefinit n Pascal sau n prealabil declarat n programul principal. Rezultatul
calculat de o funcie este asociat numelui ei, care aa cum se vede din antet este
caracterizat de un tip concret. Numele funciei apare ca o variabil n cadrul blocului
unde a fost declarat funcia. De aceea numele funciei trebuie s fie folosit n cadrul
corpului funciei n partea stng mcar a unei atribuiri. Rezultatul funciei va fi
ultima valoare astfel atribuit. Apelul de funcie este un operand ntr-o expresie. El se
insereaz n locul n care este cerut valoarea calculat de funcie. Cnd expresia este
evaluat funcia este activat, iar valoarea operandului devine valoarea ntoars de
funcie.
n aa mod au fost desfurate cele 3 deosebiri sintactice la declarare dintre
procedur i funcie:
1) Descrierea funciei se ncepe cu cuvntul cheie function
2) n antetul funciei este indicat tipul valorii descrise de funcie.
3) Corpul funciei trebuie s conin mcar o instruciune de atribuire, n partea stng
a creie figureaz numele funciei i aceast instruciune trebuie s fie executat.
Adic valoarea funciei trebuie s fie schimbat in interiorul su. Ca exemplu s
descriem funcia n!(factorial) cu ajutorul unei funcii Pascal.
Program factorial1;
Var z:integer; s:real;
Function fact(n:integer):integer;
Var i,k:integer;
Begin k:=1; for i:=1 to n do k:=k*i; fact:=k; end;
Begin writeln(culege o cifr ntreag); readln(z);
47
48
{$F+}
program tip;
type tipf : function(x,y:integer):integer; {funcie fara nume}
var varf:tipf;
procedure apelparf(fpar:tipf; x,y:integer);
begin writeln(fpar(x,y));{apel parametru functie} end;
function aduna(x,y:integer):integer;
begin aduna:=x+y; end;
function scade(x,y:integer):integer;
begin scade:=x-y; end;
begin {apel direct}
apelparf(aduna,2,3); apelparf(scade,2,3);
{apel indirect}
varf:=aduna;{o atribuire, nu un apel} apelparf(varf,4,5);
varf:=scade; apelparf(varf,4,5); end.
Observaii:
- Folosirea variabilelor de tip procedur sau funcie este permis numai atunci cnd
compilarea se face sub controlul directivei {$F+}.
- O declaraie de procedur/funcie genereaz implicit o variabil de tip
procedur/funcie. Numele acestei variabile este chiar numele folosit n declaraie.
Variabila astfel generat conine adresa codului obiect generat de declaraia de
procedur/funcie,
- Dac parametrul actual este o variabil de tip procedur/funcie, parametrul formal
corespunztor trebuie s fie de tip procedur/funcie. Listele de parametri trebuie
s fie compatibile (acelai numr, nume i tip de parametri; la funcii trebuie s
coincid i tipul valorilor retunate).
4.4.4 Apel recursiv de subprograme
Folosirea numelui procedurii (funciei) n cadrul textului procedurii (funciei)
se numete apel recursiv de procedur (funcie), lucru permis n limbajul Pascal.
Menionm totui c folosirea tehnicilor recursive nu constituie ntotdeauna soluiile
optime. n exemplul urmtor se apeleaz recursiv funcia putere, destinat calculrii
bazei la puterea exponent:
program testputere;
function putere(baza,exponent:integer):integer;
begin
if exponent <= 0 then putere:=1
else putere:=baza*
putere(baza,exponent-1); end;
begin writeln('2^4=',putere(2,4)); end.
Observaii: La orice apel de procedur n stiv vor fi depuse urmtoarele informaii:
- adresa de retur (adic adresa instruciunii ce urmeaz dup apel);
- valorile parametrilor transmii prin valoare;
- adresele parametrilor variabili
Astfel, la apeluri recursive, spaiul ocupat din stiv va crete rapid, riscnd depirea
spaiului rezervat stivei. La programe recursive se recomand activarea controlului de
depire de stiv prin directiva de compilare {$S +}.
49
BIBLIOGRAFIA
Nr.
crt.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
..
1991
-
..
1992
--
..
1990
. .
1992
.
1990
,
..
1991
50