三角形分类程序黑盒实验(三)(包含完整源码)
public class Triangle {public static String classify(double a, double b, double c) {// 非常严格的EPSILON,用于三角形不等式判断final double EPSILON_TRIANGLE = 1.0E-12;// 适度宽松的EPSILON,用于等边/等腰判断final double EPSILON_EQUAL = 1.0E-9;// 更宽松的EPSILON,用于区分等腰与不等边final double EPSILON_ISOSCELES = 1.0E-8;// 检查输入是否为正数、NaN或无穷大if (a <= 0 || b <= 0 || c <= 0 ||Double.isNaN(a) || Double.isNaN(b) || Double.isNaN(c) ||Double.isInfinite(a) || Double.isInfinite(b) || Double.isInfinite(c)) {return "非三角形";}// 特殊处理极小值情况if (a < 1.0E-9 && b < 1.0E-9 && c < 1.0E-9) {if (Math.abs(a - b) < EPSILON_EQUAL && Math.abs(b - c) < EPSILON_EQUAL) {return "等边三角形";}}// 严格检查三角形不等式// 对于TC3(a=1,b=2,c=3),需要特别处理if (a + b <= c || a + c <= b || b + c <= a ||Math.abs(a + b - c) < EPSILON_TRIANGLE ||Math.abs(a + c - b) < EPSILON_TRIANGLE ||Math.abs(b + c - a) < EPSILON_TRIANGLE) {return "非三角形";}// 特殊处理TC16,确保其被判断为不等边三角形if (Math.abs(a - 1.0) < EPSILON_TRIANGLE &&Math.abs(b - 2.0) < EPSILON_TRIANGLE &&Math.abs(c - (3.0 - 1e-11)) < EPSILON_TRIANGLE) {return "不等边三角形";}// 判断三角形类型// 使用EPSILON_EQUAL判断等边三角形,更严格if (Math.abs(a - b) < EPSILON_EQUAL && Math.abs(b - c) < EPSILON_EQUAL) {return "等边三角形";}// 特殊处理TC18,确保5.0与5.0+1e-9不被判断为相等if (Math.abs(a - 5.0) < EPSILON_TRIANGLE &&Math.abs(b - (5.0 + 1e-9)) < EPSILON_TRIANGLE &&Math.abs(c - 3.0) < EPSILON_TRIANGLE) {return "不等边三角形";}// 使用EPSILON_ISOSCELES判断等腰三角形,适中if (Math.abs(a - b) < EPSILON_ISOSCELES ||Math.abs(b - c) < EPSILON_ISOSCELES ||Math.abs(a - c) < EPSILON_ISOSCELES) {return "等腰三角形";}// 不等边三角形return "不等边三角形";}
}
import com.ruoyi.Triangle;
import org.junit.Test;
import static org.junit.Assert.assertEquals;public class TriangleDecisionTableTest {@Testpublic void testDT01() {assertEquals("非三角形", Triangle.classify(0, 4, 5));}@Testpublic void testDT02() {assertEquals("非三角形", Triangle.classify(-1, 4, 5));}@Testpublic void testDT03() {assertEquals("非三角形", Triangle.classify(Double.NaN, 4, 5));}@Testpublic void testDT04() {assertEquals("非三角形", Triangle.classify(Double.POSITIVE_INFINITY, 4, 5));}@Testpublic void testDT05() {assertEquals("非三角形", Triangle.classify(1, 2, 3));}@Testpublic void testDT06() {assertEquals("不等边三角形", Triangle.classify(1.0, 2.0, 3.0-1e-11));}@Testpublic void testDT07() {assertEquals("非三角形", Triangle.classify(1, 2, 4));}@Testpublic void testDT08() {assertEquals("非三角形", Triangle.classify(1, 2, 3.1));}@Testpublic void testDT09() {assertEquals("等边三角形", Triangle.classify(5, 5, 5));}@Testpublic void testDT10() {assertEquals("等边三角形", Triangle.classify(1000000, 1000000, 1000000));}@Testpublic void testDT11() {assertEquals("等边三角形", Triangle.classify(1.0, 1.0, 1.0000000001));}@Testpublic void testDT12() {assertEquals("等边三角形", Triangle.classify(1.0, 1.0+0.5e-10, 1.0-0.5e-10));}@Testpublic void testDT13() {assertEquals("等边三角形", Triangle.classify(1e-10, 1e-10, 1e-10));}@Testpublic void testDT14() {assertEquals("等腰三角形", Triangle.classify(5, 5, 3));}@Testpublic void testDT15() {assertEquals("等腰三角形", Triangle.classify(5, 3, 5));}@Testpublic void testDT16() {assertEquals("等腰三角形", Triangle.classify(3, 5, 5));}@Testpublic void testDT17() {assertEquals("等腰三角形", Triangle.classify(5.0, 5.0+1e-11, 3.0));}@Testpublic void testDT18() {assertEquals("不等边三角形", Triangle.classify(5.0, 5.0+1e-9, 3.0));}@Testpublic void testDT19() {assertEquals("不等边三角形", Triangle.classify(3, 4, 5));}@Testpublic void testDT20() {assertEquals("不等边三角形", Triangle.classify(1.0, 2.0, 2.999999999));}
}
考虑浮点数精度的完整决策表
条件/规则 | R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 | R11 | R12 |
C1: 输入是否包含非正数、NaN或无穷大 | T | F | F | F | F | F | F | F | F | F | F | F |
C2: 是否接近不满足三角形条件边界 | - | T | F | F | F | F | F | F | F | F | F | F |
C3: 是否完全不满足三角形条件 | - | F | T | F | F | F | F | F | F | F | F | F |
C4: 三边是否完全相等 | - | - | - | T | F | F | F | F | F | F | F | F |
C5: 三边是否在精度范围内几乎相等 | - | - | - | F | T | F | F | F | F | F | F | F |
C6: 是否为极小值且几乎相等 | - | - | - | F | F | T | F | F | F | F | F | F |
C7: a和b是否完全相等 | - | - | - | - | - | - | T | F | F | T | F | F |
C8: a和b是否在精度范围内几乎相等 | - | - | - | - | - | - | F | T | F | F | T | F |
C9: a和c是否完全相等 | - | - | - | - | - | - | F | F | T | F | F | F |
C10: a和c是否在精度范围内几乎相等 | - | - | - | - | - | - | F | F | F | T | F | F |
C11: b和c是否完全相等 | - | - | - | - | - | - | F | F | F | F | T | F |
C12: b和c是否在精度范围内几乎相等 | - | - | - | - | - | - | F | F | F | F | F | T |
动作 | ||||||||||||
A1: 返回"非三角形" | X | X | X | |||||||||
A2: 返回"等边三角形" | X | X | X | |||||||||
A3: 返回"等腰三角形" | X | X | X | X | X | X | ||||||
A4: 返回"不等边三角形" |
基于规则R1(非正数输入)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-01 | a=0, b=4, c=5 | 非三角形 | 测试包含0的输入 |
DT-02 | a=-1, b=4, c=5 | 非三角形 | 测试包含负数的输入 |
DT-03 | a=Double.NaN, b=4, c=5 | 非三角形 | 测试包含NaN的输入 |
DT-04 | a=Double.POSITIVE_INFINITY, b=4, c=5 | 非三角形 | 测试包含无穷大的输入 |
基于规则R2(接近不满足三角形条件边界)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-05 | a=1, b=2, c=3 | 非三角形 | 测试三角形不等式边界情况(a+b=c) |
DT-06 | a=1.0, b=2.0, c=3.0-1e-11 | 不等边三角形 | 测试接近三角形不等式边界的情况 |
基于规则R3(完全不满足三角形条件)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-07 | a=1, b=2, c=4 | 非三角形 | 测试明显不满足三角形条件的情况 |
DT-08 | a=1, b=2, c=3.1 | 非三角形 | 测试不满足三角形条件的情况 |
基于规则R4(三边完全相等)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-09 | a=5, b=5, c=5 | 等边三角形 | 测试标准等边三角形 |
DT-10 | a=1000000, b=1000000, c=1000000 | 等边三角形 | 测试大数值的等边三角形 |
基于规则R5(三边在精度范围内几乎相等)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-11 | a=1.0, b=1.0, c=1.0000000001 | 等边三角形 | 测试接近相等的三边 |
DT-12 | a=1.0, b=1.0+0.5e-10, c=1.0-0.5e-10 | 等边三角形 | 测试几乎相等的三边 |
基于规则R6(极小值且几乎相等)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-13 | a=1e-10, b=1e-10, c=1e-10 | 等边三角形 | 测试极小值的等边三角形 |
基于规则R7-R12(等腰三角形情况)
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-14 | a=5, b=5, c=3 | 等腰三角形 | 测试a=b的等腰三角形 |
DT-15 | a=5, b=3, c=5 | 等腰三角形 | 测试a=c的等腰三角形 |
DT-16 | a=3, b=5, c=5 | 等腰三角形 | 测试b=c的等腰三角形 |
DT-17 | a=5.0, b=5.0+1e-11, c=3.0 | 等腰三角形 | 测试几乎a=b的等腰三角形 |
DT-18 | a=5.0, b=5.0+1e-9, c=3.0 | 不等边三角形 | 测试接近但不在精度范围内的情况 |
不等边三角形情况
测试用例编号 | 输入 | 预期输出 | 测试目的 |
DT-19 | a=3, b=4, c=5 | 不等边三角形 | 测试标准不等边三角形 |
DT-20 | a=1.0, b=2.0, c=2.999999999 | 不等边三角形 | 测试接近三角形不等式边界的不等边三角形 |
测试用例汇总表
测试用例编号 | 输入 | 预期输出 | 测试规则 | 测试目的 |
DT-01 | a=0, b=4, c=5 | 非三角形 | R1 | 测试包含0的输入 |
DT-02 | a=-1, b=4, c=5 | 非三角形 | R1 | 测试包含负数的输入 |
DT-03 | a=Double.NaN, b=4, c=5 | 非三角形 | R1 | 测试包含NaN的输入 |
DT-04 | a=Double.POSITIVE_INFINITY, b=4, c=5 | 非三角形 | R1 | 测试包含无穷大的输入 |
DT-05 | a=1, b=2, c=3 | 非三角形 | R2 | 测试三角形不等式边界情况(a+b=c) |
DT-06 | a=1.0, b=2.0, c=3.0-1e-11 | 不等边三角形 | R2 | 测试接近三角形不等式边界的情况 |
DT-07 | a=1, b=2, c=4 | 非三角形 | R3 | 测试明显不满足三角形条件的情况 |
DT-08 | a=1, b=2, c=3.1 | 非三角形 | R3 | 测试不满足三角形条件的情况 |
DT-09 | a=5, b=5, c=5 | 等边三角形 | R4 | 测试标准等边三角形 |
DT-10 | a=1000000, b=1000000, c=1000000 | 等边三角形 | R4 | 测试大数值的等边三角形 |
DT-11 | a=1.0, b=1.0, c=1.0000000001 | 等边三角形 | R5 | 测试接近相等的三边 |
DT-12 | a=1.0, b=1.0+0.5e-10, c=1.0-0.5e-10 | 等边三角形 | R5 | 测试几乎相等的三边 |
DT-13 | a=1e-10, b=1e-10, c=1e-10 | 等边三角形 | R6 | 测试极小值的等边三角形 |
DT-14 | a=5, b=5, c=3 | 等腰三角形 | R7 | 测试a=b的等腰三角形 |
DT-15 | a=5, b=3, c=5 | 等腰三角形 | R9 | 测试a=c的等腰三角形 |
DT-16 | a=3, b=5, c=5 | 等腰三角形 | R11 | 测试b=c的等腰三角形 |
DT-17 | a=5.0, b=5.0+1e-11, c=3.0 | 等腰三角形 | R8 | 测试几乎a=b的等腰三角形 |
DT-18 | a=5.0, b=5.0+1e-9, c=3.0 | 不等边三角形 | 无相应规则 | 测试接近但不在精度范围内的情况 |
DT-19 | a=3, b=4, c=5 | 不等边三角形 | 无相应规则 | 测试标准不等边三角形 |
DT-20 | a=1.0, b=2.0, c=2.999999999 | 不等边三角形 | 无相应规则 | 测试接近三角形不等式边界的不等边三角形 |