title: Software Engineering-HW2

date: 2017-09-21 10:35:47

tags: HW

题目描述

从《构建之法》第一章的 “程序” 例子出发,完成一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

1.参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算,例如:1/6 + 1/8 = 7/24。操作数必须随机生成。

2.运算符(operators)为 +, −, ×, ÷ (如运算符个数固定,则不得小于3)运算符的种类和顺序必须随机生成。

3.要求能处理用户的输入,并判断对错,打分统计正确率。

4.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成5个题目

  • (以C/C++/C#为例) calgen.exe -n 5
  • (以python为例) python3 calgen.py -n 5

附加功能(算附加分)

  • 支持带括号的多元复合运算
  • 运算符个数随机生成(考虑小学生运算复杂度,范围在1~10)

项目地址

https://github.com/lishiyuwhu/Homework/tree/master/SE/HW2


PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 5 10
Development 开发
· Analysis · 需求分析 (包括学习新技术) 20 15
· Design Spec · 生成设计文档 20 0
· Design Review · 设计复审 (和同事审核设计文档) 0 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 0 0
· Design · 具体设计 20 15
· Coding · 具体编码 180 190
· Code Review · 代码复审 20 10
· Test · 测试(自我测试,修改代码,提交修改) 60 40+30
Reporting 报告
· Test Report · 测试报告 10 5
· Size Measurement · 计算工作量 10 1
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 340 316+30

合着干完了才发现还有设计文档这事


解题思路

先找找python有没有分数类型, 没的话找个包, 实在没有就自己写个虽然感觉不可能没有.

具体算符随机和计算就用密码学作业 上刚写的压栈计算器, 大致改改.

再写个前缀表达式转中缀带括号形式的输出函数.

python获取命令行参数的函数也要找一下.

注意除0.

还有:

参与运算的操作数(operands)除了100以内的整数以外

看例子的数据范围, 真的不是0~10吗? 100以内真的好难做.


设计实现过程

+-*/四个算符属于一个oper类,

class oper(object):
f = 0
n = 0
name = ''
def __init__(self, func, num, name, output):
self.f = func#计算入口
self.n = num#算符目数
self.name = name#字母名字
self.output = output#输出用的符号名字
def __str__(self):
return self.output

计算用的cal()通过修改得到

一个输出函数, 把OpListwithNumList转换为中序并输出.

match()判断表达式是否成立, 能够计算

代码说明

def cal(OpList, NumList): #计算栈函数
s = [] # 清空计算用的stack
s = copy.copy(NumList[::-1])
flag = 0 # 值若为1, 说明此OpList错误, 就舍弃
for op in OpList[::-1]: # 前缀, 所以倒过来压栈
if (op.n > len(s)): # 栈中, 操作符需要的数不足
flag = 1
break
if (op.n == 0):
s.append(op.f())
elif (op.n == 1):
temp = s.pop() # 栈顶退栈写入temp
s.append(op.f(temp)) # 操作后压栈
elif (op.n == 2):
temp1 = s.pop()
temp2 = s.pop() # 退栈2个
if (op in [OpDiv]) and temp2==0 :#处理除0模0情形
flag = 1
break
else:
s.append(op.f(temp1, temp2)) # 计算后压栈
elif (op.n == 3):
tempx = s.pop()
tempy = s.pop()
tempz = s.pop()
if op==OpPD and tempz==0:
flag = 1
break
s.append(op.f(tempx, tempy, tempz)) # 计算后压栈
# 这部分其实应该用dict来写, 这么多的if一点也不pythonic, 但真的懒得写了
if (len(s) != 1): # 栈里面的数字没用完
flag = 1
if flag==1:
return 'False'
else:
return s[0]

(后记: 现在想想其实这里也不算画蛇添足写的'False', 当时我还是有着一颗判断前缀式合法的心的)

测试运行

项目小结

有个问题直到最后写文书才看出来: 预计的match()没用上. 那么问题来了, 为什么没用上呢? 因为当时直接想的是既然+-/*都是双目运算符, 直接数字个数比算符个数多1就好了. 那这个错误想法为啥直到最后最后也没出错呢? 错在使用的cal()上面.

之前说cal()是从密码学作业改过来的, 本体是

def cal(OpList, pair):# 计算栈函数, 输入一列操作符OpList, 明文密文pair. 返回flag=1说明错误,flag=1正确

这个pair类似于[1,5]明文1密文5, 这样cal()运算的数字只有一个, 形如OpList+OneNum. 而又想当然的把OneNum改成NumList, 导致:

 +*-/59874 #可以生成的都是形如OpList+NumList
+/*23-21*3-41 #运算符嵌在数字中形式的无法生成

还是挺可怕的, 一直都没发现.

不过, 就结果上说, 这也凑合算是

支持带括号的多元复合运算

了吧

Software Engineering-HW2的更多相关文章

  1. Software Engineering: 3. Project planning

    recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...

  2. 第二篇——The communication during software engineering.

    I've learned a lot in my software engineering class about how a program comes out.That's also a esse ...

  3. Software Engineering: 2. Project management

    resources:"Software Engineering" Ian Sommerville For most projects, important goals are: D ...

  4. Software Engineering: 1. Introduction

    Resource: Ian, Sommerville, Software Engineering 1. Professional software development 1.1 Software e ...

  5. SENG201 (Software Engineering I) Project

    SENG201 (Software Engineering I) ProjectSpace ExplorerFor project admin queries:For project help, hi ...

  6. 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感

    在进行了一次结对编程.一次团队编程和一次个人编程项目后,读了<No Silver Bullet: Essence and Accidents of Software Engineering> ...

  7. Software Engineering at Google

    Google的Fergus Henderson在Software Engineering at Google中介绍了Google的软件工程实践. 软件开发 源码仓库 单一源代码仓库,除了核心配置和安全 ...

  8.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  9. 10. Software, Software Engineering, water fall (瀑布模型),Code Complete等名词的来源

    ①.Software-软件”一词是20世纪60年代才出现的,软件Software——1958年由贝尔实验室的著名统计学家John Tukey 提出软件与硬件一起构成完整的计算机系统,它们是相互依存,缺 ...

  10. SEMAT[软件工程方法和理论 Software Engineering Method and Theory]

    Agile software development Agile software development is a group of software development methods bas ...

随机推荐

  1. Docker部署Apollo配置中心

    1.Apollot简述 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于 ...

  2. 爬数据,能让你少写1000行代码的捷径! | Python 正则表达式

    ▌春暖花开,又到了出门游玩拍拍拍吃吃吃的好季节了! 说到拍照摄影,你会构图吗?就是在照片有限的空间内处理人.景.物的关系,并将三者安排在画面中最佳的位置,以形成画面特定结构的方法. 学院君就是一个「拍 ...

  3. 关于vue学习中的一些

    1.Jinkey大神的新手入门攻略 2.小凡vuejs2的视频地址 3.网友翻译的vuejs2官方中文文档 部分报错处理: 1.错误一 vue.js?b6db:2611[Vue warn]: Unkn ...

  4. 【BZOJ1969】航线规划(Link-Cut Tree)

    [BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...

  5. 【国家集训队2010】小Z的袜子(莫队)

    题面 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把 ...

  6. js监听input输入框值的实时变化实例

    情景:监听input输入框值的实时变化实例 解决方法:1.在元素上同时绑定oninput和onporpertychanger事件 实例:<script type="text/JavaS ...

  7. 锐动视频SDK在金融业务加密双录管理系统通用解决方案

    为了更好地保障消费者的合法权益,银监会和保监会提出了要求,在银行.保险从业人员销售理财产品或代理其他机构销售产品时,同期进行录音录像,确保销售人员按程序.按规定介绍产品,以便购买者更清楚地了解产品的性 ...

  8. 构造方法里的super()方法

    为什么经常会遇到有的构造函数会有super(),而有的却没有,其实super就比如 对数函数,log的底数为10,如果为10 ,我们可写可不写,如果不为10,那么我们就要加上底数 在子类构造方法中,s ...

  9. Angular4---部署---将Angular项目部署到IIS上

    ---恢复内容开始--- Angular项目部署到一个IIS服务器上 1.安装URL rewrite组件: 网址:https://www.microsoft.com/en-us/download/de ...

  10. [UWP]理解ControlTemplate中的VisualTransition

    1. 前言 VisualTransition是控件模板中的重要组成部分,无论是自定义控件或者修改控件样式都会接触到VisualTransition.明明这么重要,博客园上好像都没多少关于VisualT ...