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 :
|
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