四则运算二(修改后)

一:设计思想:1、首先将已生成的算式进行保存利用链表,可用检查链表是否相等的方式增加一个检查生成每个链表是否完全相等的函数,在循环过程生成中调用该函数,将新生成算式与已生成算式进行比较,如果重复则删除该式。
2、增加一个参数,可供使用者输入,此为循环输出的控制条件,输出使用者想要的数量,并打印。
3、增加用户选择项,选择后进入不同的输出方式,通过逐个对上述3中的条件进行判断,确定输出条件,选择自己想要的输出方式。
(是否有乘除法/你所需要的数值范围/除法有无余数/打印中每行的间隔)

二、源代码

#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<<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<<suijis1<<a<<suijis2<<"="<<endl;
            }
        }
        
    }
 }

三、结果截图

四、实验总结

   想编一个完美的程序真的好难!小错误还容易解决,但如果遇到一个麻烦的错误,或自己没找到的错误,那将很费时间。所以,编程前的蓝图很重要,框架写好了,那些不容易发现的错误就会变少,会更节省时间。

   这里我用到的主要是循环和条件语句,因为生成条件只需回答是或者否所以用条件语句十分方便。输出数量主要用循环来控制,循环输出式子。在这里我定义了两个函数,一个输出四则运算式子,另一个只输出加减法。在下面是否有乘除法时,直接调用两者之一就行。数值的范围主要用随机生成数字式子来控制。没行间隔用循环输出回车来实现。有无余数主要是判断,同样调用上面两个函数,存在余数则去掉用加减函数。在这里要感谢帮助我的同学,实现避免重复时费了很大劲,最后在同学的帮助下,用链表解决了这一问题,数据结构要学好啊,要不有思路却不知道怎么去实现。将生成的式子用链表存储起来,依次比较,重复了则返回重新生成。

五、表格

                             周活动总结表

姓名:高扬                                日期:2015.3.14

日期\任务

听课(分)

编写程序(分)

阅读课本(分)

准备考试(分)

 

 

日总计(分)

周日

 

 

 

 

 

 

 

周一

 

 

 

 

 

 

 

周二

 400

 

 30

 

 

 

 430

周三

 100

 30

 20

 

 

 

 150

周四

 300

 20

 20

 

 

 

 340

周五

 200

 30

 15

 

 

 

 245

周六

 

 40

 30

 

 

 

 70

周总结(分)

 1000

 120

 115

 

 

 

 1235

阶段时间和效率                                         周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间                                                      

总计

 

 

 

 

 

 

 

平均

 

 

 

 

 

 

 

最大

 

 

 

 

 

 

 

最小

 

 

 

 

 

 

 

以前各周累计时间                                                                          

总计

  1000

120 

 115

 

 

 

1235 

平均

 1000

120 

115 

 

 

 

1235 

最大

 1000

 120

115 

 

 

 

1235 

最小

 1000

120 

115 

 

 

 

1235 

 

 

                                 时间记录表:

学生         高扬                                           日期        2015.3.14   

教师        王建民                                             课程           PSP       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 2015.3.11

 8:00

 9:50

 10

 100

听课

 计算机网络课程

 

 13:00

13:20 

 

 20

读书

 阅读《梦断代码》

 

19: 34

 20:00

 

 26

编写程序 

考虑编程思路,写框架

 2015.3.12

10:10

12:00

10

100

听课

计算机接口技术课

 

14:00

15:50

10

100

听课

嵌入式开发技术上课

 

 16:30

 16:50

 

 20

 看书

 阅读《梦断代码》

 

 21:10

 21:30

 

 20

编写程序

 实现部分功能

2015.3.13

8:00

9:50

10

100

听课

软件工程课

 

10:10

12:00

10

100

听课

操作系统课

 

12:45

13:00

 

15

看书

阅读《梦断代码》

 

20:15

20:45

 

30

编写程序

实现部分功能

2015.3.14

10:15

11:00

 

45

编写程序

 修改错误完善程序

 

 

 

 

 

 

缺陷记录日志: 

学生       高扬  

日期       2015.3.14   

教员       王建民   

程序号           

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

2015.3.12

 1

 

 编码

编译 

 1min

 

 描述:缺少分号

2015.3.12

 2

 

 编码

 编译

 1min

 

 描述:参数类型定义错误

 2015.3.13

 3

 

 编码

 编译

 1min

 

 描述:函数类型声明错误

2015.3.14

 4

 

 编码

执行

 2min

 

 描述:对随机数生成范围的控制条件写错,导致范围出错

2015.3.14

5

 

 编码

执行

 2min

 

 描述:对函数调用不完善,加以补充

 

 

 

posted @ 2015-03-15 13:27  月之空  阅读(133)  评论(0编辑  收藏  举报