- ベストアンサー
関数の呼び出し
エクセルの2列5行のファイルがあるとします、 このファイルの各列の平均を求める関数をheikinとします。 エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。 また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。 各列ごとにプロトタイプ宣言を行えば求まるのですが、 どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あー,Windowsの調子がサイアク.レジストリがぶっ壊れてるらしい.ムカツク~~~~,ってこんなことは関係ありませんね,ごめんなさい. 統計処理の知識は,私からはもう消え去ってしまいましたが,とりあえず,プログラムの書き方的にそれほどおかしなところはない様に思いますが. ただ,bb()の中で,変数 sum1 と変数 sum2 の値を初期化しないまま,直後に += 演算しちゃっているのが気になります. Cの仕様でそこまで規定されていたかどうか知りませんが,ひょっとして,変数を宣言して確保しただけでは,その領域の,内容の初期化までは保証されていなかったのでは?.(自信がありません.) 後細かいことを言いますが,関数の定義で,引数に double x[N] とかで N を書いているのは無意味ではないかしら.
その他の回答 (2)
- Fooky
- ベストアンサー率71% (59/82)
stanakaさんの仰るとおり,sum1,sum2の初期化がされてないのは 問題です.関数内で動的に割当てられた変数内には最初,不定値(何か 分からない値)が入っています.heikin()の中でやってるように, sum1=0.0; sum2=0.0;としましょう. あと,個人的に気になるのは,sum/Nです.Nは定数な訳ですが, 定数はどういう型として扱われるんでしょうね?もし,int型と 解釈された場合,sum/Nの演算は整数同士の演算として扱われ, 小数点以下は必ず0になると思います.神経質かもしれませんが, 私ならsum/(double)Nとしますね.
- stanaka
- ベストアンサー率44% (13/29)
Cでプログラムを書かれるのは初めてですか?. 質問の意味が激しく不明です.おそらく用語の問題だと思うので,次の例を見て用語を直しての補足をお願いします.それほど分らない用語はないと思いますが・・・.次の記述はあくまでも例で,あなたの考えているものとは違うと思いますが. ------------------- ファイル heikin.h /* 関数heikin()のプロトタイプ宣言 */ /* 返り値はfloat型,引数columnはint型 */ float heikin( int column ); ------------------- ファイル heikin.c /* 関数heikin()本体の定義 */ float heikin( int culumn ){ なんとかかんとか・・・・・・. } ------------------- ファイル main.c /* プログラム本体(main関数) */ #include <stdio.h> #include "heikin.h" /* 関数heikin()を使うので,プロトタイプ宣言を取り込む */ int main( int argc, char *argv[] ){ heikin()を使って処理本体を書く. } ------------------- 申しわけありませんが,私はWindowsのプログラミングに関してはほとんど分りませんので,問題がExcelのファイルに関する特有の処理であれば,的外れなことを言ってるかもしれませんが,お許し願います. いずれにしても,Cのカテゴリでの質問ですので,Cと仮定してお話しています.
補足
言葉足らずで申し訳ありません。 私の作ったモノを載せておきます 回帰直線のパラメータと回帰直線を求める物です。 #include <stdio.h> #define N 5 FILE *fp1; double bb(double y[N],double x[N]); double heikin(double a[N]); int main(void) { long int i; double y[N],x[N],mx,my,a,b; fp1=fopen("data2.csv","r"); for(i=0;i<N;i++){ fscanf(fp1,"%lf,%lf",&y[i],&x[i]);} fclose(fp1); b=bb(y,x); my=heikin(y); mx=heikin(x); a=my-b*mx; printf("パラメータaは%.2fです。\nパラメータbは%.2fです。\n",a,b); if(a<0) printf("直線回帰式はy=%.2fx%.2f\n",b,a); else printf("直線回帰式はy=%.2fx+%.2f\n",b,a); return(0); } double bb(double y[N],double x[N]) { long int i; double sum1,sum2,my,mx; my=heikin(y); mx=heikin(x); for(i=0;i<N;i++){ sum1+=(x[i]-mx)*(x[i]-mx); sum2+=(y[i]-my)*(x[i]-mx);} return(sum2/sum1); } double heikin(double x[N]) { long int i; double sum=0.0; for(i=0;i<N;i++){ sum+=x[i];} return(sum/N); } ご回答ありがとうございます 大体は理解できたのですが、heikinで平均を求めそれをbbで呼び出すんですが、実行した時に1回目はうまくいくんですが2回目に実行したら全然違う答えが返ってくるんです。。返り値が違うんでしょうか?