9.3Probleme propuse
Problema 1. Se dă şirul “xyz2j7M=*&^”. Să se înlocuiască ultimele două caractere din şir cu şirul “abcd”.
Problema 2. Să se construiască o funcţie care să compare două şiruri şi să aibe rezultatul 1 dacă şirurile sunt egale şi 0 în caz contrar. Prototipul funcţiei va fi
int strgcomp(string str1, string str2);
In funcţia main() se vor citi perechi de şiruri de la tastatură, se vor compara cu funcţia scrisă şi se va afişa rezultatul într-o instructiune for.
Problema 3. Să se construiască o funcţie care să transforme literele mici dintr-un şir în litere mari. Prototipul funcţiei va fi
void strgcnv(string& x);
In funcţia main() se vor citi şiruri de tastatură ce se vor transforma cu funcţia scrisă într-o instructiune for.
Problema 4. Să se construiască o funcţie care să transforme componentele pare ale unui şir tip string în spaţii. Prototipul funcţiei va fi
void strgcnv(string& x);
In funcţia main() se vor citi şiruri de tastatură ce se vor transforma cu funcţia scrisă într-o instructiune for.
Problema 5. Să se citească un şir de la tastatură. Să se afişeze şirul citit şi şirul în ordine inversă.
Problema 6. Să se citească două şiruri de la tastatură, să se concateneze şi să se steargă primul şi ultimul caracter din şirul rezultat.
10Moştenirea
Moştenirea este un concept al programării cu obiecte. Moştenirea ne permite să creăm clase care sunt derivate din alte clase existente, astfel încât ele includ unii dintre membri claselor părinte, variabile şi funcţii. Clasa derivată moşteneşte membrii clasei părinte, funcţii şi variabile. În acest fel putem construi programe complexe din obiecte simple. Clasa care este moştenită se numeşte clasă de bază sau superclasă, iar clasele care moştenesc se numesc clase derivate sau subclase. Clasa de bază conţine caracteristicile comune ale mai multor elemente. Clasele care moştenesc sunt clase particulare ce adaugă doar elementele proprii. Cu ajutorul moştenirii reutilizăm clase deja construite.
Diagrama sintactică a definirii unei clase derivate este
class NumeClasaDerivata : acces NumeClasaBaza
{
// definitia clasei derivate
};
În această definiţie cuvântul cheie acces din definiţia clasei poate fi public, protected sau private. Specificatorii de acces au următoarea semnificaţie.
-
public, spune că variabilele declarate public şi protected în clasa de bază sunt moştenite cu acelaşi tip de acces,
-
protected, spune că variabilele declarate public şi protected în clasa de bază sunt moştenite cu specificatorul protected. Ele pot fi utilizate în clasele derivate, dar nu de obiecte,
-
private, spune că variabilele declarate public şi protected în clasa de bază sunt moştenite cu specificatorul private.Ele nu pot fi utilizate de obiecte.
O clasă derivată moşteneşte toţi membri clasei de bază exceptând constructorii, destructorul şi operatorul =. Deşi constructorii nu sunt moşteniţi, constructorul implicit şi destructorul clasei de bază sunt totdeauna apelaţi când un obiect de tipul clasei derivate este creat sau distrus. În constructorul clasei derivate se apelează la început constructorul implicit al clasei de bază. Dacă este nevoie, putem apela explicit un constructor al clasei de bază pentru iniţializarea variabilelor. Apelarea sa se face astfel
NumeClasaDerivata(lista de parametri) : NumeClasaBaza (lista de parametri)
{
/* definitia constructorului clasei derivate */
}
10.1Probleme rezolvate
Problema 1. Se va defini o clasă Base ce conţine două numere întregi x, y şi o functie care să afişeze aceste numere. Programul ce rezolvă problema este următorul.
class Base
{
protected:
int x, y;
public:
Base();
Base(int, int);
void print();
};
Se va defini o clasă Pixel ce descrie un pixel pe ecran şi moşteneşte clasa Base. Un pixel este caracterizat de coordonatele punctului (care sunt cele din clasa Base) şi culoare ce va fi o variabilă de tip întreg din clasa Pixel.
class Pixel : public Base
{
protected:
int culoare;
public:
Pixel();
Pixel(int, int, int);
};
Se va defini o funcţie globală ce va descrie un pixel translat cu valorile dx, dy, cu prototipul :
translate(Pixel&, int dx, int dy);
Coordonatele noului punct sunt x + dx şi y + dy.
#include
using namespace std;
class Base
{
protected:
int x, y;
public:
Base(){x=0;y=0;};
Base(int x1, int y1) {x=x1;y=y1;};
void print(){cout<<"(x,y)=("<
};
class Pixel: public Base
{
protected:
int culoare;
public:
Pixel(int x1, int y1, int c1){x=x1;y=y1;culoare=c1;};
Pixel() : Base(){culoare=0;};
friend void translate(Pixel &p,int dx,int dy);
void printp(){print();cout<<"culoare="<
};
void translate(Pixel &p,int dx,int dy)
{
p.x = p.x + dx; p.y = p.y + dy;
}
int main(){
Pixel p(2,3,1);
cout<<"pixelul initial"<
p.printp();
translate(p,1,1);
cout<<"pixelul translatat"<
p.printp();
}
Rezultatele rulării programului sunt cele de mai jos.
Menţionăm că am definit variabilele clasei de bază x şi y de tipul protected. In acest fel ele pot fi utilizate în clasa derivată.
Problema 2. Să se definească o clasă Ratio ce descrie numere raţionale, ce moşteneşte din clasa Base. Numărătorul şi numitorul numărului raţional vor fi variabilele x şi y din clasa Base. Programul ce rezolvă problema este următorul.
class Ratio : public Base
{
public:
Ratio();
Ratio(int, int);
};
Se vor defini funcţii globale care să efectueze cele patru operaţii aritmetice cu numere rationale, +, -, *, /. Funcţiile au prototipurile
Ratio add(Ratio&, Ratio&);
Ratio sub(Ratio&, Ratio&);
Ratio mul(Ratio&, Ratio&);
Ratio div(Ratio&, Ratio&);
Fie numerele întregi a = 2 / 5, b = 3 / 7, c = - 4 / 3, d = -1 / 1. Se vor calcula expresiile a + b, a + b * c, (a + b) / (a + d). Programul ce rezolvă problema este următorul.
#include
using namespace std;
class Base
{
protected:
int x, y;
public:
Base(){x=0;y=0;};
Base(int x1, int y1) {x=x1;y=y1;};
void print(){cout<<"(x,y)=("<
};
class Ratio : public Base
{
public:
Ratio() : Base(){};
// se va observa modul de apel al constructorului din clasa
// de baza în clasa derivata
Ratio(int x1, int y1): Base(x1,y1){}
friend Ratio add(Ratio a, Ratio b);
friend Ratio sub(Ratio a, Ratio b);
friend Ratio mul(Ratio a, Ratio b);
friend Ratio div(Ratio a, Ratio b);
};
Ratio add(Ratio a, Ratio b)
{
Ratio temp;
temp.x=a.x*b.y+a.y*b.x;
temp.y=a.y*b.y;
return temp;
}
Ratio sub(Ratio a, Ratio b)
{
Ratio temp;
temp.x=a.x*b.y-a.y*b.x;
temp.y=a.y*b.y;
return temp;
}
Ratio mul(Ratio a, Ratio b)
{
Ratio temp;
temp.x=a.x*b.x;
temp.y=a.y*b.y;
return temp;
}
Ratio div(Ratio a, Ratio b)
{
Ratio temp;
temp.x=a.x*b.y;
temp.y=a.y*b.x;
return temp;
}
void main(){
Ratio a(2,5),b(3,7),c(-4,3),d(-1,1),rez;
rez=add(a,b);
cout<<"a+b=";
rez.print();
rez=add(a,mul(b,c));
cout<<"a+b*c=";
rez.print();
rez=div(add(a,b),add(a,d));
cout<<"(a + b) / (a + d)=";
rez.print();
}
Rezultatele rulării programului sunt cele de mai jos.
Dostları ilə paylaş: |