《java程序设计》结对编程-四则运算整体总结
需求分析(描述自己对需求的理解,以及后续扩展的可能性)
实现一个命令行程序,要求:
- 自动生成小学四则运算题目(加,减,乘,除)
- 支持整数
- 支持多运算符(比如生成包含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+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程序设计》结对编程-四则运算整体总结的更多相关文章
- 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...
- 结对编程--四则运算(Java)梅进鹏 欧思良
结对编程--四则运算(Java)梅进鹏 欧思良 Github项目地址:https://github.com/MeiJinpen/Arithmetic 功能要求 题目:实现一个自动生成小学四则运算题目的 ...
- 20175305张天钰Java结对编程四则运算(二)
Java结对编程四则运算(二) 一.题目描述及要求 Git提交粒度不要太粗,建议一个文件/一个类/一个函数/一个功能/一个bug修复都进行提交,不能一天提交一次,更不能一周一次,参考Commit Me ...
- 20175305张天钰Java结对编程四则运算
Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...
- 结对编程--四则运算(Java)萧英杰 夏浚杰
结对编程--四则运算(Java)萧英杰 夏浚杰 Github项目地址 功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 使用 -n 参数控制生成题目的个数(实现) 使用 -r 参数控制题目 ...
- Java结对编程四则运算一周小结
Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...
- 王译潇20162314 实验报告三plus结对编程四则运算第一阶段
北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...
- 结对编程-四则运算生成器(java实现)
结对伙伴:陈振华 项目要求 1.题目:实现一个自动生成小学四则运算题目的命令行程序. 2.需求: 1. 使用 -n 参数控制生成题目的个数 2. 使用 -r 参数控制题目中数值(自然数.真分数和真 ...
- 结对编程 四则运算(java)(胡大华 黄绪明)
Github项目地址 https://github.com/yogurt1998/Myapp 项目需求 题目: 实现一个自动生成小学四则运算题目的命令行程序 功能 1.使用-n 参数控制生成题目的个数 ...
随机推荐
- MQ与webservice的区别,MQ的区别
Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Webservice近乎实时通信,而MQ却通常是延时通信. 什么意思 ...
- 2.如何导入Spring约束?
前言:之前在学习约束的时候,关于导入约束一直迷茫,今天详细的截图一下,以下图为例 第一步: 新建 第二步: 第三步: 第四步: 第五步:(这里写的有点小错误,是第三个) 第六步: 然后点击OK 最后的 ...
- PowerDesigner使用(设置继承,实现)
1.File—New Mode 2添加4个class,1个接口(基本的添加工具都在这里面) 3.class1的设置名字,设置方法 3.设置继承,实现 4.编辑class2,class3继承父类的属性. ...
- GO语言的进阶之路-爬虫进阶之路
GO语言的进阶之路-爬虫进阶之路 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.我们今天要介绍的就是一个简单的网络爬 ...
- google Guava包的ListenableFuture解析
一. ListenableFuture是用来增强Future的功能的. 我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果.如果我们希望一旦计算完成就拿到结果展示给用户或者做另外 ...
- Networx蓝屏问题
本人系统win7专业版64位. 从5月底开始就时不时有蓝屏发生,而且可以说是没有任何征兆就"啪"的一下蓝了... 有时候是隔个四五天蓝屏一次,有时候一天都能蓝好几次,实在是让人恼火 ...
- 百度编辑器 Ueditor 如何增加模板 ?
模板文件在这里: dialogs/template/config.js 参见:http://t.mreald.com/191 .
- ssh 登录出现Are you sure you want to continue connecting (yes/no)?解决方法
ssh 登录出现Are you sure you want to continue connecting (yes/no)?解决方法 1,可以使用ssh -o 的参数进行设置例如: ssh -o St ...
- luogu P3576 [POI2014]MRO-Ant colony
传送门 一群蚂蚁能被吃,也就是走到指定边的两端点之一要走到另一端点时有\(k\)只,我们可以从这两端点逆推,记两个值为走到某个点时最后会被吃掉\(k\)只蚂蚁的蚂蚁数量范围,式子下面有,很好理解(雾) ...
- http raw post 之理解
参考链接: https://imququ.com/post/four-ways-to-post-data-in-http.html http://blog.csdn.net/leyangjun/art ...