こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の計算についての質問です.

C言語の計算についての質問です.
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
というようなファイルを行ごとに読み込んで、列ごとの和を算出させたいと考えています.

以下のようなプログラムをテスト作成してみたのですが,『 b=1のときのa[1] + b=2のときのa[1] 』のような計算ができません.
どのようなプログラムを作成すればこの問題が解決できるか教えてください.

#include <stdio.h>
#include <string.h>

int main(void)
{
FILE *fp;
int i, j, k, no, b;
double a[12];
double c[3];
char buffer[1024];

for(i=1; i<=2; i++)
{
sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10);
printf("%s \n", buffer);

fp = fopen(buffer,"r");

for(b=1; b<=12; b++)
{
fscanf(fp, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[9], &a[10], &a[11], &a[12]);
printf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[9], a[10], a[11], a[12]);
}

for(b=0; b<=2; b++){
c[3]=a[b] + a[b+1];

printf("%lf", c[3]);
putchar('\n');
}




fclose(fp);
}

return (0);
}

投稿日時 - 2010-06-30 22:27:31

QNo.6006770

すぐに回答ほしいです

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

質問とは直接関係ありませんが、
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[]に、列ごとの合計を格納できるでしょう。

投稿日時 - 2010-07-01 09:10:20

補足

配列に関する指摘ありがとうございました。
変数名ですがわかりやすい名前に変えることにしました。

もうひとつわからない点があります。

12345
23456
34567
というファイルがいくつもあった時に91個のファイルの一行一列目の数値の平均,二行一列目の数値の平均…を出力させるにはどのような構文を用いればよいですか?

一から聞いてしまい申し訳ありません。

投稿日時 - 2010-07-01 14:15:27

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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() ;
} ;

として各位置の合計を求めます。
あとは、各位置ごとに平均を求めればよい。

投稿日時 - 2010-07-01 15:39:06

補足

ようやくここまで来ました。
ありがとうございます。
全ファイルの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);
}

投稿日時 - 2010-07-01 18:23:23

ANo.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]という領域は配列の定義範囲外であることを
理解されていますか?

投稿日時 - 2010-06-30 23:13:37

あなたにオススメの質問