こんにちは
まず、質問欄にあるソースコードを見て気になったことを述べます。
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
関数を使います。
例えば、
C
1int *data;
2data = (int *)malloc(sizeof(int) * number);
3
とすると入力するnumberの値に応じてdataのサイズが変わります。
(正確に言うとnumberというサイズだけメモリを確保しています。)
私が書いたソースコードではすべてポインターで統一していますがわかりにくい場合は配列に書き直してもいいでしょう。具体的に言うと *(data + i)
をdata[i]
に*(dev + i)
をdev[i]
に変えます。(最初のint *data
はそのまま)
今回は動的にするデータは入力する値を保存するものとそれぞれのデータの偏差を保存するものの2つです。
最後にfreeでメモリーを解放することを忘れずに気をつけましょう。
malloc関数についてくわしく知りたい場合は
【C言語入門】mallocの使い方
配列を自由自在に作る - 苦しんで覚えるC言語をご覧ください。
以上、
私が書いたソースコードを載せておきます。
C
1#include <stdio.h>
2#include <stdlib.h>
3#include <math.h>
4
5#define BUFSIZE 256
6
7int main()
8{
9 char buf[BUFSIZE];
10 int number;
11 int max,min;
12 int sum = 0;
13 double ave;
14 double *dev;
15 double disp = 0.0; //devは偏差,dispは分散
16 int i;
17 int *data;
18
19 printf("入力する整数の個数を入力\n");
20 fgets(buf,sizeof(buf),stdin);
21 number = atoi(buf);
22 data = (int *)malloc(sizeof(int) * number);
23 dev = (double *)malloc(sizeof(int) * number);
24
25 if (data == NULL){
26 exit(0);
27 }
28 if(dev == NULL){
29 exit(0);
30 }
31 printf("データを%d個入力\n",number);
32 for (i = 0;i < number ;i++) {
33 printf("%d個目->",i + 1);
34 fgets(buf,sizeof(buf),stdin);
35 *(data + i) = atoi(buf);
36 if(i == 0){
37 max = *(data + i);
38 min = *(data + i);
39 }
40 }
41
42 for(i = 0; i < number; i++){
43 if(max < *(data + i)){
44 max = *(data + i);
45 }
46 if(min > *(data + i)){
47 min = *(data + i);
48 }
49 sum += *(data + i);
50 }
51 ave = sum * 1.0 / number;
52
53 printf("最大値 %d 最小値 %d \n",max,min);
54 printf("合計 %d 平均 %.2f \n",sum,ave);
55
56 for(i = 0; i < number; i++){
57 *(dev + i) = *(data + i) * 1.0 - ave;
58 disp += pow(*(dev + i),2);
59 printf("%dの偏差は%.3fです。\n", *(data + i), *(dev + i));
60 }
61 disp /= number * 1.0;
62
63
64 printf("分散 %.3f \n",disp);
65
66 free(data);
67 free(dev);
68
69 return 0;
70}
71