Sunteți pe pagina 1din 11

Ministerul Educaţiei

al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Calculatoare și rețele

RAPORT
despre lucrarea de laborator Nr. 8
la Programarea calculatoarelor

Tema: Implementarea tipului abstract de date


,,Tablou de structure”

Varianta 7

A efectuat:
st. gr. RM-201 Grosu Maxim

A verificat:
Lector univ. Stratulat Stefan
Chişinău – 2021
Lucrare de laborator nr.8
Tema: Prelucrarea caracterelor și a șirurilor de caractere

Теmа: Implementarea tipului abstract de date „Listă unidirecțională” („Listă simplu înlănțuită”)
în limbajul C. Partea I.

Scopul lucrării:
Obţinerea deprinderilor practice de implementare și de utilizare a tipului abstract de date (TAD)
“Listă simplu înlănţuită” în limbajul C cu asigurarea operațiilor de prelucrare de bază ale listei.

Sarcină: Să se scrie trei fişiere-text în limbajul C pentru implementarea și utilizarea TAD “Listă
simplu înlănţuită” cu asigurarea operațiilor de prelucrare de bază ale listei:

1.Fişier antet cu extensia .h, care conține specificarea structurii de date a elementului listei
simplu înlănțuite (conform variantelor) şi prototipurile funcţiilor de prelucrare de bază ale listei.

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 listei cu afişarea la ecran a următorului
meniu de opţiuni de bază:

1.Crearea listei în memoria dinamică.


2.Introducerea informației despre elementele listei de la tastatură.
3.Afişarea informației despre elementele listei la ecran.
4.Căutarea elementului în listă.
5.Modificarea câmpurilor unui element din listă.
6.Determinarea adresei ultimului element din listă.
7.Determinarea lungimii listei (numărul de elemente).
8.Înterschimbarea a două elemente indicate în listă.
9.Sortarea listei.
10.Eliberarea memoriei alocate pentru listă.
0. Ieşire din program.

Varianta 7 . Structura Disciplina cu cimpurile:denumirea,anul,Facultatea,departamentul,numarul


de ore.

Codul :
typedef struct Disciplina
{
char denumirea [20];
int anul;
char facultatea[20];
char departamentul[25];
int nr_ore;
} Disciplina;

Disciplina *head;

int createList(int n);


void readInfo(void);
void showInfo(void);
Disciplina* searchDisciplina(char *v);
void modifyInfo(Disciplina* c);
Disciplina* lastDisciplina(void);
int sizeList(void);
void swap(Disciplina *a, Disciplina *b);
void sortList(void);
void freeMemoryList(void);
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"Disciplinalab2.c"

int main()
{
Disciplina *S,*B;
char num[40] ;
int n,nm,f;
while(1) // for(;;)
{
system("cls");
puts("\t MENU:");
puts("1. Crearea listei in memoria dinamica. ");
puts("2. Introducerea informatiei despre elementele listei de la tastatura. ");
puts("3. Afisarea informatiei despre elementele listei la ecran.");
puts("4. Cautarea elementului in lista.");
puts("5. Modificarea campurilor unui element din lista.");
puts("6. Determinarea adresei ultimului element din lista.");
puts("7. Determinarea lungimii listei (numarul de elemente).");
puts("8. Interschimbarea a doua elemente indicate in lista. ");
puts("9. Sortarea listei.");
puts("10. Eliberarea memoriei alocate pentru lista. ");
puts("0. Iesire din program. ");

printf("\nAlegeti optiunea din menu: ");


scanf("%d", &nm);

switch(nm)
{
case 1:
printf("Dati numarul de Disciplini: ");
scanf("%d", &n);

f= createList(n);
if(f==0) {
puts("Memoria nu a fost alocata");
exit (1);
}
puts("Memoria a fost alocata cu succes");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 2:

readInfo();
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 3:
showInfo();
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 4:
puts("Dati numele Disciplinei de cautat:");
fflush(stdin);
gets(num);
S=searchDisciplina(num);
if(S==NULL)
{puts("Disciplina cautata nu a fost gasita in tablou ");
}
else
{ puts("Info despre Disciplina: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",S->denumirea,S-
>anul,S->facultatea,S->departamentul,S->nr_ore);

puts("Pentru a continua apasati tasta Enter");


getch();
break;

case 5:
puts("Dati numele Disciplinei de modificat:");
fflush(stdin);
gets(num);
S=searchDisciplina(num);;
if(S==NULL)
{puts("Disciplina cautat nu a fost gasit in tablou ");
}
else
{ puts("Info despre Disciplina: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",S->denumirea,S-
>anul,S->facultatea,S->departamentul,S->nr_ore);
modifyInfo(S);
puts("Info modificata despre student: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",S->denumirea,S-
>anul,S->facultatea,S->departamentul,S->nr_ore);
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;

case 7:
n=sizeList();
printf("Lungimea listei: %d", n);

puts("Pentru a continua apasati tasta Enter");


getch();
break;

case 8:
puts("Dati numele studentului 1 pentru intreschimbarea:");
fflush(stdin);
gets(num);
S=searchDisciplina(num);
if(S==NULL)
{puts("Disciplina cautata nu a fost gasita in tablou ");
}
else
{ puts("Info despre Disciplina 1: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",S->denumirea,S-
>anul,S->facultatea,S->departamentul,S->nr_ore);
}
puts("Dati numele Disciplina2 pentru intreschimbarea:");
fflush(stdin);
gets(num);
B=searchDisciplina(num);
if(B==NULL)
{puts("Disciplina cautata nu a fost gasita in tablou ");
}
else
{ puts("Info despre Disciplina 2: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",B->denumirea,B-
>anul,B->facultatea,B->departamentul,B->nr_ore);
}
if(S!=NULL && B!=NULL)
{
swap(S,B);
puts("Dupa interschimbarea.");
puts("Info despre Disciplina 1: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",S->denumirea,S-
>anul,S->facultatea,S->departamentul,S->nr_ore);
puts("Info despre Disciplina 2: ");
printf("Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d\n",B->denumirea,B-
>anul,B->facultatea,B->departamentul,B->nr_ore);
}
puts("Pentru a continua apasati tasta Enter");

getch();
break;
case 9:
sortList();
puts("Sortarea s-a efectuat cu succes.");
puts("Pentru a continua apasati tasta Enter");

getch();
break;

case 10:
freeMemory();
puts("Eliberarea memoriei s-a efectuat cu succes.");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 0:
printf("Doriti sa iesiti din program? (1/0): ");
scanf("%d", &f);
if(f==1) return 0;
puts("Pentru a continua apasati tasta Enter");
getch();
break;
default: puts("Alegeti optiunea corecta din menu! ");
puts("Pentru a continua apasati tasta Enter");
getch();
} // end switch

} // end while
}
}
#include"Disciplinalab2.h"
#include<stdlib.h>
#include<stdio.h>
int create(int n)
{
Disciplina* c, *p;
int i;
for(i=0;i<n;i++)
{
c=(Disciplina*)malloc(sizeof(*c));
if (c==NULL) { head=NULL; return 0;}
if(i==0) { head =c; }
else
{ p->next=c; }
p=c;
}
c->next=NULL; // c->next=head;
return 1;
}

void readInfo(void)
{
Disciplina *c;
int i;
puts("Dati info despre studenti: ");
c=head;
i=0;
while(c)
{
printf("Denumirea %d: ", i+1);
printf("anul: ");
scanf("%d", &c->anul);
printf("facultatea: ");
fflush(stdin);
gets(c->facultatea);
printf("departamentul: ");
fflush(stdin);
gets(c->departamentul);
printf("nr_ore: ");
scanf("%f", &c->nr_ore);
c=c->next;
if(c==head) break;
}
return;
}

void showInfo(void)
{
Disciplina*c;
int i;
c=head;
i=0;
puts("Info despre Disciplina: ");
while(c)
{
printf("%d. Denumirea: %s anul: %d facultatea: %s departamentul: %s nr_ore: %d c: %p next: %p\n",i+1,c-
>nume,c->an,c->facultatea,c->departamentul,c->nr_ore,c,c->next);
c=c->next;
if(c==head) break;
}
return;
}

Disciplina* searchDisciplina(char* v)
{
Disciplina*c;
c=head;
while(c)
{
if(stricmp(c->nume, v)==0) {return c;}
c=c->next;
if(c==head) break;
}
return NULL;
}

void modifyInfo(Disciplina* c)
{
int f;
printf("De modificat numele Disciplina? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati denumirea Disciplina:");
fflush(stdin);
gets(c->denumirea);
}
printf("De modificat anul de studiu? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati anul de studiu:");
scanf("%d", &c->anul);
}

printf("De modificat facultatea? (1/0): ");


scanf("%d", &f);
if(f!=0)
{
printf("Dati facultatea:");
fflush(stdin);
gets(c->facultatea);
}
printf("De modificat departamentul? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati departamentul:");
fflush(stdin);
gets(c->departamentul);
}
printf("De modificat nr_ore? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati nr_ore:");
scanf("%d", &c->nr_ore);
}
return;
}

Disciplina* lastDisciplina(void)
{
Disciplina*c;
c=head;

while(c->next!=NULL ||c->next!=head)
{
c=c->next;

}
return c;
}

int sizeList(void)
{
Disciplina*c;
int n;
c=head;
n=0;
while(c)
{
n++;
c=c->next;
if(c==head) break;
}
return n;
}

void swap(Disciplina *a, Disciplina *b)


{
Disciplina *na, *nb;
Disciplina t;
na= a->next;
nb=b->next;
t=*a;
*a=*b;
*b=t;
a->next=na;
b->next=nb;
return;
}

void sortList(void)
{
int i,k;
Disciplina *a,*b;
int n;
n=sizeList();

for(i=0; i<n;i++)
{a=head;
b=a->next;
for(k=0;k<n-1-i;k++)
{
if(stricmp(a->nume,b->nume)>0)
{
swap(a,b);
}
a=a->next;
b=b->next;
}
}
return;
}

void freeMemory(void)
{
Disciplina*c,*p;
c=head;
while(c)
{
p=c;
c=c->next;
free(p);
if(c==head) break;
}
return;
}

Concluzie: În urma acestei lucrări de laborator am învățat implemetarea si


utilizarea tipului abstract de date (TAD) „Tablou de structuri”in limbajul C.

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