Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- using namespace std;
- const int maxSize = 16;
- const int maxVal = 32767;
- int takeIntValue(int max, int min) {
- int length;
- bool isCorrect;
- do {
- isCorrect = true;
- try {
- cin >> length;
- if (cin.fail()) throw 1;
- if (length > max || length < min) throw 2;
- }
- catch (int exc) {
- if (exc == 1) {
- cin.clear();
- cin.ignore(32767, '\n');
- isCorrect = false;
- cout << "Введено недопустимое значение!";
- }
- else {
- isCorrect = false;
- cout << "Введено значение, выходящее за пределы!";
- }
- }
- } while (!isCorrect);
- return length;
- }
- bool checkContract(int num, int denom) {
- bool isContract = false;
- int i = 2;
- if (num > denom || (num < 0 && denom < 0))
- isContract = true;
- while (!isContract && i <= sqrt(denom)) {
- if (num % i == 0 && denom % i == 0)
- isContract = true;
- i++;
- }
- return isContract;
- }
- class fraction{
- protected:
- int numerator = 0;
- int denominator = 0;
- public:
- friend fraction operator + (fraction frac1, fraction frac2);
- friend fraction operator * (fraction frac1, fraction frac2);
- friend istream& operator >> (istream &cin, fraction &frac);
- friend ostream& operator << (ostream &cout, fraction frac);
- void contract() {
- if (numerator < 0 && denominator < 0) {
- numerator *= -1;
- denominator *= -1;
- }
- int i = 2;
- while (i <= sqrt(denominator)) {
- if (numerator % i == 0 && denominator % i == 0) {
- numerator /= i;
- denominator /= i;
- }
- i++;
- }
- }
- };
- istream& operator >> (istream &cin, fraction &frac) {
- bool isCorrect;
- do {
- isCorrect = true;
- cout << "Введите числитель: ";
- frac.numerator = takeIntValue(maxVal, -maxVal);
- cout << "Введите знаменатель: ";
- frac.denominator = takeIntValue(maxVal, -maxVal);
- if (checkContract(frac.numerator, frac.denominator)) {
- cout << "Дробь не соответствует условию!\n";
- isCorrect = false;
- }
- } while (!isCorrect);
- return cin;
- }
- ostream& operator << (ostream &cout, fraction frac) {
- cout << frac.numerator << "/" << frac.denominator;
- return cout;
- }
- fraction operator + (fraction frac1, fraction frac2) {
- if (frac1.denominator != frac2.denominator) {
- frac1.numerator *= frac2.denominator;
- frac2.numerator *= frac1.denominator;
- frac1.numerator += frac2.numerator;
- frac1.denominator *= frac2.denominator;
- }
- else {
- frac1.numerator += frac2.numerator;
- }
- frac1.contract();
- return frac1;
- }
- fraction operator * (fraction frac1, fraction frac2) {
- frac1.numerator *= frac2.numerator;
- frac1.denominator *= frac2.denominator;
- frac1.contract();
- return frac1;
- }
- int main() {
- SetConsoleOutputCP(1251);
- fraction fract1, fract2;
- cout << "Заполните первую дробь.\n";
- cin >> fract1;
- cout << "Заполните вторую дробь.\n";
- cin >> fract2;
- cout << "Сумма дробей равна " << fract1 + fract2 << endl;
- cout << "Произведение дробей равно " << fract1 * fract2;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement