Documente Academic
Documente Profesional
Documente Cultură
RAPORT
A efectuat:
st. gr. AI-191 Țurcanu Adrian
A verificat:
dr., conf.univ. Moraru Dumitru
Chişinău -2020
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.
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:
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.
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:
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.
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
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
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++) {
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);
}
}
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
24
4. Sortarea bazei de date
25
5. Modificarea bazei de date
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/
28