Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

OPERATII CU FISIERE

calculatoare



+ Font mai mare | - Font mai mic



operaTii cu FiSiere

1. De departe, pentru dezvoltari ulterioare de programe, tipul fisier ("FILE OF") este cel mai important dintre tipurile complexe (alaturi de tipul ARRAY). Toate programele prezentate pana acum prezentau un mare neajuns: la introducerea datelor, orice eroare "neprotejata" (sau "neprotejabila") conducea fie la blocarea imediata a programului, fie la rezultate inutilizabile. La programele cu seturi mari de date de intrare (cum ar fi cele cu matrici), chiar in lipsa vreunei erori, procedura de introducere de la tastatura este greoaie si plictisitoare, mai ales in faza de punere la punct a programului (dar si la exploatarea ulterioara). Pe de alta parte, programele care produc rezultate multe (matrici) sunt dificil sau imposibil de urmarit pe ecran datorita defilarii.



Apare deci intrebarea daca nu este posibila inlocuirea "periferiei" programelor cu fisiere. Avantajul lor este imens: fisierele de intrare vor fi scrise separat, O  SINGURA DATA, in vreme ce fisierele de iesire vor putea fi consultate secvential DE MAI MULTE ORI (chiar daca programul a fost rulat o singura data). Accesul direct la fisiere de date al Pascal-ului este posibil datorita (in primul rand) existentei tipului fisier. Mai mult, instructiunile READ si WRITE au fost concepute special pentru a putea sa utilizeze fisierele de date (vezi capitolul 6).

Deoarece fisierele, spre deosebire de toate entitatile manevrate de Pascal (in memorie), au o imagine fizica (corespund unei imagini pe disc), exista cateva functii si proceduri predefinite destinate special transferului de date intre memorie si disc. Cele mai importante sunt tabelate mai jos, iar folosirea lor este obligatorie.

Inainte de a folosi fisiere, sa subliniem cateva aspecte importante: un fisier are doua nume in Pascal, si anume cel fizic, sub care il "stie" sistemul de operare, respectiv cel "logic", cu rol de variabila in Pascal (identificator). Declaratia fisierelor este extrem de simpla, tipul fisier fiind cel mai permisiv din Pascal: un fisier poate contine orice structuri formate din orice tipuri, mai putin alte fisiere. Cel mai simplu (si mai apropiat de notiunea de fisier ca structura de baza a sistemului de operare) este fisierul de tip "TEXT". Declaratia este echivalenta cu "FILE OF CHAR". Spre deosebire de alte fisiere, cel de tip TEXT este numai cu acces secvential (elementele fisierului sunt "rasfoite" unul cate unul, pana la gasirea celui cautat). Alte fisiere pot avea si acces direct sau (aleator), in care gasirea unui element anume se face cu ajutorul unei (sau unor) "chei" (structuri de ordonare ale fisierului respectiv - ordine alfabetica, crescatoare, etc.). Este recomandabila (cel putin la inceput) folosirea exclusiva a fisierelor TEXT.

Nume (apel)

Parametri

Actiune

APPEND

f: FILE

Deschide fisierul f pentru scriere in "coada"

ASSIGN

f: FILE; n: STRING

Coreleaza fisierul f (logic) cu cel fizic, al carui nume este n (inclusiv litera discului si calea)

CLOSE

f: FILE

Inchide fisierul f

ERASE

f: FILE

Sterge fisierul f (cel fizic asociat)

RENAME

f: FILE; n: STRING

Redenumeste fisierul f (cel fizic asociat) cu numele n

RESET

f: FILE

Deschide fisierul f pentru citire

REWRITE

f: FILE

Deschide fisierul f pentru scriere; daca fisierul exista deja, continutul sau este STERS

SEEK

f: FILE; n: INTEGER

La fisierele cu acces direct, muta cursorul cu n pozitii inainte

Proceduri destinate operatiilor cu fisiere.

Sa observam ca un acelasi fisier nu poate fi SIMULTAN deschis pentru citire si scriere. Eventual, daca se doreste actualizarea unui fisier, cele doua operatii trebuie facute pe rand.

Nume

Parametri (tip)

Actiune (rezultat)

EOF

f: FILE

Produce o valoare logica corespunzatoare sfarsitului de fisier

EOLN

f: FILE

Produce o valoare logica corespunzatoare sfarsitului unei linii dintr-un fisier

FILEPOS

f: FILE

Da un numar intreg ce reprezinta pozitia cursorului

FILESIZE

f: FILE

Da un numar intreg ce reprezinta marimea fisierului f

Functii destinate operatiilor cu fisiere.

2. Un prim exemplu consta in calculul normei unui vector, citind numarul elementelor si valorile lor dintr-un fisier text. Reamintim ca norma unui vector este

program norma;

type vect = array[1..10] of integer;

var x :vect;

fich :text;

