Sunteți pe pagina 1din 24

Ministerial Educeiței, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică și Microelectronică
Departamentul Informatică și Ingineria Sistemelor

Raport
Laborator nr. 1
Tema: Structura – mecanism de abstractizare
Disciplina: ,,Programare orientată pe obiecte”

A elaborat: st. gr. IA-191, Didic Victor


A verificat: asis. univ. Mamolea Igor

Chișinău-2020
Varianta 12
а) Să se creeze tipul abstract de date (structura) – fişier, care are denumire, data şi timpul creării
şi dimensiunea. Să se definească funcţiile de setare, de modificare a datelor, de comparare.
Pentru crearea cîmpurilor textuale să se utilizeze operatorul new. Să se elibereze memoria. În
main să se exemplifice sortarea fişierelor după cîteva criterii.
b) Să se creeze tipul abstract de date (structura) – vector, care are pointer spre float şi numărul
de elemente. Să se definească funcţiile de iniţializare, de eliminare a vectorului, de
setare/modificare a dimensiunii, de acces la elementele vectorului, de calcul a sumei
elementelor pare ale vectorului. Ca exemplu, în funcţia main, să se realizeze căutarea poziţiei
elementului minimal al vectorului.

a)
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct fisier
{
char *denumire;
char *data;
int dimensiunea;
fisier()
{
denumire= NULL;
data= NULL;
dimensiunea = 0;
}
};
void atribuire(fisier *p, char *denumire_main, int dimensiune_main, char *data_main)
{
p->denumire= new char[strlen(denumire_main)+1];
strcpy(p->denumire,denumire_main);

p->dimensiunea=dimensiune_main;
p->data= new char[strlen(data_main)+1];
strcpy(p->data,data_main);
}
void afisare(fisier *p,int i)
{
if((p->denumire) && (p->dimensiunea) && (p->data) )
{
cout<<"Nr. fis. "<< i+1<<endl;
cout<<"File name: "<<p->denumire<<endl;
cout<<"Size of file: "<<p->dimensiunea<<" KB"<<endl;
cout<<"Created date: "<<p->data<<endl;
cout<<"\n\n\n\n";
}
}
int main()
{
int op, n, dimensiune_main;
char *denumire_main, *data_main;
int nr_fis = 0;
denumire_main = new char[150];
data_main = new char[150];
fisier sursa[300];
fisier *fisier;

while(1)
{
cout<<" ---------------------------"<<endl;
cout<<" |1. Introducerea date |"<<endl;
cout<<" |2. Afisarea fisierelor |"<<endl;
cout<<" |3. Compararea fisierelor |"<<endl;
cout<<" |4. Modificarea datelor |"<<endl;
cout<<" |5. Sortare fisierelor |"<<endl;
cout<<" |6. Exit |"<<endl;
cout<<" ---------------------------"<<endl;
cout<<"--> ";
cin>>op;

switch(op)
{
case 1:
{
cout<<"Introdu nr de fisiere: ";
cin>>n;
nr_fis= nr_fis + n;
for(int i=0; i<nr_fis; i++)
{
cout<<"<-- Nr fisier "<< i+1<<"-->" <<endl;
cout<<"Denumierea fisier: ";
cin>>denumire_main;
cout<<"Marimea in KB: ";
cin>>dimensiune_main;
cout<<"Data crearii: ";
cin>>data_main;
atribuire(&sursa[i], denumire_main, dimensiune_main, data_main);
}
}
break;
case 2:
{
for(int i=0; i<nr_fis; i++)
{
afisare(&sursa[i],i);
}
}
break;
case 3:
{
int first, second;
for(int i=0; i<nr_fis; i++)
{
afisare(&sursa[i],i);
}
cout<<"\n\n\n";
cout<<"Introdu numerele fisierelor pe care doriti sa le comparati in memorie"<<endl;
cout<<"Nr. primului fisier--> ";
cin>>first;
cout<<"\n";
cout<<"Nr. al doilea fisier--> ";
cin>>second;
if(sursa[first-1].dimensiunea > sursa[second-1].dimensiunea)
{
cout<<"Fisierul: "<<sursa[first-1].denumire<<" are un volum de date mai mare decat fisierul:
"<<sursa[second-1].denumire<<endl;
}
else if(sursa[first-1].dimensiunea < sursa[second-1].dimensiunea)
{
cout<<"Fisierul: "<<sursa[second-1].denumire<<" are un volum de date mai mare decat
fisierul: "<<sursa[first-1].denumire<<endl;
}
else if(sursa[first-1].dimensiunea == sursa[second-1].dimensiunea)
{
cout<<"Fisierele au un volum de date la fel.";
}
}
break;
case 4:
{
int change;
for(int i=0; i<nr_fis; i++)
{
afisare(&sursa[i],i);
}
cout<<"Modificarea fisierului\n";
cout<<"Nr. fisier care trebuie modificat---> ";
cin>>change;
cout<<"Introduceti datele corecte\n";
cout<<"Denumierea fisier: ";
cin>>denumire_main;
cout<<"Marimea in KB: ";
cin>>dimensiune_main;
cout<<"Data crearii: ";
cin>>data_main;
atribuire(&sursa[change-1], denumire_main, dimensiune_main, data_main);
}
break;
case 5:
{
int option;
cout<<" Sortare dupa criterii\n";
cout<<" 1. Ordine alfabetica de denumirii\n";
cout<<" 2. Dupa marimea in KB\n";
cout<<"Optiunea--> ";
cin>>option;
if(option==1)
{
char atr[] = "zzz";
int y, top;
char str[30][30];
char temp[20];
for(int i=0; i<n; i++)
{
if(strcmp(atr, sursa[i].denumire) != 0)
{
strcpy(str[y], sursa[i].denumire);
y++;
}
}
top = y;
for(y=0; y<top; y++)
{
cout<<str[y];
cout<<"\n";
}
cout<<"\n";
for (int y = 0; y < top; ++y) {
for (int j = y + 1; j < top; ++j) {
if (strcmp(str[y], str[j]) > 0) {
strcpy(temp, str[y]);
strcpy(str[y], str[j]);
strcpy(str[j], temp);
}
}
}
cout<<"\n";
for(int y=0; y<top; y++)
{
cout<<str[y];
cout<<"\n";
}
cout<<"\n";
for(int y=0; y<top; y++)
{
for(int i=0; i<top; i++)
{
if(strcmp(str[y], sursa[i].denumire) == 0)
{
afisare(&sursa[i],i);
}
cout<<"\n";
}
}
}
else if(option ==2)
{
int arr[20];
cout<<"\n";
for(int i=0; i<nr_fis; i++)
{
if(-1 < sursa[i].dimensiunea )
{
arr[i] = sursa[i].dimensiunea;
}
}
for(int i=0; i<nr_fis; i++)
{
cout<<arr[i];
cout<<"\n";
}
int fp;
int aux;
do
{
fp=1;
for(int i=0; i<nr_fis-1; i++)
{
if(arr[i]>arr[i+1])
{
aux = arr[i];
arr[i] = arr[i+1];
arr[i+1] = aux;
fp=0;
}
}
}while(!fp);
for(int i=0; i<nr_fis; i++)
{
cout<<arr[i];
cout<<"\n";
}
for(int y=0; y<nr_fis; y++)
{
for(int i=0; i<nr_fis; i++)
{
if(arr[y] == sursa[i].dimensiunea)
{
afisare(&sursa[i],i);
}
cout<<"\n";
}
}

}
else{
cout<<"Optiune gresita\n";
}
}
break;
case 6:
{
exit (0);
}
default:
{
cout<<"Nu exista asa optiune\n";
}
}
}
return 0;
}

Rezultatele execuției

Meniul
Inițializarea fișierelor

Afișarea elementelor
Compararea a două fișiere

Sortarea în ordine alfabetică


Sortare după conținutul de KB
b)
#include <iostream>
using namespace std;
struct vect
{
float *elem;
int size;
vect(){
elem = NULL;
size = 0;
}
};
void initializare(vect *p,int d)
{
p->size = d;
p->elem = new float[d];
int nr;
cout<<"Introdu elementele vectorului "<<endl;
for(int j=0;j<d;j++)
{ cout<<"-> ";
cin>>nr;
p->elem[j]=nr;
}
}
void afisare(vect *p,int i)
{
cout<<"Vector "<<i+1<<endl;

for(int i=0; i<p->size; i++)


{
cout<<p->elem[i];
cout<<" ";
}
}
void modificare(vect *p)
{
int a;
cout<<"Introdu marimea dorita: ";
cin>>a;
initializare(p,a);
}
void suma_para(vect *p)
{
int sum=0;
for(int i=0; i<p->size; i++)
{
float test=p->elem[i];
int b=(int)test;
if(b % 2 == 0)
{
sum=sum+p->elem[i];
}
}
cout<<"Suma: "<<sum<<endl;
}
void eliminare(vect *p)
{
for(int i=0; i < p->size; i++)
{
p->elem[i]=0;
}
p->size=0;
}
void minim(vect *p)
{
int min;
min=p->elem[0];
int poz;
for(int i=0; i<p->size; i++)
{
if ( min > p->elem[i] )
{
min = p->elem[i];
poz=i+1;
}
}
cout<<"Elem minimal "<<min<<endl;
cout<<"Pozitia "<<poz<<endl;
}
int main()
{
int op, n, d;
vect arr[100];
vect *vect;
while(1)
{
cout<<" ---------------------------"<<endl;
cout<<" |1. Introducere vector |"<<endl;
cout<<" |2. Afisarea vector |"<<endl;
cout<<" |3. Modificarea vector |"<<endl;
cout<<" |4. Suma elementelor pare |"<<endl;
cout<<" |5. Eliminare vector |"<<endl;
cout<<" |6. Element minim |"<<endl;
cout<<" |7. Exit |"<<endl;
cout<<" ---------------------------"<<endl;
cout<<"--> ";
cin>>op;
switch(op)
{
case 1:
{
cout<<"Nr. de vectori: ";
cin>>n;
for(int i=0;i<n;i++)
{
cout<<"Marimea vector: "<<i+1<<endl;
cout<<"->";
cin>>d;
initializare(&arr[i],d);
}
}
break;
case 2:
{
for(int i=0;i<n;i++)
{
afisare(&arr[i],i);
cout<<"\n\n\n";
}
}
break;
case 3:
{
int change;
cout<<"Nr vectorului modificat: "<<endl<<endl;
for(int i=0;i<n;i++)
{
afisare(&arr[i],i);
cout<<"\n\n\n";
}
cout<<"Nr-> ";
cin>>change;
modificare(&arr[change-1]);
}
break;
case 4:
{
for(int i=0;i<n;i++)
{
afisare(&arr[i],i);
cout<<"\n\n\n";
}
int suma;
cout<<"Nr. vector: ";
cin>>suma;
suma_para(&arr[suma-1]);

}
break;

case 5:
{
int delet;
for(int i=0;i<n;i++)
{
afisare(&arr[i],i);
cout<<"\n\n\n";
}

cout<<"Nr. vector eliminare";


cin>>delet;
eliminare(&arr[delet-1]);
}
break;
case 6:
{
for(int i=0;i<n;i++)
{
afisare(&arr[i],i);
cout<<"\n\n";
}

int find;
cout<<"Nr: ";
cin>>find;
minim(&arr[find-1]);
}
break;
case 7:
{
exit(0);
}

default:
{
cout<<"Optiune gresita";

}
}
return 0;
}

Rezultatele execuției

Meniul

Inițializarea vectorilor
Afișarea vectorilor

Modificarea vector
Suma elementelor pare
Eliminare vector

Elementul minimal
Întrebările
Tip abstract de date - tip de date definit de către utilizator utilizând tipurile deja existente cu
un anumit scop.
Structura - este o mulțime de date grupate conform unei ierarhii .
Prin ce se deosebește structura de alte tipuri de date? - structura poate fi comparată cu un
tablou , insa tabloul contine date de acelasi tip pe cind structura de tipuri diferite.
Cum se definește o variabilă de tip structură? – în C typedef struct<nume> , în C++
struct<nume>
Când se utilizează punctul și când săgeata? - De obicei se utilizeaza punctul , săgeata se
folosește doar atunci când se face alocarea dinamică a structurei.
Care sunt deosebirile între structurile din c și c++? – In c trebuie sa folosim typedef pentru a
crea o variabilă de tip structură sau să scrim <struct> <numele structurei> <numele variabilei>
pe când in c++ doar scrim <numele structurei> <numele variabilei>
O structură poate să conțină o altă structură ? – Da, lucrează exact ca compoziția în POO.
O structură poate să conțină pointeri spre ea însăși? – Da, aceste tipuri de structuri se numesc
“self referential structures”.
Poate oare sa fie creată dinamic o variabila de tip structură? – Da, struct carte{},*book;
book = new book;
Concluzie:
În urma elaborării acestei lucrări de laborator am însușit mai bine utilizarea
pointerilor și creare a structurilor. Pe lângă asta au fost utilizate alte instrucțiuni ale
limbajului cum ar fi: funcții, transmiterea valorii si adresei prin pointer, creare
meniului interactiv și diferite secvențe de cod care permit manipularea datelor cum
dorim. La fel m-a ajutat să trec de la limbajul C la C++, care se diferențiază un pic
sintaxele și bibliotecile.

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