#include "pch.h" #include <iostream> #include <cmath> #include <ctime> using namespace std; #define N 10 class Fraction { private: int chys, zn; public: Fraction() : chys(0), zn(0) {} Fraction(int chysl, int znl) : chys(chysl), zn(znl) {} Fraction(const Fraction &obj) : chys(obj.chys), zn(obj.zn) {} int GetChys() { return chys; } int GetZn() { return zn; } void setFraction(int x, int y) { chys = x; zn = y; } int CommonZn(Fraction *obj) { int q = 0; int i = 0; for (i = 1; q != 1; i++) { if ((i % this->zn == 0) && (i % obj->zn == 0)) { q = 1; this->chys *= (i / this->zn); obj->chys *= (i / obj->zn); } } this->zn = i - 1; obj->zn = i - 1; return i - 1; } int skor(int *chys, int *zn) { int i = 0, b = 0; if (*chys > *zn) { b = *chys; } else (b = *zn); for (i = b; i > 0; i--) { if (*chys%i == 0 && *zn%i == 0) { *chys = *chys / i; *zn = *zn / i; return 0; } } } Fraction const& operator=(const Fraction &second) { chys = second.chys; zn = second.zn; return *this; } bool operator == (const Fraction &obj) { Fraction second_common = obj; this->CommonZn(&second_common); return (this->chys == obj.chys); } bool operator >= (const Fraction &obj) { Fraction second_common = obj; this->CommonZn(&second_common); return (this->chys >= obj.chys); } bool operator > (const Fraction &obj) { Fraction second_common = obj; this->CommonZn(&second_common); return (this->chys / this->zn > obj.chys / obj.zn); } bool operator < (const Fraction &obj) { Fraction second_common = obj; this->CommonZn(&second_common); return ((double)this->chys / this->zn < (double)obj.chys / obj.zn); } bool operator <= (const Fraction &obj) { Fraction second_common = obj; this->CommonZn(&second_common); return (this->chys <= obj.chys); } friend Fraction operator +(const Fraction &first, const Fraction &second); friend Fraction operator -(const Fraction &first, const Fraction &second); friend Fraction operator /(const Fraction &first, const Fraction &second); friend Fraction operator *(const Fraction &first, const Fraction &second); friend istream &operator >> (istream &in, Fraction &fraction); friend ostream &operator << (ostream &out, const Fraction &fr); ~Fraction() {} }; Fraction operator +(const Fraction &first, const Fraction &second) { Fraction first_common = first, second_common = second; first_common.CommonZn(&second_common); return Fraction(first_common.GetChys() + second_common.GetChys(), first_common.GetZn()); } Fraction operator -(const Fraction &first, const Fraction &second) { Fraction first_common = first, second_common = second; first_common.CommonZn(&second_common); return Fraction(first_common.GetChys() - second_common.GetChys(), first_common.GetZn()); } Fraction operator /(const Fraction &first, const Fraction &second) { return Fraction(first.chys*second.zn, first.zn*second.chys); } Fraction operator *(const Fraction &first, const Fraction &second) { return Fraction(first.chys*second.chys, first.zn*second.zn); } istream &operator >> (istream &in, Fraction &fraction) { in >> fraction.chys; in.ignore(1); in >> fraction.zn; return in; } ostream &operator << (ostream &out, const Fraction &fr) { out << fr.chys << "/" << fr.zn; return out; } void Sort(Fraction *FrArray[]); //double avarage(Fraction FrArray[]); int main() { system("chcp 1251"); system("color f0"); system("cls"); srand(time(nullptr)); int chys1, zn1, chys2, zn2; Fraction *PtrFrArray[N]; for (int i = 0; i < N; i++) { PtrFrArray[i] = new Fraction(1 + rand() % 10, 1 + rand() % 10); cout << *PtrFrArray[i] << endl; } Sort(PtrFrArray); cout << endl << "Сортований масив: " << endl; for (int i = 0; i < N; ++i) { cout << *PtrFrArray[i] << endl; } cout << endl; double avar = 0.0; for (int i = 0; i < N; i++) { avar += (double) (*PtrFrArray[i]).GetChys() / (*PtrFrArray[i]).GetZn(); } cout << "Середнє значення масиву = " << avar/N << endl << endl; for (int i = 0; i < N; i++) { delete PtrFrArray[i]; } Fraction *A = new Fraction(); cout << "\nПерший дріб = " << endl; cin >> *A; Fraction *B = new Fraction(); cout << "\nДругий дріб = " << endl; cin >> *B; Fraction *C = new Fraction(*A); cout << "Третій дріб " << endl; cin >> *C; if (*A < *C && *C < *B) cout << "A < C < B: " << "Успішне порівняння" << endl; else cout << "A < C < B: " << "Помилка" << endl; cout << "A + B + C = " << *A + *B + *C; delete A; delete B; delete C; getchar(); getchar(); return 0; } void Sort(Fraction *FrArray[]) { Fraction changer; for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { if (*FrArray[i] > *FrArray[j]) { changer = *FrArray[i]; *FrArray[i] = *FrArray[j]; *FrArray[j] = changer; } } } } /*double avarage(Fraction *FrArray[]) { double avar = 0.0; for (int i = 0; i < N; i++) { avar = avar + (double)(*FrArray[i]).GetChys()/ (*FrArray[i]).GetZn(); } return(avar/N); }*/
1 answer
Yes, about the same - just the role of first
now your *this
.
Fraction Fraction::operator +(const Fraction &second) const { Fraction first_common = *this, second_common = second; first_common.CommonZn(&second_common); return Fraction(first_common.GetChys() + second_common.GetChys(), first_common.GetZn()); }
But what is the deep meaning of it? This +=
operator makes sense as a class member to define.
Look, if you had a type constructor
Fraction(int chysl, int znl = 1) : chys(chysl), zn(znl) {}
then assignment
Fraction x, y; ... y = 1 + x;
with a free addition operator, it would make sense. And with a member-operator of a class, the first item should be only an object of this class itself - i.e.
y = Fraction(1) + x;