一.题目
要求:
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<<"=\t";//数据的输出
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 |
|
||||||
|
描述:结果中有负数,二年级的学生还没有学过负数。在生成算式的时候需要检查一遍,当时减法的时候,若第一操作数小于第二操作数则交换两个数,使大数减去小数。 |
||||||||||||
原文:http://www.cnblogs.com/menglikanhualuo/p/4338039.html