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

解決済みの質問

初期化について C言語

#include<stdio.h>
#include<math.h>
int main(void){
double array[10], sd, var, mean=0;
int i;
for(i = 0; i < 10; i++){
scanf("%lf",&array[i]); /* ベクトルの読み込み */
}
for(i = 0; i < 10; i++){
mean+=array[i]; /* 和の計算 */
}
mean/=10; /* 平均値 10 回の足し算が終わってから割り算をすること*/
for(i = 0; i < 10; i++){
var+=(mean-array[i])*(mean-array[i]); /* 差の2 乗の和 */
}
var/=10; /* 分散 10 回の足し算が終わってから割り算をすること */
sd = sqrt(var); /* 標準偏差 */
printf("mean=%f\t var=%f\t sd=%f\n",mean,var,sd);
for(i = 0; i < 10; i++){
printf("%.3f\tT: %.3f\n",array[i],10*(array[i]-mean)/sd + 50); /* 偏差値の表示 */
}
return 0;
}



sdとvarは初期化されてないのですか?
sdは標準偏差をmeanは平均値をvarは分散を示している

投稿日時 - 2013-07-15 15:16:41

QNo.8177347

すぐに回答ほしいです

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

> sdとvarは初期化されてないのですか?

初期化子を書いていないのですから初期化はされません。
初期化子を書かないのは、無用な初期化を省く意図を表しています。

投稿日時 - 2013-07-15 18:24:08

ANo.3

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

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

回答(3)

ANo.2

double array[10], sd=0, var=0, mean=0;
としないとです。

単なる変数の宣言だけでは変数のサイズだけ、メモリー上に割り当てられるだけで

そのにどのようなあたいになっていてもそのままです。

ですから、代入式のない変数(書き方おかしいかな?)には、値を設定しておく習慣にしたほうが安心です。

投稿日時 - 2013-07-15 15:51:46

はい、初期化されていません。

C言語では、「効率の良い」プログラムを書くための機能が備わっていますが、この「効率の良い」という言葉の意味は、あくまでも「コンピュータ上で実行した時に効率がいい」という意味であって、プログラミングの効率が良いという訳ではないのです。
ローカル変数が初期化されない仕様もその一つとなっています。
ですので、この場合ですとvarに(適切ではない)適当な値が入ってる状態でvar+=を行った為不正な値となっており、それが元でsdの値も不正な値になっていしまっている筈です。
宣言時かその直後に0を代入すると良いでしょう。

尚、グローバル変数と、staticをつけて宣言した変数は0等で初期化されます。
但し、staticを付けたローカル変数(厳密には静的変数)は、関数から抜けたあともその値を保持するため、再帰との相性は最悪と言っていいでしょう。

投稿日時 - 2013-07-15 15:36:03