NOTIUNI GENERALE DESPRE PROGRAMARE
-CONTINUARE-
STRUCTURILE LIMBAJULUI DE PROGRAMARE
Limbajul utilizat de FOXPRO este un limbaj procedural ce permite scrierea unor programe care respecta principiile programarii structurate.Programarea structurata are la baza o teorie matematica complexa care in esenta sustine ca orice actiune poate fi realizata prin utilizarea a trei tipuri de structuri de intructiuni : secventa , selectia si itertia .
Un program se compune din instructiuni sprcifice grupate astfel incat se pot identifica cele trei componente specifice ale programarii structurate.Orice program poate contine alternativ toate cele trei categorii mentionate mai sus , in orice ordine si de oricate ori logica de executie a programului o cere .Un program mai complex va contine toate tipurile de structuri . Cel mai simplu program contine doar o insiruire de instructiuni ,adica din punct de vedere al programarii structurate , o secventa.
Secventa
Secventa este un element al programarii structurate care presupune executia instructiunilor in ordinea scierii lor. Dupa executia completa a unei instructiuni se trece la executia urmatoarei instructiuni ,proces care continua pana cand acest element de structura al programului se termina . Programul poate continua cu o selectie sa iteratie sau se poate termina .
Selectia
Selectia are la baza o decizie care trebuie luata prin program , in functie de ne / realizarea unor conditii . Conditiile se tasteaza la inceputul structurii de selectie .Selectia presupune o ramificare in program , determinata de rezultatul evaluarii conditiei de selectie .
Programatorul trebuie sa se asigure de posibilitatea aveluarii conditiei de selectie impuse ; toate componentele conditiei de selectie trebuie sa fie accesibile din program in momentul evaluarii conditiei.
Cea mai simpla selectie se bazeaza pe o bifurcatie a programului.In acest caz daca este adevarata conditia se executa o secventa de intructiuni ,iar daca conditia este 151f510b falsa se executa o alta secventa de instructiuni .In particular a doua secventa de instructiuni poate fi vida ,adica , conditia fiind falsa un se executa nimic si se termina selectia .Cele prezentate anterior se transpun in limbaj de programare astfel :
IF conditie
instructiuni_1
ELSE
instructiuni_2
ENDIF
Conditia precizata dupa IF poate fi o conditie aritmetica sau logica care se evalueaza. Daca este ineplinita se executa grupa de instructiuni_1 . Daca un este indeplinita conditia se executa grupa de instructiuni_2.Orice structura de selectie se termina printr-o instructiune specifica ENDIF .Neterminarea corecta a selectiei produce erori de programare si de prelucrare a datelor .
Asupra grupelor instructiuni_1 si instructiuni_2 un se impun nici un fel de restrictii adica pot fi de tip secventa, selectie sau iteratie.Daca una din grupele de instructiuni mentionate este de tip selectie , atunci structura este de tip "imbricare" . Imbricarea trebuie folosita cu precautie ,deoarece structurile imbricate pot provoca erori de programare greu de detectat .
Exemplu de imbricare :
IF conditie_1
IF conditie_2
instructiuni_21
ELSE
instructiuni_22
ENDIF
ELSE
instructiuni_11
ENDIF
In exemplul de mai sus s-a folosit scrierea "indentata" .Scrierea indentata presupune evidentierea structurilor utilizate prin alinierea pe coloane a instructiunilor ce fac parte din aceasi structura .Prin scrierea indentata programul devine mai usor e citit si depanat .In exemplul de mai sus oricare din grupele de instructiuni poate contine la randul sau secvente , selectii sau iteratii .Se obtin astfel selectii multiple , imbricate la nivele de imbricare mai "adanci". Selectiile multiple pot complica logica unui program , motiv pentru care se ecomanda sa un se depaseasca 2-3 nivele de imbricare.
S-a mentionat anterior ca selectia poate contine o ramura vida .Ramura vida ( care se omite ) este cea care contine grupa instructiuni_2.Daca acea conditie specificata un este indeplinita , un se executa nimic , se trece peste selectie si se prelucreaza urmatoarea instructiune din program .In acest caz sintaxa selectiei devine :
IF conditie
instructiuni
ENDIF
Marcarea sfarsitului de selectie este obligatorie .Grupa de instructiuni se supune regulilor prezentate anterior ( in particular poate contine o selectie ) . In cazul prezentat , daca acea conditie un este indeplinita , un se executa nimic, deoarece grupa de instructiuni de pe ramura alternativa ( ELSE ) lipseste .
Exemplul 1 :
IF media >=5
? nume + " admis"
ELSE
? nume + " respins"
ENDIF
Daca media candidatului din articolul curent este mai mare decat 5 , se afiseaza numele si textul "admis", in caz contrar se afiseaza numele si textul "respins".
Exemplul 2 :
IF nota_1 > 0
IF nota_2 >0
IF nota_3 > 0
Media = (nota_1 + nota_2 + nota_3 ) / 3
? nume + " " + str (media , 5 , 2 )
ELSE
? nume + "absent la proba 3 "
ENDIF
ELSE
? nume + " absent la proba 2"
ENDIF
ELSE
? nume + "absent la proba 1 "
ENDIF
Exemplul de mai sus prezinta o selectie imbricata .Daca toate notele obtinute sunt mai mari decat 0,candidatul s-a rpezentat la toate examenele ,I se calculeaza si afiseaza media aritmetic a notelor obtinute , in caz contrar candidatul a lipsit la cel putin un examen .
Pentru cresterrea flexibilitatii programelor si pentru o programare comoda ,se ofera posibilitatea unor selectii multiple fara utilizarea imbricarilor: instructiunea DO CASE . Aceasta instructiune se caracterizeaza prin faptul ca permite selectarea unei singure alternative din oricate posibile. Sintaxa ei este :
DO CASE
CASE conditie_1
instructiuni_1
CASE conditie_2
instructiuni_2
CASE conditie_3
instructiuni_3
........
CASE conditie_n
instructiuni_n
[ OTHERWISE
instructiuni ]
ENDCASE
Sistemu;l de gestiune a bazelor de date evalueaza fiecare conditie in parte . Prima conditie care este adevarata determina executia grupei de instructiuni aferenta ei.Dupa executarea instructiunilor aferente primei conditii adevarate ,selectia este terminata , iar urmatoarele un mai sunt evaluate.De aceea in cazul unei selectii multiple utilizatorul trbuie sa stabileasca conditii disjuncte astfel incat numai ua din conditiile instructiunii CASE sa fie adevarata .
Daca nici una din conditiile impuse un este adevarata , se executa grupa de instructiuni aflata dupa OTHERWISE . Aceasta ramura a selectiei multiple poate lipsi , caz in care daca nici o conditie un este indeplinita , un se executa nimic si se trece peste secventa de selectie multipla .
Fiecare instructiune DO CASE trebuie sa se termine printr-o instructiune ENDCASE - instructiune de incheiere a selectiei multiple.Lipsa instructiunii ENDCASE produce erori in programare.Grupele de instructiuni ce se executa la indeplinirea conditiilor specificate pot fi de orice tip (secvente , selectii , iteratii ). Instructiunea DO CASE poate fi imbricata dar urmarirea derularii programului cu instructiuni imbricate este dificila si un este recomandata.
Exemplu :
* Exemplul trnscrie secventa de program
* realizata cu secvente imbricate de
* IF ... ENDIF
DO CASE
CASE nota_1 < 1
? nume + "absent la proba 1"
CASE nota_2 < 1
? nume + "absent la proba 2 "
CASE nota_3 < 1
? nume + "absent la proba 3 "
OTHERWISE
media=(nota_1 + nota_2 + nota_3 ) / 3
? nume + " " + str ( media , 5 , 2 )
ENDCASE
Iteratia
Iteratia permite efectuarea repetitiva ( iterativ) a unei secvente de instructiuni . Iteratia poate fi conditionata adica repetarea secventei de instructiuni poate avea loc doar daca se indeplinesc anumite conditii sau poate fi controlata prin valoarea unui contor ( contorul poate lua valori cuprinse intre o valoare initiala si o valoare finala , prin incrementare cu un anumit pas ) .
Iteratia conditionata
Logica de executie a iteratiei conditionate este urmatoarea : atata timp cat conditia este adevarata se executa o secventa de instructiuni ; pentru anumite cazuri iteratia poate fi abandonata , indiferent de rezultatul evaluarii conditiei , sau programatorul are posibilitatea de a forta reevaluarea conditiei printr-un salt la inceputul structurii repetitive . Sintaxa iteratiei conditionate este :
DO WHILE conditie
instructiuni
[
[ EXIT ]
ENDDO
Iteratia conditionata se termina in mod obligatoriu cu instructiunea ENDDO. Iesirea fortata din iteratie se face cu instructiunea EXIT . Prin utilizarea acestei instructiuni ( care poate fi plasata oriunde intre DO WHILE si ENDDO ) , iteratia este abandonata si controlul programului trece la prima instructiune aflata dupa ENDDO . Pentru reevaluarea fortata a conditiei de executie a iteratiei se foloseste instructiunea LOOP .Utilizarea ei determina numai tastarea conditiei de executie a iteratiei , iar in continuare controlul programului este preluat de structura iterativa , in conformitate cu rezultatul evaluarii conditiei .
Daca conditia din DO WHILE un este adevarata , se abandoneaza iteratia si controlul programului se transfera la prima instructiune executabila aflata dupa ENDDO .Dupa fiecare parcurgere a instructiunilor aflate in corpul structurii iterative , , conditia de executie a iteratiei este reevaluata automat .De obicei , conditia se modifica prin executarea instructiunilor din bucla .Stabilirea conditiei de executie a iteratiei trebuie facuta cu atentie , deoarece o conditie gresit stabilita poate cauza alterarea sau distrugerea automata a datelor din baza de date .
O eroare de programare des intalnita este cea prin care se realizeaza o conditie permanent adevarata si programul intra intr-un "ciclu infinit" sau o "bucla infinita".Alta eroare o reprezinta folosirea unei conditii care prin evaluare este permanent falsa si instructiunile din corpul iteratiei un se executa niciodata .
Prelucrarea iterativa a articolelor din baza de date este o activitate frecventa .De obicei parcurgerea tuturor articoleleor din baza de date se realizeaza printr-o structura iterativa care testeaza intalnirea marcajului de sfarsit de fisier (EOF).
Exemplul 1 :
* programul isi propune listarea tuturor ;
* cursantilor promovati
USE cursanti
DO WHILE . NOT . EOF ( )
IF media >= 5
? nume + " " + str (media , 5 , 2 )
ENDIF
SKIP
ENDDO
USE
Exemplul 2 :
*programul listeaza cursantii retrasi
*si numarul primului test la cre au lipsit
USE cursanti
DO WHILE .NOT. EOF ( )
IF nota_1 < 1
? nume + " absent la proba 1 "
ELSE
IF nota_2 <1
? nume + " absent la proba 2 "
ELSE
IF nota_3 <1
? nume + "absent la proba 3 "
ENDIF
ENDIF
ENDIF
SKIP
ENDDO
USE
FOXPRO ofera insa pentru parcurgerea unei baze de date o instructiune specializata :
SCAN [ domeniu ] [ FOR conditie_1 ] [ WHILE conditie_2 ]
Instructiuni
[ LOOP ]
[ EXIT ]
ENDSCAN
Instructiunea SCAN produce o deplasare prin baza de date si efectueaza grupul de instructiuni din corpul ei pentru fiecare articol ce indeplineste conditiile specificate prin clauzele FOR sau WHILE . Trecerea la articolul urmator si tastarea indeplinirii conditiilor se face automat .
Domeniul implicit al instructiunii SCAN este ALL , adica se parcurg toate articolele bazei de date , dar poate fi precizat explicit un alt domeniu .De asemenea articolele ce vor fi prelucrate de instructiunile din corpul lui SCAN pot fi filtrate prin clauze FOR sau WHILE
Parasirea corpului unei instructiuni SCAN inaintea terminarii domeniului se face prin instructiunea EXIT . Controlul programului se da instructiunii care urmeaza lui ENDSCAN .
Instructiunea LOOP plasata in corpul unei instructiuni SCAN , forteaza reluarea buclei scan de la inceput .
Exemplu :
*transpunerea primului exemplu de DO ... WHILE
*programul isi propune listarea tuturor cursantilor promovati
USE cursanti
SCAN FOR media >=5
? nume + " " + str ( media , 5 , 2 )
ENDSCAN
USE
Iteratia prin contor
Executarea unui grup de instructiuni de un anumit numar de ori se realizeaza prin instructiune :
FOR contor = val_initiala TO val_finala [STEP pas ]
Instructiuni
[
[ EXIT ]
ENDFOR | NEXT
Iteratia incepe la intalnirea instructiunii FOR si se termina la executia instructiunii ENDFOR . Variabila de memorie se utilizeaza ca si un contor al numarului de executii al grupului de instructiuni din corpul instructiuii FOR .Aceasta variabila de memorie un trebuie initializata in prealabil .
Val_initiala este valoarea initiala a contorului iar val_finala este valoarea finala a contorului .
Executia unei instructiuni FOR presupune urmatorii pasi :
Se initializeaza contorul cu valoarea initiala ( contor = val_initiala )
Se executa instructiunile din corpul instructiunii FOR ( cuprinse intre FOR si ENDFOR )
contorul este incrementat cu valoarea indicata prin pas ( contor = contor + pas ) . Daca optiunea STEP un este inclusa , contorul este incrementat cu 1 ( contor = contor +1 )
se compara contorul cu valoarea finala astfel :
daca val_initiala < val_finala si pas > 0 atunci comparatia este contor <= val_finala
daca val_initiala > val_finala si pas < 0 atunci comparatia este contor >= val_finala
daca in urma evaluarii conditiei rezultatul este "adevarat ", atunci instructiunile din corpul
instructiunii FOR se vor executa din nou ; in caz contrar se va da controlul instructiunii care urmeaza lui ENDFOR
IMPORTANT :
Valorile val_initiala , val_finala si pas se citesc o singura data la inceputul buclei si valorile lor pot fi modificate in interiorul buclei fara a afecta numarul de reluari al buclei .Uneori schimbarea valorii contorului in interiorul buclei afecteaza numarul de reluari al buclei .
O instructiune EXIT in interiorul unei bucle FOR are ca efect transferarea controlului programului , instructiunii care urmeaza instruciunea ENDFOR inainte ca variabila contor sa ajunga la val_finala.
Instructiunea LOOP plasata in interiorul unei bucle FOR are ca efect returnarea controlului programului instructiunii FOR fara a executa instructiunile din corpul lui FOR .
Exemplu :
*program de numarare
FOR i = 1 TO 10
? i
NEXT
Exemplu :
Programul isi propune afisarea paginata pe ecran a numelui , notelor si mediei obtinute de cursanti .( se poate da programului numele LISTA )
*program afisare paginata a notelor si mediei cursantilor
SET TALK OFF
USE cursanti
Pag = 0
Lin = 24
DO WHILE .NOT. EOF ( )
IF lin >=24 && se considera ecranul plin cu informatie
Pag = pag +1
*urmatoarea secventa afiseaza antetul si capul de tabel al listei
CLEAR && se sterge ecranul
? "Curs FOXPRO "
? padc ( "Lista cursanti ", 79 )
? padl ("Data editarii : "+ dtoc (date ( ) ) + "/ Pag . "+ str (pag , 1 ) , 79)
? replicate ( "- ", 79 )
? space ( 36) + padc ( "Nota la ", 15 ) + " "+ padc ( "Nota la ", 15 )
? padc("Nume si Prenume ",35) + " "+ "proba teoretica"+" "+ "proba practica "+ " "+ "Media"
? replicate ( "- ", 79)
lin = 7
ENDIF
? nume + " "+ space(5)+ str (pt ,5 ,2 ) + space (11) +str(pp ,5 ,2 )+" "+ str (media , 5 , 2 )
lin=lin+1
SKIP
IF lin >= 24
WAIT "Continuati afisarea ? ( D / N ) " ;
to raspuns
IF .NOT. UPPER (raspuns ) = "D"
EXIT
ENDIF
ENDIF
ENDDO
USE
|