Sunteți pe pagina 1din 29

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

RAPORT

Lucrarea de laborator nr.1


La Structuri de date si algoritmi

A efectuat:
st. gr. AI-191 Țurcanu Adrian

A verificat:
dr., conf.univ. Moraru Dumitru

Chişinău -2020

Lucrarea de laborator nr.1

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

Scopul lucrării: Obținerea 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 si


utilizarea TDA “Tablou de structuri”:

1. Fişierul antet tablou.h care conține:


a. specificația structurei elementului tabloului (după varianta) şi

1
b. prototipurile funcţiilor care asigură operaţiunile de prelucrare a tabloului de
structuri.
2. Fişierul tablou.cpp sau tablou.c care conţine codurile (implementările) tuturor
funcţiilor declarate în fişierul antet.
3. Fişierul utilizatorului lab1.cpp sau lab1.c care reprezintă un program cu funcţia
main ( ) pentru prelucrarea tabloului de structuri cu afişarea meniului de opţiuni pe
ecran si anume: alocarea memoriei dinamice pentru tabloul de structuri cu n
elemente,
a. introducerea informaţiei despre elementele tabloului de la tastatură,
b. afişarea informaţiei despre elementele tabloului pe ecran,
c. căutarea elementului tabloului după unui cîmp al structurei,
d. modificarea cîmpurilor elementului tabloului,
e. interschimbarea a 2 elemente indicate ale tabloului,
f. sortarea elementelor tabloului după unui cîmp,
g. adăugarea unui element nou la sfîrșitul tabloului,
h. adăugarea unui element nou la începutul tabloului,
i. inserarea unui element nou în tabloul la pozitia indicată,
j. stergerea (eliminarea) unui element din tabloul,
k. scrierea (salvarea) informaţiei despre elementele tabloului în fişier,
l. citirea informaţiei despre elementele tabloului din fişier,
m. eliberarea memoriei dinamice alocate pentru tabloul,
n. ieşire din program.

Varianta 12. Farmacie

2
Noţiuni teoretice

Tipul de date abstract este o entitate manipulata doar prin operatiile ce definesc
acel tip. Avantajele utilizarii tipurilor de date abstracte sunt:

1. Programele devin independente de modul de reprezentare a datelor. Modul


de reprezentare poate fi modificat, fara însa a afecta restul programului (de
exemplu, o multime poate fi implementata printr-un tablou sau printr-o lista
ordonata, dar partea de program ce foloseste operatorii tipului abstract
ramâne neschimbata).
2. Se previne violarea accidentala a datelor. Utilizatorul tipului abstract este
fortat sa manipuleze datele doar prin intermediul operatorilor ce compun
tipul abstract, astfel reducându-se riscul unei distrugeri a datelor.

Dupa cum este exemplificat în continuare, în C tipurile abstracte sunt


realizate folosind fisiere. Acest mod are desigur propriile sale limitari.
Mentionam doar doua din ele: nu se pot defini tablouri de tipuri abstracte si
nu se pot transmite parametri având ca si tip un tip abstract.

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.

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


structura si un nou tip de date student:

3
typedef struct farmacie
{
// definirea cimpurilor (membrilor) structurii
char nume[50];
int nr;
float nm;
} farmacie;

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:

farmacie s1, s2, s[10], *p;

