矩阵行列式.Bad输出

时间:2016-12-10 16:44:03

标签: c matrix

当我尝试计算矩阵的3阶行列式时,我收到了错误的输出。在2阶,它工作正常。更具体地说,我没有收到9个值(v [1,1],v [1,2]等),但我得到的不止于此。我认为是数组的问题,但是idk .. 代码:

#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;
}

2 个答案:

答案 0 :(得分:0)

首先,你宣布

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

e使用v时没有足够的项目,因为int e[9]; 有3 x 3 = 9个元素。

所以似乎可以通过将第二个语句改为

来解决
for

但这不是故事的结局。

0循环中,你循环也不是1(这在C语言中很常见),但来自int v[4][4]; /* for using indices from 1 to 3 */ int e[10]; /* for using indices from 1 to 9 */ ,所以你需要为所有数组增加1个索引!

声明

decimal total = 0;
foreach (string file in Directory.EnumerateFiles("D:/", "*.txt"))
{
  string content = File.ReadAllText(file);
  total += Convert.ToDecimal(content);
}

答案 1 :(得分: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,而不是从13。此外,你明显超出了e的范围,因为它有3个元素,但你可以到e[9]

顺便说一句,您也不需要将内容从v转移到e。阅读v后,您只需将v[0][0]称为v[0],将v[0][1]称为v[1],将v[1][0]称为v[3]v[2][2]v[8]

另外,在参考二阶行列式的部分中,你会产生几乎相同的错误。