结对编程-四则运算(第一周-阶段总结)

需求分析

  • 实现一个四则运算程序,要求:

    • 自动随机生成小学四则运算题目(加,减,乘,除)
    • 支持整数、真分数且支持多项式
    • 能够利用栈的思想,将中缀转换为后缀表达式
    • 能够计算随机生成的式子
    • 能够对输入的答案进行判定
    • 统计正确率
  • 扩展需求
    • 生成题目去重
    • 处理生成题目并输出到文件
    • 完成题目后从文件读入并判断
    • 多语言支持:简体中文繁體中文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程序设计》结对编程-四则运算(第一周-阶段总结)的更多相关文章

  1. 20165232 2017-2018-2《Java程序设计》结对编程一 第一周总结

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

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

    20165205 2017-2018-2<Java程序设计>结对编程一 第一周总结 需求分析 对输入的算式进行计算,要求满足一下条件: 支持整数运算,如2+5,47+7865. 支持多运算 ...

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

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

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

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

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

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

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

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

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

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

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

    一.码云链接 项目名称FAO 码云链接 二.需求分析 实现一个命令行程序: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确 ...

  9. 20172306 2018-2019 《Java程序设计与数据结构》第一周学习总结

    20172306 2018-2019 <Java程序设计与数据结构(下)>第一周学习总结 教材学习内容总结 第一章 概述 (程序=数据结构+算法 软件=程序+软件工程) 1.1 软件质量 ...

  10. 20172306《Java程序设计与数据结构》第一周总结

    20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...

随机推荐

  1. vue.js 列表追加项写法

    <ul id="app"> <template v-for="site in sites"> <li>{{ site.nam ...

  2. Python——SQL——将查询的数据列表化

    sql = 'select paihao from yang1.cailiaopai' data = datebase.shujuku.sj_select(sql) #将获得的数据进行列表化 data ...

  3. 台达wplsoft2.34指令表

    常用: LD 载入 A 接点 LDI 载入 B 接点 AND 串联 A 接点 ANI 串联 B 接点 OR 并联 A 接点 ORI 并联 B 接点 ANB 串联回路方块 ORB 并联回路方块 MPS ...

  4. IntelliJ IDEA远程调试(Debug)Tomcat

    为什么需要这么做? 解决 在我本地是好的啊 这个世界性难题- 测试环境碰到问题,直接连上debug,不用再测试本地,再查看测试环境日志 遇到一些诡异的问题,日志是看不出端倪的 调试一些只能在测试环境执 ...

  5. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)B. Personalized Cup

    题意:把一长串字符串 排成矩形形式  使得行最小  同时每行不能相差大于等于两个字符 每行也不能大于20个字符 思路: 因为使得行最小 直接行从小到大枚举即可   每行不能相差大于等于两个字符相当于  ...

  6. vue 使用v-html指令渲染的富文本无法修改样式的解决方法

    最近的vue项目中遇到的问题:v-html渲染的富文本,无法在样式表中修改样式 解决方法: 把需要添加或重置的样式单独放在一个style标签里, 定义为全局样式,代码如下: <style> ...

  7. Docker 入门篇

    Docker 简介 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 更快速的启动时间 一致的运行环境 持续交付和部署 更轻松的迁移 更轻松的维护和 ...

  8. linux查看主板型号、CPU、显卡、硬盘等信息

    系统 uname -a # 查看内核/操作系统/CPU信息 head -n 1 /etc/issue # 查看操作系统版本 cat /proc/cpuinfo # 查看CPU信息 hostname # ...

  9. Java程序设计第一次作业

    虽说这学期Java比上学期的C语言要简单些许,但是初次面对java程序,还是有点难度的.

  10. Springboot-async(异步)初识

    通过@Async注解实现一个简单的异步任务处理 首先,假设一个全自动化的工厂车间每天需要开启四台互不影响的机器开关来完成生产量,于是车间主任A委派“同步甲”和“异步乙”轮 流完成每天打开机器开关的任务 ...