1.Github项目地址

https://github.com/baiyexing/myapp.git

2.功能要求

题目:实现一个自动生成小学四则运算题目的命令行程序

功能(已全部实现)

  1. 使用 -n 参数控制生成题目的个数
  2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
  3. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2
  4. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数
  5. 每道题目中出现的运算符个数不超过3个
  6. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目
  7. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt
  8. 程序应能支持一万道题目的生成
  9. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,统计结果输出到文件Grade.txt

3.解题思路

  大致思路为,随机生成操作符数目,调用方法递归生成式子,同时表示成二叉树,同时规范化二叉树(好查重)。数字,运算符都用方法随机生成。

4.设计实现过程

  (1)Question类:生成式子,包括获得随机数,获得随机运算符,计算算式结果,将结果化简,规范化二叉树等方法。

  (2)Parameter类:处理结果,包括获取命令行参数,查重,写入文件,判断答案等方法。

5.代码说明

     只说明部分重要和难点代码

  (1)生成式子的主要方法,采用递归方式,随机生成式子,存为二叉树形式,保存在字典中。

 def expression2(self,count):#生成式子
if count == 1:
figure = self.getnumber()
return{
'expression_array': figure['figure'],
'expression': figure['figure_char'],
'answer': figure['figure_array']
}
else :
leftcount = self.getrandom(count -1)
rightcount = count - leftcount left = self.expression2(leftcount)
right = self.expression2(rightcount) operate = self.getrandom(4) if operate == 4 and right['answer'][0] == 0:
t = left
left = right
right = t
answer = self.Calculation(left['answer'],right['answer'],operate)
if answer[0] < 0:
t = left
left = right
right = t
answer = self.Calculation(left['answer'],right['answer'],operate) leftvalue = left['answer'][0]/left['answer'][1]
rightvalue = right['answer'][0]/right['answer'][1]
expression_array = [left['expression_array'],operate,right['expression_array']]

  (2)规范化二叉树,按左右子树为数数,数树,树树来判定规范。

if type(left['expression_array'])!=list and type(right['expression_array'])!=list: #两个子树都为值
if (operate == 1 or operate == 3) and leftvalue < rightvalue:
expression_array = [right['expression_array'],operate,left['expression_array']]
elif type(left['expression_array'])==list and type(right['expression_array'])==list:# 两个子树都为树
if operate == 1 or operate == 3:
if leftvalue == rightvalue and left['expression_array'][1] < right['expression_array'][1]:#树的值相等时,运算符优先级高的在左边
expression_array = [right['expression_array'],operate,left['expression_array']]
elif leftvalue < rightvalue :
expression_array = [right['expression_array'],operate,left['expression_array']]
if operate in [3,4] :
if left['expression_array'][1] in [1,2]:
left['expression'] = '(' + left['expression'] + ')'
if right['expression_array'][1] in [1,2]:
right['expression'] = '(' + right['expression'] + ')'
else:#一边的子树为树
if operate == 1 or operate == 3:
if type(right['expression_array']) == list:
expression_array = [right['expression_array'],operate,left['expression_array']]
if operate in [3,4] :
if type(left['expression_array']) == list and left['expression_array'][1] in [1,2] :
left['expression'] = '(' + left['expression'] + ')'
if type(right['expression_array']) == list and right['expression_array'][1] in[1,2]:
right['expression'] = '(' + right['expression'] + ')'

  (3)生成算式列表,判重。

def getexpression_list(self, expression_count, number_range, count, probability) :# 算式
List = []
i = 0
while i < expression_count:
expression = Question(number_range,count,probability)
while self.check(expression,List):
expression = Question(number_range,count,probability)
List.append({
'expression_array': expression.__dict__['expression_array'],#二叉树表示
'expression': expression.__dict__['expression'],#算式表达形式
'answer': expression.__dict__['answer'],#答案
'answer_char': expression.__dict__['answer_char']#答案表达形式 })
i += 1
return List def check(self,expression,List):#查重方法
expressionarray = expression.__dict__['expression_array']
for i in List:
if expressionarray == i['expression_array']:
return True
return False

6.测试运行

·全部功能

·-n,支持生成10000道题目

·-r 为100时

·答案文件

·答案判定

7.PSP表格

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

50

40

· Estimate

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

50

40

Development

开发

1215

1300

· Analysis

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

80

85

· Design Spec

· 生成设计文档

60

40

· Design Review

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

50

45

· Coding Standard

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

35

30

· Design

· 具体设计

70

60

· Coding

· 具体编码

800

820

· Code Review

· 代码复审

55

50

· Test

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

65

70

Reporting

报告

105

110

· Test Report

· 测试报告

30

35

· Size Measurement

· 计算工作量

25

30

· Postmortem & Process Improvement Plan

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

50

45

合计

1370

1480

8.项目小结

  这次的题目比上次的难得多,但收获也多得的多。我终于懂得结构化代码的重要性,不然代码过长乱成一团自己也看不懂。同时也学到了python语言许多新的知识。最重要的,这次是结对编程,第一次接触到这种编程方式,两个人坐在一起,一个人主要编写,另一个人在旁提意见,映像最深的一个好处就是嘉帆同学总是能很快的发现代码中的小错误小bug,别小看这些,有时候自己经常因为这些容易忽视的小错误,跑不了代码,而自己始终找不到bug而导致浪费许多时间。这时候队友常常可以轻而易举的指出错误,大大节省了时间。而且两个人一起讨论常常会有不一样的思路,讨论验证的过程能更好的增加我们对相关知识的理解。

myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)的更多相关文章

  1. 实现一个自动生成小学四则运算题目的命令行程序(java实现)

    Github项目地址:https://github.com/xiaobaot/wordcount/tree/master/sizeyusuan 团队成员:谢家明(代码生成)    谢竣(测试完善) 项 ...

  2. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  3. Individual Project "写一个能自动生成小学四则运算题目的程序"

    一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...

  4. Python实现自动生成小学四则运算题目

    Github地址: https://github.com/guoyuyi/gyy.github.io/blob/%E4%BD%9C%E4%B8%9A1/zy1.py 题目描述: 通过python语言编 ...

  5. C语言:一个能自动生成小学四则运算题目的程序

    完成这个程序,半个小时内完成了,这个程序,可以自动生成小学简易的四则运算,提供菜单让用户选择,然后判断加减乘除,判断答对答错的题目个数,用户同时也可以重新选择继续答题或重新选择或退出程序. 源程序: ...

  6. python实现自动生成小学四则运算题目(软工第二次项目作业)

    前言 软件工程 传送带 作业要求 传送带 作业目标 结对编程:代码实现.性能分析.异常处理说明.记录PSP表格 代码见: github 个人信息:朱育清 3118005437 信安二班 我的partn ...

  7. java实现自动生成小学四则运算——朱庭震,詹祺豪

    组员:朱庭震,詹祺豪 Github地址:https://github.com/ztz1998/second/tree/master 1题目:实现一个自动生成小学四则运算题目的命令行程序. 2说明: 自 ...

  8. 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’

    这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...

  9. 手写笔记变PDF-几行代码变命令行程序为图形化界面

    前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...

随机推荐

  1. [Swift]LeetCode523. 连续的子数组和 | Continuous Subarray Sum

    Given a list of non-negative numbers and a target integer k, write a function to check if the array ...

  2. 微信小程序请求API接口PHPSESSID变化的解决方式

    微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...

  3. 分布式事务之如何基于RocketMQ的事务消息特性实现分布式系统的最终一致性?

    导读 在之前的文章中我们介绍了如何基于RocketMQ搭建生产级消息集群,以及2PC.3PC和TCC等与分布式事务相关的基本概念(没有读过的读者详见

  4. ueditor的简单配置和使用

    在项目中需要使用到富文本编辑器,我们选用的是ueditor,这是由百度web前端研发部开发所见即所得富文本web编辑器,功能比较强大,可以完成文本的编辑,图片的上传等功能.本文对ueditor的配置使 ...

  5. 深入理解OkHttp源码(三)——网络操作

    这篇博客侧重于了解OkHttp的网络部分,包括Socket的创建.连接,连接池等要点.OkHttp对Socket的流操作使用了Okio进行了封装,本篇博客不做介绍,想了解的朋友可以参考拆轮子系列:拆O ...

  6. webdav 概览

    webdav 概览 WebDav(Web Distributed Authoring and Versioning) 是一个控制远端Web资源的协议,它基于HTTP1.1.它的定义在RFC 4918( ...

  7. ElasticSearch(2)---SpringBoot整合ElasticSearch

    SpringBoot整合ElasticSearch 一.基于spring-boot-starter-data-elasticsearch整合 开发环境:springboot版本:2.0.1,elast ...

  8. 什么样的IT业务适合外包?

    很多公司都应该遇到过这样的问题,什么样的IT业务才适合外包呢? 百度大家都可以百度的到一些信息,比如: 针对这样的推荐答案,是否也需要认真思考一下,我需要外包的业务是什么样的业务?是不是真的适合外包? ...

  9. PL/SQL基础语法入门

    先前安装了PL/SQL软件 PL/SQL全称为Procedural Language/SQL. PL/SQL也是一种程序语言,叫做过程化SQL语言,是Oracle数据库对SQL语句的扩展 打PL/SQ ...

  10. 带着新人学springboot的应用07(springboot+RabbitMQ 下)

    说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...