sem 07 - fisiere org_relativ.docx

12
Seminar 7 – Fisiere organizate relativ 1. Să se scrie programul care creează un fişier organizat relativ cu date despre realizarea produselor pe luni in cadrul unei societati comerciale. Informatiile retinute despre produse sunt: denumirea, pret, cantitate (maxim 12). Cheia relativă a fişierului este codul produsului. Datele se preiau de la tastatură, sfârşitul introducerii fiind marcat standard. Exemplu de rulare: Dupa rulare, conform exemplului de rulare, langa fisierul sursa trebuie creat fisierul binar FisBinRel.dat. 1

Upload: oana-vasile

Post on 21-Dec-2015

7 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Sem 07 - Fisiere org_relativ.docx

Seminar 7 – Fisiere organizate relativ

1. Să se scrie programul care creează un fişier organizat relativ cu date despre realizarea produselor pe luni in cadrul unei societati comerciale. Informatiile retinute despre produse sunt: denumirea, pret, cantitate (maxim 12). Cheia relativă a fişierului este codul produsului. Datele se preiau de la tastatură, sfârşitul introducerii fiind marcat standard.

Exemplu de rulare:

Dupa rulare, conform exemplului de rulare, langa fisierul sursa trebuie creat fisierul binar FisBinRel.dat.

1

Page 2: Sem 07 - Fisiere org_relativ.docx

Cazul cand doua produse sunt introduse cu acelasi cod – Mesaj de atentionare

Indicatii:

-biblioteci-definire structura -functie pentru calcul numar de articole din fisier: int nrart(FILE *f, int l) {...} - in functia main{- declarare variabile- deschidere fisier (cu wb+, preformare)- se citeste un cod de produs de la tastatura ( indica pozitia in relativa in fisier) - cat timp nu este sfarsit de introducere date de la tastatura (stdin)

{ - preformare fisier cu un numar de articole ce pot fi scrise in raport cu codul introdus de la tastatura. Indicele de stare IS=0 pentru toate. -pozitionare in fisier pe articolul aflat pe pozitia egala cu codul introdus de la tastatura ( cu fseek()); -se citeste un articol (cu fread()); -daca IS=1 pentru pozitia respectiva, atunci acticolul nu poate fi scris. Se poate scrie doar daca IS=0.

-daca IS=0:{- pozitionare in fisier pe articolul de la pozitia egala cu codul introdus;-se citesc campurile produsului, campul p.is se va face 1;se scrie variabila p in fisierul f

} - se citeste un nou cod de la tastatura }se inchide fisierul}

2

Page 3: Sem 07 - Fisiere org_relativ.docx

2. Să se scrie programul care listează, într-un fişier text, produsele cu cea mai mare valoare pe an.

