• ベストアンサー

関数の呼び出し

エクセルの2列5行のファイルがあるとします、 このファイルの各列の平均を求める関数をheikinとします。 エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。 また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。 各列ごとにプロトタイプ宣言を行えば求まるのですが、 どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stanaka
  • ベストアンサー率44% (13/29)
回答No.2

 あー,Windowsの調子がサイアク.レジストリがぶっ壊れてるらしい.ムカツク~~~~,ってこんなことは関係ありませんね,ごめんなさい.  統計処理の知識は,私からはもう消え去ってしまいましたが,とりあえず,プログラムの書き方的にそれほどおかしなところはない様に思いますが.  ただ,bb()の中で,変数 sum1 と変数 sum2 の値を初期化しないまま,直後に += 演算しちゃっているのが気になります.  Cの仕様でそこまで規定されていたかどうか知りませんが,ひょっとして,変数を宣言して確保しただけでは,その領域の,内容の初期化までは保証されていなかったのでは?.(自信がありません.)  後細かいことを言いますが,関数の定義で,引数に double x[N] とかで N を書いているのは無意味ではないかしら.

その他の回答 (2)

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.3

stanakaさんの仰るとおり,sum1,sum2の初期化がされてないのは 問題です.関数内で動的に割当てられた変数内には最初,不定値(何か 分からない値)が入っています.heikin()の中でやってるように, sum1=0.0; sum2=0.0;としましょう. あと,個人的に気になるのは,sum/Nです.Nは定数な訳ですが, 定数はどういう型として扱われるんでしょうね?もし,int型と 解釈された場合,sum/Nの演算は整数同士の演算として扱われ, 小数点以下は必ず0になると思います.神経質かもしれませんが, 私ならsum/(double)Nとしますね.

  • stanaka
  • ベストアンサー率44% (13/29)
回答No.1

 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と仮定してお話しています.

ATORANDAMU
質問者

補足

言葉足らずで申し訳ありません。 私の作ったモノを載せておきます 回帰直線のパラメータと回帰直線を求める物です。 #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回目に実行したら全然違う答えが返ってくるんです。。返り値が違うんでしょうか?

関連するQ&A

  • main関数を先頭に置くデメリット

    C言語で、main関数を先頭に置き、他の関数はプロトタイプ宣言だけ済ませて mainの後に置くという書き方に何かデメリットはあるのでしょうか。 何かの書籍で、「mainは先頭に置く方が何かと良い」と書いてあったので気になっています。

  • PowerShellの関数呼び出しについて

    PowerShellでの関数呼び出しでエラーとなります。 (定義より前にコールしているので当たり前なのですが) ********** (大まかな処理内容です) ********** call main() main() { 処理 } ******************************************************** 【質問1】  ・エラーを出さないようにする方法はないのでしょうか?   (例えばC言語のプロトタイプ宣言のような) <補足>  現在VBScriptで行っているバッチ処理をPowerShellに移行している初心者です。  色々検索はしましたが、答えが得られずの質問になります。  お時間がある時で構いませんので、ご回答をお願い致します。

  • 関数

    ファイルからデータを読み込んで処理するプログラムを作っているのですが、 分からないとこがあるのでアドバイスお願いします。 2:平均値、標準偏差を求める関数 3:特定の偏差値を求める関数 1:main関数 があるとします。偏差値を求めたいとき平均値と標準偏差を使用するので、 2の関数で求めた値を3の関数でも使えるようにするにはどうしたら良いのでしょうか?

  • インデックス関数の応用で・・・

    仕事で使うエクセルシートを作成中で困っております。 知恵を貸して下さい。 インデックス関数でいう行の値を返したいです。 列と交わる部分にはデータが入っており、 列が○○で、交わる部分に××が入っていれば、 行の値を返す。 このようにしたいのですが、 どのようにしたらよいでしょうか>< よろしくお願いします。

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • 関数のプロトタイプ宣言

    #include <stdio.h> #define N 3 #define M 4 int sum(int [][M]); (関数のプロトタイプ宣言) int main(){   ・   ・   ・ return(0); } int sum(int x[][M]){    ・    ・ } 以上のプログラムより、関数のプロトタイプ宣言や、関数内の 行列の定義でint sum(int [][M]);や int sum(x[][M]){}となっていますが なぜ、列にMだけを代入することだけでよいのでしょうか? また、教科書に関数のプロトタイプ宣言ではint sum(int [][]);だけでもよいと書かれていたのですが 実際、コンパイルしてみたところ 'int[]' 型のサイズは未知あるいはゼロとエラーがでました。 これは、コンパイラによってできるものとできないものがあるのでしょうか?? よろしくお願いします。

  • vlookup関数とHlookup関数の組み合わせ

    Excelの関数で、HLOOKUPやVLOOKUPがありますが、この 2つの関数を合わせた様な感じで、列の値と行の値の 2条件がマッチした値を別シートに作成した集計表から 取得させたいですがどの様にすればよいでしょうか。 質問が分かりにくいですがどうぞよろしくお願い致します。

  • COUNTIF関数がうまく行かないとき

    Excel 2013です。 37385行14列の表で、二つの列のデータが重複している行を抽出したいとなりました。 二つの列のデータは分類番号のようなもので、ゼロから始まるものもあるので文字列として入力された数字です。 そこで、その二列をCONCATENATE関数で繋いだ数字の並び(N列に配置)をCOUNTIF関数で調べる(O列)ことにしました。 すると、N列の値が異なるセルを同じとみなしてカウントしたようなO列の値がいくつか見られました。 そこで、N列のセルにNUMBERVALUE関数を追加し数値にしたところ、一見うまくいっているようにみえます。 これはなぜ起きたのでしょうか? また、臨んだ結果が得られていると確認する方法がありますでしょうか? N列は文字列のときは文字列長0~18までありました。 よろしくお願いします。

  • エクセルの関数についての質問です

    エクセルの関数についての質問です 独学でエクセルを勉強しておりますが以下のような表の中から該当する値を返すことは可能でしょうか。 方法はどのようなものでもアドバイスをいただければトライしてみようと思います。 以下のような元データの中から、行の条件と列の条件を満たすセルに表示されている値(%)を 表示させる関数。そもそも関数での解決は不可能かもしれませんが、もし方法があれば ご教示お願いします。       0000~1000  1001~2000  2001~3000 000~100    5%      5%      4% 101~200    4%      4%      3% 201~300    3%      2%      1% 行と列の値を入力するとその交差した値が表示させたい。 例)行の検索したい数値を110、列の検索したい数値を1200と指定した場合、表示させたい数値は"4%"。 ぜひぜひよろしくお願いいたします。

  • Excelの関数について

    Excelの関数について 私のExcelは2003です。 表を作っていて A列とB列に数値を入れてその合計をC列に自動的に出すようにするのは C列に「=SUM(A3,B3)」と入れますよね? 1日数回のデータを取り A列とB列に数値を入力し 1ヶ月ほどデータを取り続けるので その分C列に入れた関数を下へセルの右下にポインタを合わせて十字の記号を出して 下へ関数を入れたのですが その場合C列には0と表示されますよね? これは防げないものなのですか? 後、そのC列に表示された合計値を 次の行のA列に表示させたいのですが そういう関数はありますか? C列の合計値に次の数を足して、合計値をどんどん増やしていくので 例えばC1の値をそのままA2に表示。 C2の値をそのままA3に表示 C5の値をそのままA6に表示としたいのですが 関数があったら教えてほしいです。

専門家に質問してみよう