需求分析(描述自己对需求的理解,以及后续扩展的可能性)

实现一个命令行程序,要求:

  • 自动生成小学四则运算题目(加,减,乘,除)
  • 支持整数
  • 支持多运算符(比如生成包含100个运算符的题目)
  • 支持真分数
  • 统计正确率

设计思路(同时输出UML类图)

首先要输入生成题目的数目m

  • 计算机根据输入的数目生成m道题
  • 每道题生成的数字要随机且在0~10之间,且要生成分数
  • 生成的字符也要随机且字符数在1~100之间,字符不止加减乘除,还有括号,除的时候要考虑除数不能为零

    用户输入值和计算机原本结果进行对比
  • 如果正确,则输出正确
  • 如果错误,则输出错误,正确答案为:输出答案,还应包括真分数计算

    答题结束后,计算机自动计算答题正确率

实现过程中的关键代码解释

计算生成题目

  1. package CaculateSystem;
  2. import java.util.Random;
  3. public class ProduceProblem {
  4. public int ProduceProblem () {
  5. String s = "";
  6. Random shu = new Random();//每个运算式的随机数
  7. int count = 1; //记录符号;
  8. char[] operator = new char[]{'+', '-', '*', '/'};
  9. int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
  10. for (int j = 0; j < m; j++) {
  11. int num = shu.nextInt(10);
  12. s = s +" "+ num;
  13. if (count < m) {
  14. int c = shu.nextInt(4);
  15. s = s +" "+ operator[c];
  16. count++;
  17. }
  18. }
  19. String [] str = s.split(" ");
  20. System.out.println(s + "=");
  21. Translate t = new Translate(str);
  22. return t.flag;
  23. }
  24. }

将中缀转换为后缀

  1. package CaculateSystem;
  2. import java.util.Stack;
  3. public class Translate extends Judge{
  4. int flag;
  5. public Translate (String[] args) {
  6. Stack<String> z = new Stack<String>();
  7. String jieguo = "";
  8. String t = "";
  9. for (int i = 0; i < args.length; i++) {
  10. switch (args[i]) {
  11. case "(":
  12. z.push(args[i]);
  13. break;
  14. case "+":
  15. case "-":
  16. while(z.empty() != true) {
  17. t = z.pop();
  18. if (t.equals("(")) {
  19. z.push(t);
  20. break;
  21. }
  22. jieguo = jieguo + t + " ";
  23. }
  24. z.push(args[i]);
  25. break;
  26. case "*":
  27. case "/":
  28. while(z.empty() != true) {
  29. t = z.pop();
  30. if (t.equals("+") || t.equals("-") || t.equals("(")) {
  31. z.push(t);
  32. break;
  33. }
  34. jieguo = jieguo + t + " ";
  35. }
  36. z.push(args[i]);
  37. break;
  38. case ")":
  39. while (z.empty()== false) {
  40. t = z.pop();
  41. if (t.equals("(")) {
  42. break;
  43. } else {
  44. jieguo = jieguo + t + " ";
  45. }
  46. }
  47. break;
  48. case" ":
  49. break;
  50. default:
  51. jieguo = jieguo + args[i] + " ";
  52. break;
  53. }
  54. }
  55. while (z.empty() == false) {
  56. jieguo = jieguo + z.pop() + " ";
  57. }
  58. String [] str = jieguo.split(" ");
  59. Count py = new Count(str);
  60. int answer = py.answer;
  61. flag = A(answer);
  62. }
  63. public Translate() {
  64. }
  65. }

生成分数

  1. package CaculateSystem;
  2. import java.util.Random;
  3. public class CreatOpNum {
  4. Rational opNum = new Rational();
  5. Random random = new Random();
  6. String opnumFile = "";
  7. String opnumPri = "";
  8. int flag;
  9. CreatOpNum(int flag1) {
  10. flag = flag1;
  11. int a = random.nextInt(9)+1;
  12. opNum.setNumerator(a);
  13. if (flag1 == 1) {//是分数
  14. int b = random.nextInt(9)+1;
  15. while (b == 0) {
  16. b = random.nextInt(9)+1;
  17. }
  18. opNum.setDenominator(b);
  19. } else {//不是分数
  20. opNum.setDenominator(1);
  21. }
  22. }
  23. public void getOpNumFile() {
  24. opnumFile = opNum.getNumerator() + " / " + opNum.getDenominator();
  25. }
  26. public void getOpNumPri() {
  27. if (flag == 0) {
  28. opnumPri = opNum.getNumerator() + "";//输出整数
  29. } else if (opNum.getNumerator() > opNum.getDenominator()) {//假分数
  30. int n = opNum.getNumerator() / opNum.getDenominator();
  31. int m = opNum.getNumerator() % opNum.getDenominator();
  32. opnumPri = n + " + " + m + " / " + opNum.getDenominator();
  33. } else {
  34. opnumPri = opNum.getNumerator() + " / " + opNum.getDenominator();
  35. }
  36. }
  37. }

带分数的计算

  1. package CaculateSystem;
  2. public class Rational {//有理数
  3. int numerator = 1;//分子
  4. int denominator = 1;//分母
  5. void setNumerator(int a) {//设置分子
  6. int c = f(Math.abs(a), denominator);//计算最大公约数
  7. numerator = a / c;
  8. denominator = denominator / c;
  9. if (numerator < 0 && denominator < 0) {
  10. numerator = -numerator;
  11. denominator = -denominator;
  12. }
  13. }
  14. void setDenominator(int b) {//设置分母
  15. int c = f(numerator, Math.abs(b));//计算最大公约数
  16. numerator = numerator / c;
  17. denominator = b / c;
  18. if (numerator < 0 && denominator < 0) {
  19. numerator = -numerator;
  20. denominator = -denominator;
  21. } else if (numerator > 0 && denominator < 0) {
  22. numerator = -numerator;
  23. denominator = -denominator;
  24. }
  25. }
  26. int getNumerator() {
  27. return numerator;
  28. }
  29. int getDenominator() {
  30. return denominator;
  31. }
  32. int f(int a, int b) {//求a,b的最大公约数
  33. if (a == 0) {
  34. return 1;//c为分母不能为0
  35. }
  36. if (a < b) {//令a>b
  37. int c = a;
  38. a = b;
  39. b = c;
  40. }
  41. int r = a % b;
  42. while (r != 0) {
  43. a = b;
  44. b = r;
  45. r = a % b;
  46. }
  47. return b;
  48. }
  49. Rational add(Rational r) {//加法运算
  50. int a = r.getNumerator();//返回有理数r的分子
  51. int b = r.getDenominator();//返回有理数r的分母
  52. int newNumerator = numerator * b + denominator * a;//计算出新分子
  53. int newDenominator = denominator * b;//计算出新分母
  54. Rational result = new Rational();
  55. result.setNumerator(newNumerator);
  56. result.setDenominator(newDenominator);
  57. return result;
  58. }
  59. Rational sub(Rational r) {//减法运算
  60. int a = r.getNumerator();
  61. int b = r.getDenominator();
  62. int newNumerator = numerator * b - denominator * a;
  63. int newDenominator = denominator * b;
  64. Rational result = new Rational();
  65. result.setNumerator(newNumerator);
  66. result.setDenominator(newDenominator);
  67. return result;
  68. }
  69. Rational muti(Rational r) {//乘法运算
  70. int a = r.getNumerator();
  71. int b = r.getDenominator();
  72. int newNumerator = numerator * a;
  73. int newDenominator = denominator * b;
  74. Rational result = new Rational();
  75. result.setNumerator(newNumerator);
  76. result.setDenominator(newDenominator);
  77. return result;
  78. }
  79. Rational div(Rational r) {//除法运算
  80. int a = r.getNumerator();
  81. int b = r.getDenominator();
  82. Rational result = new Rational();
  83. if (a == 0) {
  84. System.out.println("分母/除数不能为0");
  85. result.setNumerator(0);
  86. System.exit(0);
  87. } else {
  88. int newNumerator = numerator * b;
  89. int newDenominator = denominator * a;
  90. result.setNumerator(newNumerator);
  91. result.setDenominator(newDenominator);
  92. }
  93. return result;
  94. }
  95. }

测试方法

运行过程截图

代码托管地址

代码托管

对结对的小伙伴做出评价(重点指出需要改进的地方)

本周我的小伙伴还是一如既往的给力,大部分的任务还是在他帮助下完成的,对我不懂的地方也认真给我解答,对我的帮助很大。

总结

本周完成了括号和分数的任务,结对真的比一个人有用,而且1+1>2是真的可以实现,虽然有的任务我们还没有完成,但是我们还会继续努力的。

PSP

