Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  

CATEGORII DOCUMENTE





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







DOCUMENTE SIMILARE

Trimite pe Messenger
Schimbarea sistemului de operare la Windows Vista la Windows XP
Interfata Windows XP Professional
STRUCTURI COMBINATIONALE MSI IMPLEMENTATE IN VERILOG
Programe utilitare ale sistemului de operare Windows
Gestiunea serviciilor de printare: Instalarea unui server de printare
Configurare Internet Explorer
Realizarea tranzitiei catre noua interfata Windows NT
Descarcarea bibliotecilor de functii din memorie
Fire de Executie si Mecanisme de Sincronizare in Windows
Ghid Pentru Instalarea Windows-ului XP

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.

1.       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;

2.       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.

3.       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;

4.       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

DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1454
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 2019 . All rights reserved

Distribuie URL

Adauga cod HTML in site