• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の計算についての質問です.)

C言語の行列の列ごとの和を計算する方法について

このQ&Aのポイント
  • C言語で行列の列ごとの和を算出する方法について教えてください。
  • テスト作成したプログラムでは正しく計算できていないようです。どのようなプログラムを作成すれば問題が解決できるでしょうか。
  • プログラムではファイルからデータを読み取り、列ごとの和を算出する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

質問とは直接関係ありませんが、 double a[12] ; と定義された配列でアクセスできる添え字の範囲は a[0] - a[11] です。 意図的にa[0]は使わず、添え字として1-12を使いたいのであれば、 double a[13] ; としなければいけません。 ------------------------------- 変数名が、a, b, cとなっています。 悪くはありませんが、その変数の内容を表す変数名にしたほうが、 プログラムを考えるときに楽ですよ。 aは列の値 bは行番号ですね。 私なら、cの代わりに、 double column_total[13] ; を定義します。 memset(column_total, 0, sizeof(column_total)) ; for (lineno = 1 ; lineno <= 12 ; lineno++) {   fscanf(fp, "", &column_value[1], &column_value[2], ... &column_value[12]) ;   printf("", &column_value[1], &column_value[2], ... &column_value[12]) ;   for (int col = 1 ; col <= 12 ; col++)   {     column_total[col] += column_value[col] ;   } }; とすれば、column_total[]に、列ごとの合計を格納できるでしょう。

lovefairy
質問者

補足

配列に関する指摘ありがとうございました。 変数名ですがわかりやすい名前に変えることにしました。 もうひとつわからない点があります。 12345 23456 34567 というファイルがいくつもあった時に91個のファイルの一行一列目の数値の平均,二行一列目の数値の平均…を出力させるにはどのような構文を用いればよいですか? 一から聞いてしまい申し訳ありません。

その他の回答 (2)

回答No.3

> 12345 > 23456 > 34567 >というファイルがいくつもあった時に91個のファイルの一行一列目の数値の平均,二行一列目の数値の平均…を>出力させるにはどのような構文を用いればよいですか? ファイルを1回読むだけで済ませようと思ったら、各場所の合計を表す変数を用意してやるしかありません。 各ファイルに、必ず、3行×5列の数字が入っているのなら、たとえば double totals[91][3][5] ; [ファイルインデックス0-90][行インデックス0-2][列インデックス0-4] という変数を用意します。 memset(totals, 0, sizeof(totals)) ; for (int fileno = 0 ; fileno < 91 ; fileno++) {   // ファイルを開く   fopen() ;   for (int row = 0 ; row < 3 ; row++)   {     // 1行スキャン(5列分取得)     fscanf(fp, "", &column_value[0], &column_value[1], ... &column_value[4]) ;     // 列ごとに合計を更新     for (int col = 0 ; col < 5 ; col++)     {       totals[fileno][row][col] += column_value[col] ;     }   }   // ファイルを閉じる   fclose() ; } ; として各位置の合計を求めます。 あとは、各位置ごとに平均を求めればよい。

lovefairy
質問者

補足

ようやくここまで来ました。 ありがとうございます。 全ファイルの1行×1列の数値の合計の計算はできました。if文を用いてjudge=0の時にのみ数値を採用するようにしたのですが,if文を使う前は合計が計算できたのにif文を使った途端0.0000と計算されるようになってしましました。 なにが原因なのか全くわかりません。 申し訳ありませんがよろしくお願いします。 #include <stdio.h> #include <string.h> int main(void) { FILE *fp; int i, j, k, no, b, col, xp, yp, x, y, judge, fn; double a[6]; double u, v; float umean[54][41]={0}; char buffer[1024]; xp=54; yp=41; fn=91; for(i=1; i<=fn; i++) { sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10); /*printf("%s \n", buffer);*/ fp = fopen(buffer,"r"); for(col=1; col<=(xp+1)*(yp+1); col++) { fscanf(fp, "%d%d%lf%lf%lf%lf%lf%lf%lf%lf%lf%d", &x, &y, &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &u, &v, &a[6], &judge); /*printf("%d%d%lf%lf%d \n\n", x, y, u, v, judge);*/ if(judge == 0) { umean[x][y] += u;break; } } fclose(fp); } printf("%lf", umean[1][1]); return (0); }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>1 2 3 4 5 6 >2 3 4 5 6 7 >3 4 5 6 7 8 というようなファイル このファイルフォーマットと >double a[12]; >double c[3]; この変数定義がどうもしっくりきません。 「というような」と書かれているのは、「あくまで例」という意味でしょうか? また、 >double a[12]; >double c[3]; という配列定義では、使える範囲はa[0]~a[11]とc[0]~c[2]であって、 a[12]やc[3]という領域は配列の定義範囲外であることを 理解されていますか?

関連するQ&A