- ベストアンサー
配列の平均値と分散値を求める方法
- C言語を使用して、配列の平均値と分散値を求める方法について説明します。
- 与えられた配列の要素を合計し、その平均値を計算します。
- さらに、各要素と平均値の差の二乗を計算し、それらの平均値を分散値として求めます。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 +=s[i]-*mean; } *variance=sum2; } とできませんんか?
その他の回答 (12)
- koko_u_
- ベストアンサー率18% (459/2509)
>形が固定された課題なもんで二つに分けちゃいけないんです そんな課題 100個やっても役には立たんよ。 穴埋め問題なんか出題者が楽したいだけじゃん。 まずは平均と分散が求められるプログラムを書けるようになってから、ヒマがあったら穴埋めして下さい。
補足
わかりました;;
<追記> 動作を考慮しないならNO11内容ですが、 動作させるのであれば int i=9, n; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(a,i,&heikin,&bunsan); です。 もう限界です・・・
お礼
わざわざありがとうございました。 まじ感謝っす;;
>iを使わないといけなくなってしまうのでこだわってました でしたら、 int i=9, n; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(a,&i,&heikin,&bunsan); かと思います。 (nが未使用になりますが・・・)
#include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i,n=9; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(a,n,&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 += (s[i]-*mean)*(s[i]-*mean); } *variance=sum2/(double)n; } 最低限、ここまでの形が限界です。 int i,n=0; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(&i,a[n],&heikin,&bunsan); にこだわってらっしゃるようですが要素数0個のポインタリテラルに i,数値リテラルに、a[]を渡して動作すればコンパイラが異常かと 思いますが…。
補足
iを使わないといけなくなってしまうのでこだわってました><
>unsignedも使用禁止なんです;; 冒頭の unsigned int n=sizeof(a)/sizeof(int); int i; を int n=sizeof(a)/sizeof(int),i; にすればいいだけです。 ただ配列要素数は普通、符号なしでやるべきなのですが・・・。
<追記> 100%定型式にしたいのなら、 *mean=(double)sum/n; は *mean=sum/(double)n; でもかまいません。
補足
#include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i,n=0; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(&i,a[n],&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 += (s[i]-*mean)*(s[i]-*mean); } *variance=sum2/(double)n; } こんな感じにしましたが結果の値がメチャクチャで。。。;; * 実行結果+感想 平均=-62017133.352941 分散=511452606931536380.000000 続行するには何かキーを押してください . . . */ 平均もでません。。。
void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; unsigned int n=sizeof(a)/sizeof(int); int i; double heikin, bunsan; mean_vari(a,n,&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; int sum2=0; /* 合計の初期化 */ for (i = 0; i < n; i++) sum += s[i]; *mean=(double)sum/n; for (i = 0; i < n; i++){ sum2 +=(s[i]-*mean)*(s[i]-*mean); } *variance=sum2/(double)n; } でもだめなのですか? 制約がきつい気がしますが・・・。
補足
unsignedも使用禁止なんです;; 形固定だと厳しいです。。。
<いくつか凡ミスしてました…> こうです。 void mean_vari(double *s, int n, double *mean, double *variance); int main(void) { double a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; unsigned int n=sizeof(a)/sizeof(double); int i; double heikin, bunsan; mean_vari(a,n,&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } void mean_vari(double *s, int n, double *mean, double *variance) { int i; double sum=0,sum2=0; /* 合計の初期化 */ for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 +=((sum=(s[i]-*mean))*sum); } *variance=sum2/(double)n; }
補足
#include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i, n; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(???,???,???,???); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; ????=sum/(double)????; for (i = 0; i < n; i++){ sum2 +=????; } ????=????; } といった固定された形でやらないといけないんです>< 申し訳ありません。 下でも発見したbitrateさんのように穴埋め形式でして;;
#1,#3です。 分散の結果が違ってましたね(謝) こうでした↓ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 +=((sum=s[i]-*mean)*sum); } *variance=sum2/n; } >mean_vari(&i,a[],&heikin,&bunsan);とやっているのですができませ>ん・・・ mean_vari(a,n,&heikin,&bunsan); ってことでしょうか?
補足
sum2 +=((sum=s[i]-*mean)*sum); ↑ ここの=でエラーがでます><
- koko_u_
- ベストアンサー率18% (459/2509)
>mean_vari(&i,a[],&heikin,&bunsan); >とやっているのですができません・・・ 基礎からやりなおしだね。関数プロトタイプは mean_vari(int* , int , double*, double*); だから、最初に配列の先頭アドレス、次に配列のサイズを入れることが意図されているのでしょう。 先にも書いたように、これらは 2 つに分けて calc_mean(const int* array, int size); calc_var(const int* array, int size); などとして各々平均値、分散値を戻り値として返すのが普通です。
補足
形が固定された課題なもんで二つに分けちゃいけないんです>< 修正部分があったので初期化をしたのですが・・・ #include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i=0, n=0; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(&i,a[n],&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; *mean=sum/(double)n; for (i = 0; i < n; i++){ sum2 +=s[i]-*mean; } *variance=sum2; } 一応できたのですが、結果の値がでないんです。
- 1
- 2
補足
mainでの関数呼び出しができていませんでした>< mean_vari(&i,s[n],&heikin,&bunsan); では違うのでしょうか?