生成四则运算式


结对作业

题目要求

  1. 能够自动生成四则运算练习题
  2. 可以定制题目数量
  3. 用户可以选择运算符
  4. 用户设置最大数(如十以内、百以内等)
  5. 用户选择是否有括号、是否有小数
  6. 用户选择输出方式(如输出到文件、打印机等)
  7. 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

角色扮演

经过我和我的伙伴商量我们决定如下:

驾驶员:刘亚(本人)

领航员:江民亮
图形界面用Android 开发
三个界面:1.用户选择界面。2.题目界面。 3. 用户做题后正确率显示界面
app名字叫“成长小学生”

功能一:设置

根据用户选择可以定制题目数量,运算符,最大数,是否有括号和小数

1345586-20180417192821166-1678826715.jpg

功能二:出题

由于是面对手机用户开发的(界面比较小)所以我们决定每次只出10道题目,如果用户想再继续做题,我们在屏幕下方设置两个按钮,“再来10道题”界面就可以刷新再出10道题,如果觉得做够了,点击“就这样吧”即可结束。

1345586-20180417192833701-1595367030.jpg

功能三:计算并显示正确率

当用户点击“就这样吧”的时候会出现次界面,会反馈出给用户鼓励的话和成绩

1345586-20180417192844786-682098606.jpg

核心代码

主要分为两个函数Formula(){}(产生运算式的函数),Calculate(String eq){}(计算等式的函数),

public void Formula(){
            //等式
            int number=0;
            int i=1;
            int symbol=0;
            String ch ="";
            while(i<=count){
                number=rand.nextInt(maxValue);
                char c=equation.charAt(equation.length()-1);
                if(c=='/'){ //判断除号后面是否为0,是则置为1
                    number=1;
                }
                symbol=rand.nextInt(4);//[0,4)的随机整数数
                switch (symbol){
                    case 0:  ch="+"; break;
                    case 1:  ch="-"; break;
                    case 2:  ch="*"; break;
                    case 3:  ch="/"; break;
                }
                if(i!=count){
                    /*char c=equation.charAt(equation.length()-1);
                    System.out.println(c);
                    if(c!='+' && c!='-' && c!='*' && c!='/')*/
                    boolean y=false;
                    y=ProduceFirstBrackets(i);
                    if(Decimal){
                        equation+=number/10.0;
                    }
                    else{
                        equation+=number;
                    }
                    if(y==false)
                    ProduceLastBrackets(i);
                    equation+=ch;
                }
                else{
                    //是否为小数
                    if(Decimal){
                        equation+=number/10.0;
                    }
                    else{
                        equation+=number;
                    }
                    ProduceLastBrackets(i);
                }
                i++;
            }
            equation+="=";
            equation=equation.trim();
            String test="3+2*5=";
            System.out.println("结果:"+test);
            System.out.println(Calculate(test));
            System.out.println("结果:"+equation);
            System.out.println(Calculate(equation));
     }
     public boolean ProduceFirstBrackets(int i){ // 产生左括号
         boolean yes=false;
         int ran=rand.nextInt(4);
         switch(ran){
           case 1: {
             equation+="("; yes=true; bracketNum++;  break;
            }
         }
         return yes;
     }
     public void ProduceLastBrackets(int i){   // 产生右括号
         if(i==count && bracketNum>0){
             for(int j=0;j<bracketNum;j++){
                 equation+=")";
             }
         }
         else{
             int ran=rand.nextInt(3);
             switch(ran){
             case 1: {
                 if(i!=1 && bracketNum>0){
                     equation+=")"; bracketNum--;break;
                 }
                 else{
                     break;
                 }
             }
             }
         }
     }
     

计算函数优先级(,*,/,+,-,)

public Double Calculate(String eq){
        numberStack=new Stack<Double>();
        symbolStack=new Stack<Character>();//初始化栈
        //eq=removeStrSpace(eq);
        StringBuffer temp=new StringBuffer();
        for(int i=0;i<eq.length();i++){
            char ch=eq.charAt(i);
            if(isNumber(ch)){
                temp.append(ch);
            }else{
                String tempStr=temp.toString();
                if(!tempStr.isEmpty()){
                    Double num =Double.parseDouble(tempStr); //将字符串转换为小数
                    numberStack.push(num); //数字进栈
                    temp =new StringBuffer();//重置数字缓存
                }
                while(!comparePri(ch) && !symbolStack.empty()){
                    Double b=numberStack.pop();
                    Double a=numberStack.pop();
                    switch((char)symbolStack.pop()){
                    case '+': 
                        numberStack.push(a+b); break;
                    case '-':
                        numberStack.push(a-b); break;
                    case '*':
                        numberStack.push(a*b); break;
                    case '/':
                        numberStack.push(a/b); break; //需要判断b是否为0,
                    default:
                        break;
                    }
                }
                if(ch!='='){
                    symbolStack.push(new Character(ch)); //符号入栈
                    if(ch == ')'){//去掉括号
                        symbolStack.pop();
                        symbolStack.pop();
                    }
                }
                else if(!numberStack.empty()){
                    while(true){  //不加这步就算不出2+3*5= 
                    Double b=numberStack.pop();
                    if(numberStack.empty()){
                        return b;
                    }
                    Double a=numberStack.pop();
                    switch((char)symbolStack.pop()){
                    case '+': 
                        numberStack.push(a+b); break;
                    case '-':
                        numberStack.push(a-b); break;
                    case '*':
                        numberStack.push(a*b); break;
                    case '/':
                        numberStack.push(a/b); break; //需要判断b是否为0,
                    default:
                        break;
                    }
                  }
                }
            }
        }
        return numberStack.pop();
    }
     private boolean comparePri(char ch) {
        // TODO Auto-generated method stub
         if(symbolStack.empty()){
             return true;
         }
         char top=(char)symbolStack.peek();//查看栈顶元素
         if(top=='('){
             return true;
         }
         switch(ch){
         case '(': return true;
         case '*': {
             if(top== '+' || top=='-'){
                 return true;
             }else{
                 return false;
             }
         }
         case '/': {
             if(top== '+' || top=='-'){
                 return true;
             }else{
                 return false;
             }
         }
         case '+': return false;
         case '-': return false;
         case ')': return false;
         default:
             break;
         }
         return true;
    }
     
    private boolean isNumber(char ch) {
        // TODO Auto-generated method stub
        if(ch>='0' && ch<='9' || ch=='.'){
            return true;
        }
        return false;
    }

总结
由于时间关系,没有来的急对界面进行优化,还有功能一有一个传参数值的bug一直没有调试好,还有在计算的时候经过领航员长时间的调试基本没有计算错的了,谈谈我们的领航员吧,结对讲究的就是合作吧,开始开发之前我们一起讨论,怎么写界面,怎么添加功能,考虑除0的情况,在写计算函数的时候我们讨论如何考虑优先级,决定用栈来写,代码全部由我完成,所以我们还是合作愉快的。快要接近截止时间了,能力有限,只能做到此了。

要看全部代码戳这里

转载于:https://www.cnblogs.com/liu-ya/p/8869321.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值