複数ファイルの平均値

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
べけん
記事: 21
登録日時: 7ヶ月前

複数ファイルの平均値

#1

投稿記事 by べけん » 7ヶ月前

一つのファイルごとに564個の数値が出力されていてこの564個の平均を26ファイル全てで計算しファイルごとの平均値をテキストに出力するというプログラムを組みましたがうまくいきません。
どこが間違っているかご指摘願いたいと思います。

コード:


#include<stdio.h>
double average(double *a,int n)
{
	int i;
	double sum=0;
	double heikin;
	
	for(i=0;i<n;i++){
		sum=sum+a[i];
	}
	
	heikin=sum/n;

	return heikin;
}

void main()
{
	int i,j,k,n=0;
	double a[564];	/*配列を定義する*/
	FILE *fp_in;	/*0:ファイルポインタの宣言(ファイルを扱う場合には,この宣言は必ず必要!)*/
	FILE*fp_out;
	char filepath[256];
	
	
	for(j = 1; j < 27; j++){
		sprintf(filepath,"a%d.txt",j);
		
	fp_in=fopen(filepath,"r");	/*1:ファイルを読み込み専用で開く*/
	if(fp_in==NULL){		/*1:エラーチェック
		printf("ファイルがありませんでした.?n");
		return;	/*1:プログラムの強制終了*/
	}
	fp_out=fopen("aa1.txt","w");
	if(fp_out==NULL){
		printf("ファイルがありません\n");
		return;
	}
	
	for(i=0;i<564;i++){	/*繰り返し*/							
		fscanf(fp_in,"%le",&a[i]);	/*2:ファイルからデータをスキャンし,配列に格納する.*/
		n++;	/*カウント*/
	}
		
		k = 10 * j + 40;

	printf("%d %le\n",k,average(a,n));	/*関数に命令を与え,結果を画面に表示する*/
	fprintf(fp_out,"%d %le\n", k, average(a,n));
	fclose(fp_in);	/*3:ファイルを閉じる(これを忘れると,ファイルが開いたままになる.)*/
	}
		fclose(fp_out);
	
	
}


アバター
usao
記事: 1564
登録日時: 6年前

Re: 複数ファイルの平均値

#2

投稿記事 by usao » 7ヶ月前

結果出力用のファイルに関して,どのタイミングで何回オープンすれば良いと考えていますか?
オフトピック
この質問に限らず,プログラムに関して質問を行う多くの人間が
単に「うまくいきません」とだけ書いて発生している{問題,現象,etc}を意図的にぼかす,
この行動は一体何なのだろう?

べけん
記事: 21
登録日時: 7ヶ月前

Re: 複数ファイルの平均値

#3

投稿記事 by べけん » 7ヶ月前

最初に一回オープンすればよいと考えました。
なので結果出力を最初に書いて以降をfor文でまとめましたが結果が出力されませんでした。

アバター
usao
記事: 1564
登録日時: 6年前

Re: 複数ファイルの平均値

#4

投稿記事 by usao » 7ヶ月前

とりあえず提示されたコードでは

コード:

fp_out=fopen("aa1.txt","w");
この行が何度も処理されるように見えるので,

> 最初に一回オープンすればよいと考えました。

という考えと矛盾していませんか?

べけん
記事: 21
登録日時: 7ヶ月前

Re: 複数ファイルの平均値

#5

投稿記事 by べけん » 7ヶ月前

書き直したのがこちらです.
このように変えても2つ目以降の処理が行われませんでした。

コード:


#include<stdio.h>
#include<stdlib.h>
double average(double *a,int n)
{
	int i;
	double sum=0;
	double heikin;
	
	for(i=0;i<n;i++){
		sum=sum+a[i];
	}
	
	heikin=sum/n;

	return heikin;
}

