回答編集履歴
1
追記
test
CHANGED
@@ -19,3 +19,159 @@
|
|
19
19
|
他の問題は、少なくとも上記の改変後は再現できません。
|
20
20
|
|
21
21
|
なぜhikaku関数が呼び出されていないと判断したのでしょうか?
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
---
|
26
|
+
|
27
|
+
蛇足かもしれないですが、コードの良くない点をいくつか挙げます。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
**構造体の使い方**
|
32
|
+
|
33
|
+
まず名前の記法。構造体の名前が全部小文字ってことはあんまりないかと思います。
|
34
|
+
|
35
|
+
C言語っぽくUPPER_SNAKE_CASEで書くか、C++を見据えてPascalCaseじゃないかと。
|
36
|
+
|
37
|
+
ぱっと見て普通の変数と見分けられる方が何かと便利です。
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
また、typedefを適宜用いると、毎回毎回structと書かずに済みます。
|
42
|
+
|
43
|
+
```C
|
44
|
+
|
45
|
+
typedef struct {
|
46
|
+
|
47
|
+
int sex;
|
48
|
+
|
49
|
+
int age;
|
50
|
+
|
51
|
+
double height;
|
52
|
+
|
53
|
+
double weight;
|
54
|
+
|
55
|
+
} Human;
|
56
|
+
|
57
|
+
```
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
勝手にタグ名も変えちゃいました。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
**値自体に意味がない定数**
|
66
|
+
|
67
|
+
ご提示のコードでは、男性を1、女性を0として区別しています。
|
68
|
+
|
69
|
+
このようなときは、列挙体を用いるときれいに書けます。
|
70
|
+
|
71
|
+
```C
|
72
|
+
|
73
|
+
enum SEX {
|
74
|
+
|
75
|
+
MAN, WOMAN,
|
76
|
+
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
bool isMan(Human *human) {
|
82
|
+
|
83
|
+
return human->sex == MAN;
|
84
|
+
|
85
|
+
}
|
86
|
+
|
87
|
+
```
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
なお、boolを使うには`stdbool.h`をインクルードしてください。
|
92
|
+
|
93
|
+
...cppとしてコンパイルしているならそのままでも使えますが。
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
**排他的な条件が何度も評価されている**
|
98
|
+
|
99
|
+
else if使いましょう。
|
100
|
+
|
101
|
+
```C
|
102
|
+
|
103
|
+
if(inAge(human, 15, 17)) {
|
104
|
+
|
105
|
+
...
|
106
|
+
|
107
|
+
}
|
108
|
+
|
109
|
+
else if(inAge(human, 18, 39)) {
|
110
|
+
|
111
|
+
...
|
112
|
+
|
113
|
+
}
|
114
|
+
|
115
|
+
...
|
116
|
+
|
117
|
+
```
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
**煩雑な条件式**
|
122
|
+
|
123
|
+
例えば次のような関数を定義するだけで、一気に見通しが良くなります。
|
124
|
+
|
125
|
+
```C
|
126
|
+
|
127
|
+
bool inAge(Human *human, int lower, int upper) {
|
128
|
+
|
129
|
+
return lower <= human->age && human->age <= upper;
|
130
|
+
|
131
|
+
}
|
132
|
+
|
133
|
+
```
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
『〇〇世代』と表現できる世代なら、専用の関数を作ってもいいでしょう。
|
138
|
+
|
139
|
+
```C
|
140
|
+
|
141
|
+
bool isTeenager(Human *human) {
|
142
|
+
|
143
|
+
return inAge(human, 13, 19);
|
144
|
+
|
145
|
+
}
|
146
|
+
|
147
|
+
```
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
BMIに関しても同様です。
|
152
|
+
|
153
|
+
[ネットで見つけた表](https://www.hghprescription.com/wp-content/uploads/2017/06/bmi-table.png)を参考にすると、こんな感じかな?
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
```C
|
158
|
+
|
159
|
+
bool isUnderweight(Human *);
|
160
|
+
|
161
|
+
bool isHealthyWeight(Human *);
|
162
|
+
|
163
|
+
bool isOverweight(Human *);
|
164
|
+
|
165
|
+
bool isObese(Human *);
|
166
|
+
|
167
|
+
bool isSeverelyObese(Human *);
|
168
|
+
|
169
|
+
bool isMorbidlyObese(Human *);
|
170
|
+
|
171
|
+
```
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
**同じことを何度も書きすぎ**
|
176
|
+
|
177
|
+
配列を用いて、世代ごとに評価の境目を管理すると良いでしょう。
|