2016-12-10 42 views
1

Wenn ich versuche, eine Determinante 3-Ordnung einer Matrix zu berechnen, erhielt ich schlechte Ausgaben. Bei der 2-er Ordnung funktioniert es gut. Um genauer zu sein, erhalte ich keine 9 Werte (v [1,1], v [1,2] usw.), sondern stattdessen mehr. Ich dachte, ein Problem zu Arrays, aber IDK .. Code:Matrix Determinante .Bad Ausgabe

#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

Willkommen bei Stack Overflow! Es sieht so aus, als müssten Sie lernen, einen Debugger zu verwenden. Bitte helfen Sie sich selbst [https://ericlippert.com/2014/03/05/how-to-debug-small-programs/]. Wenn Sie danach noch Probleme haben, können Sie gerne weitere Einzelheiten erfahren. –

Antwort

0

Zuerst erklären Sie

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

Es gibt nicht genügend Elemente für e, wie Sie es für v verwenden, die 3 x hat 3 = 9 Elemente.

So scheint es, dass es durch eine Änderung der zweiten Anweisung

int e[9]; 

gelöst werden würde, aber es ist nicht das Ende der Geschichte.

In den for Schleifen Sie Schleife noch von 0 (die in C-Sprache üblich ist), aber von 1, so dass Sie 1 weitere Indizes für alle Arrays benötigen!

erklären So

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

Vielen Dank. Ich bin irgendwie neu in C und das scheint ein Anfängerfehler zu sein. Danke nochmal –

+0

Gern geschehen. – MarianD

0

Zuerst sagen int v[3][3]; und int e[3]; und dann erreichen Sie für Elemente wie v[3][3] und e[4]. Sie scheinen zu vergessen, dass Arrays/Matrizen 0-basierte Indizes verwenden. Mit anderen Worten, wenn Sie int v[3][3]; deklarieren, sind die einzigen Elemente, auf die Sie verweisen sollten, v[0][0]...v[2][2]. Beim Lesen von Daten in v sollten die for Schleifen von 0 bis 2 gehen, nicht von 1 bis 3. Außerdem kommen Sie klar aus den Grenzen von e, da es 3 Elemente hat, aber Sie gehen so weit wie e[9].

Btw, müssen Sie auch nicht Dinge von v zu e übertragen. Nach der Lektüre in v können Sie einfach auf v[0][0] als v[0] beziehen, auf v[0][1] als v[1], zu v[1][0] als v[3] und v[2][2] als v[8].

Sie machen auch ziemlich genau die gleichen Fehler in dem Teil, der sich auf die Determinante zweiter Ordnung bezieht.

+0

Danke für Hilfe :) –

Verwandte Themen