void main()
{
	int i,j,k,n=0;
	double a[564];	/*配列を定義する*/
	FILE *fp_in;	/*0:ファイルポインタの宣言(ファイルを扱う場合には,この宣言は必ず必要!)*/
	FILE*fp_out;
	char filepath[256];
	
	fp_out=fopen("aa1.txt","w");
	if(fp_out==NULL){
		printf("ファイルがありません\n");
		return;
	}
	for(j = 1; j < 27; j++){
		sprintf(filepath,"a%d.txt",j);
		
		
	fp_in=fopen(filepath,"r");	/*1:ファイルを読み込み専用で開く*/
	if(fp_in==NULL){		//*1:エラーチェック
		printf("ファイルがありませんでした.\n");
		return;	/*1:プログラムの強制終了*/
	}
		printf("%d\n",j);
	
	for(i=0;i<564;i++){	/*繰り返し*/							
		fscanf(fp_in,"%le",&a[i]);	/*2:ファイルからデータをスキャンし,配列に格納する.*/
		n++;	/*カウント*/
	}
		
	
		k = 10 * j + 40;
	printf("%d",j);
	printf("%d %le\n",k,average(a,n));	/*関数に命令を与え,結果を画面に表示する*/
	fprintf(fp_out,"%d %le\n", k, average(a,n));
	fclose(fp_in);	/*3:ファイルを閉じる(これを忘れると,ファイルが開いたままになる.)*/
	}
		fclose(fp_out);
	
	
}


Math

Re: 複数ファイルの平均値

#6

投稿記事 by Math » 7ヶ月前

一度に ”564個の平均を26ファイル” 考えると 頭が混乱するので
2個 2ファイル で考えれば十分だよね。

Windows10、CX-Builder 10.3( Borland C [BCC55] 後継 ) 使用

main.c

コード:

#include<stdio.h>
double average(double *a,int n)
{
	int i;
	double sum=0;
	double heikin;
	
	for(i=0;i<n;i++){
		sum=sum+a[i];
	}
	
	heikin=sum/n;
	
	printf("\n sum=%le n=%d heikin=%le \n",sum,n,heikin); /* calc. check */

	return heikin;
}

void main()
{
	int i,j,k,n=2; /*  テストは n=2  本番では  n=564  */
	double a[564];	/*配列を定義する*/
	FILE *fp_in;	/*0:ファイルポインタの宣言(ファイルを扱う場合には,この宣言は必ず必要!)*/
	FILE *fp_out;
	char filepath[256];

	fp_out=fopen("aa1.txt","w");

double Hei_kin;

	if(fp_out==NULL){
		printf("ファイルがありません\n");
		return;
	}
	
	
	printf("------------------------------------------------------------------------------------");	
	for(j = 1; j <= 2; j++){
		sprintf(filepath,"a%d.txt",j);

	printf("\n%s\n",filepath); /* file name check */ 
	
		
	fp_in=fopen(filepath,"r");	/*1:ファイルを読み込み専用で開く*/

	if(fp_in==NULL){		/*1:エラーチェック*/
		printf("ファイルがありませんでした.%\n");
		return;	/*1:プログラムの強制終了*/
	}

	
	for(i=0;i<n;i++){							
		fscanf(fp_in,"%le",&a[i]);	/*2:ファイルからデータをスキャンし,配列に格納する.*/
	
	}
		
		k = 10 * j + 40; /* ??? わかんない(^^; */

Hei_kin=average(a,n);

	printf("%d %le\n",k,Hei_kin);	/*関数に命令を与え,結果を画面に表示する*/
	fprintf(fp_out,"%d %le\n", k, Hei_kin);
	fclose(fp_in);	/*3:ファイルを閉じる(これを忘れると,ファイルが開いたままになる.)*/
	}
	printf("------------------------------------------------------------------------------------");
	
	fclose(fp_out);
	
	
}

cx.bat

コード:

"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32" main.cpp

dir main.exe

main.exe

pause
実行する。
http://www2.koyoen.birdview.co.jp/~abcx ... -11-h-.PNG

アバター
usao
記事: 1564
登録日時: 6年前

Re: 複数ファイルの平均値

#7

投稿記事 by usao » 7ヶ月前

n=0;
を26回回るforブロック内の先頭にでも入れたらどうでしょう.
(というか,「564個」って決まってるならば,数える必要性自体が無いような…?)

べけん
記事: 21
登録日時: 7ヶ月前

Re: 複数ファイルの平均値

#8

投稿記事 by べけん » 7ヶ月前

うまくいきました!
ありがとうございます。
コードのミスとしてはaverage(a,n)の定義の仕方がよくないというところですか?

Math

Re: 複数ファイルの平均値

#9

投稿記事 by Math » 7ヶ月前

そうではありません

前の状態では 関数が ”2回” 呼ばれてしまいますよ(^^;

Math

Re: 複数ファイルの平均値

#10

投稿記事 by Math » 7ヶ月前

2回呼ばれても動作は正常で無駄なだけです。

おかしい原因は 関数を呼ぶときの n とかですね。(n++でおかしくなる)
printf で値を確認するとすぐわかりますよ。

返信

“C言語何でも質問掲示板” へ戻る