标签:
思路:编写的程序只有一个主函数,并且每个要求的实现方式都是一层层嵌套的,也都是使用同样的方法,先用while对不符合的输入进行提示,再用if...else...分支结构选择。所以则以(是否有乘除法—是否是否有负数—数值范围—打印方式—输出题目)为单元进行测试。
按照BICEP原则:
Right-结果是否正确?
B-是否所有的边界条件都是正确的?
I-能查一下反向关联吗?
C-能用其他手段交叉检查一下结果吗?
E-你是否可以强制错误条件发生?
P-是否满足性能要求?
源代码:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL)); //题目避免重复
int value1,value2,op; //两个整数,运算符
int amount,mount; //题目数量
int erji; //二级运算,即乘除法
int number; //正负数
int range; //数值范围
//定制题目数量
cout<<"请定制题目的数量(填一个>0的整数):";
cin>>amount;
while(amount<=0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个>0的整数):";
cin>>amount;
}
//题目中是否有乘除法
cout<<"题目中是否有乘除法(填0为是,1为否):";
cin>>erji;
while(erji!=0 && erji!=1 )
{
cout<<"不合法!"<<endl<<"请重新输入(填0为有乘除法,1为无乘除法):";
cin>>erji;
}
if(erji==0)
{
//题目中是否有负数参与运算
cout<<"题目中是否有负数(填0为是,1为否):";
cin>>number;
while(number!=0 && number!=1)
{
cout<<"不合法!"<<endl<<"请重新输入(填0为有负数,1为无负数):";
cin>>number;
}
if(number==0)
{
//题目中参与运算的数值范围
cout<<"请输入数值的最小边界(填一个<0的整数):";
cin>>range;
while(range>=0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个<0的整数):";
cin>>range;
}
//打印方式
cout<<"每行打印题目的数量(填一个>0的整数):";
cin>>mount;
while(mount<=0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个>0的整数):";
cin>>mount;
}
//输出题目
cout<<endl<<"共"<<amount<<"道包含乘除法的负数运算(范围:"<<range<<"~0)"<<endl;
for(int i=0;i<amount;i++)
{
cout<<"("<<i+1<<")";
value1=rand()%range+range/2;
value2=rand()%range+range/2;
op=rand()%4;
switch(op)
{
case 0:
cout<<value1<<" + "<<value2<<"="<<"\t\t"; //加
break;
case 1:
cout<<value1<<" - "<<value2<<"="<<"\t\t"; //减
break;
case 2:
cout<<value1<<" x "<<value2<<"="<<"\t\t"; //乘
break;
case 3:
cout<<value1<<" ÷ "<<value2<<"="<<"\t\t"; //除
break;
}
if((i+1)%mount==0)
{
cout<<endl;
}
}
}
else
{
cout<<"请输入数值的最大边界(填一个>0的整数):";
cin>>range;
while(range<0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个>0的整数):";
cin>>range;
}
cout<<"每行打印题目的数量(每行):";
cin>>mount;
cout<<endl<<"共"<<amount<<"道包含乘除法的非负数运算(范围:0~"<<range<<")"<<endl;
for(int i=0;i<amount;i++)
{
cout<<"("<<i+1<<") ";
value1=rand()%range;
value2=rand()%range;
op=rand()%4;
switch(op)
{
case 0:
cout<<value1<<" + "<<value2<<"="<<"\t\t"; //加
break;
case 1:
cout<<value1<<" - "<<value2<<"="<<"\t\t"; //减
break;
case 2:
cout<<value1<<" x "<<value2<<"="<<"\t\t"; //乘
break;
case 3:
cout<<value1<<" ÷ "<<value2<<"="<<"\t\t"; //除
break;
}
if((i+1)%mount==0)
{
cout<<endl;
}
}
}
}
else
{
cout<<"题目中是否有负数(填0为是,1为否):";
cin>>number;
while(number!=0 && number!=1)
{
cout<<"不合法!"<<endl<<"请重新输入(填0为有负数,1为无负数):";
cin>>number;
}
if(number==0)
{
cout<<"请输入数值的最小边界(填一个<0的整数):";
cin>>range;
while(range>=0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个<0的整数):";
cin>>range;
}
cout<<"每行打印题目的数量(每行):";
cin>>mount;
cout<<endl<<"共"<<amount<<"道不包含乘除法的负数运算(范围:"<<range<<"~0)"<<endl;
for(int i=0;i<amount;i++)
{
cout<<"("<<i+1<<") ";
value1=rand()%range+range/2;
value2=rand()%range+range/2;
op=rand()%2;
switch(op)
{
case 0:
cout<<value1<<" + "<<value2<<"="<<"\t\t"; //加
break;
case 1:
cout<<value1<<" - "<<value2<<"="<<"\t\t"; //减
break;
}
if((i+1)%mount==0)
{
cout<<endl;
}
}
}
else
{
cout<<"请输入数值的最大边界(填一个>0的整数):";
cin>>range;
while(range<0)
{
cout<<"不合法!"<<endl<<"请重新输入(填一个>0的整数):";
cin>>range;
}
cout<<"每行打印题目的数量(每行):";
cin>>mount;
cout<<endl<<"共"<<amount<<"道不包含乘除法的非负数运算(范围:0~"<<range<<")"<<endl;
for(int i=0;i<amount;i++)
{
cout<<"("<<i+1<<") ";
value1=rand()%range;
value2=rand()%range;
op=rand()%2;
switch(op)
{
case 0:
cout<<value1<<" + "<<value2<<"="<<"\t\t"; //加
break;
case 1:
cout<<value1<<" - "<<value2<<"="<<"\t\t"; //减
break;
}
if((i+1)%mount==0)
{
cout<<endl;
}
}
}
}
return 0;
}
设计单元测试计划及测试结果:
(0)17、0、1、64、1
这个是完全按照提示的要求输入,得到了预想的结果。
(1)null、null、null、null、null
全为空,这必然不满足条件,并且我的程序在第一次输入null时不但没有报错,还不能继续执行。找到bug,进行修改。
(2)0、0、0、0、0
首先题目不能为0,所以会出现提示重新输入;其次是打印方式输入0(即每行0题)不符合常理却没有报错提示,发现bug进行修改。
修改后
(3)1、0、0、-9、0
出现提示。
(4)1、1、1、1、1
无规律都取1,也是符合要求的。
(5)-22、-22、-22、-22、-22
很明显,题目数量不能为负数,有报错提示;是否有乘除法只能有0或1两种情况,故有报错提示;有无负数同理;打印方式也不能每行题目数量为非整数,有报错提示。
(6)a、b、c、d、e
这些也是不符合要求的输入,应该给出提示。
总结:测试数据能让我们发现很多不足,不断修改完善,还提升能力。
标签:
原文地址:http://www.cnblogs.com/mumulucky/p/4340388.html