《JAVA程序设计》结对编程联系_四则运算(第二周:整体性总结)
结对对象与其博客链接
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)
package size;
import java.util.Stack;
public class Jisuan {
String [] str1;
String result;//结果储存
public Jisuan (String jisuan)//构造用于计算一个后缀表达式的函数
{
str1=jisuan.split("\\s");
}
public RationalNumber toRationalNumber(String num) //转换为RationalNumber类的对象的方法
{
if (num.contains("/")==false){
int a =Integer.parseInt(num);
RationalNumber rationalNumber1 =new RationalNumber(a,1);
return rationalNumber1;
}
else {
String[] Array =num.split("/");
int numerator = Integer.parseInt(Array[0]);
int denominator=Integer.parseInt(Array[1]);
RationalNumber rationalNumber2 =new RationalNumber(numerator,denominator);
return rationalNumber2;
}
}
public void ToResult()//计算中缀表达式,转移结果到先前声明的result
{
Stack stack1=new Stack();
int start =0;
while (start<str1.length){
if (str1[start].equalsIgnoreCase("+")==false&&str1[start].equalsIgnoreCase("-")==false&&str1[start].equalsIgnoreCase("×")==false&&str1[start].equalsIgnoreCase("÷")==false){
stack1.push(str1[start]);
}
else
if (str1[start].equalsIgnoreCase("+")==true){
RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber finish =num2.add(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
if (str1[start].equalsIgnoreCase("-")==true){
RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber finish =num2.subtract(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
if (str1[start].equalsIgnoreCase("×")==true){
RationalNumber num1=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber num2=this.toRationalNumber(stack1.peek().toString());
stack1.pop();
RationalNumber finish =num2.multiply(num1);
String str3=finish.toString();
stack1.push(str3);
}
else
{
RationalNumber num1=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber num2=this.toRationalNumber(String.valueOf(stack1.peek()));
stack1.pop();
RationalNumber finish =num2.divide(num1);
String str3=finish.toString();
stack1.push(str3);
}
start++;
}
String str4=stack1.peek().toString();
result=str4;
}
public String getResult()//计算结果
{
return result;
}
}
2.将一个中缀表达式转换为对应的后缀表达式的函数(Qzh.java)
package size;
import java.util.Stack;
public class Qzh {
String former;//中缀表达式
String last;//后缀表达式
public Qzh(String former)//构造将一个中缀表达式转换为对应的后缀表达式的函数
{
this.former=former;
last="";
}
public String getLast() //得到后缀表达式
{
return last;
}
public void qzh() //将中缀表达式转为后缀表达式
{
String []str1=former.split("\\s");
String [] str2=new String[str1.length-1];
for (int a=0;a<str1.length-1;a++)
str2[a]=str1[a];
Stack stack=new Stack();
int num2=0;
while (num2<str2.length){
if(str2[num2].equalsIgnoreCase("+")==false&&str2[num2].equalsIgnoreCase("-")==false&&str2[num2].equalsIgnoreCase("×")==false&&str2[num2].equalsIgnoreCase("÷")==false)
last+=str2[num2]+" ";
else
if (stack.empty()==true)
stack.push(str2[num2]);
else
if ((stack.peek().equals("+")==true||stack.peek().equals("-")==true)&&(str2[num2].equalsIgnoreCase("×")||str2[num2].equalsIgnoreCase("÷")))
stack.push(str2[num2]);
else {
last+=stack.peek()+" ";
stack.pop();
stack.push(str2[num2]);
}
num2++;
}
while (stack.empty()==false){
last+= stack.peek()+" ";
stack.pop();
}
}
}
测试方法
总测试以及回馈代码(ZTest.java)
package size;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Scanner;
public class ZTest {
public static void main(String[] args) {
int ysf; //运算符个数
int num; //题目个数
int zhengque=0; //正确数
double zhengquelv; //正确率
String []Question; //存放题目的数组
Scanner scanner=new Scanner(System.in);
System.out.print("题目个数: ");
num=scanner.nextInt();
Question=new String[num];//保存题目至特定数组
System.out.print("每个题目的运算符个数: ");
ysf=scanner.nextInt();
Timushengcheng timushengcheng=new Timushengcheng(num,ysf);
timushengcheng.QuestionNum();
Question=timushengcheng.getArraylist();
int start=0;
while (start<num)
{
System.out.println("第"+(start+1)+"题: "+Question[start]+"\n"+"你的计算结果: ");
String answer=scanner.next();
Qzh trans=new Qzh(Question[start]);
trans.qzh();
String qzhed =trans.getLast();
Jisuan calcu=new Jisuan(qzhed);
calcu.ToResult();
String result=calcu.getResult();
if (answer.equals(result)==true)
{
zhengque++;
System.out.println("正确答案: "+result+" ,正确,继续作答");
System.out.println();
}
else
{
System.out.println("正确答案: "+result+" ,错误,请继续作答");
System.out.println();
}
start++;
}
System.out.println();
zhengquelv=(double)zhengque/num;
DecimalFormat fmt=new DecimalFormat("0.####");
String accurancy2=fmt.format(zhengquelv);
Double accurancy3=Double.valueOf(accurancy2);
NumberFormat format = NumberFormat.getPercentInstance();
System.out.println("共"+num+"道题目,答对"+zhengque+"道题目"+"\n正确率为: "+format.format(accurancy3));
System.out.println();
if (accurancy3<0.6)
{
System.out.println("不及格!");
}
else{
if (accurancy3<0.9)
System.out.println("良好!");
else
System.out.println("优秀");
}
}
}
运行过程截图
成功运行的截图如下(总测试):
代码托管地址和码云链接
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")
即
@SuppressWarnings("unchecked")
public class Jisuan{
}
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 |
| |合计|1100|1600
《JAVA程序设计》结对编程联系_四则运算(第二周:整体性总结)的更多相关文章
- 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址 对结对伙伴的评价:黄宇瑭同学的优势在于能够想出一 ...
- 20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 结对伙伴 20172326康皓越 博客地址(http://www.cnblogs.com/326477465-a/p/90 ...
- 20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172324 姓名 :曾程 伙伴第一周博客地址: 对结对伙伴的评价:一个很优秀的同学,在这次项目中 ...
- 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...
- 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...
- 20172332『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172326康皓越 20172313余坤澎 20172332于欣月 小组编程照片 设计思路 设计一个生成符号 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周
一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...
- 20172302『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
一.结对对象 姓名:周亚杰 学号:20172302 担任角色:驾驶员(周亚杰) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...
- 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...
- 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算——第一周
2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址:点击这里 1. 需求分析: 可生成题目: - 输入要想生成 ...
随机推荐
- python 生成 pptx 分析报告的工具包:reportgen
python机器学习-sklearn挖掘乳腺癌细胞( 博主亲自录制) 网易云观看地址 https://study.163.com/course/introduction.htm?courseId=10 ...
- uboot中的中断macro宏
目录 uboot中的中断macro宏 引入 内存分配 流程概览 普通中断 保存现场 中断函数打印具体寄存器 恢复现场 软中断 空间获取 保存现场 附录速记 疑惑待解 title: uboot中的中断m ...
- vue md5
安装 cnpm install js-md5 --save 使用 import md5 from 'js-md5' md5('要加密的内容')
- IntelliJ IDEA 2018最新版注册码激活方法
一.首先点击intellij idea 2018 二.选择激活码 三.输入以下激活码intellij idea 2018 最新版本 注册激活码 **************************** ...
- 六十、linux 编程—— I/O 多路复用 select
60.1 介绍 60.2 例子 echo_tcp_server_select.c #include <netdb.h> #include <netinet/in.h> #inc ...
- kali linux工具--信息批量收集工具theharvester
在渗透测试早期阶段,安全人员往往需要从互联网快速获取目标的一些信息,以确认测试目标的概况.为了满足这个需求,Kali Linux提供了theharvester工具.该工具可以搜索引擎.社交网站获取目标 ...
- lambda+mutable配合move实现单函数多程序域
主代码 //-----------------------------------说明一的代码 void fun0{ int t = 10; auto loopFun = [=]() mutable{ ...
- SW:HTML DOM
1:节点:nodeType,nodeValue,nodeName getAttributeNode() 方法从当前元素中通过名称获取属性节点. 元素节点nodeValue是null,属性节点nodeV ...
- Java8 Lambda表达式原理扫盲
背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了. 正文 ...
- day 21 - 1 包,异常处理
创建目录代码 1. 无论是 import 形式还是 from...import 形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法2. 包是目录级的(文 ...