Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Programarea structurata in FoxPro

foxpro


Programarea structurata in FoxPro



Prezentarea comenzilor FOR, DO WHILE, SCAN

În FoxPro au fost implementate principalele comenzi si functii ale programarii structurate, care permit:

- executarea unui grup de instructiuni de mai multe ori; 242e43c

- executarea conditionala a unor instructiuni in functie de rezultatul evaluarii unei expresii logice.

Primul tip de comenzi, care determina executarea repetata a uneia sau mai multor instructiuni, este reprezentat de comenzile: FOR ENDFOR, DO WHILE ENDDO si SCAN. ENDSCAN.

Comanda FOR ENDFOR are urmatoarea sintaxa:

FOR <var> = <expN1> TO <expN2> [STEP <expN3>]

<instructiuni>

[EXIT]

[LOOP]

ENDFOR | NEXT

Comanda FOR determina executarea repetata a grupului de instructiuni <instructiuni>, de un numar specificat de ori. Valoarea initiala a variabilei <var> va fi data de expresia <expN1>. Dupa fiecare executie a grupului de instructiuni variabila va fi incrementata sau decrementata, cu o valoare constanta data de expresia <expN3> , daca este prezenta clauza STEP, sau 1 cand clauza STEP lipseste.

Cand valoarea variabilei <var> este mai mare decat valoarea <expN2> se va iesi din bucla, programul continuand cu urmatoarea comanda dupa ENDFOR.

Clauza EXIT in interiorul instructiuni FOR determina iesirea fortata din bucla si continuarea executiei programului cu prima comanda care urmeaza dupa ENDFOR, indiferent de valoarea variabilei contor <var>.

Clauza LOOP in interiorul instructiuni FOR determina saltul peste urmatoarele instructiuni ale buclei (dintre LOOP si ENDFOR) incrementarea sau decrementarea contorului si continuarea executiei grupului de instructiuni, daca se respecta conditia de ramanere in bucla.

Observatie:

Cele trei expresii <expN1> ,<expN2> si <expN3> sunt evaluate doar la intrarea in bucla FOR, modificarea lor in cadrul buclei neavand nici un efect asupra numarului de executari ale instructiunilor.

Exemplu:

FOR i = 1 TO 5

? i

LOOP

i = 10 && nu se va executa niciodata

ENDFOR

Un tip de bucla, foarte asemanatoare cu FOR, dar specializata in lucrul pe o baza de date este SCAN ENDSCAN, cu sintaxa:

SCAN

[domeniu] [FOR <cond1>] [WHILE <cond2>]

<instructiuni>

[LOOP]

[EXIT]

ENDSCAN

Aceasta comanda realizeaza parcurgerea bazei de date curente si executarea grupului de instructiuni <instructiuni>, pentru fiecare inregistrare care apartine domeniului specificat prin <domeniu>, FOR sau WHILE. Domeniul implicit este ALL.

Clauzele LOOP si EXIT au acelasi efect ca in cazul comenzii FOR.. ENDFOR.

Exemplu:

SCAN

<instructiuni>

ENDSCAN

are acelasi efect cu

FOR i =1 to RECCOUNT()

GOTO i

<instructiuni>

ENDFOR

Cel de-al doilea tip de bucla, cu un numar nedefinit de pasi, este implementat in FoxPro prin comanda DO WHILE .ENDDO, avand sintaxa:

DO WHILE <expL>

<instructiuni>

[LOOP]

[EXIT]

ENDDO

Aceasta    comanda determina executia repetata a grupului de instructiuni <instructiuni> , atata timp cat valoarea expresiei logice <expL> este .T.

Clauzele EXIT si LOOP au acelasi efect ca si la comanda FOR ENDFOR.

Executarea conditionala a unor instructiuni este realizata cu ajutorul comenzilor FoxPro IF ENDIF, IIF(), DO CASE ENDCASE.

Comanda IF are urmatoarea sintaxa:

IF <expL>

<instructiuni 1>

[ELSE

<instructiuni 2>]

ENDIF

La inceputul comenzii se va evalua expresia logica <expL> si in functie de rezultatul evaluarii, vom avea:

- daca <expL> este .T. se va executa grupul de instructiuni <instructiuni 1>, dupa care executia comenzii se va termina;

- daca <expL> este .F. apar doua cazuri:

- daca exista clauza ELSE in comanda, se va executa instructiunile din grupul <instructiuni 2>, dupa care se termina executia;

- daca clauza ELSE nu exista nu se va executa nici o instructiune, comanda terminandu-se imediat.

Un efect asemanator, de selectie dintre doua variante, se obtine prin functia IIF(), care are urmatoarea sintaxa:

IIF(<expL>, <expr1>, <expr2>)

Aceasta functie evalueaza expresia logica <expL> si in functie de rezultatul obtinut, returneaza valoarea uneia din expresiile <expr1> si <expr2>:

