-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_utility.c
148 lines (124 loc) · 3.29 KB
/
test_utility.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
#include <math.h>
#define SIZE 20 // クラス人数(配列サイズ)
// プロトタイプ宣言
int calc_ttl(int *); // 合計計算
float calc_avg(int *); // 平均計算
void calc_dev_val(int *, float *); // 偏差計算
float calc_dist(float *); // 分散計算
float calc_std_dev(float *); // 標準偏差計算
void swap(int *, int *); // スワップ(バブルソート用)
void bubble_sort(int *); // バブルソート(降順)
void print(int *); // 結果出力
int main(int argc, char const *argv[])
{
// テストの得点の配列
int science[SIZE] = {65, 80, 67, 35, 58, 60, 72, 75, 68, 92, 36, 50, 25, 85, 46, 42, 78, 62, 84, 70}; // 科学
int english[SIZE] = {44, 87, 100, 63, 52, 60, 58, 73, 55, 86, 29, 56, 89, 23, 65, 84, 64, 27, 86, 84}; // 英語
// 結果出力
print(science);
print(english);
return 0;
}
// 合計計算
int calc_ttl(int *points)
{
int ttl = 0;
// for文を用いてttlにデータをすべて足し合わせ
for (size_t i = 0; i < SIZE; i++)
{
ttl += points[i];
}
return ttl;
}
// 平均計算
float calc_avg(int *points)
{
// calc_ttlで足し合わせた値をデータ数で割る
return calc_ttl(points) / (float)SIZE;
}
// 偏差計算
void calc_dev_val(int *points, float *dev_vals)
{
// 平均を取得
float avg = calc_avg(points);
// 各データの偏差値を求めてdev_valsの対応する場所へ格納
for (size_t i = 0; i < SIZE; i++)
{
dev_vals[i] = points[i] - avg;
}
}
// 分散計算
float calc_dist(float *dev_vals)
{
float dist = 0;
// for文を用いてdistに偏差値の2乗を全て足し合わせ
for (size_t i = 0; i < SIZE; i++)
{
dist += pow(dev_vals[i], 2);
}
// distをデータ数で割る
return dist / SIZE;
}
// 標準偏差計算
float calc_std_dev(float *dev_vals)
{
// 分散の平方根
return sqrt(calc_dist(dev_vals));
}
// スワップ(バブルソート用)
void swap(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
}
// バブルソート(降順)
void bubble_sort(int *points)
{
// 計算量O(n^2)
for (size_t i = SIZE - 1; i > 0; i--)
{
for (size_t j = 0; j < i; j++)
{
// 左の値が右の値よりも小さければswapを実行
if (points[j] < points[j + 1])
{
swap(&points[j], &points[j + 1]);
}
}
}
}
// 結果出力
void print(int *points)
{
float dev_vals[20];
// 全得点出力
printf("得点:");
for (size_t i = 0; i < SIZE; i++)
{
printf("%d, ", points[i]);
}
printf("\n");
printf("合計:%d\n", calc_ttl(points)); // 合計出力
printf("平均:%.2lf\n", calc_avg(points)); // 平均出力
// 全偏差値出力
printf("偏差値:");
calc_dev_val(points, dev_vals);
for (size_t i = 0; i < SIZE; i++)
{
printf("%.2lf, ", dev_vals[i] + 50.0);
}
printf("\n");
printf("分散:%.2lf\n", calc_dist(dev_vals)); // 分散出力
printf("標準偏差:%.2lf\n", calc_std_dev(dev_vals)); // 標準偏差出力
// バブルソートを実行
bubble_sort(points);
// 並び替え後の全得点出力
printf("並び替え後の得点:");
for (size_t i = 0; i < SIZE; i++)
{
printf("%d, ", points[i]);
}
printf("\n\n");
}