無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語初心者

無題

#1

投稿記事 by C言語初心者 » 16年前

入力に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;
}

これで宜しいのでしょうか?
申し訳ありませんが、よろしくお願いします。

kazuoni

Re:無題

#2

投稿記事 by kazuoni » 16年前

>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;
としているので、環境によってはコンパイルが通らないかと。

コードを載せる際は、規約通り、プレタグでかこってくださいね。

C言語初心者

Re:無題

#3

投稿記事 by C言語初心者 » 16年前

比類無きプログラマーさん、ご返信ありがとうございます。
プログラミングの本来の目的は、移動平均フィルタの作成です。
入力データは、筋電信号と脳波のデータを用いて行います。
mi=の計算式は、一般的な移動平均の計算式を使っています。
また、環境はUNIXでテキストエディタ、ターミナルにてコンパイルを行っています。
よろしくお願いします。

Tororo

Re:無題

#4

投稿記事 by Tororo » 16年前

私にはわかりませんが、
タイトルは無題より質問にあった題の方が
回答を得られやすいですよ
(こんな事知ってるよと言うことならすみませんm(_ _)m)

non

Re:無題

#5

投稿記事 by non » 16年前

>これで宜しいのでしょうか?
とありますが、何か不都合があるのでしょうか?
プログラムとしては、特に間違いがないと思いますけど。

kazuoni

Re:無題

#6

投稿記事 by kazuoni » 16年前

単純移動平均ってことですかね?
流れはよいと思います。
問題文には書かれていないのですが、
移動が0の時のデータを出力できてないのはいいのでしょうか?
(whileの条件で、データがなかったらループに入らない)

non

Re:無題

#7

投稿記事 by non » 16年前

>移動が0の時のデータを出力できてないのはいいのでしょうか?
forでN-1個しかデータを読んでないので、whileで最初の1個を読んでN個
となり、OKだと思いました。

kazuoni

Re:無題

#8

投稿記事 by kazuoni » 16年前

あ、そでした^^;
大変失礼しました。
N-1
を見落としていました。。

C言語初心者

Re:無題

#9

投稿記事 by C言語初心者 » 16年前

皆さん、解説ありがとうございます。
このプログラムでいいとすると、入力データが2つある場合には、どのように書けばよろしいのでしょうか?
このプログラムでは、1個のデータしか読み込んでいないので・・

non

Re:無題

#10

投稿記事 by non » 16年前

>入力データが2つある場合
ってことは、データ系列が2つということですか?
例えばファイルが
a0 b0
a1 b1
a2 b2
:
:
のようになっているということでしょうか?

C言語初心者

Re:無題

#11

投稿記事 by C言語初心者 » 16年前

nonさん、そのとおりです。
今回の課題では、入力データを2つ用いて行います!

non

Re:無題

#12

投稿記事 by non » 16年前

もしかしたら、前のプログラムは自分で組んだのではないということでしょうね。
それなら、そうと先に言ってくれればよかったのに。

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; 
}

C言語初心者

Re:無題

#13

投稿記事 by C言語初心者 » 16年前

nonさん、ありがとうございました。
とてもわかりやすかったです。 参考にさせていただきます!

閉鎖

“C言語何でも質問掲示板” へ戻る