结对(第二周)

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! \n" +
                "请你选择一种语言并且输入对应的缩写!\n" +
                "請妳選擇壹種語言並且輸入對應的縮寫!\n" +
                "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] + "\n");
        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] + "\n");
        else if(type.equals("acc"))System.out.printf(output_5[option] + "\n");
        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的测试运用,在不断地调试更改错误的过程中,收益很大。两个人的思维碰撞,显然更有效,但在之后的结对学习中希望能更明确自己的优势,使分工更明确,来提高结对学习效率。

九、参考获引用的设计、实现

十、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
posted on 2018-04-22 23:48  musea  阅读(198)  评论(2编辑  收藏  举报