Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


STRUCTURI DE DATE - FISIERE

windows



+ Font mai mare | - Font mai mic



STRUCTURI DE DATE

FISIERE



Structurile prezentate in cursul anterior se remarca prin faptul ca datele lor sunt stocate in memoria interna (volatila) a computerului. La inchiderea programului, memoria alocata se elibera si astfel datele se pierdeau. Exista insa situatii in care un program trebuie sa lucreze cu mai multe seturi de date folosite anterior, numite fisiere. Pentru aceste situatii exista o structura de tip fisier care stocheaza datele in permanenta pe un suport extern (din memoria externa). Astfel, de exemplu daca dorim sa scriem un program pentru un concurs de admitere va fi util sa stocam in fisiere datele introduse in memorie pentru a le putea folosi si alta data. Lucrul aceste necesar pentru ca concursul se desfasoara pe parcursul a mai multor zile.

Notiunea de fisier se foloseste cu intelesul de colectie de date sub forma de text sau sub forma binara, date care pot fi citite sau scrise de catre un program, aflate in memoria externa a computerului (HDD, FDD, CD, Banda magnetica).

Fisierul este unitatea de baza a sistemului de operare pentru organizarea datelor. Sistemele de operare folosesc doua tipuri de fisiere: fisiere text si fisiere binare. Aceste tipuri de fisiere pot fi prelucrate folosind programe scrise in diferite limbaje de programare. Limbajele de programare ofera suport de prelucrare pentru aceste tipuri de fisiere. De exemplu, in Pascal avem fisiere text si fisiere fara tip iar in C avem fisiere text si fisiere binare. Vom discuta din punct de vedere al structurilor de date aceste tipuri de fisiere.

Indiferent de limbajul de prelucrare, programul de prelucrare pentru fisiere trebuie sa parcurga obligatoriu urmatorii pasi:

  1. deschiderea fisierului.
  2. Prelucrarea propiu-zisa care consta in pozitionarea pe o anumita inregistrare su un anume octet, citirea sau scrierea de date in fisier.
  3. Inchiderea fisierului.

1. Tipuri de fisiere in limbajul Pascal

a) Din punctul de vedere al structurii exista trei tipuri de fisiere in limbajul Turbo Pascal: fisiere text, fisiere cu tip si fisiere fara tip.

Fisierele text se declara in felul urmator:

var f: text;

Fisierele text sunt fisiere formate din linii de text de lungime variabila separate intre ele prin marcaje de sfarsit de linie. Aceste marcaje de sfarsite de linie sunt formate din perechea de caractere CR ( Carriage return - revenire la inceput de rand) si LF (Line Feed - avans la randul urmator).

Observatie - fisierele standard de intrare/iesire (tastatura, respectiv monitorul) sunt fisiere text.

Fisierele cu tip se declara in felul urmator:

var f:file of tip_de_baza

Fisierele cu tip sunt fisiere care contin un anumit numar de componente toate de acelasi tip (standard sau definit de utilizator, simplu sau structurat).

Fisierele fara tip sunt fisiere la care nu se face o precizare asupra naturii informatiei continuta in fisier si se declara in felul urmator:

var f:file;

Observatie - orice fisier poate fi tratat ca un fisier fara tip.

b) Din punctul de vedere al modului de acces la informatia continuta in fisier acestea pot fi de doua tipuri: fisiere cu acces secvential si fisiere cu acces direct.

Fisierele cu acces secvential sunt acele fisiere la care accesul la componentele sale poate fi facut numai in ordinea in care acestea apar in cadrul fisierului. De exemplu pentru a putea citi componenta a saptea din fisier trebuiesc citite in prealabil primele sase componente.

Fisierele cu acces direct sunt acele fisiere la care accesul se poate face direct la orice componenta din cadrul fisierului, in prealabil insa trebuie precizat numarul de ordine al componentei care se doreste a fi prelucrata.

2. Subprograme standard pentru lucrul cu fisiere

Indiferent de tipul unui fisier variabila fisier f trebuie asociata cu un fisier fizic, extern prin apelul procedurii ASSIGN. Utilizand sintaxa

assign(f,nume_fisier)

se realizeaza asocierea dintre variabila de tip logic f (declarata in program) si numele fisierului de pe suportul magnetic. De exemplu, sa presupunem ca intr-un program dorim sa lucram cu fisierul date.txt, care contine datele de intrare pentru programul in cauza. Pentru a putea face acces la acest fisier de date, in primul rand trebuie declarata in program variabila fisier f (var f:text - spre exemplu) iar apoi, pentru ca aceasta variabila sa fie asociata fisierului date.txt, trebuie apelata procedura ASSIGN in felul urmator:

