Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

В2_5

.cpp
Скачиваний:
7
Добавлен:
01.02.2019
Размер:
4 Кб
Скачать
#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;
}
Соседние файлы в предмете Программирование на C++