Facultatea de Cibernetic, Statistic i Informatic Economic
!OIECT A"#O!ITMI $N !O#!AMA!E Fiiere or%ani&ate relati' #!UA()*+, Fiiere organizate relativ Prelucrarea fisierelor binare care necesita actualizare trebuie sa asigure posibilitatea stergerii articolelor si sa elimine riscul de suprascriere a articolelor adaugate.Pentru aceasta ,trebuie proiectate structure particulare de articole si concepute operatii de gestiune specific. Organizarea fisierelor care asigura identificarea articolelor prin numarul lor relative se numeste organizare relativa. In exemplul ce urmeaza aplicatia realizata permite gestiunea cartilor dintr-o librarie. Fisierul principal de date contine cod carte, titlu , autor, editura,categorie,an_aparitie, prt si cantitate. , cu urmatoarea structura cod(int cod, titlu( c!ar titlu"#$%, autor(c!ar autor"#$%,editura(c!ar editura"#$%,an_aparitie(int an_aparitie , prt (int prt , cantitate (int cantitate ,categorie(c!ar categorie "#$%. typedef struct {int is,cod; char titlu [30]; char autor [30]; char editura [30]; char categorie[30] int an_aparitie ; int pret; int cantitate ;} carte;
&tilizatorul are la dispozitie un meniu cu mai multe optiuni' 1. Creare 2. daugare Carte 3. !tergere carte ". #odificare carte $. Copiere in fis te%t &. fisare carti '. (aport pe an_aparitie si ). Cautare autor *. Cautare titlu 0. +esire,n,n-.
(odul sursa al meniului este ' /oid 0eniu1. { printf 1-,n,n,n,n, 2rogra0 3estiune 4i5rarie,n -.; printf1-,n,n,n-.; printf1-6666666666666666666666666666666666,n-.; printf1-legeti o operatie7,n,n-.; printf1-1. Creare ,n,n-.; printf1-2. daugare Carte ,n,n-.; printf1-3. !tergere carte ,n,n-.; printf1-". #odificare carte,n,n-.; printf1-$. Copiere in fis te%t,n,n-.; printf1-&. fisare carti ,n,n-.; printf1-'. (aport ,n,n-.; printf1-). Cautare autor,n,n-.; printf1-*. Cautare titlu,n,n-.; printf1-0. +esire,n,n-.; printf1-6666666666666666666666666666666666,n-.; } functie ce /a fi apelata in progra0ul principal 7 /oid 0ain1. { 8+49 6f; int opt; 0eniu1.; printf1-+ntroduceti optiunea7 -.; scanf_s1-:d-,;opt.; <hile1opt. { s<itch1opt. { case 17 printf1-i ales sa cree=i fisierul pentru gestiunea cartilor,n-.; creare1.; 5rea>; case 27 printf1- i ales sa adaugi o carte ,n-.; adaugare1.; 5rea>; case 37 printf1-i ales sa stergi o carte ,n-.; stergere 1.; 5rea>; case "7 0odificare_carti1.; 5rea>; case $7 copiere_in_fis_te%t1.; 5rea>; case &7 afisare_carti1.; 5rea>; case '7 raport1.; 5rea>; case )7 cautare_autor1.; 5rea>; case *7 cautare_titlu1.; 5rea>; default7 printf1-?ptiune ine%istenta@ (eincearca@-.; 5rea>; } 0eniu1.; printf1-+ntroduceti optiunea7 -.; scanf_s1-:d-,;opt.; } } )imba*ul ( nu ofer+ o func,ie standard pentru calcularea num+rului de articole dintr-un fi-ier binar, deoarece, din punctul de vedere al limba*ului, fi-ierele nu con,in articole. .in punctul de vedere al utilizatorului, cunosc/nd dimensiunea unui articol, se poate calcula num+rul de articol de fi-ier, 0mp+r,ind lungimea acestuia la lungimea unui articol (ambele m+surate 0n num+r de octe,i. )ungimea fi-ierului este egal+ cu pozi,ia curent+, atunci c/nd pointerul de citire se afl+ la sf/r-itul fi-ierului. Pentru aflarea num+rului de articole, se folose-te secven,a urm+toare' int nr_art18+496 f, int l. {long po=Aftell1f.; fsee>1f,0,2.; int cAftell1f.Bl; fsee>1f,po=,0.; return c;} poz retine pozitia curenta in fisier ,apoi ne pozitionam la sfarsitul fisierului .In variabila c se memoreaza nr de articole prin impartirea lungimii zonei totale de memorie la lungimea unui articol 1(234234 &rmatoarea functie ne permite sa populam cu date fisierul creat 5e desc!ide fisierul in modul 67b.5e introduce de la tastatura codul articolului. (u a*utorul unei structuri 67!ile6 vom verifica sfarsitul fisierului 6feof(f6. (at timp nu se a*unge la sfarsitul inserarii (inserarea se opreste intreducand combinatia de taste 6ctrl8z6 se continua prelucrarea .aca valoarea 6n6 introdusa de la tastura este mai mare decat numarul de articole de*a adaugate ,setam indicatorul de stare pe is9$ si ne pozitionam la sfarsitul fisierului si scriem articole in fisier pana la pozitia n..upa ce se realizeaza extinderea fisierului ma pozitionez dupa primele n-1 articole si citesc asticolul. .aca is 91 se afiseaza un mesa* :(artea cu articolul n exista,altfel citesc si scriu articolul. /oid creare1. { 8+496 f; char nu0ef[30];int n,i ; carte % ; printf1-Cu0e fisier 7-.;fflush1stdin.; gets1nu0ef.; fAfopen1nu0ef,-<5D-.; printf1-,n Cod articol7-.; scanf 1-:d-,;n.; <hile1@feof1stdin.. { if 1nEAnr_art1f,si=eof1carte... { %.isA0; fsee>1f,0,2.; for 1iAnr_art1f,si=eof1carte..;iFAn ;iDD. f<rite1;%,si=eof1carte.,1,f.; } fsee>1f,1n.6si=eof1carte.,0.; fread1;%,si=eof1carte.,1,f.; if1%.is. printf1-,n Cartea cu codul :d e%ista in 5a=a de date,n-,n.; else{ fsee>1f,1n.6si=eof1carte.,0.; %.codAn; printf 1-,n Gitlu-.; fflush1stdin.;gets1%.titlu.; printf 1-,n utor-.; gets1%.autor.; printf 1-,n 9ditura-.; gets1%.editura.; printf1H,nCategorie7I.;gets1%.categorie.; printf 1-,n n aparitie-.; scanf_s1-:d-,;%.an_aparitie.; printf 1-,n 2ret [(?C] 7-.; scanf_s 1-:u-,;%.pret.; printf1-,n Cantitate7-.; scanf_s1-:d-,;%.cantitate.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; } printf 1-introduceti cod articol sau ctrl =-.; scanf 1-:d-,;n.;
} fclose1f.; } 4.4&;423' Functia este asemanatoare cu (234234 singura diferenta fiind modul de desc!idere (rb8< 4ceasta functie permite adaugarea de noi inregistrari in fisier . .upa ce se desc!ide fisierul si se determina numarul de articole din acesta , se cere introducerea codului articolului nou de adaugat ..aca codul este mai mare decat numarul de articole , indicatorul de stare este setat pe $ si ne pozitionam la sfarsitul fisierului adaugand articole in fisier pana la pozitia n. 4ltfel ma pozitionez pe articolul anterior , daca indicatorul de stare este 1 se afiseaza un mesa* : (artea cu codul n exista in baza de date= .aca indicatorul de stare nu este 1 prelucrez articolul si adaug informatii despre carte. /oid adaugare1. { 8+496 f; char nu0ef[30];int n,i ; carte % ; printf1-Cu0e fisier 7-.;fflush1stdin.; gets1nu0ef.; fAfopen1nu0ef,-r5D-.; printf1-,n Cod articol7-.; scanf 1-:d-,;n.; <hile1@feof1stdin.. { if 1nEnr_art1f,si=eof1carte... { %.isA0; fsee>1f,0,2.; for 1iAnr_art1f,si=eof1carte..;iFAn ;iDD. f<rite1;%,si=eof1carte.,1,f.; } fsee>1f,1nJ1.6si=eof1carte.,0.; fread1;%,si=eof1carte.,1,f.; if1%.is. printf1-,n Cartea cu codul :d e%ista in 5a=a de date,n-,n.; else{ fsee>1f,1nJ1.6si=eof1carte.,0.; %.codAn; printf 1-,n Gitlu-.; fflush1stdin.;gets1%.titlu.; printf 1-,n utor-.; gets1%.autor.; printf 1-,n 9ditura-.; gets1%.editura.; printf1H,nCategorie7I.;gets1%.categorie.; printf 1-,n n aparitie-.; scanf_s1-:d-,;%.an_aparitie.; printf 1-,n 2ret [(?C] 7-.; scanf_s 1-:u-,;%.pret.; printf1-,n Cantitate7-.; scanf_s1-:d-,;%.cantitate.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; } printf 1-introduceti cod articol sau ctrl =-.; scanf 1-:d-,;n.;
} fclose1f.; } 4FI54234' Functia va lista toate datele despre fiecare carte in parte. .upa ce se precizeaza fisierul care se doreste a fi listat , ma pozitionez la inceputul fisierului. 5e testeaza indicatorul de stare , daca acesta este 1 se afiseaza informatiile despre carte. /oid afisare_carti 1. { 8+49 6 f; char nu0ef[20]; printf1- Keschideti fisierul -.; fflush1stdin.;gets1nu0ef.; fAfopen1nu0ef,-r5-.; carte %; if1f. { fsee>1f,0,0.; printf1-,n,n-.; <hile 1fread1;%,si=eof1carte.,1,f.AA1. if1%.is@A0.{printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7I,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.; } } fclose 1f.; } 5>32;323 4ceasta functie realizeaza stergerea din baza de date a unei carti si a tuturor informatiilor referitoare la aceasta. .upa ce se desc!ide fisierul cu care se doreste a lucra si se introduce codul (npt cartea care dorim sa o stergem , verificam daca codul este mai mare decat numarul de articole si daca da se afiseaza un mesa* corespunzator. 4ltfel ma pozitionez pe n, citesc articolele din fisier. .aca indicatorul de stare este 1 ma pozitionez pe inregistrarea anterioara si setez indicatorul pe$, scriu articolul in fisier si afisez un mesa* care sa confirme ca stergerea a fost efectuata cu succes. /oid stergere1. { 8+49 6f; char nu0ef[20]; carte %; int n; printf1-,n JE Keschideti fisierul7 -.;fflush1stdin.;gets1nu0ef.; fAfopen1nu0ef,-r5D-.; if1f. {printf1-!tergeti cartea cu codul7 -.; scanf1-:d-,;n.; if1nEAnr_art1f,si=eof1carte... printf1-Cartea cu codul :d nu e%ista ,n-,n.; else { fsee>1f,n6si=eof1carte.,0.; fread1;%,si=eof1carte.,1,f.; if1@%.is. printf1-Cartea cu codul :d nu e%ista ,n-,n.; else { fsee>1f,ftell1f.Jsi=eof1carte.,0.; %.isA0; f<rite1;%,si=eof1carte.,1,f.; printf1-Cartea a fost sters cu succes@-.; } printf1-Kati codul produsului sau CtrlDL pentru iesire7-.; scanf_s1-:u-,;n.; } fclose1f.; } else { printf1-9roare la deschidere a fisierului :s-,nu0ef.; } } ?O.IFI(423' 4ceasta functie realizeaza modificarea cartilor in functie de o optiune aleasa. 5e pot modifica pe rand doar titlul, autorul,cantitatea,anul de aparitie sau editura..upa ce a fost desc!is fisierul cu care se doreste sa se lucreze si a fost determinat numarul de articole, se cere introducerea codului pentru cartea care dorim sa o modificam. 5e verifica daca n @ numarul de articole, daca da se afiseaza un mesa* : cartea nu exista :, daca nu ne pozitionam pe articol ,il citim .aca is91 afisam detaliile despre carte . 5e afiseaza apoi un mesa* in care utilizatorul este intrebat ce anume doreste sa modifice. (u a*utorul unui case sunt implementate cele A optiuni. /oid 0odificare_carti1. { 8+49 6f; char nu0ef[20]; carte %; int n,op; printf1-,nJE Keschideti fisierul7 -.; fflush1stdin.;gets1nu0ef.; fAfopen1nu0ef,-r5D-.; if1f. { printf1-#odificati cartea cu codul7 -.; scanf1-:d-,;n.; if1nEAnr_art1f,si=eof1carte... printf1-Cartea cu codul :d nu e%ista @-.; else { fsee>1f,n6si=eof1carte.,0.; fread1;%,si=eof1carte.,1,f.; if1@%.is. printf1-Cartea cu codul :d nu e%ista @-.; else { printf1-Ketalii carti M:d7 -, n.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7I,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.; fsee>1f,n6si=eof1carte.,0.; printf1-,n Koriti sa 0odificati7 -.; printf1-,n 1.G+G4NO ,n-.; printf1-,n 2 NG?(N4O ,n-.; printf1-,n 3.9K+GN(O ,n-.; printf1-,n ".C 2(+G+9O ,n-.; printf1-,n $.2(9GO ,n-.; printf1-,n &.CCG+GG9 ,n-.; printf1H,n '.CG93?(+9,nI.; printf1-,n +ntroduceti optiunea,n-.; scanf1-:d-, ;op.; s<itch1op. { case 17 %.codAn; printf1-,n Cout Gitlu7 -.; fflush1stdin.;gets1%.titlu.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; printf1-,n Ketaliile cartii au fost 0odificate,n,n-.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1H,n6666666666666666I.; 5rea>; case 27 %.codAn; printf1-,n Coul utor7 -.; fflush1stdin.;gets1%.autor.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; printf1-,n Ketaliile cartii au fost 0odificate,n,n-.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.; 5rea>; case 37 %.codAn; printf1-,n Coua 9ditura7 -.; fflush1stdin.;gets1%.editura.; %.isA1; fwrite(&x,sizeof(carte),1,f); printf("\n Detaliile cartii au fost modificate\n\n"); printf("\n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.;
5rea>; case "7 %.codAn; printf1-,n n aparitie7-.; scanf1-:d-,;%.an_aparitie.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; printf1-,n Ketaliile cartii au fost 0odificate,n,n-.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.;,
5rea>;} case &7 %.codAn; printf1-,n Coua Cantitate7-.; scanf1-:d-,;%.cantitate.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; printf1-,n Ketaliile cartii au fost 0odificate,n,n-.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.; 5rea>; case '7 %.codAn; printf1-,n Coua Categorie7-.; gets1%.categorie.; %.isA1; f<rite1;%,si=eof1carte.,1,f.; printf1-,n Ketaliile cartii au fost 0odificate,n,n-.; printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1H,nCategorie7:J10sI,%.categorie.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.; printf1-,n66666666666666666-.; 5rea>; default7printf1-ti apasat o tasta necorespun=atoare ,n-.; 5rea>; } } } fclose1f.; } else { printf1- 9(?(9 @ 8isierul nu e%ista :s-,nu0ef.; } } (OPI323 4ceasta functie realizeaza copierea articolelor din f isierul f in fisierul g . .upa ce se desc!ide fisierul f, atata timp cat nu e sfarsit de fisier ,articolele sunt copiate in g. /oid copiere_in_fis_te%t1. {8+49 6f,6g; char nu0e_f1[20],nu0e_f2[20]; carte y; printf1-,n Kati nu0ele fisierului de copiat7 -.;fflush1stdin.;gets1nu0e_f1.; if1@1fAfopen1nu0e_f1,-r5D-... printf 1-,n 8isierul :s nu poate fi deschis-, nu0e_f1.; else { printf1-,n Kati nu0ele noului fisier1de tip .t%t.-.;gets1nu0e_f2.; gAfopen1nu0e_f2,-<-.; fprintf1g,-,n cod titlu autor editura an_aparitie cantitate pret,n-.; fread1;y,si=eof1y.,1,f.; <hile1@feof1f.. { if1y.is@A0. fprintf1g,-,n :d :s :s :s :d :d :d,n-,y.cod, y.titlu, y.autor,y.editura, y.an_aparitie,y.cantitate, y.pret.; fread1;y,si=eof1carte.,1,f.; } fclose1f.; } fclose1g.; } 24PO2>' 8unctia ne afisea=a cartile pe categorie si in functie de an. nii sunt sortati in 0od crescator.2t fiecare an este calculata 0edia .poi ne folosi0 de /aria5ila su0a_categorie pe care o i0parti0 la nu0arul de ani care au 0ediaanE0, pentru a afla 0edia pe categorie /oid raport1. { 8+49 6f,6g; char nu0ef[20],nu0eg[20]; carte 5[30],a[30],%,au%; int i,P,>,gasit,su0aan,su0a_categorie,l,nr,nranicat; printf1-,n JE Keschideti fisierul7 -.; fflush1stdin.;gets1nu0ef.; fAfopen1nu0ef,-r5-.; if1@f. printf1-,n 9roare la deschidere a fisierului :s-,nu0ef.; else { iA0; PA0; fsee>1f,0,0.; <hile1fread1;%,si=eof1carte.,1,f.. { >A0; gasitA0; <hile11>FAi. ; 1gasitAA0.. { if1strc0p1%.categorie,5[>].categorie.AA0. gasitA1; else >DD; } if1>Ei. strcpy15[iDD].categorie,%.categorie.; >A0; gasitA0; <hile11>FAP. ; 1gasitAA0.. { if1a[>].an_aparitieAA%.an_aparitie. gasitA1; else >DD; } if1>EP. a[PDD].an_aparitieA%.an_aparitie; } BB end of <hile do { gasitA0; for1>A0;>FiJ1;>DD. if1strc0p15[>].categorie,5[>D1].categorie.E0. { au%A5[>]; 5[>]A5[>D1]; 5[>D1]Aau%; gasitA1; } } <hile1gasit.; do { gasitA0; for1>A0;>FPJ1;>DD.
if1a[>].an_aparitieFa[>D1].an_aparitie. { au%Aa[>]; a[>]Aa[>D1]; a[>D1]Aau%; gasitA1; } } <hile1gasit.; for1>A0;>Fi;>DD. { su0a_categorieA0; nranicatA0; printf1-,n666666666666666666666666666666666666666,n-.; printf1-,n:d. :s ,n-,>D1,5[>].categorie.; for1lA0;lFP;lDD. { printf1-,n 6 nul :d ,n-,a[l].an_aparitie.; fsee>1f,0,0.; su0aanA0; nrA0; <hile1fread1;%,si=eof1carte.,1,f.. { if11%.an_aparitieAAa[l].an_aparitie. ; 1strc0p1%.categorie,5[>].categorie.AA0.. { printf1-,n,t :J20s :&d -,%.titlu,%.cantitate.; su0aanDA%.cantitate; nrDD; } } printf1-,n-.; if1su0aanE0. {su0aanAsu0aanBnr; nranicategDD;} else su0aanA0; printf1-,n#edie an7 :d,n-,su0aan.; su0a_categorieDAsu0aan; } printf1-,n-.; printf1-,nJJJ#edie categorie :s7 :d ,n-,5[>].categorie,su0a_categorieBnranigen.; } fclose1f.; } } (autare autor respectiv cautare titlu. .upa ce se desc!ide fisierul se cere introducerea autorului( titlu dupa care se doreste realizarea cautarii.Be pozitionam la inceputul fisierului .4tata timp cat nu e sfarsit de fisier si is91 se realizeaza o comparare de stringuri .In momentul in care sCa gasit autorul intrCun articol , sunt afisate informatiile referitoare la acest articol /oid cautare_autor1. { 8+49 6 f; carte %; char aut[20],nu0ef[20]; printf1-Keschideti fisierul7 -.; fflush1stdin.;gets1nu0ef.; fAfopen1nu0ef,-rD5-.; if1f. { printf1-+ntroduceti autorul7 -.;gets1aut.; fsee>1f,0,0.; printf1-,n Cartile cu autorul :s sunt7 ,n,n-,aut.; <hile1fread 1;%,si=eof1carte.,1,f.AA1. { if11%.is.;1strc0p1aut,%.autor.AA0.. { printf1-,n Cod7 :d-,%.cod.; printf1-,n Gitlu 7 :J10s-,%.titlu .; printf1-,n utor7 :J10s-,%.autor.; printf1-,n 9ditura7 :J10s-,%.editura.; printf1-,n n aparitie7 :d-,%.an_aparitie.; printf 1-,n 2ret [(?C] 7:d-,%.pret.; printf1-,n Cantitate7:d-,%.cantitate.;