Sunteți pe pagina 1din 7

Laboratorul nr.

5
Variabile si tipuri de date in FoxPro. Citirea datelor

Variabile si tipuri de date in Foxpro


Prin variabila vom intelege un obiect cu urmatoarele proprietati: nume, valoare, tip si zona de memorie asociata. O variabila poate pastra in zona de memorie asociata o valoare de un anumit tip. Valoarea variabilei se poate modifica de un numar arbitrar de ori de-a lungul executiei programului. Declararea unei variabile nu se va mai face ca in limbaje tip C ori Pascal, intr-o sectiune speciala si bine delimitata, ci in urmatoarele moduri:

prin instructiunea de atribuire. Atribuirea are urmatoarea sintaxa:


variabila = expresie

si functioneaza astfel: se evalueaza expresia; valoarea expresiei va fi depusa in zona de memorie alocata variabilei; tipul variabilei este dat de tipul valorii expresiei; daca variabila nu exista inca este creata in acest moment; daca variabila exista deja, ea va capata noua valoare, iar tipul variabilei devine tipul expresiei (indiferent daca variabila avea alt tip); prin comanda STORE, care are urmatoarea sintaxa:
o o o o STORE expresie TO lista_de_variabile

si functioneaza astfel: se evalueaza expresia, iar valoarea acesteia este atribuita tuturor variabilelor din lista; daca variabilele nu existau sunt create la executarea comenzii. Eliberarea memoriei alocate variabilelor se poate face prin comenzile:

RELEASE cu sintaxa:
RELEASE lista_variabile

care elibereaza zona de memorie ocupata de variabilele precizate in lista.


RELEASE ALL cu sintaxa :


RELEASE ALL [LIKE | EXCEPT macheta]

care are urmatoarea semnificatie:


o o o

In forma Release All elibereaza din memorie toate variabilele Daca se foloseste clauza Like macheta se sterg toate variabilele cu numele ce corespunde machetei specificate. Daca se foloseste clauza Except macheta se sterg toate variabilele cu exceptia celor cu numele ce corespunde machetei specificate.

Macheta este un sir de caractere care include caracterele * si ?, reprezentand orice sir de caractere, respectiv orice caracter (sunt caractere "joker"; aceeasi semnificatie o au si in sistemul de operare MS-DOS).

CLEAR ALL sau CLEAR MEMORY care au si efectul de a sterge din memorie variabilele.

Daca dorim sa stim care sunt variabilele definite in program la un moment dat, vom putea utiliza comenzile DISPLAY MEMORY si LIST MEMORY, care au aceeasi sintaxa:
DISPLAY MEMORY [LIKE macheta] [TO PRINTER | TO FILE nume_fisier] [NO CONSOLE]

cu semnificatia: afiseaza variabilele din memorie precizand pentru fiecare numele, tipul, continutul, precum si numarul variabilelor definite de utilizator, memoria folosita si memoria disponibila. Folosind clauza LIKE, se pot afisa doar variabilele conforme cu macheta precizata. Lista poate fi tiparita la imprimanta (clauza TO PRINTER) sau intr-un fisier cu numele specificat (clauza TO FILE). Daca dorim ca lista sa nu apara si pe ecran (in cazul in care tiparim sau scriem intr-un fisier), utilizam clauza NO CONSOLE. Exemplu:
a = 10 b = 5 c = 2 suma = a+b+2 prod = a*b*c ? suma && afiseaza 17 ? prod && afiseaza 100 STORE 50 TO a, a1, a2 ? a, a1, a2 && afiseaza 50, 50, 50 RELEASE ALL LIKE a* && sterge variabilele a, a1, a2

Exercitiul 1: Rulati programul precedent si urmariti rezultatele. Adaugati si comanda pentru afisarea variabilelor din memorie atat inainte de stergerea variabilelor a, a1, a2, cat si dupa. Verificati toate clauzele comenzilor Release si Display Memory

Comenzi de intrare / iesire

Limbajul FoxPro, ca orice alt limbaj de programare, da posibilitatea utilizatorului sa introduca valori pentru variabilele definite in program. Zona de lucru a ferestrei in care ruleaza FoxPro poate fi utilizata pentru afisarea ferestrelor, textelor, meniurilor, ... precum si pentru citirea datelor de la tastatura. FoxPro dispune de urmatoarele comenzi pentru:

