Sunteți pe pagina 1din 19

Ministerul Educaţiei, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

RAPORT
Lucrarea de laborator nr. 1 la
SDA

A efectuat:
st. gr. CR-203 Rîbac Alexandru

A verificat: Stratulat Ștefan

Chişinău -2021
Lucrarea de laborator nr. 1

Теmа: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C,

Scopul lucrării: Obținerea deprinderilor practice de implementare și de utilizare a tipului abstract


de date (TAD) “Tablou de structuri” în limbajul C.

Sarcină: Să se scrie trei fișiere-text în limbajul C pentru implementarea și utilizarea TAD “Tablou
de structuri”:
1. Fişier antet cu extensia .h, care conține specificarea structurii de date a elementului tabloului
(conform variantelor) şi prototipurile funcţiilor de prelucrare a tabloului de structuri.
2. Fişier cu extensia .cpp sau .c, care conține implementările (codurile) funcţiilor, declarate în
fişierul antet.
3. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea tabloului de structuri cu afişarea la
ecran a următorului meniu de opţiuni:

1. Alocarea dinamică a memoriei pentru tablou.


2. Introducerea informației despre elementele tabloului de la tastatură.
3. Afişarea informației despre elementele tabloului la ecran.
4. Căutarea elementului în tablou.
5. Modificarea câmpurilor a unui element din tablou.
6. Înterschimbarea a două elemente indicate din tablou.
7. Sortarea tabloului
8. Adăugarea unui element nou la sfârșitul tabloului.
9. Adăugarea unui element nou la înciputul tabloului.
10. Inserarea unui element nou după elementul indicat al tabloului.
11. Inserarea unui element nou înainte elementul indicat al tabloului.
12. Ştergerea elementului indicat al tabloului.
13. Salvarea informației despre elementele tabloului în fişier.
14. Citirea informației despre elementele tabloului din fişier.
15. Eliberarea memoriei alocate pentru tablou.
0. Ieşire din program.

Codul (textul) programului în limbajul C:


Fişier antet cu extensia .h:
typedef struct capitala
{
char den[40];
char tara[20];
float popl;
float supr;
char primarul[20];
} Capitala;
void meniu();
void introducere(Capitala *C, int n);

1
int cautare(Capitala *C, int n, char*d);
void sortare(Capitala *C, int n);
void redactare(Capitala *C, int k);
void interschimbarea(Capitala *C,int element_1, int element_2);
Capitala* adaugare_sfarsit(Capitala* C, int *pn,Capitala a);
Capitala* adaugare_inceput(Capitala* C, int *pn, Capitala a);
Capitala* sterge(Capitala* C, int *pn,int k);
Capitala* inserare_dupa(Capitala* C, int *pn,Capitala a,int k);
Capitala* inserare_inainte(Capitala*C,int *pn, Capitala a, int k);
void citirea(Capitala *C, int n);
int salvare(Capitala* C,int n, char* fname);
int executie(Capitala* C, int n, char* fname);

Fişier cu extensia .cpp :


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"capitala.h"
void meniu()
{
printf("\t MENIU:\n");
printf("1. Alocarea dinamica a memoriei pentru tabl. de structuri\n");
printf("2. Introducerea elementelor tabloului de la tastatura\n");
printf("3. Afisarea informatiei despre elementele tabloului la ecran\n");
printf("4. Cautarea elementului tabloului\n");
printf("5. Modificarea campurilor a unui element din tablou\n");
printf("6. Interschimbarea a doua elemente din tablou\n");
printf("7. Sortarea tabloului\n");
printf("8. Adaugarea unui element nou la sfirsit\n");
printf("9. Adaugarea unui element nou la inceput\n");
printf("10. Inserarea unui element nou dupa elementul indicat\n");
printf("11. Inserarea unui element nou inainte elementului indicat\n");
printf("12. Eliminarea elementului indicat din tablou\n ");
printf("13. Salvarea elementelor tabloului in fisier\n ");
printf("14. Citirea elementelor tabloului din fisier \n");
printf("15. Eliberarea memoriei alocate pentru tablou \n");
printf("0. Iesire din program \n");
}
void introducere(Capitala *C,int n)
{
printf("\nInformatia despre capitalele introduse:\n");
for(int i=0; i<n; i++)
{
printf("Capitala%d:",i+1);
fflush(stdin);
gets(C[i].den);

printf("\nTara:");
fflush(stdin);
gets(C[i].tara);

2
printf("\nPopulatia:");
fflush(stdin);
scanf("%f",&C[i].popl);

printf("\nSuprafata:");
fflush(stdin);
scanf("%f", &C[i].supr);

printf("\nPrimarul:");
scanf("%s",&C[i].primarul);
}
return;
}
int cautare(Capitala*C,int n,char*d)
{
int i;
for(i=0; i<n; i++)
{
if(strcmp(C[i].den, d)==0)
{
return i;
}
}
return -1;
}
void sortare(Capitala*C,int n)
{
int i,k;
Capitala t;
for(i=0; i<n; i++)
{
for(k=0; k<n-1-i; k++)
{
if(strcmp(C[k].den,C[k+1].den)>0)
{
t=C[k];
C[k]=C[k+1];
C[k+1]=t;
}
}
}
return;
}
void interschimbarea(Capitala*C,int element_1,int element_2)
{
Capitala tmp;
tmp=C[element_1];
C[element_1]=C[element_2];
C[element_2]=tmp;

3
return;
}
void redactare(Capitala*C,int k)
{
int f;
printf("De modificat numele capitalei? (1/0):");
scanf("%d",&f);
if(f!=0)
{
printf("Dati numele capitalei:");
fflush(stdin);
gets(C[k].den);
}
printf("De modificat tara? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati tara:");
scanf("%s", &C[k].tara);
}
printf("De modificat populatia? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati populatia:");
scanf("%f", &C[k].popl);
}
printf("De modificat suprafata? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati suprafata:");
scanf("%f", &C[k].supr);
}
printf("De modificat primarul? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati primarul:");
scanf("%s", &C[k].primarul);

}
return;

}
Capitala* adaugare_sfarsit(Capitala* C, int *pn,Capitala a)
{
Capitala*B;
B=(Capitala*)realloc(C,((*pn)+1)*sizeof(Capitala));
if(B==NULL)

4
{

printf("Memoria nu a fost alocata!!!!\n");


return B;
}

B[*pn]= a;
*pn=*pn+1;

return B;
}
Capitala* adaugare_inceput(Capitala* C, int *pn, Capitala a)
{
Capitala*B;
B=(Capitala*)realloc(C,((*pn)+1)*sizeof(Capitala));
if(B==NULL)
{
printf("Memoria nu a fost alocata!!!\n");
return B;
}
for(int i=*pn;i>0;i--)
{
B[i]=B[i-1];
}
B[0]=a;
*pn=*pn+1;
return B;
}
Capitala* sterge(Capitala* C, int *pn,int k)
{
Capitala*B;
int i;
for(i=k; i<*pn-1; i++)
{
C[i]=C[i+1];
}
B=(Capitala*)realloc(C,((*pn)-1)*sizeof(Capitala));
if(B==NULL)
{
return B;
}
*pn=*pn-1;
return B;
}
Capitala* inserare_dupa(Capitala* C, int *pn,Capitala a,int k)
{
Capitala*B;
int i;
B=(Capitala*)realloc(C,((*pn)+1)*sizeof(Capitala));
printf("Dupa ce element doriti sa inserati noul element:");

5
scanf("%d",&k);
if(B==NULL)
{
return B;
}
for(i=*pn; i>k; i--)
{
B[i]=B[i-1];
}
B[k]=a;
*pn=*pn+1;
return B;
}
Capitala* inserare_inainte(Capitala*C,int *pn, Capitala a, int k)
{
int i;
Capitala*B;
B=(Capitala*)realloc(C,((*pn)+1)*sizeof(Capitala));
printf("Inaintea carui element doriti sa inserati elementul nou:");
scanf("%d",&k);
if(B==NULL)
{
return B;
}
for(i=*pn; i>=k; i--)
{
B[i]=B[i-1];
}
B[k-1]=a;
*pn=*pn+1;
return B;
}
void citirea(Capitala* C, int n)
{
for(int i=0; i<n; i++)
{
printf("\n%d.Capitala:%s Tara:%s Populatia:%.2f Suprafata:%.2f Primarul:%s",i+1,C[i].den
,C[i].tara, C[i].popl, C[i].supr, C[i].primarul);
}
return;
}
int salvare(Capitala* C,int n, char* fname)
{
FILE *fq;
int i;
fq=fopen(fname,"w");
if(fq==NULL)
{
return 0;
}

6
for(i=0; i<n; i++)
{
fprintf(fq, "%s %s %f %f %s\n",C[i].den, &C[i].tara,&C[i].popl,&C[i].supr,&C[i].primarul);
}
fclose(fq);
return 1;
}
int executie(Capitala* C, int n, char* fname)
{
FILE *fp;
int i;
fp=fopen(fname,"r");
if(fp==NULL)
{
return 0;
}
for(i=0; i<n; i++)
{
fscanf(fp, "%s %s %f %f %s", C[i].den, C[i].tara,C[i].popl,C[i].supr,C[i].primarul);
}
fclose(fp);
return 1;
}
Funcţia mаin():
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Capitala.c"
int main()
{
Capitala *C,*B, a;
char d[40],fname[40];
int n,nm,f, k=1,element_1,element_2;
printf("Dati numarul de capitale:");
scanf("%d",&n);
do
{
system("cls");
meniu();
printf("\nAlegeti optiunea din meniu: ");
scanf("%d", &nm);

switch(nm)
{

case 1:
C=(Capitala*)malloc(n* sizeof(Capitala));
if(C==NULL)
{
printf("Memoria nu a fost alocata");

7
exit(1);
}
printf("Memoria a fost alocata cu succes!!!\n");
printf("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 2:
introducere(C,n);
printf("\nPentru a continua apasati tasta Enter");
getch();
break;
case 3:
printf("Informatii despre elementele tabloului:\n");
citirea(C,n);
getch();
break;
case 4:
printf("Dati denumirea Capitalei cautate:");
fflush(stdin);
gets(d);
k=cautare(C,n,d);
if(k<0)
{
printf("\nCapitala cautata nu a fost gasita.");
}
else
{
printf("\nCapitala cautata este:");
printf("\nDenumire:%s Tara:%s Populatia:%.2f Suprafata:%.2f Primarul:
%s",C[k].den,C[k].tara,C[k].popl,C[k].supr,C[k].primarul);
}
getch();
break;
case 5:
printf("Dati denumirea capitalei:");
fflush(stdin);
gets(d);
k=cautare(C,n,d);
if(k<0)
{
printf("\nCapitala cautata nu a fost gasita");
}
else
{
printf("Capitala cautata este:\n");
printf("Denumire:%s Tara:%s Populatia:%f Suprafata:%f Primarul:
%s\n",C[k].den,C[k].tara,C[k].popl,C[k].supr,C[k].primarul);
redactare(C,k);
}

8
printf("\nPentru a continua apasati tasta Enter");
getch();
break;
case 6:
printf("Alegeti elementele care trebuie de interschimbat:");
scanf("%d%d", &element_1,&element_2);
interschimbarea(C,element_1-1,element_2-1);
printf("Interschimbarea a avut loc\n");
printf("Pentru a continua apasati tasta Enter\n");
getch();
break;
case 7:
sortare(C,n);
printf("\nSortarea s-a efectuat cu succes!\n");
printf("Pentru a continua apasati tasta Enter");
getch();
break;
case 8:
printf("Introduceti informatiile despre noua capitala:\n");
printf("Denumirea capitalei:");
fflush(stdin);
gets(a.den);
printf("\nTara:");
fflush(stdin);
gets(a.tara);
printf("\nPopulatia:");
fflush(stdin);
scanf("%f", &a.popl);
printf("\nSuprafata:");
fflush(stdin);
scanf("%f", &a.supr);
printf("\nPrimarul:");
scanf("%s", &a.primarul );
B=adaugare_sfarsit(C, &n, a);
if(B==NULL)
{
printf("\nAdaugarea elementului la sfirsit nu a avut loc");
}
else
{
printf("\nAdaugarea elementului la sfirsit s-a efectuat cu succes");
C=B;
}

printf("\nPentru a continua apasati tasta Enter");


getch();
break;
case 9:
printf("Introduceti informatiile despre noua capitala:\n");
printf("Denumirea capitalei:");

9
fflush(stdin);
gets(a.den);
printf("\nTara:");
fflush(stdin);
gets(a.tara);
printf("\nPopulatia:");
fflush(stdin);
scanf("%f", &a.popl);
printf("\nSuprafata:");
fflush(stdin);
scanf("%f", &a.supr);
printf("\nPrimarul:");
scanf("%s", &a.primarul );
B=adaugare_inceput(C, &n, a);
if(B==NULL)
{
printf("\nAdaugarea elementului la inceput nu a avut loc");
}
else
{
printf("\nAdaugarea elementului la inceput s-a efectuat cu succes");
C=B;
}

printf("\nPentru a continua apasati tasta Enter");


getch();
break;
case 10:
printf("Denumirea capitalei:");
fflush(stdin);
gets(a.den);
printf("\nTara:");
fflush(stdin);
gets(a.tara);
printf("\nPopulatia:");
fflush(stdin);
scanf("%f", &a.popl);
printf("\nSuprafata:");
fflush(stdin);
scanf("%f", &a.supr);
printf("\nPrimarul:");
scanf("%s", &a.primarul );
B=inserare_dupa(C,&n, a,k);
if(B==NULL)
{
printf("\nInserarea elementului nu a avut loc");
}
else
{
printf("\nInserarea elementului s-a efectuat cu succes");

10
C=B;
}

printf("\nPentru a continua apasati tasta Enter");


getch();
break;
case 11:
printf("Denumirea capitalei:");
fflush(stdin);
gets(a.den);
printf("\nTara:");
fflush(stdin);
gets(a.tara);
printf("\nPopulatia:");
fflush(stdin);
scanf("%f", &a.popl);
printf("\nSuprafata:");
fflush(stdin);
scanf("%f", &a.supr);
printf("\nPrimarul:");
scanf("%s", &a.primarul );
B=inserare_inainte(C,&n, a,k);
if(B==NULL)
{
printf("\nInserarea elementului nu a avut loc");
}
else
{
printf("\nInserarea elementului s-a efectuat cu succes");
C=B;
}

printf("\nPentru a continua apasati tasta Enter");


getch();
break;
case 12:
printf("\nStergeti Capitala:");
fflush(stdin);
gets(d);
k=cautare(C,n,d);
if(k<0)
{
printf("\nAceasta Capitala nu a fost gasita");
}
else
{
B=sterge(C, &n, k);
if(B==NULL)
{
printf("\nStergerea elementului nu a avut loc");

11
}
else
{
printf("\nStergerea elementului s-a efectuat cu succes");
C=B;
}
}
printf("\nPentru a continua apasati tasta Enter");
getch();
break;

case 13:
printf("Dati numele fisierului:");
fflush(stdin);
gets(fname);
f=salvare(C,n,fname);
if(f==1)
printf("\nFisierul a fost salvat cu succes");

else

printf("\nFisierul nu a fost salvat");


printf("\nPentru a continua apasati tasta Enter");
getch();
break;
case 14:
printf("Dati numele fisierului:");
fflush(stdin);
gets(fname);
f=executie(C,n,fname);
if(f==1) printf("\nCitirea din fisier s-a efectuat cu succes");
else printf("\nFisierul pentru a citi info despre studenti nu a fost deschis");
printf("\nPentru a continua apasati tasta Enter");
getch();
break;
case 15:
free(C);
C=NULL;
printf("\nEliberarea memoriei s-a efectuat cu succes");
printf("\nPentru a continua apasati tasta Enter");
getch();
break;
case 0:
printf("Doriti sa iesiti din program? (1/0): ");
scanf("%d", &f);
if(f==1) return 0;
printf("\nPentru a continua apasati tasta Enter");
getch();
break;
default:

12
printf("\nAlegeti optiunea corecta din menu! ");
printf("\nPentru a continua apasati tasta Enter");
getch();
}
}
while(nm=!0);
}

Rezultatele testării și funcţionării programului (screenshot-uri):

Analiza rezultatelor și concluzii:

13
14
15
16
17
Concluzie:

In acest laborator am lucrat asupra implementarii tipului abstract de date „Tablou de


structuri” în limbajul C ,astfel scriind trei fișiere-text în limbajul C pentru implementarea și
utilizarea TAD “Tablou de structuri”:, Fişier antet cu extensia .h, Fişier cu extensia .cpp
sau .c, Functia main().

Bibliografie:
1. Carcea L., Vlas S., Bobicev V. Informatica: Sarcini pentru lucrări de laborator. Chișinău:
UTM, 2005. - 19 p.
2. Conspectul prelegerilor on-line al cursului Programarea Calculatoarelor pentru studenții gr.
CR201, CR-202, CR-203, RM-201, AI-201 (lector: dr., conf. univ. M. Kulev). Chișinău,
UTM, FCIM, 2020.
3. Tutorial in C language. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/
4. http://andrei.clubcisco.ro/cursuri/anul-1/semestrul-1/programarea-calculatoarelor.html 5.
https://www.wolframalpha.com/

18

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