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)生成式子的主要方法,采用递归方式,随机生成式子,存为二叉树形式,保存在字典中。

  1. def expression2(self,count):#生成式子
  2. if count == 1:
  3. figure = self.getnumber()
  4. return{
  5. 'expression_array': figure['figure'],
  6. 'expression': figure['figure_char'],
  7. 'answer': figure['figure_array']
  8. }
  9. else :
  10. leftcount = self.getrandom(count -1)
  11. rightcount = count - leftcount
  12.  
  13. left = self.expression2(leftcount)
  14. right = self.expression2(rightcount)
  15.  
  16. operate = self.getrandom(4)
  17.  
  18. if operate == 4 and right['answer'][0] == 0:
  19. t = left
  20. left = right
  21. right = t
  22. answer = self.Calculation(left['answer'],right['answer'],operate)
  23. if answer[0] < 0:
  24. t = left
  25. left = right
  26. right = t
  27. answer = self.Calculation(left['answer'],right['answer'],operate)
  28.  
  29. leftvalue = left['answer'][0]/left['answer'][1]
  30. rightvalue = right['answer'][0]/right['answer'][1]
  31. expression_array = [left['expression_array'],operate,right['expression_array']]

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

  1. if type(left['expression_array'])!=list and type(right['expression_array'])!=list: #两个子树都为值
  2. if (operate == 1 or operate == 3) and leftvalue < rightvalue:
  3. expression_array = [right['expression_array'],operate,left['expression_array']]
  4. elif type(left['expression_array'])==list and type(right['expression_array'])==list:# 两个子树都为树
  5. if operate == 1 or operate == 3:
  6. if leftvalue == rightvalue and left['expression_array'][1] < right['expression_array'][1]:#树的值相等时,运算符优先级高的在左边
  7. expression_array = [right['expression_array'],operate,left['expression_array']]
  8. elif leftvalue < rightvalue :
  9. expression_array = [right['expression_array'],operate,left['expression_array']]
  10. if operate in [3,4] :
  11. if left['expression_array'][1] in [1,2]:
  12. left['expression'] = '(' + left['expression'] + ')'
  13. if right['expression_array'][1] in [1,2]:
  14. right['expression'] = '(' + right['expression'] + ')'
  15. else:#一边的子树为树
  16. if operate == 1 or operate == 3:
  17. if type(right['expression_array']) == list:
  18. expression_array = [right['expression_array'],operate,left['expression_array']]
  19. if operate in [3,4] :
  20. if type(left['expression_array']) == list and left['expression_array'][1] in [1,2] :
  21. left['expression'] = '(' + left['expression'] + ')'
  22. if type(right['expression_array']) == list and right['expression_array'][1] in[1,2]:
  23. right['expression'] = '(' + right['expression'] + ')'

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

  1. def getexpression_list(self, expression_count, number_range, count, probability) :# 算式
  2. List = []
  3. i = 0
  4. while i < expression_count:
  5. expression = Question(number_range,count,probability)
  6. while self.check(expression,List):
  7. expression = Question(number_range,count,probability)
  8. List.append({
  9. 'expression_array': expression.__dict__['expression_array'],#二叉树表示
  10. 'expression': expression.__dict__['expression'],#算式表达形式
  11. 'answer': expression.__dict__['answer'],#答案
  12. 'answer_char': expression.__dict__['answer_char']#答案表达形式
  13.  
  14. })
  15. i += 1
  16. return List
  17.  
  18. def check(self,expression,List):#查重方法
  19. expressionarray = expression.__dict__['expression_array']
  20. for i in List:
  21. if expressionarray == i['expression_array']:
  22. return True
  23. 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]LeetCode557. 反转字符串中的单词 III | Reverse Words in a String III

    Given a string, you need to reverse the order of characters in each word within a sentence while sti ...

  2. [Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  3. winform文件筛选器

    在.net 框架中,微软给我们封装了一个用于打开文件的对话框——OpenFileDialog.而该对话框包含一个可以筛选文件的属性——Filter,利用该属性,可选筛选出我们需要的文件.   因此,我 ...

  4. Java集合类常见的问题

    本篇文章将尝试回答一些Java集合类常见的问题,以作知识梳理之用. ArrayList和LinkList以及Vector的区别 就实现方式而言: ArrayList是以数组的方式实现的列表. Link ...

  5. api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决

    api-ms-win-crt-process-l1-1-0.dll 丢失的处理 简介 在换了新电脑后,一些环境需要重新搭建,本以为是个小case,没想到竟然遇到了各种拦路虎. 在成功安装Python3 ...

  6. qcharts编译

    编译环境vs2013+qt5.5.1+perl5 qchart源码在git上自己下载,或者在此下载,参考文档:Qt Charts 5.7.0 安装教程,这篇文章是使用mingw的方式编译qcharts ...

  7. nginx替换响应内容

    因为想要将非业务域名内嵌到微信小程序中,所以用到了nginx的反向代理功能来替换域名实现盗站(缘起:http://www.cnblogs.com/kenwar/p/8288882.html),但是替换 ...

  8. Redis学习——数据结构介绍(四)

    一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合) ...

  9. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  10. asp.net core 系列 8 Razor框架路由(下)

    三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...