Sunteți pe pagina 1din 16

Ministerul Educašiei

al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Calculatoare și Reȓele

XK\BXV
despre lucrarea de laborator Nr. 7
la Structuri de date şi algoritmi

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

A e i e c tu a t:
st. g r . C R - 191 Axenti Alina

A veriiicat:
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 iișiere-text în limbajul C pentru implementarea și utilizarea TAD ”Tablou de
structuri”:
1. Fişier antet cu extensia .h, care conȓine speciiicarea structurii de date a
elementului tabloului (coniorm variantelor) şi prototipurile iuncšiilor de prelucrare a
tabloului de structuri.
8. Fişier cu extensia .cpp sau .c, care conȓine implementările (codurile) iuncšiilor, declarate
în iişierul antet.
3. Fişier al utilizatorului, iuncšia mаin() pentru prelucrarea tabloului de structuri cu aiişarea la
ecran a următorului meniu de opšiuni:

1. Alocarea dinamică a memoriei pentru tablou.


2. Introducerea iniormaȓiei despre elementele tabloului de la tastatură.
3. Aiişarea iniormaȓiei despre elementele tabloului la ecran.
4. Căutarea elementului în tablou.
5. Modiiicarea 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 siâ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 iniormaȓiei despre elementele tabloului în iişier.
14. Citirea iniormaȓiei despre elementele tabloului din iişier.
15. Eliberarea memoriei alocate pentru tablou.
0. Ieşire din program.

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

Mersul lucrării:
Noţiuni teoretice:
• Biblioteca stdio.h conȓine iuncȓii speciale pentru citirea și aiișarea datelor – prin urmare
instrucȓiunea de includere a acesteia va ii 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 aiișarea datelor;
•Scanf-pentru citirea datelor;
•If,-instrucȓiune;
•Malloc-iuncȓie de alocare are ca rezultat adresa zonei de memorie alocate (de tip void*);
Codul programului în C
Mdig.C
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "iilm.h"

i{nt main (void)


int n, a = 1, asort = 1, is, dt = 0;

int a1, a2;


iilm * c;
char smodel[30];

while (a)
{
printi ("\tMENIU");
printi ("\n1.Alocarea dinamica a memoriei");
printi ("\n2.Introducerea elementelor de la tastatura ");

printi ("\
n34.CSoaruttaarreeaatealbelmoualnutiu"l)u; i
tabloului"); printi ("\n5.Redactarea elementului a
tabloului");
printi ("\n6.Adaugarea unui element nou la siarsit");
printi ("\n7.Eliminarea elementului indicat din tablou");
printi ("\n8.Inserarea unui element nou");
printi ("\n9.Salvarea elementelor tabloului in iisier");
printi ("\n10.Citirea elementelor tabloului din iisier");
printi ("\n11.Extragerea elementelor tabloului la ecran");
printi ("\n12.Eliberarea memoriei alocate pentru tablou ");
printi ("\n13.Interschimbarea a doua elemente indicate din tablou");
printi ("\n14.Adaugarea unui element nou la inceputul tabloului");
printi ("\n15.Inserarea unui element nou inainte elementului indicat al tabloului");
printi ("\n 0.Ierie din program\n");
printi ("\nAlegeti un punct din meniu\n\t");
iilush(stdin);
scani ("%d", &a);
ii (a == 0)
printi("\n\n\tAti esit din program!\n");

switch (a)
{
//alocarea
case 1:
printi ("Introduceti numarul de iilme:\n");
iilush(stdin);
scani ("%d", &n);
c = alocMemory(n);
printi ("\nMemoria a iost alocata\n");

break;

//introducerea
case 2:

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


readB(c, n);
printi ("\n\t\t***Introducerea elementelor este iinisata***\n");

break;

//cautarea
case 3:

printi ("\nIntroduceti denumirea iilmului pe care il cautati: ");


iilush(stdin);
scani("%s", &smodel);
is = 0;
is = searchB(c, n, smodel);
ii (is >= 0)
{
printi ("\n\tFilm nr.%d", is + 1);
printi ("\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
printi ("\nModelul introdus nu a iost gasit");

break;

//sortarea
case 4:

printi("\t\tMENIU de sortare"); printi("\n\


t1.Sortarea dupa anul crescator"); printi("\n\
t2.Sortarea dupa anul descrescator");

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

iilush(stdin);
scani("%d", &asort);
ii (!asort) printi("\nAti esit dim meniu de sortare\n");

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

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

deiault:
printi("\nAti esit dim meniu de sortare\n");
break;
}

break;

// redactarea a elementelor a tabloului

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

break;

//adaugarea unui element la siarsit


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

break;

//Eliminarea elementului indicat din tablou


case 7:
printi("\nIntroduceti nr.iilmului pe care doriti sa eliminati\n" );
iilush(stdin);
scani("%d", &is);
iilush(stdin);
c = elim(c,is,&n);
printi("\nFilmul a iost eliminata\n");

break;

//Inserarea unui element


case 8:
printi("\nIntroduceti nr.iilmului de inserare\n" );
iilush(stdin);
scani("%d", &is);
c = inser(c,is,&n);
printi("\nFilmul a iost inserata\n");

break;

//write struct in iile


case 9: ii (writeStructInFile (c, n) == 1)
printi("\nSalvarea a elemetelor a iost cu succes\n");

else printi("\nError\n");

break;

//read struct in iile


case 10:

ii (!readStructFromFile(&n))
{
printi("\n\n\t***Error***\n");
break;
}
else
{
c = readStructFromFile(&n);
printi("\nCitirea a elemetelor a iost cu succes\n");
}
break;

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

//eliberarea memoriei
case 12:
c = NULL;

ii (!c)
printi("\nMemoria a iost eliberata\n");
else
printi("\n\n\t***Error***\n");
break;
case 13:

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


iilush(stdin);
scani("%d", &a1);
printi("\nIntroduceti nr. elementului doi : ");
iilush(stdin);
scani("%d", &a2);
swap (c, a1, a2);
printi("\nInterschimbul a iost cu succes!");

break;

case 14:

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

break;

case 15:
printi("\nIntroduceti nr.iilmului inaintea carui va ii inserarea\n" );
iilush(stdin);
scani("%d", &is);
is--;
c = inser(c,is,&n); printi("\
nFilmul a iost inserat\n");

break;

deiault:printi("\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 "iilm.h"

iilm * alocMemory(int n)
{
iilm * A = NULL;
A = (iilm *) malloc (n *
sizeoi(iilm)); ii (A == NULL)
{
printi ("\n\tMEMORIA NU A FOST ALOCATA\n");
return NULL;
}
return A;
}

void readB(iilm * c, int n)


{
int i;
ior (i = 0; i < n; i++)
{
iilush(stdin);
printi ("\n\tFilm nr.%d", i+1);
printi ("\nDenumirea: ");
gets (c[i].name);
printi ("Tara: ");
gets (c[i].country);
printi ("Regizorul: ");
gets (c[i].regizor);
printi ("Genul: ");
gets (c[i].gen);
printi ("Anul : ");
scani ("%d", &c[i].year);
}
return;
}
void showB(iilm * c, int n)
{
int i;
ior (i = 0; i < n; i++)
{
printi ("\n\tFilm nr.%d", i + 1);
printi ("\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 (iilm * c, int n, char * smodel)


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

void sortByYearCresc(iilm *c, int n)


{
int i,
k; iilm
t;

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


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

void sortByYearDesc(iilm *c, int n)


{
iiniltmi, tk; ;

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


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

}
}
return;
}

void redact(iilm *c, int i)


{
int a =
1; i--;

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

while(a)
{
printi("\n\tAlegeti un punct din submeniu\n\t");
iilush(stdin);
scani("%d",&a);
switch(a)
{
case 1:
printi("\tIntroduceti denumirea:\t");
iilush(stdin);
gets (c[i].name);
printi("\tDenumirea a iost modiiicata\n");
break;

case 2:
printi("\tIntroduceti tara:\t");
iilush(stdin);
gets (c[i].country);
pbr ienatki;("\tTara a iost modiiicata\n");

case 3:
printi("\tIntroduceti regizorul:\t");
iilush(stdin);
gets (c[i].regizor);
printi("\tRegizorul a iost modiiicat\n");
break;

case 4:
printi("\tIntroduceti genul:\t");
iilush(stdin);
g e t s ( c [i ] .g );
p ri n t i (" \ tG enu l a iost
modiiicat\n"); break;
case 5:
printi("\tIntroduceti anul:\t");
iilush(stdin);
scani ("%d", &c[i].year); printi("\
tAnul a iost modiiicat\n"); break;

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

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


{
iilm temp;
iilm *b;

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


iilush(stdin);
printi ("\n\tFilm nr.%d", *pn+1);
printi ("\nDenumirea: ");
gets (temp.name);
printi ("Tara: ");
gets (temp.country);
printi ("Regizorul: ");
gets (temp.regizor);

pgreitnst(ite("mGpe.
nguenl:);"); printi
("Anul : ");
scani ("%d", &temp.year);

b = (iilm*) realloc (c,(*pn+1)*sizeoi(*b));


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

return b;
}

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


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

b = (iilm*) realloc (c,(*n-1)*sizeoi(*b));


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

return b;
}

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


{
int i;
iilm *b;
iilm temp;

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


iilush(stdin);
printi ("\n\tFilm nr.%d", el);
printi ("\nDenumirea: ");
gets (temp.name);
printi ("Tara: ");
gets (temp.country);
printi ("Regizorul: ");
gets (temp.regizor);
printi ("Genul: ");
gets (temp.gen);
pscrianti ("%Adn"u,l &: "te);mp.year);

b = (iilm*) realloc (c,(*n+1)*sizeoi(*b));


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

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


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

b[el-1] = temp;

*n = *n + 1;

return b;
}
int writeStructInFile (iilm *c, int n)
{
FILE * i;
int i;
i = iopen ("iilm.txt", "w");
ii (!i)
return 0;

iwrite (&n, sizeoi(int), 1, i);


ior (i = 0; i < n; i++)
iwrite (&c[i], sizeoi(iilm), 1, i);

iclose (i);

return 1;
}

iilm * readStructFromFile(int *n)


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

i = iopen ("iilm.txt",
"r"); ii (!i){return
NULL;}

iread(&pn, sizeoi(int), 1, i);

b = (iilm *) malloc ((pn)* sizeoi(iilm));


ii (b == NULL)
return NULL;

i = 0;
while (iread(&temp, sizeoi(iilm), 1, i))
{
b[i] = temp;
i++;
}

iclose (i);
*n =
pn;
} return b;

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

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

return;
}

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


{
int i;
iilm *b;
iilm temp;

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


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

b = (iilm*) realloc (c,(*n+1)*sizeoi(*b));


ii (b == NULL) {return b;}
ior (i = *n; i > 0; --i)
b[i] = b[i - 1];

b[0] = temp;

*n = *n + 1;

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

iilm * alocMemory(int n);


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

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

Xezultate :
Concluzie:
În lucrarea de laborator nr.7 am alcatuit un iişier antet cu extensia .c, care conȓine speciiicarea structurii
de date a elementului tabloului(casa)şi prototipurile iuncšiilor de prelucrare a tabloului de structure,alt
iişier cu extensia .c, care conȓine implementările (codurile) iuncšiilor, declarate în iişierul antet și iişier
al utilizatorului, iuncšia mаin() pentru prelucrarea tabloului de structuri cu aiişarea la ecran a
următorului meniu de opšiuni: alocarea dinamica a iniormaȓiei,implementarea
in i o r m ati e i, s or a r e a, d a u ga r e a lt i e le m e n t ,inserarea unui element
p r o g r am p e r m it e d e a a i la d e tal ii un u i l uc r u .
nou,salvarea,citirea si ieșire.Acest

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