Github: https://github.com/holidaysss

小组:龙天尧(代码实现),林毓植(浮点转分数函数,代码审查)

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 30  30

· Estimate

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

 30  30

Development

开发

 540  540

· Analysis

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

 60  60

· Design Spec

· 生成设计文档

 30  30

· Design Review

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

 60  60

· Coding Standard

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

 30  30

· Design

· 具体设计

 120  120

· Coding

· 具体编码

240 240

· Code Review

· 代码复审

 60  60

· Test

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

 60  60

Reporting

报告

 90  90

· Test Report

· 测试报告

 30  30

· Size Measurement

· 计算工作量

 30  30

· Postmortem & Process Improvement Plan

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

 30  30

合计

  780  780

设计实现过程:思路:四则运算题库的功能应该包括 出题,计算答案, 对比答案 这三个主要功能。

代码说明

题目生成函数:problem()  ,调用natural(),fraction()

  1. def problem(area=10): # 随机生成一道题目(自然数四则运算或分数运算),运算符不超过3个
  2. try:
  3. if random.choice([1, 2]) == 1: # 随机生成 自然数或分数 的四则运算
  4. expression, print_expression = natural(area) # 生成一个自然数运算
  5. results = demical_to_fraction(eval(expression)) # 运算结果通过demical_to_fraction()转成分数
  6. else: # 分数四则运算 和上面流程大致相同
  7. expression, print_expression = fraction(area) # 生成一个分数运算
  8. results = demical_to_fraction(eval(expression))
  9. if not results: # 无法转分数
  10. problem(area)
  11. return 0
  12. # print_expression_nums = list(filter(str.isdigit, print_expression)) # ['2','+',1']
  13. print_expression_nums = print_expression.replace('(', '').replace(')', '').split() # 将输出表达式拆解
  14. print_expression_nums.sort() # ['+', 1', '2']
  15. if results < 0 or ((str(results)in answers) and (print_expression_nums in str_num)): # 去负答案,去重复
  16. problem(area)
  17. else:
  18. results = turn_fracrtion(results) # 转化
  19. prints.append(print_expression)
  20. answers.append(results) # 答案列表
  21. str_num.append(print_expression_nums)
  22. except Exception: # 过滤分母为0的题目
  23. problem(area)

自然数运算生成 natural():

  1. def natural(area): # 生成一个自然数运算
  2. operator_num = random.randint(1, 3) # 随机运算符
  3. expression = print_expression = num = str(random.randint(1, area)) # 第一个数
  4. bracket = (random.choice(['(', '']) if not operator_num == 1 else '') # 非单运算符 可加括号
  5. for i in range(operator_num): # 随机个运算符
  6. op = str(random.choice(operators)) # 随机选择运算符 (+ - * /)
  7. if op == '-': # 若为'-',生成数字小于前一个数字
  8. num = str(random.randint(1, int(num)))
  9. else:
  10. num = str(random.randint(1, area)) # 随机数值,不超过area
  11. if bracket == ')': # 右括号在数字右边
  12. print_expression += ' ' + change(op) + ' ' + num + bracket # 用于输出的表达式 例:1×2
  13. expression += op + num + bracket # 用于eval()计算的表达式 例:1*2
  14. else: # 左括号在数字左边
  15. print_expression += ' ' + change(op) + ' ' + bracket + num
  16. expression += op + bracket + num
  17. bracket = (')' if bracket == '(' else '') # 左括号配右括号, 空配空
  18. return expression, print_expression

分数运算生成 fraction(), gen_fraction():

  1. def gen_fraciton(area): # 生成一个规范分数
  2. while True:
  3. a = random.randint(1, area)
  4. b = random.randint(1, area)
  5. if '/' in str(Fraction(a, b)):
  6. return Fraction(a, b)
  7.  
  8. def fraction(area): # 生成一个分数运算
  9. operator_num = random.randint(1, 3) # 随机运算符
  10. num = gen_fraciton(area)
  11. expression = print_expression = str(num) # 第一个分数
  12. bracket = (random.choice(['(', '']) if operator_num != 1 else '') # 超过一个运算符才需要加括号
  13. for i in range(operator_num):
  14. op = str(random.choice(operators))
  15. if op == '-': # 若为'-',生成分数小于等于前一个分数
  16. while True:
  17. next_num = gen_fraciton(area)
  18. if next_num <= num:
  19. break
  20. num = next_num
  21. else:
  22. num = gen_fraciton(area)
  23. if bracket == ')':
  24. if float(num) > 1: # 假分数转带分数 例:8/3 -> 2'2/3
  25. print_expression += ' ' + change(op) + ' ' + turn_fracrtion(num) + bracket
  26. else:
  27. print_expression += ' ' + change(op) + ' ' + str(num) + bracket
  28. expression += op + str(num) + bracket
  29. else:
  30. if float(num) >= 1:
  31. print_expression += ' ' + change(op) + ' ' + bracket + turn_fracrtion(num)
  32. else:
  33. print_expression += ' ' + change(op) + ' ' + bracket + str(num)
  34. expression += op + bracket + str(num)
  35. bracket = (')' if bracket == '(' else '') # 左括号配右括号
  36. return expression, print_expression

假分数转化函数 turn_fraction():

  1. def turn_fracrtion(results): # 假分数转带分数
  2. if isinstance(eval(str(results)), int) or (eval(str(results)) < 1): # 整数和真分数
  3. return str(results)
  4. else:
  5. return str(int(results)) + "'" + str(results - int(results)) # 假分数

符号转化函数 change():

  1. def change(a): # *,/ 转成 ×,÷
  2. if a == '*':
  3. a = '×'
  4. elif a == '/':
  5. a = '÷'
  6. return a

eval函数处理的结果出来是浮点数,不符合要求,苦想不解,让毓植写了个浮点转化分数的函数:

  1. def find_cycle(demical): # 找小数的循环体(参数为小数部分)
  2. for i in range(1, 17):
  3. cycle_part = demical[:i] # 截取小数部分的前i位,假设为循环体
  4. if len(cycle_part) < 4: # 如果循环体较短
  5. if (cycle_part*3) == demical[:3*i]: # 需要满足4次重复
  6. return cycle_part # 满足才认定为循环体
  7. else: # 如果循环体较长
  8. if (cycle_part*2) == demical[:2*i]: # 满足2次重复
  9. return cycle_part
  10. return 0 # 找不到循环体,返回0
  11.  
  12. def demical_to_fraction(n, zero_num=0): # 小数转化分数
  13. n = str(n) # 规范输入为字符串形式
  14. if len(n) < 16: # 如果是有限小数,直接返回
  15. return Fraction(n)
  16. real_num, dot_area = n.split('.') # 获取整数 和 小数
  17. float_num = float(n) # 转化一个浮点数用于计算
  18. for i in range(len(n)):
  19. cycle_start = dot_area[i:] # 从第i位开始,开始截取字符串
  20. result = find_cycle(cycle_start) # 从截取的字符串中找到循环体
  21. length = len(str(result)) # 判断循环体的长度
  22. if result: # 如果存在循环体
  23. if i != 0: # 如果循环体的开始不是小数点后第一位 eg 0.13888888
  24. new_number = float_num*(10**i) # 移位数使循环体是小数点后的开始 eg 13.8888
  25. demical_to_fraction(new_number, i) # 将新生成的数递归使用
  26. break
  27. else: # 如果循环体直接在小数点后的第一位
  28. fraction = Fraction(int(result), int(''*length)) # 小数部分转化为分数 /数学知识需要了解
  29. final_num = int(real_num) + fraction # 小数点前的部分需要从重新加上
  30. return final_num/(10**zero_num) # 回退移的位数

以上是主要函数

具体源码后面会上传到github

运行结果

生成一万道题:

小学生就可以在记事本上做题啦

一年后。。

感觉良好

开始对答案

还行

为了方便家长了解学生的成绩,  在  答案对比 处增加了水型球比例图。(具体代码Github已更新,这里就不修改了)

好了。。。

 问题记录:1.出现了溢出错误,发现是条件判断的问题,已修改。  2.优化逻辑,分解problem()函数。 3.修改去重逻辑,优化程序运行速度. 4.拓展对比答案功能,增加水型球比例图。 5.需求看错了,过程不能出现负数看出结果不出现负数, 已修改。

      6. 忘记吧结果的假分数转化了。。已补上。 7.日常优化。。。。。。。。 8.优化答案对比  ( 最后一次改了,再改我

项目小结:这个项目挺有意思的,主要运用到”随机性“,小逻辑特别多,主要思路还是有迹可循的,继续努力,加油。

小学生噩梦——四则运算题库(python 全功能实现)的更多相关文章

  1. python实现四则运算题库

    #主函数(main.py) from generator import Ari_Expression from infixTosuffix import infix_to_suffix import ...

  2. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  3. 考前自救题库NABCD分析

    考前自救题库NABCD分析 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 项目名称:考前自救题库(暂定) 项目简介:本产品计 ...

  4. python的库小全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  5. Python中tab键自动补全功能的配置

    新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...

  6. 『Python题库 - 填空题』151道Python笔试填空题

    『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...

  7. 30道小学生四则运算题C/C++编程

    软件工程科课上,老师通过实例讲解什么是程序,程序和软件的区别,要求我们通过短时间写一道编程题, 题目就是编写30道小学生四则运算题.以下就是源代码: #include<iostream.h> ...

  8. python学习笔记--导入tab键自动补全功能的配置

    今天开始学习Python,必须配置tab键补全功能 1.首先我们需要查看python的安装路径 [root@abc ~]# python Python 2.6.6 (r266:84292, Jan 2 ...

  9. 【托业】【全真题库】TEST01-03-阅读题

    [托业][全真题库]TEST01-03-阅读题

随机推荐

  1. js实现按钮开关.单机下拉菜单

    通过onclick单击事件,实现效果,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf- ...

  2. python第三方库------jieba库(中文分词)

    jieba“结巴”中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点支持三种分词模式: 精确模式,试图将句子最精确地切开, ...

  3. Rhino学习教程——1.1

    在Rhino的官网下载好Rhino5.0版本后(Rhino官网会提供下载方式,官网是http://www.xuexiniu.com),双击桌面快捷键,就会出现Rhino的界面(我已经自定义过界面了). ...

  4. api接口开发跨域注意事项和设置

    因为跨域请求会先发送一个OPTIONS请求,所以需要判断下OPTIONS请求的就直接返回 if(strtoupper($_SERVER['REQUEST_METHOD'])== 'OPTIONS'){ ...

  5. FORTH 发展(部分)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  6. 部署你的CRM程序

    教你发布CRM   发布CRM你将使用以下软件 nginx uWSGI CentOS7 CRM项目文件 virtualenv supervisor WSGI.uWSGI python web服务器开发 ...

  7. centos7搭建日志服务器

    服务器端 修改配置文件 /etc/rsyslog.conf中 $ModLoad imudp $UDPServerRun 514 打开日志服务监听 修改/etc/sysconfig/rsyslog文件 ...

  8. 并查集(POJ1182)

    链接:http://poj.org/problem?id=1182 定义一种关系R(x,y),x > y 时 R(x,y) = 2:x = y 时 R(x,y)= 1:x < y 时 R( ...

  9. fastJson遇到的问题

    概述 现在的代码开发中,json这种数据类型使用的是越来越多,因为它的存取速度都比较快,而且,使用起来非常的简单,今天工作的时候,我就遇到了一个关于json的生产问题,这个问题我之前确实还没有注意过, ...

  10. js问题解决——cannot read property style of undefind

    当遇到cannot read property style of undefine的问题如下: 那就说明你设定的这个变量名为空 比如我在文档里写的属性名为list_box 但是我获取的属性名称写错了 ...