2017282110288软件工程第二次作业

一、Github项目地址:

      https://github.com/VicLily/softwareEngineering

二、 PSP2.1表格:


PSP2.1


Personal Software Process Stages


预估耗时(分钟)


实际耗时(分钟)


Planning


计划


30


60


· Estimate


· 估计这个任务需要多少时间


30


60


Development


开发


695


1130


· Analysis


· 需求分析 (包括学习新技术)


20


30


· Design Spec


· 生成设计文档


60


120


· Design Review


· 设计复审 (和同事审核设计文档)


20


20


· Coding Standard


· 代码规范 (为目前的开发制定合适的规范)


10


10


· Design


· 具体设计


40


60


· Coding


· 具体编码


400


700


· Code Review


· 代码复审


30


50


· Test


· 测试(自我测试,修改代码,提交修改)


120


100


Reporting


报告


80


80


· Test Report


· 测试报告


30


20


· Size Measurement


· 计算工作量


20


20


· Postmortem & Process Improvement Plan


· 事后总结, 并提出过程改进计划


30


40


合计


810


1230

三、解题思路:

已实现功能:

·  运算符个数、类型、顺序随机生成。

·  操作数随机生成。

·  用户输入题目个数,总分100分,每做完一个题判断对错后输出正确答案。最后给出总分。

·  支持有括号的复合运算(在第二版中,但还存在有bug)

解题思路 :

代码用java实现,另外需要导入JSON的包。

(1)在第一版的代码实现中用了两个集合类(运算符、操作数),所有整数、真分数分子分母分开存储,通过遍历这两个集合类,先计算乘除,后计算加减。

(2)在第二版中用逆波兰算法的思想,这里建立了分子、分母、运算符三个基本栈,然后又建立其他工作栈进行输出和运算操作。

因为刚开始没有想太复杂,所以后来进行了改版,前面的实际时间为第一版的实际时间。

四、设计实现过程:

(1)

第一、首先定义全局变量M用以自定义运算符生成个数的上界,在1-M范围内自动生成操作符的个数num。然后自动生成num+1个操作数,(分子和分母分别自动生成,其中分母不为0,这些数的取值范围也是自定义)。

操作数的映射值是JSONObject类型的,分子和分母以Integer类型存储在里面。

第二、从头遍历一遍运算符的HashMap集合类,遇到乘号或者除号进行相应计算,然后把结果存储到操作数集合DataList里面,遇到加号或者减号则跳过。等到操作符的集合characterList遍历完后乘和除运算已经做完,只剩下加和减操作。重新遍历一遍characterList,计算加减运算。

第三、记两个操作数的分子分母分别为zi1,mu1,zi2,mu2,记两个操作数的计算结果为zi,mu。 操作数的四个值是DataList里两个JSONObject的对象的两个获取值。

当做加运算时:zi1/mu1 + zi2/mu2,分别计算分子和分母,mu=mu1*mu2,zi=zi1*mu2+zi2*mu1。将结果zi,mu约分后存储在DataList

当做减运算时:zi1/mu1 - zi2/mu2,分别计算分子和分母,mu=mu1*mu2,zi=zi1*mu2-zi2*mu1。将结果zi,mu约分后存储在DataList

当做乘运算时:zi1/mu1 * zi2/mu2,分别计算分子和分母,mu=mu1*mu2,zi=zi1*zi2。将结果zi,mu约分后存储在DataList

当做除运算时:zi1/mu1 ÷ zi2/mu2,计算之前先做一个判断,如果除号后面的操作数分子为0,则重新随机生成一个不为0的数。分别计算分子和分母,mu=mu1*zi2,zi=zi1*mu2。将结果zi,mu约分后存储在DataList

第四、在第一次遍历characterList做完乘除操作后,记录下不会再用到的操作符和操作数,然后删除掉,再进行加减操作,加减操作完成后同样删除掉不会再用到的运算符和操作数。最后DataList只剩下最后的结果。将最后结果变成字符串的形式与用户输入的进行比较,如果匹配输出“回答正确”,加上相应的分数。

(2)

在第二版中用逆波兰算法,也是在第一版的基础上做了修改,先建立分子、分母、操作符、括号的集合,随机生成括号对数(1-2对),确定第一个左括号的位置,然后将括号和操作符依次入栈(同一个栈)分子分母分别入栈,然后进行出栈、判断、计算、入栈等一系列操作。最后分子和分母的栈中就是最后的结果,将最后结果变成字符串类型与用户输入的进行比较,判断对错。(第二版中的计算部分与第一版的思想一致,但由于时间关系,目前在判断上还存在bug需要调试修改)

五、代码说明:

(1)第一版:

建立了三个.java文件,首先在TheMain类中,有5个内部类,inputN()用来处理用户输入有几个题目,调用show()方法。Show()方法用来显示有满分、每道题目分数、运行saveCharactor()和saveData()方法,循环调用showT()方法和compute()类。

其中saveCharactor()和saveData()方法用来自动生成并存储运算符和操作数。

ShowT()方法用来在控制台输出一个题目给用户。

Compute()类用来计算对应运算符的运算操作,其中用Delete()方法删除计算过不会再使用的运算符和操作数。

Yuefen()类用于对分子和分母的约分,GCD()方法是对分子和分母求最大公约数。

关键代码:

下图中代码是输出除号之前,判断除号后面的操作数是否为0,若为0则重新随机生成一个不为0的真分数存储并输出。

下图代码为随机生成运算符的类型,其中num为自定义操作符个数的全局变量。

(2)第二版:

同第一版一样,有三个.java文件。TheMain()类中的方法、yuefen()类与第一版的功能一样。

Compute()类中,compute()方法用来自动生成括号个数以及确定括号的起始位置、调用showT()方法和compute1()方法。

showT()方法用来将自动生成的多项式显示到控制台中,并将集合中的数据和符号入栈。

Compute1()方法用来判断每个出栈的符号,调用compute2对每个符号进行处理。(目前bug主要出现在这个方法里,一些判断还存在问题)。

Compute2()方法用来对加减乘除符号调用对应的jia()、jian()、cheng()、chu()运算操作。

Compute3()用来处理括号里的运算。

jia()、jian()、cheng()、chu()方法和第一版的加减乘除运算的思想一致。

关键代码:

主要为:根据运算符的个数确定括号的对数的范围。如果只有一个运算符,不会生成括号。如果有两个运算符,随机生成0-1对括号。如果有3个以上的运算符,则生成0-2对括号。

六、测试运行:

(1)运行结果:

第一版:

第二版:

(2)单元测试:

建立一个computeTest的单元测试类,对带括号的compute类进行单元测试,测试代码如下:

运行过后:由于括号自动生成,所以和手动输入的结果不匹配,导致测试失败。

当没有自动生成括号时,运行成功。

七、项目小结

我先看了《构建之法》的前几章,看题目后感觉并没有那么难,然而在实际做的过程中却遇到了很多问题,我觉得最要紧的就是刚开始构建思路的时候,可能由于经验不足,走了很多弯路,不过结果还算正确运行了出来,等到加括号的运算时候,发现自己之前写的并不是好的代码,不简洁、不清晰,也没有将设计模式运用出来,我觉得可能还需要更多的项目经验来提高编码的能力。

时间: 2024-10-07 03:48:13

2017282110288软件工程第二次作业的相关文章

软件工程 第二周作业

##软件工程第二周作业 提出问题 1. 一般来说,想要自己的程序跑得又快又好,就要减少函数的反复调用,但有所得则必有所失,效能提高就有可能伴随着程序的稳定性的降低,这两者应该如何权衡呢? 2. 关于5.3.5 老板驱动的流程,这种开发流程模式存在着一些问题,那要如何解决这些问题呢? 这种模式当然也有它的问题. 领导对许多技术细节是外行. 领导未必懂得软件项目的管理,领导的权威影响了自由的交流和创造. 领导最擅长的管理方式是行政命令,这未必能管好软件团队或任何需要创造力的团队. 领导的精力有限,领

2017秋-软件工程第二次作业

