Помогите убогому

Пишу программу, решающую СЛАУ методом Гаусса, т.е. путем складывания и вычитания строк, и наткнулся на проблему в функции SolutionGauss(), которая и занимается вычитанием строк. Вместо поэлементного вычитания из всех элементов одной строки элементов другой с фиксированным коэффициентом, программа изменяет только один элемент

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;


class Matrix {
private:
    long double** MATRIX;
    int M, N;
    void Create()
    {
        MATRIX = new long double* [M];
        for (int z = 0; z < M; z++)
            MATRIX[z] = new long double[N];
    }
public:

    Matrix(int i, int j) : M(i), N(j) { Create(); }  // конструктор матрицы
    ~Matrix()    // деструктор матрицы
    {

    }
    void setKJ(int k, int j, long double r) { MATRIX[k][j] = r; } // ввод kj элемента матрицы
    int giveM() { return M; }  //вывод количества строк
    int giveN() { return N; }  //вывод количества столбцов
    long double giveKJ(int k, int j) { return MATRIX[k][j]; }

    void CreateByHand() {   // заполнение вручную
        int i, j;
        for (i = 0; i < M; i++) {
            for (j = 0; j < N; j++) {
                cout << "[" << i << "][" << j << "]= ";
                cin >> MATRIX[i][j];
            }

        }
        cout << " " << endl;
    }
    void CreateRandom() {  // рандомное заполнение
        int i, j;
        for (i = 0; i < M; i++) {
            for (j = 0; j < N; j++) {
                MATRIX[i][j] = 100 * (double)(rand()) / RAND_MAX;
            }
        }
    }
    long double Element(int j, int m)  // элемент с номером j, m
    {
        return MATRIX[j][m];
    }

    void Print() // функция вывода матрицы
    {
        int i, j; // счетчики
        for (i = 0; i < M; i++) {
            for (j = 0; j < N; j++)
                cout << MATRIX[i][j] << " ";
            cout << endl;
        }
    }
};

// Функция копирования матрицы
Matrix EqualsMatrix(Matrix A)
{
    Matrix F(A.giveM(), A.giveN());
    int i, j;
    for (i = 0; i < A.giveM(); i++) {
        for (j = 0; j < A.giveN(); j++) {
            F.setKJ(i, j, A.giveKJ(i, j));
        }
    }
    return  F;
}

void SetsystemGauss(Matrix A, Matrix B)
{
    string ans; // спрашиваем, заполнять все вручную или рандомно
    cout << "Would you like to use random system matrix and constant terms, or would you like to insert them manually? : " << endl;
    cout << "1.Manually" << endl << "2.Random" << endl;
    cin >> ans;
    if (ans == "1") {
        cout << "Type in system matrix: " << endl;
        A.CreateByHand();
        A.Print();
        cout << " " << endl << "Type in constant terms: " << endl;
        B.CreateByHand();
        B.Print();
    }
    else {
        A.CreateRandom();
        cout << " " << endl << "System matrix is: " << endl << " " << endl;
        A.Print();
        B.CreateRandom();
        cout << " " << endl << "Constant terms are: " << endl << " " << endl;
        B.Print();
    }
}
// Функция склеивания матриц
Matrix GlueMatrixes(Matrix A, Matrix B)
{
    Matrix L(A.giveM(), A.giveN() + B.giveN());
    int i, j;
    for (i = 0; i < A.giveM(); i++) {
        for (j = 0; j < A.giveN(); j++) {
            L.setKJ(i, j, A.giveKJ(i, j));
        }
    }
    for (i = 0; i < A.giveM(); i++) {
        for (j = A.giveN(); j < L.giveN(); j++) {
            L.setKJ(i, j, B.giveKJ(i, j - A.giveN()));
        }
    }
    return L;
}



// Решение
Matrix SolutionGauss(Matrix L)
{
    int i, j, k;
    Matrix U = EqualsMatrix(L);
    cout << " L.GiveN = " << L.giveN();
    for (i = 0; i < L.giveM(); i++)  // счетчик переменной, по которой производится вычитание
    {
        cout << " i=" << i << endl;
        for (j = 0; j < i; j++) // счетчик строки
        {
            cout << " j=" << j << endl;
            for (k = 0; k < L.giveN() ; k++)
            {
                cout << " k=" << k << endl;
                U.setKJ(j, k, (U.giveKJ(j, k) - U.giveKJ(i, k) * (U.giveKJ(j, i) / U.giveKJ(i, i))));
                cout << " " << endl;
                U.Print();
            }
        }

        for (j = i + 1; j < L.giveM(); j++) // счетчик строки
        {
            cout << " j=" << j << endl;
            for (k = 0; k < L.giveN(); k++)
            {
                cout << " k=" << k << endl;
                U.setKJ(j, k, (U.giveKJ(j, k) - U.giveKJ(i, k) * (U.giveKJ(j, i) / U.giveKJ(i, i))));
                cout << " " << endl;
                U.Print();
            }

        }
    }
    return U;
}

void GiveSolutionGauss(Matrix U)
{

}


int main() {
    int m;
    cout << "Enter the size of the system matrix: ";
    cin >> m;

    Matrix A(m, m); // матрица системы
    Matrix B(m, 1); // вектор свободных членов
    SetsystemGauss(A, B);
    Matrix L = GlueMatrixes(A, B);
    L.Print();
    Matrix U = SolutionGauss(L);
    U.Print();

    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.