三角形の判断のテストケース
よくあるテストケースの問題。
3つのdoubleを引数に取り、正三角形か二等辺三角形かその他の三角形かを返す関数を作成せよ。
三角形の要件を満たさない場合は非三角形とせよ。
11ケース考えればいいそうだが、以下では適当に359ケースも作ってみた。
public class Test { public enum Triangle {非三角形, その他の三角形, 二等辺三角形, 正三角形}; /// <summary> /// 正三角形か二等辺三角形かその他の三角形かを求める /// 三角形の要件を満たさない場合は非三角形となる /// </summary> public static Triangle CheckTriangle(double d1, double d2, double d3) { double[] length = {d1,d2,d3}; foreach (double d in length) if (double.IsNaN(d) || double.IsInfinity(d) || d <= 0) return Triangle.非三角形; Array.Sort(length); if (length[0] == length[1]) return length[1] == length[2] ? Triangle.正三角形 : (length[0] + length[1] > length[2] ? Triangle.二等辺三角形 : Triangle.非三角形); return length[1] == length[2] ? Triangle.二等辺三角形 : (length[0] + length[1] > length[2] ? Triangle.その他の三角形 : Triangle.非三角形); } /// <summary>359ケースのテスト</summary> public static bool CheckTriangleTest() { double[] dd = {-1,0,double.Epsilon,2,double.MaxValue, double.PositiveInfinity,double.NaN}; int[] ii = {3,0,0, 0,2,0, 0,0,2, 0,2,0, 2,3,0, 0,0,2, 0,0,2, 0,0,2, 2,2,3}; int i = 0; foreach (double d1 in dd) { bool b1 = double.IsNaN(d1) || double.IsInfinity(d1) || d1 <= 0; foreach (double d2 in dd) { bool b2 = double.IsNaN(d2) || double.IsInfinity(d2) || d2 <= 0; foreach (double d3 in dd) { bool b3 = double.IsNaN(d3) || double.IsInfinity(d3) || d3 <= 0; Triangle res = b1 || b2 || b3 ? Triangle.非三角形 : (Triangle)ii[i++]; if (CheckTriangle(d1,d2,d3) != res) return false; } } } double e = double.Epsilon, m4 = double.MaxValue*0.4, m6 = double.MaxValue*0.6, m = double.MaxValue; double[,] ddd = {{2,3,e}, {m,e,m6}, {2,2,3}, {4,2,2}, {2,3,2}, {2,3,3}, {2,4,3}, {2,4,2}, {3,m,2}, {m4,2,m}, {m4,m4,m6}, {m4,m4,m}, {m4,m6,m6}, {m4,m6,m}, {m4,m,m}}; int[] iii = {0,0,2,0,2,2,1,0,0,0,2,0,2,0,2}; for (int k=0;k<ddd.GetLength(0);++k) if (CheckTriangle(ddd[k,0],ddd[k,1],ddd[k,2]) != (Triangle)iii[k]) return false; return true; } static void Main(string[] args) { Console.WriteLine(CheckTriangleTest()); } }
よく考えてCheckTriangleを作らないと、全ケース通らないと思う。