dポイントプレゼントキャンペーン実施中!

行列式を計算する関数をもちいてプログラムを見やすくしたいのですが、何回やっても値の渡し方がわかりません。

他にも逆行列のプログラムなどの渡し方も知りたいです。
以下が時ビンで考えたプログラムです。
#include <stdio.h>
double det(double array[3][3]);

int main( void )
{
int i,j,k,n=3;
double array[3][3],d;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf( "A[%d,%d]=",i+1,j+1);
scanf( "%lf",&array[ i ][ j ] );
}
}
printf("det= %f \n",det(array[][]));

return 0;
}


double det(double array[][])
{
double array[3][3];



d=array[0][0]*array[1][1]*array[2][2];
d+=array[1][0]*array[2][1]*array[0][2];
d+=array[2][0]*array[0][1]*array[1][2];
d-=array[2][0]*array[1][1]*array[0][2];
d-=array[1][0]*array[0][1]*array[2][2];
d-=array[0][0]*array[2][1]*array[1][2];
return d;
}
よろしくお願いします。

A 回答 (1件)

まず、目に付いたのは、関数の宣言と定義があっていないことです。



2行目で、
double det(double array[3][3]);
と宣言しているのなら、
22行目の関数の定義は、
double det(double array[3][3])
{
 :
}
にしないとコンパイルエラーになります。

次に、呼び出し方にも問題があります。
配列を引数として呼び出すので、det関数を使い方は、det(array)で良いです
det(array[][])では、コンパイルエラーになりますよ。

あと、det関数内の変数宣言が間違っています。
array変数は引数なので、ローカル変数として宣言する必要はありませんよ
ここで必要なのは、行列数を格納するd変数を宣言することです

ここまでで、コンパイル・リンクは出来ると思います
後は、ご自身で頑張ってみてください。

最後に、逆行列については、比較的簡単な方法としては2つの方法が考えられます
1つ目は、逆行列を格納する配列を引数で指定する方法です。
void inv(double in_mat[3][3], double out_mat[3][3])
という関数を実装していけば良いでしょう

2つ目は、戻り値で渡す方法です
この場合は、ポインタを理解していることと、static変数を理解していることが必須となります
double * inv(double in_mat[3][3])
という関数を宣言し実装していけば良いのです

関数の覚えたての人には難易度は高いかもしれないので、1つ目の方法で実装したら如何でしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!