大学の課題です。コードを書いていて止まってしまったので助けてください。
3行2列の行列が格納されている.csvファイルと、2行4列の行列が格納されている.csvファイルがあり、コマンドライン引数を使って読み込み行列の乗算を行い、.その結果をcsvファイルとしてあらかじめ作った別フォルダに格納しろというものでした。
行列サイズは既知であるとしてプログラムを作成して構わないという指摘があったので、行列計算の中身は長ったらしいものの問題なく作れたとは思っているのですが、読み込んだファイルの中身を使う方法がわからなくなっています。
また、別フォルダへの格納というものの方法を教えていただきたいと思います。
よろしくお願いいたします。
以下が現在の状態です。/行列の計算/の中身はforを使って書き直しています。
C言語
1/* 2 a_mat.csv には3行2列の行列 A を表すデータ列が格納されており、 3 b_mat.csv には2行4列の行列 B を表すデータ列が格納されている。 4 行列の乗算 A * B を行い、結果を output_mat.csv として出力するプログラムを作成せよ。 5 また、output_mat.csv はex1のフォルダに新たにoutputというディレクトリをあらかじめ手動で作成しておき、 6 そこのディレクトリ内に出力するプログラムを作成すること。 7*/ 8 9#include<stdio.h> 10#include<stdlib.h> 11 12//計算処理を行う関数 13void operation(FILE* ifp1, FILE*ifp2, FILE* ofp) 14{ 15 //int mat_c[3][4] = ofp; //答えの方 16 const int mat_a_r = 3; //aの行列の行数(横列) 17 const int mat_a_c = 2; //aの行列の列数(縦列) 18 const int mat_b_r = 2; //bの行列の行数(横列) 19 const int mat_b_c = 4; //bの行列の列数(縦列) 20 float a; 21 float b; 22 23 if((ifp1==NULL)||(ifp2==NULL)||(ofp==NULL)) //ファイルポインタのエラー処理 24 { 25 fprintf(stderr,"[Error]null file pointer detecter.\n"); 26 exit(-1); 27 } 28 29 /* 30 ifp1の内容をint型に書き換え 31 */ 32 const int mat_a[3][2] = {*(ifp1),*(ifp1+1), 33 *(ifp1+2),*(ifp1+3), 34 *(ifp1+4),*(ifp1+5)}; 35 /* 36 ifp2の内容をint型に書き換え 37 */ 38 const int mat_b[2][4] = {*(ifp2),*(ifp2+1),*(ifp2+2), 39 *(ifp2+3),*(ifp2+4),*(ifp2+5)}; 40 41 /* 42 行列の計算 43 */ 44 fprintf(ofp,"mat_a[0][0]*mat_b[0][0]+mat_a[0][1]*mat_b[1][0], mat_a[0][0]*mat_b[0][1]+mat_a[0][1]*mat_b[1][1], mat_a[0][0]*mat_b[2][0]+mat_a[0][1]*mat_b[2][1], mat_a[0][0]*mat_b[3][0]+mat_a[0][1]*mat_b[3][1]\n"); 45 fprintf(ofp,"mat_a[1][0]*mat_b[0][0]+mat_a[1][1]*mat_b[1][0], mat_a[1][0]*mat_b[0][1]+mat_a[1][1]*mat_b[1][1], mat_a[1][0]*mat_b[2][0]+mat_a[1][1]*mat_b[2][1], mat_a[1][0]*mat_b[3][0]+mat_a[1][1]*mat_b[3][1]\n"); 46 fprintf(ofp,"mat_a[2][0]*mat_b[0][0]+mat_a[2][1]*mat_b[1][0], mat_a[2][0]*mat_b[0][1]+mat_a[2][1]*mat_b[1][1], mat_a[2][0]*mat_b[2][0]+mat_a[2][1]*mat_b[2][1], mat_a[2][0]*mat_b[3][0]+mat_a[2][1]*mat_b[3][1]\n"); 47 48} 49 50int main(int argc, char* argv[]) 51{ 52 FILE* ifp1 = NULL; //入力用ファイルポインタ 53 FILE* ifp2 = NULL; //入力用ファイルポインタ 54 FILE* ofp = NULL; //出力用ファイルポインタ 55 char* ifile1 = NULL; //入力ファイル名 56 char* ifile2 = NULL; //入力ファイル名 57 char* ofile = NULL; //出力ファイル名 58 59 if(argc!=4) //実行時引数が3個なかったらエラーとする 60 { 61 fprintf(stderr,"usage: %s inputfile outputfile\n", argv[0]); 62 exit(1); 63 } 64 65 printf(" %s, %s を読み込みました\n", argv[1],argv[2]); 66 printf(" %s に出力します。\n", argv[3]); 67 68 ifile1 = argv[1]; //パラメータの1番目を入力ファイル名 69 ifile2 = argv[2]; //パラメータの2番目を入力ファイル名 70 ofile = argv[3]; //パラメータの2番目を入力ファイル名 71 72 if((ifp1 = fopen(ifile1,"rt"))==NULL) //入力ファイルを開く(rt:読み取り用に) 73 { 74 fprintf(stderr,"Can't open file %s\a\n", ifile1); //開けなかったら終了 75 exit(2); 76 } 77 78 if((ifp2 = fopen(ifile2,"rt"))==NULL) //入力ファイルを開く(rt:読み取り用に) 79 { 80 fprintf(stderr,"Can't open file %s\a\n", ifile2); //開けなかったら終了 81 exit(2); 82 } 83 84 if((ofp = fopen(ofile,"wt"))==NULL) //出力ファイルを開く(wt:書き込み用に) 85 { 86 fprintf(stderr,"Can't open file %s\a\n", ofile); //開けなかったら終了 87 exit(3); 88 } 89 90 operation(ifp1,ifp2,ofp); //計算処理関数呼び出し 91 92 fclose(ofp); //ファイル名を閉じる 93 fclose(ifp1); //ファイル名を閉じる 94 fclose(ifp2); //ファイル名を閉じる 95 96 return(0); 97} 98 99
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/12 01:28