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++编写四则运算生成程序的更多相关文章

  1. “四则运算生成程序——GUI支持和部分功能改进”链接

    项目成员:张金生     张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进

  2. 基于Python实现的四则运算生成程序

    Github项目地址:传送门 小组成员:黄晓彬(代码实现) 黄钰城(代码审查) 需求: 1. 使用 -n 参数控制生成题目的个数. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的 ...

  3. 简易四则运算生成程序——添加GUI支持

    项目成员:张金生     张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...

  4. java web编写四则运算

    首先先画出一个表 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  5. 结对编程-四则运算生成程序-GUI界面

    201421123118 张中结 201421123098 胡丹丹 a.需求分析 这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功 ...

  6. 四则运算生成程序——GUI支持和部分功能改进

    项目成员:张金生     张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...

  7. 软件工程随堂小作业——随机四则运算Ⅱ(C++)

    一.设计思路 设计思路已给出,此处不再赘述. 二.源代码 (1)四则运算2.cpp(源文件) // 四则运算2.cpp : Defines the entry point for the consol ...

  8. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  9. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

随机推荐

  1. C# 生成强命名程序集并添加到GAC

    针对一些类库项目或用户控件项目(一般来说,这类项目最后编译生成的是一个或多个dll文件),在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可 ...

  2. January 25th, 2018 Week 04th Thursday

    What made something precious? Losing it and finding it. 一件东西怎样才会变得珍贵无比?先弄丢了它,然后又找到了. A short time ag ...

  3. January 07th, 2018 Week 01st Sunday

    To remember is to disengage from the present. 铭记过去就是放弃当下. To remember the past doesn't mean we would ...

  4. 个人技术博客Alpha----Android Studio学习

    项目联系: 本次项目我主要负责Android studio的后端,以及游戏文案游戏策划,结果后来事情太散了,Android studio学的不咋地,文案写完还有帮着写一写数据库的插入语句,然后就是跟队 ...

  5. 关于RBAC(Role-Base Access Control)的理解(转)

    基于角色的访问控制(Role-Base Access Control) 有两种正在实践中使用的RBAC访问控制方式:隐式(模糊)的方式和显示(明确)的方式. 今天依旧有大量的软件应用是使用隐式的访问控 ...

  6. ethereum/EIPs-155 Simple replay attack protection 35,36

    EIP 155:重放攻击保护——防止了在一个以太坊链上的交易被重复广播到另外一条链. 在看椭圆曲线时有提到,与r.s.v中的v相关 不同的共有链定义不同的chainId, 防止同一笔交易在不同的共有链 ...

  7. linux 下 mysql-5.5.8 安装

    安装环境:Linux服务器CentOS 5.5 安装版本:mysql-5.5.8.tar.gz 1.安装 cmake 编译器. 1).下载cmake #cd /usr/local/src #wget ...

  8. 文件上传之Servlet

    导包 commons-fileupload-1.3.1.jar commons-io-2.2.jar import java.io.File; import java.io.FileOutputStr ...

  9. MTALAB——神经网络mae()、mse()、sse()

    mae():平均绝对误差 mse:均方误差 sse:误差平方和

  10. AI 线性代数

    1.标量.向量.矩阵和张量 1)标量(scalar),一个数,例如自然数和实数. 2)向量(vector),一列有序数.可以看作只有一列的矩阵. 3)矩阵(matrix),二维数组.转置(transp ...