こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列 平均値と分散値

#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(&i,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];
????=sum/(double)????;

for (i = 0; i < n; i++){
sum2 +=????;
}
????=????;
}

平均値と分散値を求めたいのですが、????の部分になりをいれていいかわかりません。 教えてください。

投稿日時 - 2007-06-03 15:59:39

QNo.3053419

すぐに回答ほしいです

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

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;
}

とできませんんか?

投稿日時 - 2007-06-03 16:09:03

補足

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

投稿日時 - 2007-06-03 16:45:57

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(13)

ANo.13

>形が固定された課題なもんで二つに分けちゃいけないんです
そんな課題 100個やっても役には立たんよ。

穴埋め問題なんか出題者が楽したいだけじゃん。

まずは平均と分散が求められるプログラムを書けるようになってから、ヒマがあったら穴埋めして下さい。

投稿日時 - 2007-06-03 20:38:18

補足

わかりました;;

投稿日時 - 2007-06-04 08:59:41

ANo.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);

です。
もう限界です・・・

投稿日時 - 2007-06-03 19:24:19

お礼

わざわざありがとうございました。

まじ感謝っす;;

投稿日時 - 2007-06-04 09:01:12

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

投稿日時 - 2007-06-03 19:21:06

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

投稿日時 - 2007-06-03 18:15:42

補足

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

投稿日時 - 2007-06-03 18:19:27

ANo.9

>unsignedも使用禁止なんです;;
冒頭の

unsigned int n=sizeof(a)/sizeof(int);
int i;



int n=sizeof(a)/sizeof(int),i;

にすればいいだけです。
ただ配列要素数は普通、符号なしでやるべきなのですが・・・。

投稿日時 - 2007-06-03 18:05:26

ANo.8

<追記>
100%定型式にしたいのなら、

*mean=(double)sum/n;



*mean=sum/(double)n;

でもかまいません。

投稿日時 - 2007-06-03 18:02:32

補足

#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
続行するには何かキーを押してください . . .
*/

平均もでません。。。

投稿日時 - 2007-06-03 18:05:40

ANo.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;
}

でもだめなのですか?
制約がきつい気がしますが・・・。

投稿日時 - 2007-06-03 17:55:44

補足

unsignedも使用禁止なんです;;

形固定だと厳しいです。。。

投稿日時 - 2007-06-03 18:00:52

ANo.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;
}

投稿日時 - 2007-06-03 17:35:08

補足

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

投稿日時 - 2007-06-03 17:41:49

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

投稿日時 - 2007-06-03 17:08:06

補足

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

投稿日時 - 2007-06-03 17:13:19

ANo.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);

などとして各々平均値、分散値を戻り値として返すのが普通です。

投稿日時 - 2007-06-03 16:55:47

補足

形が固定された課題なもんで二つに分けちゃいけないんです><

修正部分があったので初期化をしたのですが・・・

#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;
}

一応できたのですが、結果の値がでないんです。

投稿日時 - 2007-06-03 16:59:45

ANo.3

<追記> #1です。

int main(void)
{
int i, n;
int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100};
double heikin, bunsan;
   ・
   ・
は、
int main(void)
{
unsigned int n=9;
int i;
int a[n]={34, 54, 21, 80, 60, 90, 15, 24, 100};
double heikin, bunsan;

とするべきだと思います。

投稿日時 - 2007-06-03 16:16:05

ANo.2

main のトコしか読んでませんが、

mean_vari(&i,n,&heikin,&bunsan);

i も n も初期化されてません。。。
a[] は何処へ?

ついでに言えば、平均と分散を求める関数は分けて、戻り値で平均値などを戻す方が良いでしょう。

投稿日時 - 2007-06-03 16:10:22

補足

mean_vari(&i,a[],&heikin,&bunsan);とやっているのですができません・・・

投稿日時 - 2007-06-03 16:39:22