Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Raport
Lucrare de Laborator Nr.2.
obiectul: Structuri de date i
algoritmi
var 6
FCIM Gr. C-151

Elaborat: Cervac Petru


Verificat: Doctor Confereniar Universitar Luchianov Ludmila
Chiinu 2016

Lucrare de Laborator Nr.2


Tema:Structuri de date.
Scopul Lucrrii: Studierea posibilitilor de lucru a limbajului C
cu structurile de date, fiier i nregistrri.
Varianta Individual

Varianta 6
S se creeze fiierul registrul crilor. S se gseasc specialitatea
pentru care numrul crilor este cel mai mare.
Fiierul registrul crilor
Structura nregistrrii:
Autorul (40 caractere)
Denumirea(80 caractere)
Anul Ediiei(4 caractere)
Specialitatea(40 caractere)
nregistrrile sunt ordonate conform numelor autorilor
Rezolvare:
Fiier - Colecie de date de acelai tip grupate sub un nume i
reprezentate pe un suport (discuri, benzi magnetice etc.).
Structura de date - o colecie de valori eterogene ca tip, stocate ntr-o
zon compact de memorie.
Pentru rezolvarea acestei lucrri de laborator vom avea nevoie s
utilizam ambele tipuri de structuri de date. Dei aceasta lucrare poate fi
rezolvat i fr a utiliza tipul de date definit cu ajutorul cuvntului cheie
struct, utilizarea acestora simplific considerabil prelucrarea datelor i
sistematizarea lor. n acest program sunt definite 2 structuri de date
typedef struct{//este utilizata pentru a prelucrare mai clara a
inregistrarilor din fisier
char autor[40];
char denumirea[80];
char anuleditiei[4];
2

char specialitatea[40];
}carte;
typedef struct{//specialitatile cu un numar maxim de carti
char spec[40];
int cont;
}Specmax;
Structur carte este utilizat pentru
1. nscrierea datelor n fiierul regcarti.txt
2. Citirea datelor din fisierul regcarti.txt pentru prelucrarea lor ulterioar
Structura Specmax este utilizat pentru gsirea specialitii cu numrul
de cri maxim. Am ales o astfel de abordare pentru a analiza i situaia
cnd mai multe specialiti au un numr egal de cri.
n program se utilizeaz 16 funcii standarte i 4 funcii elaborate
personal + funcia main().
Funciile elaborate:
void aranjare(char *file) este utilizata pentru a aranja nregistrrile n
fiierul Regcarti.txt conform numelor autorilor.
void adaugare(char *file) este utilizata pentru a completa fiierul cu
nregistrri noi.
void afishrez(char *file) este utilizat pentru a afia specialitile cu
numrul maxim de cri.
void afishfish(char *file) este utilizat pentru a afia coninutul
fiierului Regcarti.txt.
Funcia main() reprezint un meniu unde utilizatorul prin intermediul
tastaturii poate s aleag 1 din 5 opiuni.
1. Adugarea unei nregistrri noi n fiier
2. Vizualizarea coninutului fiierului
3. tergerea fiierului
4. Gsirea specialitilor cu un numr maxim de cri
5. Ieirea din program

Algoritmii Funciilor:

