Sunteți pe pagina 1din 25

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Catedra Informatica Aplicată

RAPORT
Lucrarea de laborator nr.1
La Structuri de date si algoritmi

A efectuat:
st. gr. AI-161 Munteanu Petru

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

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

Tema: Implementarea tipului de date abstract “Tablou de structuri” in C.

Scopul lucrării: obtinerea deprinderilor practice de implementare a unui tip de


date abstract (TDA) in limbajul C si anume a TDA “Tablou de structuri”.

Sarcina de lucru: De scris trei fisiere in limbajul C pentru implementarea (2


fisiere) si utilizarea (1 fisier – program cu functia main ) a TDA “Tablou de
structuri”
1. Fişierul antet cu extensia .h care descrie structura elementului tabloului (după varianta) şi
prototipurile funcţiilor care asigură operaţiunile de prelucrare a tabloului de structuri.
2. Fişier cu extensia .cpp (sau .c) care conţine codurile (implementările) tuturor funcţiilor
declarate în fişierul antet.
3. Fişierul utilizatorului - programul cu funcţia main () pentru prelucrarea tabloului de structuri
cu afişarea meniului de opţiuni pe ecran, si anume:
1.alocarea memoriei dinamice pentru tablou,
2.introducerea informaţiei despre elementele tabloului de la tastatura,
3.afişarea informaţiei despre elementele tabloului pe ecran,
4.căutarea elementului tabloului dupa unui cimp al structurei,
5.modificarea câmpurilor elementului tabloului,
6.interschimbarea a 2 elemente tabloului,
7.sortarea elementelor tabloului dupa unui cîmp,
8.adaugarea unui element nou la sfirsitul tabloului,
9.adaugarea unui element nou la îinceputul tabloului,
10.inserarea unui element nou în tabloul la pozitia indicată,
11.stergerea unui element al tabloului,
12.scrierea informaţiei despre elementele tabloului in fişier,
13.citirea informaţiei despre elementele tabloului din fişier,
14.eliberarea memoriei alocate pentru tablou,
15.ieşire din program.

Varianta 10. Stat

Noţiuni teoretice

Structura – este o mulţime de date grupate, conform unei ierarhii, de obicei de tipuri
diferite. Structura poate fi comparată cu tabloul, însă tabloul conţine date de un acelaşi tip,
iar elementele tabloului se accesează cu ajutorul indicilor, pe cînd accesarea componentelor
structurii are o formă specifică. Structura reprezintă un tip de date definit de utilizator prin
utilizarea tipurilor deja existente.

1
Ex.: Utilizind instructiunea typedef si specificator de structura struct putem defeni
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, excepţie 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 carte, un tablou din 10 cărţi şi un pointer spre
student.
Referirea la componentele unei structuri se face utilizînd atît numele structurii cît şi a
componentei respective. Aceasta se realizează printr-o construcţie de forma:

s1.nm = 9.5;
s[i].nm = 8.5;
În cazul pointerilor:

p = &s1;
p->nm = 9.5;
La definirea tipului de strutură este bine de a preciza funcţiile care definesc operaţii cu
datele de tipul structurii. În acest scop variabilele se transmit funcţiilor prin parametri.
Pentru modificarea variabilei ea se transmite prin pointer.

Analiza datelor
Fisierul stat.h :
typedef struct {
char nume[MAX];
char capitala[MAX];
char presedinte[MAX];
int populatia;
int suprafata;
}stat;
stat - este tipul structurii
stat – variabila de tip structura

Câmpurile structurii
nume- acest cimp este destinat pentru denumirea statului, avind lungimea de 1000 caractere
capitala- acest cimp este destinat pentru denumirea capitalei statului , avind lungimea de 1000 caractere

2
presedinte- acest cimp este destinat pentru denumirea presedintelui statului, avind lungimea de 1000
caractere
populatia- acest cimp este destinat pentru numarul populatiei, si pastrarea datelor de tip int
suprafata- acest cimp este destinat pentru suprafata statului, si pastrarea datelor de tip int

stat data();
Această funcție este de tip stat, returneaza o variabila compusa de tip stat.
Ea nu primește parametri.
Variabile locale
data – variabila compusa de tip stat,reprezinta variabila returnabila.

void freem(stat *s);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia elibereaza memoria prin utilizarea functiei free().
Parametri
s – pointer la inceputul tabloului de elemente de tip stat

