Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 8

Seminar 5

Lucrul cu fișiere text și fișiere binare – probleme economice

Probleme propuse:

1. Fie un fişier organizat secvențial, cu date referitoare la punctele obținute de studenți la disciplina Algoritmi și
tehnici de programare. Articolele au următoarea structură:
Puncte proba practică Puncte teme (0-1)
Nr. matricol Nume şi prenume Grupa Puncte examen (0-60)
(0-20) 1 2 … 10
int char[30] int char char char char char char
Scrieți programul care înregistrează în fișier punctajul obținut de un student la examen. Studentul este identificat
prin numărul matricol. Programul trebuie să ofere posibilitatea repetării, pentru înregistrarea punctajelor mai
multor studenți.
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.

2. Fie un fişier organizat secvențial, cu date referitoare la punctele obținute de studenți la disciplina Algoritmi și
tehnici de programare. Articolele au următoarea structură:
Puncte proba practică Puncte teme (0-1)
Nr. matricol Nume şi prenume Grupa Puncte examen (0-60)
(0-20) 1 2 … 10
int char[30] int char char char char char char
Scrieți programul care înregistrează înmatricularea unui nou student (punctajele vor avea valori nule).
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.

3. Fie un fişier organizat relativ, cu date referitoare la absențele studenților de la cursuri și seminarii/laboratoare
pentru fiecare dintre cele 15 discipline specifice fiecărui an de studiu. Cheia relativă este numărul matricol al
studentului (domeniul de valori pentru numerele matricole începe de la 0). Articolele au următoarea structură:
An Absențe (0-14)
Indicator de stare (0/1) Nr. matricol Nume şi prenume Grupa
(1-5) 1 2 … 15
C S C S C S
char int char[25] int char
char char char char char char
Numărul de activități la fiecare disciplină este 14.
Scrieţi un program care înregistrează exmatricularea unui student. Studentul este identificat prin numărul matricol.
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.

4. Fie un fişier organizat relativ, cu date referitoare la absențele studenților de la cursuri și seminarii/laboratoare
pentru fiecare dintre cele 15 discipline specifice fiecărui an de studiu. Cheia relativă este numărul matricol al
studentului (domeniul de valori pentru numerele matricole începe de la 0). Articolele au următoarea structură:
An Absențe (0-14)
Indicator de stare (0/1) Nr. matricol Nume şi prenume Grupa
(1-5) 1 2 … 15
C S C S C S
char int char[25] int char
char char char char char char
Numărul de activități la fiecare disciplină este 14.

1
Scrieţi un program care înregistrează o nouă absență a unui student la o activitate. Studentul este identificat prin
numărul matricol, activitatea este identificată prin poziția în vector (1-15) și tip (Curs/Seminar).
Includeți în program un subprogram care generează, într-un fișier text, o listă cu toate datele din fișierul binar.
Lista trebuie să apară ca tabel, cu coloanele corect aliniate.

Exemple de rezolvare:
Observatii:
• Fisierul binar trebuie sa se regaseasca in directorul proiectului
• În Visual Studio versiuni mai noi extensia fișierului sursă trebuie să fie .c (nu .cpp) – (dacă aveți eroare
legată de funcția gets)
• #define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente legate de securitate

1. Problema 1
//Fisierul binar se numeste Puncte.dat
#include<stdio.h>

typedef struct{int nr;


char nume[30];
int grupa;
char pp;
char teme[10];
char examen;
}STUDENT;

void lista_studenti(FILE *f)


{
char nume[30];
STUDENT s;
FILE *g;
int n,i;
printf("\nFisier rezultat (text): ");gets(nume);
g=fopen(nume,"w");
fprintf(g,"\nNr. Nr. mat Nume %15s Grupa PP Punctaj teme Examen"," ");
fread(&s,sizeof(STUDENT),1,f);
n=0;
while(!feof(f))
{
fprintf(g,"\n%3d %8d %-30s %2d %2d ",++n,s.nr, s.nume,s.grupa, s.pp);
for(i=0;i<10;i++)
fprintf(g,"%2d ",s.teme[i]);
fprintf(g,"%6d ",s.examen);
fread(&s,sizeof(STUDENT),1,f);
}
fclose(g);
}

