• 四则运算(2)


    一.题目

    要求:
    1题目避免重复
    2可定制(数量/打印方式)
    3可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),是否支持小数(精确到多少位),打印中每行的间隔。

    二设计思路

    解决思路:
    1.避免重复:随机数函数+系统时间产生每一个随机数 ,将每一个式子存储 下来,每次产生式子的时候都检查一遍,若重复则重新 产生。 检查式子的时候用函数实现。
    2.可定制:用for循环来控制数量,具体数量有用户输入;每行输出几个式子 由用户输入,并存储。
    3.控制参数:在程序开始设计界面用来由用户输入要求,将要求存储下来。 参数集统一存储到一起。
    (1)是否有乘除法:随机产生运算符号,将加减乘除存储,cs[0]存储
    (2)是否有括号:用a[1]存储,为1时有括号,为0 时无括号。
    (3)数值范围:用a[2]和啊[3]分别存储最大数和最小数,用a+rand()%b,来实现,操作数的随机生成。
    (4)加减有无负数:用a[3]存储,用if语句判断存储的要求。
    (5)除法有无余数:用a[4]存储,为1时有余数,为0时无余数。用函数 检查每一个式子是否有余数。
    (6)是否支持小数(精确到多少位):用a[5]存储,为0时无小数,为n 时候,是n位小数。
    (7)打印中每行的间隔:用a[6]存储,为0时无间隔,为n时,间隔n行。

    要求较多,并且实现这些功能方法类似,故其中选择了部分功能实现。

    三.源代码

    // 四则运算2.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include<iostream.h>
    #include<time.h>
    #include<stdlib.h>
    typedef struct
    {
    	int first;
    	int second;
    	char ope;
    }equation;
    //***********链表的数据结构***********//
    typedef struct LNode
    {
    	int first_operand;
    	int second_operand;
    	char operat;
    	struct LNode *next;
    }LNode,*LinkList;
    //**********链表初始化***********//
    void InitList_L(LinkList &L)
    {
    	L=new LNode;
    	L->next=NULL;
    }
    //**********链表数据的插入*************//
    void InsertList_L(LinkList &L,equation N)
    {
    	LNode *temp,*head;
    	head=L;
    	temp=new LNode;
    
    	temp->first_operand=N.first;
    	temp->second_operand=N.second;
    	temp->operat=N.ope;
    	temp->next=NULL;
    
    	while(head->next!=NULL)
    	{
    		head=head->next;
    	}
    	head->next=temp;
    
    }
    //*********用户要求的输入***********//
    void require(int &num,int a[])
    {
    	cout<<"请输入四则运算的个数:";
    	cin>>num;
    	cout<<"请输入打印方式(列数):";
    	cin>>a[0];
    	cout<<"请输入数的最小值:";
    	cin>>a[1];
    	cout<<"请输入数的最大值:";
    	cin>>a[2];
    	cout<<"是否有乘除法(有(1)/无(0)):";
    	cin>>a[3];
    	cout<<"打印的时候行之间的间隔是多少行:";
    	cin>>a[4];
    }
    //***********检查是否有重复的式子***********//
    int repeat(LinkList L,equation N)//a是算式的个数,函数返回值是1的话有重复,返回值是0的话无重复
    {
    	int flag=0;//如果有重复的则flag=1,否则为0
    	LNode *temp;
    	temp=L->next;
    
    	while(temp!=NULL)
    	{
    		if((temp->first_operand==N.first)&&(temp->second_operand==N.second)&&(temp->operat==N.ope))//如果有重复的话
    		{
    			flag=1;
    		}
    		temp=temp->next;
    	}
    	return flag;
    }
    //***********链表的输出***********//
    void input_L(LinkList L,int m,int n)//m,是每行的列数,n是每行的间隔
    {
    	LNode *head;
    	head=L->next;
    	int temp=0;
    	while(head!=NULL)
    	{
    		cout<<head->first_operand<<head->operat<<head->second_operand<<"=	";//数据的输出
    		temp++;
    		head=head->next;
    		if(temp%m==0)//打印方式(列数)
    		{
    			for(int i=0;i<n;i++)//间隔
    			{
    				cout<<endl;
    			}
    		}
    	}
    }
    int main()
    {
    	int i,j,num,a[5];//num是式子的个数
    	int c,b,temp;
    	int flag1=1,flag2;//判断是否运行继续生成算式,flag2表示是否有重复的式子
    	char op[4]={'+','-','*','/'};//运算符
    	LinkList L;
    	equation N;
    	srand(time(NULL));
    	for(i=0;i<5;i++)//对数组a初始化
    	{
    		a[i]=0;
    	}
    	while(flag1==1)
    	{
    		require(num,a);
    		InitList_L(L);
    		if(a[3]==0)//判断是否有乘除
    		{
    			op[2]='+';
    			op[3]='-';
    		}
    		c=a[1];
    		b=a[2]+1-a[1];
    		for(i=0;i<num;i++)
    		{
    XH:			N.second=c+rand()%b;//式子的生成
    			N.first=c+rand()%b;
    			j=rand()%4;
    			N.ope=op[j];
    			
    			if(N.ope=='-')//如果是减法的话,则两个操作数调换位置
    			{
    				if(N.first<N.second)
    				{
    					temp=N.first;
    					N.first=N.second;
    					N.second=temp;
    				}
    			}
    			flag2=repeat(L,N);
    			InsertList_L(L,N);//数据进入链表当中
    		        if(flag2==1)//判断是否有重复,若有则重新生成算式
    			{
    				goto XH;
    			}
    		}
    		input_L(L,a[0],a[4]);
    	        cout<<endl<<"是否继续(是(1)/否(0)):";//判断是否继续运行
    		cin>>flag1;
    		if(flag1==1)
    		{
    			system("cls");//清屏
    		}
    		else
    		{
    			cout<<"感谢您的使用!"<<endl;
    		}
    	}
    	return 0;
    }
    

    四.运行结果截图

     

    五、PSP0级 记录表

    周活动总结表

    姓名:于海洋                    日期:2015/3/10

    日期       任务

    听课

    编写程序

    阅读课本

    准备考试

    日总计

    周日

    周一

    周二

         100

       100

    周三

        36

         23

       59

    周四

        40

         2

       42

    周五

         100

        32

       132

    周六

        82

       82

    周总结

        200

        190

        25

       415

                       

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

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

    总计

    平均

    最大

    最小

    以前各周的累计时间  

     

    总计

     200

     190

     25

     415

    平均

     200

     190

     25

     415

    最大

     200

     190

     25

     415

    最小

     200

     190

     25

     415

     

                        

     

     

     

     

     

    时间记录表:

    学生:       于海洋                                             日期:      2015/3/11  

    教师:       王建民                                             课程:          PSP       

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

     3/11

     14:30

     14:53

     23

     看书

     数据结构

     14:53

     15:29

     36

     编程

     四则运算2

     3/12

    16:20

     16:32

    12

    编程

    四则运算2

     16:32

    16:34

    2

    看书

    数据结构

    16:34

    17:02

    28

    编程

    四则运算2

     3/13

    18:20

    18:52

    32

    编程

    四则运算2

    3/14

    9:30

    10:52

    82

    编程

    四则运算2                                                                     

                        

     

     

     

     

     

     

     

     

     

     

    缺陷记录日志:

     

    学生       于海洋   

     

    日期        3/14    

     

    教员       王建民   

     

    程序号  

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复时间

    修复缺陷

     3/14

     1

     1

     编码

    编译

    1min

     描述:链表节点类型LNode声明变量的时候类型声明错误

     2

     2

     编码

    编译

    1min

    描述:在使用函数的时候,参数传递编写错误

     3

     3

    设计

    编译

    3min

    描述:逻辑错误,查看是否有重复的时候,在while循环里的判断条件错误,不是temp->next!=NULL而是temp!=NULL

     4

    3

    设计

    编译

    2min

    描述:逻辑错误,应该是先判断是否有重复然后在往链表中插入数据

    5

    3

    设计

    编译

    3min

    描述:逻辑错误,应该是先判断是否有重复然后在往链表中插入数据

    6

    4

    设计

    编译

    1min

    描述:结果中有负数,二年级的学生还没有学过负数。在生成算式的时候需要检查一遍,当时减法的时候,若第一操作数小于第二操作数则交换两个数,使大数减去小数。

                 

  • 相关阅读:
    【BZOJ1023】仙人掌图(SHOI2008)-圆方树+DP+单调队列
    【BZOJ4816】数字表格(SDOI2017)-莫比乌斯反演+数论分块
    【BZOJ3529】数表(SDOI2014)-莫比乌斯反演+树状数组
    【BZOJ3714】Kuglarz(PA2014)-最小生成树
    javascript div元素后追加节点
    php多文本框提交
    有几数组表单,js怎么获得数组并动态相加输出到文本框
    SqlCommand.Parameters.add()方法
    ASP.net后台弹出消息对话框的方法!【转】
    Access中的SELECT @@IDENTITY
  • 原文地址:https://www.cnblogs.com/menglikanhualuo/p/4338039.html
Copyright © 2020-2023  润新知