質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Q&A

2回答

15077閲覧

移動平均法 C言語

yp33ahgr

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

0グッド

0クリップ

投稿2017/01/06 10:57

編集2017/01/06 13:57

###前提・実現したいこと

初心者です。
C言語でCSVファイルを読み込み、移動平均法で値を抽出し、また別のCSVファイルに出力するという処理を行いたいのですが、データ処移動平均法を用いて値を抽出する部分が思いつかず困っています。


測定値 処理
2 (2+5+7)/3
5 (5+7+5)/3
7 (7+5+4)/3
5 …
4

上記のように移動平均法を用いて値を抽出するプログラムを教えて頂きたいです。

ファイルの入出力の部分は下記のようになっています。
#include <stdio.h>

int main(void){
FILE *fp;
double data[1000][2];
int i=0,num,ret;

fp=fopen("data.csv","r");
if( fp == NULL ) {
printf( "file none\n" );
return -1;
}

while( ret = fscanf(fp,"%lf,%lf",&data[i][0],&data[i][1]) != EOF){
i++;
}

num=i;
for(i=0;i<num; i++){
printf("%.1f,%.1f\n",data[i][0],data[i][1]);
}

fclose(fp);

fp=fopen("kekka.csv","w");
for(i=0;i<num; i++){
fprintf(fp,"%f,%f\n",data[i][0],data[i][1]);
}
fclose(fp);
return 0;
}

もしお力添えを頂ける方がいらっしゃいましたらどうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/01/06 11:26 編集

今どこの段階ですか? やりたいことはどう分解できて、何が出来て何が出来ませんか? excel使わない理由はありますか?
yuba

2017/01/06 12:00

例示されている処理は移動平均ではありません。移動平均は過去n回の値の平均ですが、例示の処理は未来の値を平均しています。もちろん、未来の値をプログラムが扱えるわけもなく、それで計算できずにいると言えます。例示の処理は正しいか確認してください。
yp33ahgr

2017/01/06 14:05

ozwk様>ご指摘頂きありがとうございます。質問を編集しました。現在データの入出力の処理の部分までは分かっている状況です。課題で指定されているためexcelを使っていません。
guest

回答2

0

移動平均は、アナログ信号の取り込み等でノイズを取り除く場合によく使います。
取りあえず、質問されている事を実現するコードを書いてみました。

#include <stdio.h> #define V_AVE_CNT 3 #define V_INVALID_DT 0x7FFFFFFF typedef struct s_avebuf { int top; int cnt; int Total; int dt[V_AVE_CNT]; } S_AVEBUF; void ini_avebuf( S_AVEBUF * pAveBuf ) { pAveBuf->top = 0; pAveBuf->cnt = 0; pAveBuf->Total = 0.0; } int add_avebuf( S_AVEBUF * pAveBuf, int NewDt ) { int result = V_INVALID_DT; int pos; if (pAveBuf->cnt < V_AVE_CNT) { pAveBuf->Total += NewDt; pAveBuf->dt[pAveBuf->cnt++] = NewDt; } else { pos = pAveBuf->top; pAveBuf->Total -= pAveBuf->dt[pos]; pAveBuf->dt[pos] = NewDt; pAveBuf->Total += pAveBuf->dt[pos]; pAveBuf->top = (pAveBuf->top + 1) % V_AVE_CNT; } if (pAveBuf->cnt >= V_AVE_CNT) { result = pAveBuf->Total / V_AVE_CNT; } return(result); } int main( int argc, char * argv[] ) { S_AVEBUF ave; int indt[] = {2, 5, 7, 6, 4}; int i; int r; ini_avebuf(&ave); for (i = 0; i < sizeof(indt) / sizeof(indt[0]); i++) { r = add_avebuf(&ave, indt[i]); if (r != V_INVALID_DT) { printf("r = %d\n", r); } } return(0); }

投稿2017/01/06 13:58

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

移動平均法は原価算出にたまに使いますが、今回はご提示の様に3個くくりの例として作ってはみました。

c

1#include<stdio.h> 2#include<string.h> 3 4void main(void) 5{ 6 int c[31]; 7 int i = 0; 8 printf( "input value & finish Ctl+d \n" ); 9 10 while( fscanf( stdin , "%d" , &c[i]) != EOF ) { 11 if ( i > 1 ){ 12 printf("%f \n", (c[i-2]+c[i-1]+c[i])/3.00); 13 } 14 if ( i++ >= 30 ) return; 15 } 16} 17

投稿2017/01/06 12:19

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問