Untitled
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; }