结对项目—四则运算
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 四则运算生成 |
组员 | 学号 |
---|---|
刘恒君 | 3119009438 |
汪曙郅 | 3119009442 |
Github链接:https://github.com/liu-hengjun-byte/_1_3119009438
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 120 | 200 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 120 | 180 |
· Coding | · 具体编码 | 300 | 360 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 90 | 120 |
Reporting | 报告 | 120 | 120 |
· Test Report | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1020 | 1290 |
- 设计思路
通过上网查询,我们想到了用栈的数据结构来进行设计。栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈底(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表。
栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。
栈和线性表类似,也有两种存储表示方法顺序栈和链栈,链栈的操作是线性表操作的特例,操作比较容易实现。顺序栈即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,top = 0表示空栈。由于栈在使用的过程中所需要的大小难以估计,所以通常是先为栈分配一个基本容量,然后再使用的过程中,当栈的空间不够使用的时候再继续追加存储空间。我们以下述类型说明作为顺序栈的定义:
typedef struct{
SDataType base; //栈底指针
SDataType top; //栈顶指针
int StackSize; //当前已经分配的存储空间,以元素为单位
}SqStack;
栈的初始化操作为:按照设定的初始分配量进行第一次存储分配,这里使用malloc()函数来分配存储空间。malloc()函数的详细说明请看:malloc详细说明。base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。top为栈顶指针,top的初值指向栈底。每当插入一个元素时top加1,弹出一个元素时top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置 (选自CSDN)
这里我们构造一个操作数的栈和一个操作符的栈,分别来存储操作数还有操作符。然后再构造一个进行操作运算的函数 Operate(double a, char theta, double b),分别对+-/四种操作符和操作数进行组合。然后再通过Precede(char t1, char t2)函数来判断+-/的优先级。然后用random函数随机生成操作数和随机生成操作符,再组合在一起形成算式,剩下的就是进行条件的判断了
关于扩号的添加:
当前的操作符是+或者-,且它后面的操作符是或者/或者,这个时候加上(),如果是-的话就变号,因为括号的优先级大于/和加减,所以优先算括号内的内容。
1.算法设计与实现过程
生成随机的数字:用rand函数随机生成操作数和随机生成操作符.(C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试) )
用rand函数生成运算符号:
main函数:
实验结果展示:
性能测试:(使用vs内含的性能探查器)
心得体会:
这次结对项目,我们两个遇到了挺多问题,在需求分析的时候有不同的意见,其中一位同学觉得应该要减少代码数量,提高性能,对不必要的功能剔除,另一位觉得应该尽量使用复杂的函数,实现多一点功能来满足要求。经过网上查阅资料,最终我们确定下来了使用栈的基本方案,然后在编写程序的过程中互相提出意见和问题,并一一改进。在完成整个结对作业之后,我发现结对作业更加有趣,并且有更加思考和讨论,让编写程序更加方便,毕竟集合二人之力嘛,两个人还能相互检查。总而言之是很宝贵的一次经历。