- returneaza valoarea obtinuta prin evaluarea expresiei <expr1> daca <expL> are valoarea logica .T.

- returneaza valoarea obtinuta prin evaluarea expresiei <expr1> daca <expL> are valoarea logica .F.

Cele doua expresii <expr1> si <expr2> nu trebuie neaparat sa aiba acelasi tip, acestea putand fi de tip sir de caractere, data calendaristica, logic sau numeric

Un tip selectie intre mai multe grupuri de instructiuni este dat de comanda DO CASE ENDCASE, care are urmatoarea sintaxa:

DO CASE

CASE <expL1>

<instructiuni 1>

CASE <expL2>

<instructiuni 2>

[OTHERWISE

<instructiuni>]

ENDCASE

Comanda va determina executia grupului de instructiuni pentru care expresia logica corespunzatoare are valoarea .T.. Executia comenzii va decurge in modul urmator: se evalueaza prima expresie logica <expL1> si daca valoarea obtinuta este .T. se executa grupul de instructiuni <instructiuni>. Daca expresia logica <expL1> are valoarea .F. se trece la evaluarea urmatoarei expresii logice.

Dupa gasirea primei expresii logice cu valoarea .T. si executarea grupului de instructiuni corespunzator, executia comenzii se incheie, programul continuand cu prima instructiune dupa ENDCASE.

Daca nici una dintre expresiile <expL1>, <expL2>,nu are valoarea logica .T. atunci se va executa instructiunile corespunzatoare clauzei OTHERWISE daca aceasta exista altfel se va incheia executia instructiuni.

Proceduri si functii definite de utilizator

O functie definita de utilizator poate intra in componenta unei expresii ca operand, analog functiilor din FoxPro. Definirea unei functii se face prin intermediul comenzii FUNCTION, care are urmatoarea sintaxa:

FUNCTION <nume functie>

<nume functie> reprezinta numele care se atribuie functiei nou definite si care va fi folosit la fiecare apel al acesteia pentru identificarea ei.

Definirea procedurilor se face in mod analog , comanda folosita fiind PROCEDURE, care are urmatoarea sintaxa:

PROCEDURE <nume procedura>

Numele unei functii sau proceduri definite de utilizator poate fi alcatuit din maxim 10 caractere, incepand cu litera sau caracter de subliniere si continuand cu cifre.

Apelul unei functii se face prin numele acesteia, urmat intre paranteze rotunde de lista parametrilor prin care se comunica cu functia. La executare, in locul acestei constructii se va introduce valoarea returnata de functie.

Apelul unei proceduri se face folosind comanda DO, care are urmatoarea sintaxa:

DO <nume procedura>

[ WITH <lista parametri >]

[IN <fisier>]

unde: <nume procedura> - este numele proceduri apelate

<lista parametri> - este lista parametrilor prin care programul comunica cu aceasta.

<fisier> - este numele fisierului care contine procedura cu numele specificat de <nume procedura>

Terminarea executiei unei proceduri sau functii se face fie dupa executia ultimei instructiuni a acesteia, fie la intalnirea uneia dintre comenzile RETURN, CANCEL, SUSPEND, QUIT.

Exemplu:

CLEAR

DO cadru

@ 10, 10 SAY mesaj()

FUNCTION mesaj

RETURN ' SALUT '

PROCEDURE cadru

FOR i = 1 TO 5

? i

ENDFOR

Procedurile si functiile unui program se introduc, de regula dupa ultima instructiune a programului in acelasi fisier cu acesta. Dar acestea se pot introduce in fisiere separate care vor fi asociate programului apelant prin comanda SET PROCEDURE, care are sintaxa:

SET PROCEDURE TO [<fisier>]

Aceasta comanda asociaza programului curent, in executie, fisierul cu numele specificat de <fisier> (cu extensia implicita .PRG), unde se vor cauta procedurile care nu se gasesc in fisierul programului apelant.

SET PROCEDURE TO , fara alti parametrii, determina inchiderea fisierului de proceduri curent asociat programului in executie.

Variabile globale si variabile locale

O variabila consta dintr-o locatie de memorie in care se incarca temporar informatii si care e identificata printr-un nume. Doua tipuri de variabile pot fi referite intr-un modul :

- locale : care pot fi accesate in modulul in care au fost definite si in cele subordonate acestuia.

- globale (publice) : care pot fi accesate si modificate in orice modul in curs de executie, de pe un nivel inferior, egal sau superior nivelului modulului curent.

Pentru ca intr-un modul sa se declare un set de variabile private se foloseste urmatoarea sintaxa:

PRIVATE <lista variabile>

PRIVATE ALL [LIKE | EXCEPT <masca>]

Prin aceasta comanda se declara ca fiind private (dar nu se creaza) variabilele din <lista variabile>. In cazul folosirii celei de-a doua forma se declara toate variabilele care se potrivesc cu <masca> (cand se foloseste clauza LIKE) sau toate variabilele cu exceptia celor care se potrivesc cu <masca> (la folosirea clauzei EXCEPT).

