C言語初期化について

このQ&Aのポイント
  • C言語での初期化についての質問です。
  • 質問文章では、sdとvarの初期化について疑問があります。
  • また、sdは標準偏差、meanは平均値、varは分散を示しているとのことです。
回答を見る
  • ベストアンサー

初期化について 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は分散を示している

noname#181900
noname#181900

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

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

その他の回答 (2)

  • LHS07
  • ベストアンサー率22% (510/2221)
回答No.2

double array[10], sd=0, var=0, mean=0; としないとです。 単なる変数の宣言だけでは変数のサイズだけ、メモリー上に割り当てられるだけで そのにどのようなあたいになっていてもそのままです。 ですから、代入式のない変数(書き方おかしいかな?)には、値を設定しておく習慣にしたほうが安心です。

回答No.1

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

関連するQ&A

  • C言語 初期化について

    はじめまして。 C言語を学習しております。 【初期化】の意味について混乱しております。 今まで、【初期化】とは下記のような繰り返しのある文に初期値(数え始めの値、下記の例では1)を代入することだと思っていました。 for (i = 1;i <= 10;i++) { printf("メッセージ\n"); } しかし、勉強が進むにつれ、下記のように様々な場面で【初期化】という言葉が出てきたことで、【初期化】の意味がわからなくなりました。 ●【文字変数の配列の初期化】の例 char str[6] = {'M','A','R','I','O'}; ●文字列リテラルを用いた【文字列の初期化】の例。 #include <stdio.h> int main(void) { char str[] = "MARIO"; printf("%s\n",str); return 0; } ●【配列の初期化】の説明 型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・}; ●【配列を初期化】して表示する例 #include <stdio.h> #include <stdio.h> int main(void) { int array[10] = {42,79,13}; printf("array[0] = %d\n",array[0]); printf("array[1] = %d\n",array[1]); printf("array[2] = %d\n",array[2]); printf("array[3] = %d\n",array[3]); printf("array[4] = %d\n",array[4]); return 0; } ●for文の説明 for (初期化;条件式;更新) { 繰り返す文; } 初期化とは、カウント変数の初期化を行うための文です。 ここに書かれた式は、最初に1回だけ実行されます。 【初期化】とは、場面場面で意味が変わるのでしょうか。 どの場面に通じる【初期化】の本来の意味を教えてください。 よろしくお願い致します。

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • 助けてください! c言語のプログラムです。

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define KAMOKU_SUU 5 #define AVE_INDEX KAMOKU_SUU typedef struct { char name[32]; int scor[KAMOKU_SUU]; int mean; } STUDENT; int round(double d) { if (d < 0) return (int)(d-0.5); else return (int)(d+0.5); } #define ARRAY_OF(a) (sizeof (a) / sizeof (a[0])) int main(int argc,char* argv[]) { int i, j,k, n; int nStudets; double avrg[KAMOKU_SUU + 1]; double stdv[KAMOKU_SUU + 1]; STUDENT *mem; char buff[80]; if (argc < 2) { printf("!パラメータ不足\n"); return 1; } nStudets = atoi(argv[1]); mem = (STUDENT*)malloc(sizeof (STUDENT) * nStudets); if (mem == NULL) { printf("!アロケーション\n"); return 2; } memset(avrg, 0, sizeof (avrg)); memset(stdv, 0, sizeof (stdv)); printf("生徒 %d 名分の成績を入力してください:\n", nStudets); for (k = 0; k < nStudets; k++) { printf("%d 人目の点数と名前 > ", k + 1); gets(buff); strcpy(mem[k].name, strtok(buff," ")); mem[k].mean = 0; for (j = 0; j < KAMOKU_SUU; j++) { int i = mem[k].scor[j] = atoi(strtok(NULL," \n")); mem[k].mean += i; avrg[j] += i; stdv[j] += i * i; } mem[k].mean = round(mem[k].mean * 1.0 / KAMOKU_SUU); } for(j = 0; j < KAMOKU_SUU; j++) { avrg[AVE_INDEX] += avrg[j]; stdv[AVE_INDEX] += stdv[j]; avrg[j] = avrg[j] / nStudets; stdv[j] = sqrt(stdv[j] / nStudets - avrg[j] * avrg[j]); } n = nStudets * KAMOKU_SUU; avrg[AVE_INDEX] = avrg[AVE_INDEX]/ n; stdv[AVE_INDEX] = sqrt(stdv[AVE_INDEX] / n) - (avrg[AVE_INDEX] * avrg[AVE_INDEX]); printf("\n成績表\n"); printf("# NAME"); for (i = 1; i <= KAMOKU_SUU; ++i) printf(" #%d ", i); printf("MEAN\n"); for (k = 0; k< nStudets; k++) { printf("%d %10s",k+1,mem[k].name); for (j = 0; j < KAMOKU_SUU; j++) { printf(" %3d",mem[k].scor[j]); } printf(" %3d\n",mem[AVE_INDEX].mean); } printf("------------------------------------\n"); printf(" %10s","average"); for(j = 0; j < ARRAY_OF (avrg);j++) { printf(" %3.0f",avrg[j]); } printf("\n"); printf(" %10s","st.dev."); for ( j = 0; j < ARRAY_OF (stdv); j++) { printf(" %3.0f",stdv[j]); } printf("\n"); printf("正常終了\n"); return 0; }  実行してもできません。原因が全く分かりません。 お願いします。 修正してくださるとありがたいです。

  • c言語 プログラム

    c言語の時間計測を調べていたら下記のようなプログラムを見つけました。 プログラムを読んでて疑問があったので質問します。 質問は2つあります for文のところに x = (double)k/loop が入っているのですがどのような意味なのでしょうか? また*1.e6の値はいくらなのでしょうか? サンプルプログラム #include<stdio.h> #include<time.h> #include<math.h> int main(){ clock_t stt,mid,end;//_測定時刻 double secs;//_経過秒数 double msec;//_マイクロ秒 int k,loop=10000000;//_測定増幅ループ double x;//_対象関数の引数 int clksec=CLOCKS_PER_SEC; char *ttl="elapse_for_exp(x)"; int n,m=7;//_観測ループ double sm,ss;//_合計、平方和 double mean;//_平均値 double stdv;//_標準偏差 sm=ss=0; for(n=0;n<m;n++){ stt= clock();//_測定開始 for(k=0;k<loop;k++){ x = (double)k/loop; } mid = clock();//_中間測定 for(k=0;k<loop;k++){ x=(double)k/loop; exp(x);//_時間測定対象の関数 } end=clock();//_測定終了 secs=(double)((end-mid)-(mid-stt))/clksec; msec=secs/loop*1.e6; printf("%s = %fmicrosec.\n",ttl,msec); sm += msec; ss += msec*msec; } printf("合計____%f\n",sm); printf("平方和__%f\n",ss); mean = sm/m; stdv=sqrt(ss/m-mean*mean); printf("平均値___=_%f\n",mean); printf("標準偏差_=_%f\n",stdv); return 0; }

  • c言語です

    c言語初心者です。今大学の課題でc言語のプログラムをかいているのですが、うまくいかないので助けて欲しいです。以下のようなプログラムで調和平均の値を出したいのですがなぜか表示されません。infと表示されてしまいます。あと調和平均とはn/(1/d1+1/d2+1/d3+.........+1/dn)の値です。ここでd1~dnは入力された数のことです。なので0が入力された場合は値を返さないようにしたいです。   どこをどのように直せばいいのか教えてください。よろしくお願いします。 #include <stdio.h> #include<math.h> #define M 1000 int main (int argc, const char * argv[]) { // insert code here... float d[M]; double e[M]; double wa=0.0,av,bun=0,kika=1,tyowa=0; /*avはaverageを,bunは分散を意味します*/ int i=0,j=0; printf("複数の数字を入力してください\n"); printf("数字入力を終了するときはnull文字を入力してください\n"); printf("数字以外が入力されたら\n"); printf("それまでの数字の計算結果を表します\n"); /*数字を入力、和を求める*/ while (scanf("%f",&d[i])!='\0') { wa=wa+d[i]; i++; } if (i!=0) { printf("算術平均は%fです\n",wa/i); av=wa/i; for (j=0; j<i; j++) { kika=kika*d[j]; } printf("幾何平均は%fです\n",pow(kika,1./i)); for (j=0; j<i; j++) { if (d[j]=0) { printf("調和平均は出せません\n"); } else e[j]=1/d[j]; } for (j=0; j<i; j++) { tyowa=tyowa+e[j]; } printf("調和平均は%fです\n",e[1]); for (j=0; j<i; j++) { bun=bun+(d[j]-av)*(d[j]-av); } printf("分散の値は%fです\n",bun/i); } else { printf("数字を入力してください\n"); } return 0; }

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • C言語のforとwhileについて・・・

    C言語で「While 文を使って、1から100までの和を求めて表示するプログラムを作る」ことをやってみました。↓ ですが、forではできたのですが、whileでは動きませんでした。 whileで作る時は、forのどの部分を変えれば出来るんでしょうか? 解説できましたら、お願いします。。 #include <stdio.h> int main(void) { int i,wa; wa=0; for(i=1; i<=100; i++) { wa=wa+i; } printf("和=%d\n",wa); }

  • C言語で分からないところがあるのですが・・・

    すみません。C言語で分からないところがあったので来ました。 ユーザから数字を任意の数だけ受け取って、その数字とその和を表示するプログラムです。atoiなる関数、そしてコマンドライン引数というのを使って考えてみた結果を下に書きましたので、どなたか修正してください。お願いします。 実行結果(のイメージ図) 20 39 4 sum 20 39 4 63 途中までのソースコードです。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { int sum; int n,i; printf("How many numbers INPUT?: "); scanf("%d", &n); for(i = 0; i <= n; i++){ atoi(argv[i]); } sum = printf("%d",sum); return 0; }

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語で分からないところがあるのですが・・・

    こんにちは。 C言語で分からないところがあったので質問しに来ました。 ここ一週間の最高気温をユーザから受け取り、それを受けて、一週間の最高気温のmax,min,分散、標準偏差、中央値を求めるプログラムを書いてみました。以下にソースコードと実行結果を貼っておきます。 それで質問なんですが、標準偏差って簡単にいえば分散にルートをかぶせればいいんですよね? C言語でルートってどうやればいいんですか?ただ単純にsqrをつけたところ、エラーが発生したのでよく分からないままです。 もし宜しければお助け下さい。お願いします。 #include <stdio.h> int main(void) { float temp[7]; float min , max , avg; int i,k,l; for(i=0; i < 7 ; i++){ printf("%f INPUT the Maximam tempreture. : ", i + 1); scanf("%f", &temp[i]); } /*平均最高気温を求める*/ avg = 0; for(i = 0; i < 7; i++) avg = avg + temp[i]; printf("The Average Temperature is : %f .\n", avg/7); /*さすがに↓はありえない。minを下回ったり上回ったりした場合は以下に設定されている数値とする。*/ min = 1000000; max = -1000000; for(i=0; i < 7; i++){ if(min > temp[i]) min = temp[i]; if(max < temp[i]) max = temp[i]; } /*様々な値。上から最低、最高、分散、標準偏差、中央値(バブルソード使用)*/ /*英語のスペルが間違っている可能性が高いが無視*/ printf("The Lowest tempreture is : %f\n", min); printf("The Highest tempreture is : %f\n", max); printf("The variance is : %f\n", ((temp[0]-avg/7)*(temp[0]-avg/7)+(temp[1]-avg/7)*(temp[1]-avg/7)+(temp[2]-avg/7)*(temp[2]-avg/7)+(temp[3]-avg/7)*(temp[3]-avg/7)+(temp[4]-avg/7)*(temp[4]-avg/7)+(temp[5]-avg/7)*(temp[5]-avg/7)+(temp[6]-avg/7)*(temp[6]-avg/7))/7); /*↓が例の分からないところです。*/ printf("The standard deviation is : %f\n",((temp[0]-avg/7)*(temp[0]-avg/7)+(temp[1]-avg/7)*(temp[1]-avg/7)+(temp[2]-avg/7)*(temp[2]-avg/7)+(temp[3]-avg/7)*(temp[3]-avg/7)+(temp[4]-avg/7)*(temp[4]-avg/7)+(temp[5]-avg/7)*(temp[5]-avg/7)+(temp[6]-avg/7)*(temp[6]-avg/7))/7); for(i = 1; i < 7 ; ++i) for(k = 6; k >= i; --k){ if (temp[k-1] > temp[k]){ l = temp[k-1]; temp[k-1] = temp[k]; temp[k] = l; } } for(l = 0; l < 7; l++) printf("The tyuuouti is %f.\n", temp[3]); return 0; }

専門家に質問してみよう