ここから本文です

c言語に関する質問です。 「ファイルから読み込んだデータを20個の配列に格納して...

c_s********さん

2013/12/2319:01:27

c言語に関する質問です。
「ファイルから読み込んだデータを20個の配列に格納してその区間内での最大値・最小値を出す。それを
移動平均のように1分ずつずらし、同様のことを行う」というプログラムが組めません。

#include<stdio.h>
int main(void)
{
int i,j,n,k,g,gg;
float x,y,max,min;
float a[2000],b[2000],c[2000],d[2000],p[2000],q[2000];
FILE *f,*fp;

f=fopen("b20060401.csv","r");
if(f==NULL) printf("no,data\n");
fp=fopen("fimd_month.csv","w"); //読み込みファイルと書き込みファイルをオープンする
if(fp==NULL) printf("no,data2\n");

n=0;
for(i=1;i<=1440;i++){
for(j=1;j<=20; j++){
fscanf(f,"%f,",&x);
if(j==1)
a[++n]=x; //読み込みファイルからのデータを読み込む
if(j==5)
b[n]=x;
}
}

i=0;
for(j=0;j<=1440;j++){
p[i]=b[i]; //任意の配列に挿入する
i++;
}


g=0;
while(g<=720){
gg=20+g;
for(i=g+1;i<=gg;i++){
q[i]=p[i];
printf("no-%d %f\n",i+1,q[i]);
}
i=g+1;
for(j=1,max=q[i];j<=20;j++){
if(max<q[j]) max=q[j];
} //20区間内における最大値を求める
c[i]=max;
printf("%f\n",c[i]);
g++; }
for(i=1;i<=20;i++){
q[i]=p[i];
printf("no-%d %f\n",i+1,q[i]);
}
for(j=1,min=q[1];j<=20;j++){
if(min>q[j]) min=q[j];
}
d[i]=min;
printf("%f\n",d[i]);
g++;}


for(i=1;i<=1440;i++){
fprintf(fp,"%f,%f,%f,%f,",a[i],b[i],c[i],d[i]);
fprintf(fp,"\n");
}

fclose(fp);
printf("e.n.d\n");

return 0;
}


このプログラムはエラーもなく動作しています。(visual studio 2008で作成しています。)

移動平均のように1分ずつズレていきながら数値を取ることは出来ていますが、
(ex,1~20分間;2~21分間)その区間内での最小値・最大値を正確に出せません。

ここまで頑張りましたが、お手上げです。
どなたかお教えください。

閲覧数:
384
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2013/12/2417:29:01

お困りのようで、確かにそれは伝わってきます。でもいまひとつ、ご希望の処理内容が見えてきません。ただ、こういう場合でも、コードを実際にビルドしながら処理内容を保ったままコーディングの外形を整えていくと(いわゆるリファクタリングを行うと)何となく問題点がわかってくることが多々あります。よくそういうことをしますので。

『このプログラムはエラーもなく動作しています』とのこと。そして『visual studio 2008で作成』とのこと。当方でも専ら Visual Studio 2008 を使用しています。で、C言語でソースコードを書かれていると思いますが、一応、C++のコンパイラを使ってみます。(その方が問題点を見つけやすいので)

そうすると…

1>------ ビルド開始: プロジェクト: Sample, 構成: Debug x64 ------
1>コンパイルしています...
1>Sample.cpp
1>.\Sample.cpp(5) : warning C4101: 'y' : ローカル変数は 1 度も使われていません。
1>.\Sample.cpp(4) : warning C4101: 'k' : ローカル変数は 1 度も使われていません。
1>.\Sample.cpp(58) : error C2059: 構文エラー : 'for'
1>.\Sample.cpp(58) : error C2143: 構文エラー : ')' が ';' の前にありません。
1>.\Sample.cpp(58) : error C2143: 構文エラー : ';' が '<=' の前にありません。
1>.\Sample.cpp(58) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\Sample.cpp(58) : error C2143: 構文エラー : ';' が '++' の前にありません。
1>.\Sample.cpp(58) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\Sample.cpp(58) : error C2086: 'int i' : 再定義されました。
… 長いので略 …
1>ビルドログは "file://D:\source\Sample\x64\Debug\BuildLog.htm" に保存されました。
1>Sample - エラー 20、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と、エラーが出てきました。

調べてみたところ、原因がわかりました。55行目にある } ですが、ここで main 関数が終わってしまっています。ということは…。次のどちらかなのではないでしょうか。

(1)これは古いバージョン。
(2)動作しているのを確認したあと、プログラムを改変した。(これは新しいバージョン)

ここから更に進めるのは諦めるとして、やはりご自身でソースコードを整理して、そしてもう一度投稿してみることをお勧めします。仕様の説明は難しい面がありますけれども、どうでしょう。ご自身の中にある前提をすべて取り去って、それについて何も知らない人向け(というか、実際にそういう状況ですからね)にお話をする格好でやってみてください。「1分」とは何なのか。データ1個が「1分」なのかな?

1440、720、配列のサイズに現れる 2000、1 とか 5 とか…たくさんのマジックナンバーがあります。これらに込められた意味。そういったものを想像しなくて済むように、説明を加えてみてください。(または、気の利いた名前で #define するという手もあります)

あと、main 関数の中にすべてを実装する形になっていますね。幾つかの関数に分離する形にすると、見通しが良くなることがありますよ。入力処理の部分と出力処理の部分、それ以外の部分。おおまかに3分割みたいな形でも良いかなと。main 関数はそれら3つの関数を呼び出す形として。

解決に導くような回答ではないのですが、何かの足しになれたら嬉しく思います。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

k03********さん

2013/12/2323:12:32

c_shaapさん

「移動平均」のような、意味不明の単語を使うときは、
データ例と
結果例を書く。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる