Sunteți pe pagina 1din 3

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 Nr. Nume şi
Grupa (1-
(0/1) matricol prenume 1 2 … 15
5)

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.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef struct {
char curs;
char seminar;
}DISCIPLINA;

typedef struct {
char is;
int nrMatr;
char nume[25];
int grupa;
char an;
DISCIPLINA d[15];
}STUDENT;

//subprogramul raport
void raport(FILE* f) //paramentrul este fis binar
{
//declaram fis intern, numele fisierului de pe calculator si o variabila de tipul STUDENT
FILE* txt;
char numeRaport[20];
STUDENT s;
//orice raport are un nr crt
int nrcrt = 0;
int i;
printf("Numele raportului: ");
scanf("%s", numeRaport);
txt = fopen(numeRaport, "w");

if (!txt)
printf("Eroare!");
else
{
//trebuie sa ma asigur ca fis binar are toti studentii
//pozitionam pointerul la inceputul fisierului
fseek(f, 0, 0);
//pe prima linie imi apare capul de tabel
fprintf(txt, "Numar curent Numar Nume Grupa An Numar absente\n");
//parcurgem tot fisierul binar, citire, while, prelucrare, citire
fread(&s, sizeof(STUDENT), 1, f);
while (!feof(f))
{
//prelucrare
//in fis bin organizat relativ avem conditia is = 1
if (s.is == 1)
{
fprintf(txt, "%-12d %-5d %-25s %-5d %-2d ", ++nrcrt, s.nrMatr, s.nume,
s.grupa, s.an);
for (i = 0; i < 15; i++)
//2 descriptori de format pentru curs si seminar
fprintf(txt, "%-2d %-2d ", s.d[i].curs, s.d[i].seminar);
fprintf(txt,"\n");
}
fread(&s, sizeof(STUDENT), 1, f);
}
fclose(txt);
}
}

int nrarticole(FILE* f, int dim) //fisierul si dimensiunea articolului


{
//declaram nr de articole
int nr;
//salvam pozitia curenta a pointerului
long poz = ftell(f);
//ne deplasam la finalul fisierului si cu ftell vom returna intreaga dimensiune a fisierului
fseek(f, 0, 2);
nr = ftell(f) / dim;
//revenim cu pointerul unde eram initial
fseek(f, poz, 0);
//returnam numarul de articole
return nr;
}

void main()
{
FILE* f;
char numeFisier[20];
STUDENT s;
int nrMatricol;
printf("Introduceti numele fisierului binar: ");
scanf("%s", numeFisier);

f = fopen(numeFisier, "rb+");

if (!f)
printf("Eroare");
else
{
//exmatriculam studentul
//cautam studentul

printf("Introduceti nr matricol: ");


scanf("%d", &nrMatricol);

if(nrMatricol >= nrarticole(f,sizeof(STUDENT)))


printf("Nu exista studentul!");
else
{
//ne pozitionam la inceputul fisierului
fseek(f, nrMatricol * sizeof(STUDENT), 0);
//citim studentul
fread(&s, sizeof(STUDENT), 1, f);
if (s.is == 0)
printf("Nu exista studentul");
else
{
//afisam studentul si il stergem
printf("Studentul cu numele %s din grupa %d si anul %d va fi exmatriculat\n",
s.nume, s.grupa, s.an);
//studentul se sterge modificand indicatorul de stare
s.is = 0;
//pointerul s-a dus pe urmatorul articol
fseek(f, nrMatricol * sizeof(STUDENT), 0);
fwrite(&s, sizeof(STUDENT), 1, f);
}
}

raport(f);
fclose(f);
}
}

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