Sunteți pe pagina 1din 8

Seminar 5 – Atp

- Fisiere organizate secvential –

1. Să se scrie programul care creează un fişier binar organizat secvenţial numit “Stud.dat” cu
date despre studenţii unei facultăţi. Articolele au următoarea structură:
număr matricol (intreg)
nume (char max.30)
anul (intreg)
grupa (intreg)
numărul de note (intreg),
notele (intreg, max.15).
Datele se preiau de la tastatură, sfârşitul introducerii fiind marcat standard (CTRL + Z).
Acolo unde nu se cunoaşte încă nota se va introduce valoarea 0.

Exemplu de rulare

Rezultat: crearea fisierului Stud.dat in directorul in care se afla sursa.


Indicatii

- biblioteci: stdio.h
- definire structura: Student
- in functia main:
{
o declarare variabile
o preluare nume fisier
o deschidere fisier binar pentru scriere
o citire numar matricol de la tastatura
o introducere elemente de la tastatura pana la intalnirea CTRL – Z
o inchidere fisier f
}

2. Să se scrie programul care listează, într-un fişier text numit Stud1.txt”, sub formă de
tabel, conţinutul fişierului “Stud.dat” creat la problema anterioara. Fisierul “Stud.dat” din
care va fi preluata informatia va fi copiat langa fisierul sursa al problemei (altfel se va da
calea catre el).

Exemplu de rulare

Rezultat

Indicatii
- biblioteci: stdio.h
- definire functii citire/scriere pentru usurinta

#define fwriteb(x,f) fwrite(&(x),sizeof(Student),1,(f))


#define freadb(x,f) fread(&(x),sizeof(Student),1,(f))

- definire structura: la fel ca la ex. 1


- in functia main:
{
- declarare variabile:
o f si g de tip Fisier;
o char s1[20];
o s de tip Student;
o intregi i,n;
- preluare nume de fisier ( printf("\nFisier: "); gets(s1); )
- daca (!(f=fopen(s1,"rb"))) mesaj ("\nFisierul %s nu poate fi deschis",s1);
altfel {
printf("\nFisier rezultat (text): ");
gets(s1);
g=fopen(s1,"w");
fprintf(g,"\nNr. Nume %25s An Grupa Note"," ");
freadb(s,f);
n=0;
atat timp cat (!feof(f))
{
fprintf(g,"\n%3d %-30s %2d %4d ",++n,s.nume,s.an,s.grupa);
for(i=0;i<s.n;i++)
fprintf(g,"%2d ",s.note[i]);
freadb(s,f);
}
fclose(g);
fclose(f);
}
}

3. Să se scrie programul care sortează intr-un fisier binar studenţii după anii de studiu şi
grupe. (se va apela apoi problema 2 cu listare in fisierul text stud2.txt. Se vor verifica datele
daca sunt sau nu sortate)

Rulare:
- se va copia in directorul cu fisierul sursa fisierul Stud.dat
- in cadrul rularii se va da numele acestui fisier
- dupa rulare, se va copia fisierul rezultat (care va avea acelasi nume Stud.dat) in directorul
problemei 2).
- se va rula problema 2 pentru a putea vizualiza intr-un fisier text continutul fisierului
sortat Stud.dat

Rezultat
Indicatii:

- biblioteci: stdio.h

- functie pentru calculului numarului de articole din fisier:


int nrart(FILE *f, int l)
{
long p;
int n;
p=ftell(f);
fseek(f,0,2);
n=ftell(f)/l;
fseek(f,p,0);
return n;
}

- definire structura - vezi ex. 1


- in functia main:

{
- declarare variabile: FILE *f,*g; char s[20]; Student s1,s2; int ok,n,i;
- preluare nume fisier ( printf("\nFisier: ");gets(s); )
- daca (!(f=fopen(s,"rb+"))) mesaj ("\nFisierul %s nu poate fi deschis",s);
altfel {
n=nrart(f,sizeof(Student));
ok=1;
while(ok)
{
ok=0;
for(i=0;i<n-1;i++)
{
fseek(f, i*sizeof(Student), 0);
fread(&s1, sizeof(Student), 1, f);
fread(&s2, sizeof(Student), 1, f);
daca ((s1.an>s2.an) || ((s1.an==s2.an) && (s1.grupa>s2.grupa)))
{
ok=1;
fseek(f,i*sizeof(Student),0);
fwrite(&s2, sizeof(Student), 1, f);
fwrite(&s1, sizeof(Student), 1, f);
}
}
}
fclose(f);
}
}

4. Să se scrie programul care listează, într-un fişier text, studenţii integralişti, pe ani şi
grupe, calculând media fiecărei grupe şi a fiecărui an. (fisierul rezultat se va numi stud3.txt
si se va verifica rezultatul comparand cu datele din stud2.txt)

Indicatii
- biblioteci: stdio.h
- definire functii citire/scriere pentru usurinta

#define fwriteb(x,f) fwrite(&(x),sizeof(Student),1,(f))


#define freadb(x,f) fread(&(x),sizeof(Student),1,(f))

- definire structura
typedef struct{int nr; char nume[30]; int an; int grupa; int n; int note[15];}Student;

- in functia main:
{
definire variabile:
f,g - de tip Fisier;
char s1[20];
Student s;
i,na,j,e,ng,ca,cg - intregi;
ma,mg,ms - de tip real;
preluare nume fisier: printf("\nFisier: "); gets(s1);
daca (!(f=fopen(s1,"rb"))) mesaj ("\nFisierul %s nu poate fi deschis",s1);
altfel {
mesaj ("\nFisier text: ");
gets(s1);
g=fopen(s1,"w"); //se deschide fisier text pentru scriere

freadb(s,f); // se citeste un element din fisierul binar f


atat timp cat (!feof(f))
{// operatii initiale pentru an
ca=s.an;
fprintf(g,"\n\nAnul %d",ca);
ma=0; na=0;

atat timp cat ((!feof(f))&& (s.an==ca))


{ // operatii initiale pentru grupa
mg=0; ng=0;
cg=s.grupa;
fprintf(g,"\n\tGrupa %d",cg);

atat timp cat ((!feof(f))&&(ca==s.an)&&(cg==s.grupa))


{
e=1;
ms=0;
for(j=0;j<s.n;j++)
daca (s.note[j]<5)e=0;
altfel ms+=s.note[j];
daca (e) {
mg+=ms/s.n;
ng++;
fprintf(g,"\n\t\t%4d %-30s Media %5.2f Note: ", s.nr,
s.nume, ms/s.n);
for(j=0;j<s.n;j++)fprintf(g,"%2d ",s.note[j]);}
freadb(s,f);}
//operatii finale grupa
daca (ng) { fprintf(g,"\n\tGrupa %d, media:
%5.2f",cg,mg/ng);ma+=mg;na+=ng;}
altfel fprintf (g,"\n\Grupa nu are integralisti");
}

//operatii finale an
daca (na) fprintf(g,"\nMedia anului %d este:
%5.2f",ca,ma/na);
altfel fprintf(g,"\nAnul nu are integralisti");}

fclose(f);
fclose(g);
}
}

5. Să se scrie programul pentru adăugarea punctului din oficiu la nota la filosofie pentru
studenţii din grupa al cărei număr este introdus de la tastatură.

- biblioteci: stdio.h
- definire structura:
typedef struct{int nr; char nume[30]; int an; int grupa; int n; int note[15]; }Student;

- in functia main:
{ declarare variabile: FILE *f; char s1[20]; Student s; int n,i;
- preluare nume de fisier: printf("\nFisier: ");gets(s1);
daca (!(f=fopen(s1,"rb+"))) mesaj ("\nFisierul %s nu poate fi deschis",s1);
altfel {
- se citeste numarul grupei ( mesaj ("\nNr. grupei: "); scanf("%d",&n);)
- atat timp cat (!feof(stdin))
{
rewind(f);
fread(&s, sizeof(Student), 1, f);
i=0;
atat timp cat (!feof(f))
{daca (n == s.grupa)
{
i=1;
s.note[0]=(s.note[0]==10)? s.note[0]: s.note[0]+1;
fseek(f, ftell(f)-sizeof(Student), 0);
fwrite(&s, sizeof(Student), 1, f);
fseek(f, 0, 1); //folosit la trecerea de la scriere la citire
}
fread(&s, sizeof(Student), 1, f);
}
daca (!i) mesaj ("\n Nu a fost gasit nici un student");
se citeste numarul grupei ( printf("\nNr grupei: ");scanf("%d",&n); )
}
fclose(f);
}
}

6. Să se scrie programul care listează, în fişiere text, situaţia studenţilor din grupele ale
căror numere se introduc de la tastatură. Sfârşitul introducerii este marcat standard.

- biblioteci - stdio.h
- definire functii scriere/citire fisier binar
#define fwriteb(x,f) fwrite(&(x),sizeof(Student),1,(f))
#define freadb(x,f) fread(&(x),sizeof(Student),1,(f))

- definire structura:
typedef struct{int nr;
char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

- in functia main
{
- variabile: FILE *f,*g; char s1[20]; Student s; int i,n,j;
- preluare fisier ( printf("\nFisier: ");gets(s1); )
daca (!(f=fopen(s1,"rb"))) mesaj ("\nFisierul %s nu poate fi deschis",s1);
altfel {
mesaj ("\nNr. grupei: ");
scanf("%d",&n);
atat timp cat (!feof(stdin))
{
rewind(f);
fflush(stdin);
printf("\nFisier rezultat: ");gets(s1);
g=fopen(s1,"w");

freadb(s,f);
i=0;
atat timp cat (!feof(f))
{
if(n==s.grupa)
{
i=1;
fprintf(g,"\nNr.mat:%3d Nume: %-30s An: %2d Grupa:
%4d\nNote: ", s.nr,s.nume,s.an,s.grupa);
for(j=0;j<s.n;j++)
fprintf(g,"%2d ",s.note[j]);
}
freadb(s,f);
}
daca (!i) mesaj ("\nNu a fost gasita.");
printf("\nNr. grupei: ");
scanf("%d",&n);
fclose(g);
}
fclose(f);
}
}

S-ar putea să vă placă și