Software Engineering-HW2
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的更多相关文章
- Software Engineering: 3. Project planning
recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...
- 第二篇——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 ...
- Software Engineering: 2. Project management
resources:"Software Engineering" Ian Sommerville For most projects, important goals are: D ...
- Software Engineering: 1. Introduction
Resource: Ian, Sommerville, Software Engineering 1. Professional software development 1.1 Software e ...
- SENG201 (Software Engineering I) Project
SENG201 (Software Engineering I) ProjectSpace ExplorerFor project admin queries:For project help, hi ...
- 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感
在进行了一次结对编程.一次团队编程和一次个人编程项目后,读了<No Silver Bullet: Essence and Accidents of Software Engineering> ...
- Software Engineering at Google
Google的Fergus Henderson在Software Engineering at Google中介绍了Google的软件工程实践. 软件开发 源码仓库 单一源代码仓库,除了核心配置和安全 ...
- 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 ...
- 10. Software, Software Engineering, water fall (瀑布模型),Code Complete等名词的来源
①.Software-软件”一词是20世纪60年代才出现的,软件Software——1958年由贝尔实验室的著名统计学家John Tukey 提出软件与硬件一起构成完整的计算机系统,它们是相互依存,缺 ...
- SEMAT[软件工程方法和理论 Software Engineering Method and Theory]
Agile software development Agile software development is a group of software development methods bas ...
随机推荐
- windows下安装和配置nginx
下载nginx 到官网下载window版的nginx http://nginx.org/ 配置环境变量 解压到本地的某个路径下, 打开cmd窗口,cd到nginx的目录下 这里要注意cd的时候要加/d ...
- Axure 入门学习
Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格.设计功能和界面的专家能够快速创建应用软件或Web网站的线框图.流程 ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
- MyBatis映射器元素
映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具,映射器中主要有增删改查四大元素,来满足不同场景的需要: 下面是主要元素的介绍: select:查询语句 ...
- C#编写一款qq消息群发器
先上软件成品图 功能编写大概分为以下几个部分了: 获取QQ分组 发送消息 先来讲发送消息吧,实现还是比较简单 //这段主要是用来打开会话窗口的(只能列表中的好友进行会话的) System.Diagno ...
- hadoop2.x源码编译
转载请标明出处: http://blog.csdn.net/zwto1/article/details/50733753: 介绍 本篇主要会涉及以下内容: 学会编译hadoop2.x源码 编译hado ...
- 使用text-overflow: ellipsis 处理文本溢的一个小问题
今天在做一个自定义 select多选 搜索的时候,有这样子的一个需求: 1.点击自定义的一个 选项内容框,下拉可多选项 2.多选项不允许换行,且父溢出拆剪,(单行)溢出部分使用 "...&q ...
- Solidity constant view pure关键字的区别与联系
在Solidity中constant.view.pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证.所以用好 ...
- WPF介绍
WPF 为Windows Presentation Foundation的首字母缩写 ,中文译为“Windows呈现基础”.WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上 ...
- HyperLedger Fabric 1.1 手动部署单机单节点
手动部署单机单节点 之前发布过官方的e2e部署方案,由于环境或是访问权限等各种问题,还是有相当一部分码友无法成功跑起来,故此,本章将来一次纯手动操作的集群部署. 主要需要的步骤如下: 1:环境整理 2 ...