PROBLEME REZOLVATE


1.Sa se construiasca clasa String continand :

-un pointer la sirul stocat in memoria dinamica (si eventual lungimea sirului )

-constructori de clasa si de copiere

-destructor

-supraincarcari pentru operatorii :

  • ! test de si vid
  • + concatenare cu obtinerea unui sir nou
  • += concatenare la un sir existent
  • [ ] pentru referirea unui caracter din sir sub forma s[3]='a' sau c=s[3]
  • == si != si alte comparatii intre siruri

REZOLVARE :

#include<iostream.h>

#include<string.h>

#include<stdlib.h>

class string {

char *sir; //un pointer la sirul stocat in memoria dinamica sau se mai spune pointer la primul caracter

int l; //lungimea sirului

public :

string (int size=0) { //constructor care creeaza un sir vid implicit

l=size ;

sir=new char[l+1];

*sir='\0'; //terminator de sir

}

string(char *s) {

//constructor ce foloseste un sir existent

l=strlen(s) ;//preia lungimea textului

sir=new char[l+1] ;

strcpy(sir,s);

}

string(string &s){

//constructor de copiere pt.atribuirea de la un alt obiect

l=s.l ; //lungimea celuilalt sir

sir=new char[l+1] ; //aloca memorie

strcpy(sir,s.sir); //copiaza textul

}

~string() {delete [] sir;} //destructor inline

bool operator !(){return l==0 ;} //test de sir vid

string operator +(string s) ; //concatenare cu obtinerea unui sir nou

string operator +=(string s); //concatenare la un sir existent

bool operator ==(string s){return strcmp(sir,s.sir)==0;}

/*strcmp(s1,s2) returneaza 0 daca s1 si s2 sunt identice

mai mic decat 0 daca s1<s2

mai mare decat 0 daca s1>s2 */

bool operator !=(string s){return strcmp(sir,s.sir)!=0 ;}

bool operator <(string s) {return strcmp(sir,s.sir)<0;}

bool operator >(string s) {return strcmp(sir,s.sir) >0 ;}

char &operator [](int poz); //pt.referire caracter din sir s1[1]='A'si c=s1[3]

void afisare () {cout<<sir<<endl;} //afisare sir

};

string string ::operator +(string s)

{

string aux(l + s.l);

strcpy(aux.sir,sir);

strcat(aux.sir,s.sir); //strcat(s1,s2) concateneaza s2 la sfarsitul lui s1

return aux;

}

string string :: operator +=(string s)

{

l+=s.l ;

char *aux=sir;

sir=new char[l+1];

if(sir==NULL){

cout<<"eroare de alocare !";

exit(1);

}

strcpy(sir,aux);

strcat(sir,s.sir);

delete [] aux;

return *this ;

}

char &string ::operator [](int poz)

{

if(poz>=0 && poz<l) return sir[poz];

else

{

cout<<"Indicele specificat nu exista in sirul de caractere ,este in afara domeniului \n";

return sir[0];

}

}

main()

{ string s;

s.afisare();

if(!s) cout<<"sirul este vid !\n";

else cout<<"sirul nu este vid!\n";

//concatenare cu obtinerea unui sir nou

string s1("c++"),s2("este un limbaj de programare ");

s1.afisare();

s2.afisare();

string s3=s1+s2;

s3.afisare();

if(!s1) cout<<"sirul s1 este vid !\n";

else cout<<"sirul s1 nu este vid!\n";

//concatenare la un sir existent

string s4("orintat obiect ");

s3+=s4;

s3.afisare();

//compara daca doua siruri sunt identice ca text (continut)

if(s1==s2)cout<<"sirurile s1 si s2 sunt identice ca text !\n";

if(s1!=s2) cout<<"sirurile s1 si s2 nu sunt identice ca text !\n";

if(s1<s2) cout<<"sirul s1 este mai mic decat sirul s2 !\n";

if(s1>s2) cout<<"sirul s1 este mai mare decat sirul s2!\n";

//atribuim indicelui s1[1]='A'

s1[1]='A';

s1.afisare();

s1[5]='B'; //va afisa eroare;sirul s1 are 0,1,2 caractere deci s1[5]nu se incadreaza in domeniu

//reciproca de mai sus preluam de la indice un caracter c=s1[1]

char c=s1[1];

cout<<c<<"\n";

return 0;

}


 

REZOLVARE :

#include<iostream.h>

#include<math.h>

#define MAXINT 32767 //short int

int cmmdc(int a ,int b) //atentie !!! aceasta functie nu se scrie in clasa

{

//se determina cel mai mare divizor comun a doua numere prin metoda scaderilor succesive

if(a==0) return b;

a=abs(a);

b=abs(b);

while (a!=b)

if(a>b) a-=b;

else b-=a;

return a;

}

class fractie {

int nr ; //numarator

int nm ; //numitor

public :

fractie (int numa,int numi); //pornind de la doi intregi cu semnul pus la oricare

fractie (int n) { nr=n ; nm=1;} //pornind de la un intreg caruia ii pune numitorul 1

fractie(float f) ; //pornind de la un float

fractie() {nr=0 ;nm=1;} //constructor implicit generand fractia 0/1

fractie operator +(fractie f); //adunare de fractii

fractie operator -(fractie f); //scadere de fractii

fractie operator /(fractie f); //impartire de fractii

fractie operator *(fractie f); //inmultire fractii

friend bool operator ==(fractie &a,fractie b) {return (a.nr==b.nr && a.nm==b.nm) ? 1 :0 ;}

friend bool operator <(fractie &a,fractie b) {return (a.nr*b.nm < a.nm*b.nr) ? 1 : 0 ;}

 

operator float (){return nr/(float)nm;} //cast pentru conversie la tipul float

operator double(){return nr/(double)nm;}

void afisare () {cout<<nr<<"/"<<nm<<"\n"<<endl;}

void simplifica ();

void amplifica (int n) {nr*=n; nm*=n; } //nr*=n inseamna nr=nr*n (identice)

void reduce(int n ) ;

};

fractie :: fractie (int numa,int numi) //constructor pornind de la doi intregi cu semnul pus la oricare

{

if (numi==0) {

nr=MAXINT;

nm=1;

}

else

if(numi<0) {

nr=-numa;

nm=-numi;

}

else {

nr=numa;

nm=numi;

}

}

void fractie ::simplifica()

{

//simplifica fractia cu cmmdc apeland functia cmmdc(nr,nm)

int a;

a=cmmdc(nr,nm); //apel functie cmmdc

nr/=a;

nm/=a;

}

 

fractie fractie :: operator +(fractie f)

{

fractie aux;

aux.nr=nr*f.nm + nm*f.nr ;

aux.nm=nm * f.nm;

return aux ;

}

fractie fractie :: operator -(fractie f)

{

fractie aux;

aux.nr=nr*f.nm-nm*f.nr;

aux.nm=nm*f.nm;

if(aux.nm<0) {

aux.nr=-aux.nr;

aux.nm=-aux.nm ;

}

return aux;

}

fractie fractie :: operator *(fractie f)

{

fractie aux;

aux.nr=nr*f.nr;

aux.nm=nm *f.nm;

return aux ;

}

fractie fractie :: operator /(fractie f)

{

fractie aux;

aux.nr=nr*f.nm;

aux.nm=nm*f.nr;

return aux ;

}

void fractie ::reduce(int n)

{

//reducere cu un intreg daca e posibil

if(nr%n==0 && nm%n==0 ) {

nr/=n;

nm/=n;

}

else cout<<"nu se poate reduce ";

}

main ()

{

fractie f0(1,2) , f1(1,10) ;

fractie f2=f0+f1;

f2.afisare();

cout<<"fractia simplificata este ";

f2.simplifica();

f2.afisare();

fractie f3=f0-f1;

f3.afisare();

cout<<"fractia simplificata este ";

f3.simplifica();

f3.afisare();

 

fractie f4=f0*f1;

f4.afisare();

cout<<"fractia simplificata este ";

f4.simplifica();

f4.afisare();

fractie f5=f0/f1;

f5.afisare();

cout<<"fractia simplificata este ";

f5.simplifica();

f5.afisare();

float x=f0; // apelare functia de cast de tip float

cout<<x<<endl;

double y=f1; //apelare functia de cast de tip double

cout<<y<<endl;

 

int n;

cout<<"dati numarul cu care sa se amplifice prima fractie ";

cin>>n;

f0.amplifica(n);

f0.afisare();

int z;

cout<<"dati numarul cu care sa se reduca prima fractie ";

cin>>z;

f0.reduce(z);

f0.afisare();

//comparatii intre functii

if (f0==f1) cout<<"fractiile sunt identice \n";

else cout<<"fractiile nu sunt identice \n";

if(f0<f1) cout<<"fractia f0 < f1 \n";

else cout<<"fractia f0 > f1 \n";

return 0 ;

}


 

 

 

 

 

 

 

 

 


Proiect realizat de MARTON (POP) CLAUDIA an IV Ianuarie 2005