Помилки: https://pastenow.ru/4TAIK
Я не могу зрозуміти, як тут оголосити вільні члени та їх вивести, щоб потім дорахувати зворотню матрицю.
Код "вільних членів" я знайшов в інеті і намагаюся переробити, але не виходить
Дивіться в мене є повний код:
#include "stdafx.h"
#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[4][4]; //якщо матриця дуже велика змініть
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";}}}
void Gauss(double **X, double **A[N][N + 1], unsigned N, unsigned M) // вільні члени
{
double **a1 = new double*[N];
int r; // робочий масив з вільних членів
double temp;
int i, j, k; // робочі змінні
double ** B = new double*[N];
// копіювання в матрицю A
for (i = 0; i < N; i++)
{
B[i] = A[i][N]; // копіювання попередніх численів
X[i] = 0;
}
// прямой ход
for (i = 0; i < N; i++)
{
if (A[i][i] != 0)
{
// віднімаємо рядок від попередніх
for (k = (i + 1); k < N; k++)
{
r = A[k][i] / A[i][i];
for (j = i; j < N; j++) A[k][j] -= A[i][j] * r;
B[k] -= B[i] * r;
}
}
else
{
// шукаємо не нульовий елемент
for (j = (i + 1); j < N; j++)
{
if (A[j][i] != 0) break;
}
// якщо не знайдено рішення не існує
if (j == N)
{
cout<<"reshenya neisnue\n";
exit(1);
}
else // якщо знайдено то міняємо місцями
{
// матриця
for (k = i; k < N; k++)
{
temp = A[i][k];
A[i][k] = A[j][k];
A[j][k] = temp;
}
// правая часть
temp = B[i];
B[i] = B[j];
B[j] = temp;
// зниження i на одиницю щоб цикл повторював перевіркі й попав в обчислення рядку з попередніх
i--;
}
}
}
// зворотній хід
for (i = N; i >= 0; i--)
{
int s = 0;
for (j = (i + 1); j < N; j++) s += A[i][j] * X[j];
X[i] = (B[i] - s) / A[i][i];
}
// виведення трикутної матриці
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
cout << A[i][j] << " "<<"\n";
cout<< B[i]<<" "<<"\n";
}
}
//головна програма
int main()
{
unsigned N = 0, M = 0; //розмір матриці
double determinant; // обв. визначника
unsigned i, j;
unsigned b; //вільні коєф
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;
} //задаємо рандом
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";
}
cout << "TRANSPONIROVANNYA MATRIX: \n"; //транспонована матриця
double **ar = new double *[N];
for (i = 0; i < N; i++)
{
ar[i] = new double[M];
for (j = 0; j < M; j++) {
ar[i][j] = arr[j][i];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << setw(7)<< ar[i][j] << " ";
}
cout << endl;
}
determinant = det(arr, N, M); //передача з функции в головну програму
cout << "\ndeterminant: " << determinant << "\n"; //вивед. детермінанта
if (determinant) inverse(arr, determinant, N, M); //інакше
else cout << "obrantoy matrici net";
getchar();
system("pause");
for (i = 0; i<N; i++)
delete[] arr[i];
delete[] ar[i];
delete[] arr;
return 0;
}
koala написав:Об'явлення - це з Біблії. Ви, мабуть, проголошення хочете зробити.
На превеликий жаль, без ваших пояснень, що саме ви хочете зробити ("фрагмент знаходження вільних членів" не допомагає), ми не зможемо вам допомогти. Також опишіть, які саме помилки виникають у вас при компіляції цього коду.
Якщо ви гадаєте, що це має бути зрозумілим з коду, то ви ж самі кажете, що цей код не робить, що вам треба - то яким чином з нього можна зрозуміти, що вам треба?
А ще я бачу 2 new і 0 delete. Пам'ять тече.