Listingul Programului:
#include <stdio.h>
//int fclose (FILE *stream);
//int remove( const char * fname );
//int fflush (FILE *stream);
//int fputs(const char *str, FILE *stream);
//int fputc (int sym, FILE *stream);
//char * gets( char * string );
//int printf(const char *format, ...);
//int getchar ( void );
#include <stdlib.h>
//int system( const char * syscom );
//void *malloc (size_t size);
#include <string.h>
//char * strcpy( char * destptr, const char * srcptr );
//char *strtok(char *str, const char *sep);
//int strcmp( const char * string1, const char * string2 );
#include <sys\stat.h>//int stat(char *path, struct stat *buf);
#include <conio.h>//int getch(void)
#include <windows.h>//VOID WINAPI Sleep(_In_ DWORD
dwMilliseconds);
typedef struct{//este utilizata pentru a prelucrare mai clara a
inregistrarilor din fisier
char autor[40];
char denumirea[80];
char anuleditiei[4];
char specialitatea[40];
}carte;
typedef struct{//specialitatile cu un numar maxim de carti
char spec[40];
int cont;
}Specmax;
void aranjare(char *file){//aranjeaza inregistrarile din fisier in ordinea
crescatoare
carte car[50];
carte aux;
char *s=(char *)malloc(sizeof(carte)+5);
char *p;
int cont=1;
FILE *fp;
fp=fopen(file,"r");
while(fgets(s,100,fp)!=NULL){
strcpy(car[cont].autor,p=strtok(s,";"));
strcpy(car[cont].denumirea,p=strtok(NULL,";"));
strcpy(car[cont].anuleditiei,p=strtok(NULL,";"));
strcpy(car[cont].specialitatea,p=strtok(NULL,";"));
cont++;
}
7

fclose(fp);
for(int i=0;i<cont-1;i++)
for(int j=i+1;j<cont;j++)
if(strcmp(car[i].autor,car[j].autor)>0){
aux=car[i];
car[i]=car[j];
car[j]=aux;
}
fp=fopen(file,"w");
for(int i=1;i<cont;i++){
fputs(car[i].autor,fp);fputc(';',fp);
fputs(car[i].denumirea,fp);fputc(';',fp);
fputs(car[i].anuleditiei,fp);fputc(';',fp);
fputs(car[i].specialitatea,fp);fputs(";\n",fp);
}
fclose(fp);
}
void adaugare(char *file){//adauga o inregisrare in fisier
system("cls");
FILE *fp;
carte car;
struct stat buf;
char alg;
if(stat(file,&buf)!=0){
puts("Fisierul a fost creat");
Sleep(1000);
}
fp=fopen(file,"a");
do{
system("cls");
printf("Doriti plasarea unei noi inregistrari in fisier[Y/N]");
alg=getchar();
switch(alg){
case 'Y':
case 'y': goto add;
case 'N':
case 'n': goto iesire;
}
goto pesteadd;
add:
fflush(stdin);
puts("\n\n");
printf("autor:");gets(car.autor); fputs(car.autor,fp);fputc(';',fp);
printf("denumirea:");gets(car.denumirea);
fputs(car.denumirea,fp);fputc(';',fp);
printf("anul editiei:");gets(car.anuleditiei);
fputs(car.anuleditiei,fp);fputc(';',fp);
printf("specialitatea:");gets(car.specialitatea);
fputs(car.specialitatea,fp);fputs(";\n",fp);
puts("\n\ndatele au fost inregistrate");
8

Sleep(600);
pesteadd:;
}while(1);
iesire:
fclose(fp);
aranjare(file);
}
void afishrez(char *file){//afiseaza specialitatile cu un numar maxim de
carti
system("cls");
carte carti[50];
FILE *fp;
char s[100];
char *p;
int cont=0;
if((fp=fopen("txt/regfish.txt","r"))==NULL){
puts("Eroare!! Fisierul nu exista");
system("pause"); return;
}
else{
while(fgets(s,100,fp)!=NULL){
strcpy(carti[cont].autor,p=strtok(s,";"));
strcpy(carti[cont].denumirea,p=strtok(NULL,";"));
strcpy(carti[cont].anuleditiei,p=strtok(NULL,";"));
strcpy(carti[cont].specialitatea,p=strtok(NULL,";"));
cont++;
}
}
Specmax max[50];
int contspec=0;
for(int i=0;i<cont;i++){
for(int j=1;j<contspec;j++){
if(strcmp(carti[i].specialitatea,max[j].spec)==0){
max[j].cont++;
goto et1;
}
}
strcpy(max[contspec].spec,carti[i].specialitatea);
max[contspec].cont=1;
contspec++;
et1:;
}
//puts();
int nr=0;
for(int i=0;i<contspec;i++)
if(nr<max[i].cont) nr=max[i].cont;
puts("Specialitatile la care numarul cartilor este cel mai mare:\n");
for(int i=0;i<contspec;i++)
if(nr==max[i].cont){
9

puts(max[i].spec);
}
printf("\nNumarul de carti la aceste specialitati este:\n%d\n",nr);
//iesire:
system("Pause");
fclose(fp);
}
void afishfish(char *file){//afiseaza continutul fisierului
system("cls");
FILE *fp;
char *s=(char *)malloc(200);
fp=fopen(file,"r");
if((fp)==0)
puts("Eroare! Fisierul nu exista");
else{
printf("\n\n\n\n\n\t\tContinutul fisierului %s\n\n\n",file);
while(fgets(s,200,fp)!=NULL)
printf(s);
fclose(fp);
}
puts("\n\n\n\n\n");
system("pause");
}
int main(){
char alg;
printf("\n\n\n\n\n\n\n\t\t\t\t\tLucrarea de laborator Nr_2\n");
printf("\t\t\t\t\t
La disciplina SDA\n");
printf("\t\t\t\tTema:Structuri de date.Fisiere si
inregistrari\n");
printf("\n\n\n\n\t\tSarcina lucrarii: Sa se creeze fisierul registrul cartilor.
Sa se gaseasca specialitatea \n");
printf("\t\t
pentru care numarul cartilor este cea
mai mare.\n\n\n\n\n");
system("pause");
char file[]="txt/regfish.txt";
do{
system("cls");
printf("\n\n\n\n\n\n\n\t\t\t\t\tMeniu:\n\n\n");
puts("\tTastati [1] pentru a adauga date in fisier");
puts("\tTastati [2] pentru a vizualiza continutul fisierului");
puts("\tTastati [3] pentru a sterge fisierul sursa");
puts("\tTastati [4] pentru a afisa specialitatile cu numarul de carti
maxim");
puts("\tTastati [Esc] pentru a iesi din program");
puts("\n");
alg=getch();
switch(alg){
case '1':adaugare(file);break;
case '2':afishfish(file);break;
case '3':
if(remove(file)==-1)puts("eroare");
else puts("fisierul a fost sters cu succes");
10

Sleep(600);
break;
case '4':
afishrez(file); break;
case 27: exit(1);
}
}while(1);
system("pause");
return 0;
}

Afiarea rezultatelor:

Concluzie:
n aceast lucrare mi-am fcut deprinderi s lucrez cu
irurile de caractere n limbajul de programare C. Am
studiat funciile standart de prelucrare a irurilor de
caractere din limbajul C care fac parte din biblioteca
standart string.h, precum strchr. Am studiat
posibilitile pointerilor de a lucra cu irurile de caractere.

11

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