Sunteți pe pagina 1din 8

Seminar 6 Atp

- Fisiere organizate secvential


1. S se scrie programul care creeaz un fiier binar organizat secvenial numit Stud.dat cu
date despre studenii unei faculti. Articolele au urmtoarea structur:
numr matricol (intreg)
nume (char max.30)
anul (intreg)
grupa (intreg)
numrul de note (intreg),
notele (intreg, max.15).
Datele se preiau de la tastatur, sfritul introducerii fiind marcat standard (CTRL + Z).
Acolo unde nu se cunoate 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
o
o
o
o
o

declarare variabile
preluare nume fisier
deschidere fisier binar pentru scriere
citire numar matricol de la tastatura
introducere elemente de la tastatura pana la intalnirea CTRL Z
inchidere fisier f

2. S se scrie programul care listeaz, ntr-un fiier text numit Stud1.txt, sub form de
tabel, coninutul fiierului 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 studenii dup anii de studiu i grupe intr-un fisier
binar. (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 acea 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 fiier text, studenii integraliti, pe ani i
grupe, calculnd media fiecrei grupe i a fiecrui 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 adugarea punctului din oficiu la nota la filosofie pentru
studenii din grupa al crei numr 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 fiiere text, situaia studenilor din grupele ale
cror numere se introduc de la tastatur. Sfritul 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);
}
}