Limbajul Pascal abc-doar


de interfata(INTERFACE),partea de implementare(IMPLEMENTATION) si partea



Yüklə 2,15 Mb.
səhifə22/24
tarix03.11.2017
ölçüsü2,15 Mb.
#28851
1   ...   16   17   18   19   20   21   22   23   24

de interfata(INTERFACE),partea de implementare(IMPLEMENTATION) si partea

de initializare(bucla begin...end).

Antetul(Heading) contine cuvantul cheie UNIT si numele unitatii.

Interfata contine toate declaratiile: modulele incluse cu uses,declaratia

pentru constantele,variabilele,tipurile de data,functiile si procedurile

utilizate in modul.

Implementarea contine definitiile pentru: modulele incluse cu uses(daca

este cazul),etichetele(labels),constantele,variabilele,procedurile si

functiile declarate in patrea de interfata.

Initializarea contine toate instructiunile si comenzile cuprinse in

interiorul buclei begin...end,cu scopul de a initializa unitatea.

Pentru a edita o unitate noua,este bine sa scrieti initial un program

oarecare(.pas) in care sa verificati si depanati toate datele declarate si

definite. Dupa verificarea exhaustiva a sintaxei si a datelor,inlocuiti


-181-

in antetul filei cuvantul cheie PROGRAM cu cuvantul cheie UNIT.Apoi

separati componentele modului in cele patru parti introducand cuvintele

cheie INTERFACE (imediat dupa antet) si IMPLEMENTATION (intre partea de

declaratii si cea de definitii ).In final eliminati din bucla begin...end

toate apelurile utilizate pentru verificarea datelor(este de dorit ca

bucla begin...end sa fie goala,deoarece toate instructiunile existente

vor fi executate in fiecare program care apeleaza unitatea).In final

compilati fila si unitatea este gata.

EXEMPLU:

unit Unit1;

INTERFACE

uses WinCRT;

procedure Text(a,b:integer);

IMPLEMENTATION

procedure Text(a,b:integer);

begin

writeln('Exemplu de implementare a unei unitati:');

a:=10;

b:=7;

writeln('a= ',a,' b= ',b);

writeln('produsul a*b= ',a*b);

end;

begin

end.

Salvati fila initial cu extensia .pas (unit1.pas) apoi compilati fila

si verificati daca a aparut in director si fila unit1.TPW (cu un utilitar

de DOS sau Windows).

Pentru a utiliza unitatea,scrieti un program de genul:

EXEMPLU:

program prog1;

uses unit1;

begin

Text(1,1);

end.

Observati ca nu mai este necesar sa incarcam unitatea WinCRT,deoarece

este deja incarcata in memorie din unitatea UNIT1.

Asadar,scrierea unei unitati comporta trei etape:

1. -se editeaza fila .pas care contine codurile

2. -se compileaza fila pentru a obtine o fila .TPU sau .TPW

3. -se include unitatea in programul dorit cu uses...(numele unitatii)

In acest mod,cu ajutorul limbajului Pascal se pot edita module de pro-

gram compatibile cu mai multe sisteme de operare(Linux,Windows,BeOs,

FreeBSD,NetBSD,Pascal,Delphi etc...),cu conditia ca programul care le

apelaza sa utilizeze conventiile potrivite de apel.

Este bine si util sa insotiti intotdeauna unitatea realizata si cu

fila de tip Pascal(cea cu extensia .pas),din urmatoarele motive:

1. -in eventualitatea ca doriti sa actualizati,modernzati,complectati sau

transformati unitatea

2. -daca este necesar sa depanati un program care apeleaza unitatea res-

pectiva si nu stiti exact ce elemente contine sau ce spatii de memorie

ocupa datele din unitatea respectiva


-182-

3. - este mai usor sa atasati fila sursa (codurile) decat sa scrieti

cateva pagini de explicatii despre fila respectiva

4. - pentru a permite ca unitatea sa poata fi utilizata de catre sisteme

diferite de operare(exemplu o unitate scrisa in Pascal si apelata

din Delphi trebuie sa fie compilata din Delphi,in caz contrar pot

sa apara incompatibilitati de format al datelor:-EXEMPLU date de

tip integer pot fi in format de 16 biti in Pascal si 32 de biti in

Delphi)

5. - pentru a permite si altor programatori sa faca modificari sau actua-

lizari in unitatea respectiva
Dupa cum am enuntat deja,toate comenzile si instructiunile din etapa

de initializare,vor fi executate automat si in programele care apeleaza

unitatea,in etapa de compilare.Aceasta proprietate se poate exploata,

atunci cand dorim ca unitatea respectiva sa afiseze un anumit set de date,

sa faca anumite operatii de control,sa verifice memoria libera etc.

EXEMPLU:

unit unit2;

INTERFACE

uses WinCRT,WinDos;

var hour,min,sec,ssec,zi,luna,an,zz:word;

fspace,tspace:longint;

IMPLEMENTATION

begin

GetTime(hour,min,sec,ssec);

GetDate(an,luna,zi,zz);

fspace:=DiskFree(3);

tspace:=DiskSize(3);

writeln('Ora locala este: ',hour,' :',min,' :',sec,' :',ssec);

writeln('data: ',zi,'-',luna,'-',an);

writeln('unitatea C contine: ',fspace,' bytes memorie libera');

writeln('din: ',tspace,' bytes memorie totala');

end.

Pentru utilizarea acestei unitati,nu este necesara nici o linie de

comanda.In momentul incarcarii unitatii in memorie cu uses unit2,toate

instructiunile din bucla begin...end ale etapei de initializare a unitatii

se vor executa automat,inca din etapa de compilare:

EXEMPLU: program prog2;

uses unit2;

begin

end.

Acest gen de implementare este util atunci cand doriti sa efectuati o

serie de operatii preliminare,inainte de a incepe executia programului

,in genul utilitarului BIOS.In mod similar,se poate edita un antet fix,

un tabel,o imagine grafica sau pictografica etc.

Observati economia de spatiu realizata in programul de aplicatie,in

care nu a fost necesar decat sa se incarce unitatea dorita.

O astfel de unitate se poate scrie cu dedicatie pentru un anumit pro-

