Sunteți pe pagina 1din 24

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

RAPORT
Lucrarea de laborator nr.1
La Structuri de date si algoritmi

A efectuat:
st. gr. AI-182 Croitoru Tudor

A verificat:
dr., conf.univ. M. Kulev

Chişinău -2019
Lucrarea de laborator nr.1

Tema: Implementarea tipului de date abstract “Tablou de structuri” in C.

Scopul lucrării: obtinerea deprinderilor practice de implementare a unui tip de


date abstract (TDA) in limbajul C si anume a TDA “Tablou de structuri”.

Sarcina de lucru: De scris trei fisiere in limbajul C pentru implementarea (2


fisiere) si utilizarea (1 fisier – program cu functia main ) a TDA “Tablou de
structuri”
1. Fişierul antet cu extensia .h care descrie structura elementului tabloului (după varianta) şi
prototipurile funcţiilor care asigură operaţiunile de prelucrare a tabloului de structuri.
2. Fişier cu extensia .cpp (sau .c) care conţine codurile (implementările) tuturor funcţiilor
declarate în fişierul antet.
3. Fişierul utilizatorului - programul cu funcţia main () pentru prelucrarea tabloului de structuri
cu afişarea meniului de opţiuni pe ecran, si anume:
1.alocarea memoriei dinamice pentru tablou,
2.introducerea informaţiei despre elementele tabloului de la tastatura,
3.afişarea informaţiei despre elementele tabloului pe ecran,
4.căutarea elementului tabloului dupa unui cimp al structurei,
5.modificarea câmpurilor elementului tabloului,
6.interschimbarea a 2 elemente tabloului,
7.sortarea elementelor tabloului dupa unui cîmp,
8.adaugarea unui element nou la sfirsitul tabloului,
9.adaugarea unui element nou la îinceputul tabloului,
10.inserarea unui element nou în tabloul la pozitia indicată,
11.stergerea unui element al tabloului,
12.scrierea informaţiei despre elementele tabloului in fişier,
13.citirea informaţiei despre elementele tabloului din fişier,
14.eliberarea memoriei alocate pentru tablou,
15.ieşire din program.

Varianta 5. Marfa

Noţiuni teoretice

Structura – este o mulţime de date grupate, conform unei ierarhii, de obicei de tipuri
diferite. Structura poate fi comparată cu tabloul, însă tabloul conţine date de un acelaşi tip,
iar elementele tabloului se accesează cu ajutorul indicilor, pe cînd accesarea
componentelor structurii are o formă specifică. Structura reprezintă un tip de date definit
de utilizator prin utilizarea tipurilor deja existente.

1
Ex.: Utilizind instructiunea typedef si specificator de structura struct putem defeni
structura si un nou tip de date student:

typedef struct student


{
// definirea cimpurilor (membrilor) structurii
char nume[50];
int nr;
float nm;
} student;

Elementele structurii pot fi de tip predefinit sau definit de utilizator, excepţie fiind tipul
structurii date. Pentru definirea variabilelor este suficientă utilizarea numelui de structură
la fel ca tipurile predefinite:

student s1, s2, s[10], *p;

În acest caz s-au definit două variabile de tip carte, un tablou din 10 cărţi şi un pointer spre
student.
Referirea la componentele unei structuri se face utilizînd atît numele structurii cît şi a
componentei respective. Aceasta se realizează printr-o construcţie de forma:

s1.nm = 9.5;
s[i].nm = 8.5;
În cazul pointerilor:

p = &s1;
p->nm = 9.5;
La definirea tipului de strutură este bine de a preciza funcţiile care definesc operaţii cu
datele de tipul structurii. În acest scop variabilele se transmit funcţiilor prin parametri.
Pentru modificarea variabilei ea se transmite prin pointer.

Analiza datelor
Fisierul stat.h :
typedef struct {
char nume[MAX];
char capitala[MAX];
char presedinte[MAX];
int populatia;
int suprafata;
}stat;
stat - este tipul structurii
stat – variabila de tip structura

Câmpurile structurii
nume- acest cimp este destinat pentru denumirea statului, avind lungimea de 1000 caractere
capitala- acest cimp este destinat pentru denumirea capitalei statului , avind lungimea de 1000 caractere

2
presedinte- acest cimp este destinat pentru denumirea presedintelui statului, avind lungimea de 1000
caractere
populatia- acest cimp este destinat pentru numarul populatiei, si pastrarea datelor de tip int
suprafata- acest cimp este destinat pentru suprafata statului, si pastrarea datelor de tip int

stat data();
Această funcție este de tip stat, returneaza o variabila compusa de tip stat.
Ea nu primește parametri.
Variabile locale
data – variabila compusa de tip stat,reprezinta variabila returnabila.

void freem(stat *s);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia elibereaza memoria prin utilizarea functiei free().
Parametri
s – pointer la inceputul tabloului de elemente de tip stat

void read(marfa *A,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia introduce datele despre stat de la tastatura
Parametri
A – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i – variabila intermediara simpla de tip int

void afisare(marfa *A,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia afiseaza datele despre stat
Parametri
A – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i – variabila intermediara simpla de tip int

void sorts(stat *s, int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia sorteaza baza de date prin metoda bulelor
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i , k– variabile intermediare simple de tip int
t – variabila intermediara simpla de tip stat

void modify(stat *s,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia este folosita pentru modificarea bazei de date
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
3
Variabile locale
i , val– variabile intermediare simple de tip int
yes – variabila intermediara simpla de tip char

int searchs(stat * s, int n, char *name);


Aceasta functie este de tip int, care returneaza pozitia elementului gasit
Functia este destinata pentru cautarea in baza de date
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
name – pointer de tip char in care este informatia despre denumirea statului de cautat
Variabile locale
i – variabila intermediara simpla de tip int

void delfile(stat *s);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia sterge fisierul in care sunt inregistrate datele despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat

void writef(stat* s, int n,char *fname);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia data inscrie datele despre stat in fisierul “stat.txt”
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit dde functie
Variabile locale
i – variabila intermediara simpla de tip int
f – pointer de tip fisier

stat* readf(stat *s,int *n, char *fname);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data citeste datele despre stat din fisierul “stat.txt”
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit de functie
Variabile locale
k – variabila intermediara simpla de tip char avind lungimea de 1000 caractere
f – pointer de tip fisier

stat *append(stat* s, stat a, int* n);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la sfirsit informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
4
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
a – variabila compusa de tip stat
Variabile locale
i – variabila intermediara simpla de tip int
b– variabila simpla de tip pointer la tabloul de elemente de rip stat

stat *prepend(stat * s, stat a, int* n);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la inceput informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
a – variabila compusa de tip stat
Variabile locale
i – variabila intermediara simpla de tip int
b– variabila simpla de tip pointer la tabloul de elemente de rip stat

void adauga(stat *s, char ch);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functie data adauga informatie la sfirsitul fisierului
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
ch – variabila simpla de tip char
Variabile locale
f – pointer de tip fisier

stat* del_stat(stat *s,int *n,int poz);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la inceput informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
poz – variabila simpla de tip int ce reprezinta pozitia elementului care urmeaza a fi sters
Variabile locale
i – variabila intermediara simpla de tip int

int main();
s – pointer la inceputul tabloului de elemente de tip stat
a – variabila compusa de tip stat
f – pointer de tip fisier
i – variabila intermediara simpla de tip int
n – variabila de tip int care reprezinta numarul de elemente in tablou
poz – variabila simpla de tip int ce reprezinta pozitia elementului care urmeaza a fi sters
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit de functie
ch – variabila simpla de tip char
name – pointer de tip char in care este informatia despre denumirea statului de cautat
sdelete – variabila compusa , tablou de caractere cu marimea 1000 caractere
optiune – variabila simpla de tip integer , utilizata pentru a stoca decizia utilizatorului in privinta
optiunii

5
Fisierul marfa.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);
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);

Fisierul 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");

}
6
}

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)
{
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;
}
}
}

7
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);
if (t)
{
puts("Da-ti numarul de cantitate pentru marfa data \t(1.Da/0.Nu)");
fflush(stdin);
scanf("%i",&B[i].cantitate);
}
}
8
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)
9
{
FILE *fp;
marfa *A;
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);

Fisierul 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");
10
puts("10. Citirea din fisier");
puts("0. Iesire");
printf("\nComanda <<< ");
scanf("%d",&c);
switch(c)
{
case 0:
if(A)
{
free(A);
A=NULL;
}
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");
}
11
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:
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;
12
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 obtinute

13
1. Meniul programului

2. Introducerea datelor despre stat

3. Afisarea informatiei despre stat

14
4. Sortarea bazei de date

15
5. Modificarea bazei de date

16
6. Cautarea in baza de date

17
7. Stergerea fisierului stat.txt
Pe ecran a apurut eroare la stergere deoarece fisieurul stat.txt inca nu a fost creat

8. Stergerea unui stat

18
9. Scrierea datelor in fisierul stat.txt

10. Citirea datelor din fisier

19
11.Scrierea informatiei la sfirsitul fisierului

12.Adaugarea unui stat la inceput

