(为了方便看出式子个数,我对程序做了稍加修改,加上了序号。)
一、源代码
#include<iostream.h> #include <stdlib.h> #include<time.h> char fuhao1()//构造自动随机生成符号"+、-、*、/"的函数 { int fuhaos1; char a; fuhaos1=rand()%4;//取随机数 switch(fuhaos1)//通过判断随机数值选择符号 { case 0:a='+';break; case 1:a='-';break; case 2:a='*';break; case 3:a='/';break; } return a; } char fuhao2()//构造自动随机生成符号"+、-"的函数 { int fuhaos2; char a; fuhaos2=rand()%2;//取随机数 switch(fuhaos2)//通过判断随机数值选择符号 { case 0:a='+';break; case 1:a='-';break; } return a; } typedef struct LNode//单链表存储结构,为实现避免重复 { int first_1; int second_2; char ope; LNode *next; }LNode,*LinkList; void Initlist(LinkList &L)//构造一个空的单链表L,为实现避免重复 { L=new LNode; L->next=NULL; } void Insert(LinkList &L,int f,char op,int s)//插入数据的函数 { LNode *temp,*head; temp=new LNode; head=L; temp->first_1=f; temp->second_2=s; temp->ope=op; temp->next=NULL; while(head->next!=NULL) { head=head->next; } head->next=temp; } int ifrepeat(LinkList L,int a,char b,int c)// 是否有重复 { LNode *head; int flag=0; head=L->next; while(head!=NULL) { if((head->first_1==a)&&(head->ope==b)&&(head->second_2==c)) flag=1; head=head->next; } return flag; } void main() { LinkList L; int i,j,suijis1,suijis2,shul,fanwei1,fanwei2,jiange,rep; char fuh,yushu; char a; Initlist(L); cout<<"***************欢迎进行小学生运算测试*******************"<<endl; cout<<"请对您所需要的题目类型进行选择:"<<endl; cout<<"是否有乘除法(y/n):"<<endl;//输出所需要的选择条件,并输入对应参数 cin>>fuh; cout<<"请输入你所需要的数值范围(最小最大值):"<<endl; cin>>fanwei1; cin>>fanwei2; cout<<"请输入打印中每行的间隔:"<<endl; cin>>jiange; cout<<"请输入除法有无余数(y/n)"<<endl; cin>>yushu; cout<<"请输入你所需要产生的题目数:"<<endl; cin>>shul; srand(time(NULL));//生成随机数的时候根据系统时间变化而变化 for(i=0;i<shul;i++)//循环输出所需的题目数量 { for(j=0;j<jiange;j++)//控制题目行间隔 { cout<<endl; } XH: if(yushu=='y')//判断是否存在余数 { suijis1=fanwei1+rand()%(fanwei2-fanwei1+1);//生成随机数一 if(fuh=='y')//判断是否有乘除号 a=fuhao1(); else a=fuhao2(); suijis2=fanwei1+rand()%(fanwei2-fanwei1+1);//生成随机数二 rep=ifrepeat(L,suijis1,a,suijis2); if(rep==1) goto XH; else { Insert(L,suijis1,a,suijis2);//插入链表 cout<<"("<<i+1<<")"<<suijis1<<a<<suijis2<<"="<<endl; } } else { suijis1=fanwei1+rand()%(fanwei2-fanwei1+1);//生成随机数一 suijis2=fanwei1+rand()%(fanwei2-fanwei1+1);//生成随机数二 if(suijis1%suijis2!=0)//判断是否存在余数 { a=fuhao2();//有余数则随机生成+、-符号运算 } else { if(fuh=='y')//判断是否有乘除号 a=fuhao1(); else a=fuhao2();;//没有余数则随机生成四则运算 } rep=ifrepeat(L,suijis1,a,suijis2); if(rep==1) goto XH; else { Insert(L,suijis1,a,suijis2);//调用检查是否重复的函数 cout<<"("<<i+1<<")"<<suijis1<<a<<suijis2<<"="<<endl; } } } }
二、测试计划及结果
1、首先检查题目数量,分别输入生成10个和10000个题目,取范围0-10按说取值范围生成10000个应该报错,但程序并未出现该情况,可能检查重复存在缺陷。之后用边界来检测,取范围(1,1),生成五个式子,按说如果重复才能实现,程序在生成四个式子后便停止了,说明检查重复正确,只是缺少报错机制。
输入数量为10000:
边界为(1,1)
2、在生成式子中有零作为除数,缺少了一个排除机制,程序不够完善。在小个数内不会报错,也未检查出重复。
3、检查是否输出程序符合客户要求,输入y存在乘除法,输入n不存在(由于条件时是否为y,所以输入其他字符也不会输出乘除法)。
4、在输入不存在乘除法时,仍会提问是否有余数,程序有待完善。
5、输入范围中存在负数时,负数出现时不会加括号,导致式子不规范。
6、在输入不存在余数时,加减符号出现的次数大于乘除,存在缺陷。