Sunteți pe pagina 1din 13

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

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