Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Obiective ......................................................................................................................................
U10.1. Prelucrarea string-urilor în C++ ........................................................................................
U10.2. Clasa complex din C++ .....................................................................................................
strstreambase();
strstreambase(const char* buf, int n, char* start);
Primul constructor crează un obiect al clasei strstreambase, fără a specifica însă şirul de
caractere cu care se va lucra. Legătura se va face dinamic cu un şir de caractere prima dată când
obiectul va fi utilizat.
Al doilea constructor crează un obiect de strstreambase, obiect ce va folosi şirul de
caractere aflat la adresa buf, care are lungimea n, al cărui poziţie de pornire este start.
Funcţia membră rdbuf clasei strstreambase va returna adresa buffer-ului (obiect al clasei
strstreambuf), cu care lucrează fluxul de tip string:
strstreambuf* rdbuf();
Din clasele istream şi strstreambase este derivată clasa istrstream, care este
specializată (după cum îi spune numele şi clasele din care este derivată) pentru a lucra cu fluxuri
de intrare de tip string:
ostrstream();
ostrstream(char* s, int n, int poz=ios::out);
Primul constructor crează un obiect de tipul ostrstream, obiect care va lucra cu un şir de
caractere alocat dinamic.
Al doilea constructor crează un obiect al clasei ostrstream şi specifică faptul că acesta va
lucra cu şirul de caractere s de lungime maximă n. Poziţionarea în string-ul s se face implicit la
începutul acestuia. Dacă ultimul parametru este specificat ca având valoarea ios::app sau
ios::ate, atunci poziţionarea în string-ul s se va face pe ultima poziţie a acestuia, adică pe poziţia
pe care se afla caracterul ‘\0’ (delimitatorul de sfârşit de string).
Pe lângă cei doi constructori, clasa ostrstream mai are două funcţii membre:
Din clasele iostream, istrstream şi ostrstream este derivată clasa strstream, care este o
clasă de fluxuri ce lucrează cu string-uri ce suportă operaţii atat de intrare, cât şi de ieşire:
iostream istrstream ostrstream
strstream
strstream();
strstream(char* s, int n, int poz=ios::out);
Primul constructor crează un obiect de tipul strstream, obiect care va lucra cu un şir de
caractere alocat dinamic.
Al doilea constructor crează un obiect al clasei strstream şi specifică faptul că acesta va
lucra cu şirul de caractere s de lungime maxima n. Poziţionarea în string-ul s se face implicit la
începutul acestuia. Dacă valoarea ultimului parametru este ios::app sau ios::ate, atunci
poziţionarea în string-ul s se va face pe ultima poziţie a acestuia, adică pe poziţia pe care se afla
caracterul ‘\0’ (delimitatorul de sfârşit de string).
Pe lângă cei doi constructori, în clasa strstream există şi funcţia membră str(), care
returnează adresa către şirul de caractere cu care lucrează fluxul.
Când se doreşte a se lucra cu fluxuri de tip string se instanţiază una dintre clasele:
istream, ostream şi strstream. Prelucrarea string-ului se face utilizând metodele din clasele
superioare: ios, istream, ostream, strstreambase.
Spre exemplificare, prezentăm următorul program care efectuează operaţii aritmetice cu
numere reale (citirea expresiei matematice se face dintr-un string):
# include <stdio.h>
# include <conio.h>
# include <math.h>
# include <iostream.h>
# include <strstrea.h>
void main(void)
{
char s[100],c=0,op;
float nr1,nr2;
istrstream *si;
do
{
cout<<" Calcule matematice (operatii: +,-,*,/,^)"<<endl;
cout<<"---------------------------------------------)"<<endl;
cout<<endl<<"<numar_real> <operator> <numar_real>: ";
gets(s);
cout<<endl;
si=new istrstream(s); // construire obiect
*si>>nr1>>op>>nr2;
if (!si->bad()) switch (op)
{
case '+':
cout<<nr1<<op<<nr2<<"="<<(nr1+nr2);
break;
case '-':
cout<<nr1<<op<<nr2<<"="<<(nr1-nr2);
break;
case '*':
cout<<nr1<<op<<nr2<<"="<<(nr1*nr2);
break;
case '/':
if (nr2)
cout<<nr1<<op<<nr2<<"="<<(nr1/nr2);
else cout<<"Eroare! Impartire prin 0.";
break;
case '^': // ridicare la putere
if (nr1>0)
cout<<nr1<<op<<nr2<<"="<<pow(nr1,nr2);
else cerr<<"Eroare! Numar negativ.";
break;
default:
cerr<<"Eroare! Operator necunoscut";
}
else cerr<<"Eroare! Utilizare incorecta.";
cout<<endl<<endl<<"Apasati Esc pentru a parasi programul,";
cout<<" orice alta tasta pentru a continua.";
c=getch();
delete si; // distrugere obiect
}
while (c!=27);
}
Rezumat
Pentru prelucrarea string-urilor în C++ instanţiem una din clasele: istrstream, ostrstream
sau strstream. Practic, un şir de caractere NULL terminat se “îmbracă” într-un obiect pentru a fi
prelucrat, urmând ca în final el să poată fi extras din obiect cu metoda str() care returnează
adresa şirului.
complex();
complex(double Re, double Im=0);
Primul constructor crează un obiect fără a iniţializa partea reală şi cea imaginară a
numarului complex.
Al doilea constructor iniţializează partea reală şi pe cea imaginară cu cele două valori
primite ca argumente. Pentru al doilea argument există valoarea implicită 0. Evident, în cazul în
care valoarea pentru partea imaginară este omisă, la construcţia obiectului complex ea se va
iniţializa cu 0 (vezi capitolul dedicat valorilor implicite pentru parametrii funcţiilor în C++).
Există o mulţime de funcţii (matematice) definite ca fiind prietene clasei complex:
re 2 im 2
# include <stdio.h>
# include <conio.h>
# include <complex.h>
# include <iostream.h>
# include <strstrea.h>
void main(void)
{
char s[100],c=0,op;
complex nr1,nr2; // doua numere complexe (obiecte complex)
istrstream *si;
do
{
cout<<" Calcule cu numere complexe (+, -, *, / si ^)"<<endl;
cout<<"---------------------------------------------)"<<endl;
cout<<endl<<"<numar_complex> <operator> <numar_complex>: ";
gets(s);
cout<<endl;
si=new istrstream(s);
*si>>nr1>>op>>nr2;
if (si->good())
switch (op)
{
case '+':
cout<<nr1<<op<<nr2<<"="<<(nr1+nr2);
break;
case '-':
cout<<nr1<<op<<nr2<<"="<<(nr1-nr2);
break;
case '*':
cout<<nr1<<op<<nr2<<"="<<(nr1*nr2);
break;
case '/':
if (abs(nr2))
cout<<nr1<<op<<nr2<<"="<<(nr1/nr2);
else cout<<"Eroare! Impartire prin 0.";
break;
case '^': // ridicare la putere
cout<<nr1<<op<<nr2<<"="<<pow(nr1,nr2);
break;
default:
cerr<<"Eroare! Operator necunoscut.";
}
else cerr<<"Eroare! Utilizare incorecta.";
cout<<endl<<endl<<"Apasati Esc pentru a parasi programul,";
cout<<" orice alta tasta pentru a continua.";
c=getch();
delete si;
}
while (c!=27);
}
Rezumat
În finalul fiscuţiei noastre despre programarea orientată pe obiecte din C++ am prezentat
clasa complex scrisă pentru lucrul cu numere complexe. Nu prea avem membri în clasa complex
ci mai mult funcţii prietene pentru a apropia mai mult modul de lucru cu numere complexe de cel
cu numere reale din C.