Pan*_*rei 0 c c++ testing integration-testing
作为筛选面试的一部分,我得到了以下问题:
编写一个函数,接收三角形边长的三个整数输入,并返回四个值之一,以确定三角形类型(1 =斜角,2 =等腰,3 =等边,4 =误差).假设另一个开发人员编写了该函数,为该函数生成测试用例.
我的回答是:
#define ERROR 4
#define EQUILATERAL 3
#define ISOSCELES 2
#define SCALENE 1
int detemineTriangle(int x, int y, int z)
{
if((x<=0) || (y<=0) || (z<=0))
return ERROR;
if((x==y) || (x==z) || (y==z))
{
if((x==y) && (y==z))
return EQUILATERAL;
else
return ISOSCELES;
}
return SCALENE;
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
detemineTriangle (0,0,0); //error
detemineTriangle (2,2,2); //equilateral
detemineTriangle (3,3,1); //isosceles
detemineTriangle (1,3,3); //isosceles
detemineTriangle (3,1,3); //isosceles
detemineTriangle (1,2,3); //scalene
detemineTriangle (-1,2,3); //error scalene
detemineTriangle (1,-2,3); //error scalene
detemineTriangle (1,2,-3); //error scalene
detemineTriangle (-2,-2,-2); //error equilateral
detemineTriangle (-2,5,-2); //error isosceles
detemineTriangle (-2,-2,5); //error isosceles
detemineTriangle (5,-2,-2); //error isosceles
//looking for overflows/underflows
detemineTriangle (INT_MAX,INT_MAX,INT_MAX);
detemineTriangle (INT_MAX,1,1);
detemineTriangle (1,INT_MAX,1);
detemineTriangle (1,1,INT_MAX);
detemineTriangle (-INT_MAX,-INT_MAX,-INT_MAX);
detemineTriangle (-INT_MAX,1,1);
detemineTriangle (1,-INT_MAX,1);
detemineTriangle (1,1,-INT_MAX);
//boundary tests
detemineTriangle(1,1,1)
detemineTriangle(0,0,0)
detemineTriangle(-1,-1,-1)
detemineTriangle (0,10,10);
detemineTriangle (1,10,10);
detemineTriangle (-1,10,10);
detemineTriangle (10,0,10);
detemineTriangle (10,1,10);
detemineTriangle (10,-1,10);
detemineTriangle (10,10,0);
detemineTriangle (10,10,1);
detemineTriangle (10,10,-1);
//checking thread safety
a =detemineTriangle (10,10,10);
b =detemineTriangle (10,10,10);
//a==b function does not appear to depend on global or static variables
Run Code Online (Sandbox Code Playgroud)
你觉得这个答案有什么问题吗?提前致谢.
你也应该检查边长.如您所知,2边的总长度必须大于最后边的长度.所以你也应该检查这样的事情:
if(x+y<=z || x+z<=y || z+y<=x)
return ERROR;
Run Code Online (Sandbox Code Playgroud)
UPD:这是完整的解决方案(包括溢出检查):
inline bool isSidesOverflow(int a, int b)
{
return b > INT_MAX - a;
}
int detemineTriangle(int x, int y, int z)
{
if((x<=0) || (y<=0) || (z<=0)) return ERROR;
// If all sides are equal and greater than 0 - no need to check overflow and validness.
if(x == y && y == z) return EQUILATERAL;
//Check overflow now
if(isSidesOverflow(x,y) || isSidesOverflow(x,z) || isSidesOverflow(y,z)) return ERROR;
//Check if it's valid triangle
if(x+y<=z || x+z<=y || z+y<=x) return ERROR;
if((x==y) || (x==z) || (y==z)) return ISOSCELES;
return SCALENE;
}
Run Code Online (Sandbox Code Playgroud)
(没编译,随意通过评论报告错误)
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |