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++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
随机推荐
- python使用关键字爬取url
python网路爬虫 --------- 使用百度输入的关键字搜索内容然后爬取搜索内容的url 开发环境:windows7+python3.6.3 开发语言:Python 开发工具:pycharm 第 ...
- JDBC学习笔记之JDBC简介
1. 引言 JDBC API是一种Java API,可以访问任何类型的表格数据,特别是存储在关系数据库中的数据. JDBC可以帮助我们编写下列三种编程活动的java应用程序: 1.连接到数据源,如数据 ...
- Java设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- 【BZOJ4946】[NOI2017]蔬菜(贪心)
[BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...
- JS控制台打印佛祖加持护身符
console.log([ " _ooOoo_", " o8888888o" ...
- PHP开发小技巧①①—php实现手机号码显示部分
从个人信息保护性的角度来讲,我们在开发过程中总会想办法去保护用户的一些个人信息.就如本篇博文所讲,我们有时会将用户的手机号码只显示出部分,这是很多网站都有做的功能.这个功能实现起来也是特别的简单,只需 ...
- ceph 集群故障恢复
集群规划配置 master1 172.16.230.21master2 172.16.230.22master3 172.16.230.23node1 172.16.230.26node2 ...
- 2017-2018-2 20155314《网络对抗技术》Exp5 MSF基础应用
2017-2018-2 20155314<网络对抗技术>Exp5 MSF基础应用 目录 实验内容 实验环境 基础问题回答 预备知识 实验步骤--基于Armitage的MSF自动化漏洞攻击实 ...
- Android学习之基础知识四-Activity活动1讲
一.活动(Activity)的基本用法: 1.手动创建活动FirstActivity(java源码): A.Android Studio在一个工作区间只允许打开一个项目,点击:File--->C ...
- nginx安装升级及配置详解
1.简介 2.安装配置 3.配置文件介绍 4.启动.停止.平滑重启.升级 一.Nginx简介 Nginx(engine x)是俄罗斯人Igor Sysoev编写的一款高性能的http和反向代理服务器. ...