Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 20:58   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Добавил ввод. Кое-что чуть поменял. (100% работоспособность не гарантирую)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define E 0.000001

void
mover(double *a,int to,int from,int n)
{
    double tmp[2*n];
    int i;
    memcpy(tmp,(a+2*from*n),2*sizeof(double)*n);
    memcpy((a+2*from*n),(a+2*to*n),2*sizeof(double)*n);
    memcpy((a+2*to*n),tmp,2*sizeof(double)*n);
}

void
adder(double *a,int to,int from,int n)
{
    double d=*(a+2*to*n+from)/(*(a+2*from*n+from));
    int i;
    for (i=0; i<2*n; i++)
        *(a+2*to*n+i)-=(*(a+2*from*n+i))*d;
}

void
printmatrix(double *a, int n)
{
    int i,j;
    for(i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            printf("%3.3lf  ",*(a+2*n*i+j));
        putchar('\n');
    }
}

void
printinvmatrix(double *a, int n)
{
    int i,j;
    for(i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            printf("%3.3lf  ",*(a+2*n*i+j+n));
        putchar('\n');
    }
}

int
main(void)
{
    int n,i,j,q;
    printf("Input size of matrix: ");
    scanf("%d",&n);

    double a[n][2*n];
    memset(a,0,2*n*n*sizeof(double));

    printf("Input elements of matrix:\n");
    for(i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            scanf("%lf",&(a[i][j]));
    }

    for (i=0; i<n; i++)
        a[i][n+i]=1;

    printf("Source matrix:\n");
    printmatrix(a,n);

    for (i=0; i<n; i++)
    {
        j=i;
        while((fabs(a[j][i])<E)&&(j<n))
            j++;
        if (j==n)
        {
            printf("Matrix does not have the inverse matrix");
            return 0;
        }
        if (j!=i)
            mover(a,i,j,n);
        for (q=i+1; q<n; q++)
            adder(a,q,i,n);
    }

    for (i=n-1; i>=0; i--)
    {
        for (q=i-1; q>=0; q--)
            adder(a,q,i,n);
        for (q=2*n-1; q>=i; q--)
            a[i][q]/=a[i][i];
    }

    for (i=0; i<n; i++)
        for (j=n; j<2*n; j++)
            if (fabs(a[i][j])<E)
                a[i][j]=0;

    printf("\nThe inverse matrix:\n");
    printinvmatrix(a,n);
    return 0;
}
УПД Еще чуток оптимизирована.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.04.2012 в 21:23.
BDA вне форума Ответить с цитированием
Старый 17.04.2012, 21:08   #12
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
По умолчанию

Спасибо .. сама бы я этого не написала.))
nat@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная матрица ivan.tiran Паскаль, Turbo Pascal, PascalABC.NET 1 04.10.2011 13:43
Обратная матрица kati412 Помощь студентам 0 09.04.2011 18:29
Обратная матрица на VB Vitek.i Помощь студентам 1 21.01.2011 19:34
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Artemm Общие вопросы C/C++ 6 26.05.2009 17:55