8.3Probleme propuse
Problema 1. Să se construiască o clasă Complex care să facă operaţii cu numere complexe. Definiţia clasei este următoarea
class Complex
{
private:
double real, imag;
public:
Complex(double m, double n);
Complex();
double getReal();
double getImag();
void setReal(double m);
void setImag(double n);
double cabs();
void print();
};
Clasa defineşte două variabile private de tip double, real şi imag, ce corespund părţii reale şi imaginare a numărului complex. Clasa va defini următoarele funcţii
-
Constructor cu parametri ce va iniţializa variabilele real şi imag ale obiectului creat
Complex(double m, double n);
-
Constructor implicit care iniţializează variabilele obiectului la valoarea zero
double getReal();
double getImag();
care dau valoarea variabilelor real şi imag ale obiectului.
void setReal(double m);
void setImag(double n);
care iniţializează variabilele real şi imag ale obiectului,
-
Funcţia cabs() ce calculează modulul numărului complex
double cabs()
-
Funcţia print() ce afişază numărul complex.
Indicaţie. Funcţia print() va conţine instrucţiunea
cout << "numarul complex = " << real << "+i*(" << imag << ")" << endl;
Se va testa clasa Complex calculând modulul numărului complex 3+4i.
Problema 2. Să se definească funcţiile globale sum, dif, mul, div care să facă cele patru operaţii aritmetrice cu numere complexe descrise de clasa Complex. Prototipurile lor sunt
Complex sum(Complex a, Complex b);
Complex dif(Complex a, Complex b);
Complex mul(Complex a, Complex b);
Complex div(Complex a, Complex b);
Funcţiile sum şi dif vor fi declarate funcţii prietene ale clasei pentru a accesa variabilele real şi imag ale obiectelor. Funcţiile mul şi div vor utiliza funcţiile de acces getReal() şi getImag() pentru a accesa variabilele obiectelor.
Se va testa clasa Complex calculând expresiile a+bc şi (a + b) / (a + c) pentru numerele complexe a = 1.5 – 2i, b = 3.28 + 4.35i, c = -3.84 + 5.42i.
9Operaţii cu şiruri tip C++
9.1Clasa string
Limbajul C++ defineşte clasa string pentru operaţii cu şiruri. Definiţia acestei clase se află în biblioteca header .
Clasa are următorii constructori:
-
constructorul implicit care crează un şir vid
string();
-
constructor copiere care are ca argument un şir de tip C sau un şir de tip string
string(const string&);
string(const char *);
Clasa string defineşte următoarele funcţii membre:
-
int length(); – dă lungimea şirului,
-
int size(); – dă lungimea şirului,
-
bool empty(); - are valoarea true dacă şirul este vid,
-
funcţia find() cu prototipul
int find(char * substring);
dă indicele primei apariţii a şirului substring în şirul respectiv. Dacă şirul substring nu există în şir funcţia are ca rezultat lungimea şirului.
-
funcţia erase şterge un subşir din şir. Ea are prototipul
void erase(int index, int size)
Funcţia şterge “size” caractere începând cu caracterul cu indicele index.
-
funcţia replace înlocuieşte un subşir cu altul. Ea are prototipurile
replace(int index, int size, char * sir);
replace(int index, int size, string sir);
şi înlocuieşte subşirul de lungime size ce începe cu caracterul index cu subşirul sir.
-
funcţia substr cu prototipul
string substr(int index, int size);
crează un şir tip string din subşirul de lungime size ce începe cu caracterul index.
Clasa defineşte următorii operatori:
-
operatorii + şi +=(concatenarea şirurilor).
-
operatori de comparare, <, <=, >, >= , = = şi != ce au ca rezultat valorile true sau false.
-
operatorul de selecţie [] ce poate selecta un caracter din şir sau atribui o valoare unui caracter din şir. Trebuie ţinut cont de faptul că indicele primului character din şir este zero.
Menţionăm că, citirea unui şir de caractere de la tastatură într-un şir tip string se poate face cu operatorul de citire >>. Sirul citit se termină la întâlnirea unui caracter spaţiu, ‘\n’ sau ‘\t’. Pentru citirea unui şir de caractere dintr-un fişier într-un obiect tip string este definită funcţia globală getline() cu prototipurile
getline(stream, string& str, char delim);
getline(stream, string& str);
Funcţia citeşte caractere din stream în obiectul str până la întâlnirea caracterului delim (prima variantă) sau până la întâlnirea caracterului ‘\n’ (a doua variantă).
Există funcţii getline() ale obiectului cin cu prototipurile:
getline(char * s, int size, char delim);
getline(char * s, int size);
care citesc caractere în vectorul de caractere s, cel mult size – 1 caractere, sau până la întâlnirea caracterului delimitator, delim (prima variantă), sau caracterului ‘\n’ (a doua variantă). In aceste funcţii se citeşte şi delimitatorul. In acest fel este posibilă citirea unei linii dintr-un fişier tip text.
9.2Probleme rezolvate
Problema 1. Să se construiască un program care citeşte un şir de caractere de la tastatură într-un şir tip C++ şi afişează lungimea lui.
-
se va citi un şir ce nu conţine spaţii cu operatorul >> într-un şir tip string,
-
se va citi un şir ce conţine spaţii cu operatorul >> într-un şir tip string,
-
se va citi un şir ce conţine spaţii cu funcţia getline().
Conform celor de mai sus, operatorul >> citeşte un şir de caractere doar până la primul spaţiu. Programul ce rezolvă problema este următorul.
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string s;
cout<<"dati un sir care nu contine spatii \n";
cin>>s;
cout<<"lungimea sirului="<cout<<"dati un sir care contine spatii \n";
cin>>s;
cout<<"lungimea sirului= "<
cout<<"sirul tine pana la primul spatiu, tab sau CR \n";
// se citeste restul sirului anterior
getline(cin, s, '\n');
cout << "sirul ramas = " << s << endl;
// citirea unei linii intregi intr-un sir tip string cu functia getline
cout<<"dati un sir care contine spatii \n";
getline(cin, s, '\n');
cout<<"lungimea sirului="<
cout<<"citirea cu getline() citeste toata linia \n";
return EXIT_SUCCESS;
}
Rezultatele rulării programului sunt cele de mai jos.
Funcţia
cin >> s ;
citeşte până la primul spaţiu, deci şirul abc. In zona tampon rămâne restul şirului introdus, citit cu prima instrucţiune getline().
Problema 2. Se dă şirul “aDe3-RU*yt”. Să se convertească literele mici în litere mari.
Indicaţie.Se va utiliza funcţia standard
int toupper(char)
din bibliotecile sau . Programul ce rezolvă problema este următorul.
#include
#include
#include
using namespace std;
int main(){
string s="aDe3-RU*yt";
cout << "sirul initial : " << s << endl;
for(int i = 0; i < s.length(); i++)
{
s[i]=toupper(s[i]);
}
cout << "sirul cu majuscule : " << s << endl;
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 3. Se dă şirul “xyz2j7M=*&^”. Să se înlocuiască primele două caractere din şir cu primele două caractere din şirul “abc”. Programul ce rezolvă problema este următorul.
#include
#include
#include
using namespace std;
int main(){
string s="xyz2j7M=*&^";
string s_mic="abc";
cout << "sirul initial : " << s << endl;
//sir_ab preia primele doua caractere, adica a şi b din sirul "abc"
string sir_ab=s_mic.substr(0,2);
//inlocuirea primelor doua caractere din s
s.replace(0, 2, sir_ab);
cout<<"sirul dupa substitutie : "<
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 4. Să se compare şirurile
“abcxd” şi “abdf89k”.
“xyz” şi adk”
“mnp” şi “mnp”
Se va explica de fiecare dată rezultatul. Programul ce rezolvă problema este următorul.
#include
#include
using namespace std;
int main()
{
string sir_1, sir_2;
for(int i = 0; i < 3; i++)
{
cout << "Dati doua siruri" << endl;
cin >> sir_1 >> sir_2;
if(sir_1 < sir_2)
cout << sir_1 << " < " << sir_2 << endl;
else if(sir_1 == sir_2)
cout << sir_1 << " = " << sir_2 << endl;
else
cout << sir_1 << " > " << sir_2 << endl;
}
return EXIT_SUCCESS;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 5. Să se concateneze şirurile “abc”, “x**2” şi “x-y$zk”. Programul ce rezolvă problema este următorul.
#include
#include
using namespace std;
int main(){
string sir1= "abc", sir2 = "x**2", sir3 = "x-y$zk";
string sir4 = " ";
sir4 = sir1 + sir2 + sir3;
cout << "sirul dupa concatenare este " << sir4 << endl;
return 0 ;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 6. Fie un şir de caractere citit de la tastatură. Să se verifice dacă în şirul citit există subşirul “abc”. Sirul citit poate conţine şi spaţii, astfel încât îl vom citi cu funcţia getline(). Programul ce rezolvă problema este următorul.
#include
#include
using namespace std;
int main(){
string sir_citit;
char * sir_abc="abc";
int poz_aparitie;
cout << "dati sirul \n";
// citirea unei linii intregi intr-un sir tip C
getline(cin, sir_citit,'\n');
poz_aparitie = sir_citit.find(sir_abc);
if(poz_aparitie != -1)
cout << "subsirul " << sir_abc << " apare in pozitia " << poz_aparitie << endl;
else
cout << "subsirul " << sir_abc << " nu apare în sirul citit" << endl;
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 7. Să se scrie o funcţie care citeşte un şir de caractere de la tastatură, şterge primul caracter din şir şi apoi afişează pe ecran şirul rezultat. Sirul citit poate conţine şi spaţii, astfel încât îl vom citi cu funcţia getline(). Programul ce rezolvă problema este următorul.
#include
#include
using namespace std;
int main(){
string sir_citit;
cout << "dati sirul \n";
// citirea unei linii intregi
getline(cin, sir_citit, '\n');
// se sterge primul caracter
sir_citit.erase(0,1);
cout << "sirul fara primul caracter = " << sir_citit << endl;
return 0 ;
}
Rezultatele rulării programului sunt cele de mai jos.
Dostları ilə paylaş: |