Создать класс Rational для работы с рациональными дробями.

Условие задачи: Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а – числитель, b – знаменатель. Создать класс Rational для работы с рациональными дробями. Обязательно должны быть реализованы операции:

– сложения add, (a, b) + (с, d) = (ad + be, bd);
– вычитания sub, (a, b) — (с, d) = (ad — be, bd);
– умножения mul, (a, b) * (c, d) = (ac, bd);
– деления div, (a, b) / (с, d) = (ad, be);
– сравнения equal, greate, less.
Кроме этого, обязательно должны быть реализованы методы инициализации объектов, ввода значений с клавиатуры и вывода на экран. С одномерным массивом, состоящим из n вещественных элементов, произвести следующие операции:
1) вычислить сумму элементов массива с нечетными номерами;
2) вычислить сумму элементов массива, расположенных  между  первым  и последним отрицательными элементами;
3) сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями. При сжатии сохранить исходный порядок элементов.
Примечание: Размеры массивов задаются именованными константами. Все операции над массивами  выполняются отдельными процедурами и функциями в том порядке, в котором они описаны в задании. Элементы массивов задаются одним из двух способов: генерация  случайным образом или  ввод с клавиатуры. Способ заполнения массива выбирается пользователем. Реальную размерность массива программа должна спрашивать у пользователя (в диапазоне от единицы до значения, определяемое константой).
Листинг (исходник) программы:


		#include <iostream>
			#include <ostream>
			#include <locale>
			#include <conio.h>
			using namespace std;
			
			class Rational 
			{
			    int a;
			    int b;
			public:
			    Rational(){ a = 0; b = 0;} // Конструктор по умолчанию
			    Rational(const int& _a, const int& _b) // Конструктор с данными
			    {
			        if (_b<0)
			            exit(1);
			        a = _a;
			        if (_b)
			            b = _b;
			        else
			            exit(1);
			        reduce();
			    }
			    Rational operator+( Rational T)
			    {
			        Rational Temp;
			        
			        if( this->b == T.b )
			        {
			            Temp.a = this->a + T.a;
			            Temp.b = this->b;
			        }
			        else
			        {
			            Temp.b = this->b * T.b;
			            Temp.a = (Temp.b / this->b * this->a ) + (Temp.b / T.b * T.a );
			        }
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator-( Rational T)
			    {
			        Rational Temp;
			        
			        if( this->b == T.b )
			        {
			            Temp.a = this->a - T.a;
			            Temp.b = this->b;
			        }
			        else
			        {
			            Temp.b = this->b * T.b;
			            Temp.a = (Temp.b / this->b * this->a ) - (Temp.b / T.b * T.a );
			        }
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator*( Rational T)
			    {
			        Rational Temp;
			        Temp.a = this->a * T.a;
			        Temp.b = this->b * T.b;
			        Temp.reduce();
			        return Temp;
			    }
			    Rational operator/( Rational T)
			    {
			        Rational Temp;
			        Temp.a = this->a * T.b;
			        Temp.b = this->b * T.a;
			        Temp.reduce();
			        return Temp;
			    }
			    // Нахождение НОДа
			    int NOD(const int& a1,const int& b1)
			    {
			        int a = abs(a1), b = abs(b1);
			        while(a!=0 && b!=0){
			            if (a>=b)
			                a = a%b;
			            else
			                b = b%a;
			        }
			        return a+b;
			    }
			    // Сокращение дроби
			    void Rational::reduce()
			    {
			        int nod = NOD(a,b);
			        a = a/nod;
			        b = b/nod;
			    }
			    // Перегрузка оператора сout
			    friend ostream& operator << (ostream &out,const Rational& drob)
			    {
			        if (drob.b== 1 || drob.a == 0)
			            out << drob.a;
			        else 
			            out << drob.a << \'/\' << drob.b;
			        return out;
			    }
			    // Перегрузка оператора cin
			    friend istream& operator>> (istream& istr, Rational& b)
			    {
			        char* str = new char [1024];
			        cin.getline(str, sizeof(str));
			        int i = 0;
			        unsigned int bt = 0;
			        bool flag = false;
			    l1:
			        int len = strlen(str)-1;
			        while (str[len]==\' \'){
			            str[len] = NULL;
			            goto l1;
			        }
			        if (strlen(str)==0)
			            exit(1);
			        while (str[i]==\' \')
			            ++i;
			        if (str[i]==\'-\'){
			            flag = true;
			            ++i;
			        }
			        while (str[i]!=\'.\' && str[i]!=\'/\' && i<(int)strlen(str)){
			            bt = (str[i] - \'0\') + bt*10;
			            ++i;
			        }
			        ++i;
			        switch (str[i-1]){
			            case \'.\': {
			                int j = 0;
			                while (i<(int)strlen(str)){
			                    bt = (str[i] - \'0\') + bt*10;
			                    ++i, ++j;
			                }           
			                b.b = int(pow(10.0,j));
			                break;
			            }
			            case \'/\': {
			                b.b = 0;
			                while (i<(int)strlen(str)){
			                    b.b = (str[i]-\'0\') + b.b*10;
			                    ++i;
			                }
			                break;
			            }
			        }
			        b.a = flag ? -int(bt) : bt;
			        b.reduce();
			        return istr;
			    }
			    bool operator < (const Rational & f) const { return a * f.b < f.a * b; }
			    bool operator > (const Rational & f) const { return a * f.b > f.a * b; }
			    bool operator == (const Rational & f) const { return a == f.b && b == f.b; }
			};
			
			
			int main()
			{
			    setlocale(LC_ALL,"Russian");
			    Rational A(1,3);
			    Rational B(1,8);
			    Rational C,D;
			    Rational Result;
			
			
			    cout<<"Введите дробь C в виде */* : ";cin >> C;cout << endl;
			    cout<<"Введите дробь D в виде */* : ";cin >> D; cout << endl;
			
			
			    if( A > B)
			        cout << A <<" - "<< B <<" = " << A-B << endl;
			
			
			    if( C < D)
			        cout << C <<" + "<< D <<" = " << C+D << endl;
			
			
			    if( (A+B) == (C+D) )
			        cout << A << " + " << B << " + " << C << " + " << D << " = " << A+B+C+D << endl;
			    _getch();
			    return 0;
			}

 

[свернуть]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *