質問: int main(){ int N=0, i=0, x=0, sum=0, max=0, min=0; double ave=0.0, v1=0.0, v2=0.0, s=0.0; printf("入力する整数の個数N:"); scanf("%d", &N); printf("整数x1="); scanf("%d", &x); sum=x; max=x; min=x; for(i=2; i<=N; i++){ printf("整数x%d=", i); scanf("%d", &x); sum=sum+x; if(max < x){ max=x; } if(min > x){ min=x; } } ave=(double)sum/N; printf("合計%d, 平均%.1fです。\n", sum, ave); printf("最大%d, 最小%dです。\n", max, min); printf("もう一度同じ数字を入力してください。\n"); for(i=1; i<=N; i++){ printf("整数x%d=", i); scanf("%d", &x); v1=v1+(x-ave)*(x-ave); s=(x-ave); printf("%dの偏差は%fです。\n", x, s); } v2=v1/i; printf("分散%fです。\n", v2); return 0; } 配列なしだと解けました。これを配列にしたいのですが、教えてください(o*。_。)oペコッ
回答: こんにちは ### まず、質問欄にあるソースコードを見て気になったことを述べます。 1.`s=(x-ave);`とありますが、sとaveはdouble型ですがxがint型で型がそろってないので一応`s=(x * 1.0 -ave);`としておきましょう。 2.最後、分散を求めるところで`v2=v1/i;`とありますが、おそらく`v2 = v1 * 1.0 / N`と 割る数はデータの個数です。 3.入力をscanf関数でやっていますが、`scanf`関数は色んな意味で危険な関数なので`fgets`の使用をおすすめします。 ### それでは本題に入ります。 1.入力した数字に応じてサイズが変わるので(つまり動的なので)今回は`malloc`関数を使います。 例えば、 ``` int *data; data = (int *)malloc(sizeof(int) * number); ``` とすると入力するnumberの値に応じてdataのサイズが変わります。 (正確に言うとnumberというサイズだけメモリを確保しています。) 私が書いたソースコードではすべてポインターで統一していますがわかりにくい場合は配列に書き直してもいいでしょう。具体的に言うと `*(data + i)`を`data[i]`に`*(dev + i)`を`dev[i]`に変えます。(最初の`int *data`はそのまま) 今回は動的にするデータは入力する値を保存するものとそれぞれのデータの偏差を保存するものの2つです。 最後にfreeでメモリーを解放することを忘れずに気をつけましょう。 malloc関数についてくわしく知りたい場合は 【C言語入門】mallocの使い方 配列を自由自在に作る - 苦しんで覚えるC言語をご覧ください。 以上、 私が書いたソースコードを載せておきます。 ``` #include #include #include #define BUFSIZE 256 int main() { char buf[BUFSIZE]; int number; int max,min; int sum = 0; double ave; double *dev; double disp = 0.0; //devは偏差,dispは分散 int i; int *data; printf("入力する整数の個数を入力\n"); fgets(buf,sizeof(buf),stdin); number = atoi(buf); data = (int *)malloc(sizeof(int) * number); dev = (double *)malloc(sizeof(int) * number); if (data == NULL){ exit(0); } if(dev == NULL){ exit(0); } printf("データを%d個入力\n",number); for (i = 0;i < number ;i++) { printf("%d個目->",i + 1); fgets(buf,sizeof(buf),stdin); *(data + i) = atoi(buf); if(i == 0){ max = *(data + i); min = *(data + i); } } for(i = 0; i < number; i++){ if(max < *(data + i)){ max = *(data + i); } if(min > *(data + i)){ min = *(data + i); } sum += *(data + i); } ave = sum * 1.0 / number; printf("最大値 %d 最小値 %d \n",max,min); printf("合計 %d 平均 %.2f \n",sum,ave); for(i = 0; i < number; i++){ *(dev + i) = *(data + i) * 1.0 - ave; disp += pow(*(dev + i),2); printf("%dの偏差は%.3fです。\n", *(data + i), *(dev + i)); } disp /= number * 1.0; printf("分散 %.3f \n",disp); free(data); free(dev); return 0; } ```