dポイントプレゼントキャンペーン実施中!

プログラミング初心者です。
csvファイルに書き込まれた4000個のデータを読み取って自己相関関数を計算し、csvファイルに出力するプログラムを本などを参考にしながらC言語で書いたのですが、出力がうまくいきません。
何故か読み込んだデータがそのまま結果として出力されてしまいます。
どこがおかしいのか教えていただければ幸いです。

ソースコード

//ヘッダファイル読み込み
#include <stdio.h>
#include <stdlib.h>

//記号定数定義
#define BUFSIZE 256 //入力バッファ領域
#define DATASIZE 4000 //データ配列の大きさ、ファイルの最大行数

//関数プロトタイプ宣言
int getdouble(FILE *fp,int *data);//ファイルからの読み取り
FILE *openfile(int c,char **v);//ファイルオープン
int readfile(double aryofdata[],FILE *fp);//ファイル読み込み
void acf(double aryofdata[],int numofdata);//自己相関の計算と出力
void printrtau(double aryofdata[],int n,int tau);//tauに対応する値の出力と計算

//プログラム本体
int main(int argc,char **argv)
{
double aryofdata[DATASIZE];//処理対象データ
int numofdata;//データ個数//(ファイルの行数)
FILE *fp;//ファイルポインタ
fp = openfile(argc,argv);//ファイルオープン
numofdata = readfile(aryofdata,fp);//ファイル読み込み
acf(aryofdata,numofdata);//自己相関の計算と出力

return 0;
}

//自己相関の計算と出力
void acf(double aryofdata[],int numofdata)
{
int n;//時間間隔tauの最大値
int tau;//時間間隔tau

n = numofdata/2 ;//nの決定

for(tau=0;tau<=n;++tau){
printrtau(aryofdata,n,tau);
}
}

void printrtau(double aryofdata[],int n,int tau)
{
int t;
double r=0.0;
for(t=0;t<n;++t){
r+= aryofdata[t]*aryofdata[t+tau];
}
printf("%lf\n",r/n);
}


FILE *openfile(int c,char **v)
{
FILE *fp;
if(c != 2){
fprintf(stderr,"USAGE\n");
fprintf(stderr,"jikosoukan [file name]\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(v[1], "r")) == NULL) {
fprintf(stderr, "file can't open, %s\n", v[1]);
exit(EXIT_FAILURE);
}
return fp;
}

int readfile(double aryofdata[],FILE *fp)
{
double inputdata;
int i=0;
while( (fscanf(fp,"%lf",&inputdata)!= EOF)
&& (i<DATASIZE)){
aryofdata[i] = inputdata ;
++i ;
}
//csv出力//
fp= fopen("kekka.csv", "w");
for(i=0;i<DATASIZE;i++){
fprintf(fp,"%lf\n",aryofdata[i]);
}
fclose(fp);
return i;
}

よろしくお願いします。

A 回答 (2件)

出力については、既に出ていますので。



ループ回数や範囲が違ってます。

> int readfile(double aryofdata[],FILE *fp)

>while( (fscanf(fp,"%lf",&inputdata)!= EOF)
のループでi を使って入力したデータ数を記録して
> return i;
で返す、ということをしているように思いますが、その間に
> for(i=0;i<DATASIZE;i++){
が入っているため、iには、ループ終了時の値(=DATASIZE)が常に返ります。
おそらく、今回は4000個のデータなので、DATASIZEが返っても気付かなかったのでしょう。


> void printrtau(double aryofdata[],int n,int tau)
この各引数はどんな意味で使っていますか?
プログラムの動作を追っていくと
printtau(aryofdata,2000,1)
が実行されます。このときの
> for(t=0;t<n;++t){
のループでどういう計算になるか、よく考えましょう。

また
https://ja.wikipedia.org/wiki/%E8%87%AA%E5%B7%B1 …
のR^(k)式と比べると、 μ=0,σ=1 となっていますが、入力するデータは既にそのようになっているのでしょうか?
    • good
    • 0

関数 readfile() の中で、



・データを読み込んで、
・配列に代入して
・そのまま結果のファイルに書いている

からです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!