c言語についての質問です。あるdatファイルに振幅と時間のデータが保存されています。
このdatファイルを読み込み振幅の最大値を求めてから振幅の2割の値を求めます。
そこから再度読み込み振幅の2割を超える時間まで読み込み越えた際の時間を出力したいのですが上手くいきません。途中がけのプログラムをのせるのでお願いします。
datファイルには
時間 振幅
時間 振幅
…
のようになっています。
#include <stdio.h>
#include <math.h>
int main(void) {
const char * fname = "C1rbc1(50,0)sq,almi00001.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, &);
if (amp > max) {
max = amp;
max20=max*0.2;
}
}
fclose(fp);
printf("max: %.7lf\n", max);
printf("0,2*max:%.7lf\n",max20);
int main(void) {
FILE *fp =fopen(fname,"r");
while (fgets(line, BUFSIZ, fp)){
sscanf(line,"%lf%lf",&time,&);
if(amp>max20){
arrival=time;
break;
}
}
fclose(fp);
printf("arrival:%.7lf\n",arrival);
return 0;
}
}
No.4ベストアンサー
- 回答日時:
こんな感じ。
確認はしていません。
質問にあるプログラムと、ほとんど同じ(max20 は毎回確認せずに、max * 0.2 で計算していますが)なので、よく確認してください。
おそらく、いくつかの「例題」をそのまま引っ張ってきて、一本にしたのでしょう。
たとえば、
FILE *fp = fopen(fname, "r");
という、「決り文句」が2回(ファイルを2回スキャンする必要があるので)出てきますが、同じ関数の中で、これを二つ書くことはできません。(実は、書く方法もあります)
そこで、二番目の
FILE *fp = fopen(fname, "r");
のまえに、いつも書いている main() を持ってきたというのは何となくわかります。
エラーが出たときに、「なぜエラーなのか?」を理解せずに「とにかくエラーを消す」という方針で進むと、いずれ困ったことになります。
あと、プログラムの動作を記述する言葉の使い方にも慣れましょう。
> 振幅の2割を超える時間まで読み込み越えた際の時間を
振幅の最大値の2割を、始めて超えたときの時間 ですね。
-------------- form here ------------------------
#include <stdio.h>
int main(void)
{
const char * fname = "C1rbc1(50,0)sq,almi00001.dat";
char line[BUFSIZ];
double amp, time,arrival, max=0;
FILE *fp = fopen(fname, "r");
while (fgets(line, BUFSIZ, fp)) {
sscanf(line, "%lf%lf", &time, &);
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,&);
if(amp > max * 0.2){
arrival=time;
break;
}
}
fclose(fp);
printf("arrival:%.7lf\n",arrival);
return 0;
}
No.3
- 回答日時:
mainの中にmainがまたあったりしてよくわかりませんが、上手くいかないというのはどのようにうまくいかないのでしょうか。
そこら辺がわからないと何とも言えませんけど。1点気になったのは、値をdoubleで扱っている点です。
例えば、テキストデータが以下のようになっているとします。
時刻 振幅
1.0 2.0
1.1 2.1
1.2 10.5
振幅の最大は10.5です。ですから0.2を乗ずると2.1になりmax20には2.1が入ります。
そこで再度頭から比較していくと、時刻1.1の時にampとmax20が一致するはずです。
でも実際には一致しません。
それは0.2という値に原因があります。0.2を2進数で表現すると0.00110011001100110011…と無限に続きます。当然doubleという入れ物の長さは有限なので切り捨てることになります。そんな訳で、0.2とコーディングしても実際には(正確ではありませんが)1.9999998みたいな若干小さな値になってしまいます。そんな訳で一致するはずだけど一致しないといった問題が発生するかもしれません。
No.1
- 回答日時:
あなたのコードは関数定義以外を除くとこうなっています。
本当にこれでいいのかよく考えましょう。int main(void) {
int main(void) {
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
構造体のメンバにファイルポイ...
-
fscanfでループしてしまう。
-
テキストファイル内に対して, ...
-
エラーがわかりません、、
-
ファイルからCR/LFを除去したい
-
C言語を用いて、csvファイル内...
-
辞書順にソートしたいのですが...
-
C言語の課題です
-
C言語
-
_popen() のエラー取得
-
[C言語]2つのファイルを用いた...
-
ファイルが読み込めない・・・
-
ファイルに行番号を追加
-
main関数の中をスッキリさせたくて
-
ファイルへの書込み処理が異常...
-
fopenでファイル名に、変数を使...
-
乱数とファイルの入出力の質問...
-
test.csvの内容
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
ファイルへの書込み処理が異常...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
C言語にてXMLファイルから任意...
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
InternetReadFileを使ったファ...
-
【C言語】ファイルを読み込んで...
-
VisualStudioでのファイルの入...
-
commons-netでのFTP送信について
-
日本語ファイル名のFTPについて
-
fgets関数の利用 c言語
-
C言語でコマンドmvを実行
-
「コマンドライン引数チェック...
-
C言語でセグメンテーションエ...
-
構造体のメンバにファイルポイ...
-
エラー C2664
おすすめ情報