《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. 需求分析: 可生成题目: - 输入要想生成 ...
随机推荐
- 什么是Annotation
Annotation 被称为注解,在Java开发中是相当常见的,通过注解,我们可以简化代码提高开发效率.例如Override Annotation,这个应该算是在开发过程中使用最多的注解了.注解(An ...
- Python:Mac 下 MQTT 服务器 Mosquitto 的配置
我在Mac电脑上搭建时遇到了一些不同于网上大部分情况的问题,特此分享给可能也有遇到相同情况又找不到解决方法的人. 我的电脑系统:macOS Mojave 10.14.3. paho-mqtt 的安装 ...
- 享元模式-Flyweight(Java实现)
享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...
- Python核心编程(网络编程)
1.python socket模块内置方法 2.tcp服务器伪代码 3.tcp客户端伪代码 4.socket模块属性 5.一个简单的tcp客户端和服务端 服务端代码: # encoding:utf-8 ...
- 标准库类型string
定义和初始化string对象 初始化string对象方式: string s1;//默认初始化,s1是一个字符串 string s2(s1);//s2是s1的副本 string s2 = s1;//等 ...
- KVO实现原理
KVO意为键值观察Key-Value-Observer,本质仍然是观察者模式. 观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是 ...
- 关于lamp环境搭建过程的教程
一.搭建lamp 的网址 https://lamp.sh/install.html 二.对于linux下上传图片或音频失败原因? 1.必须将文件夹的权限设置为apache 命令为:chown -R a ...
- 004 使用scrapy框架爬虫
0. 建立housePro的scrapy爬虫框架 # 1. 在终端输入,建立housePro项目scrapy startproject housePro# 2. 进入houseProcd houseP ...
- MySQL:参数wait_timeout和interactive_timeout以及空闲超时的实现【转】
一.参数意思 这里简单解释一下两个参数,含义如下: interactive_timeout:The number of seconds the server waits for activity on ...
- notepad++安装nppFTP
官网下载的最新版notepad++,结果pluginadmin里面installnppftp总是安不上,点击install之后然后点是就退出,再进去也没有安装好. 网上找了半天也没找到什么有用信息,最 ...