四则运算测试(修改后)

(为了方便看出式子个数,我对程序做了稍加修改,加上了序号。)

一、源代码

#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、在输入不存在余数时,加减符号出现的次数大于乘除,存在缺陷。

posted @ 2015-03-16 07:33  月之空  阅读(148)  评论(0编辑  收藏  举报