06.01.2011, 02:27
общий
это ответ
Здравствуйте, Svistaplas90!
Программу тестировал под VS 2005.
Приложение:
#include <iostream>
#include <math.h>
using namespace std;
double determ(int** Arr, int size)
// функция вычисления определителя
{
double det=0;
int** matr; // вспомогательная матрица
if(size==1) det=Arr[0][0];
else
if(size==2) det=Arr[0][0]*Arr[1][1]-Arr[0][1]*Arr[1][0];
else // если размерность больше двух, то вычисляем методом рекурсии
{
matr=new int*[size-1]; // определяем вспомогательную матрицу
for (int i=0; i<size-1; i++)
matr[i]=new int[size-1];
// вычисляем определитель раскладывая по нулевой строке
for(int k=0; k<size; k++)
{
// заполняем вспомогательную матрицу
// строки берем из основной матрицы все кроме нулевой
// столбцы все кроме k-го
for (int i=0; i<size-1; i++)
for(int j=0; j<size-1; j++)
{
if(j<k) matr[i][j]=Arr[i+1][j];
else matr[i][j]=Arr[i+1][j+1];
};
det+=pow((double)-1, k)*determ(matr, size-1)*Arr[0][k];
}
// освобождение ресурсов
for(int i=0; i<size-1; i++)
delete matr[i];
delete matr;
};
return det;
}
double dopol(int k, int n, int size, int** Arr)
// вычисление алгебраического дополнения
{
int** matr;
double m;
matr = new int*[size-1];// определяем вспомогательную матрицу
for (int i=0; i<size-1; i++)
matr[i]=new int[size-1];
// заполняем вспомогательную матрицу, путем исключения из основной
// k-й строки и n-го столбца
for (int i=0; i<size-1; i++)
for (int j=0; j<size-1; j++)
if (i<k)
if (j<n) matr[i][j]=Arr[i][j];
else matr[i][j]=Arr[i][j+1];
else
if (j<n) matr[i][j]=Arr[i+1][j];
else matr[i][j]=Arr[i+1][j+1];
m=pow((double)-1, (k+n))*determ(matr, size-1);
// освобождение ресурсов
for (int i=0; i<size-1; i++)
delete matr[i];
delete matr;
return m;
}
int main() {
// поддержка кириллицы
setlocale(LC_CTYPE, "Russian");
int n; // размерность матрицы
int** a; // заданная матрица
double** b; // обратная матрица
double d; // определитель
cout << "Введите размерность матрицы: ";
cin >> n;
// определяем основную матрицу
a=new int*[n];
for (int i=0; i<n; i++)
a[i]=new int[n];
// определяем обратную матрицу
b=new double*[n];
for (int i=0; i<n; i++)
b[i]=new double[n];
// ввод основной матрицы
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
cout << "Введите A[" << i << "," << j << "]: ";
cin >> a[i][j];//a[i,j];
};
d = determ(a, n);
cout << "\nОпределитель равен " << d;
// вычисляем обратную матрицу
// если определитель матрицы равен нулю, то обратная матрица не существует
if (d != 0.0)
{
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
b[i][j]=dopol(j, i, n, a)/d;
// вывод обратной матрицы
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
cout << "\nA[" << i << "," << j << "]= " << b[i][j];
}
else cout << "\nОбратная матрица не существует";
cout << "\n";
// освобождение ресурсов
for (int i=0; i<n; i++)
delete a[i];
delete a;
for (int i=0; i<n; i++)
delete b[i];
delete b;
return 0;
}