Sunteți pe pagina 1din 16

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra:Informatica Aplicat

RAPORT
Lucrarea de laborator Nr.1
La Structuri de Date i Algoritmi

A efectuat: st. gr. TI - 164

Ciobanu Alina

A verificat: dr., conf.univ.

Mihail Kulev

Chiinu 2017
Lucrare de laborator Nr.1

Tema: Implementarea tipului de date abstract Tablou de structuri n limbajul C

Scopul lucrrii: Obinerea deprinderilor practice de implementare i de utilizare a tipului


de date abstract (TDA). Tablou de structuri n limbajul C.

Sarcina de lucru: De scris trei fisiere text n limbajul C pentru implementarea i


utilizarea TDA Tablou de structuri:

1. Fiierul antet tablou.h care conine:


a. specificaia structurei elementului tabloului Marf
b. prototipurile funciilor care asigur operaiunile de prelucrare a tabloului
de structuri.
2. Fiierul tablou.cpp sau tablou.c care conine codurile tuturor funciilor declarate n
fiierul antet.
3. Fiierul utilizatorului main.cpp sau main.c care reprezint un program cu funcia main
( ) pentru prelucrarea tabloului de structuri cu afiarea meniului de opiuni pe ecran si
anume:
a) alocarea memoriei dinamice pentru tabloul de structuri cu n elemente
b) introducerea informaiei despre elementele tabloului de la tastatur
c) afiarea informaiei despre elementele tabloului pe ecran
d) cutarea elementului tabloului dup unui cmp al structurei
e) modificarea cmpurilor elementului tabloului
f) interschimbarea a 2 elemente indicate ale tabloului
g) sortarea elementelor tabloului dup unui cmp
h) adugarea unui element nou la sfritul tabloului
i) adugarea unui element nou la nceputul tabloului
j) inserarea unui element nou n tabloul la pozitia indicate
k) stergerea (eliminarea) unui element din tabloul
l) scrierea (salvarea) informaiei despre elementele tabloului n fiier
m) citirea informaiei despre elementele tabloului din fiier
n) eliberarea memoriei dinamice alocate pentru tabloul
o) ieire din program.

Mersul lucrrii:

Notiuni principale din teorie i metode folosite:[2]


Structurile sunt o facilitate oferit de limbajul C pentru a organiza mai bine datele cu
care lucreaz programele. Dac funciile ne permit s organizm mai
bine codul, structurile ne permit s organizm mai bine datele.

Structura este o mulime de date grupate, conform unei ierarhii, de obicei de tipuri
diferite. Structura poate fi comparat cu tabloul, ns tabloul conine date de un acelai
tip, iar elementele tabloului se acceseaz cu ajutorul indicilor, pe cnd accesarea
componentelor structurii are o form specific. Structura reprezint un tip de date definit
de utilizator prin utilizarea tipurilor deja existente.

Ex.: Utilizind instructiunea typedef si specificator de structura struct putem defini


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, excepie 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 student, un tablou din 10 studenti i un pointer spre student.

Referirea la componentele unei structuri se face utiliznd att numele structurii ct i a


componentei respective. Aceasta se realizeaz printr-o construcie de forma:

s1.nm = 9.5; s[i].nm = 8.5;

n cazul pointerilor:

p = &s1;
p->nm = 9.5;

O variabil structur poate fi iniializat la declarare prin precizarea ntre {} a valorilor


cmpurilor; cele neprecizate sunt implicit 0.De asemenea,o varibila structura poate fi
transmisa ca argument efectiv la apelarea unei funcii sau poate fi primita ca rezultat al
unei funcii, ntr-o instruciune return.

Un avantaj important al utilizrii structurilor este c atunci cnd atribuim o variabil de


tip structur unei alte variabile de acelai tip, se copiaz automat toate cmpurile
structurii.
n limbajul C putem specifica pentru cmpurile de tip integer sau char dimensiunea n bii
pe care s o ocupe. Dimensiunea n bii se specific plasnd imediat dup definirea
cmpului caracterul : urmat de numrul de bii pe care dorim s l ocupe cmpul.

Exemplu:
struct data_biti
{
unsigned int zi : 5;
unsigned int luna : 4;
int an : 15;
};

Dac urmrim (cu ajutorul operatorului sizeof) dimensiunea ocupat de structura


redefinit astfel, vom vedea c este ntr-adevr de 3 octei.

Fisiere:

Un fiier este o structur dinamic, situat n memoria secundar (pe disk-uri). Limbajul C
permite operarea cu fiiere:

de tip text - un astfel de fiier conine o succesiune de linii, separate prin NL ('\n')
de tip binar - un astfel de fiier conine o succesiune de octeti, fr nici o structur.

