结对对象与其博客链接

20175312陶光远:https://www.cnblogs.com/20175312-tgy/p/10697238.html

需求分析

(一)功能需求

1.自动生成题目(上周已完成)

可生成包含不同运算符个数的题目

2.题目运算(判题)(真分数上周已经完成,运算和后缀计算这周已完成)

实现中缀表达式转为后缀表达式并计算

判断用户答题正误,并输出正确结果

3.支持真分数(上周已完成)

实现分数算式的计算

3.题目去重(扩展需求)

实现对自动生成表达式中相同题目的去重

(二)对需求的理解:

1.能随机生成多道四则运算题目,可由用户输入控制

2.支持整数和真分数

3.支持多运算符,运算符个数可由用户输入控制

4.能够判断正误,错误时能提醒并输出正确答案

5.可以计算正确率

设计思路

1.我对支持多运算符的理解就是为:在输出前,由用户输入所要求的运算符个数,然后程序运行自动给出相应算式。

2.上周基本就构思完成了,这周是集中实现,中缀转后缀然后计算也做出来了。

3.由于学习c语言的时候曾设计过类似于这样的四则运算的程序,可以说思路上并没有问题。

4.总体思路就是这样了,具体思路见下面的UML类图。

UML图

实现过程中的关键代码解释(本周完成的部分)

1.计算一个后缀表达式的函数(Jisuan.java)

  1. package size;
  2. import java.util.Stack;
  3. public class Jisuan {
  4. String [] str1;
  5. String result;//结果储存
  6. public Jisuan (String jisuan)//构造用于计算一个后缀表达式的函数
  7. {
  8. str1=jisuan.split("\\s");
  9. }
  10. public RationalNumber toRationalNumber(String num) //转换为RationalNumber类的对象的方法
  11. {
  12. if (num.contains("/")==false){
  13. int a =Integer.parseInt(num);
  14. RationalNumber rationalNumber1 =new RationalNumber(a,1);
  15. return rationalNumber1;
  16. }
  17. else {
  18. String[] Array =num.split("/");
  19. int numerator = Integer.parseInt(Array[0]);
  20. int denominator=Integer.parseInt(Array[1]);
  21. RationalNumber rationalNumber2 =new RationalNumber(numerator,denominator);
  22. return rationalNumber2;
  23. }
  24. }
  25. public void ToResult()//计算中缀表达式,转移结果到先前声明的result
  26. {
  27. Stack stack1=new Stack();
  28. int start =0;
  29. while (start<str1.length){
  30. if (str1[start].equalsIgnoreCase("+")==false&&str1[start].equalsIgnoreCase("-")==false&&str1[start].equalsIgnoreCase("×")==false&&str1[start].equalsIgnoreCase("÷")==false){
  31. stack1.push(str1[start]);
  32. }
  33. else
  34. if (str1[start].equalsIgnoreCase("+")==true){
  35. RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
  36. stack1.pop();
  37. RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
  38. stack1.pop();
  39. RationalNumber finish =num2.add(num1);
  40. String str3=finish.toString();
  41. stack1.push(str3);
  42. }
  43. else
  44. if (str1[start].equalsIgnoreCase("-")==true){
  45. RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
  46. stack1.pop();
  47. RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
  48. stack1.pop();
  49. RationalNumber finish =num2.subtract(num1);
  50. String str3=finish.toString();
  51. stack1.push(str3);
  52. }
  53. else
  54. if (str1[start].equalsIgnoreCase("×")==true){
  55. RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
  56. stack1.pop();
  57. RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
  58. stack1.pop();
  59. RationalNumber finish =num2.multiply(num1);
  60. String str3=finish.toString();
  61. stack1.push(str3);
  62. }
  63. else
  64. {
  65. RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
  66. stack1.pop();
  67. RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
  68. stack1.pop();
  69. RationalNumber finish =num2.divide(num1);
  70. String str3=finish.toString();
  71. stack1.push(str3);
  72. }
  73. start++;
  74. }
  75. String str4=stack1.peek().toString();
  76. result=str4;
  77. }
  78. public String getResult()//计算结果
  79. {
  80. return result;
  81. }
  82. }

2.将一个中缀表达式转换为对应的后缀表达式的函数(Qzh.java)

  1. package size;
  2. import java.util.Stack;
  3. public class Qzh {
  4. String former;//中缀表达式
  5. String last;//后缀表达式
  6. public Qzh(String former)//构造将一个中缀表达式转换为对应的后缀表达式的函数
  7. {
  8. this.former=former;
  9. last="";
  10. }
  11. public String getLast() //得到后缀表达式
  12. {
  13. return last;
  14. }
  15. public void qzh() //将中缀表达式转为后缀表达式
  16. {
  17. String []str1=former.split("\\s");
  18. String [] str2=new String[str1.length-1];
  19. for (int a=0;a<str1.length-1;a++)
  20. str2[a]=str1[a];
  21. Stack stack=new Stack();
  22. int num2=0;
  23. while (num2<str2.length){
  24. if(str2[num2].equalsIgnoreCase("+")==false&&str2[num2].equalsIgnoreCase("-")==false&&str2[num2].equalsIgnoreCase("×")==false&&str2[num2].equalsIgnoreCase("÷")==false)
  25. last+=str2[num2]+" ";
  26. else
  27. if (stack.empty()==true)
  28. stack.push(str2[num2]);
  29. else
  30. if ((stack.peek().equals("+")==true||stack.peek().equals("-")==true)&&(str2[num2].equalsIgnoreCase("×")||str2[num2].equalsIgnoreCase("÷")))
  31. stack.push(str2[num2]);
  32. else {
  33. last+=stack.peek()+" ";
  34. stack.pop();
  35. stack.push(str2[num2]);
  36. }
  37. num2++;
  38. }
  39. while (stack.empty()==false){
  40. last+= stack.peek()+" ";
  41. stack.pop();
  42. }
  43. }
  44. }

测试方法

总测试以及回馈代码(ZTest.java)

  1. package size;
  2. import java.text.DecimalFormat;
  3. import java.text.NumberFormat;
  4. import java.util.Scanner;
  5. public class ZTest {
  6. public static void main(String[] args) {
  7. int ysf; //运算符个数
  8. int num; //题目个数
  9. int zhengque=0; //正确数
  10. double zhengquelv; //正确率
  11. String []Question; //存放题目的数组
  12. Scanner scanner=new Scanner(System.in);
  13. System.out.print("题目个数: ");
  14. num=scanner.nextInt();
  15. Question=new String[num];//保存题目至特定数组
  16. System.out.print("每个题目的运算符个数: ");
  17. ysf=scanner.nextInt();
  18. Timushengcheng timushengcheng=new Timushengcheng(num,ysf);
  19. timushengcheng.QuestionNum();
  20. Question=timushengcheng.getArraylist();
  21. int start=0;
  22. while (start<num)
  23. {
  24. System.out.println("第"+(start+1)+"题: "+Question[start]+"\n"+"你的计算结果: ");
  25. String answer=scanner.next();
  26. Qzh trans=new Qzh(Question[start]);
  27. trans.qzh();
  28. String qzhed =trans.getLast();
  29. Jisuan calcu=new Jisuan(qzhed);
  30. calcu.ToResult();
  31. String result=calcu.getResult();
  32. if (answer.equals(result)==true)
  33. {
  34. zhengque++;
  35. System.out.println("正确答案: "+result+" ,正确,继续作答");
  36. System.out.println();
  37. }
  38. else
  39. {
  40. System.out.println("正确答案: "+result+" ,错误,请继续作答");
  41. System.out.println();
  42. }
  43. start++;
  44. }
  45. System.out.println();
  46. zhengquelv=(double)zhengque/num;
  47. DecimalFormat fmt=new DecimalFormat("0.####");
  48. String accurancy2=fmt.format(zhengquelv);
  49. Double accurancy3=Double.valueOf(accurancy2);
  50. NumberFormat format = NumberFormat.getPercentInstance();
  51. System.out.println("共"+num+"道题目,答对"+zhengque+"道题目"+"\n正确率为: "+format.format(accurancy3));
  52. System.out.println();
  53. if (accurancy3<0.6)
  54. {
  55. System.out.println("不及格!");
  56. }
  57. else{
  58. if (accurancy3<0.9)
  59. System.out.println("良好!");
  60. else
  61. System.out.println("优秀");
  62. }
  63. }
  64. }

运行过程截图

成功运行的截图如下(总测试):

代码托管地址和码云链接

1.码云链接如下:

https://gitee.com/Lyh20175309/java-besti-is-lyh/tree/master/jiedui/src/size

2.代码托管截图:

遇到的困难:

第二周的任务并没有遇到太大的困难,

这个任务的完成,大致经历了两个阶段:

1.整理上周的思路,开始处理计算部分

2.完成计算部分,构建测试文件,也就是最终汇总计算正确率回馈的部分

主要有两个问题:

(一)在编译的过程中提示“某些输入文件使用了未经检查或不安全的操作,请使用 -Xlint:unchecked 重新编译。”,导致编译失败。

解决办法:

1.首先按照提示所说使用-Xlint:unchecked重新编译,发现失败

2.后来在网上查询,在类的前面加上@SuppressWarnings("unchecked")

  1. @SuppressWarnings("unchecked")
  2. public class Jisuan{
  3. }

3.原因:JAVA是一门安全性比较高的语言,它在编译之类要进行类型等一系列的检查。如果你使用了注解就可以告诉编译器不用检查,这样子就可以避过编译时期间的安全检查,这样子的效率会提高 。但同时安全性就大打折扣了。

参考博客链接:https://blog.csdn.net/abysstoabyss/article/details/16986731

(二)自己检测时发现了bug:除数为0的时候仍能输出答案

解决方案:结对的伙伴暂时还没有发现这个问题,我决定先写完博客再与他进行交流改进(因为时间快到了)。我发现我们的问题在与除数为0的时候默认了答案永远为0,而正确的应该是“不存在”或“此题有误”。

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

陶光远同学依旧承担了大多数的任务,并且细心的为我查缺补漏,讲解他的编程思路与“写作手法”,是我学习路上的良师益友。

唯一的问题的话可能就是没有发现除数为0的时候依然能输出答案这个bug了。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
Estimate 估计这个任务需要多少时间 1100 1600
Development 开发
Analysis 需求分析 (包括学习新技术) 30 90
Design Spec 生成设计文档 30 40
Design Review 设计复审 (和同事审核设计文档) 60 60
Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 60
Design 具体设计 60 60
Coding 具体编码 700 1100
Code Review 代码复审 60 60
Test 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告
Test Report 测试报告 20 20
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 40 40
  1. | |合计|1100|1600

《JAVA程序设计》结对编程联系_四则运算(第二周:整体性总结)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周

    一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

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

    一.结对对象 姓名:周亚杰 学号:20172302 担任角色:驾驶员(周亚杰) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

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

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

  10. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算——第一周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址:点击这里 1. 需求分析: 可生成题目: - 输入要想生成 ...

随机推荐

  1. 【转载】Nginx + Tomcat 实现反向代理

    通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服 ...

  2. (十一) UVC调节亮度

    目录 UVC调节亮度 引入 硬件协议速览 代码框架 属性初始化 属性支持查询 具体属性值获取 具体属性值设置 代码实现 title: UVC调节亮度 date: 2019/4/23 20:30:00 ...

  3. Python——使用高德API获取POI(以深圳南山医疗保健服务POI为例)

    以下内容为原创,转载请注明出处. import xlwt #创建Excel,见代码行8,9,11,25,28:CMD下:运行pip install xlwt进行安装 import urllib.req ...

  4. 在Ubuntu下进行XMR Monero(门罗币)挖矿的超详细图文教程

    大家都知道,最近挖矿什么的非常流行,于是我也在网上看了一些大神写的教程,以及跟一些大神请教过如何挖矿,但是网上的教程都感觉写得不够详细,于是今天我这里整理一个教程,希望能够帮到想要挖矿的朋友. 首先, ...

  5. 解决本地SqlServer无法连接远程服务器数据库,错误10060

    本地SqlServer 连不上服务器的数据库环境,错误信息如下图,折腾来折腾去,最终还是解决了 第一步 查看服务器本地端口是否已经打开,查看方法:首先向C:\Windows\System32文件夹添加 ...

  6. selenium + python自动化测试(一)

    本篇随笔为散集.不多逼逼直接干 step 1:使用webdriver调用浏览器,webdriver支持的浏览器为Firefox(),IE(),Chrome(),不同的浏览器需要安装不同的驱动. 本文使 ...

  7. Linux查看日志工具

    ⒈journalctl journalctl是Centos7才有的工具用于systemd统一管理所有unit的启动日志,只用一个journalctl命令就可以查看所有的日志(包括内核日志和应用日志), ...

  8. Qt无法正确 sendMessage 的消息

    项目背景: 项目需要将vc中的代码移植到Qt中,而且由于使用的SDK是32位,所以,Qt使用的版本是MinGW32,另外下载的也是官网最新的版本Qt5.11.1. 系统环境:Windows10 在将w ...

  9. .Net core----mongodb在插入数据时,会产生时间差的问题

    今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . 因此在插入的时候需要对时间进行处理: ...

  10. 发送邮件工具类MailHelper

    using System; using System.Net; using System.Net.Mail; using System.Text; using System.Threading; na ...