Documente Academic
Documente Profesional
Documente Cultură
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
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:
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:
Î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.
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;
Fisierul marfac.c
#include "marfah.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
}
6
}
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;
}
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
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
18
9. Scrierea datelor in fisierul stat.txt
19
11.Scrierea informatiei la sfirsitul fisierului
20
13.Adaugarea unui stat la sfirsit
21
14.Eliberarea memoriei
22
15. Iesire
Bibliografie:
1. http://curs.algoritmi.ro/2011/02/28/tp-02-structuri-uniuni/
2. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/
23