Sunteți pe pagina 1din 16

Ministerul Educaţiei

al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Calculatoare și Rețele

RAPORT
despre lucrarea de laborator Nr. 7
la Structuri de date şi algoritmi 

Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C

A efectuat:
st. gr. CR-191 Axenti Alina

A verificat:
Lector univ. Munteanu Silvia

Chişinău – 2021
Scopul lucrării:
Obținerea deprinderilor practice de implementare și de utilizare a tipului abstract de date (TAD)
“Tablou de structuri” în limbajul C

Sarcina (conform variantelor) :


Să se scrie trei fișiere-text în limbajul C pentru implementarea și utilizarea TAD “Tablou de
structuri”:

1. Fişier antet cu extensia .h, care conține specificarea structurii de date a elementului
tabloului (conform variantelor) şi prototipurile funcţiilor de prelucrare a tabloului de
structuri.
2. Fişier cu extensia .cpp sau .c, care conține implementările (codurile) funcţiilor, declarate
în fişierul antet.
3. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea tabloului de structuri cu afişarea la
ecran a următorului meniu de opţiuni:

1. Alocarea dinamică a memoriei pentru tablou.


2. Introducerea informației despre elementele tabloului de la tastatură.
3. Afişarea informației despre elementele tabloului la ecran.
4. Căutarea elementului în tablou.
5. Modificarea câmpurilor a unui element din tablou.
6. Înterschimbarea a două elemente indicate din tablou.
7. Sortarea tabloului.
8. Adăugarea unui element nou la sfârșitul tabloului.
9. Adăugarea unui element nou la înciputul tabloului.
10. Inserarea unui element nou după elementul indicat al tabloului.
11. Inserarea unui element nou înainte elementul indicat al tabloului.
12. Ştergerea elementului indicat al tabloului.
13. Salvarea informației despre elementele tabloului în fişier.
14. Citirea informației despre elementele tabloului din fişier.
15. Eliberarea memoriei alocate pentru tablou.
0. Ieşire din program.

Varianta 2. Structura Film cu câmpurile: denumirea, ţara, regizorul, genul filmului, anul.

