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

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

配列 平均値と分散値

#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 +=????; } ????=????; } 平均値と分散値を求めたいのですが、????の部分になりをいれていいかわかりません。 教えてください。

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

  • ベストアンサー
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

  • 標準偏差・分散

    標準偏差と分散を求めるプログラムで #include <stdio.h> #include <math.h> int main(void){ int i; double data[10]; double heikin, total = 0.0, variance = 0.0, deviation = 0.0; for ( i = 0; i < 10; i++ ){ printf("%d番目の値を入力:",i + 1); scanf( "%lf",&data[i] ); total += data[i]; } heikin = total / 10.0; for(i = 0; i < 10; i++ ){ variance += ((data[i]-heikin)*(data[i] - heikin))/10.0; } deviation += sqrt(variance); printf("平均値は%f\n" , heikin ); printf("分散は%fです。\n",variance); printf("標準偏差は%fです\n",deviation); getchar(); getchar(); return(0); } という感じでいいのでしょうか? 分散と標準偏差の式はこれであっているとおもうのですが・・・・。

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • 平均の問題(2)

    間違って前回の質問を締め切ってしまったので、もう一度お願いします。 申し訳ありません。 C言語の問題です。 1つの整数n(最大20)をキーボードから入力する。 続いてn人分の身長をキーボードから入力する。 平均身長、それぞれの身長、その身長と平均身長との差を1行ずつ出力せよ。 #include < stdio.h > int main(void) { int i, n; int s[20]; int sum; sum=0; scanf("%d", &n); for(i=0; i<n; i++){ if(n<=20){ scanf("%d", &s[i]); sum += s[i]; } } printf("平均:%f\n", (double)sum/n); for(i=0; i<n; i++){ printf("%d\n", s[i] ); printf("%f\n", s[i]-(double)sum/n); } return(0); } という風に考えたのですが、これだと結果が1行で表示されません・・・。 1行で表示するにはどうしたら良いのでしょうか? 初歩的な質問ですみません。 回答よろしくお願いします。

  • 平均の問題

    C言語の問題です。 1つの整数n(最大20)をキーボードから入力する。 続いてn人分の身長をキーボードから入力する。 平均身長、それぞれの身長、その身長と平均身長との差を1行ずつ出力せよ。 という問題なのですが、「それぞれの身長、その身長と平均身長との差を1行ずつ出力」という部分のプログラムの書き方がわかりません。 平均の身長を出す部分まで考えてみたのですが・・・ #include < stdio.h > int main(void) { int i, n, sum; int s[20]; sum=0; scanf("%d", &n); for(i=0; i<n; i++){ if(n<=20){ scanf("%d", &s[i]); sum += s[i]; } } printf("%f\n", (double)sum/n); return(0); } ここからどのようにすればいいのでしょうか? ご指導いただけたら嬉しいです。 回答よろしくお願いします。

  • 平均、最大、最小値の求め

    データーを20個入力して平均値、最小値、最大値を求めるという問題を解こうとしたのですが、どうも分からないので教えていただけないでしょうか? 友達と二人で取り組んでプログラムを作成したのですがエラーが出たりして成功しませんでした。 (1)算術型関数heikin、saidai、saishoに分けて作成せよ #include<stdlib.h> #include<stdio.h> #define N (20) int main(void){ double Saidai(double data[], int N){ int i; double saidai; saidai = data[0]; for (i=1; i<N; i=i+1){ if(data[i] > saidai){ saidai = data[i]; }else } double Saisho(double data[], int N){ int i; double saisho; saisho = data[0]; for (i=1; i<N; i=i+1){ if(data[i] < saisho){ saisho = data[i]; }else } double Heikin(double data[], int Ninzu){ int i; double heikin; double goukei; goukei = 0; for (i=0; i<Ninzu; i=i+1){ goukei = goukei+data[i]; } heikin = goukei / ((double)Ninzu); fprintf(stdout,"saidai=%lf\n",saidai); fprintf(stdout,"saisho=%lf\n",saisho); fprintf(stdout,"heikin=%lf\n",heikin); return(EXIT_SUCCESS); } エラー E2293 ) が必要(関数 main ) エラー E2139 宣言に ; がない(関数 main ) エラー E2134 複合文に } がない(関数 main ) 警告 W8070 関数は値を返すべき(関数 main ) (2)手続き型関数を用いて、平均値、最大値、最小値を一括に処理するプログラムを作成せよ こちらに関してはお互い手も出ませんでした。 乱文で分かりずらいと思うかも知れませんが、分かる方がいましたら教えていただけないでしょうか? よろしくお願いします。

  • 配列の乱数と平均値、個数表示

    0から9までの整数乱数を100個発生させ、100個の乱数の平均値も合わせて出力し、0から9それぞれの個数を数えるための変数に必ず配列を用いるプログラムを下記に作成したんですけども、出現個数カウント用の変数を10個用意していけないという条件で出現個数カウント用の配列を用意し、 結果が、 7 7 1 7 3 9 1 2 5 0 0 3 6 8 4 9 1 4 2 4 8 2 4 2 6 0 9 3 5 8 6 6 6 2 0 9 5 2 6 9 5 0 5 3 9 2 6 7 0 6 1 4 1 1 1 9 7 0 5 0 6 9 7 4 9 9 7 5 3 6 1 9 6 6 6 7 1 2 6 1 4 9 1 3 1 3 7 0 0 8 1 9 3 2 9 4 4 5 4 0 0 *********** 11 1 ************* 13 2 ********* 9 3 ******** 8 4 ********** 10 5 ******** 8 6 ************** 14 7 ********* 9 8 **** 4 9 ************** 14 平均 4.4 に表示されるプログラムがわかりません、Java初心者なので作ったプログラムのどこを直せばいいのか教えてください。 class Kadai06_5 { public static void main(String args[]) { int n=10; int a[] = new int[n]; int i; int sum=0; double avg=0; for(i=0; i<100; i++){ System.out.print((int)(Math.random()*10)); sum +=(int)(Math.random()*10); } for(i=0; i<n; i++){ System.out.println(); } avg=(double)sum/100; System.out.println("平均"+avg); } }

    • ベストアンサー
    • Java
  • 平均、分散を求めたときの入力エラー

    入力された10個の数字について平均、分散を求めるため素朴に書いてみました。 #include<stdio.h> int main(){ char buf[256]; double a,b,c,d,e,f,g,h,i,j,mean,variance; fgets(buf,256,stdin); sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); if(!sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j)){ printf("数字を入力してください。\n"); }else{ mean=(a+b+c+d+e+f+g+h+i+j)/10; variance=((a-mean)*(a-mean)+(b-mean)*(b-mean)+(c-mean)*(c-mean)+(d-mean)*(d-mean)+(e-mean)*(e-mean)+(f-mean)*(f-mean)+(g-mean)*(g-mean)+(h-mean)*(h-mean)+(i-mean)*(i-mean)+(j-mean)*(j-mean))/10; printf("平均=%lf\n",mean); printf("分散=%lf\n",variance); return 0; } } 途中、数字が入力されなかったときに”数字を入力してください。” と書きたかったのですがうまくいきません。あと、10個より少なく入力したときのエラー表示もしたいのですが… 教えてください。よろしくお願いします。

  • Javaコンパイルエラー

    Javaにて以下のようなプログラムを作成していますが、 「演算子 ^ は引数の型 double, int で未定義です。」とエラーになりました。 色々な方のご協力もあり、ここまで作れましたが、 これより先が行き詰っています。 教えていただけないでしょうか。 ---------------------------------------------- // 分散を返すメソッド public class Kadai16 { public static void main(String args[]){ //double型の配列の生成 double[]a=new double[10]; argument(a); //配列aの要素[0]から[9]の内容を表示 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); System.out.println(a[3]); System.out.println(a[4]); System.out.println(a[5]); System.out.println(a[6]); System.out.println(a[7]); System.out.println(a[8]); System.out.println(a[9]); //double total=sum(a)を実行する double total =sum(a); System.out.println("合計は"+total+"です。"); //使って平均を出す double heikin; mean(total); heikin = mean(total); System.out.println("平均は"+heikin+"です。"); //分散を返す double bunsan; bunsan = total-heikin^2/10; System.out.println("分散は"+bunsan+"です。"); } /** * ランダムな数値を入れるメソッド * @param a ランダムな数値を入れる配列 */ private static void argument(double[]a) { //引数の配列aの[0]から[9]までランダムな数値を設定する。 for(int i=0; i<a.length;i++) { a[i]=Math.floor(Math.random()*10); } } //配列を受け取って要素の合計を出すメソッド public static double sum(double[] x) { double t=0; for(int i=0; i<x.length;i++) { t= x[i]+t; } return t; } //配列を受け取って平均を出すメソッド public static double mean(double b) { return b/10; } //分散を返すメソッド public static double bunsan(double c) { double t=0; double bnsan =0; for(int i=0; i<c.length; i++) { t =c[i]+t } } }

  • c言語

    n人の名前、と国数英の点数を読み込み各人の平均点、標準偏差を求め見やすく出力するぷろぐらむです osはlinuxでコンパイラはgccです。 変数が多くなってしまいよくわかりません。 もっと簡単になりますか? #include<stdio.h> #include<math.h> #define N 50 main() { int eng[N], jap[N], math[N], n=0, i=0; char name[N][12]; double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; printf("名前 合計点"); while(scanf("%s %d %d %d",&name[n],&eng[n],&jap[n],&math[n]) != EOF) { sum[i] = eng[n]+jap[n]+math[n]; sum1 += eng[n]; sum2 += jap[n]; sum3 += math[n]; printf("%-12s%4d",name[n], sum[i]); n++; i++; } ave1 = sum1/n; ave2 = sum2/n; ave3 = sum3/n; for(i=0; i<n; i++) { SUM += (eng[i]-ave1)*(eng[i]-ave1); } vari = SUM/n; s_devi = sqrt(vari); printf("English\n average = %f\nstandard deviation = %f\n\n",ave1,s_devi); for(i=0; i<n; i++) { SUM += (jap[i]-ave2)*(jap[i]-ave2); } vari = SUM/n; s_devi = sqrt(vari); printf("japanese\n average = %f\nstandard deviation = %f\n\n",ave2,s_devi); for(i=0; i<n; i++) { SUM += (math[i]-ave3)*(math[i]-ave3); } vari = SUM/n; s_devi = sqrt(vari); printf("math\n average = %f\n standard deviation = %f\n\n",ave3,s_devi); }

  • C言語 入力した数値の平均値の近似値(関数を利用)

    double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素の平均を値として返す関数 double average(double a[], int n) および、double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素のなかで、それら n 要素の平均値と最も近い値を返す関数 double closest_to_average(double a[], int n) を作成して、main関数で、平均値と最も近い値を出力しろ という問題をやってみたのですが、私のプログラムでは実行して、数値を入力した後強制終了されてしまいます。 どこが間違えているのか教えていただけないでしょうか? 以下が私の作ったプログラムです。 ---------------------------------------------------------------------- #include <stdio.h> double average(double a[], int n) { int i; double sum,avg; sum=0; for(i=0;i<n;i=i+1){ sum=sum+a[i]; } avg=sum/n; return(avg); } double closest_to_average(double a[], int n) { int i; double avg,num1,num2,ans; avg=average(a,n); num1=avg-a[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-a[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2){ num1=num2; ans=a[i]; } } return(ans); } int main (void) { int i,n; double a[100]; double ans; scanf("%d",&n); for(i=0;i<n;i=i+1){ scanf("%d",a[i]); } ans=closest_to_average(a,n); printf("%f",ans); return(0); } ---------------------------------------------------------------------- ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずです。 よろしくお願いします。

専門家に質問してみよう