编程之美:第四章 数字之趣 4.8三角形测试用例

/*
三角形测试用例:
输入三角形的三条边长,判断是否能构成一个三角形(不考虑退化三角形,即面积为0的三角形),是什么样的三角形(直角,锐角,钝角,等边,等腰)

函数声明:byte GetTriangleType(int,int,int)
1如何用一个byte来表示各种输出情况
2如果你是一名测试工程师,应如何写测试用例来完成功能测试?

问题1的解法:
分为
图形{非三角形
    {三角形{直角三角形
           {锐角三角形
		   {钝角三角形
		   {等边三角形
		   {等腰三角形
一个byte可以表示0~255共256种状态,
但是注意一个直角三角形同时也可能是等腰三角形,如果要描述得更精确,需要扩展编码。
7		6		5		4		3		2		1		0
三角                    直角    锐角    钝角    等边    等腰
用每一位表示一种状态

问题2的解法:
测试分为3个方面:
1正常输入,2非法输入,3边界值输入

预期输入:a,b,c(三个数值,代表三条边的长度)

1程序在正常输入下的测试
用例id				输入				预期输出				描述
1					(4,1,2)			00000000				非三角形(全0表示非三角形,最高位为1表示三角形)
2					(5,5,5)			10001011                等边三角形
3					(2,2,3)			10000001                等腰三角形
4					(3,4,5)			10010000                直角三角形
5					(2,3,4)			10000100				钝角三角形
6					(100,99,2)		10001000                钝角三角形

非法输入:
用例id				输入				预期输出				描述
8					(0,1,2)			00000000				0值
9					(-1,1,2)			00000000				负值
10					(a,1,2)			00000000				类型错误

边界输入:
用例id				输入				预期输出				描述
11					(50,50,1)			10000001				等腰三角形
12					(50,50,2)			10000001				等腰三角形
13					(100,100,99)		10000001				等腰三角形
14					(100,100,100)		10001011				等边三角形
15					(50,50,100)		00000000				非三角形
16					(1,1,1)			10001011				等边三角形
17					(1,1,2)			00000000				非三角形
18					(1,1,99)			00000000				非三角形
19					(1,1,100)			00000000				非三角形

扩展问题:
1如果三角形各个边长是浮点数,测试用例会有什么变化
2如果你负责测试文本编辑软件Word的"另存为。。。"功能,你能写出多少有条理,有组织的测试

输入:
4 1 2

输出:
非三角形
*/

/*
关键:
1 7		6		5		4		3		2		1		0
三角                    直角    锐角    钝角    等边    等腰
2 char rectangleTest(int a,int b,int c)//这里完全封装,这样主调函数就不用管里面发生什么,只需要做传参数,提高封装性,参数检查也不要放在process里面
3 //判断是锐角三角形,我们根据余弦定理,a*a = b*b + c*c - 2b*c*cosA,最长边对应的角最大,只需要求出较小的两边的平方和 - 最大边的平方=0,直角,>0钝角
	int iRes = iMin*iMin + iMid*iMid - iMax*iMax;
	if(0 == iRes)//判断是否是直角三角形,将从低到高,第5位设置为1,即让0000 0000 与 1001 0000或即可
	{
		byte |= 10010000;
		printf("直角");
	}
	else if(iRes > 0)
	{
		byte |= 10001000;
		printf("锐角");

*/

#include <stdio.h>

void print(char byte)
{
	//if((byte | 0) == 0)
	//{
	//	printf("00000000 非三角形\n");
	//}
	//else if()
}

int min(int a,int b,int c)
{
	int iMin = a < b ? a : b;
	return iMin < c ? iMin : c;
}

int max(int a,int b,int c)
{
	int iMax = a > b ? a : b;
	return iMax > c ? iMax : c;
}
/*
7		6		5		4		3		2		1		0
三角                    直角    锐角    钝角    等边    等腰
*/
char rectangleTest(int a,int b,int c)//这里完全封装,这样主调函数就不用管里面发生什么,只需要做传参数,提高封装性,参数检查也不要放在process里面
{
	char byte;
	byte &= 0;//与0求与,结果自然为0
	int iLen = sizeof(char);
	if(a <= 0 || b <= 0 || c <= 0 || a + b <= c || a + c <= b || b + c <= a)//非三角形
	{
		printf("非三角形\n");
		return byte;
	}
	int iMin = min(a,b,c);
	int iMax = max(a,b,c);
	int iMid = a + b + c - iMin - iMax;
//判断是锐角三角形,我们根据余弦定理,a*a = b*b + c*c - 2b*c*cosA,最长边对应的角最大,只需要求出较小的两边的平方和 - 最大边的平方=0,直角,>0钝角
	int iRes = iMin*iMin + iMid*iMid - iMax*iMax;
	if(0 == iRes)//判断是否是直角三角形,将从低到高,第5位设置为1,即让0000 0000 与 1001 0000或即可
	{
		byte |= 10010000;
		printf("直角");
	}
	else if(iRes > 0)
	{
		byte |= 10001000;
		printf("锐角");
	}
	else//判断钝角三角形
	{
		byte |= 10000100;
		printf("钝角");
	}
	if( iMin==iMid && iMid==iMax)//判断是等边三角形,异或10000010
	{
		byte |= 10000010;
		printf("等边");
	}
	if((iMin == iMid && iMid != iMax) || (iMid == iMax && iMin != iMid))//判断是等腰三角形,异或10000001
	{
		byte |= 10000001;
		printf("等腰");
	}
	printf("三角形\n");
	return byte;
}

void process()
{
	int a,b,c;
	char byte;
	while(EOF != scanf("%d %d %d",&a,&b,&c))
	{
		byte = rectangleTest(a,b,c);
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

    原文作者:天地一扁舟
    原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47187955
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