软件工程第五次作业--四则运算

题目

   (1)能自动生成小学四则运算题目;

   (2)能支持任意分数的四则运算;

   (3)能支持任意括号运算

思路

  根据参数生成不定长度的表达式,以及能控制是否生成分数,能生成任意数量的中缀表达式,支持四则运算,括号运算以及分数运算

  构造函数接口  def __init__(self, exps_num=10, num_l=1, num_r=10, exp_limit_len=10, has_fraction=True)

  提供接口生成中缀表达式,返回表达式数据集   def create_express(self)

  提供接口将中缀表达式化为后缀表达式  def get_postfix(self, exp)

  提供接口将后缀表达式进行计算并返回结果  def cal_express(self, exp)

  提供接口以用户友好方式显示中缀表达式  def get_showExp(self, exp)

源代码
# -*- coding: utf-8 -*-# author: ‘boliang‘# date: 2018/4/18 21:04

import profileimport randomfrom fractions import Fraction

class Solution(object):    def __init__(self, exps_num=10, num_l=1, num_r=10, exp_limit_len=10, has_fraction=True):        self.__exps_num = exps_num        self.__has_fraction = has_fraction        self.__exp_limit_len = exp_limit_len        self.__num_l = num_l        self.__num_r = num_r

# 生成中缀表达式    def create_express(self):        exps = []        num = self.__exps_num        while num > 0:            num_len = random.randint(2, self.__exp_limit_len)            tmp_len = num_len - 1            exp = [self.__get_num(self.__has_fraction)]            while tmp_len > 0:                # 1为+,2为-,3为*,4为/                op_flag = random.randint(1, 4)                if op_flag == 1:                    exp.append(‘+‘)                elif op_flag == 2:                    exp.append(‘-‘)                elif op_flag == 3:                    exp.append(‘*‘)                else:                    exp.append(‘/‘)                exp.append(self.__get_num(self.__has_fraction))                tmp_len -= 1

brackets = random.randint(0, int(len(exp)/8))            while brackets > 0:                if self.__set_bracket(exp, num_len):                    brackets -= 1

exps.append(exp)            num -= 1

return exps

def __set_bracket(self, exp, num_len):        index_a = 0        index_b = 0        while index_a == index_b:            rec = list(map(lambda x:random.randint(0, num_len-1), range(2)))            index_a = min(rec) + 1            index_b = max(rec) + 1

cal = 0        length = len(exp)        for i in range(length):            if type(exp[i]) != type(‘+‘):                cal += 1

if cal == index_a:                if i+1 <= length and exp[i+1] == ‘)‘:                    return False                exp.insert(i, ‘(‘)

cal = 0

for i in range(len(exp)):            if type(exp[i]) != type(‘+‘):                cal += 1

if cal == index_b:                if i-1 >= 0 and exp[i-1] == ‘(‘:                    return False                exp.insert(i+1, ‘)‘)                break

return True

# 生成一个数, 包括分数    def __get_num(self, has_fraction=True):

# 生成包括有分数        if has_fraction:            # 80%几率为整数            flag = random.randint(1, 10)            if flag <= 8:                return self.__get_num(False)            else:                 return Fraction(self.__get_num(False), self.__get_num(False))        # 生成整数        else:            return random.randint(self.__num_l, self.__num_r)

# 计算后缀表达式    def cal_express(self, exp):        record = []        for val in exp:            if type(val) == type(‘+‘):                b = record.pop(-1)                a = record.pop(-1)                if val == ‘+‘:                    record.append(a+b)                elif val == ‘-‘:                    record.append(a-b)                elif val == ‘*‘:                    record.append(a*b)                else:                    record.append(a/b)            else:                record.append(val)

return record[0]

# 通过中缀表达式得到后缀表达式    def get_postfix(self, exp):        l_ops = {            ‘(‘: 1, ‘*‘: 5, ‘/‘: 5,            ‘+‘: 3, ‘-‘: 3, ‘)‘: 6        }

r_ops = {            ‘(‘: 6, ‘*‘: 4, ‘/‘: 4,            ‘+‘: 2, ‘-‘: 2, ‘)‘: 1        }

op_stack = []        post_stack = []        for val in exp:            if type(val) != type(‘+‘):                post_stack.append(val)            elif len(op_stack) > 0:                while len(op_stack) > 0 and l_ops[op_stack[-1]] >= r_ops[val]:                    if op_stack[-1] != ‘(‘ and op_stack[-1] != ‘)‘:                        post_stack.append(op_stack.pop(-1))                    else:                        op_stack.pop(-1)

op_stack.append(val)            else:                op_stack.append(val)

while len(op_stack) > 0:            if op_stack[-1] != ‘(‘ and op_stack[-1] != ‘)‘:                post_stack.append(op_stack.pop(-1))            else:                op_stack.pop(-1)

return post_stack

def get_showExp(self, exp):        op = {‘+‘: ‘+‘, ‘-‘: ‘-‘, ‘*‘: ‘ב, ‘/‘: ‘÷‘, ‘(‘:‘(‘, ‘)‘:‘)‘}        jud_fun = lambda val: str(val) if type(val) != type(‘+‘) else op[val]        return ‘ ‘.join(map(jud_fun, exp))

# 测试函数def test():    # 1. 测试程序自动生成10组表达式数据(包括分数和括号运算)    # 2. 测试通过中缀表达式计算得到后缀表达式    # 3. 根据后缀表达式计算结果(包括分数)

# 设置接口参数    # 表达式个数    express_num = 10    # 生成的数的下界    num_l = 1    # 生成的数的上界    num_r = 10    # 表达式的数字个数    exp_limit_len = 10    # 是否会生成分数    has_fraction = True

sol = Solution(express_num, num_l, num_r, exp_limit_len, has_fraction)

# 生成中缀表达式    exps = sol.create_express()

for ind, exp in enumerate(exps):        print(‘.......................................‘)        print(‘第{0}条表达式:{1}‘.format(ind+1, exp))        tmp = sol.get_postfix(exp)        print(‘后缀表达式为:{0}‘.format(tmp))        print(‘用户界面中显示的表达式:{0}‘.format(sol.get_showExp(exp)))        print(‘运算结果为:{0}‘.format(sol.cal_express(tmp)))        print(‘.......................................‘)

if __name__ == ‘__main__‘:    profile.run(‘test()‘)

根据单元测试,测试结果如下

效能分析, 运用Python profile库

PSP表格

  预计耗时(分钟) 是实际耗时(分钟)
Planning 计划 10 10
Estimate 估计这个任务需要多少时间 100 100
Development 开发 120 240
Analysis 需求分析 5 10
Design Spec 生成设计文档 3 23
Design Review 设计复审(和同事审核设计文档) 2 2
Coding Standerd 代码规范(为目前的开发制定合适的规范) 3 3
Design 具体设计 5 10
Coding 具体编码 30 60
Code Review 代码复审 5 10
Text 测试(自测,修改代码,提交修改) 10 30
Reporting 报告 10 20
Text Report 测试报告 10 20
Size Measurement 计算工作量 5 5
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 5 5
Sum 合计 215 420

原文地址:https://www.cnblogs.com/lbliang/p/8878753.html

时间: 2024-11-08 16:19:56

软件工程第五次作业--四则运算的相关文章

软件工程第五次作业(结对作业)

软件工程第五次作业 题目 本次作业我与合作伙伴选择的是题目1:四则运算生成 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 角色选择 驾驶员 - 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中 - 能够对导航员在本次编程工作中起到的作用给

结对作业2(软件工程第五次作业)

第二次结对作业(领航员) 一.作业题目 本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换. 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 二.角色选择 领航员 能够辅助驾驶员完成全部代码

软件工程第五次作业——第二次结对编程

题目要求 本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题. 题目1: 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 角色分配 本次

软件工程第五次作业

1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Expert (Short Comedy Sketch),写出观后感(内容是什么,说明了什么问题,有什么启示),提交到博客. 4.学习在项目中使用 jar 文件: 1)在下列code中导入jar文件“commons-lang3-3.3.2.jar”,并运行,将运行结果截图提交到博客: 解答: 1: 功能: 随机产生三个学生的姓.名

现代软件工程第五周作业

我们经常抱怨阅读别人的代码很难,我们自己在写代码的时候,是否考虑到如何让代码更易于阅读和维护呢? 我们应该考虑到怎样让代码易于阅读,就像不同地区的方言,当地人觉得方便易懂,但外人往往不知其所云,为了让大家都可以沟通,才有了普通话的产生.因此代码的编写也应该有一个相对的标准,来便于自己和他人的阅读. 代码的易于维护性更应该考虑.我们在着手编写代码的时候,通常不能完全考虑到所有的功能,这就需要后期的不断修改完善.如果这时我们的代码不便于维护的话,会带来很大的麻烦,最后可能导致需要抛掉已有的代码来重新

软件工程结对作业 四则运算界面设计

软件工程结对作业 四则运算界面设计 康鑫  PB16060203 娄雨禛  PB16060356 一.项目分析 二.进度规划与完成情况 三.主要函数 四.简单的数据测试 五.编程困惑与心得 原文地址:https://www.cnblogs.com/RainLou/p/8735480.html

第五次作业——python效能分析与几个问题(个人作业)

第五次作业--效能分析与几个问题(个人作业) 前言 阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下. 阅读 阅读<构建之法>第一章至第三章的内容,并在下方作业里体现出阅读后的成果.特别是第2章中的效能分析及个人软件开发流程(PSP). 参考文章: <构建之法>教学笔记--Python中的效能分析与几个问题 四则运算器效能分析 软工第2次作业-四则运算器 题目描述 可以选择以下题目(或者自主选择题

软件项目管理第五周作业

1.psp Job Type Date Start End Total 四周总结 随笔 2016.4.4 23:00 23:23 23 站立会议 会议 2016.4.4 13:30 13:45 15 数据库 编码测试 2016.4.4 13:50 15:20 90 站立会议 会议 2016.4.5 13:00 13:15 15 摇一摇1 编码测试 2016.4.5 13:35 14:20 45 站立会议 会议 2016.4.6 13:05 13:15 10 数据库函数添加 编码测试 2016.4

《机电传动控制》第五周作业

机电传动控制第五周作业 一.传动电机或控制电机在工业或生活中的应用: 1.电气伺服传动领域 在要求速度控制和位置控制(伺服)的场合,特种电机的应用越来越广泛.开关磁阻电动机.永磁无刷直流电动机.步进电动机.永磁交流伺服电动机.永磁直流电动机等都已在数控机床.工业电气自动化.自动生产线.工业机器人以及各种军.民用装备等领域获得了广泛应用.如交流伺服电机驱动系统应用在凹版印刷机中,以其高控制精度实现了极高的同步协调性,使这种印刷设备具有自动化程度高.套准精度高.承印范围大.生产成本低.节约能源.维修