программа почему то не всегда выводит результат полностью , не пойму в чем ошибка
Подскажите в чем может быть проблема , программа некорректно работает при размерности матрицы больше 3 , а именно в X2 выводит две или одну строчку вместо четырех и дальше почему то завершает работу с кодом -121314.. и тд А иногда и в месте где умножается матрица на обратную(A*(A^(-1))) Проблема предполагаемо в 205 строчке : вызывается функция summtx(на 51 строчке расположена ф-ция) потом идет ShowMtx1(X2, size, 1); next Еще на 206 и 222 в функциях multimass
#include <iostream>
#include <math.h>
#include <ctime>
#include <iomanip>
using namespace std;
#define clean system("cls");
#define next cout<<endl;
void ShowMtx1(double** A, int size, int size1)//вывод с выравниванием
{
if (size1 != size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size1; j++)
{
cout << fixed << setprecision(4) << setw(8) << A[i][j] << " ";
}
next
}
next
}
else
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << fixed << setprecision(4) << setw(8) << A[i][j] << " ";
}
next
}
next
}
}
void MultiMass(double** T, double** B, double** X, int size, int size2)//умножение
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size2; j++)
{
X[i][j] = 0;
for (int k = 0; k < size; k++)
{
X[i][j] += T[i][k] * B[k][j];
}
}
}
}
void Summmtx(double** A, double** B, double** C, int size)//вычисление суммы матриц
{
cout << "B="; next ShowMtx1(B, size, 1); next
cout << "B="; ShowMtx1(B, size, 1);
for (int i = 0; i < size; i++) {// результат суммирования матриц в новую матрицу
for (int j = 0; j < size; j++)
{
C[i][j] = A[i][j] - B[i][j];
}
next
}
cout << "X2=" << endl;
}
void deleteMtx(double** A, int size)
{
for (int i = 0; i < size + 1; i++)
{
delete[] A[i];
}
delete[] A;
}
void deleteMtx1(double** B, int size)
{
for (int i = 0; i < size; i++)
{
delete[] B[i];
}
delete[] B;
}
int Gaussdet(double** A, double** T, double** C, int size)
{
double** F = new double* [size];
for (int i = 0; i < size; i++)//копия матрицы A
{
F[i] = new double[size];
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
{
F[i][j] = A[i][j];
}
}
cout << "A=" << endl;
ShowMtx1(F, size, size);//вывод матрицы A
double** B = new double* [size];
for (int i = 0; i < size; i++) { B[i] = new double[1]; }
cout << "B=" << endl;//вывод матрицы B
for (int j = 0; j < size; j++) { B[j][0] = rand()%20; cout << B[j][0] << "\n"; }
cout << "T=" << endl;//вывод матрицы T
ShowMtx1(T, size, size); next
double eps;
cout << "Enter the epsilon" << endl;
cin >> eps;// минимальный модуль элемента матрицы //
while ((eps >= 1) || (eps <= 0)) { cout << "Error , enter the epsilon(<1,>0)" << endl; cin >> eps; }
//clean
bool isNull = false;
for (int i = 0; i < size - 1; i++)
{
if (A[i][i] == 0)
{
isNull = true;
break;
}
}
if (isNull)
{
cout << "Problem on diagonal" << endl;//если находим нуль на главной диагонали, то выводим сообщение об ошибке
return 0;
}
//проверка на нулевую строку
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
int schet = 0, schet1 = 0;
if (A[i][j] < eps) schet += 1;
if ((schet == size - 1) || (schet1 == size - 1))
{
cout << "Nulevaya stroka,det=0" << endl;
}
}
}
double temp;
double det = 1;
for (int k = 0; k < size; k++)
{
temp = A[k][k];
det *= temp;
for (int j = 0; j < size; j++)
{
A[k][j] /= temp;
T[k][j] /= temp;
}
for (int i = k + 1; i < size; i++)
{
temp = A[i][k];
for (int j = 0; j < size; j++)
{
A[i][j] -= A[k][j] * temp;
T[i][j] -= T[k][j] * temp;
}
}
}
for (int k = size - 1; k > 0; k--)
{
for (int i = k - 1; i >= 0; i--)
{
temp = A[i][k];
for (int j = 0; j < size; j++)
{
A[i][j] -= A[k][j] * temp;
T[i][j] -= T[k][j] * temp;
}
}
}
ShowMtx1(A, size, size); next ShowMtx1(T, size, size);
cout << "det(A)= " << det; next
cout << "A,right and reverse code" << endl; ShowMtx1(F, size, size); next
ShowMtx1(T, size, size);
cout << "T,right and reverse code;T=A^(-1)" << endl; ShowMtx1(T, size, size);
next
double** X = new double* [size];// X-матрица решений
for (int i = 0; i < size; i++)
X[i] = new double[1];
double** X2 = new double* [size];// X2-копия B
for (int i = 0; i < size; i++) { X2[i] = new double[1]; }
for (int i = 0; i < size; i++)
{
for (int j = 0; j < 1; j++)
{
X2[i][j] = B[i][j];
}
}
//ShowMtx1(F, size, size);
cout << "X=A^(-1)*B" << endl;
cout << "A^(-1)=" << endl; ShowMtx1(T, size, size);
cout << "B=" << endl; ShowMtx1(B, size, 1); next
MultiMass(T, B, X, size, 1); next
cout << "X=" << endl; ShowMtx1(X, size, 1); next
cout << "A*X" << endl;
cout << "A=" << endl; ShowMtx1(F, size, size); next
cout << "X=" << endl; ShowMtx1(X, size, 1); next
cout << "B=" << endl; ShowMtx1(X2, size, 1); next//
MultiMass(T, X, B, size, 1);
cout << "A*X-B" << endl;
Summmtx(B, B, X2, size); ShowMtx1(X2, size, 1); next
cout << "A*A^(-1)" << endl;
double** Z = new double* [size];
for (int i = 0; i < size; i++)
{
Z[i] = new double[size];
}
double** Z1 = new double* [size];
for (int i = 0; i < size; i++)
{
Z1[i] = new double[size];
}
int size2 = 1;
ShowMtx1(F, size, size);
ShowMtx1(T, size, size);
MultiMass(F, T, Z, size, size);
ShowMtx1(Z, size, size); next
cout << "A^(-1)*A" << endl;
MultiMass(T, F, Z1, size, size);
ShowMtx1(T, size, size); next
ShowMtx1(F, size, size); next
ShowMtx1(Z, size, size); next
return 0;
}
int main()
{
int size, choice;
cout << "\t\t\t\t\t\tInput matrix A" << endl;//ввод матрицы A
cout << "Enter the size of matrix A (>0,<=15)" << endl;
cin >> size;
while ((size < 0) || (size > 15)) { cout << "Enter the size of matrix A again" << endl; cin >> size; }
//выход за пределы диапазона//
double** A = new double* [size];//матрица A
for (int i = 0; i < size; i++)
{
A[i] = new double[size];
}
label:
cout << "1-Randomly(matrix A)\n2-Manually(matrix A) " << endl;//автоматически или вручную//
cin >> choice;
switch (choice)
{
case 1:
{
srand(time(0));
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
A[i][j] = rand() % 20;
}
}
break;
}
case 2:
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
{
cout << "A[" << i << "," << j << "]= ";
cin >> A[i][j];
}
next
}
break;
}
default:
{
goto label;
}
}
//clean
double** C = new double* [size];// C - копия матрицы А
for (int i = 0; i < size; i++)
{
C[i] = new double[size]; C[i] = A[i];
}
double** T = new double* [size];// T-для обратной матрицы
for (int i = 0; i < size; i++)
{
T[i] = new double[size];
}
for (int i = 0; i < size; i++)//заполнение смежной матрицы T
{
for (int j = 0; j < size; j++)
{
if (i == j) { T[i][j] = 1.0; }
else { T[i][j] = 0.0; }
}
}
Gaussdet(A, T, C, size);
//return 0;
}
Ответы (1 шт):
Причина крэша программы в следующем, в функции Summtx(...) у вас есть цикл for (int j = 0; j < size; j++) по столбцам, он идёт до size. Но вы подаёте в вызове функции Summmtx(B, B, X2, size); матрицы у которых size строк но 1 столбец. В итоге цикл по j выходит за рамки матрицы и портит память, от этого программа умирает.
Один из вариантов исправления кода это сделать цикл j до 1. Либо подавать нужно квадратную матрицу в функцию.