gram,sau poate fi de uz univarsal (utila pentru orice program sau apli-

catie.Mai mult decat programele,unitatile trebuie sa fie editate cat mai

clar,simplu si scurt,inechivoc si usor de inteles.


-183-

In etapa de Interfata sunt acceptate toate tipurile de date,inclusiv

cele de tip obiect si cele declarate de catre utilizator.Ca rezultat,

o unitate se poate utiliza si pentru a arhiva obiecte care pot fi apoi

apelate cu o singura comanda,la fel ca obiectele standard Windows:

EXEMPLU:

unit unit3;

INTERFACE

uses WinProcs,WinTypes,OStdWnds,OWindows,ODialogs;

type E=object(TApplication)

procedure InitMainWindow;virtual;

procedure InitInstance;virtual;

end;

PE=^TE1;

TE1=object(TFileWindow)

constructor Init(AParent:PWindowsObject;ATitle:Pchar);

end;

IMPLEMENTATION

constructor TE1.Init(AParent:PWindowsObject;ATitle:PChar);

begin

TFileWindow.Init(AParent,Atitle,'EDITOR 1');

Attr.Menu:=LoadMenu(hInstance,'FileCommands');

end;

procedure E.InitMainWindow;

begin

MainWindow:=New(PE,Init(nil,'Fereastra de editare'));

end;

procedure E.InitInstance;

begin

TApplication.InitInstance;

if Status = 0 then

HAccTable:=LoadAccelerators(hInstance,'FileCommands');

end;

begin

end.

Aceasta unitate defineste si incarca un obiect de tip TFileWindow,

impreuna cu meniul si tastele de accelerare specifice.Obiectul poate fi

utilizat pentru a edita si arhiva orice fila de tip text,sau pentru a

verifica si deschide filele din arhiva existenta.Se poate utiliza in

orice program cu un apel de genul:

EXEMPLU: program prog3;

uses unit3;

var UnEditor:E;

begin

UnEditor.Init(nil);

UnEditor.Run;

UnEditor.Done;

end.

Observati ca tipul de data al obiectului si toate unitatile de memorie

sunt incarcate cu unitatea UNIT3.Nu mai este necesara decat declararea

unei variabile din tipul respectiv si apoi apelul direct al metodelor

din obiect.Similar se pot arhiva toate obiectele necesare sau utile.


-184-

O procedura,functie,sau un obiect,se poate declara si defini intr-o

unitate si fara a include unitatile auxiliare necesare(WinProcs,WinCRT,

etc.) dar in acest caz,unitatile standard trebuiesc incluse in memorie

in programul care apeleaza unitatea (in caz contrar datele vor fi nede-

finite).

EXEMPLU:

unit unit4;

INTERFACE

procedure Greutate;

var L,R1,R2,D,G:real;

begin

D:7.85;

writeln('Calculul greutatii pentru o teava din otel:');

writeln('Introduceti lungimea (in mm):');

readln(L);

writeln('Introduceti Raza exterioara (in mm):');

readln(R1);

writeln('Introduceti Raza interioara (in mm):');

readln(R2);

G:=((L*Pi*R1*R1/2)-(L*Pi*R2*R2/2))*D/1000000;

writeln('Teava masurata cantareste: ',G,' Kg');

end;

begin

end.

Unitatea se poate accesa cu un program de genul:

EXEMPLU: program prog4;

uses unit4,WinCRT;

begin

Greutate;

end.

Acest gen de implementare se recomanda atunci cand doriti sa grupati

o serie de calcule,formule sau functii pe care le utilizati frecvent si

scontati sa le implementati in mai multe programe sau aplicatii.Daca nu

se introduc si unitatile de memorie necesare pentru declarare si defi-

nitie,se realizeaza o economie oarecare de memorie,dar trebuie sa stiti

exact ce unitati sunt necesare in momentul apelarii unitatii.Este mai

comod sa includeti si unitatile necesare.

Toate datele existente in unitatile statice declarate cu UNIT sunt

exportate in momentul compilarii si sunt prezente in memorie pe toata

durata executiei unui program.Ca rezultat,se poate include in unitati si

apelul catre alte unitati,dar selectia trebuie facuta cu maximum de eco-

nomie,deoarece unitatile o data incarcate nu mai pot fi eliberate din

memorie (Exemplu: atunci cand o anumita variabila necesita o unitate

intreaga doar pentru definitia tipului de data,este recomandabil ca

sa fie inlocuita ori de cate ori este posibil cu o variabila banala care

sa nu supraincarce memoria de operare,doar pentru un tip de data mai

exotic).In general,datele din unitati trebuie sa fie reduse la minimum

necesar (fara explicatii,inflorituri,artificii de calcul,spatii goale de

rezerva sau variabile de rezerva neutilizate,etc.).

In unitati,functiile se declara,se definesc si apoi se apeleaza la fel

ca orice alta functie (apelul se face in cadrul unei expresii).


-185-

O functie trebuie sa returneze intotdeauna o valoare oarecare.Daca nu

aveti nevoie de valoarea returnata (utilizati doar datele din corpul

functiei) alegeti pentru returnare tipul de data cel mai economic,sau

respectiv tipul de data care sa va permita o exploatare viitoare cat mai

rationala a functiei respective (prin adaugarea de instructiuni noi care

sa valorifice si valoarea returnata).

EXEMPLU:

unit unit5;

INTERFACE

var L1,L2,G,aria,suprafata,greutatea,volumul:real;

function Cornier:real;

IMPLEMENTATION

function Cornier:real;

begin

writeln('CALCULUL UNUI CORNIER SIMETRIC DIN OTEL:');

writeln('Introduceti lungimea (in mm):');

Readln(L1);

writeln('Introduceti latimea unei laturi (in mm):');

Readln(L2);

writeln('Introduceti grosimea tablei (in mm): ');

Readln(G);

aria:=2*L1*L2;

writeln('aria= ',aria,' mm patrati');

suprafata:=4*L1*L2+2*L2*G-2*L1*G;

writeln('suprafata totala= ',suprafata,' mm patrati');

volumul:=2*L1*L2*G-L1*G*G;

writeln('volumul total= ',volumul,' mm cubi');

greutatea:=volumul*7.85/1000000;

writeln('Greutatea cornierului este: ',greutatea,' kg');

end;

begin

end.

Pentru apelarea functiei se poate utiliza un program de genul:

EXEMPLU: program prog5;

uses WinCRT,unit5;

var a;real;

begin

a:=Cornier;

end.

Observati ca valoarea returnata de functie nu este necesara in program.

Am utilizat totusi o valoare de tip real,pentru a putea modifica oricand

functia astfel incat sa returneze una dintre valorile calculate (de

exemplu adaugand o instructiune de genul : return greutatea ).

Este bine ca procedurile si functiile din unitati sa fie cat mai usor

de modificat sau actualizat.Modificarea unei unitati are ca rezultat,

actualizarea automata a tuturor unitatilor care apeleaza unitatea res-

pectiva.Astfel,modificand o singura unitate se pot actualiza uneori zeci

sau sute de aplicatii,simultan.Reciproc,o eroare de conceptie sau de im-

plementare la nivelul unei unitati va invalida toate programele si apli-

catiile care apeleaza unitatea respectiva.Pentru siguranta,este bine sa

faceti copii de siguranta,pentru toate unitatile importante.


-186-

O unitate poate fi utilizata si pentru a stoca un set de constante si

de variabile initializate,atunci cand un numar mai mare de aplicatii

urmeaza sa apeleze aceleasi date.In plus,valorile sunt mai usor de actu-

alizat,si depanat si nu exista riscul de a fi corupte in cursul executiei

programelor.Datele pot fi salvate ca atare,sau pot fi preformatate sub

forma de tabele,matrici,sigle si anteturi etc.

EXEMPLU:

unit unit6;

INTERFACE

const text1:string='S.C. INFORMATICA S.R.L.';

text2:string='Program nr.1 versiunea 1.0';

index1:integer=101;

index2:integer=102;

index3:integer=103;

var nr1,nr2,nr3:integer;

v1,v2,v3:real;

IMPLEMENTATION

begin

nr1:=755;

nr2:=333;

nr3:=500;

v1:=33.725;

v2:=351.25;

v3:=17.68;

end.

Din unitate,datele pot fi preluate si prelucrate cu diferiti algoritmi

si apoi pot fi afisate in formate diferite.Pentru a forma un tabel simplu

se va scrie un program de genul:

EXEMPLU: program prog6;

uses WinCRT,unit6;

begin

writeln(text1);

writeln(text2);

writeln;

writeln(' TABEL DE VALORI');

writeln;

writeln(index1:20,index2:20,index3:20);

writeln(nr1:20,nr2:20,nr3:20);

writeln(v1:20,v2:20,v3:20);

end.

In exemplele de pana acum,am utilizat toate datele din fiecare unitate

declarata.Chiar daca toate datele din unitatile statice sunt accesibile in

momentul compilarii,pentru a controla procesul de compilare a datelor se

pot utiliza directivele conditionale de compilare($DEFINE,$ELSE,$ENDIF,

$IFDEF,$IFNDEF,$IFOPT si $UNDEF).Aceste comenzi,se introduc intre acolade

si controleaza procesul de compilare,astfel incat nu se vor introduce in

memorie decat datele care respecta sau verifica conditiile prestabilite

cu ajutorul acestor directive.In prezent,aceasta practica a fost inlocuita

de catre bibliotecile cu alocare dinamica (DLL),dar exista situatii in

care acest mecanism este inca in uz (Exemplu:-utilizarea partiala a unor

unitati de date mai vechi-pentru a face economie de memorie).


-187-

EXEMPLU: unit unit7;

INTERFACE

{$ifndef WinCRT}

uses WinCRT;

{$endif}

const culoare1:integer=5;

culoare2:integer=7;

culoare3:integer=2;

culoare4:integer=1;

culoare5:integer=4;

IMPLEMENTATION

begin

end.

Exemplul de mai sus poate fi utilizat pentru a salva o anumita paleta

de culori.Conditia de precompilare $ifndef permite ca unitatea WinCRT sa

fie incarcata doar daca nu este deja definita in unitate.Cu un mecanism

similar se pot selecta unitatile incarcate in memorie in functie de o

anumita valoare din unitate:

uses

{$ifdef VALOARE1}

WinCRT,WinProcs,WinTypes;

{$else}

WinCRT;

{$endif}

Astfel este posibil ca unitatile standard sa nu fie apelate in mod re-

petat,sa se evite suprascrierea accidentala a unor unitati care sunt de-

numite la fel(au acelasi identificator) si se permite selectarea unor

date in functie de o conditie prestabilita.EXEMPLU: -unitatile generate

automat,in Delphi,vor fi denumite unit1,unit2...etc si vor suprascrie

automat cele definite in exemplele precedente(Din acest motiv este bine

sa denumiti altfel unitatile declarate de d-voastra).

Pentru apelarea unitatii se poate utiliza un program de genul:

EXEMPLU: program prog7;

uses unit7;

begin

writeln('Paleta 1 de culori:');

writeln('culoare 1= ',culoare1);

writeln('culoare 2= ',culoare2);

writeln('culoare 3= ',culoare3);

writeln('culoare 4= ',culoare4);

writeln('culoare 5= ',culoare5);

end.

Exemplul de mai sus poate fi dezvoltat si pentru palete de culori com-

patibile cu interfata Windows(in locul valorilor de tip integer se vor

utiliza valori longint declarate cu functia RGB() ).Unitatea poate contine

un set de palete de colori,dintre care se va selecta pentru precompilare

doar una dintre ele,in functie de necesitatile de moment.In acest mod,

cu o singura unitate se pot asigura un numar nelimitat de palete de culori

pentru un numar nelimitat de aplicatii si programe.Acest gen de aplicatii,

stau la baza conceptului modular de programare structurata si au permis

dezvoltarea actuala a programelor de tip multitasking.


-188-

EXEMPLU:

unit unit8;

INTERFACE

uses WinCRT;

IMPLEMENTATION

{ {$define PAROLA}

{$ifndef PAROLA}

begin

writeln('Accesul este interzis !');

exit;

($else}

begin

writeln('Accesul este permis: ');

writeln('urmeaza implememntarea propriu-zisa:');

writeln('.......');

writeln('...restul unitatii !');

{$endif}

end.

Pentru apelarea unitatii se poate utiliza un program de genul:

EXEMPLU: program prog8;

uses unit8;

begin

end.

Observati ca daca apelati unitatea asa cum este definita mai sus,se

va compila doar partea inclusa intre directivele ($ifndef PAROLA} si

respectiv {$endif}.Pentru a compila selectiv cealalta bucla este necesar

sa stergeti prima acolada din expresia ( ($define PAROLA) astfel

incat expresia sa devina ($define PAROLA}.Apoi recompilati unitatea si

apelati din nou programul prog8.

Acest exemplu ilustreaza o data in plus de ce este bine sa insotiti

unitatile compilate (.TPU si .TPW) si de fila sursa de tip .PAS.Practic

dint-o singura unitate se obtin doua unitati complet distincte.

Astfel,cu ajutorul directivelor conditionale de precompilare se pot

Yüklə 2,15 Mb.

Dostları ilə paylaş:
1   ...   16   17   18   19   20   21   22   23   24




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin