Sunteți pe pagina 1din 13

MINISTERUL EDUCATIEI, CULTURII

ȘI CERCETĂRII AL REPUBLICII MOLDOVA


UNIVERSITATEA TEHNICA A MOLDOVEI
Facultatea Calculatoare, Informatică și Microelectronică

RAPORT
Structuri de date și algoritmi
Lucrare de laborator nr. 7

Tema: Implementarea tipului abstract de date


„Tablou de structuri” în limbajul C

Varianta: 5

Efectuat st. gr. CR-211 Cobzac D.


Verificat conf. univ., dr. Kulev M

Chișinău 2022
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 lucrării: 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. Interschimbarea 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 începutul tabloului.
10.Inserarea unui element nou după elementul indicat al tabloului.
11.Inserarea unui element nou înaintea 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: Structura Marfă cu câmpurile: denumirea, țara, producătorul,


articolul, prețul.

Programul elaborat:

Cod sursă marfah.h

typedef struct marfa {


char nume[20];
float pret;
float masa;
int cantitate;
}
marfa;
void introduce(marfa * A, int n);
void afisare(marfa * A, int n);
2
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
void sortare(marfa * A, int n);
int cautare(marfa * A, int n, char * nume);
marfa * realocarea(marfa * A, int * n, marfa a);
marfa * appenddata(marfa * A, int * n, marfa a);
marfa * deletedata(marfa * A, int * n, int k);
void savedata(marfa * A, int n, char * filename);
void readdata(char * filename);

Cod sursă marfac.c

#include "marfah.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

void introduce(marfa * A, int n) {


int i;
printf("Introduceti informatia pentru marfa :\n");
for (i = 0; i < n; i++) {
printf("Marfa numarul %d:\n", i + 1);
printf("Denumirea:");
fflush(stdin);
gets(A[i].nume);
printf("Pret(lei): ");
fflush(stdin);
scanf("%f", & A[i].pret);
printf("Masa(kg): ");
scanf("%f", & A[i].masa);
printf("Cantitate: ");
scanf("%i", & A[i].cantitate);
printf("\n");
}

}
void afisare(marfa * A, int n) {
int i;
printf("Lista de marfe este :\n");
for (i = 0; i < n; i++) {
printf(" Denumirea:%s \n Pretul(lei):%f \n Masa(kg):%f \n Cantitatea: %
d\ n\ n ",A[i].nume,A[i].pret,A[i].masa,A[i].cantitate);
}
}
void sortare(marfa * A, int n) {
int i, k;
marfa t;
for (i = 0; i < n; i++) {
for (k = 0; k < n - i - 1; k++) {
if (stricmp(A[k].nume, A[k + 1].nume) > 0) {

3
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
t = A[k];
A[k] = A[k + 1];
A[k + 1] = t;
}
}
}
}
int cautare(marfa * A, int n, char * nume) {
int i;
for (i = 0; i < n; i++) {
if (stricmp(A[i].nume, nume) == 0) {
return i;
return -1;
}
}
}

marfa * modificare(marfa * A, int n) {


int t;
int i;
marfa * B;
B = (marfa * ) realloc(A, n * sizeof(marfa));
printf("In total aveti %i marfuri:\n", n);
system("pause");
system("cls");
t = 0;
for (i = 0; i < n; i++) {
printf("Marfa cu numarul :%i\n", i + 1);
puts("Modificarea denumirii \t(1.Da/0.Nu)");
scanf("%d", & t);
if (t) {
puts("Da-ti denumirea noua a marfei:\n");
fflush(stdin);
gets(B[i].nume);
}
puts("Modificarea pretului \t(1.Da/0.Nu)");
scanf("%d", & t);
if (t) {
puts("Da-ti pretul nou a marfei:\n");
fflush(stdin);
scanf("%f", & B[i].pret);
}
puts("Modificarea masei \t(1.Da/0.Nu)");
scanf("%d", & t);
if (t) {
puts("Da-ti masa noua a marfei \t(1.Da/0.Nu)");
fflush(stdin);
scanf("%f", & B[i].masa);
}
puts("Modificarea cantitatii \t(1.Da/0.Nu)");
scanf("%d", & t);
4
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
if (t) {
puts("Da-ti numarul de cantitate pentru marfa data \t(1.Da/0.Nu)");
fflush(stdin);
scanf("%i", & B[i].cantitate);
}
}

A = (marfa * ) realloc(B, n * sizeof(marfa));


if (A == NULL) {
puts("Din pacate operatiunea a luat esec");
system("pause");
return A;
}
return A;
}
marfa * appenddata(marfa * A, int * n, marfa a) {
marfa * RN;
RN = (marfa * ) realloc(A, ( * n + 1) * sizeof( * A));
if (!RN)
return RN;
RN[ * n] = a;
* n = * n + 1;
return RN;
}
marfa * deletedata(marfa * A, int * n, int k) {
int i;
marfa * RN;
for (i = k; i < * n - 1; i++) {
A[i] = A[i + 1];
}
RN = (marfa * ) realloc(A, ( * n - 1) * sizeof( * RN));
if (RN == NULL) {
return RN;
}
* n = * n - 1;
return RN;
}
void savedata(marfa * A, int n, char * filename) {
FILE * fp;
int i;
fp = fopen(filename, "w");
for (i = 0; i < n; i++) {
fprintf(fp, "%s %f %f %i", A[i].nume, A[i].pret, A[i].masa, A[i].cantitate);
}
fclose(fp);
}
void readdata(char * filename)

{
FILE * fp;
marfa * A;
5
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
int n = 3, i = 0;
fp = fopen(filename, "r");
if (!fp) {
printf("Fisierul nu exista!\n");
system("pause");
exit(1);
}
fscanf(fp, "%s%f%f%i", & A[i].nume, & A[i].pret, & A[i].masa, & A[i].cantitate);
fclose(fp);
printf("Denumirea: %s\n Pretul: %f\n Masa: %f\n Cantitatea: %i\n",
A[i].nume, A[i].pret, A[i].masa, A[i].cantitate);
}
}