Exemplu de rulare:- se introduce numele fisierului relativ (fisierul binar creat la problema Pb. 1 se va afla in directorul in

care se afla sursa problemei- se introduce numele fisierului text in care se vor lista rezultatele. Acest fisier text va aparea in

directorul fisierului sursa.

Rulare

Fisierul text rezultat

Indicatii

-biblioteci: stdio.h-definire structura – vezi Pb 1 - in functia main{ - declarare variabile: f, g de tip fisier; char nume[20]; PRODUS p; max, val de tip real; i, cod de tip intreg; -preluare nume de fisier de la tastatura ( gets(nume);) -daca (!(f=fopen(nume,"rb"))) measj ("\nFisierul %s nu poate fi deschis",nume); altfel

{ -preia numele fisierului text de la tastatura ( gets(nume); ) -deschide fisier text pentru scriere ( g=fopen(nume,"w"); )

max=0; cod=0;

-// se afiseaza in fisierul text g mesajul ”Produsele sunt:” ( fprintf(g,"\n Produsele sunt:"); ) -se citeste un articol din fisierul binar f (fread(&p,sizeof(PRODUS), 1, f); ) -atat timp cat (!feof(f))

{daca (p.is)

3

Page 4: Sem 07 - Fisiere org_relativ.docx

{val=0;for(i=0;i<12;i++) val+=p.cant[i]*p.pret;daca (val>max)

{fclose(g);g=fopen(nume,"w");max=val;fprintf(g,"\n Produsele cu valoarea %5.2f sunt:", max);}

if(val = = max)fprintf(g,"\n%4d %-30s",cod, p.denumire);}

cod++;fread(&p,sizeof(PRODUS), 1, f);

}-inchide fisierul g

-inchide fisierul f}

}

3. Să se scrie programul pentru stergerea produselor care au inregistrat productie zero în cel puţin trei luni.

Exemplu de rulare

Fisier FisBinRel_3.dat creat utilizand Pb.1 – caz in care sunt 3 luni cu productie 3 (produsul TV)

4

Page 5: Sem 07 - Fisiere org_relativ.docx

Fisierul FisBinRel_3.dat va fi utilizat ca input pentru problem curenta (3).Tema – se se scrie un program care sa listeze intr-un fisier text continutul fisierului FisBinRel_3.dat dupa stergerea produsului TV care indeplineste conditia de a avea 0 pentru cel putin 3 luni.

Indicatii

-biblioteci: stdio.h-definire structura – vezi Pb 1 - in functia main{

- declarare variabile: f de tip fisier; char nume[20]; p de tip PRODUS; intregi i, e, n; - preluare nume fisier de la tastatura: printf("\nFisier: "); gets(nume);- daca (!(f=fopen(nume,"rb+"))) mesaj ("\nFisierul %s nu poate fi deschis",nume);

altfel{n=0;fread(&p,sizeof(PRODUS), 1, f);atat timp cat (!feof(f))

{if(p.is) { e=0; for(i=0;i<12 && e<3;i++) if(p.cant[i]==0) e++; if(e>=3)

{printf("\n%-30s",p.denumire);fseek(f,ftell(f)-sizeof(PRODUS),SEEK_SET);p.is=0; fwrite(&p,sizeof(PRODUS), 1, f);fseek(f,0,1);n++;}

}fread(&p,sizeof(PRODUS), 1, f);}

fclose(f); mesaj ("\nAu fost sterse %d produse",n);}

}

TEMA5

Page 6: Sem 07 - Fisiere org_relativ.docx

1. Fie un fişier organizat relativ, cu date despre facturile emise de o societate comercială. Articolele au următoarea structură logică:

Nume client Data facturării Nr. produse Valoare produse

char [30]zi luna an

int1 2 … 50

char char int float float float

Cheia relativă a fişierului este numărul facturii.

Să se scrie programul C pentru listarea într-un fişier text a facturilor din anul trecut a căror valoare depăşeşte o limită dată. Se vor preciza număr factură, clientşi valoare.

2. Fie un fişier organizat relativ, cu articole avînd următoarea structură logică:

Denumire

fond fixTip fond fix

Data achiziţiei Valoare

inventarGestionar

an lună zi

char[30] char[20] int char char float char[30]

Numărul de inventar indică numărul relativ al articolului în fişier.

Să se scrie programul C pentru afişarea fondurilor fixe ale căror numere de inventar se introduc de la tastatură. Sfîrşitul introducerii datelor este marcat standard.

3. Fie un fişier organizat relativ, cu articole de următoarea structură:

Nume şi prenumeAn de studiu

Grupa Nr. disciplineNote obţinute

char [30] char int char

1 2 … 15

char

char char

Numărul matricol indică numărul relativ al articolului în fişier.

Scrieţi un program C pentru înscrierea interactivă în fişier a notelor obţinute în urma susţinerii unor examene. Fiecare materie are asociată o anumită poziție în vectorul de note. Sfîrşitul introducerii datelor este marcat standard.

4.Fie fisierul descris in problema 3 (din sectiunea TEMA). Scrieti programul C pentru exmatricularea studentilor cu mai mult de 5 restante.

6

Page 7: Sem 07 - Fisiere org_relativ.docx

5.Fie fisierul descris la problema 3(din sectiunea TEMA). Scrieti programul C pentru modificarea anului de studiu (se va trece in anul 1) pentru studentii cu numarul matricol cuprins intre doua valori date de la tastatura (a,b). Se pesupune ca exista un student cu numarul matricol a.

6. Pentru toate fisierele relative create in cadrul acestui seminar scrieti programe multifunctionale care realizeaza toate operatiunile de gestiune necesare (adaugare, modificare, stergere, listare, etc.)

7. Să se scrie programul care modifică o cantitate pentru produsele ale căror coduri se introduc de la tastatură. De la tastatură se va introduce luna (1-12) pentru care se modifica cantitatea (Structura este cea de la pb 1 din suportul de seminar) .

8. Să se scrie programul care listează într-un fişier text produsele realizate de societatea comercială, ordonate crescător după denumire (Structura este cea de la pb 1 din suportul de seminar).

9. Să se scrie programul care listează într-un fişier text produsele care inregistrat o producţie crescătoare pe intreaga perioada analizata (Structura este cea de la pb 1 din suportul de seminar).

ANEXA 1

Functii pentru:o calcul numar total de spatii in fisier (nr. articole fizice)o pozitia curenta din fisiero preformare fisiero pozitionare in fisiero citire in acces secvential, urmatorul articolo citire in acces directo scriere articol in acces directo suprascriere articol in vederea modiciarii, in acces directo stergere articol cu cheie data

7

Page 8: Sem 07 - Fisiere org_relativ.docx

#include<stdio.h>#include<malloc.h>#include<string.h>

// numar total spatii in fisier (nr. articole fizice)// I - fisierul, dimensiunea unui articol logic// E - nr. articole fizice (-1 daca fisierul nu e deschis)int NrSpatii(FILE* f, long dim){ long p;int nr; nr=-1;if(f) { p=ftell(f); fseek(f,0,SEEK_END); nr=ftell(f)/(dim+1); fseek(f,p,SEEK_SET); }return nr;}

// pozitia curenta in fisier// I - fisierul, dimensiunea unui articol logic// E - pozitia curenta, in nr. de articole, -1 daca fisierul e inchisint Pozitia(FILE* f, long dim){ int nr; nr=-1;if(f) nr=ftell(f)/(dim+1);return nr;}

// preformare fisier// I - fisierul, dim. art., nr. art. pentru preformare/extindere// E - cod eroare: 0 - succes, 1 - fisierul era inchisint Preformare(FILE* f, long dim, int nr){ int i,er;char *art; er=1;if(f) { fseek(f,0,SEEK_END); art=(char*)malloc(dim+1); art[0]=0;for(i=0;i<nr;i++) fwrite(art,dim+1,1,f); er=0; free(art); }return er;}

// pozitionare// I - fisierul, dim. art., pozitia dorita in nr. relativ articol// E - cod eroare, 0 - succes, 1 - pozitia prea mare, 2 - fis. inchisint Pozitionare(FILE* f, long dim, int p){ int er; er=2;if(f)if(p<NrSpatii(f,dim)) { fseek(f,p*(dim+1),SEEK_SET); er=0; }else er=1;return er;}

// citire in acces secvential, urmatorul articol// I - fisierul, dim. art., adresa la care se depune articolul citit// E - cod eroare, 0 - art. citit, 1 - fis. inchis, 2 - sfirsit fisierint CitesteUrmatorul(FILE* f, long dim, void* adresa){ char* art;int er=1;if(f) { art=(char*)malloc(dim+1); fread(art,dim+1,1,f);while((!feof(f)) && (er==1)) { if(art[0]) { er=0; memcpy(adresa,art+1,dim); }else fread(art,dim+1,1,f); }if(er==1) er=2; free(art); }return er;}

// citire in acces direct// I - fisierul, dim. art., cheia art., adresa unde se depune articolul// E - cod eroare, 0 - art. citit, 1 - fis. inchis sau poz. prea mare, // 2 - cheie invalidaint CitestePozitia(FILE* f, long dim, int poz, void* adresa){ char* art;int er;

8

Page 9: Sem 07 - Fisiere org_relativ.docx

er=Pozitionare(f, dim, poz);if(!er) { art=(char*)malloc(dim+1); fread(art,dim+1,1,f);if(art[0]==0) er=2;else { er=0; memcpy(adresa, art+1, dim);} free(art); }return er;}