max,i,n:integer;

begin

assign (fich,'vector.dat');

reset (fich);

readln(fich,n);

for i:=1 to n do

readln(fich,x[i]);

close(fich);

max:=x[1];

for i:=2 to n do

if max < abs(x[i]) then max:=abs(x[i]);

writeln('Norma vectorului este ',max);

end

Fisierul de date "fich" trebuie creat cu orice editor (eventual, chiar cel din Turbo Pascal) inainte de a incerca rularea programului. Pe prima linie, fisierul va contine numarul de elemente (n <= 10, conform declaratiei vectorului), iar pe cele n linii urmatoare, cate o valoare numerica. Cele n valori se pot gasi si pe ACEEASI linie, separate prin SPATIU (sau mai multe, dar NU prin virgula!), cu conditia modificarii lui READLN (fich,x[i]) in READ. De exemplu

Acest fisier trebuie salvat apoi cu numele furnizat in program: "vector.dat". Sa subliniem faptul ca instructiunea READ poate citi si cate o valoare de pe fiecare linie, caci trateaza caracterul <ENTER> ca pe un separator legal. Rulati acum programul.

3. Oricare din programele scrise pana acum poate fi modificat in vederea utilizarii fisierelor. Tinand cont de indicatiile de mai sus, structura unui program ce foloseste fisiere pentru a citi, respectiv a scrie matrici poate fi urmatoarea:

program matrici_in_fisiere;

const

nlmax = 10;

ncmax = 10;

type

matnet = array [1..nlmax,1..ncmax] of real;

mattra = array [1..ncmax,1..nlmax] of real;

var

i, j: integer;

nl, nc, format: integer;

matrix: matnet;

matrixt: mattra;

fisini, fisrez: text;

procedure citire_matrice (nl, nc: integer;

var fisier: text;

var m: matnet);

var i, j: integer;

begin

for i := 1 to nl do

begin

for j := 1 to nc do

read (fisier, m[i,j]);

readln (fisier)

end

end;

procedure scriere_matrice (nl, nc: integer;

var fisier: text;

format: integer;

m: mattra);

var i, j: integer;

begin

for i := 1 to nl do

begin

for j := 1 to nc - 1 do

write (fisier, m[i,j]:format,' ');

writeln (fisier, m[i,nc]:format)

end

end;

begin

write ('Numar linii = ');

readln (nl);

write ('Numar coloane = ');

readln (nc);

assign (fisini,'matrice.dat');

reset (fisini);

citire_matrice (nl, nc, fisini, matrix);

close (fisini);

tramat (nl, nc, matrix, matrixt);

write ('Format de scriere: ');

readln (format);

assign (fisrez,'matrice.rez');

rewrite (fisrez);

scriere_matrice (nl, nc, fisrez, format, matrixt);

close (fisrez);

readln

end.

Observati ca sunt permise si alte citiri (de la tastatura) ori scrieri (pe ecran), de exemplu in cazul "tratarii" unor erori. Creati (cu editorul din Norton Commander sau chiar cu Turbo Pascal-ul) fisierul de intrare cu elementele matricii dispuse pe linii si denumiti-l corespunzator; un fisier asemanator va fi generat, cu elementele scrise in formatul cerut. Procedura de transpunere matrici se gaseste intr-un fisier separat (daca nu a fost scrisa inca, acum este momentul!). Introduceti si o alta secventa de calcul intre citire si scriere (de exemplu produsul cu un scalar).

4. In general, datele de intrare pot fi considerate de doua categorii: cele care se nu se schimba niciodata (constante fizico - chimice) se afla (de regula) in fisiere, de la tastatura introducandu-se date care pot varia de la o rulare la alta: presiune, temperatura, concentratie, debit, etc. In ce priveste rezultatele, se recomanda scrierea lor integrala in fisiere, impreuna cu "ecoul" datelor de intrare (pentru a putea fi consultate si alta data).

Sa examinam o aplicatie destinata chimistilor: in multe calcule este necesara masa molara a diverselor substante. Este justificata deci crearea unui fisier continand aceste mase molare, fisier ce poate fi consultat (si actualizat) in mod periodic. Utilizarea principiilor de alcatuire ale bazelor de date reclama gasirea unei codificari simple dar sugestive pentru NUMELE substantelor (este evident ca fisierul, denumit "MMOL.DAT", va consta intr-un tabel cu doua coloane: numele substantei - "cheia" - si masa molara). Conform acestei codificari, programele ce au nevoie de masa molara a unei substante cauta in fisier cheia respectiva (daca nu exista, programul va genera un cod de eroare).

Codificarea prezentata aici utilizeaza numai 6 caractere pentru numele substantelor organice, folosind in acelasi timp prescurtarile uzuale pentru radicalii organici (Me - metil, Et - etil, Vy - vinil, etc.). S-au indicat si izomerii de catena prin prefixele n (normal), i (izo), t (tert), etc. De asemenea, cateva substante anorganice uzuale sunt prezente in lista.

