Sunteți pe pagina 1din 13

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

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

RAPORT
Lucrarea de laborator nr.7
la Programarea Calculatoarelor

A efectuat: Pruteanu Dumitru


St.gr. CR-202

A verificat: Stratulat Ștefan

Chișinău-2020
Lucrarea de laborator nr. 7

Tema: 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.

Sarcina:

Să se scrie trei fișiere-text în limbajul C pentru


implementarea și utilizarea TAD “Tablou de structuri”:

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.
Mersul lucrării:

Noţiuni din teorie şi metodele folosite:


În Programarea calculatoarelor algoritmul este un set finit de operatiuni (actiuni) pentru a rezolva
problema dată la calculator. Există mai multe forme de reprezentare a algoritmilor :
- forma naturală;
- forma grafică;
- pseudocodul;
- programul scris intr-un limbaj de programare.

Algoritm cu structură liniară este caracterizat prin absenţa operaţiunilor de decizie [1].
Structura generală a unui program in limbajul C este urmatoarea [1 ]:
- directivele preprocesorului (după necesitate);
- declarațiile variabelelor globale și a funcțiilor programului (după necesitate);
- codul functiei principale main( );
- codurile altor funcții programului (după necesitate).

Structura funcției în limbajul C [1 ] :


1. Antetul funcției, sau prima linie a codului funcției, care constă din 3 elemente: a) tipul
funcției; b) denumirea funcției; c) lista tipurilor și denumirelor a parametrilor funcției
scrisă
între parantezele rotunde.
2. Corpul funcției scris între acolade { }.

Codul (textul) programului în limbajul C:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct university
{
char denumire[40];
char adresa[40];
int telefon;
int nr_fac;
int nr_std;
} university;

void readArrayOfuniversitys(university *S, int n);


int searchuniversity(university*S,int n,char* num);
void sortuniversitys(university *S, int n);
void modifyuniversity(university*S, int k);
university* appenduniversity(university* S, int *pn,university a);
university* deleteuniversity(university* S, int *pn,int k);
university* insertuniversity(university* S, int *pn,university a,int k);
void showArrayOfuniversitys(university *S, int n);
int save(university* S, int n, char *fname);
int load(university* S, int n, char* fname);

int main()
{
university *S,*B, a;
char num[40], fname[40];
char adr[40], fadr[40];
int n,nm,f, k;
while(1) // for(;;)
{
system("cls");
puts("\t MENU:");
puts("1. Alocarea dinamica a memoriei p/u tabl. de structuri");
puts("2. Introducerea elementelor tabloului de la tastatura");
puts("3. Cautarea elementului tabloului");
puts("4. Sortarea elementelor tabloului (conform variantelor)");
puts("5. Redactarea elementului tabloului");
puts("6. Adaugarea unui element nou la sfirsit");
puts("7. Eliminarea elementului indicat din tablou ");
puts("8. Inserarea unui element nou ");
puts("9. Salvarea elementelor tabloului in fisier ");
puts("10. Citirea elementelor tabloului din fisier ");
puts("11. Extragerea elementelor tabloului la ecran ");
puts("12. Eliberarea memoriei alocate pentru tablou ");
puts("0. Iesire din program ");

printf("\nAlegeti optiunea din menu: ");


scanf("%d", &nm);

switch(nm)
{
case 1:
printf("Dati numarul de universitati: ");
scanf("%d", &n);

S= (university*)malloc(n*sizeof(university));
if(S==NULL) {
puts("Memoria nu a fost alocata");
exit (1);
}
puts("Memoria a fost alocata cu succes");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 2:
puts("Dati info despre universitati: ");
readArrayOfuniversitys(S,n);
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 3:
puts("Dati denumirea universitatii de cautat:");
fflush(stdin);
gets(num);
k=searchuniversity(S,n,num);
if(k<0)
{puts("Universitatea cautata nu a fost gasita in tablou ");
}
else
{ puts("Info despre universitati: ");
printf("denumire: %s telefonul: %d Numarul de facultati: %d Numarul de studenti:
%d\n",S[k].denumire,S[k].adresa,S[k].telefon,S[k].nr_fac,S[k].nr_std);
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 4:
sortuniversitys(S, n);
puts("Sortaea s-a efectuat cu succes");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 5:
puts("Dati denumirea univarsitatii ce trebuie modificata:");
fflush(stdin);
gets(num);
k=searchuniversity(S,n,num);
if(k<0)
{puts("Universitatea cautata nu a fost gasita in tablou ");
}
else
{ puts("Info despre universitate: ");
printf("denumire: %s adresa: %s telefonul: %d Numarul de facultati: %d Numarul de
studenti: %d\n",S[k].denumire,S[k].adresa,S[k].telefon,S[k].nr_fac,S[k].nr_std);
modifyuniversity(S, k);
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 6:
puts("Dati info despre universitatea ce trebuie adaugata:");
printf("Dati denumirea universitatii: ");
fflush(stdin);
gets(a.denumire);
printf("Dati adresa universitatii: ");
fflush(stdin);
gets(a.adresa);
printf("Dati numarul de telefon : ");
scanf("%d", &a.telefon );
printf("Dati numarul de facultati: ");
scanf("%d", &a.nr_fac );
printf("Dati numarul de studenti: ");
scanf("%d", &a.nr_std );
B=appenduniversity(S, &n, a);
if(B==NULL){puts("Adaugarea elementului la sfirsit nu a avut loc");
}
else{
puts("Adaugarea elementului la sfirsit s-a efectuat cu succes");
S=B;
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 7: puts("Dati denumirea universitatii ce trebuie stearsa:");
fflush(stdin);
gets(num);
k=searchuniversity(S,n,num);
if(k<0)
{puts("Universitatea ce trebuie stearsa nu a fost gasita in tablou ");
}
else
{ puts("Info despre universitate: ");
printf("denumire: %s adresa: %s telefonul: %d Numarul de facultati: %d Numarul de
studenti: %d\n",S[k].denumire,S[k].adresa,S[k].telefon,S[k].nr_fac,S[k].nr_std);
B=deleteuniversity(S, &n, k);
if(B==NULL){puts("Stergerea elementului nu a avut loc");
}
else{
puts("Stergerea elementului s-a efectuat cu succes");
S=B;
}
}
puts("Pentru a continua apasati tasta Enter");
getch();
break;

case 8: puts("Dati info despre universitatea ce trebue inserata:");


printf("Dati numele universitatii: ");
fflush(stdin);
gets(a.denumire);
printf("Dati adresa universitatii: ");
fflush(stdin);
gets(a.adresa);
printf("Dati numarul de telefon: ");
scanf("%d", &a.telefon );
printf("Dati numarul de facultati: ");
scanf("%d", &a.nr_fac );
printf("Dati numarul de studenti: ");
scanf("%d", &a.nr_std );
printf("Dati pozitia de inserare: ");
scanf("%d", &k);
B=insertuniversity(S, &n, a,k-1);
if(B==NULL){puts("Inserarea elementului nu a avut loc");
}
else{
puts("Inserarea elementului s-a efectuat cu succes");
S=B;
}

puts("Pentru a continua apasati tasta Enter");


getch();
break;
case 9:
puts("Dati denumirele fisierului:");
fflush(stdin);
gets(fname);
f=save(S,n,fname);
if(f==1) puts("Citirea din fisier s-a efectuat cu succes");
else puts("Fisierul pentru a citi info despre universitati nu a fost deschis");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 10:
puts("Dati numele fisierului:");
fflush(stdin);
gets(fname);
f=load(S,n,fname);
if(f==1) puts("Citirea din fisier s-a efectuat cu succes");
else puts("Fisierul pentru a citi info despre universitati nu a fost deschis");
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 11:
puts("Info despre universitati: ");
showArrayOfuniversitys(S, n);
puts("Pentru a continua apasati tasta Enter");
getch();
break;
case 12:
free(S);
S=NULL;
puts("Eliberarea memoriei s-a efectuat cu succes");
puts("Pentru 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;
puts("Pentru a continua apasati tasta Enter");
getch();
break;
default: puts("Alegeti optiunea corecta din menu! ");
puts("Pentru a continua apasati tasta Enter");
getch();
} // end switch

} // end while
}

void readArrayOfuniversitys(university *S, int n)


{
int i;
for(i=0;i<n; i++)
{
printf("university %d:\n ", i+1);
printf("Dati denumirea universitatii: ");
fflush(stdin);
gets(S[i].denumire);
printf("Dati adresa universitatii: ");
fflush(stdin);
gets(S[i].adresa);
printf("Numarul de telefon: ");
scanf("%d", &S[i].telefon);
printf("Numarul de facultati: ");
scanf("%d", &S[i].nr_fac);
printf("Numarul de studenti: ");
scanf("%d", &S[i].nr_std);
}
return;
}

int searchuniversity(university*S,int n,char* num)


{
int i;
for(i=0; i<n; i++)
{
if(strcmp(S[i].denumire, num)==0)
{
return i;
}
}
return -1;
}

void sortuniversitys(university *S, int n)


{
int i,k;
university t;
for(i=0; i<n;i++)
{
for(k=0;k<n-1-i;k++)
{
if(stricmp(S[k].denumire,S[k+1].denumire)>0)
{
t=S[k];
S[k]=S[k+1];
S[k+1]=t;
}
}
}
return;
}

void showArrayOfuniversitys(university *S, int n)


{
int i;
for(i=0;i<n;i++)
{
printf("%d. denumire: %s adresa: %s telefonul: %d Numarul de facultati: %d Numarul de
studenti: %d\n",i+1,S[i].denumire,S[i].adresa,S[i].telefon,S[i].nr_fac,S[i].nr_std);
}
return;
}

void modifyuniversity(university*S, int k)


{
int f;
printf("De modificat denumirile universitatilor? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati numele universitatii:");
fflush(stdin);
gets(S[k].denumire);
}
{
printf("Dati adresa universitatii:");
fflush(stdin);
gets(S[k].adresa);
}
printf("De modificat numarul detelefon? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati numarul de telefon:");
scanf("%d", &S[k].telefon);
}
printf("De modificat nota media? (1/0): ");
scanf("%d", &f);
if(f!=0)
{
printf("Dati numarul de facultati:");
scanf("%d", &S[k].nr_fac);
}
{
printf("Dati numarul de studenti:");
scanf("%d", &S[k].nr_std);
}
return;
}
university* appenduniversity(university* S, int *pn,university a)
{
university * B;
B=(university*)realloc(S,((*pn)+1)*sizeof(university));
if(B==NULL) {return B;}
B[*pn]= a;
*pn=*pn+1;
return B;
}

university* deleteuniversity(university* S,int *pn, int k)


{
university *B;
int i;
for(i=k; i<*pn-1; i++)
{
S[i]=S[i+1];
}
B=(university*)realloc(S,((*pn)-1)*sizeof(university));
if(B==NULL) {return B;}
*pn=*pn-1;
return B;
}

university* insertuniversity(university* S, int *pn,university a,int k)


{
university * B;
int i;
B=(university*)realloc(S,((*pn)+1)*sizeof(university));
if(B==NULL) {return B;}
for(i=*pn-1; i>=k;i--)
{
B[i+1]=B[i];
}
B[k]=a;
*pn=*pn+1;
return B;
}

int save(university* S, int n, char *fname)


{
FILE *fp;
int i;
fp=fopen(fname,"w");
if(fp==NULL){ return 0;}
for(i=0; i<n; i++)
{
fprintf(fp, "%s %s %d %d %d\n",
S[i].denumire,S[i].adresa,S[i].telefon,S[i].nr_fac,S[i].nr_std);
}
fclose(fp);
return 1;
}

int load(university* S, 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%d%d%d",
S[i].denumire,S[i].adresa,&S[i].telefon,&S[i].nr_fac,&S[i].nr_std);
}
fclose(fp);
return 1;

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

Rezultatele obtinute:
Analiza rezultatelor și concluzii:
In lucrarea de laborator numarul 5 am prelucrarat tablourile de structuri şi am lucrat cu fişierele
în limbajul C.
Aceasta lucrare m-a ajutat sa inteleg mai bine functionarea limbajului C si a functiilor de operare
cu structurile si fisierele.
Această lucrare, pot spune că a fost foarte interesantă și foarte utilă pentru mine.

Bibliografie:

1. Conspectul prelegerilor on-line al cursului Programarea Calculatoarelor pentru studenții gr.


CR-201, CR-202, CR-203, RM-201, AI-201 (lector: dr., conf. univ. M. Kulev). Chișinău,
UTM, FCIM, 2020.
2. Tutorial in C language. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/
3. https://www.wolframalpha.com/

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