void main()
{FILE *f;
2
char nume[30];
STUDENT s;
int gasit,n,j;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
printf("\nNr. matricol: ");scanf("%d",&n);
while(!feof(stdin))
{rewind(f);
fread(&s,sizeof(STUDENT),1,f);
gasit=0;
while((!feof(f))&&(gasit==0))
{
if(n==s.nr)
{gasit=1;
printf("\nNr.mat:%3d Nume: %-30s Grupa: %4d Punctaj pp: %2d\n: ",s.nr,s.nume,s.grupa, s.pp);
for(j=0;j<10;j++)
printf("%2d ",s.teme[j]);
printf("Punctaj examen: %2d ",s.examen);
printf("Introduceti punctajul la examen:");
scanf ("%d", &s.examen);
fseek(f, ftell(f)-sizeof(STUDENT),0);
fwrite(&s, sizeof(STUDENT), 1, f);
}else
fread(&s,sizeof(STUDENT),1,f);
}
if(gasit==0)printf("\nNu a fost gasit.");
printf("\nNr. matricol: ");scanf("%d",&n);
}
fclose(f);}
}

3
Va fi creat fișierul text cu studenții din fișierul binar

2. Problema 2

//Fisierul binar se numeste Puncte.dat


#include<stdio.h>

typedef struct{int nr;


char nume[30];
int grupa;
char pp;
char teme[10];
char examen;
}STUDENT;

void lista_studenti(FILE *f)


{
char nume[30];
STUDENT s;
FILE *g;
int n,i;
printf("\nFisier rezultat (text): ");gets(nume);
g=fopen(nume,"w");
fprintf(g,"\nNr. Nr. mat Nume %15s Grupa PP Punctaj teme Examen"," ");
fread(&s,sizeof(STUDENT),1,f);
n=0;
while(!feof(f))
{
fprintf(g,"\n%3d %8d %-30s %2d %2d ",++n,s.nr, s.nume,s.grupa, s.pp);

4
for(i=0;i<10;i++)
fprintf(g,"%2d ",s.teme[i]);
fprintf(g,"%6d ",s.examen);
fread(&s,sizeof(STUDENT),1,f);
}
fclose(g);
}

void main()
{FILE *f;
char nume[30];
STUDENT s;
int i;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
fseek(f,0,2);//pozitionare la sfarsitul fisierului
printf("Nr.matricol: ");scanf("%d",&s.nr);
while(!feof(stdin))
{
printf("Nume: ");getchar(); gets(s.nume);
printf("Grupa: ");scanf("%d",&s.grupa);
s.pp=0;
for(i=0;i<10;i++)s.teme[i]=0;
s.examen=0;
fwrite(&s,sizeof(STUDENT),1,f);
printf("Nr.matricol: ");scanf("%d",&s.nr);
}
fclose(f);}
}

La urmatoarea listare in fișier text se poate observa că cei doi studenți au fost adaugați la sfârșitul fișierului

5
3. Problema 3

//Fisierul binar se numeste Absente.dat


#include<stdio.h>
typedef struct {char c,s;} DISCIPLINA;
typedef struct{
char is;
int nr;
char nume[25];
int grupa;
char an;
DISCIPLINA abs[15];
}STUDENT;

void lista_studenti(FILE *f)


{
char nume[30];
STUDENT s;
FILE *g;
int n,i;
printf("\nFisier rezultat (text): ");gets(nume);
g=fopen(nume,"w");
fprintf(g,"\nNr. Nr. mat Nume Grupa An Absente curs si seminar ");
fread(&s,sizeof(STUDENT),1,f);
n=0;
while(!feof(f))
{
if(s.is==1)
{fprintf(g,"\n%3d %8d %-30s %6d %4d ",++n,s.nr, s.nume,s.grupa, s.an);
for(i=0;i<15;i++)
fprintf(g,"%2d,%2d ",s.abs[i].c,s.abs[i].s);
}
fread(&s,sizeof(STUDENT),1,f);
}
fclose(g);
}

int nrart(FILE *f, int l)


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

void main()
{FILE *f;
char nume[30];
STUDENT s;
int n;
printf("\nFisier: ");gets(nume);
f=fopen(nume,"rb+");
if(!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
{
lista_studenti(f);
printf("\n Numarul matricol:"); scanf("%d",&n);
while(!feof(stdin))
{
if(n>=nrart(f,sizeof(STUDENT)))
printf("Studentul nu exista!");
else{
fseek(f,n*sizeof(STUDENT),0);
fread(&s,sizeof(STUDENT), 1, f);
if(s.is==0) printf("Studentul nu exista!");
else{
fseek(f,n*sizeof(STUDENT),0);
printf("Studentul %s va fi exmatriculat: ",s.nume);
s.is=0;
fwrite(&s,sizeof(STUDENT), 1, f);
}
}
printf("\nNumar matricol: "); scanf("%d",&n);
}
fclose(f);}
}

După încă o apelare se poate observa că în fișierul text rezultat nu mai apare studentul cu numarul matricol
respectiv
7
Important: se va avea în vedere lucrul cu fișiere binare organizate secvențial și relativ (a se vedea toate operațiile
discutate la curs), precum și rapoarte în fișiere text

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