assign(f,'date.txt')

In continuare, in program se va lucra cu variabila f, dar de fapt programul face referire la fisierul date.txt, pana la o eventuala reasignare a lui f.

3. Subprograme utilizate la deschiderea fisierelor

Operatiile care se efectueaza asupra unui fisier sunt de citire si scriere, exact ca si operatiile care se efectueaza cu tastatura/ecranul unui sistem de calcul, acestea fiind de fapt tot fisiere. Inainte de a lucra cu un fisier trebuie precizat modul in care se lucreaza cu el (citire, scriere, citire si scriere)

REWRITE(f) - este procedura standard care se utilizeaza atunci cand se doreste crearea unui fisier nou. Procedura are urmatorul efect: pregateste fisierul f pentru scriere inlocuindu-l cu un fisier vid (care nu contine nici o componenta) si stabileste pozitia initiala de scriere. Daca fisierul respectiv exista deja el va fi sters si va fi creat unul nou.

RESET(f) - este procedura standard care se utilizeaza atunci cand se doreste sa se lucreze cu un fisier existent (in general se utilizeaza pentru a putea citi dintr-un fisier). Procedura are urmatorul efect: deschide fisierul f si stabileste pozitia initiala de prelucrare pe prima componenta din fisier, ca in figura de mai jos:


READ este procedura cu ajutorul careia se poate citi dintr-un fisier. Se apeleaza in felul urmator:

read (f,v1,v2,.,vn)

si are ca efect citirea variabilelor v1,v2,.,vn din fisierul f. Efectul procedurii este ilustrat in figura urmatoare:

-inainte de apelul procedurii READ:


-dupa apelul procedurii READ(f,v):


Procedura WRITE este utilizata pentru a putea scrie intr-un fisier. Se apeleaza in felul urmator:

write (f,e1,e2,.,en) ,

si are ca efect scrierea in fisier in pozitia curenta de scriere a expresiilor e1,e2,.,en. Efectul procedurii este ilustrat in figura urmatoare:

-inainte de apelul procedurii write: -dupa apelul procedurii WRITE(f,x):


CLOSE(f) este procedura standard utilizata la inchiderea unui fisier. Procedura close se apeleaza la sfarsit, cand operatiile de citire/scriere s-au incheiat.

Functia EOF(f) este o functie cu rezultat de tip boolean si are valoarea TRUE daca s-a ajuns la sfarsitul de fisier (pozitia de prelucrare este dupa ultima componenta din fisier) si valoarea FALSE in caz contrar.

Aceste proceduri si functii standard sunt valabile la toate tipurile de fisiere. In continuare se vor prezenta si diferentele care exista intre cele trei tipuri de fisiere cu care lucreaza limbajul Pascal.

3.1. Fisiere cu tip

Fisierele cu tip sunt acele fisiere care au toate componentele de acelasi tip (standard sau definit de utilizator). Ele se declara in felul urmator:

type fisier=file of tip_de_baza

sau, in cazul in care nu se da un nume tipului fisier:

var f: file of tip_de_baza

Fiecare componenta dintr-un fisier cu tip are asociat un numar de ordine cuprins intre 0 si numarul total de componente - 1.

In cazul fisierelor cu tip, datorita faptului ca toate componentele sunt de acelasi tip se poate face si accesul direct la acestea. In acest caz exista si subprograme standard specifice fisierelor cu tip:

a) Procedura SEEK permite pozitionarea indicatorului de inregistrari pe o anumita componenta din fisier. Se apeleaza in felul urmator:

seek(f,pozitie)

unde pozitie reprezinta numarul de ordine asociat componentei la care se doreste sa se faca accesul (componenta care uirmeaza sa fie prelucrata).

b) Functia FILESIZE(f) este o functie care are rezultat de tip intreg si care reprezinta numarul total de componente din fisierul f (dimensiunea fisierului).

c) Functia FILEPOS(f) este o functie cu rezultat de tip intreg si care reprezinta numarul de ordine al componentei care urmeaza sa fie prelucrata.

d) Procedura TRUNCATE(f) este o procedura care are ca efect trunchierea fisierului f prin indepartarea grupului final de componente incepand cu cea curenta.

Observatii:

- in cazul fisierelor cu tip se pot face atat operatii de citire din fisier cat si operatii de scriere in fisier indiferent de modul in care a fost deschis fisierul (utiliizand procedura REWRITE sau utilizand procedura RESET).

un avantaj deosebit al folosirii fisierelor cu tip este modul in care se citesc/scriu componentele. Spre deosebire de citirea de la tastatura, sau afisarea pe monitor unde datele de