// scriere articol in acces direct// I - fisierul, dim. art., adresa articolului, cheia articolului// E - cod eroare, 0 - succes, 1 - fis. inchis, 2 - cheie invalida int ScriePozitia(FILE* f, long dim, void* adresa, int poz){ char* art;int n,er=1;

if(f) { n=NrSpatii(f,dim);if(poz>=n) Preformare(f,dim,poz-n+1); art=(char*)malloc(dim+1); Pozitionare(f,dim,poz); fread(art,dim+1,1,f);if(art[0]==1) er=2;else { er=0; memcpy(art+1,adresa,dim); art[0]=1; Pozitionare(f,dim,poz);fwrite(art,dim+1,1,f); } free(art); }return er;}

// suprascriere articol in vederea modificarii, in acces direct// I - fisierul, dim. art., adresa articolului, cheia articolului// E - cod eroare: 0 - succes, 1 - fis. inchis, 2 - pozitia e prea mareint RescriePozitia(FILE* f, long dim, void* adresa, int poz)

{ char* art;int n,er=1;

if(f) { n=NrSpatii(f,dim);if(poz>=n) er=2;else{ art=(char*)malloc(dim+1); Pozitionare(f,dim,poz); er=0; memcpy(art+1,adresa,dim); fwrite(art,dim+1,1,f); } free(art); }return er;}

// sterge articolul cu cheia data// I - fisierul, dimensiunea unui articol, cheia articolului de sters// E - cod eroare, 0 - succes, 1 - fis. inchis sau pozitie prea mare, 2 - cheie invalida (spatiu gol), int Sterge(FILE*f, long dim, int poz){char* art;int er; er=Pozitionare(f,dim,poz);if(!er) { art=(char*)malloc(dim+1); fread(art,dim+1,1,f); if(art[0]==0) er=2; else { er=0; art[0]=0; Pozitionare(f,dim,poz); fwrite(art,dim+1,1,f); } free(art); }return er;}

9