2015-12-04 2 views
1

Я написал программу для определения детерминанта n на n матрицу с использованием рекурсии (теорема Лапласа).детерминантная программа не работает правильно

они три функции

1) определитель(), чтобы найти определитель п * п матрицы

2) создать() динамически выделять * N массиву

3) копию () для создания п-1 * п-1 минор п * п массив

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
int determinant(int **a,int size,int noentry);// find determinant using recursion 
int copy(int **b,int **a,int size,int noentry);//copy elements to minor 
int **create(int size); // dynamically allocate a two dimensional array 
int main() 
{ 
int **a,size,i,j,y; 
printf("enter the order of the determinant \n"); 
scanf("%d",&size); 
a=create(size); 
printf("enter your elements \n"); 
for(i=0;i<size;i++) 
{ 
    for(j=0;j<size;j++) 
    { 
     scanf("%d",&a[i][j]); 
    } 
} 
y=determinant(a,size,0); 
printf("the determinant is %d \n",y); 
return 0; 
} 
int determinant(int **a,int size,int noentry) 
{ 
int i; 
static int det=0; 
if(size<=2) 
    return a[0][0]*a[1][1]-a[0][1]*a[1][0]; 
else 
{ 
    for(i=0;i<size;i++) 
    { 

     int **b; 
     b=create(size-1); 
     copy(b,a,size-1,i); 
     det= det+pow(-1,i)*a[0][i]*determinant(b,size-1,i); 
    } 
    return det; 
} 
} 
int copy(int **b,int **a,int size,int noentry) 
{ 
int i,j,k; 
for(i=1;i<=size;i++) 
{ 
    k=0; 
    for(j=0;j<=size;j++) 
    { 
     if(j==noentry) 
      continue; 
     else 
     { 
      b[i-1][k]=a[i][j]; 
      k++; 
     } 
    } 
} 
return size; 
} 
int **create(int size) 
{ 
int **b; 
if(size<=0) 
{ 
    printf("the size cannot be negative/null \n"); 
    return NULL; 
} 
int i; 
printf("entered the create function \n"); 
b=(int **)malloc(sizeof(int *)*size); 
for(i=0;i<size;i++) 
    b[i]=(int *)malloc(size*sizeof(int)); 
return b; 
} 

программа корректно работает 3 на 3 матрицы, но не для 4 на 4 матрицы я не могу обнаружить ошибку.

+1

пожалуйста, вы можете показать пример ввода, который не работает? Или это дает неверные результаты для каждой матрицы 4x4? –

+1

Просьба показать, что вход и выход не работают – GNKeshava

+0

для 3 * 3 [2 3 5 7 11 13 17 19 23 29] он работает правильно (-78), но для 4 * 4 [2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53] выход должен быть 880, но я получаю 97560 – kapil

ответ

2

Во-первых, вы никогда не освобождаете выделенный блок, который является плохим. Вы должны создать метод destroy, чтобы освободить ранее выделенную матрицу и вызвать ее один раз за вызов create.

Далее вы передаете неиспользованный параметр noentry в determinant. Это должно быть просто: int determinant(int **a,int size);

Но причиной вашей ошибки является то, что в determinant метод, det переменная статическая. Когда вы возвращаетесь в determinant, каждый новый вызов должен иметь свою собственную копию det или использовать один и тот же.

TL/DR: просто удалите квалификатор static для det переменной в determinant функции.

Последний совет: отладка будет проще, если вы выделили свои матрицы ... матричные мудрые!

int **create(int size) 
{ 
    int i; 
    int **b; 
    if(size<=0) 
    { 
     printf("the size cannot be negative/null \n"); 
     return NULL; 
    } 
    printf("entered the create function \n"); 
    b=(int **)malloc(sizeof(int *)*size); 
    b[0]=(int *)malloc(size * size*sizeof(int)); 
    for(i=1;i<size;i++) 
     b[i]=b[0] + i * size; 
    return b; 
} 
void destroy(int **a) { 
    free(a[0]); 
    free(a); 
} 

Таким образом, вся матрица использует непрерывную память, чтобы увидеть его содержание легко в отладчике, наблюдая в size² чисел, начиная с a[0]. И как побочный эффект, функция разрушения прост.

Просто чтобы быть исчерпывающим, фиксированная determinant функция становится:

int determinant(int **a,int size) 
{ 
    int i; 
    int det=0; 
    int m1 = 1; 
    if(size<=2) 
     return a[0][0]*a[1][1]-a[0][1]*a[1][0]; 
    else 
    { 
     for(i=0;i<size;i++) 
     { 

      int **b; 
      b=create(size-1); 
      copy(b,a,size-1,i); 
      det= det+m1*a[0][i]*determinant(b,size-1); 
      destroy(b); 
      m1 = - m1; 
     } 
     return det; 
    } 
} 
+0

попробует сейчас – kapil

+0

он работал, спасибо вам большое – kapil

Смежные вопросы