Sunteți pe pagina 1din 11

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Informatica Aplicata

Raport
la disciplina „Structuri de date si
algoritme”
lucrare de laborator Nr.1

A efectuat:
st. gr. SI-141 E.Cucu

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

Chişinău 2014
Tema: Implementarea tipurilor abstracte de date. Tablouri de structuri în C.
Scopul lucrării: De alcatuit 3 fişiere în limbajul C pentru emplementarea şi
utilizarea tipului abstract de date.

Formularea problemei
De format:
1.Un fişier cu extensia “.h“ unde se afla descrierea structurii elementelor tabloului
şi prototipurile funcţiilor care utilizează operaţiuni asupra tabloului dat.
2.Un fisier cu extensia “.cpp” unde se afla codul funcţiilor declarate în fişierul 1.
3.Un fişier a utilizatorului cu extensia .cpp unde se afla funcţia main pentru
precesarea bazei de date în forma tabloului de structuri.

Tipul abstract de date reprezinta un model matematic al structurii de date studiate si operatiuni
asupra datelor. Etapele implementarii TDA in limbajul C:1.Crearea fisierului cu extensia (.h)
care contine:descrierea proprietatilor SD 2.prototipurile functiilor pentru operatiuni asupra
datelor 3.Crearea fisierului cu extensia (.cpp) care contine main-ul.
Un TDA poate fi conceput ca un model matematic căruia i se asociază o colecţie de operatori
specifici. Vom realiza o paralelă cu conceptul de procedură. Procedura generalizează noţiunea de
operator. În loc de a fi limitat la utilizarea exclusivă a operatorilor definiţi în cadrul
limbajului de programare ("built-in" operators), folosind procedurile, programatorul este
liber să-şi definească proprii săi operatori, pe care ulterior să-i aplice asupra unor
operanzi care nu e necesar să aparţină tipurilor de bază (primitive) ale limbajului utilizat. Un
exemplu de procedură utilizată în această manieră este spre exemplu, rutina de înmulţire a
două matrici.Procedurile încapsulează anumite părţi ale unui algoritm prin "localizare" Aceasta
înseamnă plasarea într-o singură secţiune a programului a tuturor instrucţiunilor relevante.

Textul programului in limbajul „C”

Masina.h
typedef struct
{
char marca[40];
char model[40];
char origine[40];
int anu;
float pret;
}masina;

masina* din_realloc(masina *a,int n);


masina* intro_auto(char *fname,int *n);
masina* intro_manual(masina *a,int *n);
void afisare(masina *a,int *n);
void afis_an(masina *a, int *n,int an);
masina* add_car(masina *a,int *n,int nr);
masina* add_car_everyw(masina *a,int* n,int k);
masina* add_car_prepend(masina* a,int* n);
void del_car(masina *a,int *n,int nd);
void save(masina *a,int *n,char *fname);
void ord_cr(masina *a,int *n);
void car_m(masina *a,int nm);
Functii.cpp
#include <stdio.h> int i;
#include <conio.h> system("cls");
#include <stdlib.h> for(i=0;i<*n;i++){
#include <string.h> printf("*************************************
#include "1masina.h" ***\n\n");
printf("Datele masinii: %d\n",i+1);
//ALOCARE SI REALOCARE DINAMICA printf("Marca:
masina* din_realloc(masina *a,int n) %s\n",a[i].marca);
{ printf("Model:
a=(masina*)realloc(a,n*sizeof(masina)); %s\n",a[i].model);
if(!a) printf("Originea:
{ %s\n",a[i].origine);
printf("\a\nNu sa alocat memorie!\n"); printf("Anul de productie:
system("pause"); %d\n",a[i].anu);
exit(1); printf("Pretul:
} %.2f\n\n",a[i].pret);
return a; }
} }
//CITIRE FISIER //Afisare dupa anul introdus
masina* intro_auto(char *fname,int *n) void afis_an(masina *a, int *n,int an)
{ {
int i=0,m=0; int i,j=0;
masina *a=NULL; printf("Masini produse in anul :
FILE *demo=fopen(fname,"r"); %d\n\n",an);
if(!demo) for(i=0;i<*n;i++){
{ if(a[i].anu==an){
printf("\aFisierul nu exista!\n"); printf("*************************************
} ***\n\n");
while(!feof(demo)) printf("Nr. de ordine:
{ %d\n",i+1);
m++; printf("Marca:
a=din_realloc(a,m); %s\n",a[i].marca);
fscanf(demo,"%s%s%s%d printf("Model:
%f",&a[i].marca,&a[i].model,&a[i].origine,&a[ %s\n",a[i].model);
i].anu,&a[i].pret); printf("Originea:
i++; %s\n",a[i].origine);
} printf("Anul de productie:
*n=m; %d\n",a[i].anu);
fclose(demo); printf("Pretul:
return a; %.2f\n\n",a[i].pret);
} j++;
}
//INTRODUCERE MANUALA }
masina* intro_manual(masina *a,int *n) if(j==0)
{ {
int i; system("cls");
printf("Introdu numarul de masini: "); printf("Nu s-au gasit nici o masina din anul
scanf("%d",n); %d\n\n",an);
a=din_realloc(a,*n); }
for(i=0;i<*n;i++) }
{ masina* add_car(masina *a,int *n,int nr)
printf("\n*********************************** {
*****\n\n"); int i;
printf("Introdu datele masinii %d\n",i+1); a=din_realloc(a,*n+nr);
printf("Marca: "); for(i=*n;i<*n+nr;i++)
scanf("%s",&a[i].marca); {
printf("Model: "); printf("\n***********************************
scanf("%s",&a[i].model); *****\n\n");
printf("Originea: "); printf("Datele masinii %d\n",i+1);
scanf("%s",&a[i].origine); printf("Marca: ");
printf("Anul de productie: "); scanf("%s",&a[i].marca);
scanf("%d",&a[i].anu); printf("Model: ");
printf("Pretul($): "); scanf("%s",&a[i].model);
scanf("%f",&a[i].pret); printf("Originea: ");
} scanf("%s",&a[i].origine);
return a; printf("Anul de productie: ");
} scanf("%d",&a[i].anu);
void afisare(masina *a,int *n) printf("Pretul: ");
{ scanf("%f",&a[i].pret);
} a=din_realloc(a,*n);
*n=*n+nr; }
} //functia de salvare
masina* add_car_everyw(masina *a, int *n ,int void save(masina *a,int *n,char *fname)
k) {
{ int i;
int i; FILE *demo=fopen(fname,"wt");
masina p; for(i=0;i<*n;i++)
a=din_realloc(a,*n+1); {
printf("\n*********************************** fprintf(demo,"\n%s %s %s %d
*****\n\n"); %.2f",a[i].marca,a[i].model,a[i].origine,a[i]
printf("Datele masinii %d\n",k); .anu,a[i].pret);
printf("Marca: "); }
scanf("%s",&p.marca); fclose(demo);
printf("Model: "); }
scanf("%s",&p.model); //afisarea studentilor in ordine
printf("Originea: "); descrescatoare dupa medie
scanf("%s",&p.origine); void ord_cr(masina *a,int *n)
printf("Anul de productie: "); {
scanf("%d",&p.anu); int i,j,p;
printf("Pretul: "); float max;
scanf("%f",&p.pret); masina t;
for (i=k-1; i<*n; i++) for(i=0;i<*n;i++)
{ {
a[i+1]=a[i]; max=a[i].pret;
} p=i;
a[k-1]=p; for(j=i;j<*n;j++)
*n=*n+1; {
} if(max<a[j].pret)
{
masina* add_car_prepend(masina *a, int *n) max=a[j].pret;
{ p=j;
int i; }
int k=1; }
masina p; t=a[i];
a=din_realloc(a,*n+1); a[i]=a[p];
printf("\n*********************************** a[p]=t;
*****\n\n"); }
printf("Datele masinii %d\n",k); afisare(a,n);
printf("Marca: "); }
scanf("%s",&p.marca); //modificarea datelor
printf("Model: "); void car_m(masina *a,int nm)
scanf("%s",&p.model); {
printf("Originea: "); printf("Nr. de ordine:
scanf("%s",&p.origine); %d\n",nm);
printf("Anul de productie: "); printf("Marca:
scanf("%d",&p.anu); %s\n",a[nm-1].marca);
printf("Pretul: "); printf("Model:
scanf("%f",&p.pret); %s\n",a[nm-1].model);
for (i=k-1; i<*n; i++) printf("Originea:
{ %s\n",a[nm-1].origine);
a[i+1]=a[i]; printf("Anul de productie:
} %d\n",a[nm-1].anu);
a[0]=p; printf("Pretul:
*n=*n+1; %.2f\n\n",a[nm-1].pret);
} printf("*************************************
//functia pentru stergere ***\n\n");
void del_car(masina *a,int *n,int nd) printf("Datele masinii pentru
{ modificare:\n");
int i; printf("Marca: ");
*n=*n-1; scanf("%s",&a[nm-1].marca);
if(*n>0) printf("Model: ");
{ scanf("%s",&a[nm-1].model);
for(i=nd-1;i<*n;i++) printf("Originea: ");
a[i]=a[i+1]; scanf("%s",&a[nm-1].origine);
} printf("Anul de productie: ");
else scanf("%d",&a[nm-1].anu);
{ printf("Pretul: ");
system("cls"); scanf("%f",&a[nm-1].pret);
printf("\nNu mai sunt masini!\a\n"); }
}
Main.cpp
#include "1functii.c" printf("\n\nComanda:");
int main() scanf("%d",&commenu);
{ switch(commenu)
masina *a=NULL; {
int n=0,an,nr,nd,nm; case 0:
int com,com0,com1,com2,com3,commenu,m,l,k; system("cls");
char fname[20],fil_name[10]; printf("\n [1] Meniu precedent.");
printf("\n [2] Iesire.\n");
while(1) printf("\n\n Comanda:");
{ scanf("%d",&com0);
while(m) switch(com0)
{ {
m=0; case 1:
system("cls"); if(a)
printf("Alegeti tipul de introducere a free(a);
datelor\n"); m=1;
printf("\n[1] Manual\n[2] Fisier\n\n[0] break;
Iesire\n\nComanda:"); case 2:
scanf("%d",&com); if(a)
switch(com) free(a);
{ exit(0);
case 0: break;
if(a) default:
free(a); system("cls");
exit(0); printf("\aAti introdus o comanda
break; gresita!\n");
case 1: l=1;
system("cls"); system("pause");
a=intro_manual(a,&n); break;
printf("Introducerea datelor a avut loc cu }
succes!\a"); break;
break; case 1:
case 2: system("cls");
system("cls"); printf("\n [1] Lista cu masini.");
printf("Introdu numele fisierului pentru printf("\n [2] Lista cu masini din anul
citire:\n"); dorit.");
scanf("%s",&fname); printf("\n [3] Lista in ordine
strcat(fname,".txt"); descrescatoare dupa pret.");
a=intro_auto(fname,&n); printf("\n\n Comanda:");
system("cls"); scanf("%d",&com1);
printf("Citirea din fisier a avut loc cu switch(com1)
succes!\a\n"); {
system("pause"); case 1:
break; system("cls");
default: afisare(a,&n);
system("cls"); l=1;
printf("\aAti introdus o comanda system("pause");
gresita!\n"); break;
m=1; case 2:
system("pause"); system("cls");
break; printf("Introduceti anul dorit: ");
} scanf("%d",&an);
} if(an>=1984 && an<=2015)
system("cls"); {
printf(" LISTA MENIURI\n"); system("cls");
printf("\n\n [1] AFISARE.\n"); afis_an(a,&n,an);
printf(" [2] MODIFICARE\n"); }
printf(" [3] SALVARE SI RESTAURARE\n"); else
printf(" [0] NAVIGARE\n"); {
system("cls"); system("pause");
printf("Anul introdus nu este corect!\a\n"); break;
} case 4:
l=1; system("cls");
system("pause"); afisare(a,&n);
break; printf("Introdu numarul de ordine a masinii
case 3: pentru stergere: ");
system("cls"); scanf("%d",&nd);
printf("Lista in ordine descrescatoare dupa system("cls");
pret: \n"); del_car(a,&n,nd);
ord_cr(a,&n); system("cls");
l=1; printf("Masina cu numarul de ordine %d a fost
system("pause"); eliminata cu succes\n",nd);
intro_auto(fname,&n);//dupa afisare in ordine l=1;
desc. lista devine la starea initiala system("pause");
break; break;
default: case 5:
system("cls"); system("cls");
printf("\aAti introdus o comanda afisare(a,&n);
gresita!\n"); printf("Introdu numarul de ordine a masinii:
l=1; ");
system("pause"); scanf("%d",&nm);
break; system("cls");
} if(nm<=n && nm>=1)
break; {
case 2: car_m(a,nm);
system("cls"); din_realloc(a,nm);
printf("\n [1] Adauga masini noi la sfirsit }
de lista."); else
printf("\n [2] Adauga masina noua la inceput printf("\nNu exista masina cu asa numar de
de lista."); ordine\a\n");
printf("\n [3] Adauga masina noua la locul l=1;
dorit in lista."); system("cls");
printf("\n [4] Sterge din lista de printf("Modificarea a avut loc cu
masini."); succes!\a\n");
printf("\n [5] Modifica datele masinii."); system("pause");
printf("\n\n Comanda:"); break;
scanf("%d",&com2); default:
switch(com2) system("cls");
{ printf("\aAti introdus o comanda
case 1: gresita!\n");
system("cls"); l=1;
printf("Introdu numarul de masini pentru system("pause");
adaugare: "); break;
scanf("%d",&nr); }
add_car(a,&n,nr); break;
l=1; case 3:
system("cls"); system("cls");
printf("Adaugarea a avut loc cu printf("\n [1] Salveaza schimbarile in
succes!\a\n"); fisier.");
system("pause"); printf("\n [2] Starea initiala a datelor.");
break; printf("\n\n Comanda:");
case 2: scanf("%d",&com3);
system("cls"); switch(com3)
add_car_prepend(a,&n); {
l=1; case 1:
system("cls"); system("cls");
printf("Adaugarea a avut loc cu printf("Introdu numele fisierului pentru
succes!\a\n"); salvare: ");
system("pause"); scanf("%s",&fname);
break; strcat(fname,".txt");
case 3: save(a,&n,fname);
system("cls"); printf("\nSalvare a avut loc cu
printf("Introdu locul pentru adaugare a succes!\a\n\n");
masinii: "); l=1;
scanf("%d",&k); system("pause");
add_car_everyw(a,&n,k); break;
l=1; case 2:
system("cls"); system("cls");
printf("Adaugarea a avut loc cu if(a)
succes!\a\n"); free(a);
intro_auto(fname,&n); }
printf("Reinoirea datelor sa efectuat cu break;
succes!\n"); default:
l=1; system("cls");
system("pause"); printf("\aAti introdus o comanda
break; gresita!\n");
default: l=1;
system("cls"); system("pause");
printf("\aAti introdus o comanda break;
gresita!\n"); };//end of switch commenu.
l=1; }//end of infinite cicle
system("pause"); return 0;
break; }//end main.

Descrierea functiilor,parametri,valoarea returnabila.

masina* din_realloc(masina *a,int n);


{return a;}
 Destinatia:alocarea dinamica a tabloului unidimensional de structuri.
 Parametri:a(pointer la structura,tablou unidimensional de structura)
n(variabila de tip int,numarul de elemente din tabloul de structuri)
 Valoarea returnabila:a(tablou unidimensional de structuri)

masina* intro_auto(char *fname,int *n);


{return a;}
 Destinatia:introducerea datelor din fisier.
 Parametri:fname(pointer la char,denumirea fisierului)
n(pointer la int,numarul de elemente)
 Valoarea returnabila:a(tablou unidimensional de structuri)

masina* intro_manual(masina *a,int *n);


{return a;}
 Destinatia:introducerea datelor manual in tablou unidimensional de structura.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
 Valoarea returnabila:a(tablou unidimensional de structuri)

void afisare(masina *a,int *n);


 Destinatia:Afisarea datelor.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)

void afis_an(masina *a, int *n,int an);


 Destinatia:Afisarea datelor dupa un cimp al structurii(an).
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
an(variabila de tip int,anul cautata)

masina* add_car(masina *a,int *n,int nr);


 Destinatia:Adaugarea elementelor noi la sfirsit in tabloul unidimensinal de structuri.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
nr(variabila de tip int,numarul de elemente pentru adaugare)

masina* add_car_everyw(masina *a,int* n,int k);


 Destinatia:Adaugarea unui noi elementent la locul dorit in tabloul unidimensional de
structuri.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
k(variabila de tip int,indicile pentru plasrea elementului)

masina* add_car_prepend(masina* a,int* n);


 Destinatia:Adaugarea elementului noi la inceputul tabloului de structuri.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)

void del_car(masina *a,int *n,int nd);


 Destinatia:Stergerea elementului dorit din tabloul de structuri.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
nd(variabila de tip int,indicile elementului dorit pentru stergere)

void save(masina *a,int *n,char *fname);


 Destinatia:Salvarea datelor in fisier.
 Parametri:a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)
fname(pointer la char,denumirea fisierului pentru salvare)

void ord_cr(masina *a,int *n);


 Destinatia:Sortarea si afisarea tabloului de structuri in ordine descrescatoare dupa un
anumit cimp(pret).
 Parametri: a(pointer la strucura,tablou unidimensional de structura)
n(pointer la int,numarul de elemente din tablou)

void car_m(masina *a,int nm);


 Destinatia:alocarea dinamica a tabloului unidimensional de structuri.
 Parametri: a(pointer la strucura,tablou unidimensional de structura)
nm(variabila de tip int,indicile elemtentului pentru modificare)
Rezultatele obtinute.
Introducere.

Meniu principal.

Afisare meniu.
Afisare tablou.

Meniu modificare.
Concluzii: În urma efectuării acestei lucrari de laborator am consolidat
cunostintele acumulate în urma studierii materialelor la tema “Structuri de date si
algoritm” .

7. Bibliografie
1. Carcea L.,Vlas S., Bobicev V. Informatica:Sarcini pentru lucrări de laborator.
Chișinău: UTM, 2005.
2. Conspectul prelegirilor cursului Programarea Calculatoarelor. Lector
dr.,conf. univ. M.Kulev. Chișinău: UTM, 2014.