@LmaoTJ

Mоего преподавателя не устраивают следующие операторы:Rev(&n,&A,&D) и Mult(&n,%D,&B1,&X1)?

#include <iostream>

using namespace std;

const double eps = 0.000001;

int Rev(int* n, double*** A, double*** D)
{
    int r, i, j, k, v;
    double c, z, aii;

    for (i = 0; i < *n; i++)
    {
        for (j = 0; j < *n; j++)
        {
            if (i == j)
                (*D)[i][j] = 1;
            else 
                (*D)[i][j] = 0;
        }
    }

    i = 0; r = *n;

    while (i < r)
    {
        v = i; /*выбор ведущего элемента:*/
        for (j = i + 1; j < *n; j++)
            if (abs((*A)[j][i]) > abs((*A)[v][i])) v = j;

        if (abs((*A)[v][i]) < eps)
            r = i;
        else
        {
            if (v != i)
            {
                for (j = i; j < *n; j++)
                {
                    z = (*A)[i][j];
                    (*A)[i][j] = (*A)[v][j];
                    (*A)[v][j] = z;
                }
                for (j = 0; j < *n; j++)
                {
                    z = (*D)[i][j];
                    (*D)[i][j] = (*D)[v][j];
                    (*D)[v][j] = z;
                }
            }

            aii = (*A)[i][i];
            for (j = i; j < *n; j++) (*A)[i][j] /= aii;
            for (j = 0; j < *n; j++) (*D)[i][j] /= aii;

            for (k = 0; k < *n; k++)
                if (k != i)
                {
                    c = (*A)[k][i];
                    for (j = i; j < *n; j++) (*A)[k][j] -= c * (*A)[i][j];
                    for (j = 0; j < *n; j++) (*D)[k][j] -= c * (*D)[i][j];
                }

            i++;
        }


    }

    if (r < *n)
        return 0;
    else
        return 1;

}

void Mult(int* n, double*** A, double** B, double** X)
{
    int i, j;
    double d;

    for (i = 0; i < *n; i++)
    {
        d = 0.0;
        for (j = 0; j < *n; j++)
            d += (((*A)[i][j]) * ((*B)[j]));
        (*X)[i] = d;
    }

}

int main()
{
    setlocale(LC_ALL, "");

    int n, i, j;
    double** A, **D, * B1, * B2, *X1, *X2;

    cout << "Введите, пожалуйста, n: ";
    cin >> n;

    A = new double* [n];
    D = new double* [n];
    B1 = new double[n];
    B2 = new double[n];
    X1 = new double[n];
    X2 = new double[n];

    cout << "Введите, пожалуйста, значения матрицы A:" << endl;
    for (i = 0; i < n; i++)
    {
        A[i] = new double[n];
        D[i] = new double[n];
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            cin >> A[i][j];
        }
    }

    if (Rev(&n, &A, &D))
    {

        cout << "Введите, пожалуйста, значения вектора B1:" << endl;
        for (i = 0; i < n; i++)
        {
            cin >> B1[i];
        }

        cout << "Введите, пожалуйста, значения вектора B2:" << endl;
        for (i = 0; i < n; i++)
        {
            cin >> B2[i];
        }

        Mult(&n, &D, &B1, &X1);
        Mult(&n, &D, &B2, &X2);

        cout << "X1: ";
        for (i = 0; i < n; i++)
        {
            cout << X1[i] << " ";
        }
        cout << endl;

        cout << "X2: ";
        for (i = 0; i < n; i++)
        {
            cout << X2[i] << " ";
        }
        cout << endl;
    }
    else
    {
        cout << "Матрицва A вырожденная!" << endl;
    }


    for (i = 0; i < n; i++)
    {
        delete[](A[i]);
        delete[](D[i]);
    }
    delete[] A;
    delete[] D;
    delete[] B1;
    delete[] B2;
    delete[] X1;
    delete[] X2;

    system("pause");

    return 0;

}
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Я думаю проблема в том, что вы передаете все как указатели. Например, n можно передавать не как адрес (&n), а просто как n (и тип параметра должен быть не int*, а просто int).

Это все лишнее и только усложняет код.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы