#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include <iomanip>
using namespace std;
//алгебраическое дополнение к элементу a[row][col] генерация их
double add(double a[3][3], unsigned row, unsigned col, unsigned N, unsigned M)
{
double b[2][2];
unsigned i, j, bi, bj;
for (i = 0, bi = 0; i<N; i++)
{
if (i != row)
{
for (j = 0, bj = 0; j<M; j++)
if (j != col)
{
b[bi][bj] = a[i][j];
bj++;
}
bi++;
}
}
if ((row + col) % 2)
return b[0][1] * b[1][0] - b[0][0] * b[1][1];
else
return b[0][0] * b[1][1] - b[0][1] * b[1][0];
}
//определитель матрицы
double det(double **a, unsigned N, unsigned M)
{
int i;
double sum;
for (i = 0, sum = 0.; i<N; i++)
sum += a[i][0] * add(a, i, 0, N, M);
if (sum < 0)
cout << "ERROR DETERMINANT NOL'";
return sum;
}
//обратная матрица
void inverse(double **a, double d, unsigned N, unsigned M)
{
double a1[N][M], cur;
unsigned i, j;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
a1[i][j] = add(a, i, j, N, M) / d;
for (i = 0; i < N; i++)
for (j = i + 1; j < M; j++)
{
cur = a1[i][j];
a1[i][j] = a1[j][i];
a1[j][i] = cur;
}
if (d < 0)
cout << "Error \n";
else {
cout << "\nobratnya matrix :\n";
for (i = 0; i <N; i++)
{
for (j = 0; j < M; j++)
cout << setw(7) << a1[i][j];
cout << "\n";
}
}
}
//основная функция
int main()
{
unsigned N, M; //размерность матрицы
double determinant; // объявление детерминанта(опеределителя)
unsigned i, j;
cout << "n "; cin >> N;
cout << "m "; cin >> M;
double ** arr = new double*[N];
for (i = 0; i < N; i++) {
arr[i] = new double[M];}
for (j = 0; j<M; j++)
arr[i][j] = rand() % 10 - 5; //задаем рандом в диапазоне от +10 до -5
cout << "matrix A:\n";
for (i = 0; i<N; i++)
{
for (j = 0; j<M; j++)
cout << setw(7) << setprecision(2) << arr[i][j]; //setprecision - сокращение до двух знаков после запятой //setw(7) расстояние между знаками
cout << "\n";
}
determinant = det(arr, N, M);
cout << "\ndeterminant: " << determinant << "\n"; //вывод детерминанта
if (determinant) inverse(arr, determinant, N, M); //в другом случае
else cout << "obrantoy matrici net";
getchar();
for (i = 0; i<N; i++)
delete[] arr[i];
delete[] arr;
return 0;
}
Но всё таки повторю, то что написал в комментариях. Когда вы бездумно летите вперёд думая, что обретёте знания по пути, вы заблуждаетесь, а когда будет серьёзная ошибка, скорее всего у вас опустятся руки.
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <iomanip>
using namespace std;
//алгебраическое дополнение к элементу a[row][col] генерация их
double add(double** a, unsigned row, unsigned col, unsigned N, unsigned M)
{
double b[2][2];
unsigned i, j, bi, bj;
for (i = 0, bi = 0; i<N; i++)
{
if (i != row)
{
for (j = 0, bj = 0; j<M; j++)
if (j != col)
{
b[bi][bj] = a[i][j];
bj++;
}
bi++;
}
}
if ((row + col) % 2)
return b[0][1] * b[1][0] - b[0][0] * b[1][1];
else
return b[0][0] * b[1][1] - b[0][1] * b[1][0];
}
//определитель матрицы
double det(double **a, unsigned N, unsigned M)
{
int i;
double sum;
for (i = 0, sum = 0.; i<N; i++)
sum += a[i][0] * add(a, i, 0, N, M);
if (sum < 0)
cout << "ERROR DETERMINANT NOL'";
return sum;
}
//обратная матрица
void inverse(double **a, double d, unsigned N, unsigned M)
{
double **a1 = new double*[N];
for(int i = 0; i<N; ++i){
a1[i] = new double[M];
}
double cur;
unsigned i, j;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
a1[i][j] = add(a, i, j, N, M) / d;
for (i = 0; i < N; i++)
for (j = i + 1; j < M; j++)
{
cur = a1[i][j];
a1[i][j] = a1[j][i];
a1[j][i] = cur;
}
if (d < 0)
cout << "Error \n";
else {
cout << "\nobratnya matrix :\n";
for (i = 0; i <N; i++)
{
for (j = 0; j < M; j++)
cout << setw(7) << a1[i][j];
cout << "\n";
}
}
}
//основная функция
int main()
{
unsigned N, M; //размерность матрицы
double determinant; // объявление детерминанта(опеределителя)
unsigned i, j;
cout << "n "; cin >> N;
cout << "m "; cin >> M;
double ** arr = new double*[N];
for (i = 0; i < N; i++) {
arr[i] = new double[M];}
for (j = 0; j<M; j++)
arr[i][j] = rand() % 10 - 5; //задаем рандом в диапазоне от +10 до -5
cout << "matrix A:\n";
for (i = 0; i<N; i++)
{
for (j = 0; j<M; j++)
cout << setw(7) << setprecision(2) << arr[i][j]; //setprecision - сокращение до двух знаков после запятой //setw(7) расстояние между знаками
cout << "\n";
}
determinant = det(arr, N, M);
cout << "\ndeterminant: " << determinant << "\n"; //вывод детерминанта
if (determinant) inverse(arr, determinant, N, M); //в другом случае
else cout << "obrantoy matrici net";
getchar();
for (i = 0; i<N; i++)
delete[] arr[i];
delete[] arr;
return 0;
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
написал рекурсивную реализацию поиска в глубину, которая отлично работает:
Когда лучше использовать копирование, а когда перемещение? (Когда большие объекты лучшие копировать(даже если дальше их не используем)?)
Программа должна посчитать количество символов и слов в введённой строке, считывание осуществляется при помощи функции getche()