プログラミング初心者です。
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件)
- 最新から表示
- 回答順に表示
No.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 となっていますが、入力するデータは既にそのようになっているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
C言語を用いて、csvファイル内...
-
ファイルに行番号を追加
-
C言語でのCSVソートとデータ抽...
-
急!【数列を正規化して縦横入...
-
fgets( ) の返り値は何?
-
ファイルへの書込み処理が異常...
-
エラーがわかりません、、
-
C言語でクロマキー合成をする方法
-
テキストファイル内に対して, ...
-
セグメンテーションエラーです
-
csvファイルの読み込みで失敗し...
-
fscanfでループしてしまう。
-
C言語 共用体の構造体の引数設定
-
数値のみ抽出(C言語)
-
VisualStudioでのファイルの入...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
ファイル出力で改行を入れたい!
-
エラーがわかりません、、
-
テキストファイル内に対して, ...
-
構造体のメンバにファイルポイ...
-
C言語にてXMLファイルから任意...
-
ガンマ変換 C言語でプログラ...
-
【C言語】ファイルを読み込んで...
-
日本語ファイル名のFTPについて
-
fscanfでループしてしまう。
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
VisualStudioでのファイルの入...
-
ファイルに行番号を追加
-
ファイルへの書込み処理が異常...
-
ファイルが読み込めない・・・
おすすめ情報