本周因为个人缘故,参加社团活动作业没能及时完成.对此我表示,做过就不后悔,至少我觉得生活是丰富多彩的,错过的时间就应该努力赶上!夜深人静的时候总是可以让人反省自己.本次作业我只实现了第一个功能和第二个功能的部分.对此我表示很不满,但是时间紧迫.个人能力有限,以至于自己没能让自己的软件看起来完美. 第二次作业的内容非常有趣,这也是我一直想做的一件事情,统计一篇文章里的字词.我知道自己的编程能力较差.距离完成提交时间很近,自己手写全部是不能及时按照约定提交的,于是就尝试借鉴前人的代码.第一晚的努力各

软件工程第二次作业--师兄采访

我采访的是李权师兄,虽然之前也有人采访过他,问题都是同样的问题,不过我挖掘出了和其他同学不一样的信息. 问题:    师兄,当时你们做的项目是什么,有多少用户, 现在还有人用吗? 李权师兄: 当时我们的项目名是约跑APP,当时用户有8人.在用户的手机上测试通过,能让用户找到一起跑步的小伙伴.现在已经没有人用了. 追问:该app给用户提供了什么样的服务? 李权师兄:app能提供给用户认识新朋友的平台.通过app,用户可以约人一起跑步. 第二个问题:师兄这个项目能否给我们团队继续开发,源代码还有么?

软件工程第二次作业(王伟东)

一周的时光转瞬即逝,第二周的作业也悄悄地开始了.杨老师的一言一行都深深地刻在我的心里,"不迟到"是做人做事的根本,努力则是成就人生的基石.正如<道德经>中所言"天地不仁,视万物为刍狗",上天对待世间万物是公平的,从来都是不偏不倚,只有勤奋好学的人才会得到垂青和奖赏. ㈠词频统计的四个功能 ①首先控制台输入内容到文件中,再对文件进行词频统计: ②命令行输入英文作品名,然后统计作品词频: ③命令行输入英文作品文件的目录名,再批量统计: ④从控制台读入英文单篇

软件工程第二次作业——git的使用

1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的Collaborators,并添加[email protected] 为Collaborator.   邓杰: 陈宗雷: (1)在之前已经建立了自己的github账号,账号名称为zongleichen. (2)以合作者身份加入到组长建立的项目: 2.   每人自己建立一个HelloWorld项目,练

软件工程——第二次作业(2)

施工中-- 作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 项目要求是编写出一个拥有"词频统计"功能的小程序,作为一个小程序,若只是实现基本的词频统计功能,其实并不是很难.但是,如果再附加一些需求和功能的话就会让我感到有点难度了,更何况为了以后课程的要求,我选择使用Visual Studio 2015编译器和C#语言这两种从未学过的工具,在4-5天之内共10个小时左右(预计,但是实际上确实是花了更多时间

软件工程 — 第二次作业

一 :对软件工程的疑惑 1. 学习软件工程需要哪些基础? 2.程序设计语言没学好有关系吗? 3. 软件工程的发展前景? 4. 软件工程具体做什么? 5. 软件工程可作为物联网的应用层需要哪些协议来处理 二:选取三种软件并说明特点 1.支付宝 (1)优点:支付方便快捷,使用时效率高        缺点:有时会出现不安全现象,相比银行而言会存在财产丢失的问题        通过余额宝的高额利息,和即时存取的便利吸引客户,以盈利为目的 (2)经人介绍使用,自己下载 (3)定期维护更新版本 (4)开创时

软件工程第二周作业:代码规范和代码复审

0x01 :代码规划的要求 Q:这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西.(反驳) 首先,我们需要明确编码规范的定义,编码规范同时包括了编码风格和其它规范(代码设计上的规范,如设计模式.程序设计.模块之间的逻辑关联等). 编码风格,牵扯到“缩进.空格使用.注释.命名习惯”等多方面的因素,是依致特定编程语言制定的软件工程开发的“约定”,而相同的编码风格,可以使得软件开发过程中轻松浏览任意一段代码,充分保证不同的开发人员能够依据统一的编码格式轻松理解代码的逻

软件工程第二次作业 词频统计

1.项目名称:词频统计 2.代码地址:https://coding.net/u/songyuu/p/python_wf/git 3.代码如下: 1 import os 2 import re 3 import collections 4 #print(os.getcwd()) #显示wf.py路径 5 #print(os.listdir())#显示目录下的文件 6 file_name=input("wf ") 7 if not os.path.isfile(file_name+'.tx