Advertisement
dmkozyrev

intn.cpp

Jan 19th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.56 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class intn{
  4.     int data;
  5.     int base;
  6.     public:
  7.         intn(int d = 0, int b = 0);
  8.         intn(const intn &);
  9.        
  10.         void set_data(int d){data = d; check();};
  11.         void set_base(int b){base = b; check();};
  12.        
  13.         int get_data(void) const {return data;};
  14.         int get_base(void) const {return base;};
  15.        
  16.         intn & check(void);
  17.        
  18.         intn & inc(int k = 1);
  19.         intn & dec(int k = 1);
  20.        
  21.         intn & operator=(const intn & right);
  22.        
  23.         friend const intn & operator+(const intn & i); // унарныц плюс
  24.     friend const intn operator-(const intn & i); // унарный минус
  25.     friend const intn& operator++(intn & i); // префиксный инкремент
  26.     friend const intn operator++(intn & i, int); // постфиксный инкремент
  27.     friend const intn& operator--(intn & i); // префиксный декремент
  28.     friend const intn operator--(intn & i, int); // постфиксный декремент
  29.        
  30.         friend const intn operator+(const intn & left, const intn & right); // бинарный плюс
  31.         friend const intn operator-(const intn & left, const intn & right); // бинарный минус
  32.         friend const intn operator*(const intn & left, const intn & right); // бинарное умножить
  33.         friend const intn operator/(const intn & left, const intn & right); // бинарное взятие целой части при делении
  34.         friend const intn operator%(const intn & left, const intn & right); // бинарное взятие остатка при делении
  35.        
  36.     friend intn & operator+=(intn & left, const intn & right); // присваивание с инкрементацией
  37.         friend intn & operator-=(intn & left, const intn & right); // присваивание с декрементацией
  38.         friend intn & operator*=(intn & left, const intn & right); // присваивание с умножением
  39.         friend intn & operator/=(intn & left, const intn & right); // присваивание с взятием целой части при делении
  40.         friend intn & operator%=(intn & left, const intn & right); // присваивание с взятием остатка от деления
  41.        
  42.     friend bool operator==(const intn & left, const intn & right);  // равно
  43.         friend bool operator!=(const intn & left, const intn & right);  // не равно
  44.         friend bool operator<=(const intn & left, const intn & right);  // меньше либо равно
  45.         friend bool operator>=(const intn & left, const intn & right);  // больше либо равно
  46.         friend bool operator< (const intn & left, const intn & right);  // меньше
  47.         friend bool operator> (const intn & left, const intn & right);  // больше
  48. };
  49.    
  50. using namespace std;
  51.                
  52. int main(){
  53.     const int n = 5;
  54.     intn a(2, n), b(3, n);
  55.     cout << (++a).get_data() << endl;
  56.     cout << b.get_data() << endl;
  57.    
  58.     cout << (a+b).get_data() << endl;
  59. }
  60.  
  61. intn & intn::operator=(const intn & right){
  62.     if (this != &right) {
  63.         data = right.data;
  64.         base = right.base;
  65.     }
  66.    
  67.     return *this;
  68. }
  69.  
  70. const intn operator+(const intn & left, const intn & right){ // бинарный плюс
  71.     return intn(left.data+right.data, left.base);
  72. }
  73.  
  74. const intn operator-(const intn & left, const intn & right){ // бинарный минус
  75.     return intn(left.data-right.data, left.base);
  76. }
  77.  
  78. const intn operator*(const intn & left, const intn & right){ // бинарное умножить
  79.     return intn(left.data*right.data, left.base);
  80. }
  81.  
  82. const intn operator/(const intn & left, const intn & right){ // бинарное взятие целой части при делении
  83.     return intn(left.data / right.data, left.base);
  84. }
  85.  
  86. const intn operator%(const intn & left, const intn & right){ // бинарное взятие остатка при делении
  87.     return intn(left.data % right.data, left.base);
  88. }
  89.        
  90. intn & operator+=(intn & left, const intn & right){ // присваивание с инкрементацией
  91.     return left.inc(right.data);
  92. }
  93.  
  94. intn & operator-=(intn & left, const intn & right){// присваивание с декрементацией
  95.     return left.dec(right.data);
  96. }
  97.  
  98. intn & operator*=(intn & left, const intn & right){ // присваивание с умножением
  99.     left.data *= right.data;
  100.     return left.check();
  101. }
  102.  
  103. intn & operator/=(intn & left, const intn & right){ // присваивание с взятием целой части при делении
  104.     left.data /= right.data;
  105.     return left.check();
  106. }
  107.  
  108. intn & operator%=(intn & left, const intn & right){ // присваивание с взятием остатка от деления
  109.     left.data %= right.data;
  110.     return left.check();
  111. }
  112.        
  113. bool operator==(const intn & left, const intn & right){  // равно
  114.     return (left.data == right.data);
  115. }
  116.  
  117. bool operator!=(const intn & left, const intn & right){ // не равно
  118.     return (left.data != right.data);
  119. }
  120.  
  121. bool operator<=(const intn & left, const intn & right){ // меньше либо равно
  122.     return (left.data <= right.data);
  123. }
  124.  
  125. bool operator>=(const intn & left, const intn & right){ // больше либо равно
  126.     return (left.data >= right.data);
  127. }
  128.  
  129. bool operator< (const intn & left, const intn & right){ // меньше
  130.     return (left.data < right.data);
  131. }
  132.  
  133. bool operator> (const intn & left, const intn & right){// больше
  134.     return (left.data > right.data);
  135. }
  136.  
  137. //унарный плюс ничего не делает.
  138. const intn & operator+(const intn & i) {
  139.     return i;
  140. }
  141.  
  142. const intn operator-(const intn & i) {
  143.     return intn(-i.data, i.base);
  144. }
  145.  
  146. //префиксная версия возвращает значение после инкремента
  147. const intn & operator++(intn & i) {
  148.     return i.inc();
  149. }
  150.  
  151. //постфиксная версия возвращает значение до инкремента
  152. const intn operator++(intn & i, int) {
  153.     intn oldValue(i.data, i.base);
  154.     i.inc();
  155.     return oldValue;
  156. }
  157.  
  158. //префиксная версия возвращает значение после декремента
  159. const intn & operator--(intn & i) {
  160.     return i.dec();
  161. }
  162.  
  163. //постфиксная версия возвращает значение до декремента
  164. const intn operator--(intn & i, int) {
  165.     intn oldValue(i.data, i.base);
  166.     i.dec();
  167.     return oldValue;
  168. }
  169.  
  170. intn::intn(const intn & i){
  171.     data = i.data;
  172.     base = i.base;
  173. }
  174.  
  175. intn::intn(int d, int b){
  176.     data = d;
  177.     base = b;
  178.     check();
  179. }
  180.  
  181. intn & intn::inc(int k){
  182.     data += k;
  183.     return check();
  184. }
  185.  
  186. intn & intn::dec(int k){
  187.     data -= k;
  188.     return check();
  189. }
  190.  
  191. intn& intn::check(void){
  192.     if (!base) return *this;
  193.    
  194.     if (data >= base)
  195.         data %= base;
  196.     else if (data < 0)
  197.         data = base - (-data) % base;
  198.    
  199.     return *this;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement