Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
7.7 kB
2
Indexable
Never
#include <iostream>
#include <sstream>
#include <windows.h>

using namespace std;

class MyInt {
  private:
    int value;

  public:

    // конструктор с параметром по умолчанию
    MyInt( const int val = 0  ) : value( val ) {

    }

    // конструктор копирования
    MyInt( const MyInt& copy ) : value( copy.value ) {

    }

    int GetValue() const {
        return value;
    }

    void SetValue( const int val ) {
        value = val;
    }

    MyInt& operator=( const MyInt& copy );

    // префиксный декремент
    MyInt& operator--();
    // постфиксный декремент
    MyInt operator--( int ); // параметр int для отличия от префиксной формы

    MyInt operator+( const MyInt& other );
    MyInt operator-( const MyInt& other );
    MyInt operator*( const MyInt& other );
    MyInt operator/( const MyInt& other );

    MyInt& operator+=( const MyInt& other );
    MyInt& operator-=( const MyInt& other );
    MyInt& operator*=( const MyInt& other );
    MyInt& operator/=( const MyInt& other );


    // объявляем дружественные функции требуемые в классе

    // префиксный инкремент
    friend MyInt& operator++( MyInt& my );
    //постфиксный инкремент
    friend MyInt operator++( MyInt& my, int );

    friend bool operator<(const MyInt& left, const MyInt& right );
    friend bool operator>(const MyInt& left, const MyInt& right );
    friend bool operator!=(const MyInt& left, const MyInt& right );
    friend bool operator==(const MyInt& left, const MyInt& right );


};


ostream& operator<<(ostream& os, const MyInt& my) {
    os << my.GetValue(); // friend my.value
    return os;
}

istream& operator>>(istream& is, MyInt& my) {
    int val;
    is >> val;
    my.SetValue( val );
    return is;
}

MyInt& MyInt::operator=( const MyInt& copy ) {
    value = copy.value;
    return *this;
}

MyInt& MyInt::operator--() {
    --value; // отнимаем 1
    return *this; // потом возвращаем объект в актуальном состоянии
}


MyInt MyInt::operator--( int ) {
    MyInt pre = *this; // делаем копию текущего объекта
    operator--(); // применяем префиксный декремент к текущему объекту
    return pre; // возвращаем копию объекта, в которой содержится поле в предыдущем состоянии
}

MyInt& operator++( MyInt& my ) {
    ++my.value;
    return my;
}

MyInt operator++( MyInt& my, int) {
    MyInt pre = my;
    ++my.value;
    return pre;
}

bool operator<( const MyInt& left, const MyInt& right ) {
    return left.value < right.value;
}

bool operator>( const MyInt& left, const MyInt& right ) {
    return left.value > right.value;
}

bool operator!=( const MyInt& left, const MyInt& right ) {
    return left.value != right.value;
}

bool operator==( const MyInt& left, const MyInt& right ) {
    return left.value == right.value;
}

MyInt MyInt::operator+( const MyInt& other ) {
    return MyInt( value + other.value );
}

MyInt MyInt::operator-( const MyInt& other ) {
    return MyInt( value - other.value );
}


MyInt MyInt::operator*( const MyInt& other ) {
    return MyInt( value * other.value );
}

MyInt MyInt::operator/( const MyInt& other ) {
    return MyInt( value / other.value );
}


MyInt& MyInt::operator+=( const MyInt& other ) {
    value += other.value;
    return *this;
}

MyInt& MyInt::operator-=( const MyInt& other ) {
    value -= other.value;
    return *this;
}

MyInt& MyInt::operator*=( const MyInt& other ) {
    value *= other.value;
    return *this;
}

MyInt& MyInt::operator/=( const MyInt& other ) {
    value /= other.value;
    return *this;
}


int GetNumber( const string &mes, const int low, const int high ) {
    string nStr;
    long long n;
    while ( true ) {
            cout << mes << " от " << low << " до " << high << ": ";
        getline( cin, nStr ); // считываем строку неограниченной длины, до нажатия Enter


        int sign = 1;
        if ( nStr[0] == '-' ) { // проверяем наличие знака минус перед цифрами
            sign = -1; // если знак минус есть, то запоминаем знак числа
            // удалить знак минус перед числом
            nStr.erase( 0, 1 );
        }

        // пробуем найти ЛЮБОЙ символ, НЕ входящий в набор 0123456789
        if ( nStr.find_first_not_of( "0123456789" ) == string::npos ) { // если НЕ нашли, то введено целое число
            stringstream ss;
            ss << nStr; // отдаём строковому потоку строку, которая представляет собой запись целого полоительного числа
            ss >> n; // просим строковый поток вернуть нам int значение

            n *= sign;

            if ( n >= low && n <= high  )
                break;
        }
        cout << "Ошибка ввода! Значение должно быть " << "от " << low << " до " << high << "!" << endl;
    }
    return n;
}

int main() {
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );

    bool flagExit = false;
    while ( !flagExit ) {
        int a = GetNumber( "Введите целое число A", -100000, 100000 );
        int b = GetNumber( "Введите целое число B", -100000, 100000 );
        MyInt objA( a ), objB( b );

        cout << "Выберите пункт меню:\n";
        cout << "1 - сумма\n";
        cout << "2 - разность\n";
        cout << "3 - произведение\n";
        cout << "4 - целочисленное деление\n";
        cout << "5 - сравнение\n";
        cout << "6 - инкремент\n";
        cout << "7 - декремент\n";
        cout << "0 - выход\n";


        int opt = GetNumber( "Введите число", 0, 7 );
        switch( opt ) {
        case 1: {
            cout << "A + B = " << objA + objB << endl;
            break;
        }
        case 2: {
            cout << "A - B = " << objA - objB << endl;
            break;
        }

        case 3: {
            cout << "A * B = " << objA * objB << endl;
            break;
        }
        case 4: {
            cout << "A / B = " << objA / objB << endl;
            break;
        }
        case 5: {

            if ( objA > objB )
                cout << "A > B" << endl;
            else if (objA < objB )
                cout << "A < B" << endl;
            else
                cout << "A = B" << endl;

            break;
        }

        case 6: {

            cout << "++A = " << ++objA << endl;
            cout << "B++ = " << objB++ << endl;
            cout << "B = " << objB << endl;
            break;

        }

        case 7: {

            cout << "--A = " << --objA << endl;
            cout << "B-- = " << objB-- << endl;
            cout << "B = " << objB << endl;
            break;

        }

        case 0: {

            flagExit = true;
            break;
        }

        }

    }

    return 0;
}