四则运算生成程序(python版)

Posted LLLaoJI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四则运算生成程序(python版)相关的知识,希望对你有一定的参考价值。

四则运算题目生成—基于控制台

项目托管在码云:飞机票

需求分析

  • 根据控制台提示信息,输入题目生成相关配置参数

    • 题目生成数量
    • 数字范围
    • 式子中是否有分数
    • ....
  • 程序支持

    • 10000 题目生成
    • 题目与答案的本地化存储
    • 对生成的题目进行查重处理
    • api接口生成
    • 统计对错情况
    • ....

功能实现

由于此项目是针对面向对象课程所开发,所以代码结构力求做到清晰明了。
结构图如下:

主要功能代码

判重

说明:将两个表达式生成的运算符二叉树进行比对根节点是否相同,若相同,则表示重复,否则,不重复

此项目主要完成3个主要部分

  1. 表达式生成
    • generator.py
  2. 题目查重
    • binary_tree.py
  3. 计算答案
    • answer.py

其他模块辅助这3个主功能

设计到的基本数据结构及表达式有二叉树逆波兰表达式(后缀表达式)

表达式生成逻辑

首先可以很快想到用字符串列表来存储表达式,然后仔细分析下表达式具有的特点

  • 运算数个数 = 运算符个数 + 1
  • 具有2个操作数的式子不需要插入括号(在式子两侧括号为无意义括号)
  • 如果运算符为除法且后面紧接的运算数为0,则将0重新替换成一个不为0的运算数。

由此可以想到可以新建个一个大小为(运算符个数+运算数)的列表,然后for循环遍历此列表,在偶数位置插入随机的运算数,奇数位置插入运算符。
如果配置参数需要生成分数,则先随机找一个分数可插入的位置,其他的运算数插入位置可插分数或者整数。
如果运算符为除法,并且后面紧跟着的运算数为0,则需要重新将0替换为一个不为0的其他运算数
括号的插入逻辑本人做的比较简陋,有些许bug,如果配置了需要括号,则从第0个操作数到第(操作数个数/2)

注意! 左括号的插入位置是从0到操作数个数的一半之间的一个随机数,不能加上运算符个数,因为运算符后不能跟括号。

去重的逻辑

  • 首先将字符串表达式(中缀表达式)转换成二叉树
  • 对转换得到的二叉树的左右子树进行自定义排序,不管式子和二叉树结构如何,都可以生成一个根据你定的规则的字符串序列,最后比较2个表达式生成的这个序列,如果一样,则说明这两个式子是重复的。

表达式答案计算逻辑

  • 将中缀表达式转换为逆波兰表达式,然后利用一个自定义的栈结构对这个RPN进行计算
  • 计算过程可以先设置一个栈,然后遍历RPN表达式,若遍历到操作数,就将其压栈,若是运算符,就出栈两个操作数进行计算(根据遇到的运算符),最后栈中剩余的最后一个元素即为答案结果

3.运行截图

控制台

web页面

作业感想: 锻炼了自己的模块化编码能力,提高逻辑严谨性。

4.项目的PSP图

PSP2.1 PSPS Time
Planning 计划 -
· Estimate · 估计这个任务需要多少时间 20h
Development 开发 -
· Analysis · 需求分析 (包括学习新技术) 3h
· Design Spec · 生成设计文档 0.5h
· Design Review · 设计复审 (和同事审核设计文档) 1h
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 1h
· Design · 具体设计 2h
· Coding · 具体编码 3h
· Test · 测试(自我测试,修改代码,提交修改) 5h
Reporting 报告 -
· Test Report · 测试报告 1h
· Size Measurement · 计算工作量 1h
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划) 0.5h
- 合计 18h

事后总结:项目模块不是那么优雅,希望在之后的项目慢慢改正。

以上是关于四则运算生成程序(python版)的主要内容,如果未能解决你的问题,请参考以下文章

四则运算python版

小学自动生成四则运算加强版

个人项目1修改版——自动生成四则表达式

基于Python实现的四则运算生成程序

利用Python实现四则运算表达式生成程序

软件工程个人作业04-四则运算网页版