20
13.Adaugarea unui stat la sfirsit

21
14.Eliberarea memoriei

22
15. Iesire

Analiza rezultatelor si concluzii:

1.Verificarea ne arată că programul lucrează corect.


2.Definirea structurilor este foarte practică, întrucât tablourile obișuite pot păstra
date de doar un anumit tip, în timp ce tablourile de structuri, structurile fiind
definite de programator, pot stoca date de orice tip, ce corespunde necesităților
informaționale din viața reală.

Bibliografie:

1. http://curs.algoritmi.ro/2011/02/28/tp-02-structuri-uniuni/
2. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/

23

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

  • Lab 71
    Lab 71
    Document10 pagini
    Lab 71
    DorelDjj
    Încă nu există evaluări
  • LAB6
    LAB6
    Document13 pagini
    LAB6
    DorelDjj
    Încă nu există evaluări
  • LAB8
    LAB8
    Document13 pagini
    LAB8
    DorelDjj
    Încă nu există evaluări
  • LAB8
    LAB8
    Document13 pagini
    LAB8
    DorelDjj
    Încă nu există evaluări
  • LAB6
    LAB6
    Document13 pagini
    LAB6
    DorelDjj
    Încă nu există evaluări
  • LAB7
    LAB7
    Document12 pagini
    LAB7
    DorelDjj
    Încă nu există evaluări
  • LAB7
    LAB7
    Document12 pagini
    LAB7
    DorelDjj
    Încă nu există evaluări
  • LAB4
    LAB4
    Document6 pagini
    LAB4
    DorelDjj
    Încă nu există evaluări
  • LAB3
    LAB3
    Document7 pagini
    LAB3
    DorelDjj
    Încă nu există evaluări
  • LAB5
    LAB5
    Document15 pagini
    LAB5
    DorelDjj
    Încă nu există evaluări
  • LAB4
    LAB4
    Document6 pagini
    LAB4
    DorelDjj
    Încă nu există evaluări
  • LAB5
    LAB5
    Document15 pagini
    LAB5
    DorelDjj
    Încă nu există evaluări
  • LAB3
    LAB3
    Document7 pagini
    LAB3
    DorelDjj
    Încă nu există evaluări
  • LAB2
    LAB2
    Document4 pagini
    LAB2
    DorelDjj
    Încă nu există evaluări
  • Raport
    Raport
    Document8 pagini
    Raport
    DorelDjj
    Încă nu există evaluări
  • Prezent Are
    Prezent Are
    Document10 pagini
    Prezent Are
    DorelDjj
    Încă nu există evaluări
  • LAB1
    LAB1
    Document4 pagini
    LAB1
    DorelDjj
    Încă nu există evaluări
  • LAB2
    LAB2
    Document4 pagini
    LAB2
    DorelDjj
    Încă nu există evaluări
  • LAB1
    LAB1
    Document4 pagini
    LAB1
    DorelDjj
    Încă nu există evaluări
  • Prezentaree
    Prezentaree
    Document9 pagini
    Prezentaree
    DorelDjj
    Încă nu există evaluări
  • Prezentare
    Prezentare
    Document10 pagini
    Prezentare
    DorelDjj
    Încă nu există evaluări
  • Raport
    Raport
    Document8 pagini
    Raport
    DorelDjj
    Încă nu există evaluări
  • Prezentaree
    Prezentaree
    Document9 pagini
    Prezentaree
    DorelDjj
    Încă nu există evaluări
  • Laboratorul 4
    Laboratorul 4
    Document9 pagini
    Laboratorul 4
    DorelDjj
    Încă nu există evaluări
  • LAB2-3 Croitoru Tudor
    LAB2-3 Croitoru Tudor
    Document26 pagini
    LAB2-3 Croitoru Tudor
    DorelDjj
    Încă nu există evaluări
  • Examen Final
    Examen Final
    Document23 pagini
    Examen Final
    DorelDjj
    Încă nu există evaluări
  • LAB4-5 Croitoru Tudor
    LAB4-5 Croitoru Tudor
    Document27 pagini
    LAB4-5 Croitoru Tudor
    DorelDjj
    Încă nu există evaluări
  • Lab1 SDA Croitoru Tudor AI 182
    Lab1 SDA Croitoru Tudor AI 182
    Document23 pagini
    Lab1 SDA Croitoru Tudor AI 182
    DorelDjj
    Încă nu există evaluări
  • Croitoru Tudor Laborator 6
    Croitoru Tudor Laborator 6
    Document7 pagini
    Croitoru Tudor Laborator 6
    DorelDjj
    Încă nu există evaluări