Sunteți pe pagina 1din 8

Lucrul cu fişiere organizate secvenţial: exemple

(inclusiv problema cu grade de total)

Enunțuri:

1. Să se scrie programul care creează un fişier secvenţial cu date despre studenţii unei facultăţi. Articolele au
următoarea structură: număr matricol, nume, anul, grupa, numărul de note, notele (maxim 15). Datele se preiau
de la tastatură, sfârşitul introducerii fiind marcat standard. (expl. de creare)
2. Să se scrie programul care afişează datele despre studenţii ale căror numere matricole se introduc de la tastatură.
Sfârşitul introducerii este marcat standard. (expl.de consultare un articol)
3. 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. (expl. de consultare cu selecție)
4. Să se scrie programul care listează, într-un fişier text, sub formă de tabel, conţinutul fişierului creat la problema
anterioara. (expl. de consultare integrală)
5. Să se scrie programul pentru adăugarea notei la disciplina algoritmi și tehnici de programare pentru studenul al
cărui număr matricol este introdus de la tastatură. (expl. de modificare articol unic)
6. Să se scrie programul pentru adăugarea punctului din oficiu la nota la ATP pentru studenţii din grupa al cărei
număr este introdus de la tastatură. (expl. de modificare cu selecție)
7. 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. (expl. de problemă cu grade de total)

Alte exemple de probleme – lucru suplimentar:


1) Să se scrie programul care realizează adăugarea în fișierul binar creat la problema 1
2) Să se scrie programul care realizează o modificare integrală a articolelor din fișierul binar
3) Să se scrie programul care realizează ștergerea unor articole din fișierul secvențial (simulare: copierea tuturor
articolelor care nu trebuie şterse în alt fişier; ştergerea fişierului iniţial; redenumirea celui nou)

1
Rezolvări:

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

Observație: Pentru recunoașterea funcției gets în Visual Studio versiunile mai noi -> se va schimba extensia
fișierului sursă. Noua extensie va fi .c (in loc de .cpp)

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>
typedef struct{int nr;
char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f;
char s1[20];
Student s;
int i;
printf("\nFisier: ");gets(s1);
f=fopen(s1,"wb");
printf("Nr.matricol: ");scanf("%d",&s.nr);
while(!feof(stdin))
{printf("Nume: ");
getchar();
gets(s.nume);
printf("An: ");scanf("%d",&s.an);
printf("Grupa: ");scanf("%d",&s.grupa);
printf("Nr.note:(<15)");scanf("%d",&s.n);
for(i=0;i<s.n;i++)
{printf("Nota %d: ",i+1);
scanf("%d",&s.note[i]);}
fwrite(&s,sizeof(Student),1,f);
printf("Nr.matricol: ");scanf("%d",&s.nr);
}
fclose(f);}

2. Să se scrie programul care afişează datele despre studenţii ale căror numere matricole se introduc de la
tastatură. Sfârşitul introducerii este marcat standard.

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>

typedef struct{int nr;


2
char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f;
char s1[20];
Student s;
int i,n,j;
printf("\nFisier: ");gets(s1);
f=fopen(s1,"rb");
if(!f)printf("\nFisierul %s nu poate fi deschis", s1);
else{printf("\nNr. matricol: ");
scanf("%d",&n);
while(!feof(stdin))
{rewind(f);
fread(&s,sizeof(Student),1,f);
i=0;
while((!feof(f))&&(!i))
{if(n==s.nr)
{i=1;
printf("\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++)
printf("%2d ",s.note[j]);}
fread(&s,sizeof(Student),1,f);}
if(!i)printf("\nNu a fost gasit.");
printf("\nNr. matricol: ");
scanf("%d",&n);}
fclose(f);}
}

3. 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.

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f,*g;
char s1[20];
Student s;
int i,n,j;

3
printf("\nFisier: ");gets(s1);
f=fopen(s1,"rb");
if(!f)printf("\nFisierul %s nu poate fi deschis",s1);
else{printf("\nNr. grupei: ");

scanf("%d",&n); //grupa
while(!feof(stdin))
{rewind(f);
getchar();
printf("\nFisier rezultat: ");gets(s1);
g=fopen(s1,"w");

fread(&s,sizeof(Student),1,f);
i=0;
while(!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]);}
fread(&s,sizeof(Student),1,f);}
if(!i)printf("\nNu a fost gasita.");
printf("\nNr. grupei: ");
scanf("%d",&n);
fclose(g);}
fclose(f);}
}