void read(stat *s,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia introduce datele despre stat de la tastatura
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i – variabila intermediara simpla de tip int

void show(stat *s,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia afiseaza datele despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i – variabila intermediara simpla de tip int

void sorts(stat *s, int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia sorteaza baza de date prin metoda bulelor
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i , k– variabile intermediare simple de tip int
t – variabila intermediara simpla de tip stat

void modify(stat *s,int n);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia este folosita pentru modificarea bazei de date
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
3
Variabile locale
i , val– variabile intermediare simple de tip int
yes – variabila intermediara simpla de tip char

int searchs(stat * s, int n, char *name);


Aceasta functie este de tip int, care returneaza pozitia elementului gasit
Functia este destinata pentru cautarea in baza de date
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
name – pointer de tip char in care este informatia despre denumirea statului de cautat
Variabile locale
i – variabila intermediara simpla de tip int

void delfile(stat *s);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia sterge fisierul in care sunt inregistrate datele despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat

void writef(stat* s, int n,char *fname);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia data inscrie datele despre stat in fisierul “stat.txt”
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – variabila de tip int care reprezinta numarul de elemente in tablou
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit dde functie
Variabile locale
i – variabila intermediara simpla de tip int
f – pointer de tip fisier

stat* readf(stat *s,int *n, char *fname);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data citeste datele despre stat din fisierul “stat.txt”
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit de functie
Variabile locale
k – variabila intermediara simpla de tip char avind lungimea de 1000 caractere
f – pointer de tip fisier

stat *append(stat* s, stat a, int* n);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la sfirsit informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
4
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
a – variabila compusa de tip stat
Variabile locale
i – variabila intermediara simpla de tip int
b– variabila simpla de tip pointer la tabloul de elemente de rip stat

stat *prepend(stat * s, stat a, int* n);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la inceput informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
a – variabila compusa de tip stat
Variabile locale
i – variabila intermediara simpla de tip int
b– variabila simpla de tip pointer la tabloul de elemente de rip stat

void adauga(stat *s, char ch);


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functie data adauga informatie la sfirsitul fisierului
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
ch – variabila simpla de tip char
Variabile locale
f – pointer de tip fisier

stat* del_stat(stat *s,int *n,int poz);


Aceasta functie este de tip stat care returneaza o variabila de tip pointer
Functia data adauga la inceput informatii despre stat
Parametri
s – pointer la inceputul tabloului de elemente de tip stat
n – pointer la o variabila de tip int care reprezinta numarul de elemente in tablou
poz – variabila simpla de tip int ce reprezinta pozitia elementului care urmeaza a fi sters
Variabile locale
i – variabila intermediara simpla de tip int

int main();
s – pointer la inceputul tabloului de elemente de tip stat
a – variabila compusa de tip stat
f – pointer de tip fisier
i – variabila intermediara simpla de tip int
n – variabila de tip int care reprezinta numarul de elemente in tablou
poz – variabila simpla de tip int ce reprezinta pozitia elementului care urmeaza a fi sters
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit de functie
ch – variabila simpla de tip char
name – pointer de tip char in care este informatia despre denumirea statului de cautat
sdelete – variabila compusa , tablou de caractere cu marimea 1000 caractere
optiune – variabila simpla de tip integer , utilizata pentru a stoca decizia utilizatorului in privinta
optiunii

5
Fisierul stat.h
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000

typedef struct {
char nume[MAX];
char capitala[MAX];
char presedinte[MAX];
int populatia;
int suprafata;
}stat;

stat data();
void freem(stat *s);
void read(stat *s,int n);
void show(stat *s,int n);
void sorts(stat *s, int n);
void modify(stat *s,int n);
int searchs(stat * s, int n, char *name);
void delfile(stat *s);
void writef(stat* s, int n,char *fname);
stat* readf(stat *s,int *n, char *fname);
stat *append(stat* s, stat a, int* n);
stat *prepend(stat * s, stat a, int* n);
void adauga(stat *s,char ch);
stat* del_stat(stat *s,int *n,int poz);

Fisierul functions.h
#include "stat.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX 1000

stat data(){
stat a;
printf(" Nume: ");
fflush(stdin);
scanf("%s",&a.nume);
printf(" Capitala: ");
scanf("%s",&a.capitala);
6
printf(" Presedinte: ");
scanf("%s",&a.presedinte);
printf(" Populatia: ");
scanf("%d",&a.populatia);
printf(" Suprafata: ");
scanf("%d",&a.suprafata);
return a;
}
void freem(stat *s){
free(s);
if(s) {
s = NULL;
puts("Memoria a fost eliberata"); }
else {
puts("Memoria a fost anterior eliberata");
}

}
void read(stat *s,int n){
int i;
for(i=0;i<n;i++){
printf(" STAT %i \n",i+1);
printf(" Nume: ");
fflush(stdin);
gets(s[i].nume);
printf(" Capitala: ");
gets(s[i].capitala);
printf(" Presedinte: ");
gets(s[i].presedinte);
printf(" Populatia: ");
scanf("%d",&s[i].populatia);
printf(" Suprafata: ");
scanf("%d",&s[i].suprafata);
}
return;
}
void show(stat *s,int n){
int i;
for(i=0;i<n;i++){
printf(" --- Info despre stat ---\n");
printf(" STAT %i \n",i+1);
printf(" Nume: ");
puts(s[i].nume);
printf(" Capitala: ");
puts(s[i].capitala);
printf(" Presedinte: ");
7
puts(s[i].presedinte);
printf(" Populatia: ");
printf("%d",s[i].populatia);
printf("\n Suprafata: ");
printf("%d\n",s[i].suprafata);

}
}
void sorts(stat *s, int n){
int i,k;
stat t;
for(i=0;i<n;i++){
for(k=0;k<n-1-i;k++){
if(stricmp(s[k].nume,s[k+1].nume)){
t=s[k];
s[k]=s[k+1];
s[k+1]=t;
}
}
}
printf(" In baza de date au avut loc sortari\n Selectati la optiune 2 pentru a
vedea\n");
return;
}
void modify(stat *s,int n){
int i;
char yes='n';
printf("\n Doriti sa modificati datele unui stat?\n Press (Y) for (Yes) or (N) for
(No): ");
int val=0;
scanf("%s",&yes);
while(yes=='Y' || yes=='y'){
val=1;
for(i=0;i<n;i++){
system("CLS");
printf(" STAT %i \n",i+1);
printf(" Nume: ");
puts(s[i].nume);
printf(" Capitala: ");
puts(s[i].capitala);
printf(" Presedinte: ");
puts(s[i].presedinte);
printf(" Populatia: ");
printf("%d",s[i].populatia);
printf("\n Suprafata: ");
printf("%d\n",s[i].suprafata);
8
printf("\n Doriti sa modificati datele?\n Press (Y) for (Yes) or (N) for (No): ");
int val=0;
scanf("%s",&yes);
if(yes=='Y' || yes=='y'){
printf("\n ****************************************\n\n");
printf(" Se modifica STAT %i:\n",i+1);
printf(" Nume: ");
scanf("%s",&s[i].nume);
printf(" Capitala: ");
scanf("%s",&s[i].capitala);
printf(" Presedinte: ");
scanf("%s",&s[i].presedinte);
printf(" Populatia: ");
scanf("%d",&s[i].populatia);
printf(" Suprafata: ");
scanf("%d",&s[i].suprafata);
}
}
}
}
int searchs(stat * s, int n, char name[]){
int i;
for(i=0;i<n;i++) {
if (stricmp(s[i].nume, name)==0){
return i;
}
}
return -1;
}
void delfile(stat *s){
if( remove( "stat.txt" ) != 0 ){
puts( " Eroare la stergere... fisierul nu exista." );}
else{
puts( " Stergere cu succes" );

}
return 0;
}
void writef(stat* s, int n,char *fname){
FILE *f;

int i;
f = fopen("stat.txt","w");

for (i=0;i<n;i++) {

9
fprintf(f,"STAT %i\n Nume: %s\n Capitala: %s\n Presedinte: %s\n Populatia:
%d\n Suprafata:
%d\n",i+1,s[i].nume,s[i].capitala,s[i].presedinte,s[i].populatia,s[i].suprafata);
}

fclose(f);
return;

}
stat* readf(stat *s,int *n,char *fname ){
FILE *f = NULL;
int i;
char k[MAX];
f = fopen("stat.txt","r");
if(f==NULL) {
puts(" Eroare, fisierul nu a fost gasit.");
exit(1);
}
puts( "Informatia citita din fisier\n");
while(fgets(k,"%s", f) != NULL) {
printf(" %s",k);
}
fclose(f);
}

stat *append(stat* s, stat a, int* n) {


int i;
stat *b;
b = (stat*)realloc(s, (*n+1) * sizeof(stat));
if(!b) {
puts (" Nu a fost alocata");
return b;

}
puts(" Introduceti informatia: ");
a=data();
b[*n] = a;
*n = *n+1;
return b;

}
stat *prepend(stat * s, stat a, int* n) {

int i;
10
stat* b;
b = (stat*) realloc(s, (*n+1) * sizeof(stat));
if(!b) {
puts("Memoria nu a fost alocata");
return b; }
puts(" Introduceti informatia: ");
a=data();
for (i=*n;i>0;i--) {
b[i] = b[i-1]; }

b[0] = a;
*n = *n + 1;
return b;
}
void adauga(stat *s,char ch){
FILE *f;
f=fopen("stat.txt","a");
puts(" Scrieti un text. Cu caracterul '.' se incheie");
do{
ch = getchar();
putc(ch,f);}
while (ch !='.');
getchar();
fclose(f);

}
stat* del_stat(stat *s,int *n,int poz){
int i;
for (i = poz;i<*n;i++) {
s[i] = s[i+1]; }
*n=*n-1;

return;

Fisierul main.c
#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX 1000

int main(){
11
FILE *f;
stat *s,a;
int i,n,poz;
char *fname,ch;
char name[MAX];
char sdelete[MAX];
int optiune;
printf("\n >>> Dati numarul de state: ",n);
scanf("%d",&n);
for(i=0;i<n;i++){
s=(stat*)malloc(n*sizeof(stat));
if(!s){
puts("Memoria nu a fost alocata!");
exit(1);
}
}
do{
system("CLS");
puts("\n >>> MENU <<<");
puts(" 1. Introduce datele despre state.");
puts(" 2. Afisarea info despre state.");
puts(" 3. Pentru a sorta baza de date.");
puts(" 4. Pentru a modifica baza de date.");
puts(" 5. Pentru a cauta in baza de date.");
puts(" 6. Pentru a strege fisierul.");
puts(" 7. Sterge stat.");
puts(" 8. Scrierea informatiei despre stat in fisier.");
puts(" 9. Citirea informatiei despre stat din fisier.");
puts(" 10. Scrierea informatiaei la sfirsitul fisierului.");
puts(" 11. Eliberarea memoriei.");
puts(" 12. Adaugarea unui stat la inceput.");
puts(" 13. Adaugarea unui stat la sfirsit.");
puts(" 0. Iesire.");
printf("\n Alegeti optiunea: ");
scanf("%d", &optiune);
switch (optiune){
case 1: {read(s,n);
system("PAUSE");
break;
}
case 2:{show(s,n);
system("PAUSE");
break;
}
case 3:{sorts(s,n);
system("PAUSE");
12
break;
}
case 4:{modify(s,n);
system("PAUSE");
break;
}
case 5:{
printf(" Dati numele statului de cautat: ");
fflush(stdin);
gets(name);
i=searchs(s, n, name);
printf("\n");
printf(" STAT %i\n Nume: %s\n Capitala: %s\n Presedinte: %s\n Populatia:
%d\n Suprafata: %d\n",i+1, s[i].nume, s[i].capitala, s[i].presedinte, s[i].populatia,
s[i].suprafata );
system("PAUSE");
break;
}
case 6:{delfile(s);
system("PAUSE");
break;
}
case 7:{
if (s) {
printf(" Introduceti numele statului de sters: ");
getchar();
gets(sdelete);
del_stat(s, &n, poz);
puts(" Statul si toate caracteristicile lui au fost sterse");
}
system("PAUSE");
break;
}
case 8:{writef(s, n, fname);
puts(" Datele au fost introduse in fisier");
system("PAUSE");
break;
}
case 9:{readf(s, &n, fname);
system("PAUSE");
break;
}
case 10:{adauga(s,ch);
system("PAUSE");
break;
}
13
case 11:{freem(s);
system("PAUSE");
break;
}
case 12:{prepend(s,a,&n);
system("PAUSE");
break;
}
case 13:{append(s,a,&n);
system("PAUSE");
break;
}
case 0:{
printf(" Daca doriti sa iesiti tastati ENTER\n");
return 0;
}
default:{
printf(" Optiunea nu exista!\n");
break;
}

}
}
while(optiune!=14);
getch();
return 0;}

Rezultatele obtinute

1. Meniul programului

14
2. Introducerea datelor despre stat

3. Afisarea informatiei despre stat

15
4. Sortarea bazei de date

16
5. Modificarea bazei de date

17
6. Cautarea in baza de date

18
7. Stergerea fisierului stat.txt
Pe ecran a apurut eroare la stergere deoarece fisieurul stat.txt inca nu a fost creat

8. Stergerea unui stat

19
9. Scrierea datelor in fisierul stat.txt

10. Citirea datelor din fisier

20
11.Scrierea informatiei la sfirsitul fisierului

12.Adaugarea unui stat la inceput

21
13.Adaugarea unui stat la sfirsit

22
14.Eliberarea memoriei

23
15. Iesire

Analiza rezultatelor si concluzii:

1.Verificarea ne arată că programul lucrează corect.


2.Definirea structurilor este foarte practică, întrucât tablourile obișuite pot păstra
date de doar un anumit tip, în timp ce tablourile de structuri, structurile fiind
definite de programator, pot stoca date de orice tip, ce corespunde necesităților
informaționale din viața reală.

Bibliografie:

1. http://curs.algoritmi.ro/2011/02/28/tp-02-structuri-uniuni/
2. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/

24