アプリ版:「スタンプのみでお礼する」機能のリリースについて

どこが間違っているのかわかる方お願いします
・行列A,Bはファイルから読み込む
・行列A,Bの積Cの計算には関数を用いる

#include<stdio.h>

#define ROW 10
#define COL 10

void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m )
{
int i,j,k;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
c[i][j]=0;
}
}

for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(k=0;k<m;k++){
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
}
}
}

int main(void)
{
FILE *fp1,*fp2;
char fname1[64],fname2[64];
int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m;
int i,j,k;

printf("Input file name ?");
scanf("%s",fname1);
printf("Output file name ?");
scanf("%s",fname2);

fp1=fopen(fname1,"r");
fp2=fopen(fname2,"w");

fscanf(fp1,"%d %d",&n,&m);

MatrixProduct(a,b,c,n,m);

for(i=0;i<n;i++){
for(j=0;j<n;j++){
fprintf(fp2,"%3d",c[i][j]);
}
fprintf(fp2,"\n");
}

fclose(fp1);
fclose(fp2);
return(0);
}

fp1
3 4
1 2 3 4
2 3 4 5
3 4 5 6
1 2 3
2 3 4
3 4 5
4 5 6

A 回答 (4件)

(「読み込み」部分についてのみのアドバイス)



#1補足>どのようにすればよいのでしょうか?

可変個のデータなので for文で回すのがよいかと。
下の2つの関数を、n, m を読み込んだ後で、呼び出して・・。


void DataInput( FILE *fp1, int a[][ COL ], int b[][ ROW ], int n, int m )
{
int i, j;

for( i = 0; i < n; i++ ){
for( j = 0; j < m; j++ ){

fscanf( fp1, "%d", &a[ i ][ j ] );
}
}
for( i = 0; i < m; i++ ){
for( j = 0; j < n; j++ ){

fscanf( fp1, "%d", &b[ i ][ j ] );
}
}
}
void DataCheck( int a[][ COL ], int b[][ ROW ], int n, int m )
{
int i, j;

for( i = 0; i < n; i++ ){
for( j = 0; j < m; j++ ){

printf( "%3d", a[ i ][ j ] );
}
printf( "\n" );
}
for( i = 0; i < m; i++ ){
for( j = 0; j < n; j++ ){

printf( "%3d", b[ i ][ j ] );
}
printf( "\n" );
}
}
    • good
    • 0
この回答へのお礼

無事できました!
ありがとうございました!

お礼日時:2013/06/24 17:08

> fscanf(fp1,"%d %d",&a[i][j],&b[i][j]);



このときの,i,jはどうなってますか?
この1行を追加しただけ、なら、「i,jを変えながら全部読み込む」なんて機能はありません。読み込むべきi,jを指定するようにしましょう。

あとデータは
3 4 ← A:3行4列、B:4行3列
1 2 3 4 ← Aの1行目
2 3 4 5 ← Aの2行目
3 4 5 6 ← Aの3行目
1 2 3 ← Bの1行目
2 3 4 ← Bの2行目
3 4 5 ← Bの3行目
4 5 6  ← Bの4行目
ということでしょうか?それだと、aを全部読み込み→bを全部読み込みとなるようにする必要があるため、 「fscanf(fp1,"%d %d",&a[i][j],&b[i][j]);」とはなりません。


void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m )
今回、ROW=COL=10なので問題にはなりませんが、ROWとCOLを間違えています。
main中の宣言を確認してください
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2013/06/24 17:10

正しく読み込めてるんですか?

    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2013/06/24 17:11

行列A,Bを読みこんでいる箇所が無いように見えるのですが

この回答への補足

fscanf(fp1,"%d %d",&a[i][j],&b[i][j]);
を入れてみてうまくいかなかったんですけど
どのようにすればよいのでしょうか?

補足日時:2013/06/20 23:58
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2013/06/24 17:11

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