CATEGORII DOCUMENTE |
PROGRAMAREA STRUCTURATA
In FOXPRO au fost implementate principalele comenzi si functii ale programarii structurate, care permit :
executarea unui grup de instructiuni de mai multe ori ;
executarea conditionata 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, alcatuiesc asa numitele "bucle" si este reprezentat de comenzile : FORENDFOR, DO WHILEENDDO si SCANENDSCAN. Al doilea tip, conditionind executarea unor instructiuni de rezultatele evaluarii unor expresii logice, este reprezentat de instructiunile conditionale, de decizie, avind in componenta : IFENDIF, IIF (), DO CASEENDCASE. Comanda IFENDIF are doua forme, care vor permite :
- executarea unor instructiuni numai daca este respectata o conditie data ;
- executarea fie a unui grup de instructiuni, fie a altui grup de instructiuni, in functie de rezultatul evaluarii unei expresii logice.
Comanda are urmatoarea sintaxa :
IF <expL>
<instructiuni 1>
[ELSE]
<instructiuni 2>
ENDIF
La inceputul executiei 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.
- in cazul valorii.F. a expresiei logice apar doua cazuri : daca exista clauza ELSE in comanda, se vor executa instructiunile din grupul <instructiuni 2> dupa care executia se termina ; in absenta clauzei ELSE nu se executa nici o instructiune, comanda terminindu-se imediat.
Exemplul
SET TALK OFF
CLEAR
a=0
b=0
4,10 SAY ' Primul numar' GET a PICTURE '9999'
5,10 SAY ' Al doilea numar' GET b PICTURE '9999'
READ
IF a>b
? 'Primul numar este mai mare'
ELSE
? ' Al doilea numar este mai mare sau numerele sunt egale'
ENDIF
IF b>0
?',a,':',b,'=',a/b
ENDIF
Un efect asemanator, de selectie dintre doua variante se obtine prin functia IIF(), avind 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> este evaluata la.T.
- returneaza rezultatul evaluarii expresiei <expr2> cind <expL> se evalueaza la.F.
Cele doua expresii, <expr1>, <expr2> nu trebuie neaparat sa aiba acelasi tip, acestea putind fi de tip sir de caractere, data calendaristica,logic sau numeric.
Exemplul
SET TALK OFF
CLEAR
a=0
b=0
4,10 SAY 'Primul numar ' GET a PICTURE '9999'
5,10 SAY ' Al doilea numar ' GET b PICTURE '9999'
READ
sir1 = 'Primul numar este mai mare'
sir2 = 'Al doilea numar este mai mare sau numerele sint egale'
? IIF (a>b,sir1,sir2)
Mai multe comenzi IF..ENDIF pot fi imbricate, incluse una in alta,obtinindu-se conditionarea unui grup de instructiuni prin mai multe expresii logice, sau obtinindu-se selectii diverse intre mai multe grupuri de instructiuni.
Exemplul
SET TALK OFF
CLEAR
a=0
b=0
4,10 SAY 'Primul numar ' GET a PICTURE '9999'
5,10 SAY ' Al doilea numar ' GET b PICTURE '9999'
READ
sir1 = 'Primul numar este mai mare'
sir2 = 'Al doilea numar este mai mare sau numerele sint egale'
sir3 = 'Numerele sint egale'
IF a>b
sir1 &&In acest exemplu structura de comenzi IFENDIF poate fi inlocuita cu:
&& ?IIF(a>b,sir1,IIF(a<b,sir2,sir3))
ELSE
IF a<b
? sir2
ELSE
? sir3
ENDIF
ENDIF
Un tip de selectie intre mai multe grupuri de instructiuni este dat de comanda DO CASE. ENDCASE avind sintaxa:
DO CASE
CASE <expL1>
<instructiuni1>
CASE <expL2>
<instructiuni2>
.
CASE <expLN>
<instructiuniN>
OTHERWISE
<instructiuni>
ENDCASE
Comanda va determina executia grupului de instructiuni pentru care expresia logica corespunzatoare are valoarea.T.
Observatie: Numai unul dintre grupurile de instructiuni <instructiuni1>, <instructiuniN> si <instructiuni> va fi executat.
Executarea repetata a unui grup de instructiuni reprezinta unul dintre principalele avantaje ale elaborarii de programe. Comenzile care realizeaza "bucle" sint FOR ENDFOR, DO WHILE ENDDO si SCAN ENDSAN, acestea impartindu-se,la rindul lor in doua grupe :
comenzi pentru bucle cu un numar dat de pasi, in care un grup de instructiuni se executa de un numar dat de ori : FOR, SCAN ;
comenzi folosite pentru bucle cu un numar nedefinit de pasi in care numarul de executari a grupului de instructiuni este variabil, fiind dependent de o conditie asociata comenzii : DO WHILE.
Comanda FORENDFOR cu sintaxa:
FOR <var> = <expN1> TO <expN2>[STEP<expN3>
<instructiuni>
EXIT
[
ENDFOR | NEXT
determina
executarea repetata a grupului de instructiuni <instructiuni>,
contorizarea acestor pasi fiind facuta printr-o variabila <var>. Valoarea
initiala a variabilei contor va fi data de evaluarea expresiei <expN1>.
Dupa fiecare executie a grupului de instructiuni <instructiuni> variabila
va fi incrementata sau decrementata, cu o valoare
Exemplul
FOR i=1 TO 4
ENDFOR
este echivalenta cu grupul de comenzi:
comanda FOR i=4 TO 1 STEP -2
ENDFOR este echivalenta cu grupul:
Observatie. Cele 3 expresii numerice,<expN1>, <expN2> si <expN3> sint evaluate doar la intrarea in bucla FOR, modificarea acestora in cadrul buclei neavind nici un efect asupra numarului de executari ale instructiunilor.
Exemplul
a=3
FOR i=1 TO a &&i va lua valorile 1,2,3
a=10
? i*2
ENDFOR
In schimb modificarea valorii contorului in interiorul buclei va influenta numarul de executii a grupului de instructiuni, testarea variabilei contor facindu-se la fiecare noua executie a <instructiuni>.
Exemplul
FOR i=1 TO 10
?i
i=15
ENDFOR
Comanda ?i va fi executata o singura data.
Clauza EXIT
determina iesirea fortata din bucla si continuarea executiei programului cu
prima comanda care urmeaza dupa ENDFOR, indiferent de valoarea variabilei
contor. Clauza LOOP determina saltul peste urmatoarele instructiuni ale
buclei (dintre
Exemplul
suma=0
FOR i=1 TO 10
suma=suma+1
IF i=5
EXIT
ENDIF
ENDFOR
Urmatorul program este identic ca rezultat cu cel precedent:
suma=0
FOR i=1 TO 10
IF i=5
ENDIF
suma=suma+1
ENDFOR
ENDFOR poate fi inlocuit cu NEXT, cu aceeasi semnificatie. Un tip special de bucla, foarte asemanatoare cu FOR ENDFOR dar specializata in lucrul pe o baza de date este reprezentata de comanda SCAN ENDSCAN cu sintaxa :
SCAN [NOOPTIMIZE]
[<domeniu>][FOR<expL1>][WHILE<expL2>]
[
[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. Clauzele LOOP si EXIT au acelasi efect ca in cazul comenzii FOR ENDFOR.
Exemplul
SCAN <instructiuni>
ENDSCAN
are acelasi efect cu
FOR i=1 TO RECCOUNT()
GOTO i
<instructiuni>
ENDFOR
SCAN NEXT 10 FOR MOD(RECNO(),2)=0
<instructiuni>
ENDSCAN
este echivalent cu:
FOR i=RECNO() TO RECNO()+9
IF MOD(RECNO(),2)=0
<instructiuni>
ENDIF
ENDFOR
Expresia MOD(RECNO(),2)=0 are valoarea.T. daca inregistrarea curenta are un numar par si valoarea.F. in caz contrar.
Cel de-al doilea tip de bucla,cu numar nedefinit de pasi este implementat prin DO WHILE ENDDO cu sintaxa:
DO WHILE <expL>
<instructiuni>
[
[EXIT]
ENDDO
Executia comenzii se va desfasura astfel: se evalueaza expresia <expL> si daca aceasta are valoarea.F. executia comenzii se incheie. Daca valoarea acesteia este.T. se vor executa instructiunile din <instructiuni>. La intilnirea lui ENDDO se sare la linia continind DO WHILE si expresia <expL> este reevaluata. Acest ciclu se continua pina cind o evaluarea a expresiei logice <expL> va conduce la valoarea.F. cind executia comenzii DO WHILE ENDDO se incheie, programul continuind cu prima instructiune de dupa ENDDO. Comenzile LOOP si EXIT au aceeasi semnificatie ca si la comanda FOR
Exemplul
suma=0
p=1
DO WHILE suma > 100
suma = suma+p
p=p+1
ENDDO
SET SAFETY ON | OFF
-vom fi (ON) sau nu (OFF) avertizati inainte de stergerea fisierului sau de o eventuala scriere peste continutul unui fisier existent pe disc.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 909
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved