2016-12-10 8 views
1

行列の3次行列式を計算しようとすると、出力が正しくありません。 2次のものでは正常に動作します。具体的には、私は9つの値(v [1,1]、v [1,2]など)を受け取ることはありませんが、それ以上の値を受け取ります。私は、アレイに問題があると思ったが、IDKの... コード:行列の行列式.Badの出力

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

void main(void) { 
    int i,j,n,i_max,j_max,ordin,i_m,j_m; 
    long int det; 
    int v[3][3]; 
    int e[3]; 
    int nr=0; 

    printf("\nIntroduceti ordinul matricei:\t"); 
    scanf("%d",&n); 

    if (n==2) { 
     i_max=n; 
     j_max=n; 
     printf("\nIntroduceti valorile matricei:\n"); 
     for (i=1;i<=i_max;i++) { 
      for (j=1;j<=j_max;j++) { 
       printf("v[%d,%d]= ",i,j); 
       scanf("%d",&(v[i][j])); 
       nr++; 
       e[nr] = v[i][j]; 
      } 
     } 

     det = (e[1]*e[4])-(e[2]*e[3]); 
     printf("\nDeterminantul matricei este: %ld\n",det); 
     if (det != 0) 
      printf("Matricea de ordinul %d este inversabila !",n); 
      else printf("Matricea de ordinul %d nu este inversabila!",n); 
    } else if (n==3) { 
     i_m=n; 
     j_m=n; 
     printf("\nIntroduceti valorile matricei:\n"); 
     for (i=1; i<= i_m; i++) { 
      for (j=1; j<= j_m; j++) { 
       printf("v[%d,%d]= ",i,j); 
       scanf("%d",&(v[i][j])); 
       nr++; 
       e[nr] = v[i][j]; 
      } 
     } 
     det = (e[1]*e[5]*e[9])+(e[2]*e[6]*e[7])+(e[3]*e[4]*e[8])-(e[3]*e[5]*e[7])-(e[2]*e[4]*e[9])-(e[1]*e[6]*e[8]); 
     printf("Determinantul matricei este: %ld\n",det); 
     if (det != 0) 
      printf("Matricea de ordinul %d este inversabila!",n); 
     else 
      printf("Matricea de ordinul %d nu este inversabila!",n); 
    } else 
     printf("Ordinul matricei este incorect!"); 
    return 0; 
} 
+0

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

答えて

0

まず、あなたが3×を持ってvのためにそれを使用するようeための十分なアイテムがありません

int v[3][3]; 
int e[3]; 

を宣言します3 = 9要素。

だから、それは

int e[9]; 

に2つ目のステートメントを変更することで解決されるだろうと思えるが、それは物語の終わりではありません。

ループでは0(C言語では一般的です)ではループしませんが、1からループするので、すべての配列に1つ以上のインデックスが必要です。

ので

int v[4][4];   /* for using indices from 1 to 3 */ 
int e[10];   /* for using indices from 1 to 9 */ 
+0

ありがとうございました。私はCの中で新しくて、それはnoobieの間違いのようです。再度ありがとう –

+0

ようこそ。 – MarianD

0

最初に宣言しますint v[3][3];int e[3];を言うと、あなたはv[3][3]e[4]などの要素のために達します。あなたは配列/行列が0ベースのインデックスを使うことを忘れているようです。つまり、int v[3][3];を宣言した場合、参照する必要がある要素はv[0][0]...v[2][2]です。 vにデータを読み取るときには、forループは0から2までで、1から3にはなりません。また、要素が3つあるので、eの境界からはっきりと外れますが、e[9]まで移動します。

Btwの場合、vからeに転送する必要はありません。 vに読んだ後、あなたは、単にv[3]としてv[1][0]へとv[8]としてv[2][2]に、v[1]としてv[0][1]に、v[0]としてv[0][0]を参照することができます。

また、2次の行列式を参照する部分では、ほとんど同じエラーが発生します。

+0

ありがとうございました:) –