ページ 11

c言語の読み込みについて

Posted: 2014年9月16日(火) 16:03
by hirorin
あるdatファイルに時間と振幅のデータが入っているんですが振幅のデータのみを2乗してから2乗したものに1/2乗し正のものだけから振幅の最大値を求め、振幅の最大値の2割に達した時間を出力したいのですが、振幅のデータのみを2乗して1/2乗し正のものだけから振幅の最大値を求めることができません。
サンプルプログラムを載せますのでおねがいします。
ちなみにdatファイルには
時間 振幅
時間 振幅

となっています。
#include <stdio.h>
int main(void) {
const char * fname = "C2.dat";
char line[BUFSIZ];
double amp, time,arrival, max=0,max20;
FILE *fp = fopen(fname, "r");
while (fgets(line, BUFSIZ, fp)) {
sscanf(line, "%lf%lf", &time, &amp);
if (amp > max) {
max = amp;
}
}
fclose(fp);
printf("max: %.7lf\n", max);

fp =fopen(fname,"r");
while (fgets(line, BUFSIZ, fp)){
sscanf(line, "%lf%lf" , &time, &amp);
if(amp > max*0.2){
arrival = time;
break;
}
}
fclose(fp);
printf("arrival:%.16lf\n",arrival);

return 0;
}

Re: c言語の読み込みについて

Posted: 2014年9月16日(火) 16:13
by Tatu
「振幅のデータを2乗してから2乗したものに1/2乗し、正のものだけを求める」
とはどういうことでしょうか?

振幅が3であるならばそのまま3
振幅が-5であるならば5にする

というようなことであれば

振幅の絶対値をとる
もしくは
振幅が負ならば-1をかけて正にする
というように表現できると思います。

Re: c言語の読み込みについて

Posted: 2014年9月16日(火) 16:14
by 初級者
こんなデータを使って
こんな結果を想定したが
実際にはこうなってしまう

というような
具体例があるといいなぁ
と思います。

Re: c言語の読み込みについて

Posted: 2014年9月17日(水) 00:48
by hirorin
振幅が3なら3
振幅がー5なら5といった感じです。
わざわざ2乗してから1/2乗せずに絶対値をとればよかったです。
ちなみに
#include <stdio.h>
int main(void) {
const char * fname = "C2rbc2(50,0)sq,almi00000.dat";
char line[BUFSIZ];
double amp, time,arrival, max=0,max20;
FILE *fp = fopen(fname, "r");
while (fgets(line, BUFSIZ, fp)) {
sscanf(line, "%lf%lf", &time, &amp);
if (abs(amp) > max) {
max = abs(amp);
}
}
fclose(fp);
printf("max: %.7lf\n", max);

fp =fopen(fname,"r");
while (fgets(line, BUFSIZ, fp)){
sscanf(line, "%lf%lf" , &time, &amp);
if(abs(amp) > max*0.2){
arrival = time;
break;
}
}
fclose(fp);
printf("arrival:%.16lf\n",arrival);

return 0;
}
といったように変更したのですが
最初にのせたプログラムでは
max:0.0781250
arrival:0.0000020749590000
とでたのですが
変更後は
max:0.0000000
arrival:2.794567789890…
といったようになってしまうのですがどこがおかしいんですか

Re: c言語の読み込みについて

Posted: 2014年9月17日(水) 01:40
by 初級者
だから、使ったデータは?

Re: c言語の読み込みについて

Posted: 2014年9月17日(水) 02:41
by hirorin
-0.000250000959 0.003125
-0.000249998959 0
-0.000249996959 0
-0.000249994959 0
-0.000249992959 -0.0015625
-0.000249990959 -0.0015625
-0.000249988959 0.0046875
-0.000249986959 -0.0015625
-0.000249984959 0.0015625
-0.000249982959 0.0015625
-0.000249980959 -0.0015625
-0.000249978959 0.003125
-0.000249976959 0
-0.000249974959 0
-0.000249972959 0
-0.000249970959 0.0015625
-0.000249968959 0.0015625
-0.000249966959 0
-0.000249964959 0.003125


と続くかんじのdatファイルです。
ちなみに
時間      振幅

です

Re: c言語の読み込みについて

Posted: 2014年9月17日(水) 07:49
by みけCAT
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

今回は実数を扱うので、abs関数(stdlib.h)ではなくfabs関数(math.h)または自作の絶対値を求める関数を利用するべきです。