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

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

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

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

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

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

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

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

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

计算生成题目

package CaculateSystem;
import java.util.Random; public class ProduceProblem {
public int ProduceProblem () {
String s = "";
Random shu = new Random();//每个运算式的随机数
int count = 1; //记录符号;
char[] operator = new char[]{'+', '-', '*', '/'};
int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数
for (int j = 0; j < m; j++) {
int num = shu.nextInt(10);
s = s +" "+ num;
if (count < m) {
int c = shu.nextInt(4);
s = s +" "+ operator[c];
count++;
}
}
String [] str = s.split(" ");
System.out.println(s + "=");
Translate t = new Translate(str);
return t.flag;
}
}

将中缀转换为后缀

package CaculateSystem;
import java.util.Stack; public class Translate extends Judge{
int flag;
public Translate (String[] args) {
Stack<String> z = new Stack<String>();
String jieguo = "";
String t = "";
for (int i = 0; i < args.length; i++) {
switch (args[i]) {
case "(":
z.push(args[i]);
break;
case "+":
case "-":
while(z.empty() != true) {
t = z.pop();
if (t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case "*":
case "/":
while(z.empty() != true) {
t = z.pop();
if (t.equals("+") || t.equals("-") || t.equals("(")) {
z.push(t);
break;
}
jieguo = jieguo + t + " ";
}
z.push(args[i]);
break;
case ")":
while (z.empty()== false) {
t = z.pop();
if (t.equals("(")) {
break;
} else {
jieguo = jieguo + t + " ";
}
}
break;
case" ":
break; default:
jieguo = jieguo + args[i] + " ";
break;
} } while (z.empty() == false) {
jieguo = jieguo + z.pop() + " ";
}
String [] str = jieguo.split(" ");
Count py = new Count(str);
int answer = py.answer;
flag = A(answer);
} public Translate() { }
}

生成分数

package CaculateSystem;

import java.util.Random;

public class CreatOpNum {
Rational opNum = new Rational();
Random random = new Random();
String opnumFile = "";
String opnumPri = "";
int flag; CreatOpNum(int flag1) {
flag = flag1;
int a = random.nextInt(9)+1;
opNum.setNumerator(a);
if (flag1 == 1) {//是分数
int b = random.nextInt(9)+1;
while (b == 0) {
b = random.nextInt(9)+1;
}
opNum.setDenominator(b);
} else {//不是分数
opNum.setDenominator(1);
}
} public void getOpNumFile() {
opnumFile = opNum.getNumerator() + " / " + opNum.getDenominator();
} public void getOpNumPri() {
if (flag == 0) {
opnumPri = opNum.getNumerator() + "";//输出整数
} else if (opNum.getNumerator() > opNum.getDenominator()) {//假分数
int n = opNum.getNumerator() / opNum.getDenominator();
int m = opNum.getNumerator() % opNum.getDenominator();
opnumPri = n + " + " + m + " / " + opNum.getDenominator();
} else {
opnumPri = opNum.getNumerator() + " / " + opNum.getDenominator();
}
}
}

带分数的计算

package CaculateSystem;
public class Rational {//有理数
int numerator = 1;//分子
int denominator = 1;//分母 void setNumerator(int a) {//设置分子
int c = f(Math.abs(a), denominator);//计算最大公约数
numerator = a / c;
denominator = denominator / c;
if (numerator < 0 && denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
} void setDenominator(int b) {//设置分母
int c = f(numerator, Math.abs(b));//计算最大公约数
numerator = numerator / c;
denominator = b / c;
if (numerator < 0 && denominator < 0) {
numerator = -numerator;
denominator = -denominator;
} else if (numerator > 0 && denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
} int getNumerator() {
return numerator;
} int getDenominator() {
return denominator;
} int f(int a, int b) {//求a,b的最大公约数
if (a == 0) {
return 1;//c为分母不能为0
}
if (a < b) {//令a>b
int c = a;
a = b;
b = c;
}
int r = a % b;
while (r != 0) {
a = b;
b = r;
r = a % b;
}
return b;
} Rational add(Rational r) {//加法运算
int a = r.getNumerator();//返回有理数r的分子
int b = r.getDenominator();//返回有理数r的分母
int newNumerator = numerator * b + denominator * a;//计算出新分子
int newDenominator = denominator * b;//计算出新分母
Rational result = new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
} Rational sub(Rational r) {//减法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b - denominator * a;
int newDenominator = denominator * b;
Rational result = new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
} Rational muti(Rational r) {//乘法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * a;
int newDenominator = denominator * b;
Rational result = new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
} Rational div(Rational r) {//除法运算
int a = r.getNumerator();
int b = r.getDenominator();
Rational result = new Rational();
if (a == 0) {
System.out.println("分母/除数不能为0");
result.setNumerator(0);
System.exit(0);
} else {
int newNumerator = numerator * b;
int newDenominator = denominator * a;
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
}
return result;
}
}

测试方法

运行过程截图

代码托管地址

代码托管

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

挺开心我的同伴能接受与我组队的请求,在这个阶段的研讨中他就像比喻中的副驾驶的位置,为我观察这我发现不了的坑,也在必要的分叉口给了我很多有用的建议,比如在生成随机式子的时候我在弄出简单的随机生成之后,生成较长式子的算法就是由他提醒编写的,当然这样的情况会有很多,我负责大体,而他就负责细节,检查。他很好的在结对下扮演了一个领航员的位置。不过我觉得我的伙伴需要提升一下自己的自信,其实好多事情他都可以独立很好的完成的。

总结

  • 总结:

    • 1.我们完成了当初计划的大部分类与主程序的编写
    • 2.运行后能达到我们预期的目的
    • 3.我们没有完成的计划是关于插入括号这一项的编写
    • 4.完成括号(已有思路),且回到博客进行查缺补漏
    • 5.完成扩展需求包括(真分数)
    • .进行测试
  • 未完成项目
    • 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

20175226 2018-2019-2《java程序设计》结对编程-四则运算(第二周-阶段总结)的更多相关文章

  1. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  2. 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算

    20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...

  3. 20165205 2017-2018-2《Java程序设计》结对编程一 第二周总结

    20165205 2017-2018-2<Java程序设计>结对编程一 第二周总结 设计思路 编写主类Arithmetic4 编写ArithmeticFunc类来实现计算,其中包括:加.减 ...

  4. 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址 对结对伙伴的评价:黄宇瑭同学的优势在于能够想出一 ...

  5. 20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 结对伙伴 20172326康皓越 博客地址(http://www.cnblogs.com/326477465-a/p/90 ...

  6. 20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172324 姓名 :曾程 伙伴第一周博客地址: 对结对伙伴的评价:一个很优秀的同学,在这次项目中 ...

  7. 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...

  8. 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...

  9. 20172332『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172326康皓越 20172313余坤澎 20172332于欣月 小组编程照片 设计思路 设计一个生成符号 ...

  10. ### 20165219 2017-2018-2《Java程序设计》结对编程一 第二周总结

    20165219 2017-2018-2<Java程序设计>结对编程一 第二周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...

随机推荐

  1. 【zabbix教程系列】六、自动注册(Linux)

    一.agent安装脚本 #!/bin/bash #ltt #安装zabbix源 rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zab ...

  2. SpringBoot配置MySql数据库和Druid连接池

    1.pom文件增加相关依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec ...

  3. JS获取浏览器地址栏的多个参数值的任意值

    getParamValue("id"); //http://localhost:2426/TransactionNotes.aspx?id=100 //返回值是100: // 根据 ...

  4. Java 学习体系结构

    一. JavaWEB 阶段课程体系结构 java se基础学习 二 .JavaWEB 阶段课程体系结构 第一阶段:前端开发阶段 1 HTML   2 CSS JS    3JS    4 JQuery ...

  5. jQuery中$.each()方法(遍历)

    $.each()是对数组,json和dom结构等的遍历,说一下他的使用方法吧. 1.遍历一维数组 var arr1=['aa','bb','cc','dd']; $.each(arr1,functio ...

  6. NOT NULL constraint faile(慢就是快,少即是多)

    在学习数据库orm操作的过程中,遇到一个写不进去数据的问题 在创建数据库进行数据写入时出错,错误信息是 NOT NULL constraint faile(错误信息没有第一时间找到) 数据库,包括表都 ...

  7. FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现

    这个就看代码,哈哈哈哈哈  需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...

  8. Haproxy 安装及配置

    Haproxy介绍 HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件.实现了一种事件驱动,单一进程模型,支持非常大的并发连接,是因为事件驱动模型有更好的资源和时 ...

  9. CDN-常用静态资源公共库

    js.css 等静态资源可以放在自己的服务器上,或者引用网络上的公共库使用(CDN) CDN 读取失败时从本地加载 <script src="https://code.jquery.c ...

  10. sql 查询某个条件多条数据中最新的一条数据或最老的一条数据

    sql 查询某个条件下多条数据中最新的一条数据或最老的一条数据 test_user表结构如下: 需求:查询李四.王五.李二创建的最初时间或者最新时间 1:查询最初的创建时间: SELECT * FRO ...