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. January 24th, 2018 Week 04th Wednesday

    Each day has enough trouble of its own. 一天的难处一天当. Looking into the sunset I can't help but notice th ...

  2. January 13th, 2018 Week 02nd Saturday

    Anyone who has no spiritual aspirations is an idiot. 任何没有精神追求的人都是愚昧无知的人. Today I went to a bookshop ...

  3. Static简介

    1.static称为静态修饰符,它可以修饰类中得成员.被static修饰的成员被称为静态成员,也成为类成员,而不用static修饰的成员称为实例成员. 2.当 Voluem volu1 = new V ...

  4. CRM项目之stark组件(2)

    那么从今天开始呢,我们就要开始设计属于我们自己的admin组件,起个名字就叫stark吧(当然你愿意叫什么都可以). stark组件之四步走 仿照admin组件实现流程,stark组件要实现四件事情: ...

  5. E - The Balance POJ - 2142 (欧几里德)

    题意:有两种砝码m1, m2和一个物体G,m1的个数x1,  m2的个数为x2, 问令x1+x2最小,并且将天平保持平衡 !输出  x1 和 x2 题解:这是欧几里德拓展的一个应用,欧几里德求不定方程 ...

  6. MySql常用命令集Mysql常用命令3

    MYSQL常用命令 有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接 MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令. 有很多朋友虽然安装好了mysql ...

  7. Ros使用Arduino 2 使用rosserial创建一个publisher

    1 启动arduino 将arduino开发板连接到电脑的usb口,在arduino IDE中进行设置. 选择Tools->Board,选择你所使用的arduino开发板的类型,所使用的ardu ...

  8. 如何使用bootstrap框架

    Bootstrap是前端工程师比较常用的框架.插件,根据它的定义,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自己的页面效果的成品 ...

  9. day06数据类型----元组、字典、集合

    一.元组(tuple):     python中将一些不能修改的值称为不可变的,而不可变的列表则被称之为元组. 注意元组一旦被定义则不可修改,因此一般我们不定义空元组. 元组是有序的,可存放多个数据| ...

  10. 基于Matlab的多自由度系统固有频率及振型计算

    可参考文涛,基于Matlab语言的多自由度振动系统的固有频率及主振型计算分析,2007 对于无阻尼系统 [VEC,VAL]=eig(inv(A)*K) 对于有阻尼系统,参考振动论坛计算程序 输入M,D ...