サンプルの三角形判定プログラムの仕様を整理
[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     for(i = 0; i < 3; i++) {
33         /* 引数を整数に変換 */
34         l[i] = strtol(argv[i+1], &check, 10);
35         /* 整数以外の場合はエラー終了 */
36         if(*check != '\0') {
37             fprintf(stderr, "%s: not integer\n", argv[i+1]);
38             return -1;
39         }
40         /* 0未満の場合はエラー終了 */
41         if(l[i] < 0) {
42             fprintf(stderr, "%s: less than zero\n", argv[i+1]);
43             return -1;
44         }
45     }
46     /* 三角不等式により、三角形になるかを判定 */
47     if(l[0] + l[1] <= l[2] || l[1] + l[2] <= l[0] || l[2] + l[0] <= l[1]) {
48         puts("not triangle");
49         return -1;
50     }
51     /* 3辺の長さが等しい場合は、正三角形 */
52     if(l[0] == l[1] && l[1] == l[2] && l[2] == l[0]) {
53         puts("equilateral triangle");
54     }
55     /* 2辺の長さが等しい場合は、二等辺三角形 */
56     else if(l[0] == l[1] || l[1] == l[2] || l[2] == l[0]) {
57         puts("isosceles triangle");
58     }
59     /* それ以外の場合は、不等辺三角形 */
60     else {
61         puts("scalene triangle");
62     }
63     return 0;
64 }