20172333 2017-2018-2 《程序设计与数据结构》四则运算报告

Posted 远方`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172333 2017-2018-2 《程序设计与数据结构》四则运算报告相关的知识,希望对你有一定的参考价值。

20172333 2017-2018-2 《程序设计与数据结构》实验2报告(2)

1.结对成员

严域俊20172333

2.小组结对合作图片


3.项目中自己负责的部分

package ddaadada;
import java.util.*;
public class LT {

    public char[] op = {\'+\',\'-\',\'*\',\'/\',\'(\',\')\'};
    public String[] strOp = {"+","-","*","/","(",")"};
    public boolean isDigit(char c){
        if(c>=\'0\'&&c<=\'9\'){
            return true;
        }
        return false;
    }
    public boolean isOp(char c){
        for(int i=0;i<op.length;i++){
            if(op[i]==c){
                return true;
            }
        }
        return false;
    }
    public boolean isOp(String s){
        for(int i=0;i<strOp.length;i++){
            if(strOp[i].equals(s)){
                return true;
            }
        }
        return false;
    }
    /**
     * 处理输入的计算式
     * @param str
     * @return
     */
    public List<String> work(String str){
        List<String> list = new ArrayList<String>();
        char c;
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<str.length();i++){
            c = str.charAt(i);
            if(isDigit(c)){
                sb.append(c);

            }
            if(isOp(c)){
                if(sb.toString().length()>0){
                    list.add(sb.toString());
                    sb.delete(0, sb.toString().length());
                }
                list.add(c+"");
            }
        }
        if(sb.toString().length()>0){
            list.add(sb.toString());
            sb.delete(0, sb.toString().length());
        }
        return list;
    }
    public void printList(List<String> list){
        for(String o:list){
            System.out.print(o+" ");
        }
    }
    /**
     * 中缀表达式转化为后缀表达式
     * 1,遇到数字输出
     * 2,遇到高优先级的全部出栈
     * 3,最后全部出栈
     */
    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("÷")){
                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 int doCal(List<String> list){
        Stack<Integer> stack = new Stack<Integer>();
        for(int i=0;i<list.size();i++){
            String s = list.get(i);
            int t=0;
            if(!isOp(s)){
                t = Integer.parseInt(s);
                stack.push(t);
            }else{
                if(s.equals("+")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2+a1;
                    stack.push(v);
                }else if(s.equals("-")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2-a1;
                    stack.push(v);
                }else if(s.equals("*")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2*a1;
                    stack.push(v);
                }else if(s.equals("÷")){
                    int a1 = stack.pop();
                    int a2 = stack.pop();
                    int v = a2/a1;
                    stack.push(v);
                }
            }
        }
        return stack.pop();
    }

4.个人贡献度划分

可以说应该算是各自百分之五十吧,因为我们组内就两个人,所以分工很明确的,由他完成题目输出而我则是中缀转后缀,但是现在面临合并的问题,然后我两共同思考编写方法,所以没有说谁偷懒之类的,大家都很努力编写,也希望尽快完成吧。


5.相关代码截图

1.生成题目(一共四级题目+-*/,每一级都可能含有分数随机的)

2.中缀转后缀加计算 图1234

3.判断答案及其正确率 图1


6.关键代码

1.生成题目(代码上一部分有)

  • [x] 思路解释:我们原本是要用符号个数来代表题目等级的,后来涉及到中缀转后缀不方便,就换了一个思路,那就是分为0,1,2,3四个等级,每一个等级都只有两个数进行+——*/等运算,在这个运算中随机可能会含有分数形式的一个输出题目。

2.中缀转后缀(代码备注中有)

  • [x] 思路解释:第一步处理题目,第二步
    中缀表达式转化为后缀表达式 1遇到数字输出 2遇到高优先级的全部出栈 3最后全部出栈,第三步后缀表达式计算。

3.判断结果并输出正确率

  • [x] 思路解释:就是单纯的布鲁型If判断语句,最后在输出正确答案,至于输出正确率则是在生成题目中含有。

7.遇到的困难及解决方法

  • [x] 1.最最严重的问题:由于之前刚开始的单独作战,导致了一个非常严重的问题,我做的题目输出是一次性多次题目出现,而李楠的中缀转后缀是只接受一个题目,就会导致我们现在完全对接不上,导致这个四则运算没有完成。

    解决方法:目前尚未解决。

参考资料

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算

结对编程项目-四则运算

S.O.L.I.D 原则

以上是关于20172333 2017-2018-2 《程序设计与数据结构》四则运算报告的主要内容,如果未能解决你的问题,请参考以下文章

20172333 2017-2018-2 《程序设计与数据结构下》实验1报告

20172333 2017-2018-2 《程序设计与数据结构》四则运算报告

20172333 2017-2018-2 《Java程序设计》第4周学习总结

20172333 2017-2018-2 《Java程序设计》第10周学习总结

20172333 2017-2018-2 《程序设计与数据结构》实验2报告(最终版)

20172333 2017-2018-2 《Java程序设计》第8周学习总结