ページ 1 / 1
複数ファイルの平均値
Posted: 2019年3月11日(月) 11:42
by べけん
一つのファイルごとに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);
}
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 13:36
by usao
結果出力用のファイルに関して,どのタイミングで何回オープンすれば良いと考えていますか?
オフトピック
この質問に限らず,プログラムに関して質問を行う多くの人間が
単に「うまくいきません」とだけ書いて発生している{問題,現象,etc}を意図的にぼかす,
この行動は一体何なのだろう?
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 13:49
by べけん
最初に一回オープンすればよいと考えました。
なので結果出力を最初に書いて以降をfor文でまとめましたが結果が出力されませんでした。
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 15:31
by usao
とりあえず提示されたコードでは
コード:
fp_out=fopen("aa1.txt","w");
この行が何度も処理されるように見えるので,
> 最初に一回オープンすればよいと考えました。
という考えと矛盾していませんか?
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 15:43
by べけん
書き直したのがこちらです.
このように変えても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);
}
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 15:49
by Math
一度に ”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
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 16:02
by usao
n=0;
を26回回るforブロック内の先頭にでも入れたらどうでしょう.
(というか,「564個」って決まってるならば,数える必要性自体が無いような…?)
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 16:08
by べけん
うまくいきました!
ありがとうございます。
コードのミスとしてはaverage(a,n)の定義の仕方がよくないというところですか?
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 16:19
by Math
そうではありません
前の状態では 関数が ”2回” 呼ばれてしまいますよ(^^;
Re: 複数ファイルの平均値
Posted: 2019年3月11日(月) 18:50
by Math
2回呼ばれても動作は正常で無駄なだけです。
おかしい原因は 関数を呼ぶときの n とかですね。(n++でおかしくなる)
printf で値を確認するとすぐわかりますよ。