RAPORT
Lucrarea de laborator nr.9
la Programarea Calculatoarelor(SDA)
A efectuat:
st. gr. CR-213 Gusanu Ovidiu
A verificat:
asist. univ. C.Tincu
Chişinău -2021
MO
Lucrarea de laborator nr.9
4. Fişier antet cu extensia .h, care conține specificarea structurii de date a elementului listei
simplu înlănțuite (conform variantelor) şi prototipurile funcţiilor de prelucrare a listei.
5. Fişier cu extensia .cpp sau .c, care conține implementările funcţiilor (codurile funcţiilor)
declarate în fişierul antet.
6. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea listei cu afişarea la ecran a
următorului meniu de opţiuni:
Mersul lucrării:
Funcția strtok caută lexeme în șir. O secvență de apeluri la această funcție descompune șirul de
caractere în token-uri, care sunt secvențe de caractere separate prin caractere delimitate.
Funcția bibliotecii C char *gets(char *str) citește o linie din stdin și o stochează în șirul indicat de
str. Se oprește atunci când este citit fie caracterul de nouă linie, fie când se ajunge la sfârșitul
fișierului, oricare dintre acestea survine primul.
date de intrare:
elem *S,*B,*K;
elem*c, *p;
char* v[10];
int n,nr,f;
char* t="s";
elem*c;
int i;
//cinema.h
typedef struct{
char name[100];
char adresa[100];
char phone[100];
int pret;
int loc;
}Cinema;
typedef struct{
char name[100];
char adresa[100];
char phone[100];
int pret;
int loc;
}Cinema2;
int Menu();
void Alocare();
void Citire();
void Afisare();
void Cautare();
void Modificare();
void Swap();
void Sort();
int Sort_Case(int x,int d,Cinema B,Cinema NextB);
void Adaugare_Sfarsit();
void Adaugare_Inceput();
void Insert_Dupa();
void Insert_Inainte();
void Stergere();
void Save_File();
void Read_File();
int isEmpty();
void Free_Memory();
void LastAdress();
void Listlenght();
void Adresa();
MO
//void Split ()
cinema.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "cinema.h"
int n,n2,afisare=0;
Cinema* cinema=NULL;
Cinema2* cinema2=NULL;
int Menu()
{
int option;
system("pause");
system("cls");
printf("\t\t\t\t\t\tMeniu:\n");
printf("\n 1.Alocarea dinamica a memoriei pentru tablou. ");
printf("\n 2.Introducerea informatiei despre elementele tabloului de la tastatura. ");
printf("\n 3.Afisarea informatiei despre elementele tabloului la ecran. ");
printf("\n 4.Cautarea elementului in tablou.");
printf("\n 5.Modificarea campurilor a unui element din tablou");
printf("\n 6.Determinarea adresei ultimului element din lista");
printf("\n 7.Determinarea lungimii listei (numarul de elemente). ");
printf("\n 8.Interschimbarea a doua elemente indicate în lista.");
printf("\n 9.Sortarea listei");
printf("\n 10.Adaugarea unui element nou la sfarsitul listei");
printf("\n 11.Adaugarea unui element nou la inceputul listei");
printf("\n 12.Inserarea unui element nou dupa elementul indicat al listei ");
printf("\n 13.Inserarea unui element nou inaintea elementului indicat în lista.");\
printf("\n 14.Stergerea elementului indicat in lista");
printf("\n 15.Divizarea listei in doua liste ----nefinisat");
printf("\n 16.Unirea a doua liste. ----- nefinisat");
printf("\n 17.Salvarea informatiei despre elementele listei în fisier");
printf("\n 18.Citirea informatiei despre elementele listei din fisier.");
printf("\n 19.Eliberarea memoriei alocate pentru lista. ");
printf("\n 0.Iesire din program.");
printf("\nAlegeti o optiune : ");scanf("%d",&option);
return option;
}
//Alocarea memeorie
void Alocare()
{
printf("\nIndicati nr. de cinemauri : ");scanf("%d",&n);
cinema=(Cinema*)calloc(n,sizeof(Cinema));
if(cinema==NULL)
{
printf("\nNu s-a reusit alocarea memoriei");
exit(-1);
}
}
//Introducerea elementelor
void Citire()
{
if(afisare)
MO
{ printf("\nIntroducerea informatiei de la tastatura a fost realizata deja!\n");return;}
if(n){
for(int i=0;i<n;i++)
{
printf("\nIntrodu datele pentru Cinemaul nr.%d :\n",i+1);
printf("Denumirea : ");fflush(stdin);gets(cinema[i].name);
printf("Adresa : ");fflush(stdin);gets(cinema[i].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[i].phone);
printf("Pret bilet: ");scanf("%d",&cinema[i].pret);
printf("Numarul de locuri: ");scanf("%d",&cinema[i].loc);
}
afisare = 1;}
else
printf("\nMemoria nu a fost alocata!\n");
}
//Afisarea elementelor
void Afisare(){
if(afisare){
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
for(int i=0;i<n;i++)
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i+1,cinema[i].name,cinema[i].adresa,cinema[i].phone,cinema[i].pret,cinema[i].loc);
}
else
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce afisa!\n");
}
//Cautarea elementului
void Cautare()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce cauta!\n");return;}
int gasit=0;
char cautat[100];
printf("\nIndica denumirea cinemaului pe care il cautati : ");fflush(stdin);gets(cautat);
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
for(int i=0;i<n;i++)
{
if(strcmp(cinema[i].name,cautat)==0){
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i+1,cinema[i].name,cinema[i].adresa,cinema[i].phone,cinema[i].pret,cinema[i].loc);
gasit=1;
}}
if(!gasit)
printf("Nu s-a gasit aceast cinema.\n");
}
//Modificarea
void Modificare()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem ce modifica!\n");return;}
Afisare();
int m;
MO
do{
printf("\nIndica nr. cinemaului care trebuie modificat : ");scanf("%d",&m);
if(m<1||m>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(m<1||m>n);
m--;
char ans='y';
while(ans!='n'){
system("cls");
int option;
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",m+1,cinema[m].name,cinema[m].adresa,cinema[m].phone,cinema[m].pret,cinema[m].loc);
do{
printf("Ce doriti sa modificam?\n");
printf("1.Denumirea\n");
printf("2.Adresa\n");
printf("3.Telefonul\n");
printf("4.Pret bilet\n");
printf("5.Nr. de locuri\n");
scanf("%d",&option);
if(option<1||option>5)
printf("Alege o optiune de lista!\n");
} while(option<1||option>5);
switch (option)
{
case 1 : printf("Denumirea : ");fflush(stdin);gets(cinema[m].name);break;
case 2 : printf("Adresa : ");fflush(stdin);gets(cinema[m].adresa);break;
case 3 : printf("Telefonul : ");fflush(stdin);gets(cinema[m].phone);break;
case 4 : printf("Pret bilet : ");scanf("%d",&cinema[m].pret);break;
case 5 : printf("Numarul de locuri : ");scanf("%d",&cinema[m].loc);break;
}
printf("Continuam modificarile?(y/n) ");
ans=getch();
}
}
//Interschimbul elementelor
void Swap()
{
if(!afisare){
printf("\nElementele nu au fost initializate!\n");return;}
int Element,nextElement;
Afisare();
printf("\nIndica nr. cinemaurilor ce urmeaza a fi interschimbate : \n");
do{
printf("Cinema 1:");scanf("%d",&Element);
if(Element<1||Element>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(Element<1||Element>n);
do{
printf("Cinema 2: ");scanf("%d",&nextElement);
if(nextElement<1||nextElement>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(nextElement<1||nextElement>n);
MO
int option,d;
printf("1.Sortarea Crescator/A-Z\n");
printf("2.Sortarea Descrescator/Z-A.\n");
scanf("%d",&option);
do{
switch (option)
{
case 1 : d=1; break;
case 2 : d=-1; break;
default : printf("Alege o optiune din lista\n");break;
}}while(option!=1 && option!=2);
int sort;
do
{
sort=0;
for(int i=0;i<n-1;i++)
{
if(Sort_Case(x,d,cinema[i],cinema[i+1])){//Compartimentul,directia,elementul curent,elementul
succesor
Cinema temp=cinema[i];
cinema[i]=cinema[i+1];
cinema[i+1]=temp;
sort=1;}
}
} while (sort);
}
int Sort_Case(int x,int d,Cinema B,Cinema NextB)
{
switch (x)
{
MO
case 1 : return stricmp(B.name,NextB.name)==d; break;
case 2 : return stricmp(B.adresa,NextB.adresa)==d; break;
case 3 : return stricmp(B.phone,NextB.phone)==d; break;
case 4 : return d==1 ? B.pret>NextB.pret : B.pret<NextB.pret ;break;
case 5 : return d==1 ? B.loc>NextB.loc : B.loc<NextB.loc ;break;
}
}
void Adaugare_Sfarsit()
{
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",n);
printf("Denumirea : ");fflush(stdin);gets(cinema[n-1].name);
printf("Adresa : ");fflush(stdin);gets(cinema[n-1].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[n-1].phone);
printf("Pret bilet : ");scanf("%d",&cinema[n-1].pret);
printf("Numarul de locuri : ");scanf("%d",&cinema[n-1].loc);
afisare=1;
}
void Adaugare_Inceput()
{
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
for(int i=n-1;i>=1;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",1);
printf("Denumirea : ");fflush(stdin);gets(cinema[0].name);
printf("Adresa : ");fflush(stdin);gets(cinema[0].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[0].phone);
printf("Pret bilet : ");scanf("%d",&cinema[0].pret);
printf("Numarul de locuri : ");scanf("%d",&cinema[0].loc);
afisare=1;
}
//Inserarea elementului nou dupa un element
void Insert_Dupa()
{
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem unde insera!\n");return;}
Afisare();
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
int Element;
printf("\nIndica Nr. cinemauri dupa care sa inseram un element nou : ");scanf("%d",&Element);
for(int i=n-1;i>=Element;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru Cinemaul nr. %d :\n",Element+1);
printf("Denumirea : ");fflush(stdin);gets(cinema[Element].name);
printf("Adresa : ");fflush(stdin);gets(cinema[Element].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[Element].phone);
printf("Numarul de facultati : ");scanf("%d",&cinema[Element].pret);
printf("Numarul de Studenti : ");scanf("%d",&cinema[Element].loc);
}
//Inserarea elementului nou inainte de un element
void Insert_Inainte()
{
MO
if(!afisare){
printf("\nIntroducerea informatiei de la tastatura nu a fost realizata! Nu avem unde insera!\n");return;}
Afisare();
n++;
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
int Element;
printf("\nIndica Nr. de cinemauri dupa care sa inseram un element nou : ");scanf("%d",&Element);
for(int i=n-1;i>=Element-1;i--)
cinema[i]=cinema[i-1];
printf("\nIntrodu datele pentru cinemaul nr. %d :\n",Element);
printf("Denumirea : ");fflush(stdin);gets(cinema[Element-1].name);
printf("Adresa : ");fflush(stdin);gets(cinema[Element-1].adresa);
printf("Telefonul : ");fflush(stdin);gets(cinema[Element-1].phone);
printf("Numarul de facultati : ");scanf("%d",&cinema[Element-1].pret);
printf("Numarul de Studenti : ");scanf("%d",&cinema[Element-1].loc);
}
//Eliminarea unui element
void Stergere()
{
Afisare();
int nr;
printf("\nIndica nr. cinemaului care trebuie sters: ");scanf("%d",&nr);nr--;
for(int i=nr;i<n-1;i++)
cinema[i]=cinema[i+1];
n--;
if(n==0)
Free_Memory;
else
cinema=(Cinema*)realloc(cinema,n*sizeof(Cinema));
}
//Salvarea informatiei in fisier
void Save_File()
{
FILE *f;
f=fopen("Cinema.txt","w");
fwrite(&n,sizeof(int),1,f);
for(int i=0;i<n;i++)
fwrite(&cinema[i],sizeof(Cinema),1,f);
fclose(f);
}
//Citirea informatiei din fisier
void Read_File()
{
if(isEmpty()){
printf("\nFisierul este gol. Nu avem ce citi!\n");
return;
}
FILE *f;
int nr;
Cinema cinemaFile;
f=fopen("Cinema.txt","r");
fread(&nr,sizeof(int),1,f);
printf("\n|=========================================== Cinema
===========================================|\n");
printf("|Nr.| Denumirea| Adresa| Telefon| Pret bilet| Nr. de locuri|\n");
MO
for(int i=1;i<=nr;i++){
fread(&cinemaFile,sizeof(Cinema),1,f);
printf("|%3d|%20s|%20s|%20s|%20d|%20d|\
n",i,cinemaFile.name,cinemaFile.adresa,cinemaFile.phone,cinemaFile.pret,cinemaFile.loc);}
fclose(f);
}
//Verificarea fisierului
int isEmpty(){
int end,begin;
FILE *f;
f=fopen("Cinema.txt","r");
fseek(f,0,SEEK_END);
end=ftell(f);
fseek(f,0,SEEK_SET);
begin=ftell(f);
fclose(f);
if (end==begin)
return 1;
else
return 0;
}
//Eliberarea memoriei
void Free_Memory()
{
if(cinema!=NULL)
free(cinema);
n=0;
afisare=0;
printf("\nMemoria a fost eliberata\n");
}
void Listlenght()
{
void Adresa()
{
printf("\n Adresa ultimei structuri este:%p\n",*cinema);
// printf("%p\n", void *&Cinema);
}
/*
void Split ()
{
n2=n/2;
n3=n-n2;
cinema2=(Cinema2*)calloc(n2,sizeof(Cinema2));
if(cinema==NULL)
{
printf("\nNu s-a reusit alocarea memoriei");
MO
exit(-1);
}
for (i<n;i<n3;i--)
{
Cinema2[i]=Cinema[i];
Cinema[i]=NULL;
}
*/
/*
{
if(!afisare){
printf("\nElementele nu au fost initializate!\n");return;}
int Element,nextElement;
Afisare();
printf("\nIndica nr. cinemaurilor ce urmeaza a fi interschimbate : \n");
do{
printf("Cinema 1:");scanf("%d",&Element);
if(Element<1||Element>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(Element<1||Element>n);
do{
printf("Cinema 2: ");scanf("%d",&nextElement);
if(nextElement<1||nextElement>n)
printf("Acest nr. nu se afla pe lista. Mai incearca!\n");
}while(nextElement<1||nextElement>n);
Lab3.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "cinema.cpp"
int main()
{
int x;
do{
x=Menu();
switch (x)
{
case 1 : Alocare();break;
case 2 : Citire();break;
case 3 : Afisare();break;
case 4 : Cautare();break;
MO
case 5 : Modificare();break;
case 6 : Adresa();break; //modifica || Determinarea adresei ultimului element din listă.
case 7 : Listlenght();break;
case 8 : Swap();break;
case 9 : Sort();break;
case 10: Adaugare_Sfarsit();break;
case 11: Adaugare_Inceput();break;
case 12: Insert_Dupa();break;
case 13: Insert_Inainte();break;
case 14: Stergere();break;
// case 15: Split ();break;
case 16: //unirea a doua liste
case 17: Save_File();break;
case 18: Read_File();break;
case 19 : Free_Memory();break;
case 0 : printf("Executia programului s-a incheiat!\n");free(cinema);break;
default:printf("\nSelecteaza o optiune din menu\n");break;
}
}while(x);
return 0;
}