4. Să se scrie programul care listează, într-un fişier text, sub formă de tabel, conţinutul fişierului creat la problema
1.

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f,*g;
char s1[20];
Student s;
int i,n;
printf("\nNumele fisierului binar: ");gets(s1);
f=fopen(s1,"rb");
if(!f)printf("\nFisierul %s nu poate fi deschis",s1);
else{printf("\nFisier rezultat (text): ");gets(s1);
g=fopen(s1,"w");
4
fprintf(g,"\nNr. Nume %25s An Grupa Note"," ");
fread(&s,sizeof(Student),1,f);
n=0;
while(!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]);
fread(&s,sizeof(Student),1,f);
}
fclose(g);
fclose(f);}
}

5. Să se scrie programul pentru adăugarea notei la disciplina algoritmi și tehnici de programare pentru studenul al
cărui număr matricol este introdus de la tastatură. Nota la disciplina ATP se găseste pe poziția zero în vectorul de
note.

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f;
char s1[20];
Student s;
int i,n,j;
printf("\nFisier: ");gets(s1);
f=fopen(s1,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", s1);
else{printf("\nNr. matricol: ");

scanf("%d",&n);
while(!feof(stdin))
{rewind(f);
fread(&s,sizeof(Student),1,f);
i=0;
while((!feof(f))&&(!i))
{if(n==s.nr)
{i=1;
printf("\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++)
printf("%2d ",s.note[j]);

5
printf("Introduceti nota la ATP");
scanf ("%d", &s.note[0]);
fseek(f, ftell(f)-sizeof(Student),0);
fwrite(&s, sizeof(Student), 1, f);
}else
fread(&s,sizeof(Student),1,f);
}
if(!i)printf("\nNu a fost gasit.");
printf("\nNr. matricol: ");
scanf("%d",&n);}
fclose(f);}
}

6. Să se scrie programul pentru adăugarea punctului din oficiu la nota la ATP pentru studenţii din grupa al cărei
număr este introdus de la tastatură. Nota la ATP se regăsește pe poziția zero în vectorul de note.

#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente de securitate


#include<stdio.h>

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f;
char s1[20];
Student s;
int n,i;
printf("\nFisier: ");gets(s1);
f=fopen(s1,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis",s1);
else{
printf("\nNr. grupei: ");
scanf("%d",&n);
while(!feof(stdin))
{rewind(f);
fread(&s, sizeof(Student), 1, f);
i=0;
while(!feof(f))
{if(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);
}
6
if(!i) printf("\n Nu a fost gasit nici un student");
printf("\nNr grupei: ");scanf("%d",&n);}
fclose(f);}
}

7. Pentru problema cu grade de total, fisierul trebuie să fie ordonat după caracteristicile de control

a) Să se scrie programul care sortează studenţii după anii de studiu şi grupe. (se va apela apoi problema 4).
Se vor verifica datele daca sunt sortate)

#include<stdio.h>

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;}

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f,*g;
char s[20];
Student s1,s2;
int ok,n,i;
printf("\nFisier: ");gets(s);
f=fopen(s,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis",s);
else{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);
if ((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);}
}
7
b) 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)

#include<stdio.h>

typedef struct{int nr;


char nume[30];
int an;
int grupa;
int n;
int note[15];
}Student;

void main()
{FILE *f,*g;
char s1[20];
Student s;
int i,na,j,e,ng,ca,cg;
float ma,mg,ms;
printf("\nFisier: ");gets(s1);
f=fopen(s1,"rb");
if(!f)printf("\nFisierul %s nu poate fi deschis",s1);
else {printf("\nFisier text: ");gets(s1);
g=fopen(s1,"w");

fread(&s,sizeof(Student),1,f);
while(!feof(f))
{// operatii initiale pentru an
ca=s.an;
fprintf(g,"\n\nAnul %d",ca);
ma=0; na=0;

while((!feof(f))&& (s.an==ca))
{// operatii initiale pentru grupa
mg=0; ng=0;
cg=s.grupa;
fprintf(g,"\n\tGrupa %d",cg);

while((!feof(f))&&(ca==s.an)&&(cg==s.grupa))
{e=1;ms=0;
for(j=0;j<s.n;j++)
if(s.note[j]<5)e=0;
else ms+=s.note[j];
if(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]);}
fread(&s,sizeof(Student),1,f);
}
//operatii finale grupa
if(ng){fprintf(g,"\n\tGrupa %d, media: %5.2f",cg,mg/ng);ma+=mg;na+=ng;}
else fprintf(g,"\n\Grupa nu are integralisti");}

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

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