|
学校の課題なんですが、ファイルの入出力を行うプログラムと、N*Mの行列演算を行うプログラムを作成せよという課題がでました。
#include <stdio.h>
#include <math.h>
#define M 3
#define N 3
void inputdata(FILE *fdata, double x[][N],int m, int n);
void matsum(double x[][N], double y[][N], double z[][N], int m, int n);
void matprod(double x[][M], double y[][N], double z[][N], int m, int k, int n);
void out_res(FILE *fout, double a[][N], int m, int n);
int main(void) {
double a[3][N], b[3][N], c[2][N];
double sum1[3][N], prod1[3][N];
FILE *fdata, *fout;
fdata = fopen("matrix.txt","r");
fout = fopen("output.txt","w");
inputdata(fdata, a, 3, 2);
inputdata(fdata, b, 3, 2);
inputdata(fdata, c, 2, 3);
matsum(a, b, sum1, 3, 2);
matprod(a, c, prod1, 3, 2, 3);
printf("A+B =\n");
fprintf(fout, "A+B =\n");
out_res(fout, sum1, 3, 2);
printf("\nA*c =\n");
fprintf(fout, "\nA*c =\n");
out_res(fout, prod1, 3, 3);
fclose(fdata);
fclose(fout);
return 0;
}
void inputdata(FILE *fdata, double x[][N], int m, int n) {
int i,j;
double d;
for (i = 0; i <= m-1; i++) {
for (j = 0; j <= n-1; j++) {
fscanf(fdata, "%lf", &d);
x[i][j] = d;
}
}
}
void matsum(double x[][N], double y[][N], double z[][N], int m, int n) {
int i,j;
for (i = 0; i <=m-1; i++) {
for (j = 0; j <=n-1; j++) {
z[i][j] = x[i][j]+y[i][j];
}
}
}
void matprod(double x[][M], double y[][N], double z[][N], int m, int k, int n)
{
int i, j, r;
double a;
for (i = 0; i <= m-1; i++) {
for (j = 0; j <= n-1; j++) {
a = 0;
for (r = 0; r <=k-1; r++) {
a = a+x[i][r]*y[r][j];
}
z[i][j]=a;
}
}
}
void out_res(FILE *fout, double x[][N], int m, int n) {
int i,j;
for (i = 0; i <= m-1; i++) {
for (j = 0; j <= n-1; j++) {
printf(" %10.3f ", x[i][j]);
fprintf(fout, " %10.3f ", x[i][j]);
}
printf("\n");
fprintf(fout, "\n");
}
}
というプログラムを作ったんですが、これだと任意の行列では計算できません。NとMにどんな数字をいれても動作するようにするにはどこを変えればいいのでしょうか?
|