Creeaza.com - informatii profesionale despre


Cunostinta va deschide lumea intelepciunii - Referate profesionale unice
Acasa » scoala » informatica
Fisiere Relative - Algoritmi in Programare

Fisiere Relative - Algoritmi in Programare


Academia de Studii Economice

-Bucuresti-

 



ALGORITMI IN PROGRAMARE

Proiectul contine un meniu pt creearea si accesarea datelor despre elevii olimpici, memorate intr-un fisier relativ. Se defineste structura elev care contine campurile: nume (de tip sir de caractere), prenume (de tip sir de caractere),

nrmat (numar matricol), varsta (de tip intreg), clasa (de tip intreg), olimp(olimpiada (de tip sir de caractere)),   premiul (de tip intreg). 'Is' reprezinta indicatorul de stare, folosit in fisierul relativ pentru a determina daca

exista sau nu intregistrare pe pozitia respectiva.

typedef struct elev;

Functia nrart cu 2 parametrii, va returna numarul de articole memorate in fisierul transmis ca parametru. In variabila s se memoreaza cu ajutorul functiei ftell(f), pozitia curenta in fisier (in numar de octeti fata de inceputul fisierului). Ne pozionam la sfarsitul fisierului prin functia fseek(f,0,2), 2 semnifica sfarsitul de fisier si 0 reprezinta deplasamentul fata de sfarsitul de fisier. In p se memoreaza pozitia actuala, si aflandu-ne la sfarsitul fisierului in p se va memora

lungimea totala a zonei de memorie asociata tuturor articolelor din fisier. Numarul de articole din fisier este determinat prin impartirea lungimii totale a zonei de memorie asociata tuturor articolelor la lungimea unui singur articol

(prin parametrul l va fi transmisa lungimea zonei de memorie asociate articolului elev prin operatorul sizeof(elev) ).

int nrart(FILE *f, int l)

Functia CREARE creaza fisierul binar 'elev.dat'. Fisierul se deschide in modul wb+ care suprascrie un fisier existent sau creeaza unul nou,  fiind permise atat citiri cat si scrieri pentru fisier binar.Daca fisierul poate sau nu poate fi creat se va afisa un mesaj corespunzator.

void creare(FILE *f)

Functia ADAUGARE adauga date in fisier. Se deschide fisierul in modul rb+ pentru consultare si actualizare fisier binar. Se citeste de la tastatura numarul relativ, n, reprezentand pozitia de pe lista a unui elev. Intr-o structura while se verifica sfarsitul de fisier cu functia feof(f). Cat timp nu s-a ajuns la sfarsitul

inserarii (ctrl+z) se face prelucrarea: avem 2 cauzuri- n citit sa fie mai mare decat numarul de articole deja adaugate in fisier, caz in care adaugarea se face la sfarsit, sau n sa fie mai mic, caz in care se face un fel de inserare in fisier.

Daca avem n in primul caz ne pozitionam la sfarsitul fisierului, se face o preformare dinamica (se scriu articole cu indicatorul de stare is=0 pana la pozitia n, pe care vrem sa adaugam noul articol. Se citesc de la tastatura caracteristicile campurilor articolului in variabila e de tip elev si se scrie artcolul in fiser cu functia fwrite(articolul e, pe o lungime sizeof(elev), 1 singura data, in fisierul f). In cazul in care n este mai mic decat numarul de articole din fisier, ne pozitionam in fisier dupa primele n-1 articole, verificam daca indicatorul de stare este 0, adica nu exista articol pe pozitia respectiva, se citeste si se scrie articolul pe pozitia n. Daca avem articol pe pozitia respectiva se va da un mesaj corespunzator.

void adaugare(FILE *f)

e.is=1;

printf('nume: '); fflush(stdin);scanf('%s',&e.nume);

printf('prenume: '); scanf('%s',&e.prenume);

printf('nr. mat: ');scanf('%d',&e.nrmat);

printf('varsta: ');scanf('%d',&e.varsta);

printf('clasa: '); scanf('%d',&e.clasa);

printf('olimpiada: ');scanf('%s',&e.olimp);

printf('premiul: ');scanf('%d',&e.premiul);

fwrite(&e,sizeof(elev),1,f);}

else

else printf('exista inregistrari');

printf('n=');scanf('%d',&n);

fclose(f);

Functia AFISARE listeaza articolele din fisier pe ecran, si deasemenea se creaza un fisier text elev1.txt, cu articolele din fisierul binar. Fisierul binar se dechide in modul rb- consultare fisier binar iar fisierul text in modul w- creare fisier text. Intr-o structura while care verifica sfarsitul fisierului (feof(f)) se citesc articolele (verificand indicatorul de stare x.is!=0) pe rand din fisierul f, in variabila x de tip elev, se afiseaza pe ecran si deasemenea se scrie in fisierul text g.

Se face o citire a primului articol in afara structurii while.

void afisare(FILE *f)

fread(&x,sizeof(elev),1,f);

printf('datele s-au scris si in fisierul elev1.txt');

fclose(f);fclose(g);

In cadrul functiei CAUT_NR_REL se face o cautare dupa numarul relativ. Se deschide fisierul binar pentru consultare si se citeste de la tastatura numarul dorit in variabila r (int). Se verifica daca r este mai mare decat numarul de articole si in acest caz se da un mesaj, articol inexistent, altfel, ne pozitionam dupa r-1 articole numarate de la inceputul fisierului si il citim pe al r-lea. Daca indicatorul de stare arata ca articolul exista il afisam, daca nu se da un mesaj corespunzator. Cautarea se face intr-o structura while care se incheie cand este dat de la tastatura sfarsitul standard <<ctrl+z>>.

void caut_nr_rel(FILE *f)

printf('n nr relativ sau ctrl+z: ');

scanf('%d',&r);

fclose(f);

Consultare dupa caracteristica: se cauta un elev dupa numele si prenumele acestuia care se citesc de la tastatura.

Cautare se face intr-o structura while, atata timp cat nu s-a ajuns la sfarsitul fisierului si nu s-a gasit elevul (verificarea se face cu ajutorul variabilei este care are valoarea 0 daca nu s-a gasit elevul si ia valoarea 1 cand numele si prenumele elevului s-au gasit intr-unlul dintre articolele existente in fisier).

Cautarea se incheie cand una dintre conditii nu este indeplinita.

void cons_caract(FILE *f)

fread(&x,sizeof(elev),1,f);

if (este==0) printf('nu exista niciun elev cu numele: %s %s',n,p);

fclose(f);

In functia MODIFICARE se modifica elevul sau datele despre elevul aflat pe pozitia n citit de la tastatura. Se deschide fisierul pentru consultare si actualizare. Ne pozitionam pe pozitia n-1, se citeste articolul dorit, de pe pozitia n,

in variabila x de tip elev, se modifica datele dorite, ne pozitionam cu o pozitie in urma si se suprascrie articolul nou citit, peste cel vechi.

void modif(FILE *f)

else

fclose(f);

Functia calculeaza media varstelor eleviilor participanti la olimpiade. Se parcurge intregul fisier, se citeste articol cu articol iar datele din campul de varsta se aduna in variabila s. Media este raportul dintre s si numarul de articole.

void mv_gr_tot(FILE *f)

printf('media varstelor elevilor participanti la olimpiade este %f' ,s/nrart(f,sizeof(elev)));

fclose(f);

Se listeaza un raport despre elevii care au luat un anumit premiu. Se parcurg premiile 1,2,3 intr-un ciclu for, se citesc articolele, se verifica daca datele din campul premiul corespund cautarii si in caz afirmativ se afiseaza numele, prenumele si clasa elevului carea luat premiul respectiv. Daca nu se gaseste niciun articol cu premiul respectiv se afiseaza un mesaj corespunzator. La sfarsitul fiecarui ciclu for se revine la inceputul fisierului - rewind(f).

void raport(FILE *f)

fread(&x,sizeof(elev),1,f);

rewind(f);

if (ok==0) printf('n nu exista elevi care au luat premiul %d ',i);}

fclose(f);

Se sterge articolul al carui numar relativ este citit de la tastatura(elevul n din lista). Se deschide fisierul pentru consultare si actualizare. Ne pozitionam pe pozitia n-1, se citeste articolul n in variabila x, daca is=1 se modifica indicatorul de stare is->0 se afiseaza datele despre elevul care va fi sters, ne intoarcem pe poztia n-1 si se suprascrie articolul cu is=0.

void stergere(FILE *f)

else

fclose(f);

Se face o sortare a elevilor dupa varsta acestora si dupa numarul matricol. Se deschide fisierul binar pentru consultare si actualizare. Sortarea se face prin intershimbare: se citesc cate 2 articole in variabilele x si x2, se compara varstele inscrise in fisier, si daca nu sunt in ordine crescatoare articolul x2 se scrie in fisier in locul lui x si invers.

void sort(FILE *f)

}

fclose(f);}

Programul principal contine meniul cu 10 cazuri, ficare dintre acestea constand intr-o functie descrisa anterior. Intr-un ciclu repetitiv do-while utilizatorul isi alege optiunea dorita pana va introduce valoarea 0 pentru iesirea din program.

void main()

printf ('n OPTIUNI: ');

printf('n 1: CREARE FISIER RELATIV ');

printf('n 2: ADAUGARE DATE IN FISIER ');

printf('n 3: LISTARE FISIER ');

printf('n 4: CAUTARE DUPA NUMARUL RELATIV ');

printf('n 5: CONSULTARE DUPA CARACTERISTICA ');

printf('n 6: MODIFICARE ');

printf('n 7: CALCULUL MEDIEI DE VARSTA ');

printf('n 8: RAPORT: PREMII ');

printf('n 9: STERGERE ');

printf('n 10: SORTARE DUPA VARSTA');

printf('n 0: IESIRE ');

printf('n ');

scanf('%d',&cz);}

while (cz!=0);}





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.