四则运算(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

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

             

原文地址:https://www.cnblogs.com/menglikanhualuo/p/4338039.html