Добавил:
farel
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:В2_5
.cpp#include <iostream>
using namespace std;
// Наибольший общий делитель (НОД)
// Наименьшее общее кратное (НОК)
// Требуются для нахождения общего знаменателя дробей при операциях + и -
int gcd(int a, int b) { // НОД
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) { // НОК
return (a * b) / gcd(a, b);
}
// ----------------------------------------------------------------------
class fractional {
int numerator; // Числитель
int denominator; // Знаменатель
public:
fractional() { numerator = denominator = 0; }
fractional(int x, int y) {
numerator = x;
denominator = y;
}
fractional operator + (fractional right) const {
fractional fract;
if (denominator != right.denominator) {
fract.denominator = lcm(denominator, right.denominator);
fract.numerator = numerator * (fract.denominator / denominator) + right.numerator * (fract.denominator / right.denominator);
}
else {
fract.numerator = numerator + right.numerator;
fract.denominator = denominator;
}
return fract;
}
fractional operator - (fractional right) const {
fractional fract;
if (denominator != right.denominator) {
fract.denominator = lcm(denominator, right.denominator);
fract.numerator = numerator * (fract.denominator / denominator) - right.numerator * (fract.denominator / right.denominator);
}
else {
fract.numerator = numerator - right.numerator;
fract.denominator = denominator;
}
return fract;
}
fractional operator * (fractional right) const {
fractional fract;
fract.numerator = numerator * right.numerator;
fract.denominator = denominator * right.denominator;
return fract;
}
fractional operator / (fractional right) {
fractional fract;
fract.numerator = numerator * right.denominator;
fract.denominator = denominator * right.numerator;
return fract;
}
// Перегрузка операторов отношения
bool operator == (fractional right) {
return getValue() == right.getValue();
}
bool operator >= (fractional right) {
return getValue() >= right.getValue();
}
bool operator <= (fractional right) {
return getValue() <= right.getValue();
}
bool operator != (fractional right) {
return getValue() != right.getValue();
}
bool operator > (fractional right) {
return getValue() > right.getValue();
}
bool operator < (fractional right) {
return getValue() < right.getValue();
}
double getValue() { // Получение десятичного значения дроби
return ((double)numerator / denominator);
}
friend ostream & operator<< (ostream& out, fractional _fractional) { // Перегрузка оператора вывода
out << _fractional.numerator << '/' << _fractional.denominator;
return out;
}
};
int main() {
fractional fract1(5, 6), fract2(2, 3), fract3;
cout << "fract1 = " << fract1 << " = " << fract1.getValue() << endl;
cout << "fract2 = " << fract2 << " = " << fract2.getValue() << endl;
fract3 = fract1 * fract2;
cout << "fract3 = " << fract3 << " = " << fract3.getValue() << endl;
cout << endl;
cout << fract1.getValue() << " != " << fract2.getValue() << ' ' << (fract1 != fract2 ? "True" : "False") << endl;
cout << fract1.getValue() << " == " << fract2.getValue() << ' ' << (fract1 == fract2 ? "True" : "False") << endl;
cout << fract1.getValue() << " >= " << fract2.getValue() << ' ' << (fract1 >= fract2 ? "True" : "False") << endl;
cout << fract1.getValue() << " <= " << fract2.getValue() << ' ' << (fract1 <= fract2 ? "True" : "False") << endl;
cout << fract1.getValue() << " > " << fract2.getValue() << ' ' << (fract1 > fract2 ? "True" : "False") << endl;
cout << fract1.getValue() << " < " << fract2.getValue() << ' ' << (fract1 < fract2 ? "True" : "False") << endl;
system("pause");
return 0;
}