Advertisement
rnort

lab2_3

Oct 6th, 2011
429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.00 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. class Matrix{                                   // класс матрицы
  9.         private:                                // ЗАКРЫТЫЕ ЧЛЕНЫ КЛАССА !
  10.                 double** mtptr;                 // указатель на указатель - будущий двумерный массив
  11.                 int size;                       // ранг матрицы ( размер). Матрицы будут тоьлко квадратные !
  12.         public:                                 // ОТКРЫТЫЕ ЧЛЕНЫ КЛАССА !
  13.  
  14.                 Matrix(int size);               // конструктор
  15.                 Matrix(const Matrix& ini);      // конструктор копий ( копирования )
  16.                 ~Matrix();                      // деструктор
  17.                 int getSize();                  // ф-ция получения размера матрицы
  18.                 void putData(int i, int j, double value);   // помещение данных в матрицу
  19.                 double getData (int i, int j);              // получение данных -//-
  20.                 void fillRandom(int scale);                 // заполнение случайно   
  21.                 void fillByOrder(double num );              // заполнение по порядку
  22.                 void init(double num);                      // инициализация всей матрицы одним числом
  23.                
  24.                 // перегруженный оператор +
  25.                 Matrix operator+ (const Matrix& right) const;   // складывает две матрицы п оправилам сложения матриц.
  26.                                                                 // возвращает результат
  27.                 friend Matrix operator+(const Matrix& right, double num); // складывает матрицу с числом
  28.                 friend Matrix operator+(double num, const Matrix& right); // складывает число с матрицей. ВОЗВРАЩАЕТ МАТРИЦУ !
  29.                 // перегруженный оператор -
  30.                 // аналогичен оператору +, только -  (с) КЭП
  31.                 friend Matrix operator-(double num, const Matrix& right) ;
  32.                 friend Matrix operator-(const Matrix& right, double num);
  33.                 Matrix operator- (const Matrix& right) const;
  34.                 //перегруженный оператор *
  35.                 Matrix operator* (const Matrix& right) const; // умножает 2 матрицы по правилам умножения матриц
  36.                 // перегруженные операторы ввода и вывода из потока.
  37.                 // возвращают ссылку на поток ввода/вывода
  38.                 friend istream& operator>>(istream& input, Matrix& obj);
  39.                 friend ostream& operator<<(ostream& output, Matrix& obj);
  40.                 // перегруженные операторы арифмет. присваивания -=, +=
  41.                 Matrix operator+=(const Matrix& rt)const;
  42.                 Matrix operator-=(const Matrix& rt)const;
  43.                 // перегруженный оператор присваивания
  44.                 Matrix& operator=(const Matrix& right);
  45.  
  46. };
  47. /* Инициализация */
  48. void Matrix::init(double num = 0){
  49.     for (int i =0; i < this->getSize(); ++i)
  50.         for(int j = 0; j < this->getSize(); ++j)
  51.             mtptr[i][j] = num;
  52. }
  53. /*Помещение данных*/
  54. void Matrix::putData(int i, int j, double num){
  55.     mtptr[i][j] = num;  // aaaaaaaaaa?
  56. }
  57. /* Получение данных */
  58. double Matrix::getData(int i, int j){
  59.     return mtptr[i][j];
  60. }
  61. /*Деструктор */
  62. Matrix::~Matrix(){
  63.     for(int i = 0; i < size; ++i)
  64.             delete[] mtptr[i];
  65.  
  66.         delete[] mtptr;
  67. }
  68. /* Получение размера */
  69. int Matrix::getSize(){
  70.         return size;
  71. }
  72. // Конструктор по умолчанию
  73. Matrix::Matrix(int size = 2){
  74.  
  75.         this->size = size;
  76.         //
  77.         mtptr = new double*[size];
  78.         for(int i = 0; i < size; ++i)
  79.                 mtptr[i] = new double[size];
  80.         //
  81. }
  82. // Конструктор копирования ( копий) : создаёт копию переданного ему объекта
  83. Matrix::Matrix(const Matrix &ini){ // copy constructor
  84.    
  85.     size = ini.size;
  86.     // выделение памяти
  87.     mtptr = new double*[size];
  88.     for(int i = 0; i < size; ++i)
  89.             mtptr[i] = new double[size];
  90.     // copy
  91.     for (int i = 0; i < size; ++i)
  92.         for (int j = 0; j < size; ++j)
  93.              mtptr[i][j] = ini.mtptr[i][j];
  94.  
  95. }
  96. /* Перегруженный ввод из потока */
  97. istream& operator>> (istream& inputStream, Matrix& obj){
  98.  
  99.         cout << "Fill matrix:" << endl;
  100.         for (int i = 0; i < obj.getSize(); ++i)
  101.             for (int j = 0; j < obj.getSize(); ++j)
  102.                 inputStream >> obj.mtptr[i][j];
  103.                 //inputStream >> obj.putData(i,j);
  104.  
  105.  
  106.     return inputStream;
  107. }
  108. /* Перегруженный вывод из потока */
  109. ostream& operator<< (ostream& outputStream,  Matrix& obj){
  110.  
  111.         cout << endl;
  112.         for (int i = 0; i < obj.size; ++i){
  113.             for (int j = 0; j < obj.size; ++j)
  114.                     outputStream << obj.mtptr[i][j] << " ";
  115.             cout << endl;
  116.         }
  117.     return outputStream;
  118. }
  119. /* Заполнение случайно */
  120. void Matrix::fillRandom(int scale = 5){
  121.  
  122.     srand(time(NULL));
  123.     for (int i = 0; i < size; ++i)
  124.         for (int j = 0; j < size; ++j)
  125.             this->mtptr[i][j] = rand() % scale;
  126.  
  127. }
  128. /* Заполнение по порядку */
  129. void Matrix::fillByOrder(double num = 1){
  130.  
  131.     for (int i = 0; i < size; ++i)
  132.         for(int j = 0; j < size; ++j)
  133.             this->mtptr[i][j] = num++;
  134. }
  135. /* Перегруженный + */
  136. Matrix Matrix::operator+ (const Matrix& right) const {
  137.  
  138.  
  139.     Matrix tmp( right );        // создаем копию объекта
  140.     int tmpSize = right.size;
  141.     if ( tmpSize == size ){     // проверяем размер
  142.         for (int i = 0; i < tmpSize; ++i)
  143.             for(int j = 0; j < tmpSize; ++j)
  144.                 tmp.putData(i,j, mtptr[i][j] + right.mtptr[i][j]);  // складываем
  145.         }
  146.     return tmp; // возвращаем результат
  147. }
  148. /* Перегруженный - */
  149. Matrix Matrix::operator- (const Matrix& right) const {
  150.  
  151.     Matrix tmp( right );
  152.     int tmpSize = right.size;
  153.     if ( tmpSize == size ){
  154.         for (int i = 0; i < tmpSize; ++i)
  155.             for(int j = 0; j < tmpSize; ++j)
  156.                 tmp.putData(i,j, mtptr[i][j] - right.mtptr[i][j]);
  157.         }
  158.     return tmp;
  159. }// end of operator-
  160. Matrix Matrix::operator-= (const Matrix& right) const {
  161.  
  162.     int tmpSize = right.size;
  163.     if ( tmpSize == size ){
  164.         for (int i = 0; i < tmpSize; ++i)
  165.             for(int j = 0; j < tmpSize; ++j)
  166.                 mtptr[i][j] -= right.mtptr[i][j];   // сохраняем результата в объекте
  167.         }
  168.     return *this;       // возвращаем ссылку на текущий объект для поддержки цепочек вида : а -= b -= c ;
  169. }// end of operator-
  170. /* Оператор += */
  171. Matrix Matrix::operator+= (const Matrix& right) const {
  172.     // аналогичен -=
  173.     int tmpSize = right.size;
  174.     if ( tmpSize == size ){
  175.         for (int i = 0; i < tmpSize; ++i)
  176.             for(int j = 0; j < tmpSize; ++j)
  177.                 mtptr[i][j] += right.mtptr[i][j];
  178.         }
  179.     return *this;
  180. }// operator +=
  181. /* Оператор *  */
  182. Matrix Matrix::operator* (const Matrix& right) const {
  183.  
  184.     Matrix tmp( right );        // создаем временынй объект
  185.     int tmpSize = right.size;   // проверяем размеры
  186.     if ( tmpSize == size ){
  187.         for (int i = 0; i < tmpSize; ++i){
  188.             for( int j = 0; j < tmpSize; ++j){
  189.                 tmp.mtptr[i][j] = 0;    // сохраняем результата во временном объекте
  190.                 for (int k = 0 ; k < tmpSize; ++k)
  191.                     tmp.mtptr[i][j] += mtptr[i][k] * right.mtptr[k][j];
  192.                 }  
  193.             }
  194.         }
  195.     return tmp; // возвращаем результат
  196. }// end of operator*
  197. /*
  198. * Операторы +/- число
  199. *
  200. * Данные операторы реализованы через дружественные  классу Matrix ф-ции, т.к.
  201. * необходим доступ как к объекту класса Matrix, так и к числу , кот. не явл. членом класса.
  202. *
  203. */
  204. Matrix operator+ (const Matrix& lft, double num){
  205.  
  206.     Matrix tmp( lft );
  207.     for (int i = 0; i < lft.size; ++i)
  208.         for(int j = 0; j < lft.size; ++j)
  209.             tmp.mtptr[i][j] = lft.mtptr[i][j] + num;
  210.     return tmp;
  211. }
  212. Matrix operator- (const Matrix& lft, double num) {
  213.  
  214.     Matrix tmp( lft );
  215.     for (int i = 0; i < lft.size; ++i)
  216.         for(int j = 0; j < lft.size; ++j)
  217.             tmp.mtptr[i][j] = lft.mtptr[i][j] - num;
  218.     return tmp;
  219. }
  220. Matrix operator- (double num, const Matrix& lft){
  221.  
  222.     Matrix tmp(  lft );
  223.     for (int i = 0; i < lft.size; ++i)
  224.         for(int j = 0; j < lft.size; ++j)
  225.             tmp.mtptr[i][j] = num - lft.mtptr[i][j];
  226.    
  227.     return tmp;
  228. }
  229. Matrix operator+ (double num, const Matrix& lft){
  230.  
  231.     Matrix tmp(  lft );
  232.     for (int i = 0; i < lft.size; ++i)
  233.         for(int j = 0; j < lft.size; ++j)
  234.             tmp.mtptr[i][j] = num + lft.mtptr[i][j];
  235.    
  236.     return tmp;
  237. }
  238. /* Оператор = ( присваивания ) */
  239. Matrix& Matrix::operator=(const Matrix& right){
  240.  
  241.     if (&right != this){        // проверка на присваивание самому себе
  242.         // очистка памяти     
  243.         if (right.size != size){
  244.             for(int i = 0; i < size; ++i)
  245.                 delete[] mtptr[i];
  246.             delete[] mtptr;
  247.             // выделение памяти для копии массива
  248.             size = right.size;
  249.  
  250.             mtptr = new double*[size];
  251.             for(int i = 0; i < size; ++i)
  252.                 mtptr[i] = new double[size];
  253.         }
  254.         for (int i = 0; i < size; ++i)
  255.             for (int j = 0; j < size; ++j)
  256.                 mtptr[i][j] = right.mtptr[i][j];
  257.     }
  258.     return *this;
  259. }
  260.  
  261.  
  262.  
  263.  
  264. ///////////////////////////////
  265. ///////////////////////////////
  266.  
  267.  
  268.  
  269. int main(int argc, char *argv[])
  270. {
  271.  
  272.     // Driver
  273.     Matrix mtOne(4), mtTwo(4), mtThree(4);
  274.  
  275.     mtOne.fillRandom(9);
  276.     mtTwo.fillRandom(4);
  277.     mtThree.init(1);
  278.    
  279.     cout << "mtOne" << endl << mtOne << endl;
  280.     cout << "mtTwo" << endl << mtTwo << endl;
  281.  
  282.     cout << "mtOne * mtTwo" << endl;
  283.     cout << mtOne * mtTwo << endl;
  284.  
  285.     cout << "mtOne + mtTwo" << endl;
  286.     cout << mtOne + mtTwo << endl;
  287.  
  288.     cout << "mtOne - 4 "<< endl;
  289.     cout << mtOne  - 4 << endl;
  290.  
  291.     return 0;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement