Sunteți pe pagina 1din 11

Ministerul Educației și Cercetării a Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea de Calculatoare, Informatică și Microelectronică

RAPORT
Lucrare de laborator Nr. 7
la Structuri de Date și Algoritmi

A efectuat: St. gr. CR-222


Ciovaga Madalina
A verificat: lect. univ.
Mititelu Vitalie

Chișinău 2022
Lucrare de laborator Nr. 7
Теmа: Structuri și tablouri de la structuri
Scopul lucrării: Programarea algoritmilor de prelucrare a structurilor și a tablourilor
de la structuri prin utilizarea funcțiilor, pointerilor, alocării dinamice a memoriei în
limbajul C.
Sarcina: Pentru tabloul unidimensional dat cu elemente de tip structură (conform
variantelor) să se afișeze la ecran următorul meniu de opțiuni:
1. Alocarea dinamică a memoriei pentru tabloul de structuri.
2. Introducerea elementelor tabloului de la tastatură.
3. Afișarea elementelor tabloului la ecran.
4. Adăugarea unui element nou la sfârșit.
5. Modificarea elementului tabloului.
6. Căutarea elementului tabloului.
7. Sortarea tabloului.
8. Eliminarea elementului indicat din tablou.
9. Eliberarea memoriei alocate pentru tablou.
0. Ieșire din program. Să se elaboreze funcțiile pentru implementarea opțiunilor
meniului.

Rezumat:
O structură este o colecţie de valori eterogene ca tip, stocate într-o zonă compactă
de memorie. Cu alte cuvinte, o structură este un tip de date care permite gruparea
unor date de tipuri diferite sub un singur nume. Componentele unei structuri, denumite
câmpuri, sunt identificate prin nume simbolice, denumite selectori. Câmpurile unei
structuri pot fi de orice tip, simplu sau derivat, dar nu void sau funcţie. Printr-o
declaraţie struct se defineşte un nou tip de date de tip structură, de către programator.
Structurile sunt o facilitate oferită de limbajul C pentru a organiza mai bine datele
cu care lucrează programele. Dacă funcțiile ne permit să organizăm mai bine codul,
structurile ne permit să organizăm mai bine datele.
Practic o structură este o grupare sub un singur nume a mai multor variabile.
Variabilele care sunt grupate într-o structură se numesc câmpuri. Pentru a folosi
structura, declarăm variabile de tipul structurii. O structură pe care o definim este de
fapt un nou tip de date. Putem declara oricâte variabile de tipul structurilor pe care le-
am definit. Câmpurile se accesează specificând numele variabilei, urmat de caracterul
'.', urmat de numele câmpului.
Este posibil să structurăm datele și invers, astfel încât să avem structuri în interiorul
tablourilor (tablouri de structuri). În general se recomandă utilizarea tablourilor de
structuri atunci când sunt folosite mai multe tablouri în paralel pentru a gestiona
informații.
Este posibil să folosim și pointeri către structuri, în special atunci când este utilă
alocarea dinamică a memoriei. Se declară un pointer către structura definită, se alocă
memorie pentru pointer, se inițializează structura alocată, se face o afișare, după care
se eliberează memoria.

Codul sursă:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int firstrun=1;

typedef struct Universitate{


char den[50];
char adresa[40];
int telefon;
int facultati;
int numSt;
}Univer;
Univer* u=NULL;

int aloc(int n)
{
printf("Introduceti numarul de elemente: ");
scanf("%d",&n);
u=(Univer*)malloc(sizeof(Univer)*n);
if(u==NULL)
{
printf("Alocare memoriei eronata!!!\n");
}
else
printf("Ati alocat spatiu pentru %d Universitati\n",n);
return n;
}

void scan(int i)
{
printf("Introduceti numele universitatii [%d] \n", i+1);
fflush(stdin);
gets(u[i].den);
printf("Adresa: [%s] \n", u[i].den);
gets(u[i].adresa);
printf("Nr. de contact a [%s] \n", u[i].den);
scanf("%d", &u[i].telefon);
printf("Nr. de facultati [%s] \n", u[i].den);
scanf("%d", &u[i].facultati);
printf("Nr. studenti in [%s] \n", u[i].den);
scanf("%d", &u[i].numSt);
}

void print(int i)
{
printf("Universitatea: %s\n",u[i].den);
printf("Adresa: %s\n",u[i].adresa);
printf("Nr. de contact: %d\n",u[i].telefon);
printf("Nr. facultati: %d\n",u[i].facultati);
printf("Nr. studenti: %d\n",u[i].numSt);
printf("\n");
}

int add(int n)
{
u=(Univer*)realloc(u,sizeof(Univer)*(n+1));
scan(n);
n++;
return n;
}

void change(int n)
{
char str[40];
printf("Care element doriti sa-l modificati?\n");
for(int i=0; i<n; i++)
printf(" %s |",u[i].den);
printf("\n");
fflush(stdin);
gets(str);
for(int i=0; i<n; i++)
if(strcmp(u[i].den,str)==0)
scan(i);
}

void search(int n)
{
int k=0;
char str[40];
printf("Introduceti Universitatea ce va intereseaza: ");
fflush(stdin);
gets(str);
for(int i=0; i<n; i++)
if(strstr(u[i].denum, str)!=0)
{
print(i);
k=1;
}
if(!k)
printf("Nu avem asa date");
}
void sort(int n)
{
Univer aux;
int sortat;
do
{
sortat=1;
for(int i=0; i<n-1; i++)
if(strcmp(u[i].denum,u[i+1].denum)>0)
{
aux=u[i];
u[i]=u[i+1];
u[i+1]=aux;
sortat=0;
}
}while(!sortat);
printf("Efectuat cu succes\n");
}

int meniu(int m)
{
if(firstrun)
firstrun=0;
else
{
system("pause");
system("cls");
}
do
{
printf (" Alocarea dinamica a memoriei pentru tabloul de structuri...1\n");
printf ("Introducerea elementelor tabloului..........................2\n");
printf ("Afisarea elementelor tabloului la ecran....................3\n");
printf ("Adaugarea unui element nou la sfarsit......................4\n");
printf ("Modificarea elementului tabloului..........................5\n");
printf ("Cautarea elementului tabloului.............................6\n");
printf ("Sortarea tabloului.........................................7\n");
printf ("Eliminarea elementului indicat din tablou..................8\n");
printf ("Eliberarea memoriei alocate pentru tablou..................9\n");
printf ("Iesire din program.........................................0\n");
scanf("%d", &m);
}while(m<0 || m>9);
return m;
}

int Remove(int n)
{
if(!n)
printf("Momentan nu sunt elemente\n");
else
{
char str[40];
for( int i=0; i<n ; i++)
printf(" %s |",u[i].den);
printf("\n");
printf("Introduceti elementul ce doriti sa-l eliminati: ");
fflush(stdin);
gets(str);
for( int i=0; i<n ; i++)
if(strcmp(u[i].den,str)==0)
u[i]=u[n-1];
u=(Univer*)realloc(u,sizeof(Univer)*(n-1));
n--;
return n;
}
}

int Free(int n)
{
if(!n)
printf("NU avem ce sterge\n");
else
{
free(u);
n=0;
printf("Stergere efectuata\n");
}

int main()
{
int m,n=0;
do
{
m=meniu(m);
switch(m)
{
case 1:n=aloc(n);break;
case 2: if(!n)
printf("NU ati alocat memorie\n");
else
{
for (int i=0; i<n; i++)
scan(i);
}
break;
case 3: if(!n)
printf("-----------------\n");
else
{
for(int i=0; i<n; i++)
print(i);
}
break;
case 4:n=add(n);break;
case 5:change(n);break;
case 6:search(n);break;
case 7:sort(n);break;
case 8:n=Remove(n);break;
case 9:n=Free(n);break;
}
}while(m!=0);
free(u);
return 0;
}
Aloc Change

Sort Free
Concluzie :
Pe parcursul efectuării laboratorului si studierii temei,
Structuri și tablouri de la structuri am reusit sa realizez
subiectul dat mie comform conditiiei variantei mele . De
asemenea am realizat implimentarea practica a acestor
cunostinte si am reusit sa implimentez algoritmul de
sortare quicksort pentru sortarea Universitatilor dupa toate
caracteristicile.

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