Eventualele variabile globale cu acelasi nume create in alt modul nu sunt suprascrise de variabilele declarate PRIVATE. Valorile anterioare ale variabilelor de memorie PRIVATE sunt retinute in memorie impreuna cu numele programelor (modulelor) care le-au creat. Terminarea programului care le contine, presupune reinstaurarea acelor variabile care au fost 'ascunse ' de catre PRIVATE.

Variabilele globale (publice) se definesc prin comanda PUBLIC, cu sintaxele:

PUBLIC <lista variabile>

PUBLIC [ARRAY] <masiv1> (<expN1> [, <expN2>])

[,<masiv2> ]

Prima forma a comenzii se foloseste pentru crearea si declararea publica a variabilelor din <lista variabile>, iar cea de-a doua forma realizeaza acelasi lucru pentru masive(a caror definire se face la fel cu comanda DIMENSION).

Exemplu:

CLEAR

PRIVATE a

PUBLIC b

a = 1

b = 2

DO test

&& aici se cunosc variabilele a, b, d

&& dar nu se cunoaste variabila c

? ' a = ', a

? ' b = ', b

? ' d = ', d

PROCEDURE test

PRIVATE c

PUBLIC d

c = 6

d = 5

&& aici se cunosc toate variabilele : a, b, c, d

a = c * d

? ' a = ', a

? ' b = ', b

? ' c = ', c

? ' d = ', d

Transferul de parametri la si de la module program

În FoxPro sunt implementate doua metode de transmitere a parametrilor la rutine si programe :

prin referinta, in care variabila transmisa este afectata de eventualele modificari aduse in subprogram;

prin valoare, cand o eventuala modificare a variabilei in subprogram nu afecteaza valoarea acesteia in programul (modulul) apelant.

Transmisia parametrilor la un subprogram se desfasoara in modul urmator :

se stabilesc variabilele care se vor transmite subprogramului ca parametrii, intr-o ordine stabilita de programator la conceperea programului

se stabileste un set de variabile locale subprogramului care vor prelua valorile variabilelor transmise ca parametri de la programul apelant;

corespondenta intre variabilele transmise din programul apelant si cele locale ale subprogramului se face prin pozitia in doua liste si anume : lista cu parametri de apel a subprogramului si respectiv, lista variabilelor locale, specificata prin comanda PARAMETERS;

in modulul apelat se lucreaza cu variabilele locale respective;

daca tipul transmisiei este prin referinta, la sfarsitul executarii subprogramului, continutul variabilelor este trecut in variabilele corespunzatoare, transmise ca parametri;

daca avem o transmisie prin valoare, aceasta ultima copiere nu mai are loc, deci in acest caz variabile de apelare nu vor mai fi actualizate cu noile valori ale variabilelor locale corespunzatoare.

Lista variabilelor transmise ca parametri este stabilita fie prin clauza WITH a comenzii DO, in cazul apelului unui subprogram sau a unei proceduri, fie prin lista dintre parantezele rotunde ce urmeaza numelui functiei, cand avem un apel de functie.

Pentru a stabili in ce variabile locale se incarca parametri transmisi se foloseste comanda PARAMETERS, cu sintaxa :

PARAMETERS <lista variabile locale>

Aceasta comanda, care trebuie sa fie prima comanda a unui modul (in cazul in care aceasta exista) defineste lista de variabile locale care vor prelua parametri transmisi de la programul apelant.

Exemplu :

SET TALK OFF

CLEAR

a = 14

b = 37

? a, ’+’, b, ’=’, suma(a,b)

c = 12

d = 17

prod = 0

DO produs WITH c, d, prod

? c, ’*’, d, ’=’, PROD

FUNCTION suma

PARAMETERS a1, a2

RETURN a1 + a2

PROCEDURE produs

PARAMETERS a1, b1, c1

c1 = a1 * b1

RETURN

În ceea ce priveste metoda folosita la transmisia parametrilor, avem urmatoarele reguli :

la proceduri parametri se transmit implicit prin referinta;

la functii se foloseste implicit metoda transmiterii parametrilor prin valoare.

Pentru a forta transmiterea unui parametru prin valoare, la apelul unei functii, acesta se include intre paranteze rotunde, iar pentru fortarea transmiterii unui parametru prin referinta, acesta va fi predcedat de caracterul ‘@’.

Exemplu :

SET TALK OFF

CLEAR

STORE 1 TO a, b, c, d, e, f

alfa = test((a), @b, ©, (d), @e, @f)

? a, b, c, d, e, f

FUNCTION test

PARAMETERS a1, a2, a3, a4, a5, a6

STORE 2 TO a1, a2, a3, a4, a5, a6

RETURN .T.


Document Info


Accesari: 1318
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )