ページ 1 / 1
無題
Posted: 2009年7月29日(水) 15:20
by C言語初心者
入力に2つのデータを用いて行います。
I番目の入力データをXi,出力される移動平均の値をmiとして
mi=1/NΣj=i-(n-1) i Xj
この場合のプログラミングについて分からないのでご指導よろしくお願いします。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main (void){
FILE *fp;
FILE *FP;
int i,t,N;
float S=0;
printf("N=");
scanf("%d",&N);
float x[N];
fp=fopen("input.dat","r");
FP=fopen("output.dat","w");
for(i=0;i<N-1;i++){
fscanf(fp,"%f",&x);
S=S+x;
}
while(fscanf(fp,"%f",&x[N-1])!=EOF){
S=S+x[N-1];
fprintf(FP,"%f\n",S/N);
S=S-x[0];
for(t=1;t<N;t++)
x[t-1]=x[t];
}
fclose(fp);
fclose(FP);
return 0;
}
これで宜しいのでしょうか?
申し訳ありませんが、よろしくお願いします。
Re:無題
Posted: 2009年7月29日(水) 17:58
by kazuoni
>mi=1/NΣj=i-(n-1) i Xj
この式の意味が理解できないのですが・・・
j なんて変数は条件文にないですし、
四則演算がどのような順序かも明白ではありません。
こんな感じですか?(恐らく違うかと思いますが・・・)
mi = 1/(NΣj) = i - (n-1) * i * Xi
また、入力ファイルにはどのような情報が格納されていてるのでしょうか?
一つのファイルに二種類のデータが格納されているということですか?
>for(i=0;i<N-1;i++){
>fscanf(fp,"%f",&x);
>S=S+x;
>}
では、N個の入力値を配列に格納し、その総和を求めているで分かりますが、
それ以降、何がしたいのかが良く分かりません。
あと環境も書いたほうがいいかと思います。
gccだとたしか、
int N;
...
int ary[N];
と出来なかたった気がします。
(誤りでしたらすみません。。)
また、main関数に戻り値の型がないのに対し、
return 0;
としているので、環境によってはコンパイルが通らないかと。
コードを載せる際は、規約通り、プレタグでかこってくださいね。
Re:無題
Posted: 2009年7月29日(水) 20:09
by C言語初心者
比類無きプログラマーさん、ご返信ありがとうございます。
プログラミングの本来の目的は、移動平均フィルタの作成です。
入力データは、筋電信号と脳波のデータを用いて行います。
mi=の計算式は、一般的な移動平均の計算式を使っています。
また、環境はUNIXでテキストエディタ、ターミナルにてコンパイルを行っています。
よろしくお願いします。
Re:無題
Posted: 2009年7月29日(水) 20:34
by Tororo
私にはわかりませんが、
タイトルは無題より質問にあった題の方が
回答を得られやすいですよ
(こんな事知ってるよと言うことならすみませんm(_ _)m)
Re:無題
Posted: 2009年7月29日(水) 21:36
by non
>これで宜しいのでしょうか?
とありますが、何か不都合があるのでしょうか?
プログラムとしては、特に間違いがないと思いますけど。
Re:無題
Posted: 2009年7月29日(水) 21:48
by kazuoni
単純移動平均ってことですかね?
流れはよいと思います。
問題文には書かれていないのですが、
移動が0の時のデータを出力できてないのはいいのでしょうか?
(whileの条件で、データがなかったらループに入らない)
Re:無題
Posted: 2009年7月29日(水) 21:54
by non
>移動が0の時のデータを出力できてないのはいいのでしょうか?
forでN-1個しかデータを読んでないので、whileで最初の1個を読んでN個
となり、OKだと思いました。
Re:無題
Posted: 2009年7月29日(水) 21:59
by kazuoni
あ、そでした^^;
大変失礼しました。
N-1
を見落としていました。。
Re:無題
Posted: 2009年7月29日(水) 22:14
by C言語初心者
皆さん、解説ありがとうございます。
このプログラムでいいとすると、入力データが2つある場合には、どのように書けばよろしいのでしょうか?
このプログラムでは、1個のデータしか読み込んでいないので・・
Re:無題
Posted: 2009年7月29日(水) 22:51
by non
>入力データが2つある場合
ってことは、データ系列が2つということですか?
例えばファイルが
a0 b0
a1 b1
a2 b2
:
:
のようになっているということでしょうか?
Re:無題
Posted: 2009年7月29日(水) 23:13
by C言語初心者
nonさん、そのとおりです。
今回の課題では、入力データを2つ用いて行います!
Re:無題
Posted: 2009年7月30日(木) 09:08
by non
もしかしたら、前のプログラムは自分で組んだのではないということでしょうね。
それなら、そうと先に言ってくれればよかったのに。
2組作ればいいだけではないでしょうか。
なお、下のプログラムは試していません。(gccがないので)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void){
FILE *fp;
FILE *FP;
int i,t,N;
float S1=0,S2=0;
printf("N=");
scanf("%d",&N);
float x[N],y[N];
fp=fopen("input.dat","r");
FP=fopen("output.dat","w");
for(i=0;i<N-1;i++){
fscanf(fp,"%f %f",&x,&y);
S1=S1+x;S2=S2+y;
}
while(fscanf(fp,"%f %f",&x[N-1],&y[N-1])!=EOF){
S1=S1+x[N-1];S2=S2+y[N-1];
fprintf(FP,"%f %f\n",S1/N,S2/N);
S1=S1-x[0];S2=S2-y[0];
for(t=1;t<N;t++){
x[t-1]=x[t]; y[t-1]=y[t];
}
}
fclose(fp);
fclose(FP);
return 0;
}
Re:無題
Posted: 2009年7月30日(木) 18:04
by C言語初心者
nonさん、ありがとうございました。
とてもわかりやすかったです。 参考にさせていただきます!