1 Востаннє редагувалося kerimov_e (20.02.2019 20:15:21)

Тема: Виправити помилки в коді

Не можу зробити правильно об'явлення в коді. Це фрагмент знаходження вільних членів. Будь ласка допоможіть виправити помилки.

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]; 

                 // копіювання в матрицю А
    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<<"rishennya neisnye\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--;
            }
        }
    }

    // зворотній хід
    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";
    }
}

2 Востаннє редагувалося koala (20.02.2019 20:35:30)

Re: Виправити помилки в коді

Об'явлення - це з Біблії. Ви, мабуть, проголошення хочете зробити.
На превеликий жаль, без ваших пояснень, що саме ви хочете зробити ("фрагмент знаходження вільних членів" не допомагає), ми не зможемо вам допомогти. Також опишіть, які саме помилки виникають у вас при компіляції цього коду.
Якщо ви гадаєте, що це має бути зрозумілим з коду, то ви ж самі кажете, що цей код не робить, що вам треба - то яким чином з нього можна зрозуміти, що вам треба?
А ще я бачу 2 new і 0 delete. Пам'ять тече.

3 Востаннє редагувалося kerimov_e (20.02.2019 21:07:09)

Re: Виправити помилки в коді

Помилки: 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. Пам'ять тече.

4

Re: Виправити помилки в коді

Стосовно помилок: видаліть функцію Gauss - більшість помилок у ній, а вона ніде не викликається.
І ви так і не написали, що саме намагаєтеся зробити. "Знайти вільні члени", якщо більше нічого в умові не сказано, ви можете на Tinder без будь-якої математики.

5

Re: Виправити помилки в коді

Завдання: знайти зворотню матрицю.
Роблю по цій інструкції: http://ru.solverbook.com/spravochnik/ma … j-matricy/
Можливо я щось роблю не те, будь-ласка підскажіть.

koala написав:

Стосовно помилок: видаліть функцію Gauss - більшість помилок у ній, а вона ніде не викликається.
І ви так і не написали, що саме намагаєтеся зробити. "Знайти вільні члени", якщо більше нічого в умові не сказано, ви можете на Tinder без будь-якої математики.

6

Re: Виправити помилки в коді

змінив код з ціїє частини і програма некорректно працює,

    determinant = det(arr, N, M); 
    cout << "\ndeterminant: " << determinant << "\n";

    if (determinant) inverse(arr, determinant, N, M); 
    else cout << "obrantoy matrici net";
    b = 1 / determinant *ar[i][j];
    cout << "res " << b << endl;
    getchar();
    system("pause");
    for (i = 0; i<N; i++)
        delete[] arr[i];
    delete[] ar[i];
    delete[] arr;
    return 0;
}
koala написав:

Стосовно помилок: видаліть функцію Gauss - більшість помилок у ній, а вона ніде не викликається.
І ви так і не написали, що саме намагаєтеся зробити. "Знайти вільні члени", якщо більше нічого в умові не сказано, ви можете на Tinder без будь-якої математики.

7

Re: Виправити помилки в коді

Для початку - щоб можна було вам нормально допомогти, ви маєте надати всю наявну у вас інформацію. Не змушувати тих, хто вам відповідає, розпитувати вас - а надавати те, що є, якомога достовірніше. До цього можете додавати свої роздуми про можливі причини цього, це теж допомагає. Якщо ви пишете "програма некорректно працює", то дуже хочеться відповісти "перезапустіть, може, запрацює коректно" - а от якщо б написали "програма виводить 2 1 4 54454545, а я очікував 2 1 4 0", то вже можна було б розбиратися. Вирівнюйте код - що таке оце:

cout << "\n";}}}

Це типу ми маємо розбиратися, де там яка дужка? А у вас мало часу код вирівняти? Так у нас його теж небагато. Ви не зацікавлені в тому, щоб зробити код зручним для читання тими, хто вам має допомагати? А ті, до кого ви звертаєтеся по допомогу, у цьому зацікавлені більше за вас, як гадаєте? Зрештою, якщо код легко читається, то й помилки в ньому вам легше буде шукати.
Завдання у вас, ви кажете, знайти "зворотню" (обернену, чи що?) матрицю. Добре. А за посиланням - вирішення завдання "розв'язати систему лінійних рівнянь". Так, там використовується обернена матриця, але до чого тут стовпчик вільних членів? Він потрібен лише для розв'язання рівнянь, а вам треба обернену матрицю знайти, так? Чи вам треба все ж таки розв'язати рівняння, а для цього ви шукаєте обернену матрицю?
Алгебраїчні доповнення працюють у вас лише для розмірів 3х3; до речі, обернена матрицю існує лише для квадратної матриці, тому ви дарма задаєте M і N, вони мають бути однакові. О, до речі, мабуть, це і є основна ваша помилка (якщо видалити, як я сказав, функцію Gauss) - які у вас M та N?

Подякували: leofun011