回答編集履歴

1

追記

2017/09/03 11:44

投稿

LouiS0616
LouiS0616

スコア35660

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
+ 配列を用いて、世代ごとに評価の境目を管理すると良いでしょう。