CATEGORII DOCUMENTE |
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. 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.
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];
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;
Assign (F, ' Studenti.txt');
Reset(F);
While not EOF (F) do
Begin
Readln(F, Linie);
Write(Linie);
End;
Close(F);
END;
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;
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;
Operatiile de prelucrare:
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];
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;
PROCEDURE Afisare;
VAR F: FILE OF Student;
S: Student;
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;
PROCEDURE Cautare;
VAR F: FILE OF Student;
S: Student;
Nm,Pr : string[20]; Gasit : boolean;
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];
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];
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;
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:
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:
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 |
Vizualizari: 3503
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved