Curs+6+SGBD

download Curs+6+SGBD

of 27

description

Curs+6+SGBD

Transcript of Curs+6+SGBD

  • 1

    1. Masive de date: vectori i matrici

    Masivele de date pot fi privite ca variabile sau constante, care au o structur

    compus, identificarea n cadrul structurii fcndu-se pe baza unui criteriu de poziie. Pentru vector criteriul de poziie este numrul de ordine al elementului, pentru matrice, criteriul de poziie este fie numrul liniei i al coloanei, fie liniariznd matricea, se poate adresa un element prin poziia care o ocup n masiv (de exemplu, ntr-o matrice A de dimensiune 3x3, elementul A(3,2) este al 8-lea element din matrice i se poate adresa cu A(8)). Prin liniarizare o matrice poate fi adresat ca un vector. Calculul poziiei n matricea liniarizat (vector), pe baza coordonatelor linie/coloan se poate face cu formula:

    poziie=(linie-1)*Nr_linii+coloan Utilizarea masivelor de date comport urmtoarele aspecte:

    CURS

    Tehnici de programare n FoxPro: programarea

    pocedural i programarea orientat pe obiecte

    6

    Sumar MASIVE DE DATE: VECTORI I MATRICI Declararea i utilizarea vectorilor i matricelor Funcii de prelucrare a masivelor

    PROGRAMAREA PROCEDURAL Programarea structurat Modularizarea programelor

    PROGRAMAREA OBIECTUAL De ce programare orientat spre obiecte? Clase i obiecte ncapsularea Motenirea Accesul la membrii unei clase Folosirea obiectelor ca membri ai unei clase Folosirea claselor predefinite

  • 2

    atribuirea unui nume pentru identificare; declararea tipului de masiv: vector sau matrice (rezervare zon de memorie);

    1.1 Declararea i utilizarea vectorilor i matricelor Masivele (vectori , matrice) de date pot fi declarate n dou moduri:

    fie la nceputul programului sau al subprogramului, utiliznd comanda PUBLIC (variabi global) sau LOCAL (variabil local):

    PUBLIC [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])... LOCAL [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...

    Variabilele create cu PUBLIC / LOCAL sunt iniializate cu valoarea fals (.F.). Variabilele locale sunt legate de funcia sau procedura n care au fost declarate, dar pot fi transmise prin referin;

    fie n interiorul programului utiliznd una din comenzile:

    DIMENSION [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])...

    DECLARE [ARRAY] nume_masiv1(n_linie[,n_col])[, nume_masiv2(n_linie[,n_col])... Elementele masivului sunt iniializate cu valoarea fals ca i n primul caz. Dup declarare, masivul poate fi iniializat global (toate elementele capt aceeai valoare) i cu aceast operaie se stabilete tipul de date al elementelor masivului:

    STORE TO

    Exemplu DIMENSION MAT(5,7) STORE 0 TO MAT Tipul i dimensiunile unui masiv de date pot fi modificate n cadrul aceluiai program, prin noi declaraii DIMENSION, DECLARE. 1.2 Funcii de prelucrare a masivelor

    ALEN (nume_masiv,n) Returneaz urmtoarele informaii:

    numrul de elemente, dac n=0; numrul de linii, dac n=1; numrul de coloane, dac n=2.

    AINS(nume_masiv,n[,2]) Are ca efect:

    inserarea unui element nou ntr-un vector, inaintea elementului de pe poziia n; inserarea unei linii ntr-o matrice, naintea liniei cu numrul n, argumentul 2

    lipsete;

  • 3

    inserarea unei coloane ntr-o matrice, naintea coloanei cu numrul n, argumentul 2 apare.

    Funcia returneaz valoarea 1 dac inserarea s-a efectuat cu succes. Observaie. Inserarea unui element, a unei linii sau coloane ntr-un masiv nu modific dimensiunea masivului, ci duce la pierderea elementelor de pe poziia n.

    ADEL(nume_masiv,n,[2]) Este operaia invers comenzii AINS, deci are ca efect tergerea elementului, liniei, coloanei de pe poziia n. Argumentul 2 trebuie s apar n cazul n care tergem o coloan dintr-o matrice. Prin cele dou funcii elementele unui masiv sunt translatate cu o poziie la dreapta (AINS) sau la stnga (ADEL). Funcia va returna valoarea 1 dac tergerea liniei/coloanei s-a efectuat cu succes.

    ACOPY(masiv_surs,masiv_destinaie[,nr_ncep_surs[,nr_elem_copiate[,nr_ncep_destin]]]) Este comanda de copiere a elementelor unui masiv (surs) n elementele altui masiv (destinaie), unde:

    masiv_surs, masiv_destinaie numele masivelor surs/destinaie; nr_ncep_surs numrul elementului din surs de la care ncepe copierea; nr_elem_copiate numrul de elemente ce vor fi copiate din masivul surs, dac

    are valoarea 1 toate elementele ncepnd cu poziia nr_ncep_surs vor fi copiate;

    nr_ncep_destin numrul elementului din masivul destinaie de la care ncepe inserarea.

    Funcia returneaz numrul elementelor copiate n masivul destinaie.

    ASORT(nume_masiv[,nr_ncep[,nr_elem_sortate[,nr_ordine_sortare]]]) Comanda are ca efect sortarea elementelor unui masiv, putnd preciza primul element de la care ncepe sortarea (nr_ncep), cte elemente vor fi sortate (nr_elem_sortate). Ordinea de sortare (nr_ordine_sortare) va fi ascendent dac argumentul este 0 sau omis, sau descendent dac argumentul este 1 sau orice valoare diferit de 0. Funcia va returna valoarea 1 dac sortare s-a efectuat cu succes, sau 1 n caz contrar. Exemplu. Secvena urmtoare de comenzi va crea o matrice cu 3 linii i 2 coloane, elementele masivului se identific prin numrul de ordine n matricea liniarizat: DIMENSION LIT(3,2) LIT(1) = 'G' LIT(2) = 'A' LIT(3) = 'C' LIT(4) = 'Z' LIT(5) = 'B' LIT(6) = 'N' Elementele din matrice vor fi distribuite astfel:

  • 4

    LINIA COL. 1 COL. 2 1 G A 2 C Z 3 B N

    Sortm masivul cu comanda ASORT() ASORT(LIT,1) Sortarea ncepe cu primul element al masivului (1,1). Elementele din prima coloan a masivului sunt plasate n ordine ascendent prin rearanjarea liniilor masivului.

    LINIA COL. 1 COL. 2 1 B N 2 C Z 3 G A

    Apoi masivul este sortat ncepnd cu elementul 4 (2,2) din masiv =ASORT(LIT,4) Elementele din coloana a 2-a sunt plasate n ordine ascendent prin rearanjarea liniilor masivului, ncepnd cu elementul 4 din masiv.

    LINIA COL. 1 COL. 2

    1 B N 2 G A 3 C Z

    Dac sortarea se efectueaz cu succes funcia returneaz valoarea 1, n caz contrar valoarea 1. Pentru a putea fi sortate, elementele masivului trebuie s fie de acelai tip. Aplicaia 1. Se consider structurile de tabele de mai jos:

    P1 nota romn; P2 nota matematic

    Proba1 matematic; Proba2 romn

    S se realizeze o aplicaie care s preia datele din cele 3 tabele i s creeze o nou

    tabel cu notele candidailor la examenul de bacalaureat primate de la cele 3 comisii de

    corectur, tabel ce va conine datele centralizate. Astfel, se va calcula si media final a

    tuturor elevilor examinai de ctre cele trei comisii.

  • 5

    SET DEFAULT TO "D:\BAZE DE DATE\LABORATOR5" CLOSE ALL DATA CLEAR * se creaza o baza de date cu preluare din cele trei anterioare DELE FILE BAC.DBF SELECT 1 CREATE DBF BAC(NUME c(20), ROM N(5,2), MATE N(5,2), MED N(5,2)) SELECT 2 USE COMISIE1 SELE 3 USE COMISIE2 SELE 4 USE COMISIE3 * se copiaza inregistrarile in masive bidimensionale SELE 2 &&sau SELE b sau SELE Comisie1 COPY TO ARRAY a SELE 3 COPY TO ARRAY b fields nume, rom, mate SELE 4 COPY TO ARRAY c fields candidat, proba2, proba1 * se face operatia inversa, adica din matrice in tabele SELE 1 APPEND FROM ARRAY a APPEND FROM ARRAY b APPEND FROM ARRAY c REPL ALL MED WITH (ROM+MATE)/2 BROW 2. Programarea procedural

    Mediul VFP ofer pe lng modul de lucru n fereastra de comand (stil interpretor de comenzi) i posibilitatea de a dezvolta programe surs n limbajul propriu sistemului (stil compilator), prin comenzi i funcii care descriu datele i pot efectua prelucrrile necesare dezvoltrii aplicaiei.

    Programul surs folosete att tehnica de programare procedural (structurat, modular) ct i cea de programare pe obiecte. ntr-un program surs pot fi utilizate de asemenea i comenzile din nucleul SQL, care permit o programare descriptiv i de manipulare a datelor la nivel de tabel.

  • 6

    2.1 Programarea structurat Limbajul are comenzi specifice pentru implementarea celor trei structuri de program fundamentale: secvenial, alternativ (IF i CASE) i repetitiv (WHILE, FOR i SCAN), dar nu are comenzi pentru salt necondiionat. Tehnica programarii modulare se utilizeaz la rezolvarea unor probleme complexe i implic descompunerea problemei n pri componente (module), conform unei metode (top-down, bottom-up) i analiza lor, care stabilete:

    caracteristicile principale ale fiecrui modul; legturile dintre module; alegerea unui modul principal (program, meniu sau videoformat); ierarhizarea modulelor fa de ansamblu.

    Limbajul VFP ofer facilitatea de creare a unui proiect, n care aceste module pot fi declarate n una din categoriile implementate:

    Data se pot declara baze de date (Databases), tabele libere (Free Tables), interogri (Query);

    Class Libraries librrii de clase; Documents - se pot declara videoformate (Forms), rapoarte (Reports), etichete

    (Labels); Code programe (Programs), aplicaii (Aplications); Other alte componente: meniuri (Menus), fiiere de tip text (Text Files); Other Files alte fiiere utilizate: icon-uri, fiiere .BMP etc.

    Toate aceste componente sunt nglobate n proiect, care constituie baza pentru crearea aplicaiei n format executabil. 2.1.1 Structura alternativ Structura alternativ este implementat n cele dou forme:

    cu dou ramuri (comenzile IF, IIF); cu mai multe ramuri (comanda DO CASE).

    Comanda IFENDIF execut condiionat un set de comenzi, n funcie de valoarea logic returnat de o expresie evaluat. Expresia evaluat nu furnizeaz dect dou alternative (ramuri) corespunztoare valorilor adevrat (THEN) sau fals (ELSE).

    IF [THEN] [ELSE ] ENDIF unde:

    exprL specific expresia logic care este evaluat. Dac cele dou clauze THEN i ELSE sunt prezente i expresia este adevrat vor fi executate comenzile de pe ramura THEN, dac expresia este fals, vor fi executate comenzile de pe ramura ELSE.

    Dac expresia logic este fals i ramura ELSE nu este inclus, va fi executat prima comand care urmeaz clauzei ENDIF.

  • 7

    Clauza ENDIF trebuie inclus la orice declarare a unui IF. O comand IF poate include mai multe blocuri IFENDIF pe ramurile sale (imbricare), cu condiia ca nchiderea lor (cu ENDIF) s se fac n aceai ordine ca i deschiderea (nu se admite intersecia blocurilor).

    Aplicaia 2. Se va scrie un program pentru determinarea ecuaiei de gradul al doilea. Se vor folosi preluri de date n tip cu format. CLOSE ALL CLEAR a=0 b=0 c=0 @1,1 SAY "Introduceti coeficientii ecuatiei de gradul II:" @2,4 SAY "a=" GET a @3,4 SAY "b=" GET b @4,4 SAY "c=" GET c READ IF a=0 IF b=0 IF c=0 @6,1 SAY "Ecuatia are o infinitate de solutii." ELSE @6,1 SAY "Ecuatia nu are nici o solutie." ENDIF ELSE @6,1 SAY "Solutia ec. de gradul I este: " + STR(-c/b,10,2) ENDIF ELSE d=b^2-4*a*c IF d

  • 8

    Exemplu: Compararea a dou valori. ?IIF(a>b,Prima valoare e mai mare,; A doua valoare e mai mare sau egala) sau ?IIF(a>b,Prima valoare e mai mare,; IIF(a=b,Valorile sunt egale,A doua valoare e mai mare)) Comanda DO CASEENDCASE Execut primul set de comenzi ale cror expresie condiional este adevrat. Comanda este echivalentul unor instruciuni IF cascadate. DO CASE CASE CASE .... CASE [OTHERWISE ENDCASE Aciunea comenzii:

    CASE ... - cnd prima expresie logic CASE ntlnit, are valoarea adevrat, blocul de comenzi va fi executat pn la apariia unei noi comenzi CASE sau a clauzei ENDCASE. Execuia programului continu cu prima instruciune executabil care urmeaz lui ENDCASE.

    Dac expresia din prima clauza CASE este fals, blocul de comenzi aferent este ignorat i se trece la evaluarea expresiei logice a urmtoarei clauze CASE.

    Dup gsirea primei expresii logice adevrat, orice alt clauz CASE pentru care expresia logic este adevrat, va fi ignorat.

    OTHERWISE - dac toate expresiile logice CASE au returnat valoarea fals, clauza ofer o alternativ pentru introducerea unui bloc de comenzi un bloc de comenzi.

    Exemplu: Structura alternativ. Instruciunea Case @1,1 SAY DATI N: GET N READ DO CASE CASE N = 0 ? 'ZERO' CASE N > 0 ? 'POZITIV' OTHERWISE ? 'NEGATIV' ENDCASE WAIT WINDOW

  • 9

    2.1.2 Structura repetitiv Pentru descrierea structurilor repetitive limbajul pune la dispoziie urmtoarele tipuri de comenzi:

    ciclul de repetiie cu numr finit de pai - comanda FOR...ENDFOR; ciclu cu numr nedefinit de pai, condiionat anterior - comanda DO

    WHILE...ENDDO; o comand de parcurgere a nregistrrilor unui tabel de la nceput la sfrit

    comanda SCAN...ENDSCAN. Comanda FOR...ENDFOR execut un bloc de comenzi de un numr de ori precizat. FOR = TO [STEP ] [EXIT] [LOOP] ENDFOR | NEXT unde:

    var specific o variabil sau un element de masiv, de tip ntreg, care acioneaz ca un contor (variabil de ciclare).

    val_iniial, val_final valoarea iniial respectiv final a contorului. STEP - domeniul dat de valoarea iniial / final poate fi

    parcurs cu incrementul 1 (implicit) sau cu un pas (increment) precizat prin val_increment. Dac val_increment este negativ contorul este decrementat.

    comenzi specific blocul de comenzi care vor fi executate n interiorul ciclului.

    EXIT permite ieirea forat din ciclu (nainte de atingerea valorii finale a variabilei de ciclare). n program va fi executat prima comand care urmeaz clauzei ENDFOR.

    LOOP returneaz controlul napoi comenzii FOR, fr a se mai executa comenzile dintre LOOP i ENDFOR. Contorul este incrementat sau decrementat ca i cum s-ar ajunge la clauza ENDFOR.

    Aplicaia 2. Folosindu-se o instruciune repetitiv cu un numr determinat de pai s se determine valoarea expresiei: S=1-2+3-4+n a) CLOSE ALL CLEAR s=0 semn=1 input "Dati n: " TO n FOR i=1 TO n s=s+i*semn semn=-semn

  • 10

    ENDFOR ?"Valoare expresiei este: "+ALLTR(STR(s)) b) CLOSE ALL CLEAR s=0 semn=1 input "Dati n: " TO n FOR i=1 TO 100 s=s+i*semn semn=-semn IF i=n EXIT ENDIF ENDFOR ?"Valoare expresiei este: "+ALLTR(STR(s)) c) CLOSE ALL CLEAR s=0 semn=1 input "Dati n: " TO n FOR i=1 TO 100 IF i>n LOOP ENDIF s=s+i*semn semn=-semn ENDFOR ?"Valoare expresiei este: "+ALLTR(STR(s)) Comanda DO WHILE ... ENDDO execut un bloc de comenzi n interiorul unui ciclu condiionat anterior. DO WHILE [LOOP] [EXIT] ENDDO unde:

    expr_L specific o expresie logic a crei valoare de adevr determin dac blocul de comenzi cuprins ntre DO WHILE i ENDDO va fi executat. Atta

  • 11

    vreme ct condiia logic este adevrat, comenzile vor fi executate. LOOP returneaz controlul napoi comenzii DO WHILE. Comenzile ntre

    LOOP i ENDDO nu vor fi executate. EXIT transfer controlul, din interiorul ciclului DO WHILE, ctre prima

    comand care urmeaz clauzei ENDDO. Clauza este echivalent cu o ieire forat din ciclu.

    Fiecare comand DO WHILE trebuie s aib un corespondent (s se nchid) ENDDO.

    Aplicaia 3. CLOSE ALL CLEAR s=0 semn=1 i=1 input "Dati n: " TO n DO WHILE i

  • 12

    ENDSCAN indic sfritul procedurii de scanare. Exemplu: Avnd tabela Angajai, se afieaz salariul brut al persoanelor de sex masculin. SCAN FOR sex=.T. ?sal_brut ENDSCAN 2.2 Modularizarea programelor

    Modularizarea programelor, n cazul unor aplicaii complexe, se poate realiza prin proceduri i funcii definite de utilizator.

    Definirea unei funcii utilizator, reprezint un bloc de comenzi independent, care primete un set de parametrii de la programul apelant i returneaz acestuia o valoare ca rezultat al prelucrrii parametrilor de intrare.

    Definirea unei proceduri de ctre utilizator, este de asemenea un bloc de comenzi, care prelucreaz parametrii transmii din programul apelant. Dup prelucrare controlul este redat programului apelant.

    Din punct de vedere al locaiei, funciile se pot defini fie n programul apelant, fie ntr-o librrie sau pot fi salvate n fiiere externe, de tip .PRG. 2.2.1 Proceduri Asocierea procedurilor cu programul apelant se face cu comanda:

    SET PROCEDURE TO [ [,,...]] [ADDITIVE] unde:

    fiier_1,fiier_2 specific succesiunea n care vor fi deschise fiierele. Se pot declara mai multe nume de fiiere care conin proceduri. Aceast opiune permite crearea unor librrii de sine stttoare de funcii care pot fi specificate separat.

    ADDITIVE se deschid fiierele cu proceduri din lista specificat, fr a fi nchise fiierele cu proceduri, deja deschise.

    Cu comanda RELEASE PROCEDURE [ [,,...]] se nchid fiierele individuale. Variabilele definite n interiorul procedurilor i funciilor utilizator, sunt la nivel local (nu se vd din afara procedurilor sau funciilor). Structural o procedur, cuprinde urmtoarele elemente: PROCEDURE nume_procedur specific numele procedurii create PARAMETERS list_parametrii declararea parametrilor formali de intrare bloc de comenzi bloc de comenzi, corpul procedurii RETURN [expresie] ieirea din procedur, opional cu returnarea

    unei expresii calculate.

  • 13

    PROCEDURE este o declaraie n interiorul unui program, care specific nceputul unei proceduri i definete numele procedurii. Numele procedurii poate ncepe cu o liter sau caracterul _ (underscore) i poate conine orice combinaie de litere, numere i caractere underscore. Lungimea maxim a numelui este de 254 caractere.

    PARAMETERS asigur trecerea parametrilor din programul apelant n procedur. Se pot transmite maxim 27 de parametri n procedur. Lista parametrilor poate cuprinde: expresii, variabile de memorie, nume de tabele, nume de cmpuri din tabele de date, constante, care sunt transmise prin referin.

    RETURN [expresie] returneaz controlul i opional o expresie, n programul apelant.

    Parametrii pot fi transmii n procedur, prin includerea clauzei PARAMETERS n procedur, sau prin plasarea unei liste de parametri imediat dup PROCEDURE nume_procedur. Lista se inchide ntre paranteze, parametrii sunt separai cu virgul.

    Apelul unei proceduri sau program se face cu comanda

    DO | WITH Observaii

    Metoda folosit la transmiterea parametrilor la proceduri sau funcii este implicit prin valoare iar la programe prin referin.

    Variabilele transmise ctre procedur cu comanda DO...WITH sunt transmise prin referin.

    Sistemul VFP are anumite restricii legate de utilizarea comenzii DO: pot fi imbricate maxim 32 de apeluri DO (program

    principalprocedura1procedura2...); nu se poate face apel dintr-o procedur la ea nsi (nu admite recursivitatea); din interiorul unei proceduri nu poate fi apelat programul/procedura apelant.

    2.2.2 Funcii

    Elementele unei funcii definite de utilizator (UDF) sunt: FUNCTION nume_funcie

    specific numele funciei create

    bloc de comenzi bloc de comenzi, corpul funciei RETURN [expresie] ieirea din funcie, opional cu returnarea unei expresii

    calculate.

  • 14

    Implicit parametrii sunt transmii n funcie prin valoare. Numrul maxim de parametri care poate fi transmis, este 27. Parametrii pot fi transmii n funcie, prin includerea clauzei PARAMETERS n funcie, sau prin plasarea unei liste de parametri imediat dup FUNCTION nume_funcie. Lista se inchide ntre paranteze, parametrii sunt separai cu virgul. Comanda

    SET UDFPARAMS TO VALUE | REFERENCE specific dac parametrii sunt transmii ctre o funcie definit de utilizator (UDF) prin valoare sau prin referin. Cnd o variabil este transmis prin valoare, valoarea variabilei poate fi modificat n funcia definit de utilizator, dar valoarea original a variabilei n programul apelant nu se modific. Cnd o variabil este transmis prin referin i funcia definit de utilizator modific valoarea variabilei transmise, valoarea original a variabilei n programul apelant de asemenea se modific. Implicit parametrii sunt transmii prin valoare. Se poate fora transmiterea parametrilor ctre o funcie utilizator, n funcie de opiunea aleas n comanda SET UDFPARAMS. Variabilele se nchid ntre paranteze pentru a fora transmiterea prin valoare. Forarea transmiterii prin referin se face tiprind n faa variabilei caracterul @. Aplicaia 4. S se scrie un program care foloseste lucrul procedural ptr calculul combinri de n luate cate k. SET TALK OFF SET SAFE OFF SET DELE ON CLEAR INPUT 'Dati n: ' to n INPUT 'Dati k: ' to k c=Fact(n)/Fact(k)/Fact(n-k) ?'Combninari de',n,' luate cate',k,' este:',c FUNCTION Fact PARAMETERS n f=1 FOR i=1 TO n f=f*i ENDFOR RETURN f Aplicaia 5. Folosirea variabilelor locale si globale intr-un program. SET TALK OFF SET SAFE OFF SET DELE ON CLEAR PRIVATE a

  • 15

    PUBLIC b a=1 b=2 DO Test ?'a=',a ?'b=',b ?'d=',d NOTE vizibile aici sunt doar variabilele a, b si d PROCEDURE Test PRIVATE c PUBLIC d c=3 d=4 ?'a=',a ?'b=',b ?'c=',c ?'d=',d NOTE vizibile aici sunt variabilele a, b, c si d RETURN Aplicaia 6. Transferul parametrilor prin valoare si referinta. S se realizeze functii si proceduri pentru interschimbarea a doua valori numerice. SET TALK OFF SET SAFE ON SET DELE ON CLEAR INPUT 'Dati a: ' TO a INPUT 'Dati b: ' TO b DO schimba1 WITH a,b &&implicit in cazul procedurilor transferul

    parametrilor se va face prin referinta DO afis WITH (a),(b) &&trecerea la apel a parametrilor intre paranteze rotunde specifica transferul prin valoare z=schimba2(@a,@b) &&implicit in cazul functiilor transferul

    parametrilor se va face prin valoare &&in acest caz se poate opta ptr transfer prin referinta, dc se ataseaza semnul @ in fata parametrilor la apel

    DO afis WITH a,b PROCEDURE schimba1 PARAMETERS a,b PRIVATE c c=a a=b b=c RETURN FUNCTION schimba2 PARAMETERS a,b PRIVATE c

  • 16

    c=a a=b b=c RETURN PROCEDURE afis PARAMETERS a,b ? 'a=',a,' b=',b RETURN 3. Programarea obiectual 3.1 De ce programare orientata spre obiecte?

    Traim intr-o lume dinamica, ce sufera in continuu transformari. Elementele naturii nu pot fi descrise complet printr-o serie de caracteristici, ci este necesara si o descriere a comportarii lor in diferite situatii. Sa luam, de exemplu, o masina, pe care o putem descrie sumar prin culoare, numar de locuri, capacitate cilindrica etc. dar la ce bun, daca nu stim sa o pornim sis a o conducem? In acceptiunea programarii orientate spre obiecte (POO), masina ar putea reprezenta un obiect, care ar avea in componenta o serie de caracteristici, dar si o serie de procedure prin careeste descrisa functionarea ei si modul ei de utilizare.

    Un alt exemplu de obiect, deseori intalnit in lumea calculatoarelor, este fereastra. In acceptiunea clasica, o fereastra reprezinta o zona e pe ecran cu anumite proprietati (dimensiune, culoare, continut, etc). Prin comenzi ale limbajului, aceasta fereastra poate fi manipulata, deschisa, afisata, inchisaetc. In POO, o fereastra reprezinta un obiect care are associate anumite proprietati, dar si anumite procedure. Acestea din urma suntexecutate fie la comanda explcita a utilizatorului, fie la aparitia unor anumite evenimente, cum ar fi, de exemplu, un clic cu mouse-ul in interiorul ferestei.

    Unul dintre principalele elemente noi ale sistemului Visual FoxPro (inca de la versiunea 3.0, fata de versiunile anterioare de FoxPro) este introducerea tehnologiei POO, alaturi de varianta clasica de programare (pentru a pastra comparabilitatea cu versiunile anterioare).

    Programarea orientata spre obiecte reprezinta o tehnologie moderna in domeniul programarii calculatoarelor, rezultata din necesitatea unor aplicatii din ce in ce mai complexe. Programarea clasica, structurata suferea din punctual de vedere al controlului programelor de dimensiuni mari, al reutilizarii codului, al adaptarii si al extinderii unor module. Programarea structurata porneste de la celebra ecuatie a lui Niklaus Wirth:

    Structuri de date + Algoritmi = Program Programarea orientate spre obiecte are la baza conceptual de obiect, care

    reprezinta un ansamblu de date impreuna cu procedurile de prlucrare a acestor date. Ecuatia care fundamenteaza tehnologia POO este:

  • 17

    Date + Proceduri = Obiect Prin programarea orientata spre obiecte nu se pot obtine lucruri care nu s-ar putea

    realiza si prin varianta claica de programare. Diferenta dintre cele doua metode consta in modul de abordare. In timp ce programarea clasica se concentreaza pe prelucrari, cea orientate spre obiecte are ca punc central definirea obiectelor.

    De exemplu, definirea si activarea unei ferestre se facea in FoxPro 2.6 (si se poate inca face si in Visual FoxPro) printr-o secventa de tipul:

    DEFINE WINDOW fereastra1; FROM 0,0 TO 20,50; CLOSE FLOAT GROW MINIMIZE ZOOM SYSTEM; TITLE Fereastra definite in modul classic ACTIVATE WINDOL fereastra1 Pentru aceeasi sarcina, in Visual FoxPro se poate folosi (si chiar se recomanda)

    varianta POO, ca in secenta de mai jos: fereastra1=CREATEOBJECT (Form) ferestra1.Caption=Fereastra definite in modul POO fereastra1.BackColor=16777215 fereastra1.Show Chiar daca nu sunt atat de evidente , avantajele POO sunt semnificative. Printre

    acestea enumeram: reutilizarea mai buna a codului, dezvoltarea mai usoara a aplicatiilor, controlul mai bun al programelor de dimensiuni mari etc.

    3.2 Clase i obiecte La baza POO stau conceptual de obiect si cel de clasa. Definitie Un obiect reprezinta un ansamblu de date, impreuna cu procedurile de prelucrare a acestora. In acest context, procedurile poarta denumirea de metode, iar datele obiectului de numesc proprietati.

    Definirea unui obiect se face printr-o clasa. Definitie Clasa reprezinta definitia, intr-un anumit limbaj de programare, a unui tip de obiecte, adica descrierea proprietatilor si a metodelor componente. O clasa reprezinta o notiune abstracta, atata timp cat pe baza ei nu se creeaz un obiect. Crearea unui obiect presupune specificarea clasei care sta la baza sa, in acest mod identificandu-se proprietatile obiectului si felul in care sunt folosite si prelucrate. Exemplu: Sa luam, de exemplu, clasa ferestrelor, care ar putea arata schematic astfel:

  • 18

    clasa fereastra { proprietati: pozitie dimensiune culoare stare de afisare (afisata sau invizibila) metode: metoda de afisare metoda de redimensionare metoda de schimbare a starii de afisare } Daca avem o clasa precum cea de mai sus, nu inseamna ca avem o fereastra, cid oar ca stim prin ce se caracterizeaza un asemenea element. Pentru a avea efectiv o fereastra, trebuie creat un obiect pe baza clasei respective, printr-o instructiune de tipul:

    obiect o_fereastra = Creeaza un obiect pe baza clasei fereastra Desigur ca, in exemplele de mai sus, s-au folosit pseudo-instructiuni, pentru a se intelege mai bine cele doua concepte. Pentru alcatuire instructiunilor Visual FoxPro corespunzatoare, este necesar a fi respectate o serie de reguli de sintaxa ale limbalului. Exemplu: Crearea unui obiect de tip fereastra s-ar realiza printr-o instructiune de tipul: fer = CreateObject (From) Visual FoxPro are predefinite o serie de clase, care pot fi folosite la crearea obiectelor standard, cum ar fi ferestre, obiecte de control ale interfetei cu utilizatorul (butoane, liste, etc), meniuri si altele. Astfel, pentru crearea unui element de acest tip, nu mai este necesara definirea claselor respective, cid oar folosirea lor. Proprietatile obiectelor astfel create pot fi insa modificate, ceea ce va permite se realizati propriile dumneavoastra obiecte. Pe de alta parte, limbajul Visual FoxPro permite dfinirea propiilor dumneavoastra clase, care sa descrie obiectele folosite in programele proprii, pentru care nu s-a gasit o clasa predefinita. Aplicaia 7. S se construiasc un exemplu de clas simpl, i anume lista stiv ca i vector (list static). Aceast list va conine numere. Dup cum am spus mai devreme, o clas conine o mulime de date i procedurile (metodele) prin care aceste date sunt prelucrate. Lista nostr va conine iniial:

    - un vector a, de, s zicem, 10 elemente, n care vom depozita elementele componente (numere);

    - o variabil lung, n care vom memora numrul curent de valori ncrcate n list (maximum 10 elemente, datorit dimensiunii vectorului).

    Ca metode ale obiectelor de tip list vom avea: - push metod pentru adugarea de noi elemente; - pop metod folosit la eliminarea din list a ultimului element introdus;

  • 19

    - afis metod prin intermediul creia sunt afiate elementele listei. Construirea unei astfel de liste se desfoar n dou etape:

    - mai nti se definete clasa pe baza creia se vor construe viitoarele obiecte de tip list. Instruciunea folosit este DEFINE CLASS;

    - apoi se construiete un obiect pe baza clasei definite anterior, folosindu-se comanda CREATEOBJECT.

    Definirea clasei se va face printr-o instructiune de tipul: DEFINE CLASS AS custom . ENDDEFINE Numele noii clase definite va fi , iar cuvntul cheie custom indic faptul c se definete o clas a utilizatorului, care nu are clas printe (nu are proprieti i metode predefinite). Exemplul n ntregime este prezentat mai sus. SET TALK OFF SET SAFE OFF SET DELE ON CLEAR lista_ob=CREATEOBJECT('lista_cls') && s-a instantiat clasa lista_cls prin obiectul lista_ob lista_ob.push(1) lista_ob.afis lista_ob.push(2) lista_ob.afis lista_ob.push(3) lista_ob.afis WAIT WIND 'Dati o tasta pentru a continua.' lista_ob.pop lista_ob.afis lista_ob.pop lista_ob.afis lista_ob.pop lista_ob.afis DEFINE CLASS lista_cls AS CUSTOM && acest cuvant cheie indica faptul ca se defineste o clasa a utilizatorului, care nu are clasa parinte (nu are proprietati si metode predefinite) NOTE date membru DIMENSION a[10] && maxim 10 elemente pot fi introduse in stiva lung=0 && cu 'lung' am notat dimensiunea listei NOTE functii membru (metode) PROCEDURE push PARAMETERS elem IF THIS.lung

  • 20

    THIS.a[THIS.lung]=elem ENDIF ENDPROC PROCEDURE pop IF THIS.lung>0 && testam dc mai exista elemente in lista THIS.lung=THIS.lung-1 ENDIF ENDPROC PROCEDURE afis ?'Elementele listei sunt:' FOR i=1 TO THIS.lung ??THIS.a[i] ENDFOR ENDPROC ENDDEFINE 3.3 Incapsularea Definitie O regula importanta a tehnologiei POO este incapsularea. Conform acesteia, datele mambre ale unui obiect nu pot fi modificate decat prin intermediul metodelor proprii obiectului respective. In acest fel se realizeaza u contol strict asupra obiectului, eliminandu-se eventualele surse de erori provenite din folosirea necorespunzatoare a acetor proprietati. Sa luam exmplul listei din paragraful anterior. Observam ca in clasa listei au fost prvazute procedurile de prelucrare a listelor, adica de adaugare, stergere si afisare. Clasa lista_cls ar fi putut contine doar vectorul a pentru memorarea elementelor componente si variabila lung pentru memorarea lungimii curente a listei.procedurile de prelucrare ar fi putut fi construite ca proceduri independente, care sa fi avut ca obiect de prelucrare datele member ale obiectului lista. Dar, prin aceasta metoda s-ar fi incalcat principiul incapsularii datelor. Cu toate acestea, sistemul nu ar fi generat o eroare, deoarece principiul este recomandat, nu impus. Respectarea principiului incapsularii asigura o indepandenta sporitaa datelor fata de programele de prelucrare. Mai prcis, modificarea structurii datelor membre ale unui obiect conduce la modificarea exclusiva a metodelor membre ale obiectului respective (care prelucreaza datele modificate), programele care utilizeaza obiectul ramanand nealterate. Pentru controlul accesului la proprietatile si metodele unei clase (deci implicit pentru controlul modului de respectare a principiului incapsularii datelor), comanda DEFINE CLASS poseda doua clause, PROTECTED si HIDDEN.

  • 21

    3.4 Mostenirea Definitie Mostenirea reprezinta o alta facilitate specifica tehnologiei POO, conform careia se poate construe o clasa noua pornind de la o clasa dj existenta. Noua clasa va mosteni toate datele si metodele membre ale clasei parinte (cele care nu sunt declarate ascunse), la cae se vor adauga unele noi, definite explicit in noua clasa. Sa luam de exemplu clasa lista_cls_max, pe care o vom onstrui pornind de la clasa lista_cls. Noua clasa va contine, pe langa datele si metodele clasei parinte (lista_cls), o doua data membra, numita max, in care vom memora valoarea maxima din lista, si o noua metoda, numita maxim, care va determina valoarea lui max pe baza valorilor curente ale elementelor listei. Definirea uni clase pe baza alteia se face tot prin instructiunea DFINE CLASS:

    DEFINE CLASS AS ENDDEFINE Noua clasa se va numi , iar clasa parinte (de la care cea noua mosteneste datele si metodele) va fi desemnata prin . Aplicaia 8. Principiul mostenirii. lista=createobject("lista_cls_max") lista.push(-60) lista.push(48) lista.push(-36) lista.maxim define class lista_cls_max as lista_cls max=0 procedure maxim if this.lungime>0 this.max=this.a[1] for i=2 to this.lungime if this.max

  • 22

    clasa a utilizatorului, care nu are clasa parinte (nu are propritati si metode predefinite) dimension a[10] lungime=0 procedure push parameters v if this.lung0 this.lung=this.lung-1 endif endproc procedure afis ?'Elementele listei sunt: ' for i=1 to this.lung ??' ',this.a[i] endfor endproc enddefine 3.5 Accesul la membrii unei clase Uneori, prelucrarea datelor unui obiect (prin metodele acestuia) poate necesita variabile temporare suplimentare, folosite in diferite operatii interne. Aceste variabile trebuie definite tot ca proprietati ale obiectului (pentru a pastra indepandenta obiectului fata de exterior), dar nu trebuie puse la dispozitia utilizatorului clasei, deoarece modificarea lor ar putea afecta prelucrarile. La fel se intampla si cu metodele unui obiect. Pot exista metode care sa fie folosite intern de celelalte metode ale obiectului, dar care sa nu fie puse la dispozitia utilizatorului. Prin urmare, este necesar un mechanism de control al accesului la membrii unei clase, mecanism care sa asigure protectia membrilor la folosiea clasei de catre utilizator. Din acest punct de vedere, membrii unei clase pot fi:

    publici accesibili din interiorul clasei respective (in metodele membre) si din exteriorul acesteia, din momentul in care clasa este definite;

    protejati accesibili atat din interiorul clasei respective, cat si din interiorul subclaselor construite pe baza acesteia (prin mostenire);

    ascunsi accesibili doar prin intermediul clasei respective, nu si din exteriorul acesteia sau din clasele derivate din ea.

    In mod implicit, proprietatile unei clase sunt piblice. Pentru a declara ca private o

    serie de proprietati ale clasei, trebuie ca ele sa fie incluse intr-o instructiune PROTECTED a clasei, ca in schema de mai jos:

  • 23

    DEFINE CLASS PROTECTED , ENDDEFINE

    La fel se declara si membrii ascunsi, declaratia folosita fiind HIDDEN. Pentru metodele unei clase, caracteristica de acces trebuie precizata chiar inaintea

    fiecarei definitii. De exemplu, pentru a declara ca o metoda este protejata, se foloseste constructia:

    PROTECTED PROCEDURE ENDPROC

    Exemplu In definitia clasei c_lista, proprietatea lungime ar putea fi declarata ca protejata (PROTECTED), deoarece ea nu trebuie modificata din exterior, ci numai prin intermediul metodelor clasei (principiul incapsularii). Daca proprietatea respective ar fi fost declarata ascunsa (HIDDEN), atunci ea nu ar mai fi fost disponibila in clasa c_lista_max, derivate din clasa c_lista. Declararea proprietatii lungime ca protejata se face astfel:

    DEFINE CLASS lista_cls AS custom PROTECTED lungime ENDDEFINE Orice referire la lungime din afara clasei este interzisa si va genera un mesaj de eroare. Acest lucru este correct, deoarece nu este binesa modificam aceasta proprietate decat atunci cand se adauga un nou element la lista, iar acest lucru este realizat numai prin intermediul metodei adaug. Procedand insa asa cum s-a descries mai inainte, se obtine un effect collateral, si anume: lungimea curenta a listei nu se mai poate nici macar afla (nu modifica) din afara metodelor clasei pentru ca nu se permite nici macar citirea proprietatii lungime. Pentru a ocoli acest neajuns, se poate construe o finctie membra a clasei care sa returneze valoarea proprietatii lungime: DEFINE CLASS lista_cls AS custom PROTECTED lung FUNCTION nr_elem RETURN This.lung ENDFUNC ENDDEFINE

  • 24

    Am numit noua functie nr_elem, pentru ca ea returneaza numarul current de elemente din lista. Aceasta varianta asigura respectarea stricta a principiului incapsularii datelor. Observatie Atunci cand proiectam o clasa trebuie sa alegem cu grija tipurle de acces pntru fiecare membru in parte. Vom declara protejati (sau ascunsi) acei membrii care sunt folositi intern, pentru implmentarea mecanismului clasei, si publici (adica nu ii vom include in niciuna dintre clasele PROTECTED sau HIDDEN) acei membrii care sunt folositi pentru manipularea obiectului din exterior. Pentru un control mai bun al accesului la membrii unei clase, proiectantii limbajului Visual FoxPro au prevazut doua tipuri speciale de metode si anume cea de tip Access (de accesare) si cea de tip Assign (de atribuire). Mai prcis, pentru fiecare dintre proprietatile unei clase pot fi specificate doua metode, care sunt apelate automat cu ocazia accesarii proprietatii respective (in cazul metodei de tip Acces) sau modificarii valorii proprietatii (in cazul metodei de tip Assign). Metodele trebuie sa poarte acelasi nume cu proprietatea de care sunt legate, avand terminatia _ACCESS, respective _ASSIGN. De exemplu, daca avem proprietatea valoare, atunci metoda de tip Access va fi numita valoare_ACCESS, iar metoda de tip Assign va purta numele valoare_ASSIGN. Observatie Daca incercam sa modificam valoarea unei proprietati care are asociata o metoda de tip Assign, atunci va fi apelata aceasta metoda. In plus, metodei ii va fi transferata valoarea care se incearca sa se atribuie proprietatii. Din acest motiv, metoda de tip Assign trebuie sa aiba prevazuta o linie PARAMETERS, care sa preia valoarea primita ca argument (si eventual sa o foloseasca dupa necesitati). De asemenea, poate fi definite si o metoda de tip Access la nivelul intregii clase, care va fi apelata atunci cand se incearca accesul la oricare dintre membrii clasei.numele acestei metode este THIS_ACCESS. Metodele de tip Access si Assign permit separarea partii folosite intern pentru prelucrarile dintr-o clasa (adica partea de implementare) de cea folosta pentru declansarea diferitelor operatii cu obiectul respectiv de catre cel care manipuleaza obiectul (adica partea de interfata). 3.6 Folosirea obiectelor ca membri ai unei clase Pe langa proprietati si metode, o clasa poate avea ca membrii si alte obiecte. Exemplu O clasa a facturilor ar putea avea ca membri un obiect de tip client pentru vanzator si unul tot de tip client pentru comparator. Aceasta deoarece in orice factura se completeaza o zona referitoare la comparator si una referitoare la vanzator. Includerea unui obiect intr-o clasa se realizeaza cu ajutorul constructiei:

  • 25

    ADD OBJECT PROTECTED AS Cuvantul cheie PROECTED este folosit numai atunci cand noul obiect (proprietatile si metodele sale) se doreste a fi protejat; in caz contrar, obiectul este considerat public. Referirea la proprietatile si metodele obiectului inclus se face, evident, prin precedarea numelor acestora de numele obiectului (separate prin punct): ,, 3.7 Folosirea claselor predefinite Sistemul Visual FoxPro contine o serie de clase predefinite, care pot fi folosite direct de catre utilizator. De exemplu, pentru crearea unei forme nu trebuie definite intreaga clasa a acesteia, ci trebuie folosita doar clasa predefinita Form, care contine toate proprietatile si metodele unei forme. Crearea unui obiect pe baza unei clase predefinite se face cu ajutorul constructiei: = CreateObject() deci la fel ca in cazul unei clase a utilizatorului (definita in codul respective), exceptand faptul ca nu mai este necesara definitia clasei respective. Exemplu Constructia unei forme se realizeaza direct prin: forma = CREATEOBJECT(Form) In urmatorul tabel sunt pezentate clasele predefinite din Visual FoxPro , fara a intra insa in detaliile de utilizare a acestora (proprietatile si metodele lor).

    Nume clasa Semnificatie CheckBox Comutator Column Coloana intr-o grila ComboBox Lista derulanta CommandButton Buton CommandGroup Grup de butoane Container Obiect container (care poate contine alte obiecte) Control Obiect container, fara posibilitatea de acces la obiectele continute Cursor Cursor (creat pe baza unei tabele sau vederi) Custom Clasa folosita pentru cearea propriilor clase ale utilizatorului DataEnviroment Mediul de date (al unei forme, al unui raport etc.) EditBox Zona de editare a textului Form Forma

  • 26

    FormSet Set de forme Grid Grila Header Antet al unei grille Image Imagine Label Text informative Line Linie ListBox Lista OLEControl Control container de tip OLE OLEBoundControl Control container de tip OLE OptionButton Butoane de selectie (radio) OptionGroup Grup de butoane radio Page Pagina a unui set de pagini alternative PageFrame Set de pagini alternative Relation Relatie dintre doua tabele (din mediul de date) Separator Separator pe o bara utilitara Shape Element semigrafic (chenar, elipsa etc.) Spinner Campuri de editare cu butoane de incrementare-decrementare TextBox Camp de editare Timer Obiect de tip ceas ToolBar Bara utilitara Aplicaia 9. Sa se descrie o clasa (tip abstract de date) pentru crearea unui formular simplu. * Mai intai se creaza obiectul de tip forma Forma1=CreateObject("Forma") * Se afiseaza forma definita mai sus Forma1.Show * Se porneste procesorul de evenimente read events * Aici este definita clasa formei prin mostenire de la clasa predefinita Form define class forma as form * proprietatile globale ale formei caption="Salut" height=143 width=359 * aici se adauga obiectele de interfata ale formei * se adauga primul text informativ add object text1 as label * se adauga campul de editare add object camp1 as textbox * se adauga al doilea text informativ add object text2 as label * se adauga butonul add object buton1 as commandbutton

  • 27

    * aici se stabilesc proprietatile si metodele obiectelor de interfata * primul text informativ text1.caption="Cum te cheama?" text1.height=16 text1.left=40 text1.top=24 text1.width=104 text1.visible=.T. * campul de editare camp1.height=21 camp1.left=144 camp1.top=20 camp1.width=169 camp1.visible=.T. * al doilea text informativ text2.caption="Salut" text2.alignment=2 text2.fontsize=12 text2.height=20 text2.left=56 text2.top=60 text2.width=244 text2.visible=.T. * pentru buton buton1.caption="Gata" buton1.height=33 buton1.left=120 buton1.top=96 buton1.width=113 buton1.visible=.T. procedure buton1.click thisform.release cancel endproc procedure camp1.valid thisform.text2.caption="Salut, "+alltrim(this.value) endproc enddefine