Afisare: @...Say, ?, ??, \, \\, TEXT...ENDTEXT Citire: @..GET, @..EDIT, READ

Comenzile ? si ?? Cele doua comenzi au aceeasi sintaxa:


?[lista_expresii] [PICTURE format] [FUNCTION format] [AT coloana]

si functioneaza astfel: afiseaza valoarea expresiilor din lista_expresii, avand ca punct de reper pozitia curenta a cursorului. Afisarea se face conform cu formatul precizat in clauzele Picture si Function. Daca dorim ca afisarea sa se faca incepand de la o anunita coloana (de pe linia curenta), utilizam clauza AT. Diferenta dintre ? si ?? este urmatoarea: ?? incepe afisarea imediat de la pozitia cursorului, iar ? de la inceputul liniei imediat urmatoare celei pe care se afla cursorul. Stabilirea formatului de afisare va fi discutat la comanda SAY. Comenzile \, \\, TEXT...ENDTEXT Sunt utilizate pentru afisarea mai comoda a liniilor de text. Comenzile \ si \\ afiseaza sirul de caractere care le urmeaza, prima trecand cursorul pe linia urmatoare dupa afisare. Daca dorim afisarea unui text mai mare vom folosi:
TEXT text ENDTEXT

Daca dorim sa introducem in text si expresii ce trebuiesc evaluate, acestea trebuiesc incadrate intre << si >>. Pentru a putea utiliza aceasta facilitate trebuie sa folosim comanda:
SET TEXTMERGE [ON | OFF] [TO fisier]

cu semnificatia:

Clauza ON determina evaluarea expresiilor dintre << si >>, care apar in sirurile de caractere afisate cu \, \\ si TEXT; Clauza TO permite specificarea unui fisier in care se se faca afisarea (valabila doar pentru \ si \\);

Comanda @...Say Comanda @...Say este, probabil, cea mai utilizata comanda de afisare din FoxPro si are urmatoarea sintaxa:
@ linie, coloana SAY expresie [FUNCTION format][PICTURE format] [SIZE n1,n2] [FONT nume_font, marime] [STYLE stil] [COLOR SCHEME schema] [COLOR lista perechi de culori]

cu semnificatia: afiseaza incepand de la linia si coloana spacificate o expresie, utilizand un format stabilit prin Function si Picture, fontul, culoarea si stilul precizate in clauzele corespunzatoare. Stilul este definit printr-un sir in care pot sa apara, printre altele urmatoarele caractere: B- bold, I- italic, U - underline. Clauzele Function si Picture, care apar si la alte comenzi FoxPro, au urmatoarea semnificatie: Function stabileste un format de citire/scriere pentru intregul text, in timp ce Picture stabileste un format pentru fiecare caracter din text. Codurile Picture sunt: Cod A W N X Y 9 Semnificatie Permite doar caractere alfabetice Permite doar date logice Litere si cifre Orice caracter Doar Y,y,N,n pe care le trece la majuscule Daca se aplica sirurilor, permite doar cifre, altfel permite cifre si semne

Pentru Function voi aminti doar caracterul A (permite doar caractere alfabetice), S(n) (limiteaza marimea campului de afisare la n caractere) si ! (toate caracterele alfabetice sunt trecute la majuscule). Listele complete de coduri pentru Function si Picture pot fi gasite in diverse carti de FoxPro. Exemple:
Clear \ Afisez rezultatul unei adunari \\ 12+10 = 22 \\ fara sa evaluez vreo expresie Set TextMerge ON \ Acum evaluez \ 12 + 10 =<<12+10>> @ 10, 5 Say 'Afisez la linia 10, coloana 5' Function '!';

Font 'Arial Black', 15 Style 'BI' Text Va placut acest font Arial Black de marime 16 ? Si ce daca ? EndText Set TextMerge OFF

Exercitiul 2: Executati exemplul de mai sus si urmariti efectele. Exercitiul 3: Afisati pe ecran sablonul unei scutiri medicale Exercitiul 4: Afisati pe ecran cursul valutar pentru USD si DM din ultima saptamana, sub forma unui tabel

Citirea datelor
In limbajul FoxPro, citirea datelor se realizeaza in doua etape:

Se definesc zonele in care se vor introduce valorile (campuri de editare) folosind comanda @...GET; Se da comanda READ, care citeste efectiv valorile de la tastatura, conform campurilor de editare definite anterior, si le atribuie variabilelor precizate;
@ linie, coloanaGET variabila | camp [FUNCTION format][PICTURE format] [SIZE n1, n2] [FONT nume_font, marime] [STYLE stil] [DEFAULT expresie] ...

Sintaxa comenzii GET este urmatoarea, exceptand unele clauze, pe care le-am "sarit":

cu semnificatia: se defineste un camp de editare incepand de la linie, coloana, conform cu formatul din clauzele Function si Picture, stilul, fontul si culoarea precizate; valoarea citita ulterior de comanda READ va fi depusa intr-o variabila sau intr-un camp al bazei de date. Precizari:

Daca variabila nu exista, va trebui folosita clauza Default, care precizeaza valoarea initiala a variabilei. Daca variabila este un masiv (tablou), aceasta trebuie sa fi fost definita anterior Se poate afisa un mesaj explicativ, afisat atat timp cat campul respectiv este activ (Message sir_de_caractere) Se poate defini campul intr-o fereastra de editare specificata prin Window nume_fereastra. Stabilirea unui domeniu de valori pentru valoarea ceruta se face prin clauza Range limita_inferioara, limita_superioara

Se pot face verificari asupra valorii introduse, stabilindu-se daca valoarea este sau nu acceptabila. Aceasta se realizeaza prin clauza VALID expr_logica. Daca valoarea expresiei logice este .T., valoarea introdusa este considerata corecta si se trece la urmatorul camp de editare, altfel nu este permisa iesirea din campul de editare.

Exemplul 1: Vom scrie un program care gaseste solutia unei ecuatii de gradul 1. Se vor citi valori pentru coeficientii ecauatiei. Pentru coeficientul necunoscutei se va pune conditia de validare a<>0; Codul este:
Clear a = 0 b = 0 @5,5 Say 'a=' Get a Picture '9999'; Valid a<>0 @6,5 Say 'b=' Get b Picture '9999' READ ? 'Solutia este:', -b/a

Observatii:

Caracterul ";" este folosit nu ca separator de instructiuni, ci pentru a marca faptul ca instructiunea / comanda se continua pe randul urmator. Valorile pentru a si b nu pot depasi maxim 4 caractere (4 cifre), asa cum precizeaza clauza Picture. Daca dorim sa introducem date de dimensiuni mai mari, vom folosi functiile Space si Replicate, asa cum vedeti in exemplul urmator.

Exemplul 2: Sa se introduca datele referitoare la un elev: nume, prenume, data nasterii, notele la romana, matematica, romana si istorie. Codul este:
Clear nume = Space (15) prenume = Space (10) data_n = { / / } rom = 1 mat = 1 ist = 1 @ 5, 5 Say 'Nume :' Get nume Picture Replicate('x',15) @ 6, 5 Say 'Prenume:' Get prenume Picture Replicate('x',10) @ 7, 5 Say 'Data :' Get data_n Function 'd' @ 8, 5 Say 'Romana :' Get rom Picture '99'; Range 1, 10 Message 'Nota la romana' @ 8, 20 Say 'Matematica: ' Get mat Picture '99'; Range 1, 10 Message 'Nota la matematica' @ 8, 37 Say 'Istoria: ' Get ist Picture '99'; Range 1, 10 Message 'Nota la istorie' READ media = (rom + mat + ist)/3 Set TextMerge ON \ Media este:<<media>> Set TextMerge OFF

Observatie: Functia Space (nr) are ca rezultat un sir de caractere compus din nr spatii. Functia Replicate are ca rezultat un sir de caractere format prin multiplicarea unui sir de un numar specificat de ori. Exercitii 5. Sa se scrie un program care calculeaza aria totala, volumul si lungimea diagonalei unui paralelipiped dreptunghic cu dimensiunile a, b, c 6. Sa se construiasca o macheta de introducere a datelor pentru realizarea unui depozit bancar. Sa fie citite urmatoarele date: numele si prenumele depunatorului, seria si numarul buletinului de identitate, data nasterii, adresa, suma depusa (mai mare de 500000 lei), termenul de depunere (1, 3 sau 6 luni), tip depozit (cu capitalizarea dobanzii sau fara capitalizare), data la care s-a constituit depozitul 7. Completati rezolvarea exercitiului precedent cu generarea unui fisier text care sa contina datele introduse de utilizator (contractul de depozit). Afisarea sa se faca si pe ecran, utilizand diferite fonturi, ...

S-ar putea să vă placă și