tip structurat se citesc/scriu numai componenta cu componenta, in cazul fisierelor cu tip citirea/scrierea datelor de tip structurat se poate face integral, indiferent de tipul componentelor. Este prezentat in acest sens ca exemplu un program care creaza un fisier care contine date despre studenti. Programul afiseaza pe ecran datele despre studentii dintr-o grupa.

Program date_studenti;

type student=record

nume:string[25];

adresa:string[30];

tel:string[10];

grupa:integer;

end;

var f:file of student;

r:char;

e:student;n:integer;

procedure creare;

begin

assign(f,'student.dat');

rewrite(f);

repeat

write('nume:');readln(e.nume);

write('adresa:');readln(e.adresa);

write('telefon');readln(e.tel);

write('grupa');readln(e.grupa);

write(f,e);

writeln('continuati (d/n)?');readln(r);

until r='n';

end;

procedure afisare;

var c:integer;

begin

reset(f);

write('introduceti grupa pt care doriti lista:');readln(c);

writeln(' numele si prenumele adresa telefon');

while not eof(f) do

begin

read(f,e);

if e.grupa=c then

writeln(e.nume:20,e.adresa:30,e.tel:10);

end;

close(f);

end;

begin

creare;

afisare;

readln;

end.

3.2. Fisiere text

Fisierele text sunt fisiere care contin caractere si marcatoare de sfarsit de linie. Caracterele sunt structurate pe linii iar liniile sunt separate intre ele prin marcatoarele de sfarsit de linie. Se declara in felul urmator:

var f:text

Marcatoarele de sfarsit de linie sunt formate din perechea de caractere de control: CR(carriage return) si LF(line feed). Acest marcator de sfarsit de linie nu poate fi atribuit unei variabile de tip CHAR dar poate fi citit sau scris cu ajutorul urmatoarelor proceduri standard:

WRITELN(f) o procedura care are ca efect inscrierea unui marcator de sfarsit de linie in fisierul f.

READLN(f) o procedura care are ca efect citirea unui marcator de sfarsit de linie din fisierul f, adica determina pozitionarea indicatorului de citire la inceputul liniei urmatoare din fisierul f.

Alte proceduri si functii standard care sunt valabile numai la fisierele text

Functia EOLN(f) este o functie care detecteaza sfarsitul de linie, furnizand rezultatul TRUE daca urmatorul element din fisierul f este marcatorul de sfarsit de linie si FALSE in caz contrar.

Functia SEEKEOLN(f) are rezultat boolean si anume valoarea TRUE daca in fisierul f intre pozitia curenta de prelucrare si urmatorul marcaj de sfarsit de linie exista numai caractere spatiu si/sau TAB. Daca in aceasta zona exista cel putin un alt caracter rezultatul furnizat este FALSE.

Functia SEEKEOF(f) are rezultat de tip boolean si anume valoarea TRUE daca intre pozitia curenta de prelucrare si sfarsitul de fisier exista numai caractere spatiu, TAB si/sau marcaje de sfarsit de linie. Daca in aceasta zona exista cel putin un alt caracter functia returneaza valoarea FALSE.

Observatii:

Toate subprogramele standard prezentate la fisierele text sunt valabile numai la acest tip de fisiere

Fisierele standard de intrare/iesire si anume tastatura, respectiv monitorul sunt fisiere text. Fisierele text au particularitatea ca permit un singur fel de operatie asupra lor in functie de modul in care au fost deschise: scriere, daca fisierul a fost deschis cu ajutorul procedurii REWRITE sau APPEND respectiv citire in cazul deschiderii cu ajutorul procedurii RESET.

Procedura APPEND(f) este o procedura care permite deschiderea unui fisier existent in vederea adaugarii de noi linii la sfirsitul sau. Efectul acestei proceduri este deci urmatorul: se va deschide fisierul f iar pozitia de scriere va fi stabilita automat dupa ultima componenta (linie) din fisier.

In continuare este prezentat un program care permite crearea unui fisier text prin citirea de la tastatura a unui text, care se incheie cu o linie vida.

Program creare_fisier_text;

var f:text;

s:string;

begin

assign(f,'fis_text.txt');

rewrite(f);

repeat

readln(s);

writeln(f,s)

until s='';

close(f);

end.

Exemplul de mai jos permite afisarea pe ecran a continutului unui fisier, fisier al carui nume va fi citit de la tastatura. Programul permite si oprirea afisarii si asteapta apasarea tastei ENTER daca fisierul contine mai multe linii si nu incape pe un ecran.

program afisare_fisier_text;

var f:text;

s,nume:string;

i:integer;

begin

writeln('introduceti numele fisierului:');readln(nume);

