Sunteți pe pagina 1din 50

Universitatea Tehnic a Moldovei

Catedra Sisteme Optoelectronice

Programare
Ciclu de prelegeri

Limbajul de programare Pascal

Chiinu 2001

Adnotare

Pentru studenii anului I i II , facultatea de Radioelectronic


specializrile IMT i SOE (de zi i fr frecven)

Alctuitor: lector asistent Sergiu Istrati

Redactor responsabil: conf. univ. dr. Pavel Nistiriuc

Recenzent: conf. univ. dr. Veaceslav Sidorenco

U.T.M.,2001

Tema 1: Scurt istoric al apariiei calculatoarelor


Activitile mintale efectuate de ctre oameni necesit uneori un volum de
munc foarte mare i un procent de inteligen mediu sau sczut. Multe dintre aceste
activiti necesit calcule elaborate. Pe parcursul timpului matematicienii au ncercat
s creeze maini, care s efectueze aceste calcule automat, lsnd astfel oamenilor
timpul necesar pentru a se concentra asupra problemelor eseniale. Dar cu toate
eforturile depuse, mainile automate de calcul sau, cu alte cuvinte, calculatoarele, au
aprut doar n momentul n care tehnologia a permis acest lucru, pe la mijlocul anilor
40 ai secolului XX. ns pn n acel moment au fost puse bazele tehnicii de calcul
mederne.
In 1641 matematicianul i filosoful Blaise Pascal inventeaz o main de calcul
care putea efectua primele dou ecuaii aritmetice elementare cu ase cifre zecimale.
Cu cteva decenii mai trziu, n 1671 aceast maina este perfecionat de
matematicianul Wilhelm Leibnitz, asigurnd-o cu patru operaii aritmetice.
In 1823, matematicianul i economistul englez Charles Babbage a cnceput
construcia mainii difereniale, care a fost conceput pentru realizarea automat a
tabelelor matematice necesare n navigaie. Calculatorul era capabil de a rula un
singur algoritm. Din necesitatea de a crea un calculator de uz general, n 1834 el a
conceput maina analitica. In 1834 Babbage elaboreaza proiectul mainii analitice,
care conine unitile de baz ale unui calculator modern:
- memoria (numit i depozit )
- unitatea aritmetic ( moara sau fabrica )
- unitatea de comand
- dispozitivele de intrare ieire.
Aceast main putea memora 1000 numere a cte 50 cifre zecimale i realiza
adunarea a dou cifre ntr-o secund, iar nmulirea - intr-un minut.
Primul dispozitiv de calculator cu o comand-program este realizat de savantul
german Konrad Zuse n 1941. Programul era memorat pe o band de cinematograf i
era citit serial. Calculatorul era construit din 2600 releuri, putea numra 64 cifre a
cte 22 cifre binare.
In 1946 n SUA firma "Bell Telephone" realizeaz mai multe calculatore.
Primul calculator se numea Bell-v. El era construit din 9000 de relee i ocupa o
suprafa de 90 m2 avnd masa de 10 tone.
n 19431946 se construiete primul calculator electronic universal , ce se
numea ENIAC (Electronic Numerical Integrator And Computer). Calculatorul
coninea 18 mii tuburi electronice i 1500 relee, suprafaa era de 135 m2, cu masa de
30 tone. Structura i principiile de funcionare ale unui calculator modern au fost
propuse de americanul Neumann: un calculator modern universal trebuie s includ
dispozitivul aritmetic, dispozitivul de comand, memoria i unitile de intrareieire.
Astfel n memorie se vor nmagazina nu numai datele de prelucrare, dar i programul.
Instruciunile unui program se ncarc n memorie n acela mod ca i datele de
prelucrat. Dupa nceperea procesului de calcul instruciunile din memoria
calculatorului vor fi extrase i executate automat.
3

n ceea ce privete dezvoltarea tehnicii de calcul n timp, ea a cunoscut mai


multe etape, respectiv generaii de calculatoare:
Prima generaie de calculatoare o constituie calculatoarele proiectate n baza
tuburilor electronice (pn n 1959). Aceste calculatoare aveau un volum mare, vitez
de calcul redus (circa 1000 operaii/sec.), capacitate de memorare redus,
programabile n limbaj-main.
Generaia a doua cuprinde calculatoarele realizate ntre anii 1959-1964, locul
tuburilor fiind luate de tranzistoare. Drept consecin volumul calculatorului s-a
micorat, iar viteza de funcionare a crescut simitor, de asemenea a crescut i
capacitatea memoriei, s-au extins si posibilitile de programare: a aprut posibilitatea
programrii n limbajele Assembler, Cobol, Fortran; volumul sporit de memorie a
stimulat lucrrile ndreptate spre automatizarea programrii calculatoarelor; au aprut
primele sisteme operaionale. Exemple de calculatoare de generaia a doua snt
Minsk-22, Minsk-32, -4, -6.
Generaia a treia a aprut n anii 1964-1972. La baza acestor calculatoare stau
circuitele integrate, datorit crora dimensiunile calculatoarelor au sczut cu mult,
viteza de lucru i capacitatea memoriei au crescut cu cteva ordine.
Din anul 1972 pna n 1980 calculatoarele proiectate aparin generaiei a patra.
Ca element de baz servete microprocesorul i alte circuite integrate mari.
Din 1980 pna n zilele noastre se dezvolt generaia a cincea de calculatoare,
la baza proiectrii crora stau circuite integrate foarte complicate i cu capaciti de
lucru foarte mari. Aceste circuite conin sute de mii de tranzistoare n corpul lor,
avnd dimensiuni foarte mici.
Parametrii principali ce caracterizeaz un calculator modern snt: Memoria
operativa RAM(Mb), Memoria permanenta ROM(Gb),Frecventa de lucru(MHz).
Tema 2: Concepii generale despre calculatoare
2.1 Principiul de funcionare al calculatoarelor i structura lor.
Dei un calculator este ansamblul de dispozitive i circuite foarte diverse i
complicate, studiul funcionrii lui este mult uurat prin faptul, c circuitele
componente snt grupate n uniti avnd funcii mai complexe bine precizate.
Structura clasic a calculatorului este urmatoarea:
unde UAL - unitate aritmetic-logic;
UC - unitate de control sau dirijare;
(UC+UAL=procesor);
M - memoria;
I/O - dispozitive de intrare/ieire (input/output).
Pentru a nelege mai bine principiul de funcionare a unui calculator, o vom face pe
baza analizei lucrului unui program introdus n memoria calculatorului. Deci, avnd
un text al unui program scris ntr-un limbaj orecare, prin intermediul dispozitivelor de
intrare (tastatura, unitatea de disc flexibil, .a) el se introduce n memoria
calculatorului, de unde este citit i procesat de ctre unitatea aritmetic-logic; apoi
datele rezultante snt scoase la rspuns prin intermediul dispozitivelor de ieire
(monitorul, imprimanta .a). Toate aceste operaii snt efectuate sub supravegherea
unitii de control.
4

Din punct de vedere a dispozitivelor de baz, calculatorul modern este alctuit


din urmatoarele componente :
- unitatea central, menit sa gestioneze funcionarea ntregului sistem;
- monitorul, destinat afirii datelor alfanumerice i grafice;
- tastatura , a carei destinaie este introducerea datelor sau programelor;
- unitile de discuri flexibile;
- unitile de discuri rigide;
n afar de componentele de baz la un calculator personal mai pot fi
conectate:
- imprimanta - unitate pentru tiprirea pe hartie a informaiilor alfanumerice i
grafice;
- oricelul sau mouse-ul, a carui destinaie este facilitatea proceselor de introducere
a informaiei i de manipulare a programelor;
- videomaneta sau joistik, utilizat n dispozitivele de antrenament i diverse
simulatoare, la animarea jocurilor pe calculator;
- scanerul, a carui destinaie este copierea imaginii de pe hrtie n memoria
calculatorului;
- alte dispozitive ce uureaz lucrul la calculator.
2.2 Destinaia dispozitivelor de baz.
Unitatea central a calculatorului se compune din microprocesorul central,
memoria operativ RAM, controlere i porturile de intrare/ieire (I/O).
Microprocesorul central determin viteza de lucru a calculatorului. n cazul
microprocesoarelor slabe, cum ar fi INTEL8088, INTEL80286, INTEL80386 nu
exist comenzi speciale pentru efectuarea operaiilor complicate (n virgul flotant)
i se recomanda folosirea coprocesoarelor aritmetice, care mresc viteza de lucru de
5-15 ori. Cu apariia procesoarelor Pentium aceasta problem dispare i vitezele se
mresc simitor.
n memoria operativ se ncarc temporar componentele sistemului de operare
necesare la un moment dat, precum i programul utilizatorului cu datele acestuia.
Datele se pstreaz n memoria operativ pn la rencrcarea calculatorului, apoi
dispar. Capacitatea memoriei operative se masoar n octei (bytes). Un octet
reprezint o structura de memorie de 8 poziii (celule), numite bii.(1Kb=1024 octei,
1Mb=1024Kb). Calculatoarele personale actuale au o memorie operativ ntre 8Mb i
256Mb (pe cnd 30 pagini Word formatate = 250 Kb, 1 pagina text=2.5Kb).
Controlerele reprezint dispozitive electronice care controleaz activitatea
imprimantei, monitorului, unitilor de disc flexibil i rigid etc.
Porturile de inrare/ieire (I/O) realizeaz schimbul de date ntre unitatea
central i unitile periferice. Porturi I/O exist de 2 feluri: paralele (LPT1, LPT2 )
i seriale asincrone (COM1, COM2 ). Porturile paralele efectuiaz operaiile de I/O
cu o vitez mai mare dect porturile seriale, dar necesit un numar mai mare de
circuite pentru schimbul de date. La porturile I/O se pot conecta diferite dispozitive
periferice: imprimanta, mouse-ul, scaner-ul, joistik-ul, tastatura, monitorul, etc.
Unitile de discuri flexibile asigur scrierea i citirea informaiei pe dischete.
Dischetele snt purttori de informaie, ce permit transportarea ei de la un calculator
5

la altul, pstrarea ei n form de copii de arhiv etc. Capacitatea dischetelor se


masoar n Kb i Mb. n prezent cele mai rspndite snt dischetele cu capacitatea de
1.44 Mb avnd diametrul de 3.5 inches (89 mm). Mai exist i dischete cu diametrul
de 5.25 inches (133 mm) cu o capacitate de 360Kb, 720Kb, 1.2Mb. nainte de a pune
n aplicare, dischetele trebuie formatate. Formatarea dischetelor se realizeaz cu
ajutorul comenzii FORMAT al SO MS-DOS. Este de menionat faptul c fiecare
model de unitate de disc flexibil este calculat i destinat pentru folosirea unui anumit
tip de dischete.
Unitile de discuri rigide servesc la pstrarea permanent a informaiei n
calculator: programe, chituri de instalare, editori de texte i alte produse soft,
documente importante n form textual, grafic. Discurile rigide snt fixate. Din
punct de vedere al utilizatorului discurile rigide se deosebesc prin durata de acces i
capacitate (volumul de informaie care poate fi stocat pe disc). Calculatorul IBM
PC/XT posed disc rigid cu capacitatea de zeci Mbytes, iar discul rigid al
calculatorului IBM AT are o capacitate de sute Mbytes. Calculatoarele moderne
posed discuri rigide cu o capacitate de ordinul Gbytes.
Durata de acces este timpul necesar unitii de disc pentru a poziiona capul
pentru citire-scriere pe pista indicat i pentru a citi sectorul cerut de unitatea
central. Durata de acces la discului rigid al calculatorului cu procesor intel 80386
este aproximativ egal cu 12-25 ms.
n sistemele de operare ale calculatoarelor unitile de disc se noteaz prin
litere latine urmate de simbolul ":". Ex: A:,B:,C:,D:, Z: .
Imprimanta este unitatea periferic destinat tipririi informaiei. Toate
imprimantele pot tipri informaii numerice i grafice, alb-negru i color. Exist mai
multe tipuri de imprimante:
- matriciale;
- cu jet de cerneal;
- laser.
Imprimanta matricial are un cap de tiprit care conine un set de ace metalice
subiri, care la momentul dat lovesc prin banda de tiprire n foaia de hrtie. La
imprimanta cu jet de cerneal caracterele tiprite se formeaz din picturi
microscopice pulverizate pe hrtie de nite duze speciale. Ele asigur o calitate destul
de nalt a tiparului i snt comode pentru imprimarea color. Viteza de imprimare este
comparabil cu cea a imprimantelor matriciale. Preul imprimantelor cu jet de
cerneal este mai mare ca la cele matriciale. Imprimanta laser asigur cea mai bun
calitate a tiparului. La baza acestor imprimante se afl principiul de xerografie.
Caracterul se imprim pe un cilindru pe care a fost format, prin intermediul
semnalelor electrice cu vopsea special - toner. Viteza de tiprire este mai mare ca la
primele 2 tipuri de imprimante i constituie 3-15 sec. pentru o pagina. Aceste
imprimante snt cele mai scumpe.
Monitorul e destinat afirii pe ecran a informaiei alfanumerice i grafice.
Exist monitoare color i monocolor. Ele pot funciona n dou moduri: alfanumeric
i grafic. n cazul regimului alfanumeric, ecranul e imprit n zone convenionale
numite zone caracter. De obicei aceste zone alcatuiesc 25 linii cu 80 caractere pe linie.
n fiecare zon poate fi afiat un singur caracter dintr-un set de 256 caractere. Printre
6

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

Efectund calculele respective se va realiza conversia numarului N(b) din baza


respectiv n baza zece . Ex:
(110.11) 10 =1*10 2 +1*10 1 +0*10 0 +1*10 1 +1*10 2 =110.15;
(110.11) 2 =1*2 2 +1*2 1 +0*2 0 +1*2 1 +1*2 2 =6.75;
(110.11) 3 =1*3 2 +1*3 1 +0*3 0 +1*3 1 +1*3 2 =12.444;
(110.11) 8 =1*8 2 +1*8 1 +0*8 0 +1*8 1 +1*8 2 =72.140625;
(110.11) 16 =1*16 2 +1*16 1 +0*16 0 +1*16 1 +1*16 2 =272.06640625;
Formal sistemul zecimal nu prezint nici un avantaj deosebit fa de celelate sisteme
de numeraie. Se presupune c acest sistem a fost adoptat din cele mai vechi timpuri
datorit faptului c procesul de numrare a folosit ca instrumente iniiale degetele
minilor.
O maina de calcul automat poate fi construit s lucreze n orice sistem de
numeraie. Pe parcursul dezvoltrii tehnicii de calcul s-a stabilit c cel mai avantajos
este sistemul binar. Acest sistem a fost preferat din urmtoarele motive:
- Simplitatea regulilor pentru operaiile aritmetice i logice.
- Materializarea fizic a cifrelor n procesul prelucrrii sau stocrii numerelor se
face mai uor pentru dou simboluri dect pentru zece: perforat-neperforat, contact
nchis - contact deschis, prezen de curent sau absen de curent etc.
- Circuitele care trebuie s diferenieze numai ntre 2 stri snt mai sigure n
funcionare dect cele care trebuie s diferenieze ntre zece stri.
n procesul dezvoltrii civilizaiei umane au fost create i sisteme de numeraie
nepoziionale. Drept exemplu poate servi sistemul roman, care utilizeaz cifrele
I,V,X,L,C,D,M. ntruct regulile de prezentare a numerelor i de efectuare a
operaiilor aritmetice snt foarte complicate, sistemele nepoziionale au o utilizare
foarte restrns.
2.3.2 Conversia numerelor dintr-un sistem n altul.
Conversia numrului (N) b n echivalentul su zecimal se efectuiaz conform
formulei : (N)b=Cnbn + Cn-1bn-1 + + C0b0 + C-1b-1+ C-mb-m .
Conversia numrului zecimal (N)10 n echivalentul su n baza b se efectuiaz
conform urmatoarelor reguli:
1) Pentru partea ntreaga. Se mparte la baza respectiv partea ntreag i cturile
obinute dup fiecare mprire, pna se obine ctul zero. Rezultatul conversiei
prii ntregi este compus din resturile obinute luate n ordinea invers apariiei.
2) Pentru partea fracionar. Se nmulete cu baza partea fracionar, apoi toate
prile fracionare obinute din produsul anterior pn cnd partea fracionar a
unui produs este zero sau pn la obinerea unui numr fracionar cu numrul de
cifre dup virgul dorit. Rezultatul conversiei prii fracionare este constituit din
prile ntregi ale produselor considerate n ordinea apariiei.
Analizm cteva exemple:
1) De efectuat conversia numrului zecimal 37.0625 n echivalentul su binar.
Pentru partea ntreag: 37:2=18+1/2; 18:2=9+0/2; 9:2=4+1/2; 4:2=2+0/2;
2:2=1+0/2; 1:2=0+1/2;
8

Pentru partea fracionar: 0.0625*2=0.125; 0.125*2=0.250; 0.250*2=0.5;


0.5*2=1.0;
Prin urmare (37.0625)10 = (100101, 0001);
2) De transformat numrul 43.9 din sistemul zecimal n sistemul binar.
Pentru partea ntreaga: 43:2=21+1/2; 21:2=10+1/2; 10:2=5+0/2; 5:2=2+1/2;
2:2=1+0/2; 1:2=0+1/2;
Pentru partea fracionar: 0.9*2=1.8; 0.8*2=1.6; 0.6*2=1.2; 0.2*2=0.4;
0.4*2=0.8; 0.8*2=1.6;
Observm c procesul nmulirii poate continua pn la infinit. n acest caz
rotungim cifra cu numrul de poziii dup virgul dorit. Deci (43.9)10 =
101011, 111001100)2 .
3) S se transforme (1456.40625)10 n sistemul octal.
Partea ntreaga: 1456:8=182+0/8; 182:8=22+6/8; 22:8=16+6/8; 16:8=2+0/8;
2:8=0+2/8;
Partea fracionar: 0.40625*8=3.25; 0.25*8=2.0;
Prin urmare : (1456, 40625)10 = (20660, 32)8 ;
4) S se efectuieze conversia numrului zecimal 3786,25 n echivalentul su
hexazecimal.
Partea ntreaga: 3786:16=236+10/16; 236:16=14+12/16; 14:16 =0+14/16;
Partea fracionar: 0.25*16=4.
Deci: (3786, 25)10 = (ECA, 4)16 .
2.3.3 Conversia numerelor din sistemul binar n octal,
hexazecimal i invers.
Deoarece 8=23, conversia din binar n octal i invers se poate face direct. Orice
cifr octal se reprezint prin 3 cifre binare: 0=000; 1=001; 2=010; 3=011; 4=100;
5=101; 6=110; 7=111.
Dac se consider un numar octal, pentru conversia lui n binar se va scrie
fiecare cifr octal prin 3 cifre binare. De exemplu:
(352, 451)8 = (011 101 010, 100 101 001)2 ;
(126, 23)8 = (001 010 110, 010 011)2 ;
(5, 065)8 = (101, 000 110 101)2 ;
Dac se consider un numr binar, pentru conversia lui n octal se vor grupa
cte 3 cifre binare pornind de la poziia virgulei spre stnga pentru partea ntreag,
respectiv spre dreapta pentru partea fracionar, gsind corespondentul n octal.
Pentru completarea unui grup de 3 cifre binare se pun zerouri naintea numrului
pentru partea ntreaga, respectiv dup numar pentru partea fracionar; aceste
schimbri a numrului nu vor modifica valoarea lui. Exemple:
(101, 100101)2 = (101, 100 101)2 = (5, 45)8 ;
(10, 10011)2 = (010, 100 110)2 = (2, 46)8 ;
(1010, 1010)2 = (001 010, 101 000)2 = (12, 50)8 ;
n mod similar se procedeaz i n cazul sistemului hexazecimal, baza cruia 16=24.
Orice cifr hexazecimal se reprezint prin 4 cifre binare:
0=0000; 1=0001; 2=0010; 3=0011; 4=0100; 5=0101; 6=0110; 7=0111;
8=1000; 9=1001; A=1010; B=1011; C=1100; D=1101; E=1110; F=1111;
9

Exemple de conversii hexazecimal binar:


(4B5F,B7)16 = (0100 1011 0101 1111, 1011 0111)2 ;
(A51, 3DE)16 = (1010 0101 0001, 0011 1101 1110)2 ;
Exemple de conversii binar hexazecimal:
(1011, 100111)2 = (1011, 1001 1100)2 = (B, 9C)16 ;
(10, 11011001)2 = (0010, 1101 1001)2 = (2, D9)16 ;
2.3.4 Operatii aritmetice n binar.
Operaiile aritmetice cu numerele binare, octale, hexazecimale difer de la un
sistem la altul. Cele mai simple snt operaiile cu numerele binare. Toate operaiile
aritmetice cu numerele binare snt bazate pe regulile de adunare, scdere i nmulire
binar, prezentate n tabel.
Operaii aritmetice cu numerele binare.
Adunarea binar
0+0=1
0+1=1
1+0=1
1 + 1 = 10

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

Pentru nsuirea mai uoar a temei, vom prezenta exemple concrete:


Ex.1: Adunarea n binar a numerelor zecimale 17 i 38:
Pentru a efectua adunarea binar a 2 numere zecimale, nti de toate ele vor fi
convertate n sistenul binar:
(17)10 = (10001)2 ; 17:2=8+1/2; 8:2=4+0/2; 4:2=2+0/2; 2:2=1+0/2; 1:2=0+1/2;
(38)10 = (100110)2 ; 38:2=19+0/2; 19:2=9+1/2; 9:2=4+1/2; 4:2=2+0/2;
2:2=1+0/2; 1:2=0+1/2;
Adunarea binar:
deci: (10001)2+(100110)2 = (110111)2
10001
iar (110111)2=1*25+1*24+0*23+1*22+1*21+1*20 =(55)10 ;
100110 +
110111
Verificare (17)10 +(38)10 = (55)10 ;
Ex.2: Efectuai adunarea binar a numerelor (26)10 si (23)10 ;
(26)10 = (11010)2 ; (23)10 = (10111)2 ;
Adunarea binar:
Deci (11010)2 + (10111)2 = (110001)2 ;
11010
Verificare : (110001)2 = (49)10 ;
10111 +
110001
(26)10 + (23)10 = (49)10 ;
Ex.3: De efectuat scderea n binar a numerelor zecimale: (45)10 (35)10 ;
(45)10 = (101101)2 ; (35)10 = (100011)2 ;
Efectum scderea:
101101
Deci (101101)2 - (100011)2 = (001010)2 ;
Verificm: (001010)2 = (10)10 ;
100011 001010
(45)10 (35)10 = (10)10 ;
10

La efectuarea adunrii i scderii binare a numerelor zecimale fracionare prile


ntregi i prile fracionare snt adunate sau scazute aparte.
Ex.4: nmulirea n binar a numerelor zecimale: (5, 125)10 * (2, 25)10 ;
Dup transformare primim: (5, 125)10 = (101, 001)2 ; (2, 25)10 = (10, 01)2 ;
Efectum nmulirea binar:
10,01
Am primit ca rezultat: (101, 001)2 * (10, 01)2 = (1011,10001)2 ;
101,001
1001
Verificm: (1011,10001)2 = (11, 53125)10 ;
0000
(5, 125)10 * (2, 25)10 = (11, 53125)10 ;
0000
1001
0000
1001
1011,10001
Ex.5: De efectuat mprirea binar a numerelor zecimale: (120)10 : (4)10 ;
(120)10 = (1111000)2 ; (4)10 = (100)2 ; Efectum mprirea binar:
1111000 |
100
100
|_______
Rezultatul este: (1111000)2 : (100)2 = (11110)2 ;
111
11110
100
Verificare: (11110)2 = (30)10 ;
110
100
(120)10 : (4)10 = (30)10 ;
100
100
0
Not: n cazul nmulirii sau mpririi virgula, care desparte partea ntreag de cea
fracionar este poziionat ca i n cazul sistemului de numeraie zecimal.
Operaii aritmetice se pot efectua de asemenea i asupra numerelor octale i
hexazecimale. Pentru uurarea proceselor de adunare, nmulire exist tabele cu
rezultatele adunrii i nmulirii a dou cifre dintr-un sistem sau altul. Aici nu vom
precuta efectuarea operaiilor n octal i hexazecimal, presupunnd studierea acestei
teme n viitor la un obiect specializat cum ar fi Tehnica numeric de calcul.
Tema 3: Metodica rezolvrii problemelor cu ajutorul calculatoarelor.
3.1 Etapele de rezolvare a problemelor cu ajutorul tehnicii de calcul
Orice problem, destinat rezolvrii cu ajutorul calculatorului, n procesul
realizrii sale neaprat trece prin cele 5 etape:
1. Alegerea modelului matematic
2. Elaborarea algoritmului
3. Verificarea algoritmului
4. Realizarea algoritmului
5. Verificarea programului
6. Documentarea programului.
11

1. Alegerea modelului matematic. Fiecare problem independent de complexitatea


sa sau de ramura disciplinii poate fi formulat matematic naintea rezolvrii sale.
Aceast formulare constituie modelul matematic al problemei. El este simplu sau
complicat dupa natura problemei n studiu. La alegerea modelului matematic
influieneaz urmatorii factori:
- marginea cunotinelor programatorului n ceea ce privete numrul metodelor.
- comoditatea prezentrii datelor.
- simplitatea datelor.
- posibilitile tehnicii de calcul.
Dup alegerea modelului matematic, problema n cauz se reformuleaz n termenii
obiectelor matematice corespunztoare.
2. Elaborarea algoritmului. Prin algoritm se nelege o mulime de reguli care
indic o succesiune de operaii necesare pentru rezolvarea unui tip specific de
probleme. Mulimea de reguli, care indic modul de obinere a rezultatelor,
constituie paii algoritmului. Execuia pailor algoritmului n ordinea cerut duce
la rezolvarea problemei. Orice algoritm are 3 proprieti de baza:
- Generalitate (const n faptul c algoritmul trebuie s fie realizat nu n caz
particular, ci n caz general, fiind luate n consideraie toate situaiile ce pot s
apar n tipul respectiv de probleme;
- Realizabilitate (este calitatea care scoate n eviden faptul, c tot ceea ce se
ntreprinde este exprimat corect, adic posibil de realizat);
- Finitudine (nseamn c ntr-un timp finit rezolvarea problemei ia sfrit, adic
n cadrul algoritmului lipsesc procese ce duc mersul rezolvarii n impas ciclic).
Orice algoritm mai are date de intrare, n urma prelucrrii crora se capt datele
rezultante - de ieire. n ceea ce privete reprezentarea algoritmului, exist o mare
varietate de forme. Cele mai rspndite din ele snt: a)reprezentarea cu ajutorul
schemelor logice, b) reprezentarea cu ajutorul unui limbaj de tip pseudocod, etc.
Reprezentarea algoritmului sub forma de schem logic folosete urmatoarele
elemente logice:
1. START/STOP. Bloc-delimitator. Indic nceputul/sfritul schemei.
2. Bloc de atribuire.
3. Bloc de intrare. Pune n eviden o operaie de citire a datelor.
4. Bloc de ieire. Indic necesitatea scoaterii datelor pentru a le vizualiza.
5. Blocul de condiie(decizie).
6. Blocul de procedur. Indic corpul unui subprogram
ncorporat n cel principal.
7. Blocul de ciclu FOR. Destinat realizrii proceselor
ce necesit cteva repetri.
12

8. Nod. Este folosit n cazul interseciei i suprapunerii sgeilor


ntr-un punct.
9. Elementul de trecere pe alt foaie ( bloc de legtur).
10. Sgeata de legatur ntre blocuri.
ntre elementele schemei logice de calcul snt unele grupri pentru reprezentarea
proceselor mai complicate folosindu-se elementele prezentate mai sus.
3. Verificarea algoritmului. Este una din cele mai complicate etape. Presupune
verificarea corectitudinii mersului rezolvrii, ncercarea algoritmului cu diferite
date de intrare, i echivalena rezultatelor primite prin alte metode de rezolvare.
Algoritmul se descrie sub pai numerotai (0n) i se face analiza, controlul i
motivaia fiecrui pas, de asemenea este necesar demonstrarea faptului c
algoritmul este finit(pentru aceasta trebuie controlate toate datele potrivite i
primite rezultatele respective.
4. Realizarea algoritmului. Presupune analiza profund a sarcinilor algoritmului,
alegerea limbajului de programare i traducerea algoritmului n limbajul respectiv.
5. Verificarea programului. Pentru verificarea unui program cele mai utilizate
metode snt: a)metoda analitic, b) metoda constructiv, c) metoda testrii. Ne
oprim la metoda 3.
Testarea programului este nsoit de depanarea lui. Depanarea stabilete cauzele,
care au determinat apariia erorilor i const n folosirea unor metode i
instrumente pentru nlturarea lor. n cazul limbajului BP7.0 depanarea se face cu
ajutorul compilatorului ncorporat n mediul BP.
6. Documentarea programului. Prevede descrierea metodei algoritmului, a
programului, a tuturor variabilelor folosite, construciilor logice, rezultatelor
obinute i indicaii pentru lucrul cu programul.
Tema 4:Limbajul de programare Pascal
4.1 Noiuni generale
4.1.1 Alfabetul, vocabularul i sintaxa limbajului.
Numim limbaj de programare un limbaj prin care putem comunica unui
calculator metoda de rezolvare a unei probleme. Iar metoda de rezolvare a problemei,
dupa cum tim deja o numim algoritm. ntreaga teorie informatic se ocup, de fapt,
cu elaborarea unor noi calculatoare, limbaje de programare i algoritmi. Datoria
oricrui limbaj de nivel nalt este s ne pun la dispoziie o sintax ct mai comod
prin care s putem descrie datele cu care lucreaz programul nostru i instruciunile
care trebuiesc executate pentru a rezolva o anumit problem.
Limbajul de programare Pascal, ca i orice alt limbaj de programare i are
alfabetul su i specificul de utilizare a simbolurilor. Alfabet al unui limbaj de
programare se numete un set de simboluri permis pentru utilizare i recunoscut de
compilator, cu ajutorul cruia pot fi formate mrimi, expresii i operatori ai acestui
limbaj de programare. Alfabetul oricrui limbaj de programare conine cele mai
13

simple elemente cu semnificaie lingvistic, iar sintaxa limbajului definete modul n


care se combin elementele vocabularului pentru a obine fraze corecte (instruciuni,
secvene de instruciuni, declarri de tipuri, variabile, constante, etichete, funcii,
proceduri etc.).
Elementele vocabularului snt alctuite din caractere. Orice caracter este
reprezentat n calculator, n mod unic, printr-un numr natural cuprins ntre 0 i 127,
numit cod ASCII.
Alfabetul limbajului de programare Pascal este compus din:
1. Simboluri folosite pentru formarea identificatorilor:
literele mari i mici ale alfabetului latin,
cifrele arabe de la 0 la 9,
simbolul de subliniere __ (cod ASCII:95).
2. Simboluri de desprire:
simbolul spaiu(cod ASCII:32).Are funcia de desprire a cuvintelor cheie
i numerelor.
simboluri de conducere (ASCII:031), se pot folosi la descrierea
constantelor. Simboluri tabulare (ASCII:9) i simbolul de trecere n alt rnd

{a := b + c D

a := b
.
+
c

e identic cu

3. Simboluri speciale care ndeplinesc anumite funcii n alctuirea diferitor


construcii ale limbajului de programare Pascal
+ * / { } [ ] ( ) < > . , : ; ^ @ # $
4. Simboluri compuse grupe de simboluri, recunoscute de ctre compilator ca un
tot ntreg:
<= => := (*
*) (. .) ..
,
5. Simboluri neutilizate. Simboluri ale tabelei ASCII extinse (cod
128255). Aici se conin literele alfabetului rus, simboluri de pseudografic, i
cteva simboluri ale tabelului ASCII (Ex.: & , ! , % , ~ , i altele).Ele nu intr
n alfabetul limbajului, dar pot fi folosite n textul comentariilor, n textul
mesajelor.
Vocabularul limbajului de programare Pascal.
Cele mai simple elemente, alctuite din caractere i care au semnificaie
lingvistic snt unitile lexicale. Acestea formeaz vocabularul limbajului.
Distingem urmtoarele uniti lexicale:
- simboluri speciale, identificatori, numere, iruri de caractere, etichete, comentarii,
directive;
- simboluri speciale;
- cuvintele cheie:
and array begin case const div do downto else end file for function goto if in label
mod nil not of or origin otherwise packed program record repeat set then to type
until var while with etc.
Cuvintele cheie snt rezervate, adic snt utilizate n program doar cu
semnificaia dat explicit prin definiia limbajului. Celelalte simboluri speciale snt
folosite ca operatori i delimitatori.
14

Identificatorii snt nume asociate constantelor, variabilelor, tipurilor de date,


procedurilor i funciilor. Primul caracter al numelui este o liter sau $, iar celelalte
snt litere, cifre, semnul $ sau .
Numerele pot fi de tip ntreg sau real. Numerele de tipul ntreg desemneaz
numere ntregi i snt scrise n reprezentare zecimal, precedate sau nu de semnele +
sau . Numerele de tipul real desemneaz numere raionale cu numr finit de
zecimale. n mod uzual ele snt reprezentate prin numere fracionare(n baza 10) cu
partea fracionar separat de partea ntreag prin punct. La scrierea numerelor de
tipul real se poate utiliza i un factor de scal. Acesta este un numr ntreg precedat
de litera E (Ex. 7,354E+02) i are efectul de nmulire a numrului real cu 10 la
puterea egal cu valoarea factorului de scal.
irurile de caractere snt iruri de caractere imprimabile, delimitate de
apostrof, n irul de caractere, apostroful apare dublat. Ex. ir de caractere
Etichetele snt iruri de cifre zecimale. Ex. 1, 01, 20, 0.
Comentariile snt iruri de caractere precedate de { i urmate de }.
Comentariile conin informaie despre:
numele fiierului n care se pstreaz programul,
o descriere scurt a destinaiei programului,
drepturile de autor,
limbajul de programare folosit,
versiunea programului,
nsemnri despre destinaia unor pri a programului etc.
Directivele snt cuvintele rezervate
forward, external, nonpascal i
%include.
n scrierea oricrei uniti lexicale nu se face distincie ntre literele mari i mici.
La scrierea consecutiv a identificatorilor, a cuvintelor cheie, a literelor numerice ele
trebuie s fie desprite de (spaiu).
Prin sintaxa unui limbaj de programare se nelege, n general, un ansamblu de
reguli de agregare a unitilor lexicale pentru a forma structuri mai complexe
(instruciuni, declaraii, programe etc.). Forma general a unui program n limbajul de
programare Pascal de asemenea i are regulile ei de sintax dup cum urmeaz: un
antet, urmat de o parte declarativ i de o instruciune compus. i pentru descrierea
n detaliu a acestor componente snt necesare, desigur i alte reguli.
4.1.2 Structura general a unui program
Programele, scrise n limbajul de programare Borland Pascal 7.0 se compun
conform unor reguli extinse i puin mai slabe ale sintaxei standardului limbajului de
programare Pascal. ns i aceste reguli trebuie neaprat s fie respectate. Structura
general a unui program n limbajul de programare Pascal se poate mpri n cteva
pri de baz:
antetul de program ,
partea declarativ ,
partea procedurilor i funciilor,
partea blocului principal.
care snt amplasate n cadrul programului n urmtorul mod:
15

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

n partea de declarare a etichetelor se conin, desprite prin virgul, numele


etichetelor de trecere, care nu trebuie s fie dublate. Numele etichetei de trecere poate
fi un numr ntreg (0..9999), un ir de caractere sau o construcie din numere i
caractere. Ex.: LABEL 1, 2, a, b, 1a, 2b;
Descrierea constantelor ce vor fi folosite n program are loc n seciunea
CONST. Constantele pot avea orice nume compus din caractere sau construcii din
caractere i cifre. ns n orice caz un nume de constant nu poate ncepe cu o cifr.
Dup numele constantei urmeaz semnul = dup care este specificat valoarea
constantei. O constant poate avea valoare de diferite tipuri:
ntreg, real, caracterial etc. Ex.: CONST a=19; AN=1998; MONTH=Iulie; pi=3.14.
Partea de descriere a tipurilor permite programatorului s determine tipuri noi n
program.
Ex.: TYPE zi = (luni, mari, miercuri, joi, vineri, smbt, duminic);
Partea de descriere a variabilelor globale conine lista variabilelor folosite n
cadrul programului cu indicarea tipurilor lor.
Ex.: VAR A,B,C:INTEGER; NUME:REAL;
Prile LABEL, CONST, TYPE i VAR se pot plasa n program n ordine aleatoare.
3. Proceduri i funcii.
Procedur i funcie snt termenii n Pascal ce se folosesc pentru identificarea
ntr-un mod special a unei consecutiviti de instruciuni(subprograme). Dac n
program se folosesc proceduri (funcii), atunci e necesar de descris antetul lor
indicnd lista parametrilor folosii de ele (aa ca tipul sau valoarea variabilelor). n
aa fel se realizeaz posibilitatea chemrii unei proceduri/funcii cu diferite date i
din diferite locuri a programului. Ex.: Procedure suma (VAR sum: INTEGER; VAR
x, y: INTEGER); n interiorul procedurii se poate de declarat etichete, constante,
tipuri, variabile care vor fi accesibile numai n interiorul procedurii/funciei unde au
fost declarate. Corpul (blocul principal) funciei/ procedurei joac acelai rol ca i
corpul programului. i are ca hotare cuvintele cheie BEGIN i END, cu o deosebire
c dup END urmeaz ; i nu .
4. Corpul (blocul principal) programului.
Corpul programului const dintr-o succesiune de operatori, lucrul programului
ncepndu - se de la primul operator. Corpul este mrginit de cuvintele cheie BEGIN
i END care pot conine n interior operatori, diferite construcii, apelri la
funcii/proceduri i aceleai construcii BEGIN_END incluse una n alta , dar cu ;
la sfrit .Variabilile,constantele,etichetele,tipurile noi pot fi folosite n program
numai n cazul declarrii la nceput.
4.2 Tipuri de date.
Un program n limbajul Pascal conine o descriere a aciunilor ce trebuie s
fie executate de calculator i o descriere a datelor ce snt prelucrate de aceste aciuni.
Aciunile snt descrise prin instruciuni, iar datele prin declaraii(sau definiii). Prin
tip de date se nelege o mulime de valori care pot fi atribuite unei variabile sau
constante. Pe tipurile de date ale unui program se definesc o serie de operaii,
rezultatul fiind o algebr multisortat avnd ca domenii aceste tipuri. Se disting trei
categorii de tipuri de date: simple(elementare), compuse(structurale) i de
17

referin(pointer). n general, tipurile de date snt definite explicit prin declaraiile


TYPE, iar operaiile asociate - prin declaraiile FUNCTION sau PROCEDURE, i
snt specifice programului n care apar. Exist ns tipuri de date elementare de
interes mai general, numite tipuri predefinite a cror definiie se consider cunoscut
i nu cade n sarcina programatorului. O serie de operaii relative la aceste tipuri snt
deasemenea predefinite.
4.2.1 Tipuri de date simple
Exist 3 categorii de tipuri simple: predefinite,
subdomeniu(interval). Tipurile simple se mai numesc scalare.

enumerate

4.2.1.1 Tipuri predefinite .


Exist 5 tipuri de date simple predefinite: INTEGER, REAL, BOOLEAN,
CHAR, TEXT,.
Tipul INTEGER este o mulime de numere ntregi ntre cel mai mic i cel
mai mare numr ntreg, ce se pot reprezenta pe un calculator. Adic orice numr
ntreg N trebuie s respecte condiia: maxint <= N< = +maxint . Prelucrarea unui
numr ntreg din afara acestui diapazon duce la rezultat greit sau la stoparea
executrii programului. Asupra numerelor ntregi se pot efectua urmtoarele operaii
de baz, rezultatul crora de asemenea este un numr ntreg. Toate aceste operaii se
ndeplinesc asupra 2 argumeni i snt urmtoarele :+ adunarea; scderea; *
nmulirea; div mprirea fr rest; mod restul de la mprire;
Ex.: 3+5=8 ; 5-3=2 ; 5*3=15 ; 5div2=2 ; 5mod2=1;
Dup gradul de ndeplinire aceste operaii snt aranjate n felul urmtor:
(*,div, mod, + i ). Mai exist i alte operaii asupra numerelor ntregi cu un grad
mai jos: ABS(x); x ntreg, rezultatul-modulul lui x; SQR(x); x-ntreg, rezultatulptratul lui x; TRUNC(x); x-real, rezultatul-partea ntreag a lui x; ROUND(x); xreal, rezultatul-valoarea rotungit a lui x: pentru x>0 round(x)=trunc(x+0,5); pentru
x<0 round (x)= trunc (x-0,5). Deoarece tipul ntreg este ordonat, asupra numerelor
ntregi se pot aplica i funciile: SUCC(x); rezultatul: urmtorul numr ntreg dup x;
PRED(x); rezultatul: numrul precedent lui x. Adic operaiile i funciile ce pot fi
aplicate asupra numerelor ntregi i dau un rezultat ntreg snt: *; DIV; MOD; +; ;
ABS(X); SQR(X); TRUNC(X); ROUND(X); SUCC(X); PRED(X).
Tipul REAL este mulimea numerelor reale i ocup un loc deosebit printre
tipurile scalare. n particular tipul real nu-i ordonat i funciile SUCC(X) i PRED(X)
nu se aplic. n comparaie cu tipul ntreg, tipul real conine o submulime infinit de
numere reale. Numerele reale se reprezint incorect n calculator (cu aproximaie).
Din aceast cauz i operaiile asupra lor se execut incorect (adic dup regulile
aproximaiei). i se recomand ca operaia de comparare a valorilor tipului real s fie
ignorat din pricina unui rezultat incorect.
Urmtoarele operaii au un rezultat real cu condiia c cel puin un argument
va fi real, iar cellalt ntreg: (+) adunarea; () scderea; (*) nmulirea; (/) mprirea.
Rezultatul va fi real chiar dac ambii argumeni vor fi reali. Mai exist n Pascal
funcii ce au un rezultat real independent de tipul argumentului: SIN(X); COS(X);
18

ARCTAN(X); LN(X); EXP(X); SQRT(X). Funciile ABS(X) i SQR(X) de


asemenea au rezultat real cu un X real. Formatul numerelor reale este:
Ex.: 7.34501E+03;
Tipul BOOLEAN conine dou elemente referite prin constantele
predefinite FALSE i TRUE. Operaiile predefinite ale acestui tip snt AND,OR i
NOT i definesc o structur de algebr boolean. Tipul este succesiv n ordinea:
FALSE<TRUE; 0<1. Operaiile logice AND(conjuncie), OR(disjuncie), NOT
(negaie) se pot aplica asupra unor argumeni deasemenea logici i au un rezultat
logic.
Conjuncie: AND:
Disjuncie: OR:
Negaie: NOT:
X Y X&Y
X
Y X vY
X
X
1 1
1
1
1
1
1
0
1 0
0
1
0
1
0
1
0 1
0
0
1
1
0 0
0
0
0
0
n Pascal exist funcii ce au un rezultat logic: ODD(X) dac numrul
ntreg(x) este impar, rezultatul va fi : true, n caz contrar - false.
EOLN(F) = true dac cursorul se afl la sfritul unui rnd, altfel - false.
EOF(F) = true dac cursorul e la sfritul fiierului, n caz contrar - false.
Tipul CHAR este o mulime finit i ordonat de caractere ce conine
litere, cifre i caracterul spaiu, adic toate caracterele ASCII. Deoarece tipul char
este o mulime ordonat snt caractere cu index (numr de ordine) mai mare i mai
mic. Conform numerelor de ordine elementele tipului char snt aranjate astfel:
A<a<B<b<<Z<z<0<1<<9<?.
E
posibil
i
altfel
de
ordine
0<1<2<<9<a<b<c<<z<?<A<B<<Z.
Ordinea conform numrului de ordine a elementelor tipului CHAR depinde
de realizarea limbajului.
O constant de tip CHAR este un element al mulimii CHAR delimitat de apostrof.
Exemplu: 7;f;A.
Pentru reprezentarea direct i indirect a mulimii CHAR exist 2 funcii:
ORD(X)ntoarce numrul de ordine al caracterului x n mulimea char.
CHR(I) ntoarce caracterul cu numrul de ordine i.
n Pascal nu exist careva operaii asupra tipului char care ar avea i
rezultatul char. Funciile PRED i SUCC aici snt valabile. Pentru primul(ultimul)
element al mulimii char funcia pred(succ) nu-i determinat. Asupra elementelor
mulimii char se pot aplica operaiile de comparare.
4.2.1.2 Tipul enumerare
Un tip enumerat este o mulime ordonat de valori specificate prin
identificatori. Aceast specificare are forma: (id1, id2,, idn) i induce o relaie de
ordine astfel c id(i)<id(j) pentru i<j;
Ex.: type lun =(ianuarie, februarie, martie, aprilie, mai, iunie, iulie, august,
septembrie, octombrie, noiembrie, decembrie);
var a: lun; B: real;
19

Operaiile aplicabile elementelor de tip enumerare snt cele relaionale(=,<,>,


<=,=>,<>), i funciile succ, pred, ord; (ord(id1)=0).
4.2.1.3 Tipul subdomeniu (interval)
Fiind dat un tip ordinal, din acest tip se poate genera un nou tip, numit tipul
interval. Definiia unui interval indic valoarea constant cea mai mic i cea mai
mare din interval (n sensul numrului de ordine) i cuprinde toate valorile dintre ele.
Sintaxa unui tip interval este
Type nume_tip=valoarea_minim . . valoarea_maxim;
Valoarea minim trebuie s fie mai mic sau egal cu valoarea maxim.
Subliniem faptul c nu este permis definirea unui interval al tipului real, deoarece
acesta nu este tip ordinal. Exemple de declarare a diferitor intervale:
Type
indice=1..10; {interval de integer)
Litera='A' .. 'Z' ;
{interval de char}
zile=(l,ma,mi,j,v,s,d); {tip de enumerare}
zile_lucrat=l..v; {interval de tip de enumerare}
var:
i:indice;
{valori posibile: 1,2,,10}
l:litera;
{valori posibile: 'A', 'B', ... ,'Z'}
z: zile_lucrat;
{valori posibile: l; ma, ,v}
O variabil de tip interval motenete proprietile variabilelor tipului de
baz, dar valorile variabilei trebuie s fie numai din intervalul specificat. n cazul,
cnd valoarea variabilei de tip interval nu intr n limitele intervalului definit,
programul va fi executat incorect sau va fi primit mesajul de eroare.
Dac este validat opiunea de compilare Range Cheking (vezi meniul
Options, comanda Compiler), sau dac este prezent directiva de compilare {$R+},
n execuie se va verifica apartenena valorii unei variabile de tip interval la
intervalul desemnat. n caz de neapartenen este semnalat o eroare de execuie i
programul se oprete. Implicit nu se efectueaz nici o verificare. Exemplu:
Program test;
Type cifra=0..9;
var c1,c2,c3:cifra;
Begin
{$R+} c1:=5;
{valid}
c2:=c1+3;
{valid,c1+3<=9}
{$R-} c3:=25; {invalid, dar nu se semnaleaza eroare}
{$R+} c3:=30; {invalid, se semnaleaza eroare}
end.
4.2.2 Tipuri structurate n Pascal
Pn n momentul de fa s-au precutat numai tipurile de date simple(n
special cele scalare). Fiecare valoare a oricrui din aceste tipuri de date este
cunoscut i compus dintr-o singur component. n cazul tipurilor de date
structurate fiecare valoare a oricrui din tipuri reprezint o structur cu valoare
20

nedeterminat n sensul c aceast valoare are mai mult de o component. n acelai


timp orice dat concret la rndul su deasemenea reprezint o structur de date. Mai
pe scurt, tipurile de date structurate reprezint structuri alctuite din cteva elemente
de acelai tip, n caz simplu fiecare fiind de tip simplu.
4.2.2.1 Tipul ARRAY
Un tablou (masiv) este un set ordonat a unui numr fixat de valori
(componente ale masivului). Toate componentele masivului trebuie s fie de unul i
acelai tip care-l numim tipul componentelor sau tip de baz (pentru masiv). n cazul
componentelor de tip real avem un vector, adic un masiv real. n cazul
componentelor de tip char, masivul poate fi interpretat ca un rnd de text. De obicei
fiecrui masiv aparte folosit n program trebuie de-i atribuit un nume. Acest nume l
vom numi variabil complet din cauza c valoarea ei este masivul ntreg. Fiecare
component a masivului trebuie evident notat prin indicarea numelor masivului
dup care urmeaz selectorul de componente: indexul luat n paranteze ptrate care
red regula de calculare a numrului componentei necesare. Deci, pentru referirea la
un element al masivului folosim sintaxa:
< nume masiv>[<index>]; Ex.: x[i];
x[i] se mai numete variabil parial din cauz c valoarea ei este o parte
component a masivului i nu masivul ntreg. n caz general, n calitate de index
poate fi folosit o expresie, valoarea creia determin numrul componentei
masivului. n acelai timp, n cadrul programului aceast expresie poate s obin
diferii parametri. n aa fel, una i aceiai variabil cu index n procesul ndeplinirii
programului poate indica la diferite componente ale masivului.
Not: Tipul indexului sau a expresiei ce reprezint indexul trebuie s fie neaprat
ordonat. Cele mai mari posibiliti pentru prelucrarea masivelor ne ofer indexul de
tipul: subdomeniu al tipului ntreg.
Sintaxa de declarare a masivului este urmtoarea :
Var : <nume> : array [C1..C2] of <tip>.
unde <nume> - numele masivului; C1,C2 limetele dimensiunii masivului
<tip> - tipul componentelor masivului . Ex. : var: x : array [1..4] of real;
n timp ce componentele masivului pot fi de orice tip, indexul masivului neaprat
trebuie s fie tip subdomeniu al tipului ntreg.
Fie un masiv X din 4 elemente. Inscripia X[1] indic la primul element al masivului
X[2] la al doilea element etc. X[i] la elementul cu indexul i. Anume acest index
este folosit n cadrul ciclului FOR pentru prelucrarea masivelor: FOR i:=1 to N do;
n Pascal nu exist nici o restricie n ceea ce privete tipul elementului masivului.
Este necesar numai ca toate elementele s fie de acelai tip. n particular, elemente
ale unui masiv pot fi de asemenea masive. i dac aceste din urm snt compuse din
elemente scalare, atunci avem un masiv bidimensional numit i matrice. Dac la
urmtoarea etap elementele masivului snt de asemenea masive ,atunci avem un
masiv tridimensional. Sintaxa de declarare a unui masiv bidimensional este:
ARRAY [<tip index>] OF <tip element>;
Deoarece elementele masivului snt de asemenea masive, avem
ARRAY [<tip index>] OF ARRAY [<tip index>] OF <tip scalar>;
21

Aceast sintax poate fi exprimat n urmtoarea form:


ARRAY [C1..C2 , C3..C4] OF <tip scalar>;
unde C1,C2,C3,C4 - mrimile masivului (limitele dimensiunii).
Ex.: X:ARRAY [1..10, 1..20] OF real;
i
j
Deoarece avem i linii i coloane exist doi indici: i i j.
4.2.2.2 Tipul ir de caractere
Pentru prelucrarea unor seturi de caractere, cuvinte, propoziii n Turbo Pascal
este folosit tipul de date ir de caractere numit string. Valoarea unei variabile de acest
tip este format dintr-un numr de caractere oarecare. Din cauza, c variabila de acest
tip are ca valoare cteva elemente de tip simplu (i anume de tip char), tipul string
este un tip structurat (compus).
Tipul ir de caractere se specific prin string[lungime] sau folosind numai cuvntul
string. Exemplu:
Var a:string[lungime]; b:string;
n primul caz "lungime" reprezint lungimea maxim a irului de caractere,
avnd valori de la 0 la 255. Un tip ir de caractere fr specificarea atributului de
lungime reprezint de fapt un ir de lungime implicit egal cu 255. Variabilele de tip
string[lungime] pot avea ca valori orice iruri de caractere a cror lungime nu
depete lungimea declarat. Lungimea unui ir de caractere n unele cazuri este
necunoscut. Ea poate fi schimbat pe parcursul realizrii programului, sau fiind
declarat variabila de tip string fr specificarea lungimii . Pentru a determina
valoarea actual a lungimii unei variabile de tip string n Pascal este folosit funcia
standard Length. Exemplu:
Var a1:string[10]; a2:string; n1,n2:integer;
Begin a1:=Programare; a2:=Radioelectronica;
n1:=Length(a1); {n1=10}
n2:=Length(a2); {n2=16}
Writeln (Lungimea a1 este:,n1); Writeln (Lungimea a2 este:,n2); end.
Dup cum se vede din exemplu valoarea returnat de funcia Length este de tip
ntreg, n aa mod determinnd numrul de caractere ce se conin n variabila de tip
string.
Variabilele de tip ir de caractere snt memorate n locaii succesive de
memorie, pe lungime+1 octei, unde octetul de nceput conine lungimea actual a
irului de caractere. Anume din acest octet de nceput este luat valoarea lungimii
actuale a irului de caractere de ctre funcia Length. Aceast valoare poate fi
modificat de programator, printr-o instruciune de atribuire de forma: sir[0]:=#nr
sau sir[0]:=chr(ord(nr)); unde nr este cuprins ntre 0 i lungime maxim admis.
Dac nr are valoarea zero, irul este considerat vid.
O variabil de tip ir poate fi folosit fie n totalitatea ei, fie parial, prin
referirea unui caracter din ir. n primul caz referirea se face numai prin numele
variabilei, n cel de-al doilea caz trebuie specificat ntre paranteze ptrate poziia
caracterului din ir, cu o construcie de forma [expresie], unde rezultatul expresiei
trebuie s fie o valoare ntreag n intervalul 0 i lungimea declarat a irului. De
exemplu:
22

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.

for i:=1 to 10 do if i in dif then writeln (i);

4.2.2.4 Tipul articol


Pn n momentul de fa au fost studiate tipurile de date compuse, elementele
crora aparineau aceluiai tip de date (simplu sau de asemenea compus). n cazul
unui masiv, toate elementele masivului erau de acelai tip (integer, real, char etc.)
fr a fi posibil atribuirea diferitor elemente ale masivului valori de diferite tipuri.
ns deseori apar situaii, cnd este necesar prelucrarea i pstrarea unei informaii
mai complexe, aa ca: informaia despre o persoan, despre reuita unui student,
orarul leciilor etc. Dac precutm cazul cu reuita unui student, atunci este simplu
de presupus c vor fi necesare urmtoarele date: numele studentului, grupa, notele la
examenele unei sesiuni, balul mediu calculat. Aceste date snt legate ntre ele prin
faptul c aparin aceleiai persoane. Ca urmare ar fi justificat tratarea lor ca o
singur valoare compus. ns tipurile datelor difer ntre ele: numele i grupa vor fi
de tip string, notele la examene tip integer, iar balul mediu de tip real. n
consecin nu putem grupa aceste componente ca un tablou, care reprezint o
structur omogen. Gruparea lor o permite structura de nregistrare n Pascal numit
tip articol.
Tipul articol este un tip compus format dintr-un numr de componente,
numite cmpuri. Numrul componentelor poate s fie fix sau variabil. n cazul
numrului de componente fix se spune c avem o structur fix, n cel de-al doilea
caz avem o structur cu variante.
Spre deosebire de tablouri, cmpurile pot f de tipuri diferite. Fiecare cmp are un
nume (identificator de cmp) i un tip (numit tip de cmp), de asemenea cum i toat
structura articol i are numele su.
Forma general a unei structuri cu articole fixe este:
nume_articol = record ;
nume_cmp_l :tip_cmp_1;
nume_cimp_2 : tip_ cmp_2;

nume_cmp_n : tip_ cmp_n;
end;
De exemplu:
type data=record
an:1900..2000;
luna:(ian,feb,mar,apr,mai, iun, iul, aug, sep, oct, nov, dec);
ziua:1..31;
end;
var astzi:data;
Tipul unui nume de cmp este arbitrar, astfel un cmp poate s fie la rndul lui tot de
tip articol, deci se pot defini tipuri imbricate. Exemplu:
Type ntlnire = record
cnd:data; {tip articol}
ora: real;
25

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

type calendar= record


an:1990.. 2000; luna:1..12; ziua:1..31; end;
var data:calendar;
begin with data do
if luna = 12 then begin
luna:=l; an:=an+l;
end;
else luna=luna+1;
end.
Aceast instruciune este echivalent cu urmtoarea:
if data.luna = 12 then begin
data.luna:=1;
data.an:=data.an+1; end
else data.luna:=data.luna+1;
n interiorul unei instruciuni with, la ntlnirea unui nume de variabil prima dat se
testeaz dac variabila poate fi interpretat ca un nume de cmp al unui articol. Dac
da, variabila va fi interpretat ca atare, chiar dac n acel moment este accesibil i o
variabil avnd acelai nume
Type punct = record
x,y:integer; end;
var x:punct; y:integer;
n cazul nostru att x, ct i y, pot s reprezinte fe o variabil, fe un cmp al
articolului. Dar n instruciunea: with x do begin x:=l; y:=2; end;
identificatorul x situat ntre with i do se refer la variabila de tip articol x, iar
identificatorul x ntre begin i end se refer la variabila de tip integer, adic la cmpul
articolului. n cazul necesittii referirii din una i aceiai instruciune with a mai
multor variabile tip articol se procedeaz n felul urmtor:
with vl,v2,...,vn do instructiune;
Aceast instruciune este echivalent cu urmtoarea:
with vl do with v2 do {...} with vn do instructiune;
Articol cu variante. Uneori apare necesitatea s se includ n structura unui
articol informaii care depind de o alt informaie deja prezent n articol. Fie c se
prelucreaz informaia despre 3 persoane n ceea ce privete numele, salariul i
pregtirea profesional. Pregtirea profesional poate fi elementar, medie i
superioar. i este impus urmtoarea condiie: (a)dac pregtirea este superioar,
atunci apare necesitatea de informaia despre anul absolvirii i validitatea licenierii ;
(b)dac pregtirea este medie, atunci se mai adaog i balul mediu de absolvire;
(c)dac pregtirea este elementar- nu trebuie nici o informaie suplimentar.
Problema aceasta poate fi rezolvat cu ajutorul articolului cu structur fix, declarnd
toate cmpurile susnumite i folosindu-le numai n caz de necesitate. n acest caz
unele cmpuri vor fi declarate, dar nu vor fi folosite n program, ceea ce duce la
folosirea neraional a resurselor calculatorului. n Pascal exist tipuri articol, care au
o structur flexibil (cu variante). i anume n cazul respectrii unei condiii anumite
apare cmpul necesar adugtor, iar n cazul, cnd condiia nu este respectat, n
27

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

4.2.2.5 Tipul reper


n timpul de astzi problema memoriei n tehnica de calcul este cea mai
stringent. Pe parcursul dezvoltrii sale tehnica de calcul se perfecioneaz i pune la
dispoziia utilizatorului posibiliti mai vaste de lucru. Odat cu dezvoltarea tehnicii
de calcul se dezvolt cu pai gigani i asigurarea soft a ei. Astfel apar noi aplicaii
cu cerine mai mari ctre resursele calculatorului. n cele mai dese cazuri problema
folosirii acestor aplicaii const n insuficiena memoriei operative RAM. Astfel de
situaii pot aprea i n cazul programrii Pascal, cnd se prelucreaz un volum mare
de date i programele devin voluminoase i complicate necesitnd un volum mare de
memorie RAM. Pentru aa cazuri Pascal i are instrumentul su numit variabile
dinamice.
n Turbo Pascal variabilele pot fi statice sau dinamice. Variabilele statice snt
alocate n memorie n timpul compilrii, iar locul ocupat de ele n memorie nu poate
fi modificat n execuie; ele exist pe durata ntregii execuii a blocului (program,
procedur, funcie). ns n Pascal exist variabile care pot fi create i distruse
dinamic n timpul execuiei programului; o astfel de variabil este denumit variabil
dinamic.
Crearea i distrugerea variabilelor dinamice se realizeaz cu procedurile New
i GetMem respectiv Dispose i FreeMem. Aceste proceduri aloc, respectiv
elibereaz spaiu de memorie pentru variabilele dinamice. Adresa zonei de memorie
alocat unei vanabile dinamice va fi depus ntr-o variabil de tip special, numit
reper. Lungimea zonei de memorie atribuit unei variabile dinamice depinde de tipul
variabilei dinamice: n funcie de tip se aloc un numr variabil de octei variabilei
respective. De exemplu, dac tipul variabilei dinamice este ntreg, se aloc 2 octei,
dac tipul este real, se aloc 6 octei. n consecin, variabila de tip reper care va
conine adresa zonei alocate variabilei dinamice trebuie s comunice procedurilor de
alocare de memorie tipul variabilei dinamice. Menionm c variabilele dinamice snt
alocate ntr-o zon special de memorie, denumit "heap".
Definirea unui tip reper se poate face n seciunea type, n felul urmtor:
type nume_reper = ^tip_variabil_dinamic;
unde semnul ^ semnific o adres. Mulimea valorilor reper de tip "nume_reper"
const dintr-un numr nelimitat de adrese; fiecare adres identific o variabil de tip
"tip_variabil_dinamic". La aceast mulime de valori se mai adaog o valoare
special, numit nil, care nu identific nici o variabil.
Limbajul permite ca n momentul ntlnirii tipului variabilei dinamice acesta s
nu fie cunoscut nc (referire nainte); acest tip ns trebuie declarat mai trziu, n
aceeai declaraie de tip. De exemplu, secvena urmtoare este corect:
Type rep = ^art; {referire inainte}
art = record x,y:integer;
end;
var r1,r2:rep; {reperarea variabilelor tip art}
r3:^integer; {reperarea var. dinamice}
r4:^char; {de tip intreg si caracter}
O alt facilitate a limbajului const n posibilitatea utilizrii tipurilor care se
autorefer (snt definite recursiv). De exemplu,
type lista = ^articol; articol = record
29

a,b: integer; urmator : lista; end;


var : l:lista;
Aici tipul reper "lista" repereaz un tip "articol", n care cmpul "urmtor" la rindul
lui este de asemenea de tip "list". Aceast facilitate poate fi folosit de exemplu la
alctuirea listelor nlnuite.
Dup crearea unei variabile dinamice a crei adres este depus ntr-o variabil
de tip reper, ea poate fi accesat prin aa zisa dereperare: numele variabilei de tip
reper este urmat de semnul ^. Acest semn poate urma i dup un alt calificator (de
cmp, de tablou, etc.).
Dereperarea unei variabile de tip reper cu coninut nil declaneaz o eroare de
execuie. Variabilele de tip reper snt alocate pe 4 octei (2 octei pentru memorarea
adresei de segment, 2 octei pentru memorarea deplasamentului).
Operaiile relaionale care snt permise cu operanzii de tipul reper compatibile
snt = i < >. Dac p1 i p2 snt dou valori tip reper compatibile, relaia pl =p2 este
adevrat dac snt egale prile de segment i de deplasament. Astfel pot exista dou
valori de tip reper care indic aceeai locaie, dar totui ele nu snt egale n sensul de
mai sus. 'De exemplu, $0040:$0049 i $0000:30449 indic aceeai adres fizic,
totui n sensul limbajului ele nu snt egale. Adresele returnate de procedurile New i
Getmem snt totdeauna normalizate, adic partea de deplasament este n intervalul
$0000...$FFFF. Astfel comparrile vor fi efectuate corect. Cnd ns valorile de reper
snt create cu funcia Ptr, trebuie de acordat o mare atenie la compararea lor,
deoarece deplasamentele nu snt neaprat normalizate. Exemplul 1:
Operaii simple cu variabile dinamice:
type pc=^char; pintrg= ^ integer; pcmp=^art;
art=record x:integer; y:array[1..2] of integer; end;
var c:pc; intrg:pintrg; cmp:pcmp;
begin new(c);
{crearea unei var. dinamice tip caracter}
c^ :='*';
{incrcarea variabilei create}
new(intrg);
{crearea unei variabile dinamice}
intrg^:=123;
{de tip ntreg i ncrcarea ei}
new(cmp);
{crearea unei variabile dinamice}
cmp^.x:=4;
{de tip articol i ncarcarea}
cmp^.y[1]:=5;
{cmpurilor variabilei}
cmp^.y[2] :=6;
{...}
writeln(c^); writeln(intr^); write(cmp ^.x); write(' ',cmp^.y[1]);
writeln(' ',cmp^.y[2]); {variabilele dinamice nu mai snt necesare}
dispose(cmp);
{distrugerea variabilei dinamice}
dispose(intrg);
dispose (c);
{se poate reutiliza spaiul de memorie ocupat anterior}
{} end.
4.2.2.6 Tipul pointer
Tipul predefinit pointer este un tip reper fr tip de baz. Astfel, o variabil de
acest tip poate s repereze o variabil de orice tip, motiv pentru care acestui tip i se
mai spune i tip reper liber. Declararea unei variabile de acest tip se face de exemplu
30

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

citirea i scrierea nu numai a valorilor de tip caracter, ci i a valorilor de tip ntreg,


real i de tip ir de caractere. De exemplu, Read(f,i), unde i este o variabil de tip
ntreg, va citi o secven de cifre, care vor f interpretate ca un ntreg zecimal, i care
va fi depus n variabila i. Detectarea caracterelor de sfrit de linie poate fi realizat
cu funcia Eoln, care returneaz valoarea true dac s-a ajuns la sfritul liniei curente.
Funcia SeekEoln este similar cu Eoln, exceptnd faptul c se sare peste blanc-uri i
tab-uri, dup care se testeaz starea de sfrit de linie. Starea de sfrit de fiier poate
fi testat cu funcia Eof, precum i cu funcia SeekEof, aceasta din urm sare peste
blanc-uri i tab-uri, dup care se returneaz true dac s-a ajuns la sfritul fiierului.
Procedura SetTextBuf permite ataarea unui tampon de intrare/ieire de lungime dat
la un fiier text. Golirea tamponului unui fiier text deschis pentru scriere poafe fi
realizat cu procedura Flush.
Aa cum s-a artat la generaliti despre fiiere, exist dou fiiere text
standard: Input i Output. Fiierul Input este destinat numai pentru operaii de citire i
este asociat cu fiierul standard de intrare al sistemului de operare (de regul
claviatura). Fiierul Output este destinat numai pentru operaii de scriere i este
asociat cu fiierul standard de ieire al sistemului de operare (de regul ecranul).
Aceste fiiere snt deschise automat nainte de nceputul execuiei, ca i cum ar fi
prezente instruciunile
Assign(Input,' ');Reset(Input); Assign(0utput,); Rewrite(Output);
Aceste fiiere snt nchise automat dup ce s-a terminat execuia programului.
Unele proceduri i funcii de intrare/ieire permit ca numele fiierului s nu fie
specificat n lista de argumente; n acest caz se presupune c fiierul text implicit este
sau Input, sau Output, n funcie de natura subprogramului. De exemplu, Read(x) este
echivalent cu Read(Input,x), iar Write(x) este echivalent cu Write(Output,x). Un fiier
text deschis cu Reset suport numai proceduri i funcii orientate spre citire. Analog,
un fiier deschis cu Rewrite sau Append permite utilizarea acelor proceduri i funcii,
care snt orientate spre scriere.
Exemplul 1: Crearea unui fiier text carte.txt; liniile fiierului snt introduse de la
tastatur (fiier INPUT)
Program crtext;
var c:char; f:text;
begin
assign(f , 'carte.txt'); {asocierea variabilei f cu fiierul extern carte.txt}
rewrite(f);
{deschiderea fiierului nou pentru scriere}
while not eof do
{control sfrit de fier: eof(INPUT)}
begin while not eoln do {control sfrit de linie: eoln(INPUT)}
beqin read(c);
{citire de la tastatura: read(INPUT,c)}
write(f,c);
{variabila c va fi scris n fiier} end;
readln;
{readln(INPUT)}
writeln(f);
{scrie EOLN in f} end;
close(f);
{scrie EOF n f i-l inchide}
end
Exemplul 2. Afiarea fiierului creat anterior pe ecran, cu numerotarea liniilor.
Program extext;
34

var c:char; f:text; numlin:integer;


begin assign(f,'carte.txt'); reset(f); numlin:=0;
while not eof(f) do begin
numlin:=numlin+l; write(numlin,' ');
while not eoln(f) do begin
read(f,c); write(c); end;
readln(f); {citeste EOLN din f}
writeln;
end;
close(f); end.
4.2.2.7.4 Fiiere fr tip
Fiierele fr tip snt canale de intrare/ieire de nivel inferior, utilizate n
primul rnd pentru accesul direct la orice fiier-disc, indiferent de tipul i de
structurarea intern a fiierului. n operaiile de intrare/ ieire, la fiierele fr tip
informaiile snt transferate direct ntre fiierul de pe disc i variabile, economisnduse astfel spaiul necesar zonei tampon. Un fiier fr tip este compatibil cu orice fiier
(cu tip sau text). 0 variabil de acest tip se declar cu tipul predefinit "file", i nimic
altceva; de exemplu: var f:file;
Pentru fiiere fr tip, procedurile de deschidere Reset i Rewrite permit
folosirea unui parametru auxiliar. Acest parametru specific lungimea unei
componente a fiierului. Valoarea acestui parametru, din motive istorice, este 128. Se
recomand alegerea valorii 1, deoarece aceast valoare permite reflectarea corect a
dimensiunii exacte a fiierului (cnd aceast valoare este 1, nu snt posibile
componente fracionate).
Exceptnd procedurile Read i Write, toate procedurile i funciile standard
utilizabile pentru fiierele cu tip snt permise i pentru fiierele fr tip. n locul
procedurilor Read i Write, pentru realizarea transferurilor rapide de date snt folosite
procedurile BlockRead i BlockWrite. Procedura BlockRead citete din fiierul fr
tip un numr precizat de componente, care se depun n memorie de la o adres
specificat. La revenire din procedur, o variabil - care se poate specifica opional va conine numrul componentelor citite efectiv. Dac aceast variabil nu este
specificat i dac nu s-a reuit citirea tuturor componentelor, va apare o eroare de
intrare/ieire.
Procedura BlockWrite scrie n fiierul fr tip un numr precizat de
componente, componentele fiind luate de la o adres specificat. La revenire din
procedur o variabil opional va conine numrul componentelor scrise efectiv.
Dac aceast variabil nu este specificat i dac nu s-a reuit scrierea tuturor
componentelor, atunci va apare o eroare de intrare/ieire.
Este permis att accesul secvenial, ct i cel direct, datorit faptului c toate
componentele au aceeai lungime. Poziionarea pe o component dorit se realizeaz
cu procedura Seek. Numerotarea componentelor ncepe de la zero. Numrul
componentelor se determin cu funcia FileSize, iar numrul componentei actuale se
determin cu funcia FilePos. Procedura Truncate permite trunchierea fiierului,
pornind de la componenta actual din fiier. Exemplu. Programul urmtor prezint o
utilizare a fiierelor fr tip:copierea unui fiier de tip arbi trar.
35

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

4.3.1.2 Instruciunea apel de procedur


Aceast instruciune se insereaz n program n locul n care se dorete
executarea instruciunilor specificate de o declaraie de procedur asupra unitilor
particulare transmise ei din locul de apel. Sintactic apelul de procedur poate fi
reprezentat astfel: P(L), unde P numele procedurii, L lista parametrilor actuali.
Parametrii actuali din L trebuie s corespund ca numr, ordine i tip cu
parametrii formali specificai n antetul declaraiei de procedur. Ei pot fi expresii,
funcii, proceduri. Ex.: o procedur cu antetul procedure P( x, y: integer; var z, t:
real) se poate apela prin P(a, b, u, v) sau P(3, 5, u, v) sau P (3, 2*(a + b - c), u, v) etc.
unde a, b, c desemneaz variabile ntregi. Instruciunea de apel la procedur va fi
analizat mai concret n punctul 4.4.
4.3.1.3 Instruciunea de transfer necondiionat.
Instruciunile unui program snt executate secvenial, aa cum apar scrise n
textul programului. Instruciunea de transfer necondiionat ofer posibilitatea de a
ntrerupe aceast secven i a relua execuia dintr-un alt loc al textului. Aceast
instruciune are forma: GOTO e unde e etichet declarat prin label. Declararea
etichetei e prin label este obligatorie. Execuia instruciunii GOTO e are ca efect
transferul controlului la instruciunea precedat de e .
Instruciunea GOTO e i instruciunea marcat cu e trebuie s ndeplineasc
condiia: instruciunea precedat de e conine instruciunea GOTO e sau face parte
dintr-o secven de instruciuni s, iar instruciunea GOTO e este una, sau e coninut
n una dintre instruciunile secvenei s.
Ex.: label 5,8
Const a=1,4; b=7,03;
Var x, y, z: real
Begin
Writeln (y); readln (y); X: =sqr (y);
5: if x>5 then goto 8
Z:= x+a+b;
X:= sqrt(z);
Goto 5;
8: end;
4.3.1.4 Instruciunea de efect nul.
Executarea acestei instruciuni nu are efect asupra variabilelor programului
(starea acestora rmne neschimbat). n textul programului instruciunea de efect nul
nu este reprezentat prin nimic dar, deoarece instruciunile snt desprite ntre ele
prin ; ,prezena sa este marcat de apariia acestui delimitator. Ex.: a:=b+3;;;
4.3.2 Instruciuni structurate.
O instruciune se numete structurat cnd are n componena sa cteva
instruciuni simple (2 i mai mult).

37

4.3.2.1 Instruciunea compus BEGINEND.


Uneori, pentru compilarea corect a unui program n limbajul Pascal este
nevoie ca ntr-un loc oarecare al construciei sintaxice s fie prezent numai un singur
operator (instruciune), n timp ce dup mersul algoritmului n acest loc trebuie s fie
un set de instruciuni. Pentru rezolvarea acestui conflict dintre sintaxa limbajului i
mersul algoritmului este folosit instruciunea compus begin - end, care unete un
set de operatori simpli ntr-un tot ntreg i care este neles de compilator ca o singur
instruciune aparte. Cuvintele cheie la instruciunea compus snt <begin> i <end>.
Sintaxa este urmtoarea : begin <instr.1; instr.2;; instr. n> end.
Instruciunea compus begin end poate conine una sau mai multe
instruciuni n corpul su (desprite prin ;). Executarea acestei instruciuni se
reduce la executarea consecutiv a tuturor operatorilor inclui n corpul su.
Ex.: begin a: =b+3 end; begin y: =s + cos s; z: = y - 4ac; end;
Begin I:=1; begin c: = a + b; y: = sin c end; end;
4.3.2.2 Instruciuni condiionale.
O instruciune condiional selecteaz o singur instruciune dintre
alternativele sale, pe care apoi o execut. n structurile ramificate de calcul, unele
etape nu ntotdeauna se ndeplinesc n una i aceiai ordine, dar n dependen de
careva condiii, care snt controlate(verificate) pe parcursul calculelor, se aleg pentru
executare diferite consecutiviti de instruciuni. Pentru descrierea astfel de procese n
limbajul Pascal se folosesc instruciunile ramificate (sau condiionale).
Instruciunea conditional IF
Instruciunea condiional IF are n Pascal 2 forme: complet i prescurtat.
Forma complet este urmtoarea:
If <condiie> THEN <instruciune> ELSE <instruciune>;
Forma prescurtat este: IF <condiie> THEN <instruciune>;
unde IF(dac), THEN(atunci) i ELSE(altfel) snt cuvinte rezervate. Forma complet
a instruciunii condiionale se mai poate prezenta n felul urmtor:
If C THEN I1 ELSE I2; (C-expresie logic, I1, I2-instruciuni). Executarea acestei
instruciuni structurate se reduce la executarea unei din instruciuni I1 sau I2. Dac
condiia C din cadrul instruciunei se respect (C primete valoarea TRUE), atunci
urmtoarea instruciune executabil este I1, n caz contrar se ndeplinete I2. Exemple
de instruciuni IF form complet:
IF x<0 THEN i:=i+1 ELSE k:=k+1;
IF (x>0) and (y>0) THEN a: =SQRT (x * y) ELSE a: =SQR(x * y);
Not 1. Dac n instruciunea IF C THEN I introducem nainte de I instruciunea de
efect nul (IF C THEN;I) atunci I nu intr n componena instruciunii condiionale,
deci este executat indiferent de valoarea lui C.
Not 2. Dac ns n instruciunea IF c THEN I1 ELSE I2, introducem dup I1 ;,
obinem un program incorect sintactic din pricina c aceast instruciune se consider
un tot ntreg i nu poate suporta prezena simbolului ; n interiorul su.
La formularea algoritmilor deseori este tipic situaia cnd analiznd o condiie
oarecare i n caz de respectare a ei este necesar de ndeplinit careva aciuni, iar n
cazul cnd condiia nu se respect nu trebuie de executat nici o instruciune.
38

Ex.: if x<0 then x: =ABS(x) (Aflarea modulului unui numr). n astfel de


situaii este destul de comod forma prescurtat a instruciunii condiionale:
if c then i. n acest caz dac valoarea lui c este TRUE, atunci este executat
instruciunea I, n caz contrar nici o aciune din partea compilatorului nu-i ndeplinit,
adic se controleaz numai condiia C. Ex.: if a>b then c: =a-b;
Instruciunea condiional CASE.
n cazul, cnd n algoritm este necesar de luat n consideraie mai mult de 3
variante posibile, construcia if then else poate fi foarte complicat. n aa
cazuri n calitate de alternativ se folosete comutatorul de tipul CASE. Aceast
instruciune condiional prezint o structur alctuit dup principiul MENIU i
conine toate variantele posibile ale condiiilor i instruciunilor care trebuie de
ndeplinit n fiecare din cazurile concrete.
Instruciunea CASE const dintr-o expresie numit selector i o list de
instruciuni, fiecare precedat de o constant de acelai tip cu selectorul sau de
cuvntul cheie OTHERWISE. Instruciunea CASE se execut astfel: se evalueaz
expresia ce definete selectorul i apoi se execut fie instruciunea precedat de
constanta egal cu valoarea selectorului, fie instruciunea precedat de OTHERWISE,
dac valoarea selectorului nu coincide cu nici una din constantele ce eticheteaz
instruciunile componente. n acest caz lipsa specificaiei otherwise conduce la erori.
Sintaxa instruciunii case este urmtoarea:
CASE I OF
CASE I OF
C1:<instruciunea 1>;
C1:<instruciunea 1>;
C2:<instruciunea 2>;
sau
C2:<instruciunea 2>;

..
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

2) Instruciunea ciclic cu postcondiie (REPEAT)


3) Instruciunea ciclic precedat de condiie (WHILE)
Instruciunea ciclic FOR.
Ciclul FOR posed urmtoarele caracteristici:
numrul de repetri ale ciclului este cunoscut de la nceputul executrii lui;
conducerea ciclului este efectuat cu ajutorul unei variabile de tip scalar,
care, n acest proces ciclic primete valori consecutive de la valoarea
iniial dat pn la valoarea final dat.
Pentru o redare mai compact a proceselor de calcul de aa tip se folosete
urmtoarea construcie a ciclului: FOR I:=E1 to E2 do S;
unde FOR,TO,DO snt cuvinte cheie, I variabil tip scalar (n afar de real)
numit parametrul ciclului, E1, E2 expresii de tip identic cu parametrul ciclului, S
operator numit corpul ciclului. n calitate de S poate fi prezent o singur
instruciune sau un set de instruciuni unite n operatorul begin - end. Acest operator
ciclic(FOR) presupune atribuirea parametrului ciclic I valori consecutive de la
valoarea iniial E1 pn la valoarea final E2 i executarea instruciunii S pentru
fiecare valoare a lui i. Valorile expresiilor E1 i E2 snt calculate o singur dat, iar
valoarea parametrului I nu trebuie s fie schimbat n rezultatul executrii
instruciunii S. Dac E2 este mai mic dect E1(ceia ce-i posibil) atunci instruciunea
S nu se execut nici o dat. Exemplu de ciclu for: y:=0; for I:=1 to n do y:=y+1/I;
n unele cazuri este comod ca parametrul ciclului s primeasc valori
consecutive ns nu n ordine cresctoare ci n ordine descresctoare. Pentru aa
cazuri n Pascal este prevzut operatorul ciclului cu parametru de felul urmtor:
FOR I:=E1 downto E2 do S
unde downto (micorndu-se pn la) cuvnt cheie. n acest caz, dac valoarea E1 e
mai mic ca E2 atunci ciclul nu se va repeta nici odat, adic instruciunea S nu va fi
executat. Parametrul ciclului I poate s nu fie folosit n corpul ciclului (adic n
interiorul lui S) din cauz c destinaia lui de baz este conducerea cu numrul de
repetri al ciclului. Pasul schimbrii lui fiind egal cu 1.
Ex.: y:=1; for I:=1 to n do y: =y * x;
Instruciunea ciclic cu postcondiie (repeat).
Ciclul FOR cu parametru de obicei este folosit n cazurile, cnd numrul de
iteraii este cunoscut de la nceputul executrii ciclului. ns deseori numrul de
iteraii nu este cunoscut de la nceput, dar se determin n timpul realizrii acestui
proces ciclic. n acest caz este folosit ciclul REPEAT cu ajutorul crui este formulat
condiia, n cazul respectrii creia, acest proces ciclic trebuie s fie terminat. Ciclul
cu postcondiie are urmtoarea sintax: REPEAT S;S;;S UNTIL B
unde: Repeat(de repetat) i until(pn la) cuvinte cheie, S un operator oarecare, b
expresie logic.
n tipul executrii acestui proces ciclic setul de instruciuni S ce se afl ntre
cuvintele repeat i until este executat de una sau de mai multe ori. Acest proces se
termin atunci, cnd dup executarea setului de instruciuni S expresia logic B va fi
echivalat(pentru prima dat) cu TRUE. n aa fel, cu ajutorul expresiei logice B este
determinat condiia pentru terminarea executrii operatorului ciclului. Deoarece n
acest caz controlul condiiei este efectuat dup ndeplinirea setului de instruciuni S,
40

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

cunoatem numrul de repetri al ciclului, pasul indexului fiind =1 folosim


instruciunea ciclic FOR. n cazul cnd numrul de repetri al ciclului e necunoscut,
dar corpul ciclului trebuie s fie executat mcar o singur dat folosim instruciunea
ciclic REPEAT. i n cazul cnd nu este cunoscut numrul de repetri al ciclului, iar
corpul ciclului e necesar s fie executat de 0 sau mai multe ori, n dependen de o
condiie folosim instruciunea ciclic WHILE.
4.4 Organizarea modular a programelor. Proceduri i funcii n Pascal
Deseori, n timpul alctuirii unui program apar situaii, cnd e necesar ca una i
aceiai secven de instruciuni s fie executat de mai multe ori, dar prelucrnd date
diferite. n aa cazuri e binevenit de folosit subprograme. Un subprogram corect
alctuit i nscris n program o singur dat, care conine tipul i numrul necesar de
parametri poate fi apelat de mai multe ori, din diferite puncte ale programului, cu
diferite valori ale parametrilor, ns realiznd unul i acelai algoritm.
n Pascal exist 2 feluri de subprograme: proceduri i funcii. Deosebirea dintre
ele const n numrul valorilor calculate i returnate n punctele din care a fost fcut
apelul. Procedura calculeaz oricte asemenea valori, pe cnd funcia- numai una,
permind ca apelul ei s se fac chiar din expresia care are nevoie de valoarea
calculat. Procedurile i funciile se definesc n partea de declarare a subprogramelor
i snt ultimele declaraii din seciunea datelor. O astfel de declaraie asociaz un
identificator cu o parte a programului, astfel nct aceasta poate fi activat cu ajutorul
instruciunii de apel la procedur n orice moment.
4.4.1 Proceduri
Declararea procedurilor este amplasat n partea procedurilor i funciilor i are
urmtoarea sintax:
Procedure nume(lista parametrilor formali);
Var [lista variabilelor locale];
Begin [corpul procedurii] end;
Pentru redarea mai clar a temei vom folosi un exemplu concret. Fie c trebuie
de calculat aria unui patrulater pentru care snt cunoscute cele 4 laturi
i o diagonal. Pentru a calcula aria patrulaterului, calculm aria
fiecrui triunghi component n parte folosind formula lui Heron:
S=sqrt(p*(p-a)*(p-b)*(p-c)), unde p=(a+b+c)/2; a,b,c-lungimea laturilor triunghiului.
Fr folosirea procedurilor rezolvarea acestei probleme va fi urmtoarea:
Program patrulater1;
Var AB, BC, CD, DA, BD, a,b,c,p,s,s1,s2:real;
Begin readln(AB,BC,CD,DA,BD);
a:=AB; b:=DA; c:=BD; p:=(a+b+c)/2;
S1:=sqrt(p*(p-a)*(p-b)*(p-c));
A:=BC; b:=CD; c:=BD; p:=(a+b+c)/2;
S2:= sqrt(p*(p-a)*(p-b)*(p-c));
S:=S1+S2; writeln(S=,S); end.

42

Se observ repetarea unui set de instruciuni, i anume calculul pentru p i S. Anume


aceast situaie cere folosirea unei proceduri. Versiunea programului cu folosirea
procedurii este urmtoarea:
Program patrulater2;
Var AB, BC, CD, DA, BD, a,b,c,p,s,s1,s2:real;
Procedure aria;
Begin p:=(a+b+c)/2; S:= sqrt(p*(p-a)*(p-b)*(p-c)); end.
Begin readln(AB,BC,CD,DA,BD);
a:=AB; b:=DA; c:=BD; aria;
S1:=S; A:=BC; b:=CD; c:=BD; aria;
S2:=S; S:=S1+S2; writeln(S=,S);
End.
Se observ 2 adresri la procedura aria. ns nainte de fiecare adresare se
ndeplinesc cteva instruciuni de atribuire, care determin valorile variabilelor a,b,c.
Fiecare adresare activeaz procedura i ca rezultat este primit valoarea suprafeei
triunghiului pentru laturile cruia au fost fcute atribuirile. Deci legtura dintre
procedur i programul principal este efectuat prin intermediul variabilelor a,b,c i
S. ns procedura mai conine i variabila p, care este local procedurii i nu apare n
corpul programului principal. n aa situaie declararea i descrierea variabilei p poate
fi fcut nuntru procedurii. Aa variabile snt numite variabile locale (referitor la
procedur). Ele nu pot aciona nici ntr-un mod asupra variabilelor globale (din
programul principal) cu acelai nume. Diferena dintre ele const numai n domeniul
de vizibilitate: variabila global este vzut (de ctre compilator) pe parcursul
intregului program, iar variabila local procedurii este vzut numai n interiorul
procedurii.
Noiunea de bloc i domeniu de vizibilitate
Corpul unui subprogram (procedur sau funcie) este un bloc sau o directiv.
Un bloc este constituit din declaraii de etichete (label), definiii de constante (const),
definiii de tip (type), declaraii de variabile (var), declaraii de procedur
(procedure), declaraii de funcie (function) i instruciuni (partea executabil a
blocului). Deoarece programele snt incluse n blocul programului principal, iar
blocurile subprogramelor pot conine la rndul lor alte subprograme, rezult c
blocurile pot fi imbricate (suprapuse). Aceast imbricare de blocuri este denumit
structura de bloc a programelor Pascal, concept introdus de limbajul ALGOL60.
ntruct blocurile pot fi imbricate n alte blocuri prin declaraii de proceduri sau
funcii, fiecrui bloc i putem ataa cte un nivel de imbricare. Blocul programului
principal sau unit-ului principal este considerat de nivel 0, un bloc definit n acesta
este de nivelul 1. n general, un bloc definit n nivelul n este de nivelul n+1.
O definiie sau declaraie introduce un nume, care poate fi un identificator -care
servete la denumirea tipurilor, variabilelor, subprogramelor etc. Fiecare nume dintrun program Pascal are un punct de definire/declarare, unde se leag diferitele atribute
de numele respectiv. Prin domeniu de vizibilitate al unui nume se nelege acea parte
a programului n care numele respectiv pstreaz aceleai atribute.
Un identificator care a fost declarat/definit n blocul programului (unit-ului)
principal se numete global. Un identifcator este local blocului n care este
43

declarat/definit. Un identificator este nelocal ntr-un bloc, dac declaraia/definiia sa


a fost fcut ntr-un bloc exterior primului.
Exemplul patrulater2 ilustreaz bine cazul folosirii procedurii fr parametri.
Aceast metod deseori se dovedete a fi neefectiv din cauza multor instruciuni de
atribuire pentru a,b,c. Pentru nlturarea acestor neajunsuri Pascal ofer posibilitatea
de a nu fixa valorile iniiale ale variabilelor a,b,c pentru lucrul procedurii, dar face a
fi posibil transformarea acestor variabile n parametri ai procedurii, valoarea crora
va fi concretizat la momentul apelului procedurii. Astfel de parametri se numesc
parametri formali. Parametrii formali nu prezint nite valori concrete, dar valori
virtuale. Le fiecare adresare ctre procedur, parametrii ei formali trebuie
concretizai, din aceast cauz, pentru simplificarea urmtoarelor apeluri la procedur
parametrii formali snt indicai n antetul procedurii i n acelai timp ordonai dup
cum au aprut n antet. n acelai timp, pentru fiecare parametru formal se indic tipul
valorii prezentate de acest parametru formal. Ca i n cazul declarrii variabilelor
globale, acest tip este indicat o singur dat dup lista parametrilor formali
corespunztori. De exemplu: procedure aria(a,b,c:real); Fiecare parametru declarat
n lista parametrilor formali este local procedurii i poate f referit n blocul asociat
procedurii prin identificatorul su. La ardesarea ctre aa o procedur, n
instrusciunea de apel la procedur dup numele procedurei se indic n paranteze
lista parametrilor actuali. Aceti parametri concretizeaz valorile asupra crora ntradevr trebuie s fie aplicat procedura i care n corpul ei au fost notai cu ajutorul
parametrilor formali. n exemplul nostru parametrii formali snt de tip real, deci ca
parametri actuali pot fi luate orice 3 numere reale. n acelai timp corespunderea
dintre parametrii formali i cei actuali este respectat atunci cnd locul, numrul i
tipul parametrilor formali este identic cu locul, numrul tipul celor actuali.
Folosind aceste reguli, programul precedent poate avea urmtoerea redacie:
Program patrulater3;
Var AB, BC, CD, DA, BD, s,s1,s2:real;
Procedure aria(a,b,c: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:=S;
aria(BC,CD,BD); S2:=S;
writeln(S=,S1+S2);
End.
Dup cum se observ variabila global p folosit numai n cadrul procedurii
aria a fost transformat n variabil local procedurii. Este uor de vzut c
corespunderea dintre parametrii formali i cei actuali este respectat. La apelul
aria(AB,DA,BD) parametrului actual AB i corespunde parametrul formal a, lui DAb, lui BD-c. Parametrii a,b,c exist numai att timp, ct este ndeplinit procedura;
dup terminarea execuiei procedurei aceti parametrii snt nimicii din memorie. La
urmtorul apel al procedurii aria, parametrilor formali nounscui le corespund alte
valori, respectiv BC,CD,BD.
44

Mecanismul de substituire a parametrilor formali prin parametrii actuali se


numete transmiterea parametrilor.
Transmiterea parametrilor.
n Pascal exist dou mecanisme de baz pentru transmiterea parametrilor: prin
valoare i prin adres.
Transmiterea prin valoare se realizeaz ca i cum la intrarea n procedura
apelat s-ar gsi o declaraie a parametrului formal cu tipul corespunztor i o
instruciune de atribuire de forma:
parametru formal: =parametru actual;
Valoarea parametrului actual este memorat n locaia corespunztoare
parametrului formal. Un parametru formal al unei proceduri sau al unei funcii se
comport ca o variabil local a subprogramului, cu excepia faptului c acesta este
iniializat la activarea subprogramului cu valoarea parametrului actual corespunztor.
Aceast iniializare este echivalent cu copierea valorii parametrului actual n spaiul
datelor locale subprogramului.
Deseori la transmiterea prin valoare se modific valoarea unui parametru formal.
Printr-o astfel de modificare informaia din exteriorul procedurii rmne nealterat.
Din aceast cauz mecanismul transmiterii parametrilor prin valoare prezint
avantajul siguranei: informaia din exteriorul subprogramului nu este schimbat dac
se modific valoarea parametrilor actuali respectivi.
Sintaxa de declarare a procedurii cu trsnsmiterea parametrilor prin valoare este
ca i n exemplu precedent: Procedure nume(nume_parametru:tip_parametru);
Parametrul actual corespunztor parametrului formal ntr-o instruciune de apel
de procedur este o expresie. Valoarea acestei expresii nu poate s fie de tip fiier sau
un tip structurat care conine un tip fiier. Dac tipul parametrului actual este string,
atributul de lungime al parametrului este 255.
Transmiterea prin adres se folosete atunci cnd o variabil trebuie redat
procedurii sau funciei apelante (adic un rezultat obinut n subprogramul apelat
trebuie returnat subprogramului apelant). Aceast metod de transmitere este
semnalat prin prezena cuvntului var n faa numelui parametrului formal, dar care
are i atributul de tip. n acest caz sintaxa va fi urmtoarea:
Procedure nume( var nume_parametru:tip_parametru);
Parametrul actual trebuie s fie o variabil. Orice operaie ce se refer la
parametrul formal se va efectua direct i asupra parametrului actual corespunztor..
Parametrul actual nu poate s fie de tip fiier. Dac parametrul actual este o referin
la componentele unor variabile structurate, dereperrile necesare snt executate
naintea activrii procedurii.
Subliniem faptul c parametrul actual nu poate s fie expresie sau constant. Nu
exist nici o conversie implicit legat de acest mod de transmitere a parametrilor:
ntreg pentru ntreg, real pentru real, interval pentru interval (i nu un interval
oarecare al aceluiai tip de baz).
Exemplul cu programul patrulater3 prezint mecanismul de transmitere a
parametrilor prin valoare.
Folosind mecanismul de transmitere prin adres pogramul precedent va avea forma
urmtoare:
45

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

Writeln(z,!=,fact(z)); {folosirea nemijlocit a funciei}


S:=135+sin(62)*fact(z)/10;
{folosirea funciei ca operand}
End.
Efect colateral
n general scopul unei funcii este s furnizeze ca rezultat o singur valoare.
Aceast valoare urmeaz s fie utilizat n evaluarea unei expresii n programul
apelant. Astfel, singura interfa natural dintre o funcie i programul apelant este
acest rezultat.
Prin efect colateral se nelege o atribuire (ntr-o declaraie de funcie) a unei
valori la o variabil nelocal funciei sau la un parametru variabil. Aceast atribuire
complic n mare msur verificarea i depanarea programelor. Din acest motiv se
recomand evitarea utilizrii unor funcii ce pot provoca efecte colaterale.
Exemplu:
program efectcolateral;
var a,b:integer;
function par(x:integer):integer;
begin b:=b-x;{efect colateral asupra lui b} par:=x*x; end;
begin b:=10;
a:=par(b);
writeln(a,b);
end.
Programul produce urmtoarele rezultate:(100 0 ).
4.4.3 Tipul procedur i funcie
0 definiie de tip procedur sau tip funcie permite manipularea dinamic a
subprogramelor (adic a codului subprogramelor). Aceasta nseamn c un nume de
subprogram poate fi atribuit la o variabil de tip procedur sau funcie. De asemenea,
un nume de subprogram poate fi plasat ca i parametru actual la apeluri. O definiie
de tip procedur specifc numele tipului, numele i tipul parametrilor; la o definiie
de tip funcie apare i tipul valorii returnate de funcie.
De exemplu: type tipf = function (x, y: integer) : integer;
tipp = procedure(var n:real; v:integer);
var fl,f2:tipf;{variabile de tip functie}
p;tipp; {variabila de tip procedura}
De menionat c la defniia tipului nu apare nici un fel de nume de
procedur/funcie.
Avnd o definire de funcie de forma:
Function f (x, y: integer): integer;
Begin f:=x+y+1; end.
este posibil o atribuire de forma: f 1 :=f;
Exemplu. n acest exemplu este definit un tip funcie numit tipf. Se realizeaz un apel
direct i indirect al procedurii apelparf cu parametri actuali de tip procedur:

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.

Denumirea lucrrii (manual,


Autor
Anul editrii
material didactic,ndrumar)
Pascal i Turbo Pascal
Blnescu T. .a
1992
Iniiere n Turbo Pascal
Kalisz E.
1997
Pascal pe interesul tuturor
Anghel,Florin Stnga
1992
Turbo Pascal 6.0 Ghid de utilizare
Sandur Covax
1993
Turbo Pascal 6.0 Programe
Lucian Vasiu .a.
1994
Prelucrarea fiierelor n Pascal
Roca I.
1994
ndrumare metodic de laborator
FCIM
1996
N510
Calculatoare personale
Gremalschi A.
1997
Structura calculatoarelor numerice
Gremalschi A.
1996
Limbajele C i C++ pentru
Negrescu L.
1996
nceptori
Turbo C++
Cojocaru C, O.
1994

..
1988

, -,

, .
1989

..
1991
-

..
1992

--
..
1990


. .
1992


.
1990

,
..
1991

50

S-ar putea să vă placă și