20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
结对编程-四则运算(第一周-阶段总结)
需求分析
- 实现一个四则运算程序,要求:
- 自动随机生成小学四则运算题目(加,减,乘,除)
- 支持整数、真分数且支持多项式
- 能够利用栈的思想,将中缀转换为后缀表达式
- 能够计算随机生成的式子
- 能够对输入的答案进行判定
- 统计正确率
- 扩展需求
- 生成题目去重
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判断
- 多语言支持:
简体中文,繁體中文,English
设计思路
- 1.首先需要一个能够生成随机四则运算的类
ProduceProblem其中包括能够进行随机数的生成,随机符号的生成且将生成的数字串起来,并打印输出。 - 2.其次需要一个类
Translate将上一个类中生成的中缀表达式转换为后缀表达式且保存,需要定义一个栈再按照栈的操作,对式子进行遍历重排
参考链接 - 3.再次我们需要将保存起来的表达式进行运算,及引用一个新类
Count对上述的后缀表达式进行遍历,然后运算结果 - 4.最后是小学生作业系统的核心,需要一个类
Judge进行作业批改,且将对错与否传递给主类进行统计,并输出概率
UML类图

我们还会在之后时间在代码需要调整的时候对类图进行修改
过程中关键代码及遇到的困难及解决方法
- 1.首先是在编写随机式子时,第一个问题就是如何不仅限于生成两个数字的加减乘除运算
- 解决方法即代码展示:我们想的是利用随机数来决定生成的数字个数即
int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数符号的个数就是m-1,再将生成的数字与符号交叉排序生成一个字符串。- 生成随机式子的主要代码:
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;
}
}
- 2.其次在实现表达式转换时我们也碰到一个问题:就是原来的代码是当碰到“-或+”时我们会将之前保存到栈里的会弹出底部的一个接到式子上去
原始代码:
if (z.empty() != true) {
t = z.pop();
if (t.equals("(")) {
z.push(t);
z.push(args[i]);
break;
} else {
z.push(args[i]);
jieguo = jieguo + t + " ";
break;
}
} else {
z.push(args[i]);
break;
}
break;
本来觉得没有问题,但在后来的运行过程中我们发现当有两个没有括号的减法式子相连的时候如3-2*5-6就会发生转换错误,两个减号的顺序会发生变化导致结果错误。经过讨论后我们发现我们上述的代码有一个问题就是,我们在减号碰到减号时弹出来的减号并没有接上去,且在真正算式中应该是要直到碰到“(”才会结束,所以我们将这一式子改成了while的循环,才得以解决。
- 中缀转换代码
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() {
}
}
- 3.计算式子结果的代码:在运行过程中发生过格式转换错误,因为一个目前还没看出来的原因,
Translate引用Count类时传入的字符数组中出现了空,所以我们只能加一句case "":来排除错误
import java.util.Stack;
public class Count{
int answer;
public Count (String[] args) {
Stack<String> z = new Stack<String>();
int num1,num2,d;
for(int i=0;i<args.length;i++) {
switch (args[i]){
case"+":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1+num2;
z.push(String.valueOf(d));
break;
case"-":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1-num2;
z.push(String.valueOf(d));
break;
case"*":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1*num2;
z.push(String.valueOf(d));
break;
case"/":
num2 = Integer.valueOf(z.pop());
num1 = Integer.valueOf(z.pop());
d = num1/num2;
z.push(String.valueOf(d));
break;
case"":
case" ":
break;
default:
z.push(args[i]);
break;
}
}
while (z.empty() == false) {
answer = Integer.valueOf(z.pop());
}
}
}
- 4.判断正误的代码:刚开始我们的想法是将
Translate定为Judge的父类借此来继承它计算出的answer以此来比较正误,不过发现行不通(目前未找到原因,找到后会写入下一篇博客)。后来我两商议,反着来将Judge作为父类,让转换类来继承判断正误这项方法。
import java.util.Scanner;
public class Judge {
public int A(int answer) {
Scanner scanner = new Scanner(System.in );
System.out.println("请输入你的答案:");
int flag=0;
int n = scanner.nextInt();
if( n == answer) {
System.out.println("正确!");
flag = 1;
}
else {
System.out.println("错误,正确答案是:"+answer);
}
return flag;
}
public Judge() {
}
}
- 5.主类代码:在最后进行串联的时候发现了一个比较重大的问题,就是我们该如何统计正确题目的个数。最后我们决定
flag的反复继承应用直到传递到主类中,为1即count加一进行统计
import java.util.Scanner;
public class WpyZry {
public static void main(String[] args) {
System.out.println("请输入要生成的题目数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int count=0;
for (int i = 1; i <= n; i++) {
System.out.println("题目"+i+":");
ProduceProblem problem = new ProduceProblem();
if(problem.ProduceProblem() == 1){
count++;
}
}
double zql = (double)count/n;
System.out.println("完成"+n+"道题目,正确率为"+zql*100+"%");
}
}
运行过程测试截图

代码托管链接
托管链接:https://gitee.com/wpyzka/20175226/tree/master/src/四则运算
评价同伴
挺开心我的同伴能接受与我组队的请求,在这个阶段的研讨中他就像比喻中的副驾驶的位置,为我观察这我发现不了的坑,也在必要的分叉口给了我很多有用的建议,比如在生成随机式子的时候我在弄出简单的随机生成之后,生成较长式子的算法就是由他提醒编写的,当然这样的情况会有很多,我负责大体,而他就负责细节,检查。他很好的在结对下扮演了一个领航员的位置。
本阶段大致总结和下阶段计划
- 总结:
- 1.我们完成了当初计划的大部分类与主程序的编写
- 2.运行后能达到我们预期的目的
- 3.我们没有完成的计划是关于插入括号这一项的编写
- 下阶段计划
- 1.完成括号(已有思路),且回到博客进行查缺补漏
- 2.完成扩展需求包括(真分数,文件,语言等)
- 3.进行测试
- 4.完成总结博客
PSP
| 计划 | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|
| 估计这个任务需要多少时间 | 30 | 30 |
| 开发 | ||
| 需求分析 (包括学习新技术) | 120 | 150 |
| 生成设计文档 | 30 | 30 |
| 设计复审 (和同事审核设计文档) | 60 | 75 |
| 代码规范 (为目前的开发制定合适的规范) | 90 | 105 |
| 具体设计 | 30 | 60 |
| 具体编码 | 720 | 810 |
| 代码复审 | 60 | 60 |
| 测试(自我测试,修改代码,提交修改) | 90 | 90 |
| 报告 | ||
| 测试报告 | 20 | 20 |
| 计算工作量 | 10 | 10 |
| 事后总结, 并提出过程改进计划 | 240 | 270 |
| 合计 | 1500 | 1710 |
20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)的更多相关文章
- 20165232 2017-2018-2《Java程序设计》结对编程一 第一周总结
20165232 2017-2018-2<Java程序设计>结对编程一 第一周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...
- 20165205 2017-2018-2《Java程序设计》结对编程一 第一周总结
20165205 2017-2018-2<Java程序设计>结对编程一 第一周总结 需求分析 对输入的算式进行计算,要求满足一下条件: 支持整数运算,如2+5,47+7865. 支持多运算 ...
- 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...
- 20165219 2017-2018-2《Java程序设计》结对编程一 第一周总结
20165219 2017-2018-2<Java程序设计>结对编程一 第一周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- Java结对编程四则运算一周小结
Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...
- 王译潇20162314 实验报告三plus结对编程四则运算第一阶段
北京电子科技学院BESTI实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 王译潇 学号:20162314 指导教师:娄佳鹏老师.王志强老师 实验日期:2017年5月12号 实验密级: 非 ...
- 20165325 2017-2018-2 《Java程序设计》结对编程_第一周:四则运算
一.码云链接 项目名称FAO 码云链接 二.需求分析 实现一个命令行程序: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确 ...
- 20172306 2018-2019 《Java程序设计与数据结构》第一周学习总结
20172306 2018-2019 <Java程序设计与数据结构(下)>第一周学习总结 教材学习内容总结 第一章 概述 (程序=数据结构+算法 软件=程序+软件工程) 1.1 软件质量 ...
- 20172306《Java程序设计与数据结构》第一周总结
20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...
随机推荐
- MySQL主从复制(一)
whereis...命令的使用:
- LeetCode136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
- 利用bootstrap-select.min.js实现bootstrap下拉列表的单选和多选
参考文章:https://blog.csdn.net/qq_37677519/article/details/78143522
- tp5问题整理
问题一:致命错误: Class 'think\controller' not found 原因:controller首字母要大写 解决:use think\Controller; 问题二:html页面 ...
- codeforces131D
Subway CodeForces - 131D A subway scheme, classic for all Berland cities is represented by a set of ...
- 【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam
优化算法 1 GD/SGD/mini-batch GD GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD. SGD:随机梯度下降.一次只随机选择一个样本进行训练和 ...
- Ubuntu16.04搭建OpenVPN
Ubuntu16.04搭建OpenVPN 2018年12月27日 15:50:59 VinQin 阅读数:21042 简介 如果在一个非信任网络下比如旅社或者咖啡店的WiFi网络下,想要通过你的智 ...
- 在Ubuntu 18.04系统上安装Systemback的方法(抄)
在Ubuntu 18.04系统上安装Systemback的方法 2018-12-26 21:39:05作者:林莉稿源:云网牛站 本文介绍如何在Ubuntu 18.04或者Ubuntu 18.10系统上 ...
- 线性回归中常见的一些统计学术语(RSE RSS TSS ESS MSE RMSE R2 Pearson's r)
TSS: Total Sum of Squares(总离差平方和) --- 因变量的方差 RSS: Residual Sum of Squares (残差平方和) --- 由误差导致的真实值和估计值 ...
- magento-2.2.6-1VM环境镜像-沙箱 - - 完全隔离的环境
打包处理下载地址: 链接:https://pan.baidu.com/s/1HX0WjWEN8Wc-4TDvgEWMog 提取码:s2ls 官方下载 文档 BITNAMI MAGENTO堆栈虚拟机 B ...