Sunteți pe pagina 1din 10

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
cha cha cha cha
int char[30] int char char
r r r r
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
cha cha cha cha
int char[30] int char char
r r r r
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.
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).
1
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:
Observații:
 Fisierul binar trebuie să se regăsească în 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

#define _CRT_SECURE_NO_WARNINGS
#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;
char nume[30];
STUDENT s;
int gasit, n, j, examen;
printf("\nFisier: "); gets(nume);
f = fopen(nume, "rb+");
if (!f)printf("\nFisierul %s nu poate fi deschis", nume);
else
2
{
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 Punctaj teme:
", 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", &examen); s.examen = 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);
}
}

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

3
2. Problema 2

//Fisierul binar se numeste Puncte.dat

#define _CRT_SECURE_NO_WARNINGS
#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);
4
}

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

#define _CRT_SECURE_NO_WARNINGS
#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++)
6
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)


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

7
După încă o apelare se poate observa că în fișierul text rezultat nu mai apare studentul cu numarul matricol
respectiv

3. Problema 3

//Fisierul binar se numeste Absente.dat

#define _CRT_SECURE_NO_WARNINGS
#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);

8
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)


{
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;
int disciplina; char tip;
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 {
printf("Specificati activitatea/disciplina la care a fost absent (1-
15):");
scanf("%d", &disciplina); getchar();
printf("A fost absent la curs sau la seminar? (c/s):"); scanf("%c", &tip);
if (tip == 'c' || tip =='C')s.abs[disciplina - 1].c++;
else s.abs[disciplina - 1].s++;
fseek(f, n * sizeof(STUDENT), 0);
fwrite(&s, sizeof(STUDENT), 1, f);
}
}
printf("\nNumar matricol: "); scanf("%d", &n);
9
}
fclose(f);
}
}

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

10

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