assign(f,nume);

reset(f);

while not eof(f) do

begin

readln(f,s);

writeln(s);

i:=i+1;

if i mod 22 = 0 then readln;

end

close(f);

end.

3.3. Fisiere fara tip.

In cazul fisierelor fara tip asupra structurii informatiei din fisier nu se face nici un fel de precizare. Se declara in felul urmator:

var f:file

La fiecare operatie de citire/scriere se transfera intre memorie si fisier (suportul de memorie externa) un bloc de informatie cu o anumita dimensiune in numar de octeti. Dimensiunea acestui bloc se specifica de catre programator pentru fiecare transfer in parte ca numar de blocuri elementare. Dimensiunea unui bloc elementar se specifica o singura data (ca numar de octeti elementari) la deschiderea fisierului in felul urmator:

rewrite (f, dim_bloc_elementar

sau:

reset (f, dim_bloc_elementar)

Procedurile care realizeaza operatiile de citire/scriere in cazul fisierelor fara tip sunt urmatoarele:

blockread (f, buffer, numar, rezultat)

si

blockwrite (f, buffer, numar, rezultat)

unde:

- Buffer este o variabila suficient de mare in/din care se face citirea/scrierea informatiei;

- numar reprezinta numarul de blocuri elementare care se transfera;

- rezultat este un parametru optional de tip intreg si care are ca valoare numarul de blocuri efectiv transferate in urma executiei operatiei de citire/scriere. Daca transferul a fost realizat integral trebuie ca numar=rezultat.

Observatii:

- La fel ca si in cazul fisierelor cu tip se pot folosi subprogramele standard SEEK, FILESIZE, FILEPOS, acestea lucrand cu componente bloc elementar;

- Orice fisier poate fi prelucrat ca fisier fara tip indiferent de modul in care a fost creat sau de modul in care va fi exploatat ulterior.

- Principalul avantaj al fisierelor fara tip este rapiditatea transferului, mai ales in cazul in care se lucreaza cu blocuri elementare de dimensiune mare.

Prezentam in continuare un exemplu de program care realizeaza o copie a unui fisier al carui nume se citeste de la tastatura. In acest exemplu s-a ales dimensiunea unui bloc elementar de 1 octet iar variabila Buffer s-a declarat ca fiind un tablou de caractere pentru a corespunde acestei dimensiuni de bloc elementar.

Program fisiere_fara_tip;

var numes,numed:string;

fs,fd:file;

buffer:array[1..1024] of char;

rezc,rezs,numar:integer;

begin

write('nume fisier sursa:');readln(numes);

write('nume fisier destinatie:');readln(numed);

reset(fs,1);rewrite(fd,1);

repeat

blockread(fs,buffer,numar,rezc);

if rezc>0 then

blockwrite(fd,buffer,rezc,rezs);

until (rezc=0) or (rezc<>rezs);

close(fs);close(fd); end.

Exemple de prelucrare a fisierelor text.

Crearea fisierului text:

Ex: Creati un fisier text ce va pastra informatiile despre studentii unei grupe: Nume, Prenume, Mg (media generala).

PROCEDURE Creare;

VAR F: text;

Nume,Prenume: string [20] ; Mg: real; Rasp: string[2];

BEGIN

Assign (F, ' Studenti.txt');

Rewrite(F);

Repeat

Write(' Nume student: ');

Readln(Nume);

Write(' Prenume student: ');

Readln(Prenume);

Write(' Media : ');

Readln(Mg);

Writeln(F, Nume ,' ', Prenume ,' ', Mg:5:2);

Writeln('Mai aveti studenti (DA / NU) ? ');

Readln(Rasp);

Until Rasp = 'NU';

Close(F);

END;

Afisarea oricarui fisier text :

PROCEDURE Afisare;

VAR F: text; Linie : string;

BEGIN

Assign (F, ' Studenti.txt');

Reset(F);

While not EOF (F) do

Begin

Readln(F, Linie);

Write(Linie);

End;

Close(F);

END;

Sau

procedure Afisare( NumeFis:String);

Var F:Text;

Linie :string;

I:Word;

begin

Assign(F,NumeFis);

Reset(F);

I:=0;

repeat

ReadLn(F,Linie);

WriteLn(Linie);

I:=I+1;

if I=20 then

begin

ReadLn;

ClrScr;

I:=0;

end;

until eof(F);

Close(F);

end.

Adaugarea unei linii noi in fisier :

PROCEDURE Adaugare;

VAR F: text;

Nume,Prenume: string [20] ; Mg: real;

BEGIN

Assign (F, ' Studenti.txt');

Append(F);

Write(' Nume student: '); Readln(Nume);

Write(' Prenume student: '); Readln(Prenume);

Write(' Media : '); Readln(Mg);

Writeln(F, Nume ,' ', Prenume ,' ', Mg:5:2);

Close(F);

END;

Extragerea unor date de tipuri diferite. Verificarea existentei unui fisier.

procedure ExtragereDate(NumeF:String);

Var

F:Text;

Ch:Char;

Nm,Pr:String[20];

Medie:Real;

begin

Assign(F,NumeF);

Reset(f);

if ioresult<>0 then

begin

WriteLn('Eroare nu exista fisierul:');

Halt;

end;

while not eof(f) do

begin

Nm:='';

repeat

Read(F,Ch);

if Ch<> ' ' then

Nm:=Nm+Ch;

until Ch=' ';

Pr:='';

repeat

Read(F,Ch);

if Ch<> ' ' then

Pr:=Pr+Ch;

until Ch=' ';

Readln(F,Medie);

WriteLn(Nume,' ',Prenume,' ', Medie:5:2);

end;

Close(f);

end;

Exemple de prelucrare a fisierelor cu tip.

Operatiile de prelucrare:

  1. Crearea fisierului cu tip :

Ex: Creati un fisier cu tip ce pastreaza informatiile despre studenti (Nume, Pren, Mg).

TYPE Student = Record

Nume, Pren : string[20];

Mg: real;

END;

PROCEDURE Creare;

VAR F: FILE OF Student;

S: Student;

Rasp : string[2];

BEGIN

Assign (F, ' Studenti.dat');

Rewrite(F);

Repeat

Write(' Nume student: ');Readln(S.Nume);

Write(' Prenume student: ');Readln(S.Pren);

Write(' Media : '); Readln(S.Mg);

Write (F,S);

Write('Mai aveti studenti (DA / NU) ? ');

Readln(Rasp);

Until Rasp = 'NU';

Close(F);

END;

  1. Afisarea fisierului cu tip:

PROCEDURE Afisare;

VAR F: FILE OF Student;

S: Student;

BEGIN

Assign (F, ' Studenti.dat');

Reset(F);

While not EOF (F) do

Begin

Read(F, S);

Writeln(S.Nume,' ',S.Pren,' ',S.Mg);

End;

Close(F);

END;

  1. Cautarea datelor( trebuie sa stim ce tip de date sunt in fisier):

PROCEDURE Cautare;



VAR F: FILE OF Student;

S: Student;

Nm,Pr : string[20]; Gasit : boolean;

BEGIN

Assign (F, ' Studenti.dat');

Reset(F);

Write (' Numele studentului care se cauta : '); Readln(Nm);

Write (' Prenumele studentului care se cauta : '); Readln(Pr);

Gasit := False;

While not EOF (F) do

Begin

Read(F, S);

IF (S.Nume=Nm) AND (S.Pren=Pr) THEN

Begin

Gasit := True;

Writeln('Exista studentul ',S.Nume,' ',S.Pren,' ', S.Mg);

End;

End;

IF not Gasit THEN

Writeln (' Nu exista studentul cu acest nume ');

Close(F);

END;

a.        Stergerea unei inregistrari

trebuie identificata inregistrarea care va fi stearsa;

vrem sa stergem inregistrarea Si

S1

S2

Si

Sn

vom folosi un fisier temporar Temp ;

S1

S2

.Si-1

Si+1

Sn

PROCEDURE Stergere;

VAR F,G: FILE OF Student;

S: Student;

Nm,Pr : string[20];

BEGIN

Assign (F, ' Studenti.dat');

Reset(F);

Assign (G,' Temp.dat');

Rewrite(G);

Write (' Numele studentului de sters : ');

Readln(Nm);

Write (' Prenumele studentului de sters : ');

Readln(Pr);

While not EOF (F) do

Begin

Read(F, S);

IF (S.Nume<>Nm) OR ((S.Nume=Nm) AND (S.Pren<>Pr)) THEN

Write (G,S);

End;

Close(F);

Close(G);

Erase(F);

Rename(G,'Studenti.dat');

END;

e. Modificarea unei inregistrari:

Varianta 1. Folosind un fisier temporar.

PROCEDURE Modificare;

VAR F,G: FILE OF Student;

S: Student;

Nm,Pr : string[20];

BEGIN

Assign (F, ' Studenti.dat');

Reset(F);

Assign (G,' Temp.dat');

Rewrite(G);

Write (' Numele studentului de modificat : ');

Readln(Nm);

Write (' Prenumele studentului de modificat: ');

Readln(Pr);

While not EOF (F) do

Begin

Read(F, S);

IF (S.Nume=Nm) AND (S.Pren=Pr) THEN

Begin

Write(' Noul nume: '); Readln(S.Nume);

Write('Noul prenume : '); Readln(S.Pren);

Write(' Noua medie : '); Readln(S.Mg);

End;

Write (G,S);

End;

Close(F);

Close(G);

Erase(F);

Rename(G,'Studenti.dat');

END;

Varianta 2. Prin pozitionare explicita in fisier.

type elev=record

nume,prenume:string[20];

varsta :byte;

medie:real;

end;

procedure Modificare;

var F:file of elev;

e:elev;

Nm,Pn:String[20];

begin

Write('Dati numele elevului pentru care se modifica datele:');

ReadLn(Nm);

Write('Dati prenumele elevului pentru care se modifica datele:');

ReadLn(Pn);

Assign(f,'elevi.dat');

Reset(f);

repeat

Read(f,E);

if (Nm=E.Nume) and (E.Prenume=Pn) then

begin

WRite('Dati noua varsta : ');ReadLN(E.Varsta);

WRite('Dati noua medie : ');ReadLN(E.Medie);

Seek(f,filepos(f)-1);

Write(f,E);

end;

until eof(f);

Close(f);

end;

e. Ordonarea fizica a unui fisier.

procedure Ordonare;

Var F:file of elev;

E,E1:Elev;

k:Boolean;

begin

Assign(f,'elevi.dat');

Reset(f);

repeat

k:=false;

Read(f,E);

repeat

Read(f,E1);

if (E.Nume>E1.Nume) or (E.nume=E1.Nume) and (E.Prenume>E1.prenume) then

begin

Seek(f,filepos(f)-2);

Write(f,E1);

Write(f,E);

k:=true;

end

else

E:=E1;

until eof(f);

Seek(f,0);

until k=false;

end;

Exemple de prelucrare a fisierelor fara tip.

1. Se doreste evidenta datelor despre studentii unei facultati. Pentru aceasta se construieste un fisier fara tip care contine urmatoarele date:

la inceputul fisierului un antet cu nume facultate, nr grupe si lista cu numele grupelor din facultate si nr de studenti din fiecare grupa.

Pentru fiecare grupa inregistrari cu datele studentilor din aceea grupa astfel: nume, prenume, grupa, medie generala, grupa..

Program FisiereFaraTip;

Type

AntetFacultate=Record

NumeFac:String[100];

NrGrupe:Byte;

Den:array[1..200] of String[20];

NrSt:array[1..200] of Byte;

end;

AntetStudent=Record

Nume,Pren:String[30];

Grupa:String[20];

Medie:Real;

end;

Procedure CreareFisier;

Var F: File;

BFac:AntetFacultate;

BStud:AntetStudent;

I:Byte;

R:String[1];

begin

Assign(F,'facult.dat');

Rewrite(F,1);

Write('Nume facultate :');

ReadLn(BFac.NumeFac);

Write('Numar grupe :');

ReadLn(BFac.NrGrupe);

for i:=1 to BFac.NrGrupe do

begin

Write('Nume grupa ',I,':');

ReadLn(BFac.Den[I]);

Write('Numar studenti grupa ',I,':');

ReadLn(BFac.NrSt[I]);

end;

BlockWrite(F,Bfac,SizeOF(BFac));

repeat

Write('Nume student ');

ReadLn(BStud.Nume);

Write('Prenume student ');

ReadLn(BStud.Nume);

Write('Grupa studentului ');

ReadLn(BStud.Grupa);

Write('Media studentului ');

ReadLn(BStud.Medie);

Write('Mai adaugati studenti ');

ReadLn(R);

BlockWrite(F,BStud,SizeOF(BStud));

until (R='N') or (R='n');

Close(F);

end;

Procedure AfisareFisier;

Var F: File;

BFac:AntetFacultate;

BStud:AntetStudent;

I:Byte;

R:String[1];

begin

Assign(F,'facult.dat');

Reset(F,1);

BlockRead(F,Bfac,SizeOF(BFac));

WriteLn('Nume facultate :',BFac.NumeFac);

WriteLn('Numar grupe :',BFac.NrGrupe);

for i:=1 to BFac.NrGrupe do

WriteLn('Nume grupa ',I,':', BFac.Den[I],' ' , BFac.NrSt[I]);

while Not Eof(F) do

begin

BlockRead(F,BStud,SizeOF(BStud));

WriteLn(BStud.Nume,' ',BStud.Nume,' ',BStud.Grupa,' ',BStud.Medie);

end;

Close(F);

end;

begin

CreareFisier;

AfisareFisier;

ReadLn;

end.

2. Sa consideram un fisier de tip imagine BMP. Se doreste prelucrarea acestuia: afisarea pe ecran si salvarea continutului ecranului intr-un fisier imagine de tip BMP.

unit Bitmap; (* Salvarea si afisarea imaginilor BMP ce au 16 culori *)

interface

uses Crt,graph;

type

BitMapFileHeader = record

BfType : Word ;

BfSize : LongInt ;

BfReser1 : Word ;

BfReser2 : Word ;

BfOffBits : LongInt ;

end;

BitMapInfoHeader = record

BSize : LongInt ;

BWidth : LongInt ;

BHeight : LongInt ;

BPlanes : Word ;

BCount : Word ;

BCompression : LongInt ;

BSizeImag : LongInt ;

BResOriz : LongInt ;

BResVert : LongInt ;

BColorNumb : LongInt ;

BColorNumbImport : LongInt;

end;

BitMapRGB = record

rgbBlue : Byte ;

rgbGreen : Byte ;

rgbRed : Byte ;

rgbReserv : Byte ;

end;

const

ColorReg: array[0..15] of Byte = ( 0, 1, 2, 3, 4, 5, 20, 7,

56, 57, 58, 59, 60, 61, 62, 63);

mask:array[0..7] of byte=(128,64,32,16,8,4,2,1);

var

TabColor : array [0..15] of BitMapRGB ;

BufFileHeader : BitMapFileHeader ;

BufInfoHeader : BitMapInfoHeader ;

Gd,Gm,X,Y: Integer;

Rc,Gc,Bc,C:Byte;

Register : Byte;

BFile : array [1..30004] of byte;

Procedure LoadBmpImag (name : String; X, Y : Integer);

Procedure SaveBmpImag (name : String; X1,Y1,X2,Y2 : Integer);

Implementation

Procedure SetRGBPal ;

var

I : Integer;

begin

for I:=0 to 15 do

SetRGBPalette(ColorReg[I],TabColor[I].rgbRed SHR 2,TabColor[I].rgbGreen shr 2,TabColor[I].rgbBlue SHR 2);

end;

procedure GetPaletteReg; assembler;

asm

mov dx, $03c7

mov al, Register

out dx, al

mov dx, $03c9

in al, dx

mov RC, al

in al, dx

mov GC, al

in al, dx

mov BC, al

end;

Procedure LoadBmpImag (name : String; X, Y : Integer);

var

Fbmp : File;

NumbB,NumbB1,NumbRead,K,I,Cul,n,Z : Integer;

begin

Assign(Fbmp,name);

Reset(Fbmp,1);

if ioresult<>0 then

begin

sound(440);

delay(200);

nosound;

end;

BlockRead( Fbmp, BufFileHeader,sizeof(BitMapFileHeader));

BlockRead( Fbmp, BufInfoHeader,sizeof(BitMapInfoHeader));

if (BufInfoHeader.BCount >0) and (BufInfoHeader.BColorNumb =0) then

begin

n :=1;

n :=n SHL BufInfoHeader.BCount;

BlockRead(Fbmp, TabColor,n*sizeof(BitMapRGB));

SetRGBPal;

end;

K := 8 div BufInfoHeader.BCount;

NumbB := BufInfoHeader.BWidth div K;

NumbB1 := NumbB;

if NumbB mod 4 <>0 then NumbB1:=NumbB div 4 *4+4;

Z:=X;

Y := Y + BufInfoHeader.BHeight;

repeat

BlockRead(Fbmp,BFile,NumbB1,NumBRead);

for I :=1 to NumbB do

begin

Cul:=BFile[I] SHR 4;

PutPixel(X,Y,Cul);

Inc(X);

Cul:=(BFile[I] SHL 4) SHR 4 ;

PutPixel(X,Y,Cul);

Inc(X);

end;

X:=Z;

Dec(Y);

until NumbRead=0 ;

close(Fbmp);

end;

Procedure SaveBmpImag (name : String; X1,Y1,X2,Y2 : Integer);

var

Fbmp : File;

NumbB,NumbB1,NumbRead,K,I,Cul,n,Z,R: Integer;

B:Byte;

begin

Assign(Fbmp,name);

Rewrite(Fbmp,1);

BufFileHeader.BfType := 19778 ;

BufFileHeader.BfSize :=118+(x2-x1)*(y2-y1) div 2; ;

BufFileHeader.BfReser1 :=0 ;

BufFileHeader.BfReser2 :=0 ;

BufFileHeader.BfOffBits := 118;

BlockWrite( Fbmp, BufFileHeader,sizeof(BitMapFileHeader));

BufInfoHeader.BSize := 40 ;

BufInfoHeader.BWidth := X2-X1+1 ;

BufInfoHeader.BHeight := Y2-Y1+1 ;

BufInfoHeader.BPlanes := 1 ;

BufInfoHeader.BCount := 4 ;

BufInfoHeader.BCompression := 0 ;

BufInfoHeader.BSizeImag := (X2-X1)*(Y2-Y1) div 2; ;

BufInfoHeader.BResOriz := 0 ;

BufInfoHeader.BResVert := 0 ;

BufInfoHeader.BColorNumb := 0;

BufInfoHeader.BColorNumbImport := 16 ;

BlockWrite( Fbmp, BufInfoHeader,sizeof(BitMapInfoHeader));

for I:=0 to 15 do

begin

Register := ColorReg[I];

GetPaletteReg;

TabColor[I].rgbBlue := Bc SHL 2;

TabColor[I].rgbGreen := Gc SHL 2;

TabColor[I].rgbRed := RC SHL 2;

TabColor[I].rgbReserv := 0;

end;

BlockWrite(Fbmp,TabColor,16*sizeof(BitMapRGB));

K:=0;

for Y:=Y2 downto Y1 do

begin

X:=X1;

for I:=1 to (X2 -X1) div 2+1 do begin

B := (Getpixel(X,Y) SHL 4) or (GetPixel(X+1,Y));

Inc(K);

BFile[K] := B;

if K>30000 then

begin

BlockWrite(Fbmp,BFile,K);

K:=0;

end;

Inc(X,2);

end;

if ((X2 -X1) div 2+1 )Mod 4 <>0 then

begin

R:=((X2 -X1) div 2+1) mod 4 ;

K := K +4-R;

end;

if K>30000 then

begin

BlockWrite(Fbmp,BFile,K);

K:=0;

end;

end;

BlockWrite(Fbmp,BFile,K);

Close(Fbmp);

end;

end.

Aplicatii laborator2:

  1. (fisiere text).

Se considera fisierul text candidati.txt, continand pe fiecare linie datele candidatilor la un concurs de admitere : numele, prenumele, notele la cele trei probe de concurs si media generala. Se cere un program de prelucrare care sa permita:

    1. adaugarea de noi candidati.
    2. Stergerea unui candidat cunoscandu-i numele.
    3. Afisarea candidatilor in ordinea descrescatoare a mediei generale.
    4. Afisarea candidatilor ce au avut note de 10 la probele de concurs (afisand studenti care au obtinut aceste rezultate).
    5. Crearea unui alt fisier cu candidatii ce au  obtinut la fiecare proba peste Fisierul va contine candidatii sub forma unui tabel.
  1. Fisiere fara tip, combinate cu fisiere text. 

Se doreste evidenta datelor despre studentii unei facultati. Pentru aceasta se construieste un fisier fara tip care contine urmatoarele date:

la inceputul fisierului un antet cu nume facultate, nr grupe si lista cu numele grupelor din facultate si nr de studenti din fiecare grupa.

Pentru fiecare grupa inregistrari cu datele studentilor din aceea grupa astfel: nume, prenume, grupa, medie generala.

Se cere crearea unui astfel de fisier fara tip, introducerea datelor despre studentii facultatii. De asemenea, se vor afisa grupele ordonate alfabetic si se va determina pentru fiecare grupa care a fost media grupei. Pentru un nume si prenume de student preluat de la tastatura se va verifica daca exista in baza de date creata, in caz afirmativ afisandu-se datele pe ecran. Pentru un nume de grupa tastat se va crea un fisier text cu studentii acelei grupe.

3. Tema pentru acasa.

La un concurs de admitere s-au inscris mai multi candidati. La inscriere s-au retinut, pentru fiecare candidat, urmatoarele date : nume, prenume, initiala tatalui, data nasterii. Se cere realizarea unui program ce permite evidenta admiterii cu ajutorul computerului. In acest scop, programul va permite :

citirea datelor despre candidati la inscriere si stocarea lor intr-un fisier binar.

impartirea candidatilor pe sali, stiind ca exista suficiente sali si ca in fiecare sala pot intra maxim m candidati.

introducerea si stocarea notelor la cele trei probe de concurs impreuna cu determinarea medie generale a fiecarui candidat.

crearea unui fisier text, numit admisi.txt, continand lista cu candidatii admisi. Un candidat a fost admis daca a obtinut note peste 5 (inclusiv) la fiecare din cele trei probe.

crearea unui fisier text, numit respinsi.txt, continand lista cu candidatii respinsi. Un candidat a fost respins daca a obtinut cel putin o nota sub 5 la una din cele trei probe.

sa se afiseze o statistica privind ponderea celor admisi fasa de cei respinsi




Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 3379
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