Analiza datelor
Fisierul main.h :
typedef struct {
char farmacia[MAX];
char denumirea[MAX];
char adresa[MAX];
int telefon;
int numarul_de_ore_lucratoare;
int volum_de_medicamente;
farmacia - este tipul structurii
denumirea – variabila de tip structura

Câmpurile structurii
denumirea- acest cimp este destinat pentru denumirea farmaciei , avind lungimea
de 1000 caractere

4
adresa- acest cimp este destinat pentru denumirea adresei farmaciei, avind
lungimea de 1000 caractere
telefon- acest cimp este destinat pentru numarul de telefon de tip int
numarul de ore lucrate- acest cimp este destinat pentru determinarea orelor
lucratoare, si pastrarea datelor de tip int
volumul de medicamente-acest camp este destimat pentru determinarea
volumului total de medicamente din farmacie, de tip integere

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

void freem(farmacie *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 farmacie

void read(farmacie *s,int n);


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

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

void sorts(farmacie *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 farmacie
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 farmacie

void modify(farmacie *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 farmacie
n – variabila de tip int care reprezinta numarul de elemente in tablou
Variabile locale
i , val– variabile intermediare simple de tip int
yes – variabila intermediara simpla de tip char

6
int searchs(farmacie * 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 farmacie
n – variabila de tip int care reprezinta numarul de elemente in tablou
name – pointer de tip char in care este informatia despre denumirea farmaciei de
cautat
Variabile locale
i – variabila intermediara simpla de tip int

void delfile(farmacie *s);


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

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


Aceasta functie este de tip void, care nu returneaza nici o valoare
Functia data inscrie datele despre farmacie in fisierul “stat.txt”
Parametri
s – pointer la inceputul tabloului de elemente de tip farmacie
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

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


7
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 farmacie
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

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


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

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


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

void adauga(farmacie *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 farmacie
ch – variabila simpla de tip char
Variabile locale
f – pointer de tip fisier

farmacie* del_ farmacie (farmacie *s,int *n,int poz);


Aceasta functie este de tip farmacie care returneaza o variabila de tip pointer
Functia data adauga la inceput informatii despre farmacie
Parametri
s – pointer la inceputul tabloului de elemente de tip farmacie
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 farmacie
a – variabila compusa de tip farmacie
f – pointer de tip fisier
i – variabila intermediara simpla de tip int
n – variabila de tip int care reprezinta numarul de elemente in tablou

9
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

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

int main(){
FILE *f;
farmacie *s,a;
int i,n,poz;
char *fname,ch;
char name[MAX];
char sdelete[MAX];
int optiune;
printf("\n >>> Dati numarul de farmacii: ");
scanf("%d",&n);
10
for(i=0;i<n;i++){
s=(farmacie*)malloc(n*sizeof(farmacie));
if(!s){
puts("Memoria nu a fost alocata!");
exit(1);
}
}
do{
system("CLS");
puts("\n >>> MENU <<<");
puts(" 1. Introduce datele despre farmacie.");
puts(" 2. Afisarea info despre farmaciei.");
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 farmacie.");
puts(" 8. Scrierea informatiei despre farmacie in fisier.");
puts(" 9. Citirea informatiei despre farmacie din fisier.");
puts(" 10. Scrierea informatiaei la sfirsitul fisierului.");
puts(" 11. Eliberarea memoriei.");
puts(" 12. Adaugarea unei farmacii la inceput.");
puts(" 13. Adaugarea unei farmacii la sfirsit.");
puts(" 0. Iesire.");
printf("\n Alegeti optiunea: ");
scanf("%d", &optiune);
switch (optiune){
case 1: {read(s,n);
system("PAUSE");
break;
}
11
case 2:{show(s,n);
system("PAUSE");
break;
}
case 3:{sorts(s,n);
system("PAUSE");
break;
}
case 4:{modify(s,n);
system("PAUSE");
break;
}
case 5:{
printf(" Dati numele farmaciei de cautat: ");
fflush(stdin);
gets(name);
i=searchs(s, n, name);
printf("\n");
printf("Denumirea: %s\n Adresa: %s\n Telefon: %d\n Numarul de ore
lucratoare: %d\n Volum de medicamente: %d\n", s[i].denumirea, s[i].adresa,
s[i].telefon, s[i].numarul_de_ore_lucratoare, s[i].volum_de_medicamente );
system("PAUSE");
break;
}
case 6:{delfile(s);
system("PAUSE");
break;
}
case 7:{
if (s) {
printf(" Introduceti numele farmacieice trebuie de sters: ");
12
getchar();
scanf("%d",&poz);
s=del_farmacie(s, &n, poz);
puts(" Farmacia si toate informatiile ei 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;
}
case 11:{freem(s);
system("PAUSE");
break;
}
case 12:{prepend(s,a,&n);
system("PAUSE");
break;
}
case 13:{append(s,a,&n);
system("PAUSE");
13
break;
}
case 0:{
printf("Pentru a iesi din program tastati ENTER\n");
return 0;
}
default:{
printf(" Optiunea nu exista\n");
break;
}

}
}
while(optiune!=14);
getch();
return 0;}
Fisierul function.c
#include "farmacie.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX 1000

farmacie data(){
farmacie a;
printf(" Denumirea: ");
fflush(stdin);
scanf("%s",&a.denumirea);
printf(" Adresa: ");
scanf("%s",&a.adresa);
14
printf(" Telefon: ");
scanf("%d",&a.telefon);
printf(" Numarul_de_ore_lucratoare: ");
scanf("%d",&a.numarul_de_ore_lucratoare);
printf(" Volum_de_medicamente: ");
scanf("%d",&a.volum_de_medicamente);
return a;
}
void freem(farmacie *s){
free(s);
if(s) {
s = NULL;
puts("Memoria a fost eliberata"); }
else {
puts("Memoria a fost anterior eliberata");
}

}
void read(farmacie *s,int n){
int i;
for(i=0;i<n;i++){
printf(" Farmacie %i \n",i+1);
printf(" Denumirea: ");
fflush(stdin);
gets(s[i].denumirea);
printf(" Adresa: ");
scanf("%s",&s[i].adresa);
printf(" Telefon: ");
scanf("%d",&s[i].telefon);
printf(" Numarul_de_ore_lucratoare: ");
scanf("%d",&s[i].numarul_de_ore_lucratoare);
15
printf(" Volum_de_medicamente: ");
scanf("%d",&s[i].volum_de_medicamente);
}
return;
}
void show(farmacie *s,int n){
int i;
for(i=0;i<n;i++){
printf(" --- Info despre farmacie ---\n");
printf(" farmacie %i \n",i+1);
printf(" Denumirea: ");
puts(s[i].denumirea);
printf(" Adresa: ");
puts(s[i].adresa);
printf(" Telefon: ");
printf("%d",s[i].telefon);
printf(" Numarul_de_ore_lucratoare: ");
printf("%d",s[i].numarul_de_ore_lucratoare);
printf("\n Volum_de_medicamente: ");
printf("%d\n",s[i].volum_de_medicamente);

}
}
void sorts(farmacie *s, int n){
int i,k;
farmacie t;
for(i=0;i<n;i++){
for(k=0;k<n-1-i;k++){
if(stricmp(s[k].denumirea,s[k+1].denumirea)){
t=s[k];
s[k]=s[k+1];
16
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(farmacie *s,int n){
int i;
char yes='n';
printf("\n Doriti sa modificati datele unei farmacii?\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(" Farmacie %i \n",i+1);
printf(" Denumirea: ");
puts(s[i].denumirea);
printf(" Adresa: ");
puts(s[i].adresa);
printf(" Telefon: ");
printf("%d",s[i].telefon);
printf(" Numarul_de_ore_lucratoare: ");
printf("%d",s[i].numarul_de_ore_lucratoare);
printf("\n Volum_de_medicamente: ");
printf("%d\n",s[i].volum_de_medicamente);
printf("\n Doriti sa modificati datele?\n Press (Y) for (Yes) or (N) for (No): ");
17
int val=0;
scanf("%s",&yes);
if(yes=='Y' || yes=='y'){
printf("\n ****************************************\n\n");
printf(" Se modifica Farmacia %i:\n",i+1);
printf(" Denumirea: ");
scanf("%s",&s[i].denumirea);
printf(" Adresa: ");
scanf("%s",&s[i].adresa);
printf(" Telefon: ");
scanf("%s",&s[i].telefon);
printf(" Numarul_de_ore_lucratoare: ");
scanf("%d",&s[i].numarul_de_ore_lucratoare);
printf(" Volum_de_medicamente: ");
scanf("%d",&s[i].volum_de_medicamente);
}
}
}
}
int searchs(farmacie * s, int n, char farmacie[]){
int i;
for(i=0;i<n;i++) {
if (stricmp(s[i].denumirea, farmacie)==0){
return i;
}
}
return -1;
}
void delfile(farmacie *s){
if( remove( "farmacie.txt" ) != 0 ){
puts( " Eroare la stergere... fisierul nu exista." );}
18
else{
puts( " Stergere cu succes" );

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

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

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

fprintf(f,"Farmacie %i\n Denumirea: %s\n Adresa: %s\n Telefon: %s\n


Numarul_de_ore_lucratoare: %d\n Volum_de_medicamente:
%d\n",i+1,s[i].denumirea, s[i].adresa, s[i].telefon, s[i].numarul_de_ore_lucratoare,
s[i].volum_de_medicamente);
}

fclose(f);
return;

}
farmacie* readf(farmacie *s,int *n,char *fname ){
FILE *f = NULL;
int i;
char k[MAX];
f = fopen("farmacie.txt","r");
if(f==NULL) {
19
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);
}

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


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

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

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

int i;
farmacie* b;
b = (farmacie*) realloc(s, (*n+1) * sizeof(farmacie));
20
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(farmacie *s,char ch){
FILE *f;
f=fopen("farmacie.txt","a");
puts(" Scrieti un text. Cu caracterul '.' se incheie");
do{
ch = getchar();
putc(ch,f);}
while (ch !='.');
getchar();
fclose(f);

}
farmacie* del_farmacie(farmacie *s,int *n,int poz){
int i;
for (i = poz-1;i<*n;i++) {
s[i] = s[i+1]; }
*n=*n-1;
s = (farmacie*) realloc(s, (*n) * sizeof(farmacie));
return s;
21
}
Fișierul farmacie.h
#ifndef FARMACIE__H
#define FARMACIE__H

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

typedef struct{
char farmacia[MAX];
char denumirea[MAX];
char adresa[MAX];
int telefon;
int numarul_de_ore_lucratoare;
int volum_de_medicamente;
} farmacie;

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

#endif

Rezultatele obtinute

1. Meniul programului

23
2.Introducerea datelor despre farmacie

3. Afisarea informatiei despre farmacie

24
4. Sortarea bazei de date

25
5. Modificarea bazei de date

6. Cautarea in baza de date

7. Stergerea unei farmacii

26
8.Eliberarea memoriei

9. Iesire

Concluzii:
In urma efectuarii lucrarii date am studiat cum sa scrim trei fisiere-text în limbajul
C pentru implementarea si utilizarea TDA “Tablou de structuri”, am invatat noi
notiuni teoretice.

27
Bibliografie:

1) http://labs.cs.upt.ro/labs/pc/html/node49.html
2) http://curs.algoritmi.ro/2011/02/28/tp-02-structuri-uniuni/
3) http://devcentral.iftech.com/learning/tutorials/c-cpp/c/

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ă.

28

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