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]LeetCode32. 最长有效括号 | Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  2. 北上广等一线城市IT岗位已接近饱和?

    IT行业的技术者,时常被我们戏称为「IT民工」,虽然行业内巨大的人才需求和相对容易得到的高薪在源源不断的吸引各路人马加入,但它依旧在全球最缺人的十大行业中位居榜首. 我身边的朋友大都问过我这样一个疑问 ...

  3. Java IO流读取文件

    使用指定编码读取文件 public static String toString(File file, String charset){ StringBuilder result = new Stri ...

  4. 【Storm篇】--Storm分组策略

    一.前述 Storm由数源泉spout到bolt时,可以选择分组策略,实现对spout发出的数据的分发.对多个并行度的时候有用. 二.具体原理 1. Shuffle Grouping 随机分组,随机派 ...

  5. Python内置函数(22)——float

    英文文档: class float([x]) Return a floating point number constructed from a number or string x. If the ...

  6. Python常见面试题

    Q 1:Python 有哪些特点和优点? 作为一门编程入门语言,Python 主要有以下特点和优点: ● 可解释● 具有动态特性● 面向对象● 简明简单● 开源● 具有强大的社区支持当然,实际上 Py ...

  7. Zookeeper知识点

    Zookeeper是一个分布式协调服务 Zookeeper服务器的角色 Leader: 所有的写操作必须要经过Leader完成,在广播给其它服务器.心跳检测.集群中只有一个Leader. Follow ...

  8. Java类文件的结构

    Class文件是以8位字节为基础单位的二进制流,各部分中间没有分隔符.遇到8位字节以上的空间数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储. Class文件采用类似C语言的伪结构体来存储 ...

  9. 基于 Zookeeper 的分布式锁实现

    1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个“类 Unix/Linu ...

  10. Linux基础知识第七讲,用户权限以及用户操作命令

    目录 Linux基础知识第七讲,用户权限以及用户操作命令 一丶简介linux用户,用户权限,组的概念. 1.1 基本概念 1.2 组 1.3 ls命令查看权限. 二丶用户权限修改命令 1.chmod ...