RahulRaja@123 Ответов: 1

В чем же ошибка этой программы?


#include <stdio.h>
#include <stdlib.h>
#define N 3

int main()
{
    int i,j,k,n=N;float b[N][N],a[N][N],c[N][2*N],det,l;
    printf("Enter the matrix :\n\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("a[%d][%d]= ",i+1,j+1);
           scanf("%f",&b[i][j]);
        }
    }
    printf("ENTERED MATRIX:\n\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)printf("%10.4f",b[i][j]);printf("\n");
    }
    /*Identity Matrix*/
    for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]=(i==j)?1:0;

    /*Echelon Form*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<(2*N);j++)
        {
            if(j<N)c[i][j]=b[i][j];
            else c[i][j]=a[i][j-n];
        }
    }

    printf("\nRow Echelon Form:\n\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<(2*N);j++)printf("%10.4f",c[i][j]);printf("\n");
    }

    printf("\n");
    /*Operation for inverse of matrix begins*/
    for(k=0;k<N-1;k++)
    {
        if(c[k][k]==0)
        {
            for(i=k+1;i<N;i++)if(c[i][k]!=0)break;
            for(j=0;j<(2*N);j++){l=c[i][j];c[i][j]=c[k][j];c[k][j]=l;}
        }
        for(i=k+1;i<N;i++)
        {
            for(j=k;j<N;j++)
                {c[i][j]=c[i][j]-(c[i][k]/c[k][k])*c[k][j];
                 c[i][j+n]=c[i][j+n]-(c[i][k]/c[k][k])*c[k][j+n];}
        }
    }

    for(i=0,det=1;i<N;i++)det*=c[i][i];
    if(det==0.0){printf("\nInverse of Matrix can't be found.\n");exit(0);}
    /*Determinant operation ends*/

    for(k=N-1;k<0;k--)
    {
        if(c[k][k]==0)
        {
            for(i=k-1;i<=0;i--)if(c[i][k]!=0)break;
            for(j=0;j<(2*N);j++){l=c[i][j];c[i][j]=c[k][j];c[k][j]=l;}
        }
        for(i=k-1;i<=0;i--)
        {
            for(j=k;j<=0;j--)
                {c[i][j]=c[i][j]-(c[i][k]/c[k][k])*c[k][j];
                c[i][j+n]=c[i][j+n]-(c[i][k]/c[k][k])*c[k][j+n];}
        }
    }
    for(i=0;i<N;i++){c[i][i]=c[i][i]/c[i][i];c[i][i+n]=c[i][i+n]/c[i][i];}/*corner elements*/

    printf("\nRow Echelon Form:\n\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<(2*N);j++)printf("%10.4f",c[i][j]);printf("\n");
    }


    printf("\nDeterminant of Matrix is %f",det);

    printf("\n\nINVERSE OF MATRIX:\n\n");

    /*printing operation for inverse of matrix begins*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%10.4f",c[i][j+n]);
        }
        printf("\n");
    }
    return 0;
}


Что я уже пробовал:

Это программа для инверсии матрицы, которая не показывает никаких ошибок, но и не дает правильного вывода.

Patrice T

Дайте образец ввода, ожидаемый выход и реальный выход.

Dave Kreskowiak

Компилятор только проверяет, чтобы увидеть, если ваш синтаксис утверждение является верным. Он не может знать, верна ли ваша логика.

Не зная, каков ожидаемый результат для входных данных, которые вы ему даете, довольно трудно понять, что происходит во всей этой математике.

Richard MacCutchan

Главная ошибка-это ваш стиль кодирования. То, что вы здесь имеете, просто невозможно понять. И я сильно подозреваю, что вам на самом деле не нужны все эти массивы, назначение которых опять же невозможно понять.

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
В чем же ошибка этой программы?

Первая ошибка-это ваш стиль кодирования, он очень хорош в том, чтобы сделать ваш код нечитаемым. Следующий шаг-обфускация, она делает код полностью нечитаемым для людей, но компилятор все еще может справиться с ним.
Совет: никогда не пытайтесь сохранить несколько строк в исходном коде, это не ускорит код, а только затруднит его чтение.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.

Вторичное воздействие
- Вы будете гордиться тем, что сами находите Жуков.
- Ваши навыки обучения улучшатся.

Вы должны довольно быстро найти, что не так.

Отладчик - Википедия, свободная энциклопедия[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.