20165226 结对编程项目-四则运算 阶段总结
一、需求分析
1、随机生成题目
- 生成的题目个数从命令行输入
- 用户可选择生成不同难度的题目,比如通过参数指定: (1) 运算符个数范围 (2) 运算符限定(小学一年级题目只生成 + - 题目)
- 能多次生成题目
2、题目运算(判题)
- 支持多运算符
- 支持整数
- 支持真分数
- 转换为后缀表达式(也可以直接计算中缀表达式)
3、题目合法性判断
- 可独立使用
- 可用于测试生成题目的正确性
4、扩展需求
- 题目去重
- 支持多语言
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判题
二、设计思路
1、设计一个IntNumber
类,用来实现整数的四则运算
2、设计一个Judgement
类,用来判断用户输入与实际计算值是否相等,并统计正确的次数
3、设计一个Fraction
类,用来实现真分数的四则运算
4、设计主类,生成随机数,生成题目,并判断正确率
5、设计测试类,测试整数类与分数类的四则运算
6、设计一个MultiLanguage
类,用来实现多语言的扩展
三、核心代码及注释
- Calculate
import java.text.NumberFormat;
import java.util.*;
public class Calculate {
public static void main(String[] args) {
NumberFormat number = NumberFormat.getPercentInstance();
Random ran = new Random();
Scanner scan = new Scanner(System.in);
while (true) {
System.out.print("请输入要生成的题目数量:");
int A = scan.nextInt();
for (int i = 0; i < A; i++) {
int B = ran.nextInt(2);
int C = ran.nextInt(4);
IntNumber in1 = IntNumber.obj();
IntNumber in2 = IntNumber.obj();
Fraction score1 = Fraction.obj();
Fraction score2 = Fraction.obj();
if (B == 0) {//随机生成整数的计算题目
switch (C) {
case 0:
int num = in1.add(in2);
String num1 = "" + num;
int n = scan.nextInt();
Judgement.judge(n == num, num1);
break;
case 1:
num = in1.subtract(in2);
num1 = "" + num;
n = scan.nextInt();
Judgement.judge(n == num, num1);
break;
case 2:
num = in1.multiply(in2);
num1 = "" + num;
n = scan.nextInt();
Judgement.judge(n == num, num1);
break;
case 3:
num1 = in1.divide(score1);
String Q = scan.next();
Judgement.judge(Q.equals(num1), num1);
break;
}
} else {//随机生成真分数的计算题目
switch (C) {
case 0:
Fraction num2 = score1.add(score2);
String num1 = num2.toString();
String s = scan.next();
Judgement.judge(s.equals(num1), num1);
break;
case 1:
num2 = score1.subtract(score2);
num1 = num2.toString();
s = scan.next();
Judgement.judge(s.equals(num1), num1);
break;
case 2:
num2 = score1.multiply(score2);
num1 = num2.toString();
s = scan.next();
Judgement.judge(s.equals(num1), num1);
break;
case 3:
num2 = score1.divide(score2);
num1 = num2.toString();
s = scan.next();
Judgement.judge(s.equals(num1), num1);
break;
}
}
}
System.out.println("你答对的题目总数:" + Judgement.getTrues());
double T = (double) Judgement.getTrues() / A;//计算正确率
System.out.println("正确率为:" + number.format(T));
System.out.println("是否继续生成题目?(y/n):" );//多次生成题目,直到用户选择退出
String s1 = scan.next();
if (s1.equalsIgnoreCase("n")){
break;
}
}
}
}
- 多语言的实现
import javax.lang.model.element.NestingKind;
import java.util.*;
public class MultiLanguage {
private Integer option;
private String language;
public String getLanguage() {
return language;
}
public MultiLanguage(){
setLanguage();
}
private void setLanguage(){
System.out.printf("Please choose a language and type it!
" +
"请你选择一种语言并且输入对应的缩写!
" +
"請妳選擇壹種語言並且輸入對應的縮寫!
" +
"EN/ZH_CN/ZH_HK");
HashMap<String,Integer> lanList = new HashMap<String,Integer>();
lanList.put("EN",0);
lanList.put("ZH_CN",1);
lanList.put("ZH_HK",2);
Scanner sc = new Scanner(System.in);
language = sc.nextLine();
this.option = lanList.get(language);
}
public void output(String type){
String[] output_1 = {"Ready......Go!","预备,开始!","準備,開始!"},
output_2 = {"YOUR ANSWER : ","你的回答是:","妳的回答是:"},
output_3 = {"KEY :","答案为:","答案为:"},
output_4 = {"------------ERROR------------","------------错误------------","------------錯誤------------"},
output_5 = {"------------ACCESS-----------","------------通过-------------","------------通過------------"},
output_6 = {"Your Accuracy:","您的正确率:","您的正確率:"};
if(type.equals("st"))System.out.printf(output_1[option] + "
");
else if(type.equals("ans"))System.out.printf(output_2[option]);
else if(type.equals("key"))System.out.printf(output_3[option]);
else if(type.equals("err"))System.out.printf(output_4[option] + "
");
else if(type.equals("acc"))System.out.printf(output_5[option] + "
");
else if (type.equals ( "accuracy") )System.out.printf(output_6[option] );
}
}
四、测试方法
-
IntNumber类的方法测试
-
Fraction类的方法测试
五、运行过程截图
六、代码托管地址
七、遇到的困难及解决方法
- 问题1:- 问题一:看教程,本来应该在插件安装对话框的搜索中输入
junit
,单击JunitGenerator V2.0
,单击绿色的Install
按钮安装。但我没有搜到JunitGenerator V2.0
。
-
问题1解决方案:通过百度搜索,在网上查找并下载:到本地,然后找到插件所在位置,再
install plugin from disk
,。 -
问题2:如何实现随机生成数和题目?
-
问题2解决方法:上星期学了第八章常用实用类中学习过Random类,通过反复思考如何将书上给出的方法运用于实际,最终运用了
Random random = new Random()
random.nextInt()
并结合switch语句,成功实现生成随机数和题目
八、对接对小伙伴的评价
- 结对搭档:20165230田坤烨
- 整个编程过程中最困难的是其扩展内容的补充,其次是如何进行产品代码测试(具体测试哪一部分)。通过讨论,我们分工进行了本次编程,更进一步学会了四则运算的编写及junit的测试运用,在不断地调试更改错误的过程中,收益很大。两个人的思维碰撞,显然更有效,但在之后的结对学习中希望能更明确自己的优势,使分工更明确,来提高结对学习效率。
九、参考获引用的设计、实现
- 结对编程项目-四则运算
- 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
- 结对编程和两人合作
- Intellj IDEA 简易教程——单元测试
- 现代软件工程讲义 个人项目和结对项目练习 四则运算
十、PSP表格
PSP | Personal Software Process Stages) | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 70 |
Estimate | 估计这个任务需要多少时间 | 360 | 500 |
Development | 开发 | 60 | 100 |
Analysis | 需求分析 (包括学习新技术) | 30 | 40 |
Design Spec | 生成设计文档 | 30 | 35 |
Design Review | 设计复审 (和同事审核设计文档) | 25 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 30 |
Design | 具体设计 | 60 | 75 |
Coding | 具体编码 | 180 | 255 |
Code Review | 代码复审 | 30 | 25 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 135 |
Reporting | 报告 | 60 | 90 |
Test Report | 测试报告 | 20 | 25 |
Size Measurement | 计算工作量 | 10 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 80 |
合计 | 1120 | 1485 |