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