C++编写四则运算生成程序
1.计划方案
按照预定计划,在时限为一周时,完成该程序所需时间大致如下表:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
30h |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
4h |
· Design Spec |
· 生成设计文档 |
40min |
· Design Review |
· 设计复审 (和同事审核设计文档) |
40min |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40min |
· Design |
· 具体设计 |
5h |
· Coding |
· 具体编码 |
4h |
· Code Review |
· 代码复审 |
3h |
· Test |
· 测试(自我测试,修改代码,提交修改) |
6h |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
2h |
· Size Measurement |
· 计算工作量 |
20min |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
2h |
合计 |
30h20min |
2.程序设计思路
任务要求用命令生成一定数量和取值范围的四则运算表达式并计算,并且还要求可以检验给定的题目和答案是否一致,因此,将程序大致分成两个模块,模块1用于生成并且模块2用于检验。
3.具体设计
一、表达式本身
因为表达式中的数字为整数或分数(分子分母均为整数),故把分数的分子、分母分开存放(整数视为分母为1的分数),因为答案可能是假分数,需要转换成带分数,故答案的“整数部分”也另设变量存放(如果答案是真分数,视为整数为0的带分数;如果是整数,则分母视为1)。这样,整个表达式就可以按照分数的计算法则计算出结果,并进行适当的转换。因为运算符最多只有3个,故表达式最多只有4项,用2个长度为4的一维数组表示项,用1个长度为3的一维数组表示运算符即可。
//Variables for generating formula
int lastfr = 0; //存放表达式每一步(加减乘除)计算之后的结果的分子,当表达式计算完成之后即为答案的分子部分。
int lastnm = 0; //存放分母,如果最后答案是整数,则该值为1。
int integerpart = 0; //存放答案(如果是带分数)的整数部分,如果答案不是带分数,该值为0。
int fr[4] = {0, 0, 0, 0};
int nm[4] = {0, 0, 0, 0};
char op[3] = {'+', '+', '+'};
二、表达式的初始化
为了保证每生成一个新的表达式时不会误用前一个表达式的生成结果,使用一个void initial()方法将以上变量恢复为初始值。
三、表达式及答案生成方法:void newformula(int num, int range)
该方法中的num表示第num个表达式,range表示表达式数值(整数)的取值范围。
该方法随机生成一个0~3之间的数表示运算符的数量,然后依次生成项(项的分子、分母取值范围在range之内)、运算符。然后计算表达式的值(计算方法参照分数计算方法),并输出,输出时注意括号位置。
由于表达式不允许出现除数为0的状况,所以生成分母时,如果生成数字0,就强制重新生成,直至生成非0值。对于一项,如果它前面的运算符为除号,则该项的分子也必须不为0。用一个while循环可以轻松解决此问题。
因为该方法生成表达式都是自左向右运算的,所以在输出时可以较为容易地找到括号的位置并插入。
在表达式生成后,就把答案计算并输出。
一般题目中的项如果是分数,则都是最简分数,答案也一样,故在生成一项时,使用void reduc()进行约分。如果最后分母为1,则该项为整数,只输出分子。答案类似。
为防止生成的数过大而导致可能的溢出现象,本程序将表达式的数量限制在9999以下,范围限制在100以下。
为了保证每一步计算都不产生负数,则计算过程中一旦产生负数,则该表达式作废,重新生成。
四、检测答案
本功能思路为:从题目文件和答案文件中读取相应的表达式和数字,将中缀表达式转换为后缀表达式之后计算,和答案对比,即可得出对错,并输出评价结果。
在中缀表达式转换为后缀表达式的过程中需要用到运算符的优先级,本程序用int priority (string op1, string op2)返回优先级。
因为C++支持向量,故在表达式转换、计算中用到的堆栈用向量vector表示,可以动态改变其大小而不需要像数组那样实现必须规定大小。
五、命令读入问题
本程序使用标准输入cin读入命令。因为命令由多个字符串组成,故本程序编写一个vector <string> split(string str, string spl)方法来分割字符串,分割后命令每一部分都可以单独处理。
4.程序调试
在VS2012 C++的调试过程中,逐句测试时,如果需要进入一个被调用的函数,则调试界面会转入与之有关的头文件。如果想要直接让箭头进入该函数的语句,可以在函数的第一条语句中加入断点,然后点击”逐过程“即可。
调试过程中没有出现编译错误,但程序经常崩溃。在程序中插入多个断点后,发现一处错误在
while (priority(stack[top], element) >= 1){
post.push_back(stack[top--]);
}
stack.push_back(element);
top++;
程序段中。该while循环需要将stack中的运算符退栈,同时表示栈顶的top要减少。咋一看没什么问题,但stack是一个向量,只将表示栈顶的top减1并没有实质减少stack中的元素个数,因此有了底下的stack.push_back(element)语句,stack中的元素将只增不减。如果程序继续执行,将出现越界问题。解决方法是在上面第2、3行之间插入stack.pop_back()语句,真正去除栈顶元素。其它几处需要退栈的地方也加上此语句,再运行程序,就不出现崩溃问题了。
5.实例测试
1、输入"Arithmetic"或什么也不输入就敲回车,应显示"Program not exist."。
2、输入"Arithmetic1.exe -8",应显示"Invalid command."。
3、输入"Arithmetic1.exe -n 12",将生成12道10以内的算术题。
4、输入"Arithmetic1.exe -r 20",将生成10道20以内的算术题。
5、输入"Arithmetic1.exe -n 100000",应显示"Invalid exercise number."。
6、输入"Arithmetic1.exe -r 200",应显示"Invalid range number."。
7、输入"Arithmetic1.exe -n 12 -r 20",将生成12道20以内的算术题。
8、输入"Arithmetic1.exe -e Exercises.txt -a Answers.txt",将检测Exercises.txt中的题目与Answers.txt中答案的正确性。
9、上述命令中,如果Exercises.txt或Answers.txt不存在,应显示"Unable to open <文件名>!"
10、输入"Arithmetic1.exe -n 12 -r aa",将显示"Invalid range number."。
以上10个测试用例结果与预期一致。
6. 性能分析
以下是生成4900道99以内的算式的性能分析图:
以下是生成9000道70以内的算式的性能分析图:
由此可见,该程序的CPU占用始终不超过25%,运行效率还是可接受的。
7.个人总结
编写一个程序,最重要的不是把代码写出来,而是把已经写好的代码进行完善与优化。这要求我们有细心的性格与吃苦耐劳的精神。一段几百行的代码可能只需要两三个小时就可以写成,而改正代码中的错误,改进代码的写法,却可能要花上五六个小时。然而,程序中的bug,正是通过反反复复测试而找到的。为了程序的最终产品能尽量达到完美,这样的付出,是完全值得的。
C++编写四则运算生成程序的更多相关文章
- “四则运算生成程序——GUI支持和部分功能改进”链接
项目成员:张金生 张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进
- 基于Python实现的四则运算生成程序
Github项目地址:传送门 小组成员:黄晓彬(代码实现) 黄钰城(代码审查) 需求: 1. 使用 -n 参数控制生成题目的个数. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的 ...
- 简易四则运算生成程序——添加GUI支持
项目成员:张金生 张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...
- java web编写四则运算
首先先画出一个表 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- 结对编程-四则运算生成程序-GUI界面
201421123118 张中结 201421123098 胡丹丹 a.需求分析 这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功 ...
- 四则运算生成程序——GUI支持和部分功能改进
项目成员:张金生 张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...
- 软件工程随堂小作业——随机四则运算Ⅱ(C++)
一.设计思路 设计思路已给出,此处不再赘述. 二.源代码 (1)四则运算2.cpp(源文件) // 四则运算2.cpp : Defines the entry point for the consol ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
随机推荐
- 4.91Python数据类型之(6)元组
前言 有时候,我们为了数值的安全性,不许用户修改数据,今天我们就来讲讲关于python不可变的数据类型--- 元组数据 目录 1.元组的基本定义 2.元组的基本操作 (一)元组的基本定义 1.元组的概 ...
- MySQL内连接(INNER JOIN)
MySQL INNER JOIN子句介绍 MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. INNER JOIN子句是SELECT语句的可 ...
- Hadoop优化 第一篇 : HDFS/MapReduce
比较惭愧,博客很久(半年)没更新了.最近也自己搭了个博客,wordpress玩的还不是很熟,感兴趣的朋友可以多多交流哈!地址是:http://www.leocook.org/ 另外,我建了个QQ群:3 ...
- 转:git合并冲突解决方法
git合并冲突解决方法 1.git merge冲突了,根据提示找到冲突的文件,解决冲突 如果文件有冲突,那么会有类似的标记 2.修改完之后,执行git add 冲突文件名 3.git commit注意 ...
- IOS HTML5页面中数字自动变蓝并识别为手机号
开发HTML5的项目时发现页面元素为一串数字时,IOS手机会默认显示成蓝色字体,并且添加下划线,点击数字时会提示是否识别为手机号. 解决此问题的方法很简单,在head标签中添加下面的meta标记即可解 ...
- OCX ACTIVEX程序打包个人精典案例(OCX)
- tomcat8_java1.8 基础镜像
需要解决的越来越多, 基础镜像中 添加 cronolog功能,用于切割catalina.out 日志. 思路是: cephfs 挂载在node节点, crontab 删除 几天的tomcaat 日志. ...
- VsCode语言设置为中文
一.安装插件 二.Ctrl+shift+p 搜索Configure Display Language 三.修改locale.json { // Defines VS Code's display la ...
- Android ScrollView和ListView联用,且ListView可以下拉刷新和上拉加载
ScrollView嵌套listView且ListView可以实现上拉加载. 由于代码太长,在此只提供实现思路: 先不说上拉加载的事,咱们先回想一下,ScrollView和LsitView联用,时的解 ...
- 3.0+百度地图在地图初始化的时候就弹框展示一个信息框,而不是用户点击poi时才弹出
有些时候我们会有这样的业务:当用户根据地址跳转到地图后,希望能够立即弹框展示该poi的地址信息. 实现方法: 百度地图3.0+的类BaiduMap中提供了一个方法showInfoWindow(Info ...