痔になりやすい生活習慣とは?

標準偏差と分散を求めるプログラムで

#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);
}
という感じでいいのでしょうか?
分散と標準偏差の式はこれであっているとおもうのですが・・・・。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ん, そんなところ.


あとは気分の問題ですが, 「無駄だ」と思っても, variance を 0 クリアするコードを (variance を積算する) for の前に入れた方がよいかも.
    • good
    • 0

deviation += sqrt(variance);


だけは謎です.
まあ, deviation を求めるところも「10 で割る」のは 1回でいいような気がしますが, そっちはそれほど問題じゃないかな.
    • good
    • 0
この回答へのお礼

そうですね。
deviation += sqrt(variance);

deviation = sqrt(variance);
ということですかね?

お礼日時:2007/11/14 07:22

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

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言語初めてまもないので不備があったらすみません。

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...続きを読む

Aベストアンサー

こんばんわ。
ぱっとみでおかしいなと思った部分は、

Σxi^2の部分だと思います。
Σxi^2っていうのは、
Σxi^2=Σx1^2+Σx2^2+・・・+Σxnum^2
っていうことです。
dogtaisiさんはΣxi^2をsum^2と計算しているので
分散の計算がおかしくなっているんじゃないでしょうか?

for文の中に、Σxi^2を計算する式を改めて作ってみるのはどうでしょう?
for(i=0; i<num; i++)
{
print("No. %d ", i+1)
scanf("%d",&tmp);

sum += tmp;
sigmax2 += tmp*tmp;
}
みたいな感じで。

自分自身も初心者なんで、的外れならごめんなさいね。

QC言語 最大値と最小値を求めて表示するプログラム

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

void maxmin(int array[],int *max,int *min);

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %d\n",max,min);

return 0;
}

void maxmin(int array[],int *max,int *min)
{
int i = 0;

*max = 0;
*min = 100;

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;
}
}

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求...続きを読む

Aベストアンサー

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。

Q配列 平均値と分散値

#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 +=????;
}
????=????;
}

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

#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[...続きを読む

Aベストアンサー

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

とできませんんか?

QC言語、行列の積を求めるプログラムについて

「次に示す行列x,yの積を求めるプログラムを作成せよ。
  x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」
という問題です。自分ではとりあえず、
#include<stdio.h>
int main(void)
{
int i,j;
int x[2][3]={{1,2,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int xy[3][3]={0};

for(i=0;i<3;i++)
for(j=0;j<3;j++)
xy[i][j]=x[i][j]*y[i][j];

for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%3d",xy[i][j]);
putchar('\n');
}
return 0;
}
というプログラムを作ってみましたが、ダメでした。
ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

Aベストアンサー

#include<stdio.h>
int main(void)
{
int x[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
int y[3][2] = { { 1, 5 }, { 5, 3 }, { 8, 1 } };
int xy[2][2];
int i, j, k;

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 3; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[i][j]);
}
putchar('\n');
}
return 0;
}

#include<stdio.h>
int main(void)
{
int x[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
int y[3][2] = { { 1, 5 }, { 5, 3 }, { 8, 1 } };
int xy[2][2];
int i, j, k;

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 3; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[...続きを読む

Qがあるのにsqrtが・・・

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined reference to `sqrt'
collect2: ld はステータス 1 で終了しました

ちなみにLinux(Fedora core 4)を使用しています。
初心者ということもありなぜエラーが出るのか分かりません。
ちなみに<math.h>を使用しないプログラムは普通に動作します。
解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。
よろしくお願いします。

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined r...続きを読む

Aベストアンサー

コンパイルのオプションつけてないとかないですよね?
たとえばTerminalとかだとコンパイル時に 『-lm』とかつけますが

Q最大値と最小値を表示したいのですが・・・

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]<num[j])
min=num[i];
}
}
printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10;...続きを読む

Aベストアンサー

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

max=num[0];
for(i=0; i<10; i++)
{
if(num[i]>max)
max=num[i];
}

min=num[0]
for(i=0; i<10; i++)
{
if(num[i]<min)
min=num[i];
}

printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4....続きを読む

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

Qdoubleの変数にintとintの割り算の結果を代入するとき

以下のようにするとdには0.5ではなく0が代入されます。

int x = 1, y = 2;
double d = x / y;

これを回避するために以下のようにするのが一般的だと習いました。

//1.
double d = (double)(x) / y; // これでdには0.5が代入される

これを以下のようにしてしまうのに問題はあるでしょうか?

//2.
double d = (double)(x) / (double)(y);
//3.
double d = x / (double)(y);

また、1.と2.と3.ではどれがより良いのでしょうか?
単純に好みの問題なのでしょうか?

以上、よろしくお願いいたします。

Aベストアンサー

恐れ入ります。

単純に好みの問題かと思います。
CやC++の規格に準拠したコンパイラであれば、結果的に同じ式として扱ってくれます。
***
ただし、1,2,3ではない別種の方法を良く用いるので参考までに挙げておきます。

int x = 1;
int y = 2;
double dpoX = 0;
double dpoY = 0;
double d = 0;

dpoX = (double)x;
dpoY = (double)y;
d = dpoX / dpoY; /* 計算するときには、精度を揃えておく */

整数を使う場面では整数を使い、倍精度の計算をするときには倍精度で計算するのが良いかと。混ぜると混乱の元です。
(個人的には、ハナからdoubleで取り扱うべきかと思います)

速度的には前述の1,2,3と同様に、計測できるほどの速度低下にはなりません。
(可読性を犠牲にするのは、「除算は遅いから使いたくない」という様な時だけにする方が良いと思います)

ご参考になれば幸いです。


人気Q&Aランキング