9065bfa26d18e06adc51e5a43e0cbeb22585f9db
[autotest_mk.git] / sample / triangle / triangle.c
1 /**********************************************************************
2 triangle.c
3 引数として指定された3つの整数が三角形の3辺を表すものとし、
4 次のうちどれであるかをきめるメッセージを印字する。
5     不等辺三角形(scalene triangle)
6     二等辺三角形(isosceles triangle)
7     正三角形(equilateral triangle)
8
9 Glenford J Myers『ソフトウェア・テストの技法』(近代科学社、1980)
10 http://www.amazon.co.jp/dp/4764900599
11 第1章「自己診断テスト」に記載された「自己診断テスト」の仕様を実装
12 **********************************************************************/
13
14 #include <stdio.h>
15 #include <stdlib.h>
16
17 int main(int argc, char *argv[])
18 {
19     int l[3], i;
20     char *check;
21
22     /* 引数が3以外の場合は、エラー終了 */
23     if(argc != 4) {
24         if(argc < 4) {
25             fprintf(stderr, "too few argument.\n");
26         }
27         else if(argc > 4) {
28             fprintf(stderr, "too many argument.\n");
29         }
30         return -1;
31     }
32     /* 引数が自然数かチェック。自然数以外の場合はエラー終了 */
33     for(i = 0; i < 3; i++) {
34         l[i] = strtol(argv[i+1], &check, 10);
35         if(*check != '\0' || l[i] <= 0) {
36             fprintf(stderr, "%s: invalid argument.\n", argv[i+1]);
37             return -1;
38         }
39     }
40     /* 三角不等式により、三角形になるかを判定 */
41     if(l[0] + l[1] <= l[2] || l[1] + l[2] <= l[0] || l[2] + l[0] <= l[1]) {
42         puts("not triangle");
43         return -1;
44     }
45     /* 3辺の長さが等しい場合は、正三角形 */
46     if(l[0] == l[1] && l[1] == l[2] && l[2] == l[0]) {
47         puts("equilateral triangle");
48     }
49     /* 2辺の長さが等しい場合は、二等辺三角形 */
50     else if (l[0] == l[1] || l[1] == l[2] || l[2] == l[0]) {
51         puts("isosceles triangle");
52     }
53     /* それ以外の場合は、不等辺三角形 */
54     else {
55         puts("scalene triangle");
56     }
57     return 0;
58 }