计划 预估耗时(分钟) 实际耗时(分钟)
估计这个任务需要多少时间 200 200
开发
需求分析 (包括学习新技术) 120 150
生成设计文档 30 30
设计复审 (和同事审核设计文档) 60 75
代码规范 (为目前的开发制定合适的规范) 90 105
具体设计 30 60
具体编码 720 810
代码复审 60 60
测试(自我测试,修改代码,提交修改) 90 90
报告
测试报告 20 20
计算工作量 10 10
事后总结, 并提出过程改进计划 240 270
合计 1500 1710

参考引用

http://www.cnblogs.com/math/p/se-tools-001.html

http://www.cnblogs.com/vertextao/p/6593339.html

http://www.cnblogs.com/Vivian517/p/8762830.html

https://blog.csdn.net/newgrammer/article/details/757522

https://en.wikipedia.org/wiki/Polish_notation

《java程序设计》结对编程-四则运算整体总结的更多相关文章

  1. 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)

    结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...

  2. 结对编程--四则运算(Java)梅进鹏 欧思良

    结对编程--四则运算(Java)梅进鹏 欧思良 Github项目地址:https://github.com/MeiJinpen/Arithmetic 功能要求 题目:实现一个自动生成小学四则运算题目的 ...

  3. 20175305张天钰Java结对编程四则运算(二)

    Java结对编程四则运算(二) 一.题目描述及要求 Git提交粒度不要太粗,建议一个文件/一个类/一个函数/一个功能/一个bug修复都进行提交,不能一天提交一次,更不能一周一次,参考Commit Me ...

  4. 20175305张天钰Java结对编程四则运算

    Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...

  5. 结对编程--四则运算(Java)萧英杰 夏浚杰

    结对编程--四则运算(Java)萧英杰 夏浚杰 Github项目地址 功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 使用 -n 参数控制生成题目的个数(实现) 使用 -r 参数控制题目 ...

  6. Java结对编程四则运算一周小结

    Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...

  7. 王译潇20162314 实验报告三plus结对编程四则运算第一阶段

    北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...

  8. 结对编程-四则运算生成器(java实现)

     结对伙伴:陈振华  项目要求 1.题目:实现一个自动生成小学四则运算题目的命令行程序. 2.需求: 1. 使用 -n 参数控制生成题目的个数 2. 使用 -r 参数控制题目中数值(自然数.真分数和真 ...

  9. 结对编程 四则运算(java)(胡大华 黄绪明)

    Github项目地址 https://github.com/yogurt1998/Myapp 项目需求 题目: 实现一个自动生成小学四则运算题目的命令行程序 功能 1.使用-n 参数控制生成题目的个数 ...

随机推荐

  1. Spring核心组件剖析

    简介 Spring框架如今已成为服务端开发框架中的主流框架之一,是web开发者的利器.然而,真正让人着迷的,还是与其实现相关的 原理,设计模式以及许多工程化的思想.本文主要探讨Spring的三大核心组 ...

  2. 关闭应用程序(主程序)(WPF)

    很多人认为关闭应用程序应该很简单,例如WindowsForm里一个Application.Exit();方法就可以解决问题,但在WPF里面可别滥用,因为WPF里Application类没有该方法,倒是 ...

  3. 增加swap分区,文件形式

    查看swap a: sudo swapon -s b: free -m 文件方式: 1. 生成 生成一个1Gb(bs*count)的文件 [root@localhost ~]# dd if=/dev/ ...

  4. django中命令行调试程序

    (1)进入到程序manage.py所在的目录下 (2)python manage.py shell 这样可在命令行中引入models.views.class等所有的包,然后进行命令行试运行.

  5. nltk——文本分类

      sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003 ...

  6. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  7. python自动化运维之路~DAY2

    python自动化运维之路~DAY2 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符编码与转码 1.什么是编码. 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类 ...

  8. mySQL数值类型的取值范围

    如下图,int最大为2145483647,手机号码应该用bigint

  9. Git撤销&回滚操作

    https://blog.csdn.net/ligang2585116/article/details/71094887 开发过程中,你肯定会遇到这样的场景: 场景一: 糟了,我刚把不想要的代码,co ...

  10. Neural Networks and Deep Learning 课程笔记(第四周)深层神经网络(Deep Neural Networks)

    1. 深层神经网络(Deep L-layer neural network ) 2. 前向传播和反向传播(Forward and backward propagation) 3. 总结 4. 深层网络 ...