Documente Academic
Documente Profesional
Documente Cultură
Solutii PDF
Solutii PDF
n aceast seciune sunt prezentate soluii pentru unele din exerciiile propuse
n text. n general, s-au selectat acele exerciii care ofer o modalitate de abordare a
unei anumite categorii de probleme i cele care ofer rspunsuri n situaii mai
deosebite de execuie. Celelalte, care extind doar materialul deja soluionat, rmn ca
exerciiu de programare pentru cititori.
valorii
apoi
Deoarece valoarea *p++ = *q++ este *q, se poate scrie nc mai concis:
while(*p++ = *q++);
214
E1.8
2 Clase i obiecte
E2.4
Mesajele sunt:
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
Nr.
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
obiecte
1
2
3
4
5
4
3
4
5
6
5
4
3
2
1
0
Primele trei obiecte (ob1, ob2, ob3) sunt create la nceputul funciei
main(). La intrarea n blocul nou creat se mai creeaz 2 obiecte (ob4 i ob5) (deci
numrul de obiecte ajunge la 5), care sunt imediat distruse la ieirea din bloc. Dup
aceasta se creeaz un vector de 3 obiecte, care sunt distruse prin apelul operatorului
delete. La ieirea din funcia main() se distrug i cele 3 obiecte rmase, ob1, ob2,
ob3.
E2.5
Soluii
215
class Item{
static int numbers;
// (a)
public:
Item(){ // constructorul creste cu 1 nr obiectelor
numbers++;
cout << "Nr. obiecte " << numbers << endl;
}
~Item(){ //destructorul descreste cu 1 nr obiectelor
numbers--;
cout << "Nr. obiecte " << numbers << endl;
}
};
int Item::numbers = 0;
// (b)
void main(){
Item ob1, ob2, ob3;
{ // se deschide un nou bloc
Item ob4, ob5;
}
Item *pob6 = new Item[3];
delete [] pob6;
}
216
int *p1 = p;
p = new int[count + grows];
for (int j=0; j < i;j++)
p[j] = p1[j];
p[i] = x;
for (j=i; j < count;j++)
p[j+1] = p1[j];
delete p1;
count++;
}
}
return count - 1;
}
}
int IntArray::RemoveAt(int i) {
if (i < 0 || i >= count){
cout << Eroare de stergere element\n;
return 0;
}
else {
for(int j=i; j < count-1;j++)
p[j] = p[j+1];
count--;
return 1;
}
}
0 33 55.
Soluii
217
E2.11 Este necesar ca unele funcii membre ale clasei s acceseze obiecte declarate
const. Deci sunt necesare urmtoarele modificri:
int GetCount() const {return count;}
int GetAt(int i) const;
218
nod
nod
nod
nod
nod
v
v
v
v
v
=
=
=
=
=
5
4
3
2
1
Soluii
219
for (int i=0;i<n;i++)
AddTail(array.GetAt(i));
}
IntDList::IntDList(IntDList& r){
first = 0;
last = 0;
count = 0;
IntDListNode* ref = r.first;
for (int i=0;i<r.count;i++){
AddTail(ref->v);
ref = ref->next;
}
}
IntDList::~IntDList(){
IntDListNode* p = first;
while (p){
IntDListNode* current = p;
p = p->next;
delete current;
}
}
220
Soluii
221
count--;
if (count == 0){
last = 0;
}
return v;
}
}
int IntDList::RemoveTail(){
if (count == 0){
cout << Eroare lista vida\n;
return -1;
}
else {
int v = last->v;
IntDListNode* p = last;
last = last->prev;
if (last)
last->next = 0;
delete p;
count--;
if (count == 0){
first = 0;
}
return v;
}
}
E3.6
void IntTree::preorder(){
preorder1(root);
}
void IntTree::postorder(){
postorder1(root);
}
void IntTree::delTree1(IntTreeNode *root){
if(!root) return;
delTree1(root->left);
delTree1(root->right);
delete root;
}
222
IntTree::~IntTree(){
delTree1(root);
}
E3.7
void PointTree::inorder(){
inorder1(root);
}
Soluii
223
void PointTree::preorder(){
preorder1(root);
}
void PointTree::postorder1(PointNode *root){
if(!root) return;
postorder1(root->left);
postorder1(root->right);
if(root->d) g(root->d);
}
void PointTree::postorder(){
postorder1(root);
}
void PointTree::delTree1(PointNode *root){
if(!root) return;
delTree1(root->left);
delTree1(root->right);
delete root;
}
PointTree::~PointTree(){
delTree1(root);
}
224
void NTree::PostOrder(){
if(first){
NTree *current = first;
NTree *next = current;
while (next){
current = next;
next = next->link;
current->PostOrder();
}
if (label)
cout << "Nod: " << label << endl;
else cout << "Nod: " << endl;
}
void NTree::RemoveChild() {
if (first){
NTree* current = first;
first = first->link;
current->RemoveAll();
}
else cout << "Nu are fii\n";
}
void NTree::RemoveAll() {
if(first) {
NTree *current = first;
NTree *next = first;
while (next){
current = next;
next = next->link;
current->RemoveAll();
delete current->label;
}
}
}
Soluii
225
NTree::~NTree(){
RemoveAll();
if (label){
delete label;
label = NULL;
}
}
4 Suprancrcarea operatorilor
E4.1
Date operator++();
friend ostream& operator <<(ostream& stream, Date& d);
int& operator[](int i);
};
ostream& operator <<(ostream& stream, Date& d){
stream << " Ziua: " << d.day << " Luna: " << d.month
<< " Anul: " << d.year << endl;
return stream;
}
E4.2
226
day = 1;
return *this;
}
if (day==31 && month == 12){
year++;
month = 1;
day = 1;
return *this;
}
if (day < 30){
day++;
return *this;
}
E4.3
return *this;
// afiseaz 2
Soluii
227
String::String(const char* p, int n){
cout << "Constructor init\n";
size = n+1;
str = new char[n+1];
for (int i=0;i<n;i++)
str[i] = p[i];
str[n] = 0;
}
228
Soluii
229
Point::~CPoint(){
cout << "Destructor CPoint\n";
if (coord){
delete coord;
coord = NULL;
}
}
if (i>=dim)
cout <<"Punctele sunt identice\n";
}
}
230
E5.2
E5.3
Soluii
231
CPoint2d(double *p):CPoint(2,p){}
~CPoint2d(){
cout << "Destructor 2d" << endl;
}
void Display (){
cout << "Display 2d ";
cout << *this;
}
};
class CPoint3d:public CPoint{
public:
CPoint3d():CPoint(3){}
CPoint3d(double x, double y, double z):CPoint(3){
cout << "Constructor 3d" << endl;
(*this)[0] = x;
(*this)[1] = y;
(*this)[2] = z;
}
CPoint3d(double *p):CPoint(3,p){}
~CPoint3d(){
cout << "Destructor 3d" << endl;
}
void Display(){
cout << "Display 3d ";
cout << *this;
}
};
232
count++;
}
Soluii
233
DListNode* DList::RemoveTail(){
if (count == 0)return 0;
else {
DListNode* v = last;
last = last->prev;
if (last)last->next = 0;
count--;
if (count == 0)first = 0;
return v;
}
}
}
ostream& operator <<(ostream& stream, IDList& list){
IDListNode* p = list.GetHead();
while (p){
stream << p->GetV()<<" ";
234
p = (IDListNode*)p->GetNext();
}
stream << endl;
return stream;
Dup definirea acestor funcii operator, elementele listei pot fi accesate prin
indexare att pentru citire ct i pentru modificare, deoarece funcia operator []
Soluii
235
236
Constructor copiere
Destructor
Destructor
Destructor
Soluii
237
";
n acest caz, ultimul cmp afiat n fiecare linie este valoarea pointerului
node convertit n ntreg i afiat zecimal.
E7.6
238
Soluii
239
240
p[i] = p1[i];
delete p1;
p[count++] = x;
}
return count-1;
}
template <class E>ostream& operator << (ostream& stream,
TArray<E>& r){
int count = r.count;
for (int i =0;i<count;i++)
stream << r.p[i] <<" ";
stream << endl;
return stream;
}
template <class E> TArray<E>::TArray<E>(E* v, int n){
count = n;
p = new E[count];
for (int i = 0; i < count; i++)
p[i] = v[i];
}
template <class E> int TArray<E>::RemoveAt(int i){
if (i < 0 || i >=count)
return 0;
else {
for(int j=i; j < count-1;j++)
p[j]=p[j+1];
count--;
return 1;
}
}
TArray<Complex> carray;
carray.Add(Complex(3.5,8));
carray.Add(Complex(6,9.2));
cout << carray;
// afiseaza (3.5,8) (6,9.2)
E7.20 O stiva de numere complexe se poate implementa prin clasa template Tlist
astfel:
void ft3(){
TList<Complex> list4;
Soluii
241
list4.AddTail(Complex(1,2));// inserare
list4.AddTail(Complex(3,4));// inserare
list4.AddTail(Complex(5,6));// inserare
cout<< list4.RemoveHead(); //extragere,
cout<< list4.RemoveHead(); //extragere,
cout<< list4.RemoveHead(); //extragere,
cout << endl;
(1,2)
(3,4)
(5,6)
afiseaza (1,2)
afiseaza (3,4)
afiseaza (5,6)
8 Tratarea excepiilor
E8.3
242
}
catch(IntArray::Range r){
cout << "Indicele " << r.GetIndex()
<< " depseste domeniul\n";
}
Se observ faptul c dup tratarea erorii programul este continuat dup rutina
de tratare a excepiei i nu cu instruciunile care urmeaz instruciunii care a provocat
excepia.
E8.4 Se definete clasa global pentru excepia de extragere a unei date dintr-o list
goal astfel:
class Empty{
public:
Empty(){};
};
Captarea i tratarea unei excepii de list vid se poate face n felul urmtor:
Soluii
243
void fdlist3(){
try{
IntDList list2;
list2.AddHead(1);
// push 1
list2.AddHead(2);
// push 2
list2.AddHead(3);
// push 3
cout << list2.RemoveHead();
// pop, afiseaza 3
cout << list2.RemoveHead();
// pop, afiseaza 2
cout << list2.RemoveHead();
// pop, afiseaza 1
cout << list2.RemoveHead();
// lanseaza exceptia
cout << list2.RemoveHead();
}
catch(Empty){
cout << "\nExceptie lista goala\n";
}
cout << Dupa rutina de tratare a excepiei\n;
}
244