Documente Academic
Documente Profesional
Documente Cultură
RAPORT
A efectuat:
Chișinău 2019
Varianta structurii:
9. Imobil
Tipuri de date abstracte
Tipul de date abstract este o entitate manipulata doar prin
operatiile ce definesc acel tip. Avantajele utilizarii tipurilor de
date abstracte sunt:
1. Programele devin independente de modul de reprezentare a
datelor. Modul de reprezentare poate fi modificat, fara însa
a afecta restul programului (de exemplu, o multime poate fi
implementata printr-un tablou sau printr-o lista ordonata,
dar partea de program ce foloseste operatorii tipului abstract
ramâne neschimbata).
2. Se previne violarea accidentala a datelor. Utilizatorul tipului
abstract este fortat sa manipuleze datele doar prin
intermediul operatorilor ce compun tipul abstract, astfel
reducându-se riscul unei distrugeri a datelor.
In C tipurile abstracte sunt realizate folosind fisiere. Acest mod
are desigur propriile sale limitari.
imobil*prependS(imobil*S,int*n,imobil a){
imobil*B;
int i;
B=(imobil*)realloc(S,(*n+1)*sizeof(*B));
if(!B){
return B;
}
for (i=*n;i>0;i--){
B[i]=B[i-1];
}
B[0]=a;
*n=*n+1;
return B;
}
imobil*deleteS(imobil*S,int*n,int k){
int i;
imobil *B;
for(i=k;i<*n-1;i++){
S[i]=S[i+1];
}
B=(imobil*)realloc(S,(*n-1)*sizeof(*B));
*n=*n-1;
return B;
}
int main()
{
int n;
int k,k1,k2,f;
imobil *S = NULL;
imobil *B = NULL;
imobil a;
char num[40];
int nm;
while(1)
{
puts("\n********************MENU********************\n");
puts("1. Introducerea numarului de imobile");
puts("2. Introducerea informatiei despre imobil");
puts("3. Afisarea informatiei despre imobil");
puts("4. Cautarea imobilului dupa tip");
puts("5. Sortarea tabloului de imobil dupa suprafata");
puts("6. Modificarea imobilului.");
puts("7. Adaugarea unui imobil la sfarsitul listei");
puts("8. Adaugarea unui imobil la inceputul listei");
puts("9. Inserarea unui imobil");
puts("10. Stergerea unui imobil");
puts("11. Interschimbarea imobilelor in lista");
puts("12. Stergerea tabloului de imobile din memorie");
puts("13. Salvarea informatiei despre imobile in fisier");
puts("14. Citirea informatiei despre imobile din fisier");
puts("n. Eliberarea memoriei.");
puts("0. Iesirea din program");
puts("\n*********************************************\n");
switch(nm)
{
case 1:
printf("Dati n: ");
scanf("%d", &n);
S=(imobil*)malloc(n*sizeof(*S));
if (!S){
puts("Memoria nu a fost alocata pentru numarul dat");
exit(1);
}
puts("Pentru a continua apasati ENTER");
getch();
break;
case 2:
readS(S,n);
getch();
break;
case 3:
showS(S,n);
getch();
break;
case 4:
puts("Dati tipul imobilului de cautat:");
fflush(stdin);
gets(num);
k=searchS(S,n,num);
if(k==-1){
puts("Imobilul nu a fost gasit");
}
else{
puts("Informatia despre imobilul cautat:");
printf("%d) \tTipul de imobil: %s \n\tSuprafata m^2: %d \n\tPretul:
%.2f\n\Proprietarul: %s\n", k+1, S[k].type,S[k].surface,S[k].price,S[k].owner);
}
getch();
break;
case 5:
sortS(S,n);
puts("De afisat lista sortata de imobile? (1/0)");
scanf("%f",&f);
if(f){
showS(S,n);
}
getch();
break;
case 6:
puts("Dati numarul de ordine al imobilului de modificat: ");
scanf("%d",&k);
modifyS(S,k-1);
getch();
break;
case 7:
puts("Dati informatia despre imobilul de adaugat la sfarsit:");
printf("\tTipul imobilului: ");
fflush(stdin);
gets(a.type);
printf("\tSuprafata: ");
scanf("%d",&a.surface);
printf("\tPretul: ");
scanf("%f",&a.price);
printf("\tAdresa:");
fflush(stdin);
gets(a.address);
printf("\tProprietarul:");
fflush(stdin);
gets(a.owner);
B= appendS(S,&n,a);
if(B==NULL)
{
puts("Adaugarea imobilului nu a fost efectuata");
}
else{
S=B;
}
getch();
break;
case 8:
puts("Dati informatia despre imobilul de adaugat la inceput:");
printf("\tTipul imobilului: ");
fflush(stdin);
gets(a.type);
printf("\tSuprafata: ");
scanf("%d",&a.surface);
printf("\tPretul: ");
scanf("%f",&a.price);
printf("\tAdresa:");
fflush(stdin);
gets(a.address);
printf("\tProprietarul:");
fflush(stdin);
gets(a.owner);
B= prependS(S,&n,a);
if(B==NULL){
puts("Adaugarea imobilului nu a fost efectuata");
}
else{
S=B;
}
getch();
break;
case 9:
printf("Dati informatia despre imobilul de inserat:\n");
printf("\tTipul imobilului: ");
fflush(stdin);
gets(a.type);
printf("\tSuprafata: ");
scanf("%d",&a.surface);
printf("\tPretul: ");
scanf("%f",&a.price);
printf("\tAdresa:");
fflush(stdin);
gets(a.address);
printf("\tProprietarul:");
fflush(stdin);
gets(a.owner);
printf("\tDati locul unde sa fie adaugat imobilul: ");
scanf("%d",&k);
B=insertS(S,&n,a,k-1);
if(B==NULL){
puts("Inserarea elementului nu a fost efectuata");
}
else{
S=B;
}
getch();
break;
case 10:
printf("Dati numarul imobilului de sters:");
scanf("%d",&k);
B=deleteS(S,&n,k-1);
if(B==NULL){
puts("Stergerea imobilului nu a fost efectuata");
}
else{
S=B;
}
getch();
break;
case 11: // problema la introducerea unor numere mai mari decit cele din lista
printf("Dati numerele de ordine ale elementelor de interschimbat: ");
scanf("%d",&k1);
scanf("%d",&k2);
swapS(S,k1-1,k2-1);
puts("Interschimbarea a fost efectuata cu succes!");
getch ();
break;
case 12:
printf("Doriti sa eliberati memoria dinamica? (1/0):");
scanf("%d",&f);
if(f){
free(S);
S=NULL;
}
getch ();
break;
case 13:
printf("dati numele fisierului pentru salvarea informatiei despre imobile:");
fflush(stdin);
gets(num);
saveS(S,n,num);
getch ();
break;
case 14:
printf("dati numele fisierului pentru citirea informatiei despre imobile:");
fflush(stdin);
gets(num);
loadS(S,n,num);
getch ();
break;
case 0:
printf("doriti sa iesiti din program? (1/0):");
scanf("%d",&f);
if(f){
free(S);
return 0;
}
puts("alegeti optiunea corecta");
getch ();
break;
}
}
}
void readS(imobil*S,int n){
int i;
puts("Dati informatia despre imobile:");
for (i=0;i<n;i++){
printf("Imobil %d:\n",i+1);
printf("\tTipul imobilului: ");
fflush(stdin);
gets(S[i].type);
printf("\tSuprafata m^2: ");
scanf("%d",&S[i].surface);
printf("\tPretul $: ");
scanf("%f",&S[i].price);
printf("\tAdresa: ");
fflush(stdin);
gets(S[i].address);
printf("\tProprietarul: ");
fflush(stdin);
gets(S[i].owner);
} return; }
Rezultatele obținute:
Consola ***MENU***
1) Am obtinut un design al softului , care poate fi citit si inteles mai usor, am obtinut structurarea
eficienta a codului programului in diferite fisiere.
2) Am obtinut deprinderi a structura codul efficient , in acelasi timp putem sa ascundem detaliile
de implementare a unor algoritmi si functii.
3)Am observant utilitatea tipului abstract de date in proiectarea codului si programului ca unitate.
Bibliografie
1. Lucrarea de laborator nr.1 la SDA pentru studenţii an. 1 CR, RM, FCIM, UTM. 2019
2. Conspectul prelegerilor cursului Structuri de date și algoritmi pentru studenții grupei CR-
181. Lector dr., conf. univ. M. Kulev. Chișinău, UTM, 2019.