行列の掛け算
/*2kadai01-2.c*/
#include <stdio.h>
#include<stdlib.h>

/*領域の確保*/
typedef double **mat;
mat matrix(m,n)
int m,n;
{
int i; mat x;

x=(double **) malloc(m*sizeof(double *));
if(!x) printf("allocation failure 1 in matrix()");
x[0] = (double *) malloc(m*n*sizeof(double));
if(!x[0]) printf("allocation failure 2 in matrix()");
for(i=1;i<m;i++) x[i] = x[i-1] + n;
return(x);
}
void freemat(x)
mat x;
{
free(x[0]);
free(x);
}

main()
{
int l,n,m,o,i,j,k;
mat A,B,C;

/*行列A(行数l,列数m),行列B(行数n,列数o)のサイズを決める*/
printf("行列A(行数l,列数m),行列B(行数n,列数o)の積を求めます。\n");
printf("lを入力してください。\n");
printf("l=");
scanf("%d",&l);
printf("mを入力してください。\n");
printf("m=");
scanf("%d",&m);
printf("nを入力してください。\n");
printf("n=");
scanf("%d",&n);
printf("oを入力してください。\n");
printf("o=");
scanf("%d",&o);
printf("行列Aは%d×%d行列、行列Bは%d×%d行列です。\n",l,m,n,o);

/*掛け算不可能ならばエラー終了*/
if(m!=n){
printf("指定された行列のサイズでは演算不可能です。\n");
}
else{
printf("A×Bは演算可能です。\n");

A=matrix(l,m);
B=matrix(n,o);
C=matrix(l,o);

/*行列Aの各成分を入力*/
for(i=0;i<l;i++){
for(j=0;j<m;j++){
printf("行列Aの%d行%d列の成分は?・・・",i+1,j+1);
scanf("%lf",&A[i][j]);
printf("行列Aの%d行%d列の成分は%lfです。\n",i+1,j+1,A[i][j]);
}
}
/*行列Bの各成分を入力*/
for(i=0;i<n;i++){
for(j=0;j<o;j++){
printf("行列Bの%d行%d列の成分は?・・・",i+1,j+1);
scanf("%lf",&B[i][j]);
printf("行列Bの%d行%d列の成分は%lfです。\n",i+1,j+1,B[i][j]);
}
}

/* かけ算 */
for(i=0;i<l;i++){
for(j=0;j<o;j++){
for(k=0;k<m;k++){
C[i][j] += A[i][k]*B[k][j];
}
}
}
/* 解の出力 */
for(i=0;i<l;i++){
for(j=0;j<o;j++){
printf("ABの[%d]行[%d]列成分 = %lf\n", i+1,j+1,C[i][j]);
}
}

/*解放*/
freemat(A);
freemat(B);
freemat(C);
}
}
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送