質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3686閲覧

C言語 行列の乗算 ポインタの扱い

ISARIA

総合スコア19

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/04/11 07:04

編集2017/04/11 07:06

大学の課題です。コードを書いていて止まってしまったので助けてください。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

えーと...なんかとてつもない勘違いしてませんか?

ファイルポインタFILE*はファイルのナカミを差してるわけじゃありませんよ?
freadとかfgetsとかfscanfとかを使って読み出さねばなりません。
そこんとこがばっさり抜け落ちてます。

投稿2017/04/11 07:13

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2017/04/12 01:28

ありがとうございます!
guest

0

ベストアンサー

べた書きのCプログラムです

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#include<stdio.h> 9#include<stdlib.h> 10 11//計算処理を行う関数 12void operation(FILE* ifp1, FILE*ifp2, FILE* ofp) 13{ 14 int mat_a[3][2]; //matlix A 15 int mat_b[2][4]; //matlix B 16 int i; 17 18 if((ifp1==NULL)||(ifp2==NULL)||(ofp==NULL)) //ファイルポインタのエラー処理 19 { 20 fprintf(stderr,"[Error]null file pointer detecter.\n"); 21 exit(-1); 22 } 23 /* 24 ifp1の内容をint型に書き換え 25 */ 26 for(i=0; i<3; i++) fscanf(ifp1,"%d,%d",&mat_a[i][0],&mat_a[i][1] ); 27 /* 28 ifp2の内容をint型に書き換え 29 */ 30 for(i=0; i<2; i++) fscanf(ifp2,"%d,%d,%d,%d",&mat_b[i][0],&mat_b[i][1],&mat_b[i][2],&mat_b[i][3] ); 31 32 /* 33 行列の計算 34 */ 35 fprintf(ofp,"%d,%d,%d,%d\n",mat_a[0][0]*mat_b[0][0]+mat_a[0][1]*mat_b[1][0], 36 mat_a[0][0]*mat_b[0][1]+mat_a[0][1]*mat_b[1][1], 37 mat_a[0][0]*mat_b[0][2]+mat_a[0][1]*mat_b[1][2], 38 mat_a[0][0]*mat_b[0][3]+mat_a[0][1]*mat_b[1][3]); 39 fprintf(ofp,"%d,%d,%d,%d\n",mat_a[1][0]*mat_b[0][0]+mat_a[1][1]*mat_b[1][0], 40 mat_a[1][0]*mat_b[0][1]+mat_a[1][1]*mat_b[1][1], 41 mat_a[1][0]*mat_b[0][2]+mat_a[1][1]*mat_b[1][2], 42 mat_a[1][0]*mat_b[0][3]+mat_a[1][1]*mat_b[1][3]); 43 fprintf(ofp,"%d,%d,%d,%d\n",mat_a[2][0]*mat_b[0][0]+mat_a[2][1]*mat_b[1][0], 44 mat_a[2][0]*mat_b[0][1]+mat_a[2][1]*mat_b[1][1], 45 mat_a[2][0]*mat_b[0][2]+mat_a[2][1]*mat_b[1][2], 46 mat_a[2][0]*mat_b[0][3]+mat_a[2][1]*mat_b[1][3]); 47} 48 49int main(int argc, char* argv[]) 50{ 51 FILE* ifp1 = NULL; //入力用ファイルポインタ 52 FILE* ifp2 = NULL; //入力用ファイルポインタ 53 FILE* ofp = NULL; //出力用ファイルポインタ 54 char* ifile1 = NULL; //入力ファイル名 55 char* ifile2 = NULL; //入力ファイル名 56 char* ofile = NULL; //出力ファイル名 57 58 if(argc!=4) //実行時引数が3個なかったらエラーとする 59 { 60 fprintf(stderr,"usage: %s inputfile outputfile\n", argv[0]); 61 exit(1); 62 } 63 64 printf(" %s, %s を読み込みました\n", argv[1],argv[2]); 65 printf(" %s に出力します。\n", argv[3]); 66 67 ifile1 = argv[1]; //パラメータの1番目を入力ファイル名 68 ifile2 = argv[2]; //パラメータの2番目を入力ファイル名 69 ofile = argv[3]; //パラメータの2番目を入力ファイル名 70 71 if((ifp1 = fopen(ifile1,"rt"))==NULL) //入力ファイルを開く(rt:読み取り用に) 72 { 73 fprintf(stderr,"Can't open file %s\a\n", ifile1); //開けなかったら終了 74 exit(2); 75 } 76 77 if((ifp2 = fopen(ifile2,"rt"))==NULL) //入力ファイルを開く(rt:読み取り用に) 78 { 79 fprintf(stderr,"Can't open file %s\a\n", ifile2); //開けなかったら終了 80 exit(2); 81 } 82 83 if((ofp = fopen(ofile,"wt"))==NULL) //出力ファイルを開く(wt:書き込み用に) 84 { 85 fprintf(stderr,"Can't open file %s\a\n", ofile); //開けなかったら終了 86 exit(3); 87 } 88 89 operation(ifp1,ifp2,ofp); //計算処理関数呼び出し 90 91 fclose(ofp); //ファイル名を閉じる 92 fclose(ifp1); //ファイル名を閉じる 93 fclose(ifp2); //ファイル名を閉じる 94 95 return(0); 96}

投稿2017/04/11 09:05

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2017/04/12 01:32

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

0

こんにちは。

テキスト・ファイルの読み込みと出力ができないで困っているようですね。
とりあえず、3x2行列のcsvファイルを読み込んで表示するサンプルです。

出力先をstd::ofstreamにすることでファイルへ出力できます。

C++

1#include <iostream> 2#include <fstream> 3 4int main(int argc, char* argv[]) 5{ 6 if (argc < 2) 7return 1; 8 9 double matrix0[3][2]; 10 11 std::ifstream ifs(argv[1]); 12 for (int i=0; i < 3; ++i) 13 { 14 for (int j=0; j < 2; ++j) 15 { 16 if (j != 0) 17 { 18 ifs.ignore(256, ','); 19 } 20 ifs >> matrix0[i][j]; 21 } 22 } 23 24 for (int i=0; i < 3; ++i) 25 { 26 for (int j=0; j < 2; ++j) 27 { 28 std::cout << matrix0[i][j] << " "; 29 } 30 std::cout << "\n"; 31 } 32 33 return 0; 34}

csvファイル

csv

11.1, 1.2 22.1, 2.2 33.1, 3.2

実行結果

text

11.1 1.2 22.1 2.2 33.1 3.2

投稿2017/04/11 07:52

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2017/04/12 01:34

丁寧な説明をありがとうございました。m(_)m
guest

0

ファイルの読み込み処理には、fread/fgets/fscanfなどいくつかありますが、今回の場合ではフォーマットが決まっていて汎用的な処理は不要と思われるので、fscanfによる実装で良いと思います。
課題ということなのでコードまでは書きませんが、下記サイトなどを参考にしてみてください。
http://www.c-tipsref.com/reference/stdio/fscanf.html

別フォルダへの格納というものの方法を教えていただきたいと思います。

これは既に起動時の第三パラメーターに出力先を指定するようになっているので、今のままで出来ていると思います。

投稿2017/04/11 07:15

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2017/04/12 01:27

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問