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. IO流_文件切割与合并

    切割可以分两种方式:按文件个数切,按文件大小来切(建议用这种方式,因为按个数的话,有可能文件非常大) import java.io.File; import java.io.FileInputStre ...

  2. python第五十二课--自定义异常类

    myexception.py ''' 实现自定义异常类: ''' class MyException(Exception): def __init__(self,msg): super().__ini ...

  3. CF1045G:AI robots(CDQ分治)

    Description 火星上有$n$个机器人排成一行,第$i$个机器人的位置为$x_i$,视野为$r_i​$,智商为$q_i​$.我们认为第$i$个机器人可以看到的位置是$[x_i−r_i,x_i+ ...

  4. 【转】BAT批处理中的字符串处理详解(字符串截取)

    下面对这些功能一一进行讲解. 1.截取字符串 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符.举例说明其基本功能: @echo off set ...

  5. 【转】MySQL理解索引、添加索引的原则

    索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销.而如果采取索引,则可以根据索引指向的页以及记录在 ...

  6. YOLO(5) YOLO2 代码讲解

    运行 darknet-rect2.exe detector demo F:/2Project/YOLO/yolo2/3data/TestData/data/voc.data F:/2Project/Y ...

  7. CentOS 7.x编译安装Nginx1.10.3+MySQL5.7.16+PHP5.2 5.3 5.4 5.5 5.6 7.0 7.1多版本全能环境

    准备篇 一.防火墙配置 CentOS 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.se ...

  8. Intel支持八九代酷睿的B365芯片组将登场亮相

    不久前,Intel悄然推出了新款芯片组B365,看起来像是B360的升级版,但事实上二者并无太大关系. 根据最新曝料,基于B365芯片组的主板将在1月16日登场亮相,支持八九代酷睿. 同时获悉,B36 ...

  9. Photoshop 基础一 安装

     安装 版本介绍 学习教程  一.安装 1)注册Adobe账号,注册地址:Adobe注册 2)下载地址:Adobe下载 下载地址2:百度经验 3)安装:试用期7天的版本 二.版本介绍 1)最新版本:A ...

  10. ESP32 电容式触摸按键设计

    手指和电容器接触时,相当于增加了电容,电容增加量与总电容的商就是电容的变化幅值,如果这个幅值超过门限,就认为触摸按键被激发了: