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. js注入攻击

    注入攻击一般指用户输入数据导致页面乃至整个网站.服务器异常的情况. 直接看一个例子: <html> <head> <title>Test</title> ...

  2. python爬虫数据解析之正则表达式

    爬虫的一般分为四步,第二个步骤就是对爬取的数据进行解析. python爬虫一般使用三种解析方式,一正则表达式,二xpath,三BeautifulSoup. 这篇博客主要记录下正则表达式的使用. 正则表 ...

  3. 设置radio选中

    选中: $('.viewradio:input[name="istop"][value="' + getSelected().istop + '"]').pro ...

  4. 上下div高度动态自适应--另类处理方案

    这段时间在工作中遇到一个看似较为棘手的问题.问题描述:查询报表页面分为上下两部分,上部分为条件输入区域,下部分为报表展示区域.客户要求做到默认满屏(但要动态适应不同的窗体大小,也就是浏览器窗体用户会手 ...

  5. Import Excel void (NPOI)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  7. linux安装RabbitMQ

    一.RabbitMQ概念RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.R ...

  8. Android模拟器Genymotion使用详解

    介绍 Genymotion是一款出色的跨平台的Android模拟器,具有容易安装和使用.运行速度快的特点,是Android开发.测试等相关人员的必备工具. 官网地址:https://www.genym ...

  9. Error: Cannot fit requested classes in a single dex file (# methods: 149346 > 65536)

    引用第三方库的jar文件,都有可能会触发这个错误.解决方案如下: 参考<[Android]Cannot fit requested classes in a single dex file. T ...

  10. Lucene 05 - 使用Lucene的Java API实现分页查询

    目录 1 Lucene的分页查询 2 代码示例 3 分页查询结果 1 Lucene的分页查询 搜索内容过多时, 需要考虑分页显示, 像这样: 说明: Lucene的分页查询是在内存中实现的. 2 代码 ...