Documente Academic
Documente Profesional
Documente Cultură
Problema 18
Daca, in programul de mai sus, textul definirii clasei carte impreuna cu textele functiilor
precizate in clasa, citeste_carte si afiseaza_carte se salveaza ca un fisier header in
directorul include, fie el carti.h, atunci programul de mai sus va arata astfel:
int i;
#include<iostream.h>
#include<string.h>
#include<carti.h>
void main()
{
carte carteacitita;
char wnume[40],wautor1[40],wautor2[40];
int wnrpag;
double wpret;
char r='d';
while(r=='d')
{
printf("\n denumirea cartii:");
gets(wnume);
printf("\n primul autor:");
gets(wautor1);
printf("\n al doilea autor:");
gets(wautor2);
cout<<"\n nr. pagini:";
cin>>wnrpag;
cout<<"\n pret:";
cin>>wpret;
carteacitita.citeste_carte(wnume,wautor1,wautor2,&wnrpag,&wpret);
carteacitita.afiseaza_carte();
cout<<"\n continuati?(d/n):";
cin>>r;
}
}
In urma executarii acestui program, se obtin aceleasi rezultate ca in problema precedenta,
cu deosebirea ca referirea clasei carte se face acum din fisierul header, carti.h.
Problema 19
Pentru orice sir de caractere, introdus de la tastatura, printr-un meniu adecvat, sa se
realizeze, utilizandu-se o clasa clasasir, urmatoarele operatii: conversia sirului la caractere mici,
conversia la caractere mari si adaugarea unui subsir la sirul dat.
#include<stdio.h>
#include<conio.h>
#include<string.h>
class clasasir
{
//definirea clasei sir
char sir[80]; // variabila sir ca membru privat implicit
public:
// declararea functiei de copiere sir
void copy (char *s) { strcpy(sir,s);}
// initializarea cu spatii a sirului s
clasasir(char *s=" ") {copy(s);}
// declararea functiei de scriere
void scrie(FILE *fileptr);
// declararea functiei de citire
void citeste(FILE *fileptr);
// declararea functiei de concatenare siruri
void operator +=(clasasir &s)
{
strcat(sir,s.sir); //concatenare siruri
}
// declararea functiei friend conversie caractere
friend void conversie(clasasir &s,char optiune);
}; // sfarsitul declararii clasei
// descrierea functiei de scriere
void clasasir::scrie(FILE *fileptr)
{
fprintf(fileptr,"\n sirul modificat este:%s",sir);
}
// descrierea functiei de citire
void clasasir::citeste(FILE *fileptr)
{
// citeste din fisierul *fileptr si depune in sir
int sizesir; // se memoreaza lungimea sirului citit
fgets(sir,80,fileptr);
sizesir=strlen(sir)-1;
if(sir[sizesir]=='\n') sir[sizesir]=0;
}
// descrierea functiei de conversie sir
void conversie(clasasir &s,char optiune)
{
clasasir tempsir;
switch (optiune)
{
case '1': strupr(s.sir);//conversie in majuscule
break;
case '2': strlwr(s.sir);//conversie in minuscule
break;
case '3': printf("\n introduceti un sir (max 80):");
tempsir.citeste(stdin); //citeste un alt sir
s+=tempsir; //concateneaza sirurile
break;
default: printf("\n optiune eronata \n");
}
}
void main()
{
clasasir clsir; //declararea obiectului clsir
char alegere='1',r='d';
while (r=='d')
{
printf("\n dati un sir (max=80 caractere):");
clsir.citeste(stdin);
do
{
// afisarea meniului de comenzi
printf("\n ==============================");
printf("\n 1. conversie sir in majuscule");
printf("\n 2. conversie sir in minuscule");
printf("\n 3. adaugare subsir la sirul dat");
printf("\n t. terminare program");
printf("\n ==============================");
printf("\n alegeti o optiune:");
alegere=getchar();getchar();
}
while((alegere!='1')&&(alegere!='2')&&
(alegere!='3')&&(alegere!='t'));
while(alegere!='t')
{
conversie(clsir,alegere);
clsir.scrie(stdout);
do
{
// reafisarea meniului de comenzi
printf("\n ==============================");
printf("\n 1. conversie sir in majuscule");
printf("\n 2. conversie sir in minuscule");
printf("\n 3. adaugare subsir la sirul dat");
printf("\n t. terminare program");
printf("\n ==============================");
printf("\n alegeti o optiune:");
alegere=getchar();getchar();
}
while((alegere!='1')&&(alegere!='2')&&
(alegere!='3')&&(alegere!='t'));
}
printf("\n continuati?(d/n):");
r=getche();
}
printf("\n terminat \n");
}
In urma executarii programului de mai sus, s-au obtinut rezultatele din lista de mai
jos, care pun in evidenta declararea si folosirea membrilor publici si privati, prin intermediul
unei instante a clasei declarate.
In programul de mai sus s-a declarat o clasa numita clasasir, utilizata pentru declararea
obiectelor specifice acesteia (exemplu clasasir tempsir) si are ca membri date si functii. Se
constata ca unii membri sunt publici, marcati cu eticheta public:
functiile copy, scrie, citeste, operator si conversie iar altii sunt privati, nemarcati cu nici o
eticheta sau marcati cu eticheta private: variabila (data) sir de exemplu. Se observa, de
asemenea, ca unele functii sunt descrise in corpul clasei clasasir: copy si operator iar altele sunt
descrise in afara clasei: citeste, scrie si conversie. Membri publici ai unei clase, date sau functii
publice, pot fi accesati din interiorul si exteriorul clasei. De exemplu, functiile citeste si scrie au
fost accesate direct din functia main prin intermediul obiectului clsir al
clasei clasasir : clsir.citestesi respectiv clsir.scrie. Membri privati ai unei clase nu pot fi accesati
decat din interiorul clasei. Membrul privat sir a fost accesat numai din interiorul clasei de catre
functiile membre: copy, citeste si scrieindiferent daca sunt descrise in interiorul sau in exteriorul
clasei.
III. 3. Functii membru ale unei clase
Functiile membru ale unei clase sunt functiile descrise sau declarate in
interiorul unei clase. Deci, descrierea efectiva a functiilor membru ale unei clase se
poate face, fie in interiorul clasei, fie in afara clasei, daca in interiorul clasei s-au
declarat ca prototipuri. Ele pot fi accesate din interiorul clasei si din afara clasei, prin
intermediul obiectelor declarate, daca au fost declarate publice, sau numai direct din
interiorul clasei de catre alte functii membru ale aceleiasi clase, daca au fost declarate
private.
III. 3. 1. Apelarea unei functii membru al unei clase
Apelarea unei functii membru, din interiorul unei clase, se face precizandu-se
numele acesteia si parametrii efectivi:
nume_functie_membru(parametri_efectivi_de_apel)
ca in problema de mai sus: clasasir(char *s=" ") {copy(s);}
Apelarea unei functii membru, din exteriorul unei clase, se face precizandu-se
obiectul declarat, numele acesteia si parametri efectivi:
nume_obiect.nume_functie_membru(parametri_efectivi_de_apel)
asa cum s-a precizat mai sus: clsir.citeste, clsir.scrie.
III. 3. 2. Functii friend
Functiile friend sunt functii obisnuite declarate intr-o clasa, precedate de calificativul friend.
friend nume_functie_membru(parametri_formali)
Acest calificativ le permite sa acceseze membrii privati ai unei clase, din exteriorul
acesteia, asa cum este cazul functiei conversie din problema precedenta:
friend void conversie(clasasir &s,char optiune);
Apelarea unei functii friend se face asemanator cu apelarea oricarei functii din C++,
ca de exemplu, in functia main() a programului de mai sus: conversie(clsir,alegere);
Variabile de tip referinta
O variabila de tip referinta, in definirea unei functii, este precedata de
operatorul adresa &, iar in corpul functiei variabila este referita normal, ca o variabila
de tip structura. De fapt, o variabila de tip referinta este un alias, un pseudonim,
pentru alta variabila, in esenta, un pointer cu urmatoarele precizari:
- odata initializata valoarea sa nu se mai poate modifica
- eliberarea, anularea referirii, se face in mod automat
Variabila referinta se utilizeaza, in corpul functiei, ca o structura (exemplu, in
programul de mai sus: s.sir) si nu ca un pointer la o structura, asa cum eram obisnuiti
la structuri (s->sir)
Variabilele referinta, dupa cum se stie, permit transmiterea parametrilor la functia
apelata, prin adrese si nu prin valoare, eliminand, astfel, pierderile de timp cu copierea
parametrilor efectivi in memoria stiva Apelarea unei functii membru cu parametri de
tip referinta se face fara a preceda parametri respectivi de operatorul
adresa & (exemplu, in functia main()de mai sus:conversie(clsir,alegere))
III. 4. Membri statici ai unei calase
Oricare obiect declarat intr-un program, in mod normal, primeste o copie a
membrilor clasei la care este asociat. Uneori, este nevoie sa se defineasca unii
membrii care sunt folositi in comun de catre toate obiectele clasei. Astfel de membri
se numesc membri statici care au proprietati diferite de ceilalti membri nestatici.
Declararea unui membru static presupune precedarea acestuia de cuvantul
cheie static:
static tip_membru nume_membru_static;
iar referirea unui membru static se face astfel:
nume_clasa::nume_membru_static;
unde, nume_membru_static poate fi o data sau o functie membru statica
Referirea unui membru static se poate face chiar si inaintea declararii de
obiecte ale clasei, in care a fost declarat membru static respectiv, iar initializarea sa se
poate face numai in domeniul sau de vizibilitate.
Problema 20
Se considera o clasa de puncte din spatiu in care se descrie un punct de
coordonate fixe M0(x0,y0,z0), reprezentand centrul unei sfere, raza fixa a unei sferei
ro si un punct oarecare din spatiu M(x,y,z) si functiile:distanta(M0,M) care determina
distanta dintre punctele M0 si M, pozitia_fata_de_centru(M), care
determina coordonatele punctului M in raport cu centrul sferei si pozitia(M) care
precizeaza pozitia punctului M fata de sfera. Sa se scrie un program care sa sa
calculeze distanta dintre punctele M0 si M, coordonatele punctului M fata de centrul
sferei si sa determine pozitia punctului M fata de sfera utilizandu-se obiecte din clasa
declarata.
#include<iostream.h>
#include<conio.h>
#include<math.h>
// definirea clasei clspunct
class clspunct
{
public:
static int x0,y0,z0,raza;
int x,y,z;
double distanta(void)
{
return(sqrt((x-x0)*(x-x0)+(y-y0)*
(y-y0)+(z-z0)*(z-z0)));
}
int poz_x_fata_m0(void)
{
return(x-x0);
}
int poz_y_fata_m0(void)
{
return(y-y0);
}
int poz_z_fata_m0(void)
{
return(z-z0);
}
double poz_m_fata_sfera(void)
{
return(distanta()-raza);
}
};
// initializare datelor statice inainte de
// declararea obiectelor clasei
int clspunct::x0=10;
int clspunct::y0=10;
int clspunct::z0=10;
int clspunct::raza=10;
void main(void)
{
// declararea obiectelor ob1 si ob2
clspunct a;
char r='d';
while(r=='d')
{
cout<<"\n sfera are la inceput raza "
<<a.raza<<" si centrul in M0("
<<a.x0<<','<<a.y0<<','<<a.z0<<")";
cout<<"\n coordonatele unui pct (int x,y,z):";
cin>>a.x>>a.y>>a.z;
cout<<"\n distanta(M0("<<a.x0<<','<<a.y0<<','
<<a.z0<<"),M1("<<a.x<<','<<a.y<<','
<<a.z<<"))="<<a.distanta();
cout<<"\n coordonatel lui M fata de centru("
<<a.poz_x_fata_m0()<<','<<a.poz_y_fata_m0()
<<','<<a.poz_z_fata_m0()<<")";
if(a.poz_m_fata_sfera()>0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este exterior sferei";
if(a.poz_m_fata_sfera()<0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este interior sferei";
if(a.poz_m_fata_sfera()==0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este pe sfera";
// se modifica datele statice
a.x0=1;a.y0=1;a.z0=1;a.raza=10;
cout<<"\n sfera modificata are raza "<<a.raza
<<" si centrul in M0("<<a.x0<<','<<a.y0
<<','<<a.z0<<")";
cout<<"\n distanta(M0("<<a.x0<<','<<a.y0<<','
<<a.z0<<"),M1("<<a.x<<','<<a.y<<','
<<a.z<<"))="<<a.distanta();
cout<<"\n coordonatel lui M fata de centru("
<<a.poz_x_fata_m0()<<','<<a.poz_y_fata_m0()
<<','<<a.poz_z_fata_m0()<<")";
if(a.poz_m_fata_sfera()>0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este exterior sferei";
if(a.poz_m_fata_sfera()<0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este interior sferei";
if(a.poz_m_fata_sfera()==0)
cout<<"\n punctul M("<<a.x<<','<<a.y<<','
<<a.z<<") este pe sfera";
cout<<"\n continuati?(d/n):";
cin>>r;
}
}
In urma executarii programului de mai sus, s-au obtinut rezultatele din lista de
mai jos, evidentiindu-se declararea si modul de utilizare a membrilor statici precizati
in clasa definita.
sfera are la inceput raza 10 si centrul in M0(10,10,10)
coordonatele unui pct (int x,y,z):20 30 40
distanta(M0(10,10,10),M1(20,30,40))=37.4166
coordonatel lui M fata de centru(10,20,30)
punctul M(20,30,40) este exterior sferei
sfera modificata are raza 10 si centrul in M0(1,1,1)
distanta(M0(1,1,1),M1(20,30,40))=52.1824
coordonatel lui M fata de centru(19,29,39)
punctul M(20,30,40) este exterior sferei
continuati?(d/n):d
continuati?(d/n):d
sfera are la inceput raza 10 si centrul in M0(1,1,1)
coordonatele unui pct (int x,y,z):-10 -20 20
distanta(M0(1,1,1),M1(-10,-20,20))=30.3809
coordonatel lui M fata de centru(-11,-21,19)
punctul M(-10,-20,20) este exterior sferei
sfera modificata are raza 10 si centrul in M0(1,1,1)
distanta(M0(1,1,1),M1(-10,-20,20))=30.3809
coordonatel lui M fata de centru(-11,-21,19)
punctul M(-10,-20,20) este exterior sferei
continuati?(d/n):n
continuati?(d/n):d
cod student (1..999):200
nume student:ionescu stefan
nr note(1..15):4
nota(0)=9.25
nota(1)=7.50
nota(2)=4.95
nota(3)=8.30
continuati?(d/n):d
cod student (1..999):150
nume student:tomescu stan
nr note(1..15):2
nota(0)=8.21
nota(1)=6.13
continuati?(d/n):n
mediile studentilor
==========================
cod nume si prenume media
==========================
100 popescu ilie 6.83
200 ionescu stefan 7.50
150 tomescu stan 7.17
==========================
In problema de mai sus, citirea efectiva a campurilor unei componente a tabloui student poate fi
inclusa chiar in definirea structurii tip_student, ca in problema de mai jos:
Problema 22
Aceeasi problema ca cea de mai sus, cu deosebirea ca citire efectiva a
campurilor unei componente a tabloului student se face in functia citeste_student(),
membru al structurii tip_student.
#include<stdio.h>
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
#include<string.h>
#define nmax 20
struct tip_student
{
int cm;
char nume[20];
int nrn;
double nota[15];
double media;
void citeste_student()
{
int k;
int wcm,wnrn;char wnume[20];
double wnota[15],wmedia;
do
{
printf("\n cod student (1..999):");
scanf("%d",&wcm);
}
while((wcm<1)||(wcm>999));
printf("\n nume student:");
cin.getline(wnume,20,'\n');
do
{
printf("\n nr note(1..15):");
scanf("%d",&wnrn);
}
while((wnrn<1)||(wnrn>15));
for(k=0;k<wnrn;k++)
{
do
{
printf("\n nota(%d)=",k);
scanf("%lf",&wnota[k]);
}
while((wnota[k]<1)||(wnota[k]>10));
}
this->cm=wcm;
strcpy(this->nume,wnume);
this->nrn=wnrn;
this->media=0;
for(k=0;k<wnrn;k++)
{
this->media=this->media+wnota[k];
}
this->media=this->media/this->nrn;
wmedia=this->media;
}
void afisaza_student()
{
printf("\n %5d %-22s %6.2lf",this->cm,this->nume,this->media);
}
}; // sfarsitul definirii structurii tip_student
void main(void)
{
tip_student student[nmax]; char r='d';
int i=0,k;
while((r=='d')&&(i<nmax))
{
student[i].citeste_student();
i++;
printf("\n continuati?(d/n):");
r=getche();
}
printf("\n mediile studentilor ");
printf("\n =====================================");
printf("\n cod nume si prenume media ");
printf("\n =====================================");
for(k=0;k<i;k++) student[k].afisaza_student();
printf("\n =====================================\n");
}
continuati?(d/n):d
nr par de numere intregi (1<=n<=20):6
introduceti cele 6 de nr. intregi in uniunea u:
x(0)=10
x(1)=20
x(2)=30
x(3)=40
x(4)=50
x(5)=60
introduceti cele 3 de numere reale din uniunea u:
y(0)=23.45
y(1)=67.97
y(2)=-34.56
nr intregi si calculul medie in uniune:
10 20 30 40 50 60
media arit. a celor 6 nr. intregi=35.00
nr intregi si media calculate in main:
10 20 30 40 50 60
media celor 6 nr. intregi=35.00
nr reale si calculul medie in uniune:
23.45 67.97 -34.56
media arit. a celor 3 nr.reale=18.95
nr reale si media calculate in main:
23.45 67.97 -34.56
media celor 3 nr. reale=18.95
continuati?(d/n):n
Observatie:
Limbajul C++ accepta uniunile anonime, fara specificarea numelui uniunii, ca in
programul de mai jos:
Problema 24
Se considera o uniune anonima, fara nume, de trei date: intreaga, reala si caracter. Sa se
afiseze pe rand toate datele intregi, reale si caracter tastate.
#include<iostream.h>void main(void)
{
union
{
int x;
double y;
char z;
};
char r='d';
while(r=='d')
{
cout<<"\n dati un nr intreg, x=";
cin>>x;
cout<<"\n ati tastat nr intreg "<<x;
cout<<"\n dati un nr real, y=";
cin>>y;
cout<<"\n ati tastat nr real "<<y;
cout<<"\n dati un caracter, z=";
cin>>z;
cout<<"\n ati tastat caracterul "<<z;
cout<<"\n continuati?(d/n):";
cin>>r;
}
}
Problema 25
Se considera trei siruri: primul de numere intregi, al doilea de caractere si al treilea de
numere reale, care utilizeaza in comun aceeasi zona de memorie. Cu ajutorul unei uniuni a celor
trei tipuri de data, sa se citeasca, pe rand, elementele sirurilor, cu ajutorul unei functii membru
(citeste_sir), sa se ordoneze crescator fiecare sir cu o alta functie membru (ordoneaza_sir) si apoi
sa se afiseze sirurile astfel ordonate cu alta functie membru (afisaza_sir)
#include<iostream.h>
#define nmax1 20
#define nmax2 15
#define nmax3 10
int i;
union tip_siruri
{
int sint[nmax1];
char scar[nmax2];
double sreal[nmax3];
void citeste_sir(int n,char tsir) //functia membru de citire
{
for(i=0;i<n;i++)
{
if(tsir=='i')
{
cout<<"\n sint("<<i<<")=";
cin>>sint[i];
}
if(tsir=='c')
{
cout<<"\n scar("<<i<<")=";
cin>>scar[i];
}
if(tsir=='r')
{
cout<<"\n sreal("<<i<<")=";
cin>>sreal[i];
}
}
}
void afisaza_sir(int n,char tsir) //functia membru de afisare
{
for(i=0;i<n;i++)
{
if(tsir=='i') cout<<sint[i]<<' ';
if(tsir=='c') cout<<scar[i]<<' ';
if(tsir=='r') cout<<sreal[i]<<' ';
}
}
void ordonare_sir(int n,char tsir) //functia membru de ordonare
{
int ok,i,auxi; char auxc;double auxr;
ok=1;
while(ok)
{
ok=0;
for(i=0;i<n-1;i++)
{
if(tsir=='i')
{
if(sint[i]>sint[i+1])
{
auxi=sint[i];sint[i]=sint[i+1];
sint[i+1]=auxi;ok=1;
}
}
if(tsir=='c')
{
if(scar[i]>scar[i+1])
{
auxc=scar[i];scar[i]=scar[i+1];
scar[i+1]=auxc;ok=1;
}
}
if(tsir=='r')
{
if(sreal[i]>sreal[i+1])
{
auxr=sreal[i];sreal[i]=sreal[i+1];
sreal[i+1]=auxr;ok=1;
}
}
}
}
}
};
void main(void)
{
tip_siruri u;
int n;char r='d';
while(r=='d')
{
do
{
cout<<"\n dati nr de intregi de citit(n<"<<nmax1<<")=";
cin>>n;
}
while((n<1)||(n>nmax1));
cout<<"\n se citesc "<<n<<" intregi:\n";
cout<<"===============================";
u.citeste_sir(n,'i');
u.ordonare_sir(n,'i');
cout<<"\n=============================";
cout<<"\n sirul de intregi ordonat:";
u.afisaza_sir(n,'i');
cout<<"\n=============================";
do
{
cout<<"\n dati nr de caractere de citit(n<"<<nmax2<<")=";
cin>>n;
}
while((n<1)||(n>nmax2));
cout<<"\n se citesc "<<n<<" caractere:";
cout<<"\n=============================";
u.citeste_sir(n,'c');
u.ordonare_sir(n,'c');
cout<<"\n=============================";
cout<<"\n sirul de caractere ordonat:";
u.afisaza_sir(n,'c');
cout<<"\n=============================";
do
{
cout<<"\n dati nr de reali de citit(n<"<<nmax3<<")=";
cin>>n;
}
while((n<1)||(n>nmax3));
cout<<"\n se citesc "<<n<<" reali:\n";
cout<<"\n=============================";
u.citeste_sir(n,'r');
u.ordonare_sir(n,'r');
cout<<"\n=============================";
cout<<"\n sirul de reali ordonat:";
u.afisaza_sir(n,'r');
cout<<"\n=============================";
cout<<"\n continuati?(d/n):";
cin>>r;
}
}.
Rezultatele executiei programului, sunt prezentate in continuare, putandu-se
urmari cum se declara si se utilizeaza o uniune de siruri de date care, pe langa aceste
siruri, contine si functii membre (citeste_sir(), afisaza_sir() si ordonare_sir()), cu care
se prelucreaza datele uniunii, de tip siruri de date, ce folosesc aceeasi zona de
memorie in comun
dati nr de intregi de citit(n<20)=4
se citesc 4 intregi:
===============================
sint(0)=45
sint(1)=-34
sint(2)=78
sint(3)=-90
=============================
sirul de intregi ordonat:-90 -34 45 78
=============================
dati nr de caractere de citit(n<15)=5
se citesc 5 caractere:
=============================
scar(0)=i
scar(1)=y
scar(2)=3
scar(3)=a
scar(4)=f
=============================
sirul de caractere ordonat:3 a f i y
=============================
dati nr de reali de citit(n<10)=4
se citesc 4 reali:
=============================
sreal(0)=32.45
sreal(1)=89.45
sreal(2)=-67.99
sreal(3)=-23.33
=============================
sirul de reali ordonat:-67.99 -23.33 32.45 89.45
=============================
continuati?(d/n):d
dati nr de intregi de citit(n<20)=3
se citesc 3 intregi:
===============================
sint(0)=45
sint(1)=-34
sint(2)=18
=============================
sirul de intregi ordonat:-34 18 45
=============================
dati nr de caractere de citit(n<15)=4
se citesc 4 caractere:
=============================
scar(0)=k
scar(1)=a
scar(2)=w
scar(3)=h
=============================
sirul de caractere ordonat:a h k w
=============================
dati nr de reali de citit(n<10)=3
se citesc 3 reali:
=============================
sreal(0)=-34.78
sreal(1)=67.33
sreal(2)=-97.5
=============================
sirul de reali ordonat:-97.5 -34.78 67.33
=============================
continuati?(d/n):n
codul materialului:20000
denumirea materialului:fier*beton*fi16
unitatea de masura:kg
pretul materialului:22.55
cantitatea din stoc:200
Problema 27
Se considera o suma s0=100000 depusa initial la o banca, cu dobanda 10% pe
o perioada de 10 ani. Sa se determine, dupa fiecare an suma cumulata si dobanda
cumulata, utilizandu-se o clasa cu functie constructor corespunzatoare avand
parametri impliciti dati (s0=100000, p=10% si n=10 ani), care sa permita, totodata,
obtinerea rezultatelor pentru orice suma s0 (100000<=s0<=1000000), orice dobanda p
(10<<p<=100) si pentru orice perioada n (5<=n<=20).
#include<iostream.h>
#include<iomanip.h>
// definirea clasei dobanda
class dobanda
{
public:
// prototipul functiei constructor dobanda()
dobanda(double s0=100000, double p=10, int n=10);
// declararea datelor membru publice
double s0;
double p;
int n;
// prototipul functiei afiseaza_linie,ce lanseaza
// functiile:calcul_dobanda() si afisare_rezultat()
void afiseaza_linie(int m);
private:
// declararea datelor membru private
double suma_cumulata;
double dobanda_cumulata;
// prototipul functiei de calcul a sumei si dobanzii cumulate
void calcul_dobanda(int k);
// prototipul functiei afiseaza_rezultat()
// ce afiseaza rezultatele dupa un anumit an
void afiseaza_rezultat(int k);
};
// descrierea functiei constructor in afara clasei
dobanda::dobanda(double s0, double p, int n)
{
int i;
dobanda::s0=s0;
dobanda::p=p;
dobanda::n=n;
cout<<"\n suma depusa="<<s0<<" dobanda=";
cout<<p<<"%"<<" perioada="<<n<<" ani";
cout<<"\n =====================================";
cout<<"\n anul suma cumulata dobanda cumulata";
cout<<"\n =====================================";
for(i=1;i<=n;i++) afiseaza_linie(i);
cout<<"\n =====================================";
}
// descrierea functiei calcul_dobanda in afara clasei
void dobanda::calcul_dobanda(int k)
{
int j;
suma_cumulata=dobanda::s0;
for (j=1;j<=k;j++)
{
suma_cumulata=suma_cumulata+suma_cumulata*dobanda::p/100;
dobanda_cumulata=suma_cumulata-dobanda::s0;
}
};
// descrierea functiei afiseaza_rezultat in afara clasei
void dobanda::afiseaza_rezultat(int k)
{
cout<<"\n "<<setw(4)<<k<<" ";
cout<<" "<<setw(13)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<dobanda::suma_cumulata;
cout<<" "<<setw(13)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<dobanda::dobanda_cumulata;
};
// descrierea functiei afiseaza_linie in afara clasei
void dobanda::afiseaza_linie(int m)
{
calcul_dobanda(m);
afiseaza_rezultat(m);
}
// descrierea functiei principale main
void main()
{
int wn; double wp, ws0;
char r='d',tip_depozit;
while(r=='d')
{
cout<<"\n tip depozit implicit(s0=100000,p=10%,n=10 ani)?(d/n):";
cin>>tip_depozit;
if (tip_depozit=='d')
{
cout<<"\n tip depozit implicit(s0=100000,p=10%,n=10 ani)";
//apelarea functiei constructor cu parametri impliciti
dobanda implicit;
}
else
{
// citirea parametrilor efectivi expliciti
cout<<"\n tip depozit explicit(s0<>100000,p<>10%,n<>10 ani)";
do
{
cout<<"\n suma initiala depusa (100000<=s0<=1000000):";
cin>>ws0;
}
while((ws0<100000)||(ws0>1000000));
do
{
cout<<"\n dobanda anuala % (10<=p<=100):";
cin>>wp;
}
while((wp<10)||(wp>100));
do
{
cout<<"\n perioada depozitului (5<=n<=20):";
cin>>wn;
}
while((wn<5)||(wn>20));
//apelarea functiei constructor cu parametri expliciti
dobanda explicita(ws0,wp,wn);
}
cout<<"\n continuati?(d/n):";
cin>>r;
}
}
In urma executarii acestui program, s-au obtinut urmatoarele rezultate, care scot in
evidenta: declararea prototipurilor tuturor functiilor, in corpul clasei, inclusiv a functiei
constructor cu parametri formali impliciti, descriera tuturor functiilor in afara clasei, apelarea
functiei constructor cu si fara parametri efectivi expliciti.
nume_functie_constructor::pointer_tabloun =
(tip_componentan*)malloc(n*sizeof(tip_componentan));
iar verificarea alocarii necesarului de memorie se poate face asemanator ca la tablourile de siruri,
prezentata mai sus.
if((!nume_functie_constructor::pointer_tablou1) ||
(!nume_functie_constructor::pointer_tablou2) ||
(!nume_functie_constructor::pointer_tabloun) == 0)
{
cout<<"\n alocarea dinamica a tablourilor, nereusita in functia constructor";
exit(1);
}
Problema 28
Se da o matrice dreptunghiulara de n linii si m coloane, unde m reprezinta numarul de
tipuri de produse fabricate intr-o uzina, iar n numarul de tipuri de materiale folosite la fabricarea
acestora. Un element al matricei a[i,j] reprezinta cantitatea, in aceeasi unitate de masura, din
materialul i consumat pentru produsul j. Un vector de m componente contine numarul de produse
fabricate din fiecare tip. Se cere sa se determine un vector de n componente care sa contina
cantitatile totale, din fiecare tip de material, consumate pentru realizarea fabricatiei celor m tipuri
de produse. Cunoscandu-se, apoi, intr-un vector, costurile unitare de materiale pe fiecare tip de
material, sa se calculuze valoarea fiecarui tip de material consumat si valoarea totala a tuturor
materialelor consumate. Pentru rezolvarea acestei aplicatii se va folosi o clasa adecvat definita
care contine o functie constructor ce va initializa datele membre de tip pointeri la tablouri si va
calcula si afisa cele cerute in problema. Se vor folosi parametri formali si efectivi de tip pointer,
pentru transmiterea lor intre functia principala si functia constructor, utilizanduse, din acest
motiv, alocarea dinamica de memorie si verificarea alocarii memoriei dinamice necesara
tablourilor.
#include<iostream.h>
#include<iomanip.h>
#include<malloc.h>
#include<stdlib.h>
#define nmax 20
#define mmax 20
int i,j;
// definirea clasei consunuri
class consumuri
{
public:
consumuri::consumuri(int n, int m, double *pc, double *pp, double *pv);
// declararea datelor membru publice
int n;
int m;
double *pc; //pointer la matricea consumurilor specifice
double *pp; //pointer la vectorul produselor fabricate
double *pv; //pointer la vectorul costurilor unitare ale materialelor
private:
double *pmateriale; //pointer la vectorul materialelor consumate
double *pcosturi; //pointer la vectorul costurilor materialelor
double costotal;
//declararea prototipurilor functiilor membru private
// prototipul functiei de afisare a consumurilor
//specifice de materiale pe produse
void afiseaza_matrice_consumuri(int n, int m);
// prototipul functiei de calcul a consumurilor de materiale
void calcul_consumuri(int n, int m);
// prototipul functiei de calcul ale costurilor de materiale
void calcul_costuri_materiale(int n);
// prototipul functiei de afiseare vector produse
void afiseaza_vector_produse(int m);
// prototipul functiei de afiseare vector consumuri de materiale
void afiseaza_vector_consumuri(int n);
// prototipul functiei de afiseare vector consturi unitare pe materiale
void afiseaza_vector_costuri_unitare(int n);
// prototipul functiei de afiseare vector consturi totale pe materiale
void afiseaza_vector_costuri_materiale(int n);
};
// descrierea functiei constructor consumuri in afara clasei
consumuri::consumuri(int n, int m, double *pc, double *pp, double *pv)
{
cout<<"\n functia constructor consumuri";
// alocarea dinamica de memorie pentru tablourile aplicatiei
consumuri::pc=(double*)malloc(nmax*mmax);
consumuri::pp=(double*)malloc(mmax);
consumuri::pv=(double*)malloc(nmax);
consumuri::pmateriale=(double*)malloc(nmax);
consumuri::pcosturi=(double*)malloc(mmax);
//verificarea necesarului de memorie
if((!consumuri::pc) ||(!consumuri::pp) || (!consumuri::pc) ||
(!consumuri::pmateriale) || (!consumuri::pcosturi))
{
cout<<"\n alocarea dinamica a tablourilor, nereusita in functia constructor";
exit(1);
}
consumuri::n=n;
consumuri::m=m;
// initializarea matricei consumurilor specifice
for(i=0;i<n;i++)
for(j=0;j<m;j++) consumuri::pc[i*m+j]=pc[i*m+j];
// initializarea vectorului produselor fabricate
for(i=0;i<m;i++) consumuri::pp[i]=pp[i];
// initializarea vectorului costurilor unitare ale materialelor folosite
for(i=0;i<n;i++) consumuri::pv[i]=pv[i];
cout<<"\n matricea consumurilor de materiale pe produse";
cout<<"\n================================\n";
afiseaza_matrice_consumuri(n,m);
cout<<"\n=================================";
cout<<"\n vectorul produselor fabricate";
cout<<"\n ================================\n";
afiseaza_vector_produse(m);
cout<<"\n ================================\n";
cout<<"\n vectorul costurilor unitare pe materiale\n";
cout<<"\n =================================";
afiseaza_vector_costuri_unitare(n);
cout<<"\n =================================";
calcul_consumuri(n,m);
cout<<"\n vectorul materialelor consumate";
cout<<"\n ================================\n";
afiseaza_vector_consumuri(n);
cout<<"\n =================================";
calcul_costuri_materiale(n);
cout<<"\n vectorul costurilor totale pe materiale";
cout<<"\n =================================";
afiseaza_vector_costuri_materiale(n);
cout<<"\n =================================";
};
// descrierea functiei calcul_consumuri
// in afara clasei cu ajutorul pointerilor
void consumuri::calcul_consumuri(int n,int m)
{
for (i=0;i<n;i++)
{
consumuri::pmateriale[i]=0;
for (j=0;j<m;j++)
{
consumuri::pmateriale[i]=consumuri::pmateriale[i]+
consumuri::pc[i*m+j] * consumuri::pp[j];
}
}
}
// descrierea functiei calcul_costuri_materiale
//in afara clasei cu ajutorul pointerilor
void consumuri::calcul_costuri_materiale(int n)
{
consumuri::costotal=0;
for (i=0;i<n;i++)
{
consumuri::pcosturi[i]=consumuri::pmateriale[i] * consumuri::pv[i];
consumuri::costotal= consumuri::costotal + consumuri::pcosturi[i];
}
}
// descrierea functiei afiseaza_matrice_consumuri
//in afara clasei cu ajutorul pointerilor
void consumuri::afiseaza_matrice_consumuri(int n, int m)
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<" "<<setw(7)<<setiosflags(ios::fixed);
cout<<setprecision(3)<<consumuri::pc[i*m+j];
}
cout<<"\n";
}
}
// descrierea functiei afiseaza_vector_produse
// in afara clasei cu ajutorul pointerilor
void consumuri::afiseaza_vector_produse(int m)
{
cout<<"\n";
for(i=0;i<m;i++)
{
cout<<" "<<setw(7)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<consumuri::pp[i];
}
}
// descrierea functiei afiseaza_vector_consumuri
// in afara clasei cu ajutorul pointerilor
void consumuri::afiseaza_vector_consumuri(int n)
{
cout<<"\n";
for(i=0;i<n;i++)
{
cout<<" "<<setw(7)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<consumuri::pmateriale[i];
}
}
// descrierea functiei afiseaza_vector_consturi_unitare
// in afara clasei cu ajutorul pointerilor
void consumuri::afiseaza_vector_costuri_unitare(int n)
{
cout<<"\n";
for(i=0;i<n;i++)
{
cout<<" "<<setw(7)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<consumuri::pv[i];
}
}
// descrierea functiei afiseaza_vector_costuri_materiale
// in afara clasei cu ajutorul pointerilor
void consumuri::afiseaza_vector_costuri_materiale(int n)
{
cout<<"\n";
for(i=0;i<n;i++)
{
cout<<" "<<setw(7)<<setiosflags(ios::fixed);
cout<<setprecision(2)<<consumuri::pcosturi[i];
}
cout<<"\n valoare totala costuri materiale="<<consumuri::costotal;
}
// descrierea functiei principale main()
void main()
{
int n,m;
// declararea pointerilor la tablourile aplivatiei
double *ptrc,*ptrp,*ptrv;
char r='d';
// alocarea memoriei pentru tablourile date in aplicatie
ptrc=(double*)malloc(nmax*mmax);
ptrp=(double*)malloc(mmax);
ptrv=(double*)malloc(nmax);
// verificarea alocarii memoriei pentru tablurile date in aplicatie
if((!ptrc)||(!ptrp)||(!ptrv))
{
cout<<"\n alocarea tablourilor nereusita in functia principala";
exit(1);
}
while(r=='d')
{
do
{
cout<<"\n numarul de produse fabricate,m(1<=m<=20):";
cin>>m;
}
while((m<1)||(m>20));
do
{
cout<<"\n numarul de materiale folosite,n(1<=n<=20):";
cin>>n;
}
while((n<1)||(n>20));
//citirea matricii consumurilor specifice de materiale pe produs
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cout<<"\n materialul "<<i<<" din produsul "<<j<<" =";
cin>>ptrc[i*m+j];
}
cout<<"\n matricea consumurilor:\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<ptrc[i*m+j]<<" ";
}
cout<<"\n";
}
for(i=0;i<m;i++)
{
cout<<"\n numarul de bucati fabricate din produsul "<<i<<" =";
cin>>ptrp[i];
}
for(i=0;i<n;i++)
{
cout<<"\n costul unitar al materialului "<<i<<" =";
cin>>ptrv[i];
}
//apelarea functiei constructor, consumuri, cu parametri expliciti
consumuri functie_consumuri(n,m,ptrc,ptrp,ptrv);
cout<<"\n continuati?(d/n):";
cin>>r;
}
}
Rezultatele executiei programului sunt afisate in continuare, putandu-se usor observa,
modul in care, unei functii constructor, i se transmit parametri efectivi de tip pointeri la tablouri,
alocarea dinamica de memorie pentru tablourile pointate ale functiei principale main, cat si
pentru datele membre, de tip pointeri la tablouri, ale clasei corespunzatoare si verificarea alocarii
memoriei pentru tablourile aplicatiei.
matricol:200
nume:stanescu
prenume:stefan
salariu brut:2000.00
somaj:20.00
CAS:190.00
CASS:130.00
impozit:265.60
retineri:850.00
rest plata:544.40
====================================================
cod matricol sef sectie (1000-9999):300
nume sef sectie:popescu
prenume sef sectie:sandu
salariu brut sef sectie :4000
retineri sef sectie:1200
====================================================
stat de plata sef de sectie
====================================================
matricol:300
nume:popescu
prenume:sandu
salariu brut:4000.00
somaj:40.00
CAS:380.00
CASS:260.00
impozit:531.20
retineri:1200.00
rest plata:1588.80
========================================
cod matricol ing. sef (1000-9999):500
nume ing. sef:stabu
prenume ing. sef:spiridon
salariu brut ing. sef :5000
retineri ing. sef:2000
========================================
stat de plata inginer sef
========================================
matricol:500
nume:stabu
prenume:spiridon
salariu brut:5000.00
somaj:50.00
CAS:475.00
CASS:325.00
impozit:664.00
retineri:2000.00
rest plata:1486.00
========================================
continuati salarizarea?(d/n):n
s-a distrus instanta inginerului sef stabu spiridon
s-a distrus instanta sefului de sectie popescu sandu
s-a distrus instanta muncitorilor cu seful de achipa pop ion
Functiile destructor sunt utilizate si pentru distrugerea instantelor obiectelor
care gestioneaza diverse stive de date, ocazie cu care se si elibereaza memoria alocata
unei stive, prin functia constructor.
Problema 32
Se considera o stiva de containere cu caracteristicile:cod container, un numar cuprins intre 1 si
99, continut, un camp alfanumeric de 20 caractere, data ambalarii (zi, luna si an) si greutatea in
kg. Sa se simuleze activitatile de stivuire si de incarcare intr-un mijloc de transport a
containerelor din stiva prin intermediul unei clase stivuire_incarcare, care contine: o functie
constructor utilizata pentru initializarea stivei (alocarea spatiului de memorie adecvat), o functie
destructor necesata distrugerii instantelor obiectelor folosite, o functie de depunere container in
stiva si o functie de extragere container din stiva.
#include<iostream.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define nmax 6
int nrob=2;
struct tipdata
{
int zi;
int luna;
int an;
};
struct tipstiva
{
int cc;
char continut[20];
struct tipdata data;
int greutate;
};
class stivuire_incarcare
{
public:
// declararea functiei constructor
stivuire_incarcare (void);
// declararea functiei destructor
~stivuire_incarcare (void);
// declararea functiei de depunere in stiva
int depune_in_stiva(struct tipstiva *ptrstructura);
// declararea functiei de extragere din stiva
int extrage_din_stiva(struct tipstiva *ptrstructura);
struct tipstiva *varfstiva;
};
// descrierea functiei constructor care aloca spatiul pentru stiva
stivuire_incarcare::stivuire_incarcare(void)
{
cout<<"\n initializarea stivei de containere ";
stivuire_incarcare::varfstiva=
(struct tipstiva*)malloc(nmax*sizeof(struct tipstiva));
if(stivuire_incarcare::varfstiva==NULL)
{
cout<<"\n memorie insuficienta ptr memoria stivei ";
exit(1);
}
}
// descrierea functie destructor
stivuire_incarcare::~stivuire_incarcare (void)
{
cout<<"\n s-a distrus instanta obiect"<<nrob;
nrob--;
}
// descrierea functiei depune_in_stiva()
int stivuire_incarcare::depune_in_stiva(struct tipstiva *ptrstructura)
{
struct tipstiva *ptrcontainer;
ptrcontainer=(struct tipstiva*)malloc(sizeof(struct tipstiva));
if(ptrcontainer==NULL)
{
cout<<"\n memorie insuficienta ptr un container ";
return 0;
}
*ptrcontainer=*ptrstructura;
*stivuire_incarcare::varfstiva=*ptrcontainer;
cout<<"\n varf stiva ="<<stivuire_incarcare::varfstiva;
cout<<"\n cod container ="<<stivuire_incarcare::varfstiva->cc;
stivuire_incarcare::varfstiva++;;
return 1;
}
/* descrierea functiei de extragere din stiva */
int stivuire_incarcare::extrage_din_stiva(struct tipstiva *ptrstructura)
{
if(!stivuire_incarcare::varfstiva)
{
cout<<"\n stiva goala "<<endl;
return 0;
}
stivuire_incarcare::varfstiva--;
*ptrstructura=*stivuire_incarcare::varfstiva;
ptrstructura=stivuire_incarcare::varfstiva;
return 1;
}
void main(void)
{
int k,n;
struct tipstiva *ptrcontainera,*ptrcontainers,container,containers;
stivuire_incarcare obiect1,obiect2;
char rasp;k=0;
int terminat=0;
ptrcontainera=(struct tipstiva*)malloc(sizeof(struct tipstiva));
if(ptrcontainera==NULL)
{
cout<<"\n memorie insuficienta un container ";
exit(1);
}
do
{
cout<<"\n numarul maxim de containere, n(1<=n<="<<nmax<<")=";
cin>>n;
}
while((n<1)||(n>nmax));
while(!terminat)
{
cout<<"\n a - asezare container in stiva";
cout<<"\n s - scoatere container din stiva";
cout<<"\n t - terminare program";
cout<<"\n Alegeti operatia dorita:";
cin>>rasp;
switch (rasp)
{
case 'a':
if(k<n)
{
k++;
cout<<"\n cod container:";
cin>>container.cc;
cout<<"\n continut container:";
cin>>container.continut;
cout<<"\n ziua ambalarii:";
cin>>container.data.zi;
cout<<"\n luna ambalarii:";
cin>>container.data.luna;
cout<<"\n anul ambalarii:";
cin>>container.data.an;
cout<<"\n greutate container:";
cin>>container.greutate;
ptrcontainera=&container;
if(k%2)
obiect1.depune_in_stiva(ptrcontainera);
else
obiect2.depune_in_stiva(ptrcontainera);
}
else
cout<<"\n depasirea capacitatii de depozitare";
break;
case 's':
if(k>=1)
{
ptrcontainers=(struct tipstiva*)malloc(sizeof(struct tipstiva));
if(ptrcontainers==NULL)
{
cout<<"\n memorie insuficienta ptr un container ";
exit(1);
}
if(k%2)
{
obiect1.extrage_din_stiva(ptrcontainers);
containers=*ptrcontainers;
cout<<"\n s-a extras containerul obiectului 1:";
cout<<"\n =======================================:";
cout<<"\n cod container :"<<containers.cc;
cout<<"\n continut container :"<<containers.continut;
cout<<"\n data containerului :"<<containers.data.zi;
cout<<"/"<<containers.data.zi<<"/"<<containers.data.an;
cout<<"\n greutate container :"<<containers.greutate;
}
else
{
obiect2.extrage_din_stiva(ptrcontainers);
containers=*ptrcontainers;
cout<<"\n s-a extras containerul obiectului 2:";
cout<<"\n ===================================:";
cout<<"\n cod container :"<<containers.cc;
cout<<"\n continut container :"<<containers.continut;
cout<<"\n data containerului :"<<containers.data.zi;
cout<<"/"<<containers.data.zi<<"/"<<containers.data.an;
cout<<"\n greutate container :"<<containers.greutate;
}
k--;
}
else
cout<<"\n nu mai sunt containere depozitate";
break;
case 't':
terminat=1;
break;
default:
cout<<"\n operatie gresit selectata";
}
}
}
Rezultatele executiei programului de mai sus, sunt afisate in continuare, punandu-se in
evidenta urmatoarele: initializarea si alocarea memoriei pentru o stiva de structuri, depunerea
adreselor structurilor intr-o stiva si a structurilor aferente la adresle specificate in stiva,
extragerea adreselor structurilor din stiva si a structurilor corespunzatoare de la aceste adrese
precum si distrugerea instantelor celor doua obiecte create in program dupa terminarea folosirii
acestora.
initializarea stivei de containere
initializarea stivei de containere
numarul maxim de containere, n(1<=n<=6)=4
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:a
cod container:100
continut container:ciment
ziua ambalarii:11
luna ambalarii:11
anul ambalarii:2005
greutate container:150
varf stiva =0x00790610
cod container =100
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:a
cod container:200
continut container:var
ziua ambalarii:21
luna ambalarii:11
anul ambalarii:2005
greutate container:400
varf stiva =0x007904F0
cod container =200
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:a
cod container:300
continut container:suruburi
ziua ambalarii:11
luna ambalarii:10
anul ambalarii:2005
greutate container:125
varf stiva =0x00790638
cod container =300
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:a
cod container:400
continut container:saibe
ziua ambalarii:07
luna ambalarii:09
anul ambalarii:2005
greutate container:175
varf stiva =0x00790518
cod container =400
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:r
operatie gresit selectata
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:d
operatie gresit selectata
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:a
depasirea capacitatii de depozitare
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:s
s-a extras containerul obiectului 2:
===================================:
cod container :400
continut container :saibe
data containerului :07/09/2005
greutate container :175
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:s
s-a extras containerul obiectului 1:
=======================================:
cod container :300
continut container :suruburi
data containerului :11/10/2005
greutate container :125
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:s
s-a extras containerul obiectului 2:
===================================:
cod container :200
continut container :var
data containerului :21/i1/2005
greutate container :400
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:s
s-a extras containerul obiectului 1:
=======================================:
cod container :100
continut container :ciment
data containerului :11/11/2005
greutate container :150
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
Alegeti operatia dorita:s
nu mai sunt containere depozitate
a - asezare container in stiva
s - scoatere container din stiva
t - terminare program
s-a distrus instanta obiect2
s-a distrus instanta obiect1