• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列 平均値と分散値)

配列の平均値と分散値を求める方法

このQ&Aのポイント
  • C言語を使用して、配列の平均値と分散値を求める方法について説明します。
  • 与えられた配列の要素を合計し、その平均値を計算します。
  • さらに、各要素と平均値の差の二乗を計算し、それらの平均値を分散値として求めます。

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

  • ベストアンサー
noname#50176
noname#50176
回答No.1

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; } とできませんんか?

cgengo
質問者

補足

mainでの関数呼び出しができていませんでした>< mean_vari(&i,s[n],&heikin,&bunsan); では違うのでしょうか?

その他の回答 (12)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.13

>形が固定された課題なもんで二つに分けちゃいけないんです そんな課題 100個やっても役には立たんよ。 穴埋め問題なんか出題者が楽したいだけじゃん。 まずは平均と分散が求められるプログラムを書けるようになってから、ヒマがあったら穴埋めして下さい。

cgengo
質問者

補足

わかりました;;

noname#50176
noname#50176
回答No.12

<追記> 動作を考慮しないなら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); です。 もう限界です・・・

cgengo
質問者

お礼

わざわざありがとうございました。 まじ感謝っす;;

noname#50176
noname#50176
回答No.11

>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が未使用になりますが・・・)

noname#50176
noname#50176
回答No.10

#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[]を渡して動作すればコンパイラが異常かと 思いますが…。

cgengo
質問者

補足

iを使わないといけなくなってしまうのでこだわってました><

noname#50176
noname#50176
回答No.9

>unsignedも使用禁止なんです;; 冒頭の unsigned int n=sizeof(a)/sizeof(int); int i; を int n=sizeof(a)/sizeof(int),i; にすればいいだけです。 ただ配列要素数は普通、符号なしでやるべきなのですが・・・。

noname#50176
noname#50176
回答No.8

<追記> 100%定型式にしたいのなら、 *mean=(double)sum/n; は *mean=sum/(double)n; でもかまいません。

cgengo
質問者

補足

#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 続行するには何かキーを押してください . . . */ 平均もでません。。。

noname#50176
noname#50176
回答No.7

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; } でもだめなのですか? 制約がきつい気がしますが・・・。

cgengo
質問者

補足

unsignedも使用禁止なんです;; 形固定だと厳しいです。。。

noname#50176
noname#50176
回答No.6

<いくつか凡ミスしてました…> こうです。 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; }

cgengo
質問者

補足

#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さんのように穴埋め形式でして;;

noname#50176
noname#50176
回答No.5

#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); ってことでしょうか?

cgengo
質問者

補足

sum2 +=((sum=s[i]-*mean)*sum);      ↑     ここの=でエラーがでます>< 

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>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); などとして各々平均値、分散値を戻り値として返すのが普通です。

cgengo
質問者

補足

形が固定された課題なもんで二つに分けちゃいけないんです>< 修正部分があったので初期化をしたのですが・・・ #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; } 一応できたのですが、結果の値がでないんです。

関連するQ&A