Cod sursă marfam.c

#include "marfac.c"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main() {
int n, c, k;
marfa * A, * RN;
char filename[20];
char nume[20];
marfa a;
while (1) {
puts("\t\tMeniu");
puts("1. Alocarea memoriei");
puts("2. Introducerea informatiei");
puts("3. Afisarea datelor pe ecran");
puts("4. Cautarea elementului conform denumirei");
puts("5. Sortarea disciplinilor dupa denumire");
puts("6. Modificarea elementului");
puts("7. Adaugarea unui element");
puts("8. Stergerea unui element");
puts("9. Salvarea bazei in fisier");
puts("10. Citirea din fisier");
puts("0. Iesire");
printf("\nComanda <<< ");
scanf("%d", & c);
switch (c) {
case 0:
if (A) {
free(A);
A = NULL;
}

6
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
exit(1);
break;
case 1:
printf("Introduceti numarul de marfe: ");
scanf("%d", & n);
A = (marfa * ) malloc(n * sizeof( * A));
if (A == NULL) {
printf("Memoria nu a fost alocata\n");
return -1;
}
puts("\nTastati o tasta pentru continuare");
getch();
break;
case 2:
introduce(A, n);
puts("\nTastati o tasta pentru continuare");
getch();
break;
case 3:
afisare(A, n);
puts("\nTastati o tasta pentru continuare");
getch();
break;
case 4:
printf("Dati denumirea marfei: ");
fflush(stdin);
gets(nume);
k = cautare(A, n, nume);
system("pause");
if (k == -1) {
puts("Denumirea nu a fost gasita");
} else {
printf("Marfa este :\n Marfa %i \n", k + 1);
printf(" Denumirea:%s \n Pretul(lei):%f \n Masa(kg):%f \n
Cantitatea: % d\ n\ n ",A[k].nume,A[k].pret,A[k].masa,A[k].cantitate);
}
puts("\nTastati o tasta pentru continuare");
getch();
break;
case 5:
sortare(A, n);
puts("Sortarea a fost efectuata cu succes , pentru a vedea lista de
marfuri sortate tasteaza in meniu << 3 >> ");
puts("\nTastati o tasta pentru continuare"); getch();
break;
case 6:
puts("\n/t/t Alegeti marfa care o doriti sa o modificati:"); scanf("%i", & k);
modificare(A, n); puts("Modificarea a fost realizata cu succes"); puts("\nTastati o tasta pentru
continuare"); getch();
break;
case 7:
7
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
puts("Dati informatie despre marfa noua:"); printf("Denumirea: "); fflush(stdin);
gets(a.nume); printf("Pret: "); scanf("%f", & a.pret); printf("Masa: "); scanf("%f", & a.masa);
printf("Cantitate: "); scanf("%i", & a.cantitate); RN = appenddata(A, & n, a);
if (!RN) {
puts("Adaugarea nu a avut loc!");
puts("\nTastati o tasta pentru continuare");
getch();
break;
}
puts("Operatiunea afost efectuata cu succes!"); A = RN;

puts("\nTastati o tasta pentru continuare"); getch();


break;
case 8:
puts("Dati pozitia necesara, pentru eliminare din baza"); scanf("%i", & k); RN =
deletedata(A, & n, k - 1);
if (!RN) {
(
"Eliminarea nu a avut loc!");
puts("\nTastati o tasta pentru a continua");
getch();
break;
}
puts("Operatiunea s-a efectuat cu succes"); A = RN; puts("\nTastati o tasta pentru a
continua"); getch();
break;
case 9:
puts("Dati numele fisierului: "); fflush(stdin); gets(filename); strcat(filename, ".txt");
savedata(A, n, filename); puts("Fisierul dumnevoastra a fost salvat!"); getch();
break;
case 10:
puts("Dati numele fisierului: "); fflush(stdin); gets(filename); strcat(filename, ".txt");
readdata(filename);
break;
default:
puts("\nOptiunea introdusa nu exista!"); puts("\nTastati o tasta pentru continuare");
getch();
}
}
getch();
return 0;
}

Rezultatele primite:

Meniul principal

8
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
Alocarea dinamică a memoriei

Introducere elemente

Căutarea elementului după nume

9
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
Sortarea mărfii după denumire

Editarea informațiilor despre marfă

10
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
Adăugarea unui element nou

Ștergerea unui element

11
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
Salvarea în fișier

Fișierul creat

Citirea informației din fișier

Concluzie: În urma efectuării acestei lucrări practice am căpătat deprinderi


în programarea și implementarea tipului abstract de date Tablou de structuri în
12
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C
limbajul de programare C. A fost elaborată o programă pentru realizarea și
utilizarea tabloului de structuri pentru stocarea și manipularea informațiilor despre
marfe.

13
Structuri de date și algoritmi. Lucrare de laborator Nr.7
Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C

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