OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

関数の呼び出し

  • すぐに回答を!
  • 質問No.213991
  • 閲覧数60
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 70% (7/10)

エクセルの2列5行のファイルがあるとします、
このファイルの各列の平均を求める関数をheikinとします。
エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。
また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。
各列ごとにプロトタイプ宣言を行えば求まるのですが、
どうかよろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル8

ベストアンサー率 44% (13/29)

 あー,Windowsの調子がサイアク.レジストリがぶっ壊れてるらしい.ムカツク~~~~,ってこんなことは関係ありませんね,ごめんなさい.

 統計処理の知識は,私からはもう消え去ってしまいましたが,とりあえず,プログラムの書き方的にそれほどおかしなところはない様に思いますが.

 ただ,bb()の中で,変数 sum1 と変数 sum2 の値を初期化しないまま,直後に += 演算しちゃっているのが気になります.
 Cの仕様でそこまで規定されていたかどうか知りませんが,ひょっとして,変数を宣言して確保しただけでは,その領域の,内容の初期化までは保証されていなかったのでは?.(自信がありません.)

 後細かいことを言いますが,関数の定義で,引数に double x[N] とかで N を書いているのは無意味ではないかしら.
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル8

ベストアンサー率 44% (13/29)

 Cでプログラムを書かれるのは初めてですか?.  質問の意味が激しく不明です.おそらく用語の問題だと思うので,次の例を見て用語を直しての補足をお願いします.それほど分らない用語はないと思いますが・・・.次の記述はあくまでも例で,あなたの考えているものとは違うと思いますが. ------------------- ファイル heikin.h /* 関数heikin()のプロトタイプ宣言 */ ...続きを読む
 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

お礼率 70% (7/10)

言葉足らずで申し訳ありません。
私の作ったモノを載せておきます
回帰直線のパラメータと回帰直線を求める物です。

#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回目に実行したら全然違う答えが返ってくるんです。。返り値が違うんでしょうか?
投稿日時 - 2002-02-10 23:33:19


  • 回答No.3
レベル9

ベストアンサー率 71% (59/82)

stanakaさんの仰るとおり,sum1,sum2の初期化がされてないのは 問題です.関数内で動的に割当てられた変数内には最初,不定値(何か 分からない値)が入っています.heikin()の中でやってるように, sum1=0.0; sum2=0.0;としましょう. あと,個人的に気になるのは,sum/Nです.Nは定数な訳ですが, 定数はどういう型として扱われるんでしょうね?もし,int型と ...続きを読む
stanakaさんの仰るとおり,sum1,sum2の初期化がされてないのは
問題です.関数内で動的に割当てられた変数内には最初,不定値(何か
分からない値)が入っています.heikin()の中でやってるように,
sum1=0.0; sum2=0.0;としましょう.

あと,個人的に気になるのは,sum/Nです.Nは定数な訳ですが,
定数はどういう型として扱われるんでしょうね?もし,int型と
解釈された場合,sum/Nの演算は整数同士の演算として扱われ,
小数点以下は必ず0になると思います.神経質かもしれませんが,
私ならsum/(double)Nとしますね.
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