Prelucrarea unui fiier presupune asocierea acestuia cu un canal de I/E (numit flux sau
stream). Exist trei canale predefinite, care se deschid automat la lansarea unui program:

stdin - fiier de intrare, text, este intrarea standard tastatura


stdout - fiier de iesire, text, este ieirea standard - ecranul monitorului.
stderr fiier de iesire, text, este ieirea standard unde sunt scris mesajele de eroare -
ecran.

Pentru a prelucra un fiier, trebuie parcurse urmtoarele etape:

se definete o variabil de tip FILE * pentru accesarea fiierului; FILE * este un tip
structur definit n stdio.h, care conine informaii referitoare la fiier i la tamponul de
transfer de date ntre memoria central i fiier (adresa, lungimea tamponului, modul
de utilizare a fiierului, indicator de sfrsit, de poziie n fiier)
se deschide fiierul pentru un anumit mod de acces, folosind funcia de bibliotec fopen,
care realizeaz i asocierea ntre variabila fiier i numele extern al fiierului
se prelucreaz fiierul n citire/scriere cu funciile specifice
se inchide fiierul folosind funcia de bibliotec fclose.
FILE *fopen(const char *nume_fis, const char *mod);
Returneaz pointer la fiier sau NULL dac fiierul nu poate fi deschis; valoarea
returnat este memorat n variabila fiier, care a fost declarat pentru accesarea lui.

Modul de deschidere poate fi:


r - readonly , este permis doar citirea dintr-un fiier existent
w - write, creaz un nou fiier, sau dac exist deja, distruge vechiul continut
a - append, deschide pentru scriere un fiier existent ( scrierea se va face n
continuarea informaiei deja existente n fiier, deci pointerul de acces se plaseaz
la sfritul fiierului )
+ - permite scrierea i citirea - actualizare (ex: r+, w+, a+). O citire nu poate
fi direct urmat de o scriere i reciproc. nti trebuie repoziionat cursorul de acces
printr-un apel la fseek.
Analiza functiilor:

puts("\t\tMeniu");
puts("1. Alocarea memoriei");
puts("2. Introducerea informatiei");
puts("3. Afisarea datelor pe eccran");
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");
puts("10. Citirea din fisier");
puts("0. Iesire");
printf("\nComanda <<< ");
scanf("%d",&com);

n secvena de cod dat este prezentat meniul programului.


Functia de alocare a memoriei, alocarea memoriei se realizeaza in baza functie
malloc.
printf("Introduceti numarul de marfe: ");scanf("%d",&n);
A=(marfa *) malloc (n *sizeof(*A));
if(!A) {
puts("Memoria nu a fost alocata!"); exit(1);
}
puts("\nMemoria a fost alocata cu succes!");puts("\nTastati Enter pentru a continua");
getch();

Functia de introducere a datelor .


void inputdata(marfa *A, int n){
int i;
puts("Dati informatia despre marfe:\n");
for(i=0;i<n;i++){
printf("Marfa %d. \n", i+1);
printf("Denumirea: "); fflush(stdin);gets(A[i].denum);
printf("Producator: ");fflush(stdin);gets(A[i].produc);
printf("Pret: ");fflush(stdin);scanf("%f",&A[i].pret);
printf("Masa: ");scanf("%f",&A[i].masa);
printf("Cantitate: ");scanf("%i",&A[i].cantitate);
printf("\n");
}
}
Functia de afisare a datelor pe ecran.
void outputdata(marfa *A, int n){
int i;
puts("Lista marfilor:");
for(i=0; i<n; i++) {
printf("Denumirea: %s\n Producatorul: %s\n Pretul: %f\n Masa: %f\n
Cantitatea: %i\n", A[i].denum, A[i].produc,A[i].pret,A[i].masa,A[i].cantitate);
puts("\n");
}
}
Functia de cautare a unui element dupa denumire.
int searchdata(marfa *A, int n, char *denum){
int i;
for(i=0; i<n; i++) if(stricmp(A[i].denum,denum)==0)return i; return -1;
}

Functia de sortare a elementelor dupa denumire in ordine cresctoare.


void sortdata(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].denum,A[k+1].denum)>0){t=A[k]; A[k]=A[k+1]; A[k+1]=t; }
}
Functia de modificare a elementului
void modifydata(marfa *A, int k){
int t;
printf("Doriti sa modificati Denumirea? (1.Da/0.Nu)"); scanf("%d",&t);
if(t){ printf("Dati noua denumire:"); fflush(stdin);gets(A[k].denum);}
printf("Doriti sa modificati producatorul? (1.Da/0.Nu)"); scanf("%d",&t);
if(t){ printf("Dati numele producatorului:");fflush(stdin);gets(A[k].produc);}
printf("Doriti sa modificati pretul? (1.Da/0.Nu)"); scanf("%d",&t);
if(t){ printf("Dati pretul:");scanf("%f",&A[k].pret); }
printf("Doriti sa modificati masa? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati masa marfei:");scanf("%f",&A[k].masa); }
printf("Doriti sa modificati cantitatea? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati cantitatea:"); scanf("%i",&A[k].cantitate); }
}

Functia de adaugare a unui element.


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;
}
Funcia de tergere a unui element
marfa* deletedata(marfa *A, int *n, int k){
marfa *RN; int i;
RN=(marfa *) realloc (A,(*n-1)*sizeof(*A));
if(!RN){
printf("Memoria nu a fost alocata!"); puts("\nTastati o tasta pentru a continua");
return RN;
}
for(i=k;i<*n-1;i++)RN[i]=RN[i+1];
*n=*n-1; return RN;
}

Funcia de salvare n fier


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 %s %f %f %i", A[i].denum, A[i].produc, A[i].pret, A[i].masa, A[i].cantitate);
fprintf(fp,"\n"); }fclose(fp);}
Funcia de citire din fiier .
void readdata(char *filename){
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%s%f%f%i",&A.denum,&A.produc,&A.pret,&A.masa,&A.cantitate);
fclose(fp);
printf("Denumirea: %s\n Producatorul: %s\n Pretul: %f\n Masa: %f\n Cantitatea: %i\n",
A.denum, A.produc,A.pret,A.masa,A.cantitate);
}

Codul sursa a programului

Fiierul antet:

typedef struct marfa{


char denum[20];
char produc[20];
float pret;
float masa;
int cantitate;
}marfa;

void inputdata(marfa *A,int n);


void outputdata(marfa *A,int n);
int searchdata(marfa *A, int n, char *denum);
void sortdata(marfa *A, int n);
void modifydata(marfa *A, int k);
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);

Fiierul implementrilor:
#include<stdio.h>
#includetablou.h
#include<stdlib.h>
#include<string.h>
#include<conio.h>

void inputdata(marfa *A, int n){


int i;
puts("Dati informatia despre marfe:\n");
for(i=0;i<n;i++){
printf("Marfa %d. \n", i+1);
printf("Denumirea: ");fflush(stdin); gets(A[i].denum);
printf("Producator: "); fflush(stdin);gets(A[i].produc);
printf("Pret: "); fflush(stdin); scanf("%f",&A[i].pret);
printf("Masa: "); scanf("%f",&A[i].masa);
printf("Cantitate: ");scanf("%i",&A[i].cantitate);printf("\n");}
}

void outputdata(marfa *A, int n){


int i;
puts("Lista marfilor:");
for(i=0; i<n; i++) {
printf("Denumirea: %s\n Producatorul: %s\n Pretul: %f\n Masa: %f\n Cantitatea: %i\n",
A[i].denum, A[i].produc,A[i].pret,A[i].masa,A[i].cantitate); puts("\n"); }
}

int searchdata(marfa *A, int n, char *denum){


int i;
for(i=0; i<n; i++) if(stricmp(A[i].denum,denum)==0)return i; return -1;
}

void sortdata(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].denum,A[k+1].denum)>0) {t=A[k];A[k]=A[k+1];A[k+1]=t;}
}
void modifydata(marfa *A, int k){
int t;
printf("Doriti sa modificati Denumirea? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati noua denumire:");fflush(stdin); gets(A[k].denum); }
printf("Doriti sa modificati producatorul? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati numele producatorului:");fflush(stdin);gets(A[k].produc); }
printf("Doriti sa modificati pretul? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati pretul:");scanf("%f",&A[k].pret); }
printf("Doriti sa modificati masa? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) { printf("Dati masa marfei:"); scanf("%f",&A[k].masa);}
printf("Doriti sa modificati cantitatea? (1.Da/0.Nu)"); scanf("%d",&t);
if(t) {printf("Dati cantitatea:"); scanf("%i",&A[k].cantitate); }
}
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){


marfa *RN; int i;
RN=(marfa *) realloc (A,(*n-1)*sizeof(*A));
if(!RN){printf("Memoria nu a fost alocata!");puts("\nTastati o tasta pentru a continua");
return RN; }
for(i=k;i<*n-1;i++)RN[i]=RN[i+1];*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 %s %f %f %i",A[i].denum, A[i].produc, A[i].pret,
A[i].masa, A[i].cantitate); fprintf(fp,"\n"); } fclose(fp);
}

void readdata(char *filename){


FILE *fp; marfa A; int n=3,i=0;
fp=fopen(filename,"r");
if(!fp) {printf("Fisierul nu exista!\n"); system("pause"); exit(1); }

if(A==NULL){printf("\nEroare de alocare a memoriei!\n"); system("pause"); }


fscanf(fp,"%s%s%f%f%i",&A.denum,&A.produc,&A.pret,&A.masa,&A.cantitate);
fclose(fp);
printf("Denumirea: %s\n Producatorul: %s\n Pretul: %f\n Masa: %f\n Cantitatea: %i\n",
A.denum, A.produc,A.pret,A.masa,A.cantitate); }
Fiierul principal:
#includetablou.c
int main(){
marfa *A, *RN; int n,com,k; char denum[20],filename[20]; marfa a;
while(1)
{
puts("\t\tMeniu");
puts("1. Alocarea memoriei");
puts("2. Introducerea informatiei");
puts("3. Afisarea datelor pe eccran");
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");
puts("10. Citirea din fisier");
puts("0. Iesire");
printf("\nComanda <<< "); scanf("%d",&com);
switch(com)
{
case 1: printf("Introduceti numarul de marfe: ");scanf("%d",&n);
A=(marfa *) malloc (n *sizeof(*A));
if(!A){puts("Memoria nu a fost alocata!"); exit(1);}
puts("\nMemoria a fost alocata cu succes!"); puts("\nTastati Enter pentru a continua");
getch();break;
case 2: inputdata(A,n); getch(); break;
case 3: outputdata(A,n); getch(); break;
case 4: printf("Dati denumirea marfei: ");fflush(stdin);gets(denum);
k=searchdata(A,n,denum);
if(k<0){puts("Denumirea nu a fost gasita");printf("\nTastati o tasta pentru continuare");
getch(); break; } else {
puts("Informatia necesara:");
printf("Denumirea: %s\n Producatorul: %s\n Pretul: %f\n Masa: %f\n Cantitatea: %i\n",
A[k].denum, A[k].produc,A[k].pret,A[k].masa,A[k].cantitate); getch();break;}
case 5: sortdata(A,n);puts("Baza este sortata");getch();break;
case 6: printf("Dati numarul de ordine a marfei: "); scanf("%d",&k);
modifydata(A, k-1);puts("Modificarea s-a efectuat cu succes"); getch(); break;
case 7: puts("Dati informatie despre marfa noua:");
printf("Denumirea: ");fflush(stdin);gets(a.denum);
printf("Producator: "); fflush(stdin); gets(a.produc);
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;
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){puts("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;
case 0: if(A){ free(A); A=NULL; }exit(1); break;
default: puts("\nOptiunea introdusa nu exista!");
puts("\nTastati o tasta pentru continuare"); getch();
}
}getch();return 0;
}

Analiza rezultatelor si concluzii:


1. Verificarea ne arata ca rezultatele obtinute sunt corecte si programul lucreaza corect.
2. Au fost obtinute deprinderi pentru scrierea unui program de prelucrare structurilor de
date si lucru cu fisiere
3. Am aplicat cunostintele obtinute anterior pentru a elabora un program mult mai complex.
4. Am importat datele din fisier.
5. Am exportat datele in fisier pentru a le salva.

AVANTAJE:
1. Utilizarea fiierului antet permite folosirea acestor funcii n alte aplicaii i de ali
utilizatori.
2. Introducerea structurilor de date este limitata doar de memoria disponibila a HDD.
3. Programul contine functii,ceea ce ne va permite sa modificam programul mai usor dupa
dorinta sau sa adaugam alte functii pentru modificarea bazai de date.
4. Toate inregistrarile sunt pastrate in fisier,ceea ce ne permite sa nu pierdem datele la iesirea
din program.
5. Programele devin mai explicite dac se folosesc structuri n locul unor variabile separate.
6. Se pot defini tipuri de date specifice aplicaiei, iar programul reflect mai bine universul
aplicaiei.
7. Se poate reduce numrul de parametri al unor funcii prin gruparea lor n parametri de
tipuri structur i deci se simplific utilizarea acelor funcii.
8. Se pot utiliza structuri de date extensibile, formate din variabile structur alocate dinamic
i legate ntre ele prin pointeri (liste nlnuite, arbori .a).

DEZAVANTAJE:
1. Pot aparea exceptii in urma introducerii stringurilor cu whitespace.
2. Nu exista import din fisier *.txt in fisier binar.
3. In cazul stergerii unei inregistrati din mijloc, celelalte isi pastreaza ordinea si nu isi
schimba indicile cu i-1.

Bibliografie:
1. Carcea L.,Vlas S., Bobicev V. Informatica: Sarcini pentru lucrri de laborator.
Chiinu: UTM, 2005.
2. Conspectul prelegerilor cursului Programarea Calculatoarelor pentru studeni
Lector: dr., conf. univ. M.Kulev. Chiinu, UTM, 2017.
3. Tutorial in C language: http://www.tutorialspoint.com/cprogramming/, accesat
07.02.2017