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

需求分析

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

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

    正则表达式*** 概述 分类 基本语法  元字符 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符. [.. ...

  2. git几个必知托管平台

      程序员必须知道的几个Git代码托管平台 说到Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费,如果你做的 ...

  3. Linux C Socket简单实例与详细注释

    最近做的东西与socket十分紧密,所以很好奇它具体是如何实现的,以前也有了解过,但是又忘记了,于是把它记录下来,以便日后查看. 服务器端:server.c #include <sys/type ...

  4. select2 3.5.3 二级下拉及搜索

    select2 [3.5.3]版本 select2 插件地址 http://select2.github.io/select2/ 支持搜索: JS代码,如果Group不需要勾选,goup不加id就可以 ...

  5. app Inventor

    什么是App Inventor  ? MIT 官方网站 http://ai2.appinventor.mit.edu/Ya_tos_form.html 广州中文镜像网站 http://app.gzjk ...

  6. JS在一个数组中查找某个用户输入的值,返回对应值所在索引值

    方法有很多种 第一:直接循环,判断输出 第二:使用indexOf 正常来说,为了增加工作效率一般会选择indexOf,但是indexOf存在兼容性问题,因此最完善的写法如下 function inde ...

  7. 使用lambda表达式对相同属性的实体进行合并

    List<CrmAuthorizedInfo> crmAuthorizedInfos = flowPlanInfoMapper.findAllByEncode(stationForm.ge ...

  8. LeetCode--689_Maximum_Sum_of_3_NonOverlapping_Subarrays

    原题链接:点击这里 一道很水很水的背包问题? 大概算不上背包吧QAQ 自己的dp 真的是太差劲啦,以后每天一道LeetCode 备战秋招! package leetcode; public class ...

  9. OpenLayers学习笔记(十一)— 飞机速度矢量线预测

    在机场使用的空管系统中,飞机的速度矢量线差不多是这样的: 模拟飞机飞行时的速度矢量线,这里就大概做个类似效果: 什么叫速度矢量线呢,个人理解就是根据飞机当前速度和航向预测它在未来一段时间内的飞机轨迹, ...

  10. pwn-ROP

    首先对目标文件checksec,提示NX  enabled,看看其解释 NX/DEP(堆栈不可执行) NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可 ...