Mersul lucrării:
Noțiuni teoretice:
•Biblioteca stdio.h conține funcții speciale pentru citirea și afișarea datelor – prin urmare instrucțiunea
de includere a acesteia va fi practic prezentă în orice program. #include <stdio.h>;
•Int-variabila simpla de tip integer(intreg);
•While-execută un bloc de instrucţiuni atâta timp cât o anumită condiţie este adevărată;
•Printf-pentru afișarea datelor;
•Scanf-pentru citirea datelor;
•If,-instrucțiune;
•Malloc-funcție de alocare are ca rezultat adresa zonei de memorie alocate (de tip void*);
Codul programului în C
Main.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "film.h"
int main (void)
{
int n, a = 1, asort = 1, is, dt = 0;

int a1, a2;


film * c;
char smodel[30];

while (a)
{
printf ("\tMENIU");
printf ("\n1.Alocarea dinamica a memoriei");
printf ("\n2.Introducerea elementelor de la tastatura ");
printf ("\n3.Cautarea elemantului tabloului");
printf ("\n4.Sortarea tabloului");
printf ("\n5.Redactarea elementului a tabloului");
printf ("\n6.Adaugarea unui element nou la sfarsit");
printf ("\n7.Eliminarea elementului indicat din tablou");
printf ("\n8.Inserarea unui element nou");
printf ("\n9.Salvarea elementelor tabloului in fisier");
printf ("\n10.Citirea elementelor tabloului din fisier");
printf ("\n11.Extragerea elementelor tabloului la ecran");
printf ("\n12.Eliberarea memoriei alocate pentru tablou ");
printf ("\n13.Interschimbarea a doua elemente indicate din tablou");
printf ("\n14.Adaugarea unui element nou la inceputul tabloului");
printf ("\n15.Inserarea unui element nou inainte elementului indicat al tabloului");
printf ("\n 0.Ierie din program\n");

printf ("\nAlegeti un punct din meniu\n\t");


fflush(stdin);
scanf ("%d", &a);
if (a == 0)
printf("\n\n\tAti esit din program!\n");

switch (a)
{
//alocarea
case 1:
printf ("Introduceti numarul de filme:\n");
fflush(stdin);
scanf ("%d", &n);
c = alocMemory(n);
printf ("\nMemoria a fost alocata\n");

break;

//introducerea
case 2:

printf ("\nIntroduceti elementele de la tastatura ");


readB(c, n);
printf ("\n\t\t***Introducerea elementelor este finisata***\n");

break;

//cautarea
case 3:

printf ("\nIntroduceti denumirea filmului pe care il cautati: ");


fflush(stdin);
scanf("%s", &smodel);
is = 0;
is = searchB(c, n, smodel);
if (is >= 0)
{
printf ("\n\tFilm nr.%d", is + 1);
printf ("\nDenumirea: %s\tTara: %s\tRegizorul: %s\tGenul: %s\tAnul:
%d\n", c[is].name, c[is].country, c[is].regizor, c[is].gen, c[is].year);
}
else
printf ("\nModelul introdus nu a fost gasit");

break;

//sortarea
case 4:

printf("\t\tMENIU de sortare");
printf("\n\t1.Sortarea dupa anul crescator");
printf("\n\t2.Sortarea dupa anul descrescator");

printf("\n\t0.Iesirea din MENIU de sortare\n\n\t");

fflush(stdin);
scanf("%d", &asort);
if (!asort) printf("\nAti esit dim meniu de sortare\n");

switch(asort)
{
//sortarea crescator
case 1:
sortByYearCresc(c, n);
printf("\nSortarea a fost cu succes\n");
break;

//sortarea descrescator
case 2:
sortByYearDesc(c, n);
printf("\nSortarea a fost cu succes\n");
break;

default:
printf("\nAti esit dim meniu de sortare\n");
break;
}

break;

// redactarea a elementelor a tabloului

case 5:
printf("\nIntroduceti nr-l a elementului pe care doriti sa redactati\n");
fflush(stdin);
scanf("%d", &is);
fflush(stdin);
redact(c, is);

break;

//adaugarea unui element la sfarsit


case 6:
c = appElement(c,&n);

break;

//Eliminarea elementului indicat din tablou


case 7:
printf("\nIntroduceti nr.filmului pe care doriti sa eliminati\n" );
fflush(stdin);
scanf("%d", &is);
fflush(stdin);
c = elim(c,is,&n);
printf("\nFilmul a fost eliminata\n");

break;

//Inserarea unui element


case 8:
printf("\nIntroduceti nr.filmului de inserare\n" );
fflush(stdin);
scanf("%d", &is);
c = inser(c,is,&n);
printf("\nFilmul a fost inserata\n");

break;

//write struct in file


case 9:
if (writeStructInFile (c, n) == 1)
printf("\nSalvarea a elemetelor a fost cu succes\n");

else printf("\nError\n");

break;

//read struct in file


case 10:

if (!readStructFromFile(&n))
{
printf("\n\n\t***Error***\n");
break;
}
else
{
c = readStructFromFile(&n);
printf("\nCitirea a elemetelor a fost cu succes\n");
}
break;

//afisarea
case 11:
printf ("\n\n\nElementele structurei :\n");
showB(c, n);
printf ("\n\n");
break;

//eliberarea memoriei
case 12:
c = NULL;

if (!c)
printf("\nMemoria a fost eliberata\n");
else
printf("\n\n\t***Error***\n");

break;
case 13:

printf("\nIntroduceti nr. elementului unu : ");


fflush(stdin);
scanf("%d", &a1);
printf("\nIntroduceti nr. elementului doi : ");
fflush(stdin);
scanf("%d", &a2);

swap (c, a1, a2);


printf("\nInterschimbul a fost cu succes!");

break;

case 14:

c = addFirstElement(c, &n);
printf("\nElementul a fost adaugat la inceput\n");

break;

case 15:
printf("\nIntroduceti nr.filmului inaintea carui va fi inserarea\n" );
fflush(stdin);
scanf("%d", &is);
is--;
c = inser(c,is,&n);
printf("\nFilmul a fost inserat\n");

break;

default:
printf("\n\n\t***Ati esit din program***\n");
a = 0;
break;
}

}
getch();
return 0;
}

Film.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "film.h"

film * alocMemory(int n)
{
film * A = NULL;
A = (film *) malloc (n * sizeof(film));
if (A == NULL)
{
printf ("\n\tMEMORIA NU A FOST ALOCATA\n");
return NULL;
}
return A;
}

void readB(film * c, int n)


{
int i;
for (i = 0; i < n; i++)
{
fflush(stdin);
printf ("\n\tFilm nr.%d", i+1);
printf ("\nDenumirea: ");
gets (c[i].name);
printf ("Tara: ");
gets (c[i].country);
printf ("Regizorul: ");
gets (c[i].regizor);
printf ("Genul: ");
gets (c[i].gen);
printf ("Anul : ");
scanf ("%d", &c[i].year);
}
return;
}

void showB(film * c, int n)


{
int i;
for (i = 0; i < n; i++)
{
printf ("\n\tFilm nr.%d", i + 1);
printf ("\nDenumirea: %s\tTara: %s\tRegizorul: %s\tGenul: %s\tAnul: %d\n", c[i].name,
c[i].country, c[i].regizor, c[i].gen, c[i].year);
}
return;
}

int searchB (film * c, int n, char * smodel)


{
int i;
for (i = 0; i < n; i++)
{
if (stricmp(c[i].name, smodel) == 0)
return i;
}
return -1;
}

void sortByYearCresc(film *c, int n)


{
int i, k;
film t;

for (i = 0; i < n-1; i++)


{
for (k = 0; k < n-1-i; k++ )
{
if (c[k].year > c[k+1].year)
{
t = c[k+1];
c[k+1] = c[k];
c[k] = t;
}
}
}
return;
}

void sortByYearDesc(film *c, int n)


{
int i, k;
film t;

for (i = 0; i < n-1; i++)


{
for (k = 0; k < n-1-i; k++ )
{
if (c[k].year < c[k+1].year)
{
t = c[k+1];
c[k+1] = c[k];
c[k] = t;
}
}
}
return;
}

void redact(film *c, int i)


{
int a = 1;
i--;

printf("\t\tMENIU de redactare");
printf("\n\t1.Redactarea denumirei");
printf("\n\t2.Redactarea tarii");
printf("\n\t3.Redactarea regizorului");
printf("\n\t4.Redactarea genului");
printf("\n\t5.Redactarea anului");
printf("\n\t0.Iesirea din MENIU de redactare\n\n\t");

while(a)
{
printf("\n\tAlegeti un punct din submeniu\n\t");
fflush(stdin);
scanf("%d",&a);
switch(a)
{
case 1:
printf("\tIntroduceti denumirea:\t");
fflush(stdin);
gets (c[i].name);
printf("\tDenumirea a fost modificata\n");
break;

case 2:
printf("\tIntroduceti tara:\t");
fflush(stdin);
gets (c[i].country);
printf("\tTara a fost modificata\n");
break;

case 3:
printf("\tIntroduceti regizorul:\t");
fflush(stdin);
gets (c[i].regizor);
printf("\tRegizorul a fost modificat\n");
break;

case 4:
printf("\tIntroduceti genul:\t");
fflush(stdin);
gets (c[i].gen);
printf("\tGenul a fost modificat\n");
break;
case 5:
printf("\tIntroduceti anul:\t");
fflush(stdin);
scanf ("%d", &c[i].year);
printf("\tAnul a fost modificat\n");
break;

default:
printf("\n\t\tAti iesit din submeniul de redactre\n");
a = 0;
return;
break;
}
}
return;
}

film * appElement(film *c, int *pn)


{
film temp;
film *b;

printf("\nIntroduceti un element nou:\n");


fflush(stdin);
printf ("\n\tFilm nr.%d", *pn+1);
printf ("\nDenumirea: ");
gets (temp.name);
printf ("Tara: ");
gets (temp.country);
printf ("Regizorul: ");
gets (temp.regizor);
printf ("Genul: ");
gets (temp.gen);
printf ("Anul : ");
scanf ("%d", &temp.year);

b = (film*) realloc (c,(*pn+1)*sizeof(*b));


if (b == NULL) {return b;}
b[*pn] = temp;
*pn = *pn +1;

return b;
}

film * elim(film *c, int el, int *n)


{
int i;
film *b;
film t;
for (i = el - 1; i < *n -1; i++)
{
t = c[i];
c[i] = c[i+1];
c[i+1] = t;
}

b = (film*) realloc (c,(*n-1)*sizeof(*b));


if (b == NULL) {return b;}
*n = *n - 1;

return b;
}

film * inser(film *c, int el, int * n)


{
int i;
film *b;
film temp;

printf("\nIntroduceti un element nou:\n");


fflush(stdin);
printf ("\n\tFilm nr.%d", el);
printf ("\nDenumirea: ");
gets (temp.name);
printf ("Tara: ");
gets (temp.country);
printf ("Regizorul: ");
gets (temp.regizor);
printf ("Genul: ");
gets (temp.gen);
printf ("Anul : ");
scanf ("%d", &temp.year);

b = (film*) realloc (c,(*n+1)*sizeof(*b));


if (b == NULL) {return b;}

for (i = *n; i > el - 1; --i)


b[i] = b[i - 1];

b[el-1] = temp;

*n = *n + 1;

return b;
}
int writeStructInFile (film *c, int n)
{
FILE * f;
int i;
f = fopen ("film.txt", "w");
if (!f)
return 0;

fwrite (&n, sizeof(int), 1, f);

for (i = 0; i < n; i++)


fwrite (&c[i], sizeof(film), 1, f);

fclose (f);

return 1;
}

film * readStructFromFile(int *n)


{
FILE * f;
int i = 0, pn;
film temp;
film * b = NULL;

f = fopen ("film.txt", "r");


if (!f){return NULL;}

fread(&pn, sizeof(int), 1, f);

b = (film *) malloc ((pn)* sizeof(film));


if (b == NULL)
return NULL;

i = 0;
while (fread(&temp, sizeof(film), 1, f))
{
b[i] = temp;
i++;
}

fclose (f);
*n = pn;
return b;
}

//lucr 7
void swap(film * c, int a, int b)
{
film t;

t = c [a-1];
c[a-1] = c [b-1];
c [b-1] = t;

return;
}

film * addFirstElement(film *c, int *n)


{
int i;
film *b;
film temp;

printf("\nIntroduceti un element nou:\n");


fflush(stdin);
printf ("\n\tFilm nr.%d", 1);
printf ("\nDenumirea: ");
gets (temp.name);
printf ("Tara: ");
gets (temp.country);
printf ("Regizorul: ");
gets (temp.regizor);
printf ("Genul: ");
gets (temp.gen);
printf ("Anul : ");
scanf ("%d", &temp.year);

b = (film*) realloc (c,(*n+1)*sizeof(*b));


if (b == NULL) {return b;}

for (i = *n; i > 0; --i)


b[i] = b[i - 1];

b[0] = temp;

*n = *n + 1;

return b;
}
Film.h
typedef struct Film
{
char name[30];
char country[30];
char regizor[30];
char gen[30];
int year;
}film;

film * alocMemory(int n);


void readF(film * c, int n);
void showF(film * c, int n);
int searchF (film * c, int n, char * smodel);
void sortByYearCresc(film *c, int n);
void sortByYaerDesc(film *c, int n);
void redact(film *c, int i);
film * appElement(film *c, int *pn);
film * elim(film *c, int el, int *n);
film * inser(film *c, int el, int * n);
int writeStructInFile (film *c, int n);
film * readStructFromFile(int *n);

//lucr 7
void swap(film *c, int a1, int a2);
film * addFirstElement(film *c, int *pn);

Rezultate :
Concluzie:
În lucrarea de laborator nr.7 am alcatuit un fişier antet cu extensia .c, care conține specificarea structurii
de date a elementului tabloului(casa)şi prototipurile funcţiilor de prelucrare a tabloului de structure,alt
fişier cu extensia .c, care conține implementările (codurile) funcţiilor, declarate în fişierul antet și fişier
al utilizatorului, funcţia mаin() pentru prelucrarea tabloului de structuri cu afişarea la ecran a
următorului meniu de opţiuni: alocarea dinamica a informației,implementarea
informatiei,sortarea,adaugarea altui element,inserarea unui element nou,salvarea,citirea si ieșire.Acest
program permite de a afla detalii unui lucru.