Masa molara

bibliografie

[g/mol]

CH4 16 metan

C2H6 30 etan

C3H8 44 propan

nC4H10 58 n-butan

iC4H10 58 i-butan

nC5H12 72 n-pentan

iC5H12 72 i-pentan

eC5H12 72 neo-pentan

nC6H14 86 n-hexan

cC6H12 84 ciclo-hexan

C6H6 78 benzen

PhMe 92 toluen

oC8H10 106  o-xilen

mC8H10 106  m-xilen

pC8H10 106  p-xilen

PhEt 106 etilbenzen

C10H8 128 naftalina

PhVy 104 stiren

VyVy  butadiena

MeOH  metanol

EtOH  etanol

nPrOH  n-propanol

iPrOH  i-propanol

nBuOH  n-butanol

PhOH  fenol

PhCHO 106 benzaldehida

H2 2 hidrogen

O2 32 oxigen

N2 28 azot

C 12 carbon

C8H4O3 148  anhidrida ftalica

C4H2O3 98 anhidrida maleica

CO 28 monoxid de carbon

CO2 44 dioxid de carbon

H2O 18 apa

Aer 28.9 aer

Observati ca a treia coloana furnizeaza numele complet al substantei respective (eventual, se poate adauga si numele conform normelor IUPAC). Completati fisierul cu masele care lipsesc, precum si cu alte substante uzuale, grupate conform capitolelor chimiei (conform unui alt principiu al bazelor de date - structurarea): mai intai hidrocarburile, apoi derivatii halogenati, compusii cu oxigen (in ordinea gradului de oxidare), etc. In cadrul aceleiasi clase de compusi, sortarea se face in ordinea seriilor omoloage, deci cu cresterea masei molare.

Remarcati primele 3 linii ale fisierului; acestea au rol de antet, indicand sursa bibliografica si unitatile de masura ale marimilor din fisier. Alcatuiti un program care sa "gestioneze" acest fisier; este evident ca pe masura ce adaugam linii, va fi tot mai greu sa identificam daca s-a folosit deja o anumita codificare. Este recomandabil ca fisierul sa aiba atasat un program special, de "actualizare" a bazei de date, cu ajutorul caruia citim, sortam dupa diverse chei (cum ar fi in cazul de fata masa molara in ordine crescatoare sau numele codificat sau intreg al substantei in ordine alfabetica), ori scriem in fisierul respectiv.

Secventa de cautare a codificarii (deci de consultare a fisierului) poate fi cea care urmeaza (scrisa aici sub forma unei proceduri):

procedure citire_date (nc, coderr: integer;

var nume: vecstring;

var mmol: vector);

var

ok: boolean;

nume_subst: string [6];

fisini: text;

begin

coderr := 0;

assign (fisini,'mmol.dat');

for j := 1 to nc do

begin

reset (fisini);

readln (fisini);

readln (fisini);

readln (fisini);

ok := false;

repeat

read (fisini, nume_subst);

if nume_subst = nume[j]

then

begin

read (fisini, Mmol[j]);

ok := true

end;

readln (fisini)

until eof (fisini) or ok;

close (fisini);

if not ok

then coderr := 1

end

end;

Observati utilizarea semaforului numeric "coderr" pentru semnalarea lipsei codificarii respective din fisier. Remarcati citirea "oarba" a antetului de fisier (3 linii), precum si utilizarea functiei EOF. Incercati sa scrieti un program care sa realizeze sortarea fisierului dupa un criteriu oarecare.

5. Sa se corecteze urmatorul program:

program presiuni reduse;

const pcr = 225 ;

function pred(p: real);

begin pred := p pcr end;

var fisier: text;

p: real; cod: integer;

sir: sting[3];

begin

assign (fisier,'presiuni.dat);

rewrite (fisier);

while sir <> '' do

begin

readln (sir);

val (sir, p, cod);

if p > 0 and p <= pcr

then

writeln (fisier, pred(p));

else

writeln ('Presiune negativa sau supercritica')

end

end.

Remarcati faptul ca utilizarea functiei definite de utilizator "pred" este prioritara in raport cu functia predefinita cu acelasi nume. De asemenea, retineti posibilitatea de a citi numere exprimate sub forma unor siruri de caractere. Inainte de conversia lor cu functia VAL, alte functii ce opereaza cu sirurile se pot dovedi foarte utile, mai ales in vederea folosirii fisierelor; de exemplu, cu trimitere directa la programul anterior, crearea sirurilor (ce corespund codificarii nominale) de lungime "procusteana" (exact 6 caractere), efectuand, dupa necesitati, trunchierea sirurilor prea lungi, respectiv completarea cu blancuri a celor prea scurte.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1914
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved