Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.53 KB | None | 0 0
  1. #include "matrix.h"
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <string>
  6. #include <fstream>
  7. #include <iomanip>
  8. #include <sstream>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. matrixClass::matrixClass()
  14. {
  15.     data = new mat(0, 0);
  16.     //data->matrix = NULL;
  17. }
  18.  
  19. matrixClass::~matrixClass() //destructor, deleting
  20. {
  21.     if(--data->numberReferences == 0)
  22.       delete data;
  23. }
  24.  
  25. matrixClass::matrixClass(int nrows, int ncolumns)  //create matrix
  26. {
  27.     if(nrows > 0 && ncolumns > 0)
  28.     {
  29.     if(!(data = new mat(nrows, ncolumns)))
  30.       throw allocationMemError();
  31.     }
  32.     else
  33.     {
  34.     throw indexLessThanZero();
  35.     }
  36. }
  37.  
  38. matrixClass::matrixClass(const char* nameFile) //zczytywanie wartosci z pliku
  39. {
  40.     string lineA;
  41.     double x;
  42.     ifstream fileIN;
  43.     int colA = 0;
  44.     int rowA = 0;
  45.    
  46.    
  47.     fileIN.open(nameFile);
  48.    
  49.     if(fileIN.fail())
  50.     {
  51.     throw errorWithOpeningFile();
  52.     //exit(1);
  53.     }
  54.    
  55.     cout << "\n" << endl;
  56.     //counting of rows and columns
  57.     while(fileIN.good())
  58.     {
  59.     while(getline(fileIN, lineA))
  60.     {
  61.         istringstream streamA(lineA);
  62.         colA = 0;
  63.         while(streamA >> x)
  64.         {
  65.             colA++;
  66.         }
  67.         rowA++;
  68.     }
  69.    
  70.     cout << "Columns = " << colA << endl << endl;
  71.     cout << "Rows = " << rowA << endl << endl;
  72.     }
  73.     fileIN.close();
  74.    
  75.     if(!(data = new mat(rowA, colA)))
  76.     throw allocationMemError();
  77.  
  78.     rowA = 0;
  79.     colA = 0;
  80.    
  81.     fileIN.open(nameFile);
  82.    
  83.     if(fileIN.fail())
  84.     {
  85.       throw errorWithOpeningFile();
  86.       //exit(1);
  87.     }
  88.    
  89.     cout << "\n" << endl;
  90.     while(fileIN.good())
  91.             {
  92.     while(getline(fileIN, lineA))
  93.             {
  94.         istringstream streamA(lineA);
  95.         colA = 0;
  96.         while(streamA >> x)
  97.         {
  98.        
  99.             data->matrix[rowA][colA] = x;
  100.             colA++;
  101.         }
  102.         rowA++;
  103.         }
  104.    
  105.     cout << "Columns = " << colA << endl << endl;
  106.     cout << "Rows = " << rowA << endl << endl;
  107.     }
  108. }
  109.  
  110.  
  111. matrixClass::matrixClass(matrixClass& temp)
  112. {
  113.     temp.data->numberReferences++;
  114.     data = temp.data;
  115. }
  116.  
  117. matrixClass& matrixClass::operator=(const matrixClass& x)
  118. {
  119.     x.data->numberReferences++;
  120.     if(--data->numberReferences == 0)
  121.       delete data;
  122.     data = x.data;
  123.     return *this;
  124. }
  125.  
  126.  
  127.  
  128. ostream& operator<<(ostream& pokaz, matrixClass& macierz)
  129. {
  130.     int nrows = macierz.data->rows;
  131.     int ncolumns = macierz.data->columns;
  132.     int i;
  133.     int j;
  134.     for(i = 0; i < nrows; i++)
  135.     {
  136.       for(j = 0; j < ncolumns; j++)
  137.       {
  138.         pokaz << left << setw(10) << macierz.data->matrix[i][j] << "  ";
  139.       }
  140.       pokaz << endl;
  141.     }
  142.    
  143.     pokaz << endl << endl;
  144.     //pokaz << "Macierz po pierwszym przejsciu" << endl << endl;
  145.     return pokaz;
  146. }
  147.  
  148. double matrixClass::read(int nrow, int ncol) const
  149. {
  150.     return data->matrix[nrow - 1][ncol - 1];
  151. }
  152.  
  153. void matrixClass::check(int nrow, int ncol) const
  154. {
  155.     if(((0 < nrow) && (nrow <= data->rows)) && ((0 < ncol) && (ncol <= data->columns))) ;
  156.     else
  157.       throw indexOutOfRange();
  158. }
  159.  
  160. double matrixClass::operator()(int nrow, int ncol) const
  161. {
  162.       if((nrow > data->rows) || (ncol > data->columns))
  163.       throw indexOutOfRange();
  164.      
  165.       return read(nrow, ncol);
  166. }
  167.  
  168. matrixClass::Cref matrixClass::operator()(int nrow, int ncol)
  169. {
  170.       if((nrow > data->rows) || (ncol > data->columns))
  171.       throw indexOutOfRange();
  172.  
  173.       return Cref(*this, nrow, ncol);
  174. }
  175.  
  176.  
  177. matrixClass& matrixClass::operator+=(matrixClass& s)
  178. {
  179.     if((data->rows == s.data->rows) && (data->columns == s.data->columns))
  180.     {
  181.     mat *temp = new mat(data->rows, data->columns);
  182.     for(int i = 0; i < data->rows; i++)
  183.     {
  184.         for(int j = 0; j < data->columns; j++)
  185.         {
  186.         temp->matrix[i][j] = ((data->matrix[i][j]) + (s.data->matrix[i][j]));
  187.         }
  188.     }
  189.     if(--data->numberReferences == 0)
  190.       delete data;
  191.     data = temp;
  192.     }
  193.     else
  194.       throw badRowsColumnsDimensions();
  195.      
  196.     return *this;
  197. }
  198.  
  199. matrixClass& matrixClass::operator-=(matrixClass& s)
  200. {
  201.     if((data->rows == s.data->rows) && (data->columns == s.data->columns))
  202.     {
  203.     mat *temp = new mat(data->rows, data->columns);
  204.     for(int i = 0; i < data->rows; i++)
  205.     {
  206.         for(int j = 0; j < data->columns; j++)
  207.         {
  208.         temp->matrix[i][j] = ((data->matrix[i][j]) - (s.data->matrix[i][j]));
  209.         }
  210.     }
  211.     if(--data->numberReferences == 0)
  212.       delete data;
  213.     data = temp;
  214.     }
  215.     else
  216.       throw badRowsColumnsDimensions();
  217.      
  218.     return *this;    
  219. }
  220.  
  221.  
  222.  
  223. matrixClass operator+(matrixClass& a, matrixClass& b)
  224. {
  225.     if(a.data->rows == b.data->rows && a.data->columns == b.data->columns)
  226.     {
  227.     matrixClass temp(a.data->rows, a.data->columns);
  228.     for(int i = 0; i < a.data->rows; i++)
  229.     {
  230.         for(int j = 0; j < a.data->columns; j++)
  231.         temp.data->matrix[i][j] = a.data->matrix[i][j] + b.data->matrix[i][j];
  232.     }
  233.     return temp;
  234.     }
  235.     else
  236.       throw matrixClass::badRowsColumnsDimensions();
  237.    
  238. }
  239.  
  240.  
  241. matrixClass operator-(matrixClass& a, matrixClass& b)
  242. {
  243.     if(a.data->rows == b.data->rows && a.data->columns == b.data->columns)
  244.     {
  245.     matrixClass temp(a.data->rows, a.data->columns);
  246.     for(int i = 0; i < a.data->rows; i++)
  247.     {
  248.         for(int j = 0; j < a.data->columns; j++)
  249.         temp.data->matrix[i][j] = a.data->matrix[i][j] - b.data->matrix[i][j];
  250.     }
  251.     return temp;
  252.     }
  253.     else
  254.     throw matrixClass::badRowsColumnsDimensions();
  255.    
  256.     //return temp;
  257. }
  258.  
  259. void matrixClass::write(int nrow, int ncol, double c)
  260. {
  261.     if(((0 < nrow) && (nrow <= data->rows)) && ((0 < ncol) && (ncol <= data->columns)))
  262.     {
  263.     data = data->detach();
  264.     data->matrix[nrow - 1][ncol - 1] = c;
  265.     }
  266.     else
  267.     throw badRowsColumnsDimensions();
  268. }
  269.  
  270.  
  271.  
  272.  
  273. matrixClass operator*(double number, matrixClass &b)
  274. {
  275.     matrixClass temp(b.data->rows, b.data->columns);
  276.     for(int i = 0; i < b.data->rows; i++)
  277.     {
  278.     for(int j = 0; j < b.data->columns; j++)
  279.     {
  280.         temp.data->matrix[i][j] = number * (b.data->matrix[i][j]);
  281.     }
  282.     }
  283.     return temp;
  284. }
  285.  
  286. matrixClass operator*(matrixClass &b, double number)
  287. {
  288.     matrixClass temp(b.data->rows, b.data->columns);
  289.     for(int i = 0; i < b.data->rows; i++)
  290.     {
  291.     for(int j = 0; j < b.data->columns; j++)
  292.     {
  293.         temp.data->matrix[i][j] = (number * (b.data->matrix[i][j]));
  294.     }
  295.     }
  296.     return temp;
  297. }
  298.  
  299. matrixClass operator*(matrixClass &a, matrixClass &b)
  300. {
  301.     int iterator;
  302.     int iterator1;
  303.     int iterator2;
  304.     double sum = 0;
  305.       if(a.data->columns == b.data->rows)
  306.       {
  307.       matrixClass temp(a.data->rows, b.data->columns);  
  308.       for(iterator = 0; iterator < a.data->rows; iterator++)
  309.       {
  310.           for(iterator1 = 0; iterator1 < b.data->columns; iterator1++)
  311.           {
  312.           for(iterator2 = 0; iterator2 < a.data->columns; iterator2++)
  313.           {
  314.               sum = sum + (a.data->matrix[iterator][iterator2] * b.data->matrix[iterator2][iterator1]);
  315.           }
  316.           temp.data->matrix[iterator][iterator1] = sum;
  317.           sum = 0;
  318.           }
  319.       }
  320.       return temp;
  321.       }
  322.       else
  323.       throw matrixClass::badRowsColumnsDimensions();
  324. }
  325.  
  326. matrixClass& matrixClass::operator*=(matrixClass& s)
  327. {
  328.     int iterator;
  329.     int iterator1;
  330.     int iterator2;
  331.     double sum = 0;
  332.       if(data->columns == s.data->rows)
  333.       {
  334.       mat *temp = new mat(data->rows, s.data->columns);
  335.       for(iterator = 0; iterator < data->rows; iterator++)
  336.       {
  337.           for(iterator1 = 0; iterator1 < s.data->columns; iterator1++)
  338.           {
  339.           for(iterator2 = 0; iterator2 < data->columns; iterator2++)
  340.           {
  341.               sum = sum + (data->matrix[iterator][iterator2] * s.data->matrix[iterator2][iterator1]);
  342.           }
  343.           temp->matrix[iterator][iterator1] = sum;
  344.           sum = 0;
  345.           }
  346.       }
  347.      
  348.     if(--data->numberReferences == 0)
  349.       delete data;
  350.     data = temp;   
  351.       }
  352.       return *this;
  353. }
  354.  
  355. matrixClass& matrixClass::operator*=(double number)
  356. {
  357.     int iterator;
  358.     int iterator1;
  359.    
  360.     mat *temp = new mat(data->rows, data->columns);
  361.    
  362.     for(iterator = 0; iterator < data->rows; iterator++)
  363.     {
  364.     for(iterator1 = 0; iterator1 < data->columns; iterator1++)
  365.     {
  366.       temp->matrix[iterator][iterator1] = number * data->matrix[iterator][iterator1];
  367.     }
  368.     }
  369.     if(--data->numberReferences == 0)
  370.       delete data;
  371.     data = temp;
  372.     return *this;
  373. }
  374.  
  375. int operator==(matrixClass &a, matrixClass &b)
  376. {
  377.     if((a.data->rows != b.data->rows) || (a.data->columns != b.data->columns))
  378.     {
  379.     return 0;
  380.     }
  381.     else if((a.data->rows == b.data->rows) && (a.data->columns == b.data->columns))
  382.     {
  383.     for(int i = 0; i < a.data->rows; i++)
  384.     {
  385.         for(int j = 0; j < a.data->columns; j++)
  386.         {
  387.         if(a.data->matrix[i][j] != b.data->matrix[i][j])
  388.           return 0;
  389.         }
  390.     }
  391.     }
  392.     return 1;
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement