DacCum

ООП лаб 12

Nov 10th, 2021
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. #define inputfilename "input.txt"
  7. #define outputfilename "result.txt"
  8. #define logfilename "log.txt"
  9. #define ERROR_MEMPTY "ERROR: matrix is empty.\n"
  10. #define ERROR_REMPTY "ERROR: result was not calculated.\n"
  11. #define ERROR_USUIT "ERROR: unsuitable matrix.\n"
  12.  
  13. ofstream ERROR_LOG(logfilename, ios::app);
  14.  
  15. class matrix {
  16.     int size_line,
  17.         size_column,
  18.         ** p_matrix;
  19. public:
  20.     matrix() {
  21.         size_line = 0;
  22.         size_column = 0;
  23.         p_matrix = NULL;
  24.     }
  25.     matrix(int _size_line, int _size_column) {
  26.         size_line = _size_line;
  27.         size_column = _size_column;
  28.         p_matrix = new int* [size_line];
  29.         for (int i_line = 0; i_line < size_line; i_line++)
  30.             p_matrix[i_line] = new int[size_column]();
  31.     }
  32.     matrix(const matrix& M) {
  33.         if (M.p_matrix == NULL) {
  34.             size_line = 0;
  35.             size_column = 0;
  36.             p_matrix = NULL;
  37.             return;
  38.         }
  39.         size_line = M.size_line;
  40.         size_column = M.size_column;
  41.         p_matrix = new int* [size_line];
  42.         for (int i_line = 0; i_line < size_line; i_line++) {
  43.             p_matrix[i_line] = new int[size_column];
  44.             for (int i_column = 0; i_column < M.size_column; i_column++)
  45.                 p_matrix[i_line][i_column] = M.p_matrix[i_line][i_column];
  46.         }
  47.     }
  48.     matrix operator= (const matrix& M) {
  49.         if (M.p_matrix == NULL) {
  50.             size_line = 0;
  51.             size_column = 0;
  52.             p_matrix = NULL;
  53.             return *this;
  54.         }
  55.         size_line = M.size_line;
  56.         size_column = M.size_column;
  57.         p_matrix = new int* [size_line];
  58.         for (int i_line = 0; i_line < size_line; i_line++) {
  59.             p_matrix[i_line] = new int[size_column];
  60.             for (int i_column = 0; i_column < M.size_column; i_column++)
  61.                 p_matrix[i_line][i_column] = M.p_matrix[i_line][i_column];
  62.         }
  63.         return *this;
  64.     }
  65.     friend ifstream& operator>> (ifstream&, matrix&);
  66.     friend ofstream& operator<< (ofstream&, matrix&);
  67.     friend matrix operator* (const matrix&, const matrix&);
  68. };
  69.  
  70. ifstream& operator>> (ifstream& fin, matrix& M) {
  71.     fin >> M.size_line;
  72.     fin >> M.size_column;
  73.     M.p_matrix = new int* [M.size_line];
  74.     for (int i_line = 0; i_line < M.size_line; i_line++) {
  75.         M.p_matrix[i_line] = new int[M.size_column];
  76.         for (int i_column = 0; i_column < M.size_column; i_column++)
  77.             fin >> M.p_matrix[i_line][i_column];
  78.     }
  79.  
  80.     return fin;
  81. }
  82. ofstream& operator<< (ofstream& fout, matrix& M) {
  83.     if (M.p_matrix == NULL) {
  84.         fout << "in operator<< :\n" << ERROR_MEMPTY;
  85.         ERROR_LOG << "in operator<< :\n" << ERROR_MEMPTY;
  86.         return fout;
  87.     }
  88.  
  89.     for (int i_line = 0; i_line < M.size_line; i_line++) {
  90.         for (int i_column = 0; i_column < M.size_column; i_column++)
  91.             fout << M.p_matrix[i_line][i_column] << '\t';
  92.         fout << endl;
  93.     }
  94.  
  95.     return fout;
  96. }
  97.  
  98. matrix operator* (const matrix& A, const matrix& B) {
  99.     if (A.size_column != B.size_line) {
  100.         matrix ERROR;
  101.         ERROR_LOG << "in operator* :\n" << ERROR_USUIT;
  102.         return ERROR;
  103.     }
  104.  
  105.     matrix result(A.size_line, B.size_column);
  106.     for (int i_fixed_line = 0; i_fixed_line < A.size_line; i_fixed_line++)
  107.         for (int i_fixed_col = 0; i_fixed_col < B.size_column; i_fixed_col++)
  108.             for (int i_dynamic = 0; i_dynamic < A.size_column; i_dynamic++)
  109.                 result.p_matrix[i_fixed_line][i_fixed_col] += A.p_matrix[i_fixed_line][i_dynamic] * B.p_matrix[i_dynamic][i_fixed_col];
  110.    
  111.     return result;
  112. }
  113.  
  114. int main() {
  115.     tm* ptr = new tm;
  116.     time_t *lt = new time_t;
  117.     *lt = time(NULL);
  118.     localtime_s(ptr, lt);
  119.     char nowtime[100];
  120.     asctime_s(nowtime, ptr);
  121.     ERROR_LOG << nowtime << endl;
  122.  
  123.     matrix A, B, C;
  124.     ifstream fin(inputfilename);
  125.     ofstream fout(outputfilename);
  126.     fin >> A;
  127.     fout << A << endl;
  128.     fin >> B;
  129.     fout << B << endl;
  130.    
  131.     C = A * B;
  132.     fout << "result A * B:\n";
  133.     fout << C << endl;
  134.  
  135.     fin.close();
  136.     fout.close();
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment