StoneHaos

Untitled

Dec 24th, 2020
713
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. class Matr {
  8. public:
  9.     int** elems;
  10.     int n, m;
  11.     Matr() {
  12.         n = 0;
  13.         m = 0;
  14.     }
  15.     Matr(int n, int m) {
  16.         if (n < 0 || m < 0) throw 1;
  17.         this->n = n;
  18.         this->m = m;
  19.         elems = new int* [n];
  20.         for (int i = 0; i < n; ++i)
  21.             elems[i] = new int[m];
  22.     }
  23.     Matr(int n, int m, int **mass) {
  24.         if (n < 0 || m < 0) throw 1;
  25.         this->n = n;
  26.         this->m = m;
  27.         elems = mass;
  28.     }
  29.     Matr(const Matr& M) {
  30.         n = M.n;
  31.         m = M.m;
  32.  
  33.         elems = new int* [n];
  34.         for (int i = 0; i < n; ++i)
  35.             elems[i] = new int[m];
  36.  
  37.         for (int i = 0; i < n; ++i) {
  38.             for (int j = 0; j < m; ++j)
  39.                 elems[i][j] = M.elems[i][j];
  40.         }
  41.     }
  42.     ~Matr() {
  43.         for (int i = 0; i < n; ++i)
  44.             delete[] elems[i];
  45.         delete[] elems;
  46.     }
  47.  
  48.  
  49.     bool operator!() {
  50.         if (n == 0 || m == 0) throw 2;
  51.  
  52.         if (n != m) return false;
  53.         for (int i = 0; i < n; i++) {
  54.             for (int j = 0; j < m; j++) {
  55.                 if (i == j && elems[i][j] != 1) {
  56.                     return false;
  57.                 }
  58.                 else if (i != j && elems[i][j] != 0) {
  59.                     return false;
  60.                 }
  61.             }
  62.         }
  63.         return true;
  64.     }
  65.  
  66.     Matr __getminor__(int i, int j) {
  67.         if (n != m) throw 3;
  68.         int **p = new int* [n-1];
  69.         for (int i = 0; i < n - 1; ++i)
  70.             p[i] = new int[n - 1];
  71.         int ki, kj, di, dj;
  72.         di = 0;
  73.         for (ki = 0; ki < n - 1; ki++) { // проверка индекса строки
  74.             if (ki == i) di = 1;
  75.             dj = 0;
  76.             for (kj = 0; kj < n - 1; kj++) { // проверка индекса столбца
  77.                 if (kj == j) dj = 1;
  78.                 p[ki][kj] = elems[ki + di][kj + dj];
  79.             }
  80.         }
  81.         return Matr(n - 1, n - 1, p);
  82.     }
  83.  
  84.     double operator*() {
  85.         if (n == 0 || m == 0) throw 2;
  86.         if (n != m) throw 3;
  87.        
  88.         if (n == 1) {
  89.             return elems[0][0] * 1.0;
  90.         }
  91.         else if (n == 2) {
  92.             return elems[0][0] * elems[1][1] - elems[0][1] * elems[1][0] * 1.0;
  93.         }
  94.         else {
  95.             double s = 0;
  96.             for (int i = 0; i < n; ++i) {
  97.                 s += pow(-1, i) * elems[0][i] * *(__getminor__(0, i));
  98.             }
  99.             return s;
  100.         }
  101.  
  102.         return 0;
  103.     }
  104.  
  105.     friend int operator-(Matr);
  106.     friend bool operator==(Matr, Matr);
  107.     friend ostream& operator<<(ostream&, Matr);
  108.     friend istream& operator>>(istream&, Matr&);
  109. };
  110.  
  111. int operator-(Matr M) {
  112.     int n = M.n;
  113.     int m = M.m;
  114.     if (n == 0 || m == 0) throw 2;
  115.  
  116.     int r = M.elems[0][0];
  117.     for (int i = 0; i < n; ++i) {
  118.         for (int j = 0; j < m; ++j) {
  119.             if (i == 0 && j == 0) continue;
  120.             r -= M.elems[i][j];
  121.         }
  122.     }
  123.     return r;
  124. }
  125.  
  126. bool operator==(Matr M1, Matr M2) {
  127.     if (M1.n != M2.n || M1.m != M2.m) return false;
  128.  
  129.     int n = M1.n;
  130.     int m = M1.m;
  131.     for (int i = 0; i < n; ++i)
  132.         for (int j = 0; j < m; ++j)
  133.             if (M1.elems[i][j] != M2.elems[i][j])
  134.                 return false;
  135.     return true;
  136. }
  137.  
  138. ostream& operator<<(ostream& out, Matr M) {
  139.     int n = M.n;
  140.     int m = M.m;
  141.     out << endl;
  142.     for (int i = 0; i < n; ++i) {
  143.         for (int j = 0; j < m; ++j) {
  144.             out << M.elems[i][j] << " ";
  145.         }
  146.         out << endl;
  147.     }
  148.     out << endl;
  149.     return out;
  150. }
  151. istream& operator>>(istream& in, Matr& M) {
  152.     int n, m;
  153.     in >> n >> m;
  154.     M = Matr(n, m);
  155.     for (int i = 0; i < n; ++i) {
  156.         for (int j = 0; j < m; ++j) {
  157.             in >> M.elems[i][j];
  158.         }
  159.     }
  160.     return in;
  161. }
  162.  
  163. int main(void) {
  164.     Matr a(3, 3), b(3, 3);
  165.     a.elems[0][0] = 1; a.elems[0][1] = 2; a.elems[0][2] = 3;
  166.     a.elems[1][0] = 4; a.elems[1][1] = 5; a.elems[1][2] = 5;
  167.     a.elems[2][0] = 7; a.elems[2][1] = 8; a.elems[2][2] = 9;
  168.  
  169.     b.elems[0][0] = 1; b.elems[0][1] = 0; b.elems[0][2] = 0;
  170.     b.elems[1][0] = 0; b.elems[1][1] = 1; b.elems[1][2] = 0;
  171.     b.elems[2][0] = 0; b.elems[2][1] = 0; b.elems[2][2] = 1;
  172.     cout << *a << endl;
  173.     cout << -a << endl;
  174.     cout << !b << endl;
  175.     return 0;
  176. }
RAW Paste Data