Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2011, 21:36   #11
Vitek.i
Пользователь
 
Регистрация: 06.12.2010
Сообщений: 28
По умолчанию

Да, это басик ))). Просто сам допендрил и решил сдесь написать. Вдруг когда пригодится кому нить))
Vitek.i вне форума Ответить с цитированием
Старый 25.01.2011, 16:57   #12
vitaska
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 22
По умолчанию

Может можно и проще, но я решил таким образом, так что не обессудьте:


Код:
#include <iostream>
#include <ctime>
#include <cmath>

using namespace std;

template <typename T> void FreeMem(T **matr, int n);
template <typename T> void PrintMtx(T **matr, int n);
template <typename T> void SetMtx(T **matr, int n);
template <typename T> void TransponMtx(T **matr, T **tMatr, int n);
void Get_matr(int **matr, int n, int **temp_matr, int indRow, int indCol);
int Det(int **matr, int n);

void main()
{
srand((unsigned)time(NULL));
setlocale(0, "");
int n, det;
cout << "Введите размер матрицы: ";
cin >> n;
int **matr = new int * [n];
for(int i = 0; i < n; i++)
matr[i] = new int[n];
SetMtx(matr, n);
PrintMtx(matr, n);
det = Det(matr, n);
cout << "Определитель матрицы = " << det << endl;

if(det){
double **obr_matr = new double * [n];
double **tobr_matr = new double * [n];
for(int i = 0; i < n; i++){
obr_matr[i] = new double[n];
tobr_matr[i] = new double[n];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int m = n - 1;
int **temp_matr = new int * [m];
for(int k = 0; k < m; k++)
temp_matr[k] = new int[m];
Get_matr(matr, n, temp_matr, i, j);
obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
FreeMem(temp_matr, m);
}
}
TransponMtx(obr_matr, tobr_matr, n);
PrintMtx(tobr_matr, n);
FreeMem(tobr_matr, n);
FreeMem(obr_matr, n);	
}
else cout << "Т.к. определитель матрицы = 0,\nто матрица вырожденная и обратной не имеет!!!" << endl;
FreeMem(matr, n);
}



Функция транспонирования матрицы
template <typename T> void TransponMtx(T **matr, T **tMatr, int n)
{
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < n; j++)
            tMatr[j][i] = matr[i][j];
}
Функция освобождения памяти
template <typename T> void FreeMem(T **matr, int n)
{
if(&matr != NULL){
for(int i = 0; i < n; i++)
     delete [] matr[i];
delete [] matr;	
}
}
Функция заполнения матрицы случайными числами в заданном диапазоне
template <typename T> void SetMtx(T **matr, int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matr[i][j] = rand()%9 + 1; 
}
Функция печати матрицы
template <typename T> void PrintMtx(T **matr, int n)
{
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++)
cout << matr[i][j] << " ";
cout << endl; 
}
}
Функция вычеркивания строки и столбца
void Get_matr(int **matr, int n, int **temp_matr, int indRow, int indCol)	
{
int ki = 0; 
for (int i = 0; i < n; i++){
if(i != indRow){
for (int j = 0, kj = 0; j < n; j++){
if (j != indCol){
temp_matr[ki][kj] = matr[i][j];
kj++;
}
}
ki++;		
}
}
}
Функция вычисления определителя матрицы
int Det(int **matr, int n)	
{
int temp = 0;	
int k = 1;
if(n < 1)
         return 0;
else if (n == 1)
temp = matr[0][0];
else if (n == 2)
temp = matr[0][0] * matr[1][1] - matr[1][0] * matr[0][1];
else{
for(int i = 0; i < n; i++){
int m = n - 1; 
int **temp_matr = new int * [m];
for(int j = 0; j < m; j++)
temp_matr[j] = new int [m];
Get_matr(matr, n, temp_matr, 0, i);
temp = temp + k * matr[0][i] * Det(temp_matr, m);
k = -k;
FreeMem(temp_matr, m);
}
}
return temp;
}

Последний раз редактировалось vitaska; 25.01.2011 в 17:06.
vitaska вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная матрица на VB Vitek.i Помощь студентам 1 21.01.2011 19:34
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Nox_uf Помощь студентам 1 23.09.2009 16:11
Обратная матрица Artemm Общие вопросы C/C++ 6 26.05.2009 17:55
обратная матрица=) PrincEssa91 Паскаль, Turbo Pascal, PascalABC.NET 0 23.05.2009 15:59