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

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

结对伙伴

小组结对编程照片

1332925-20180508235522340-1419168629.png

个人贡献度划分

余坤澎于欣月康皓越
个人贡献度30%40%30%

设计思路

  1. 设计一个num类和一个Elements类用于生成数字和String类型的运算符。
  2. 设计一个expression类调用num类和Elements中的方法,利用if语句根据用户输入的题目难度等级和题目个数来生成表达式。
  3. 设计一个Cal类进行计算,先对表达式进行处理,把中缀表达式转换为后缀表达式,在用后缀表达式计算出表达式的值。在该类中添加一个能够判断用户输入答案正否正确的方法。
  4. 设计一个用户测试类选择难度和题目个数,输入用户计算的值与正确答案进行比较,如果正确,返回答案正确;如果错误,返回答案错误并返回正确答案。

关键代码解释


 Elements p = new Elements();
                Num w = new Num();
                w.getNum();
                if (count1 != 0 && count2 != 0)
                    result = result;
                else if (count1 == 0) {
                    Random m = new Random();
                    int n = m.nextInt(2);
                    //选择加还是减
                    if (n == 0) {
                        p.add();
                        result += p + w.toString();
                    } else {
                        p.sub();
                        result += p + w.toString();
                    }
                } else {
                    Random m = new Random();
                    int n = m.nextInt(2);
                    //选择乘还是除
                    if (n == 0) {
                        p.mul();
                        result += p + w.toString();
                    } else {
                        p.div();
                        result += p + w.toString();
                    }
                }
            }
              
  • 分别判断是否有无加减或乘除,并进行相应的随机添加加减或者乘除法,以保证达到混合运算的目的。

if (count == 0) {
                        int iw = a.nextInt(2);
                        if (iw == 0) {
                            cd.mul();
                            b.getNum();
                            result += cd + b.toString();
                        } else {
                            cd.div();
                            b.getNum();
                            result += cd + b.toString();
                        }
                    } else {
                        result = result;
                    }
  • 判断整个式子是否有乘除法,并添加相应的乘除法,以达到混合运算的目的。

public List<String> InfixToPostfix(List<String> list){
        List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式
        Stack<String> stack = new Stack<String>();//暂存操作符
        //stack.push('#');
        for(int i=0;i<list.size();i++){

            String s = list.get(i);
            if(s.equals("(")){
                stack.push(s);
            }else if(s.equals("*")||s.equals("/")||s.equals("÷")){
                stack.push(s);
            }else if(s.equals("+")||s.equals("-")){
                if(!stack.empty()){
                    while(!(stack.peek().equals("("))){
                        Postfixlist.add(stack.pop());
                        if(stack.empty()){
                            break;
                        }
                    }
                    stack.push(s);
                }else{
                    stack.push(s);
                }
            }else if(s.equals(")")){
                while(!(stack.peek().equals("("))){
                    Postfixlist.add(stack.pop());
                }
                stack.pop();
            }else{
                Postfixlist.add(s);
            }
            if(i==list.size()-1){
                while(!stack.empty()){
                    Postfixlist.add(stack.pop());
                }
            }
        }
        return Postfixlist;
    }
  • 利用栈使中缀表达式转换为后缀表达式。
 public double doCal(List<String> list){
        Stack stack = new Stack();
        for(int i=0;i<list.size();i++){
            String s = list.get(i);
            double t=0;
            if(!isOp(s)){
                Double cd = Double.parseDouble(s);
                t = cd;
                stack.push(t);
            }else{
                if(s.equals("+")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2+a1;
                    stack.push(v);
                }else if(s.equals("-")){
                    double  a1 = (double) stack.pop();
                    double  a2 = (double) stack.pop();
                    double v = a2-a1;
                    stack.push(v);
                }else if(s.equals("*")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2*a1;
                    stack.push(v);
                }else if(s.equals("/")||s.equals("÷")){
                    double a1 = (double) stack.pop();
                    double a2 = (double) stack.pop();
                    double v = a2/a1;
                    stack.push(v);
                }
            }
        }
        return (double) stack.pop();
    }
  • 利用栈计算后缀表达式的值。
public void torf(List<String> list){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入计算结果");
        String result = scan.nextLine();
        double result2 = Double.parseDouble(result);
        if (result2 - doCal( list)<0.001 && result2 - doCal(list)> -0.001)
            System.out.println("答案正确");
        else
            System.out.println("答案错误" + " " + "正确答案为" + doCal(list));
}
  • 在允许一定范围的误差内来判断用户输入的答案是否正确。

遇到的困难及解决方法

  • 问题1:利用随机生成表达式等级三的时候,因为是随机生成的运算符,所以不能保证生成的表达式中乘除都存在。
  • 问题1解决方法:定义这样一个方法,如果随机到乘除,定义一个count变量进行自加,从而使用if语句由count的值来判断缺少什么运算符,如有缺少添加上缺少的相应的运算式。
    1332925-20180508233434618-739801470.png
  • 问题2:一开始的时候除号与分数的分号是一致的,所以生成的表达式中的区分度不够,不能够很好的表示真分数。
  • 问题2解决方法:在生成表达式的时候新加一种情况是字符串型“÷”,在运算的时候,在相应的数组中添加“÷”,并且把“÷”定义成与“/”一样的计算。
    1332925-20180508234101213-948354197.png
    1332925-20180508234131495-1633336629.png
  • 问题3:在用户测试类中调用运算类的时候,生成的答案与正确答案有时候会出现不一致。
    1332925-20180508234315337-398871271.png
    1332925-20180508234325617-730768188.png
  • 问题3在当天进行调试的时候尚未解决,在后续的编程中会找出并解决问题,体现在下一次的博客中。

文件扩展

在完成了基本要求之后,考虑实现以下功能。

  1. 实现支持多语言。
  2. 能够实现题目去重。
  3. 对生成的题目和用户输入的结果以及正确结果和正确率进行记录并在txt文本中进行体现。

项目链接

PSP时间统计:

PSP2.1Personal Software Process Stages预估耗时(小时)实际耗时(小时)
Planning计划11.5
Estimate估计这个任务需要多少时间11
Development开发610
Analysis需求分析 (包括学习新技术)13
Coding Standard代码规范 (为目前的开发制定合适的规范)13
Design UML设计项目UML类图1.51.5
Coding具体编码6
Code Review代码复审23
Test测试(自我测试,修改代码,提交修改)22
Size Measurement计算工作量(实际时间)21
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划11
合计26.533

转载于:https://www.cnblogs.com/yu-kunpeng/p/9011484.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值