Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
PROGRAMARE IN FOX
Asa cum v-ati dat seama, pana acum am lucrat in FOX tastand de fiecare data comenzile necesare pentru executarea unor operatii dorite. Acestei manieri ii spunem 'MODUL DE LUCRU DIRECT'.
Un al doilea mod de lucru este cel ASISTAT, folosind meniurile sistemului FOX, pe care nu avem spatiul suficient sa-l abordam. Acesta, cere utilizatorului sa cunoasca destul de bine limba engleza pentru a putea consulta HELP - ul sistemului si sa fie destul de familiarizat cu calculatorul, utilizarea tastaturii si a MAUSE - lui si a meniurilor - sistem.
Un al treilea mod de lucru este cel PROGRAMAT, prin care utilizatorul realizeaza programe sau fisiere de comenzi.
Dar inainte de a incepe 'alfabetizarea' in programare sa ne reamintim cateva din structurile principale ale PROGRAMARII STRUCTURATE.
01. STRUCTURI PRINCIPALE ALE PROGRAMARII STRUCTURATE.
Structura SECVENTIALA.
Este cea mai simpla si se compune din comenzi care se executa in ordinea in care acestea se succed una alteia . Exemplu :
Ordinea executiei
SET TALK OFF 1
CLEAR 2
V=10 3
W=3 4
? V+W,V-W,V*W 5
In secventa de mai sus, comenzile se executa in ordinea in care apar in seventa. Nu exista motive de salt peste unele comenzi sau de 'ocolire'.
STRUCTURA SELECTIVA (ALTERNATIVA
In aceasta structura intervine o conditie care prin verificarea sau nevericarea ei, are influenta decisiva asupra comenzilor care urmeaza a se executa imediat :
STRUCTURA SELECTIVA (ALTERNATIVA) COMPLETA.
IF < conditie >
Executa setul de comenzi 1
ELSE
Executa setul de comenzi 2
ENDIF
Executa setul de comenzi 3
La intalnirea unei astfel de structuri, este verificata conditia.
Daca aceasta este indeplinita, se executa setul de comenzi 1, dupa care, setul de comenzi care succed lui ENDIF, adica cel numerotat cu 3.
Daca nu este indeplinita conditia, se executa setul de comenzi 2, apoi setul de comenzi 3.
Exemplu :
IF FILE('PONTAJ.DBF')
USE PONTAJ
BROWSE NOMO NOAP
USE
ELSE
? 'FISIER DE DATE ABSENT'
WAIT
ENDIF
ALTE COMENZI
Daca fisierul PONTAJ.DBF este prezent in directorul de lucru (functia FILE() intoarce valoarea .T. ), deschid fisierul pentru vizualizare cu BROWSE, inchid fisierul activ si apoi execut comenzile de dupa ENDIF.
In caz contrar, afisez mesajul, astept sa tastezi orice (WAIT) si apoi execut comenzile de dupa ENDIF.
! SETURILE DE COMENZI 1 si 2 se executa ALTERNATIV, ori setul 1, ori setul 2.
STRUCTURA ALTERNATIVA INCOMPLETA.
IF < conditie >
Executa setul de comenzi 1
ENDIF
Executa setul de comenzi 2
In acest caz, numai daca este indeplinita conditia se executa setul de comenzi 1, dupa care urmeaza executia comenzilor de dupa ENDIF.
In cazul neverificarii conditiei 'se sare' la executia comenzilor de dupa ENDIF.
Urmariti exemplele din programele care vor fi prezentate in capitolul urmator !
STRUCTURA SELECTIVA MULTIPLA 'EXECUTA IN CAZUL . . .'
DO CASE
CASE cond 1
Set comenzi 1
CASE cond 2
Set comenzi 2
.
CASE cond n
Set comenzi n
[OTHERWISE
Set comenzi n + 1]
ENDCASE
Set comenzi de dupa ENDCASE.
Se verifica pe rand conditiile 1,
Pentru prima care este verificata, se executa setul de comenzi corespunzator, si apoi se vor executa setul de comenzi de dupa ENDCASE.
Deci, din interiorul structurii DO CASE . ENDCASE se va executa doar un set de comenzi si anume acelea pentru care conditia care precede setul, se verifica.
STRUCTURA REPETITIVA (variante).
Operatiile repetitive sunt foarte frecvente :
Preluarea datelor personale pentru un student se compune dintr-un set de operatii care se repeta pentru fiecare student din facultate, ca sa dam doar un singur exemplu.
Pentru ciclari, in FOX exista forme de realizare a acestora cu numar finit de pasi si cu un numar nedefinit de pasi.
FOR . ENDFOR
FOR contor = val initiala TO val finala [ STEP valoare pas ]
Set de comenzi 1
Set de comenzi 2 corpul buclei :
Toate comenzile intre
EXIT FOR si ENDFOR
Set de comenzi 3
ENDFOR
Set de comenzi 4
Intre FOR si ENDFOR exista seturi de comenzi 1 care in mod normal se executa repetitiv.
Daca este intalnit LOOP pentru o parcurgere a corpului buclei, pentru acest caz, nu se mai executa comenzile de dupa LOOP si se 'sare' la reverificarea conditiilor de dupa FOR.
Daca la o parcurgere a corpului buclei, se intalneste EXIT, se forteaza parasirea ciclarii si urmeaza a se executa set de comenzi de dupa ENDFOR , si deci setul de comenzi de dupa EXIT pana la ENDFOR nu se mai executa (in cazul figurii, setul 3).
Deci, iesirea din bucla se poate realiza in 2 cazuri :
A - conditiile de dupa FOR nu se mai indeplinesc
B - l a o trecere prin corpul buclei, se intalneste EXIT.
Numarul de executii repetate a comenzilor din corpul buclei este dat de parametrii din conditiile de dupa FOR.
Contorul este o variabila care ia valori incepand cu valoarea initiala, si apoi se incrementeaza cu valoarea pasului pana ajunge la o valoare mai mare decat valoarea finala. Daca valoarea pasului lipseste, deci lipseste clauza STEP, atunci incrementarea contorului se face implicit cu 1. La fiecare valoare noua a contorului, incepand cu valoarea initiala, se vor executa comenzile din corpul buclei.
Exemplu :
USE PONTAJ
N=RECCOUNT()
FOR I = 1 TO N
GO I
IF SEC # 102
ENDIF
DISP FIELDS SEC,NPR,SLB
ENDFOR
USE
Exersati exemplul de mai sus si spuneti ce afiseaza si de ce ?
(Am folosit fisierul la care am facut referire in capitolele precedente.)
Este echivalent efectul de mai sus ce cel al secventei urmatoare ?
USE PONTAJ
DISP ALL FIELDS SEC,NPR,SLB FOR SEC=102
USE
Nu va grabiti sa trageti concluzii definitive !
DO WHILE . ENDDO
DO WHILE < conditie >
Comenzi 1
[ LOOP ] corp parasire bucla pt
comenzi 2 bucla conditie care
[ EXIT ] nu se (mai) verifica
comenzi 3
ENDDO
Comenzi de 'dupa ENDDO'
Comenzile din corpul buclei se executa repetitiv 'cat timp' conditia se verifica. Cand conditia nu se mai verifica, urmeaza a se executa comenzile de 'dupa ENDDO', incepand cu prima din aceste comenzi.
Daca in interiorul buclei, la o trecere prin corpul ei, se intalneste LOOP, comenzile ulterioare (2 ) nu se vor mai executa, trecandu-se la reverificarea conditiei.
Daca la o trecere prin corpul buclei, se intalneste EXIT, se va parasi executia repetitiva a corpului buclei, urmand a se executa prima comanda de dupa ENDDO, si celelalte care urmeaza acesteia. Urmariti si figura de mai sus.
Exemplu :
USE PONTAJ
DO WHILE NOT EOF()
IF SEC = 102 AND LN = 11
DISP MAR,NPR,SLB,SLN
ENDIF
SKIP
ENDDO
USE
Puteti spune care este efectul, executiei secventei de mai sus ?
Care este rolul lui SKIP din corpul buclei ?
SCAN . ENDSCAN
SCAN [DOMENIU] [FOR < conditie >]
Comenzi 1
Comenzi 2
EXIT
Comenzi 3
ENDSCAN
Comenzi de 'dupa ENDSCAN'
Este o comanda specifica parcurgerii inregistrarilor unui fisier de date activ.
Asupra inregistrarilor se executa operatiile generate de comenzile din corpul buclei.
Efectele lui
Exemplul
USE PONTAJ
SCAN ALL FOR SEC=102
DISP MAR,NPR,SLB,SLN
ENDSCAN
USE
Exemplul
USE PONTAJ
SCAN
IF SEC = 102
DISP MAR,NPR,SLB,SLN
ENDIF
ENDSCAN
USE
Ce credeti, care este efectul celor 2 secvente din cele 2 exemple.
Cititorul nostru este invitat sa urmareasca programele din capitolele urmatoare in care vom aplica aceste structuri, si sa consulte cartea indicata mai inainte CAP 8.6.
Despre imbricarea acestor structuri !
Mai intai, sa observam ca atat structurile selective cat si repetitive, au un 'INCEPUT si un SFARSIT' :
IF <conditie > DO CASE
. .
ENDIF ENDCASE
FOR . DO WHILE . SCAN .
. . .
ENDFOR ENDDO ENDSCAN
Aceste structuri nu pot fi incluse intr-un program, oricum ! Iata un posibil exemplu :
ASA, DA
1
2 3 ASA, NU
6
Imbricari corecte 7
4
2 7
Imbricari incorecte
8 6
5 8
1
Asa dupa cum se vede din figura de mai sus, structurile descrise mai sus trebuie sa se cuprinda complet una in alta. Structura 6 incepe in 3 si se termina in 5, ERONAT !
Structura 8, nu este cuprinsa complet in 6, ERONAT !
Structurile 1 sunt corect imbricate.
O alta 'regula' pentru programatorul incepator : numarul IF - urilor dintr-un program trebuie sa fie egal cu numarul ENDIF - urilor. Acest lucru nu conduce neaparat la asigurarea corectitudinii programelor, dar sigur, nerespectarea acestei reguli, genereaza un program incorect ! La fel, cu privire la structurile repetitive.
02. PROGRAME FOX.
Presupunem ca dispunem de fisierul de date CATALOG.DBF care are structura :
Structure for database: C:CS2CATALOG.DBF
Field Field Name Type Width Dec
1 NRL Numeric 7 nr legitimatie student
2 NUM Character 25 nume prenume
3 SEC Character 3 sectia: MK,FCI,AF
4 FRI Character 3 forma de invatamant ZI,FR,ID
5 ANI Numeric 4 anul intrarii in facultate
Si acest fisier contine date :
Nrl Num Sec Fri Ani
1005 POP ION MK ZI 2000
1001 ALBU VIOREL FCI FR 2001
1003 BERARU ANA AF ID 2002
1002 CIURAR IOSIF MK ZI 2001
1010 BUCOV ILIE MK ZI 2002
Pentruca cele mai dese consultari sunt dupa sectie si forma de invatamant, ne propunem sa realizam un program care sa realizeze acest lucru. Sectia si forma de invatamant se vor prelua in variabilele S, respectiv F, prin dialogul care va apare pe ecran :
Programul pe care-l vom realiza, de fapt, nu este altceva decat un fisier de comenzi, in care liniile sunt comenzile :
1. CLEAR
2. ACCEPT 'SECTIA MK,FCI,AF :' TO S
3. ACCEPT 'FORMA INV ZI,FR,ID:' TO F
4. USE CATALOG
5. BROW FOR S$SEC AND F$FRI NOMO NOAP NODEL
6. USE
7. RETURN
In linia 1 sterg ecranul
In linia 2 'citesc' sectia in variabila S (dupa textul dintre ghilimele) : c-da ACCEPT
In linia 3 'citesc' forma in variabila F (dupa textul dintre ghilimele) : c-da ACCEPT
In linia 4, activez fisierul CATALOG.DBF (USE . )
In linia 5, cu BROWSE afisez inregistrarile care indeplinesc conditia de dupa FOR
In linia 6, inchid fisierul de date activ
In linia 7, RETURN va reda controlul FOX-ului.
FOX-ul dispune de un editor propriu, care ne permite sa asamblam aceste comenzi intr-o entitate de tip special care formeaza fisierul de comenzi (continand cele 7 linii) si care in mod curent se numeste PROGRAM. Mai intai ne gandim cum sa se numeasca acest program. Sa zicem CONSULT.
Acum activam editorul cu o comanda de tip
MODIFY COMMAND <nume program>
In cazul nostru :
MODI COMM CONSULT enter
Ca efect, pe ecranul monitorului apare un meniu specific editorului.
In partea de sus a ecranului, in centru, va apare CONSULT.PRG. Daca acum creez acest fisier, ecranul este vid si promptul se aseaza in stanga sus, asteptand sa introduc prima comanda. In cazul nostru voi tasta CLEAR apoi enter, s.a.m.d.
Extensia PRG pentru fisierul CONSULT este cea care ne confirma ca vom crea un fisier-
Program.
System File Edit Database Record Program Window Run
CONSULT.PRG
CLEAR
ACCEPT 'SECTIA MK,FCI,AF :' TO S
ACCEPT 'FORMA INV ZI,FR,ID:' TO F
USE CATALOG
BROW FOR S$SEC AND F$FRI NOMO NOAP NODEL
USE
RETURN
FIGURA : IMAGINE ECRAN pt MODI COMM CONSULT
Dupa ce am 'scris' si RETURN, vom salva acest fisier : CTRL+
LANSAREA IN EXECUTIE A PROGRAMULUI CREAT/MODIFICAT se va face cu o comanda DO <nume program>, in cazul nostru : DO CONSULT
De retinut cele 2 faze ale lucrului cu programe :
1.Crearea / Modificarea programului urmata de salvare (MODI COMM . CTRL+W)
2.Lansarea programului in executie (DO . )
Program TATA, FIU, NEPOT, . sau program APELANT si APELAT.
Dupa cum ati vazut, un program are parti componente linii care sunt comenzi FOX.
Printre liniile unui program se pot gasi si linii de tip: DO <nume program apelat>
PROGRAM TATA (APELANT)
CLEAR
. PROGRAM FIU (APELAT)
(linii ale programului apelant)
. (linii ale programului apelat)
DO <nume program apelat>
prima linie de sub DO
RETURN (sfarsitul programului fiu)
(linii ale programului apelant) (se reda controlul programului TATA)
RETURN
Daca in programul FIU nu intervin situatii care sa impuna alte 'intoarceri' RETURN-simplu va reda controlul programului TATA si anume : urmeaza a se executa prima linie de sub DO . .
In notatia cel mai des utilizata, legaturile de subordonare de acest tip sunt reprezentate astfel :
PROGRAM APELANT (TATA) |
PROGRAM APELAT - FIU pt. TATA si APELANT pt NEPOT |
PROGRAM APELAT (NEPOT) |
Un program apelant, de exemplu CALCSAL de calcul salarii poate 'trimite' programului apelat valoarea venitului impozabil. Programul apelat CALCIMP (calcul impozit pe salar) va prelucra valoarea 'primita' in sensul ca va calcula impozitul corespunzator. Aceasta valoare rezultata, va trebui retransmisa programului APELANT pentru continuarea prelucrarilor. Astfel ca schema de legatura dintre cele 2 programe va arata :
CALCSAL - calcul salar pentru o marca |
valoare venit baza de calcul
valoare impozit calculat
CALCIMP - calcul impozit corespunzator salarului |
Va recomand sa aprofundati aceste relatii intre programe APELANTE si APELATE citind bibliografia.
PROBLEME, EXERCITII, INTREBARI .
1 Fisierul de date STUDENTI.DBF are structura :
NRLEG N 6 numar legitimatie
NUMPR C 20 nume prenume student
DATAN D 8 data nasterii ZZ/LL/AA
FILIALA C 10 ex : SEBIS, BAIA MARE, etc.
FACUL C 10 facultatea (MARKETING,DREPT, etc)
SECTIE C 10 sectia (MARKETING,ADM_AF, etc)
FORMA C 3 forma de invatamant (ZI,FF, etc)
ANSTUD N 1 an de studiu (1 )
TAXEP N 12 volumul taxelor platite (ex :7500000.00)
Si contine date referitoare la anul universitar curent pentru toti studentii din universitate.
Aveti 2 variante de atribuire a numarului de legitimatie fiecarui student:
A) un singur sistem pe toata universitatea : 1,2, . , n
B) fiecare filiala sa-si atribuie numere proprii pentru legitimatiile studentilor.
care sunt avantajele si dezavantajele fiecarei variante dupa parerea d-vs ?
care ar fi cheia de identificare a unei inregistrari in cazul A ?
care ar fi cheia de identificare a unei inregistrari in cazul B ?
Fisierul de mai sus contine peste 10000 de inregistrari si am optat pentru acordarea de numere de legitimatie propriu fiecarei filiale. Deci cheia de identificare a unei inregistrari se compune din FILIALA si numar legitimatie .
Doresc sa stiu la ce facultate este studentul cu numarul de legitimatie 111111 din filiala de la ZALAU.
Spre care metoda de consultare va orientati : consultare secventiala, indexata sau cautarea prin injumatatirea intervalului si de ce ?
Daca va orientati spre consultarea indexata, cum realizati indexarea fisierului
STUDENTI in cazul folosirii cheii compuse : filiala si numar legitimatie ?
INDEX ON NRLEG+FILIALA TO STUDENTI
INDEX ON STR(NRLEG,6)+FILIALA TO STUDENTI
INDEX ON FILIALA+STR(NRLEG,6) TO STUDENTI
La 3 am executat indexarea dupa cea de a treia varianta. Cum construim cheia CH de cautare a studentului de la BAIA MARE cu legitimatie 123321 ?
Secretarele facultatilor utilizeaza frecvent acest fisier si sunt nemultumite de faptul ca in cheia de consultare am introdus numarul de legitimatie care nu le este usor accesibil din punct de vedere practic. Ele ne sugereaza sa folosim numele si prenumele in loc de legitimatie, pentruca numele studentilor le este mai 'la indemana'. Sursa lor de preluare a numelui studentului este DOSARUL DE INSCRIERE la facultate. Ce facem ? Ce cheie propuneti pentru cautare, pentruca dupa cum stim pot exista 2 studenti cu acelasi nume chiar in aceeasi facultate ?
Pentru rezolvarea cerintelor de la 5, propunem cheia filiala + nume prenume + data nasterii ? E bine ?
Cautarea indexata pentru cazul cheii de la 6 trebuie sa fie precedata de INDEXAREA fisierului :
INDEX ON FILIALA+NUMPR+DTOS(DATAN) TO STUDIDX
E bine ? Ce alta functie ar fi putut fi folosita in loc de DTOS() ?
In cazul indexarii de la 7, cum construiesc cheia de cautare pentru studentul POP ION de la BAIA MARE nascut la data de 01/04/1981 ? (suntem in contextul comenzilor SET DATE FRENCH si SET CENT ON ).
In conditiile in care cheia de cautare este stabilita ca fiind compusa din filiala,nume si prenume si data nasterii, mai poate fi folosita tehnica de cautare prin injumatatirea intervalului de cautare ? Cum se va face sortarea fisierului inainte de a aplica acest algoritm ?
Reamintiti-va si precizati asemanarile si deosebirile dintre
SCATTER TO < nume tablou > si SCATTER MEMVAR
Cand folosim variantele comenzilor SCATTER,GATHER
SCATTER MEMVAR MEMO si
GATHER MEMVAR MEMO ?
Cate forme ale comenzii @ linie,coloana . ati intalnit in acest curs si care este
efectul lor ?
Cate variante ale structurilor selective (alternative) cunoasteti ? Descrieti - le.
Descrieti modul (modurile) in care se poate face parasirea executiei repetitive a corpului buclei in structurile repetitive.
Care este comanda pentru crearea unui program FOX folosind editorul propriu ?
Care este comanda pentru modificarea unui program FOX ?
Cum lansez in executie un program FOX.
Care-i combinatia de taste pentru salvarea unui program, lucrand cu editorul FOX ?
Se pot transmite parametri intre un program APELANT si APELAT ? Cum ?
ANEXA C03
COMENZI, INTRUCTIUNI, FUNCTII,NOTIUNI PREZENTE IN CURSUL C03
CAUTAREA SECVENTIALA
LOCATE .
CONTINUE
FOUND()
CAUTAREA INDEXATA (DIRECTA)
FISIERE .IDX
INDEX ON . TO .
SEEK .
CHEIE DE INDEXARE
CHEIE DE CAUTARE
REINDEX
CAUTAREA PRIN INJUMATATIREA INTERVALULUI
ALGORITMUL CAUTARII BINARE
TABLOURI DE VARIABILE (MASIVE)
DIMENSION .
INITIALIZARE TABLOURI : STORE <val> TO <nume_tablou>
SCATTER, GATHER
SCATTER TO <nume tablou>
GATHER FROM <nume tablou>
SCATTER MEMVAR
GATHER MEMVAR
CAMPURI DE TIP MEMO
SCATTER MEMVAR MEMO
GATHER MEMVAR MEMO
ECRANUL FOXPRO : COORDONATE
@ L1,C1 TO L2,C2 [ DOUBLE ]
@ L1,C1 CLEAR TO L2,C2
@ L1,C1,L2,C2 BOX < sir de 9 caractere >
STRUCTURI SELECTIVE
IF . ELSE . ENDIF
IF . ENDIF
DO CASE . ENDCASE
FUNCTIA FILE()
STRUCTURI REPETITIVE
FOR . ENDFOR
DO WHILE . ENDDO
SCAN . ENDSCAN
IMBRICAREA STRUCTURILOR SELECTIVE SI REPETITIVE
MODI COMM <nume program>, DO <nume program>
Copyright © 2024 - Toate drepturile rezervate