// Matrix.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
using namespace std;
//Выделить память для матрицы
double ** AllocMatrix(int Rows, int Colomns)
{
double ** Matrix;
try
{
Matrix = new double * [Rows];
if( Matrix == NULL ) throw 0;
for (int i = 0; i < Rows; i++)
{
Matrix[i] = new double [Colomns];
if( Matrix[i] == NULL ) throw i;
}
}
catch( int index )
{
cout << "Ошибка выделения памяти" << endl;
for (int i = 0; i < index; i++)
{
delete [] Matrix[i];
Matrix[i] = NULL;
}
return NULL;
}
return Matrix;
}
//Ввод матрицы
bool GetMatrix(double ***Matrix, int *Rows, int *Colomns)
{
cout << "Rows: "; cin >> (*Rows);
cout << "Colomns: "; cin >> (*Colomns);
//Выделить память под массив
double **Ret;
Ret = AllocMatrix(*Rows, *Colomns);
*Matrix = Ret;
if (Ret != NULL)
{
for (int i = 0; i < *Rows; i++)
for (int j = 0; j < *Colomns; j++)
{
printf("Matrix[%d][%d] = ", i, j);
cin >> Ret[i][j];
}
return true;
}else return false;
}
//Проверка размерностей
bool CheckMatrixes(int Rows1, int Colomns1, int Rows2, int Colomns2)
{
return (Rows2 == Colomns1);
}
//Умножение матриц
bool MultiplyMatrix(double **Matrix1, int Rows1, int Columns1,
double **Matrix2, int Rows2, int Columns2,
double ***ResultMatrix, int *ResultRows, int *ResultColumns)
{
*ResultRows = Rows1;
*ResultColumns = Columns2;
double **Ret;
Ret = AllocMatrix(*ResultRows, *ResultColumns);
*ResultMatrix = Ret;
if (Ret != NULL)
{
for (int i = 0; i < *ResultRows; i++)
for (int j = 0; j < *ResultColumns; j++)
{
double Sum = 0;
for (int n = 0; n < Rows2; n++)
{
Sum += Matrix1[i][n]*Matrix2[n][j];
}
(*ResultMatrix)[i][j] = Sum;
}
return true;
}else return false;
}
//Вывод матрицы
void MatrixOut(double **Matrix, int Rows, int Columns)
{
for (int i = 0; i < Rows; i++)
{
for (int j = 0; j < Columns; j++)
cout << Matrix[i][j] << "\t";
cout << endl;
}
}
//Освободить память матрицы
void FreeMatrix(double **Matrix, int Rows)
{
for (int i = 0; i < Rows; i++)
{
delete [] Matrix[i];
Matrix[i] = NULL;
}
delete [] Matrix;
Matrix = NULL;
}
//Основной блок программы
int main()
{
locale::global(locale("rus"));
double ***A = new double **, ***B = new double **, ***C = new double **;
int ARowCount, AColCount, BRowCount, BColCount, CRowCount, CColCount;
do
{
cout << "Введите матрицу A:\n";
} while (!GetMatrix(A, &ARowCount, &AColCount));
do
{
cout << "Введите матрицу B:\n";
} while (!GetMatrix(B, &BRowCount, &BColCount));
if (CheckMatrixes(ARowCount, AColCount, BRowCount, BColCount))
{
if (MultiplyMatrix(*A, ARowCount, AColCount,
*B, BRowCount, BColCount, C, &CRowCount, &CColCount))
{
cout << "Результат:\n";
MatrixOut(*C, CRowCount, CColCount);
FreeMatrix(*C, CRowCount);
}
} else cout << "Невозможно перемножить матрицы\n";
FreeMatrix(*A, ARowCount);
FreeMatrix(*B, BRowCount);
system("pause");
return 0;
}