zoukankan      html  css  js  c++  java
  • 四则运算-安卓版

    本次作业的题目:

        在之前的四则运算基础上继续团队开发,详细要求如下:

        1. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 ? e2的子表达式,那么e1 ≥ e2。

        2、生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

        3、每道题目中出现的运算符个数不超过3个,括号不限。

        4、程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。  

        5、把程序变成一个网页程序或智能手机程序, 用户通过设定参数,就可以得到各种题目,并可实现在线答题并评判。

    在历经一个月的折腾后,二柱子的题目终于圆满结束。这次写的是安卓版,因为考虑到用户需求,安卓版的实用性更好,更方便!刚好这学期开设了移动应用开发的课程,顺便练习联系。关键就是把之前的C++代码改写成Java语言的代码,做成安卓app的过程。

    三个重要文件如下:

     CalculatorUtil.java文件:

    package com.example.cal;
    import android.annotation.SuppressLint;
    import java.util.Stack;
    @SuppressLint("UseValueOf") 
    public class CalculatorUtil {    
        private Stack<Character> priStack = new Stack<Character>();// 操作符栈    
        private Stack<Double> numStack = new Stack<Double>();;// 操作数栈    
        public double caculate(String str) {    
            String temp;
            StringBuffer tempNum = new StringBuffer();    
            StringBuffer string = new StringBuffer().append(str);  
            while (string.length() != 0) {    
                temp = string.substring(0, 1);    
                string.delete(0, 1);    
                if (!isNum(temp)) {    
                    if (!"".equals(tempNum.toString())) {    
                    	double num=Double.parseDouble(tempNum.toString());
                        numStack.push(num);
                        tempNum.delete(0, tempNum.length());    
                    }    
                    while (!compare(temp.charAt(0)) && (!priStack.empty())) { 
                        double a =  numStack.pop();    
                        double b =  numStack.pop();   
                        char ope = priStack.pop();    
                        double result = 0;   
                        switch (ope) {    
                        case '+':    
                            result = b + a;    
                            numStack.push(result);    
                            break;    
                        case '-':    
                            result = b - a;    
                            numStack.push(result);    
                            break;    
                        case '*':    
                            result = b * a;    
                            numStack.push(result);    
                            break;    
                        case '/':    
                            result = b / a;    
                            numStack.push(result);    
                            break;    
                        }    
        
                    }    
                    if (temp.charAt(0) != '#') {    
                        priStack.push(new Character(temp.charAt(0)));    
                        if (temp.charAt(0) == ')') {
                            priStack.pop();    
                            priStack.pop();    
                        }    
                    }    
                } else    
                    tempNum = tempNum.append(temp);  
            }    
            return numStack.pop();    
        }    
        
        private boolean isNum(String temp) {    
            return temp.matches("[0-9]");    
        }    
        private boolean compare(char str) {    
            if (priStack.empty()) {    
                return true;    
            }    
            char last = (char) priStack.lastElement();    
            if (last == '(') {    
                return true;    
            }    
            switch (str) {    
            case '#':    
                return false;  
            case '(':      
                return true;    
            case ')':    
                return false;    
            case '*': {    
                if (last == '+' || last == '-')    
                    return true;    
                else    
                    return false;    
            }    
            case '/': {    
                if (last == '+' || last == '-')    
                    return true;    
                else    
                    return false;    
            }     
            case '+':    
                return false;    
            case '-':    
                return false;    
            }    
            return true;    
        }    
        
        public static void main(String args[]) {    
            CalculatorUtil operate = new CalculatorUtil();    
            double t = operate.caculate("(3+4*(4*10-15/9)#");      
            System.out.println(t);    
        }    
        
    } 
    

      

    CreateExp.java文件:

    package com.example.cal;
    
    import java.util.Arrays;
    
    public class CreateExp {
    	private int a[];
    	private char s[];
    	private char sym[];
    	private char brackets[];
    	private int num[];
    
    	public CreateExp() {
    		a = new int[100];
    		s = new char[4];
    		s[0] = '+';
    		s[1] = '-';
    		s[2] = '*';
    		s[3] = '/';
    		sym = new char[100];
    		brackets = new char[100];
    		num = new int[100];
    	}
    
    	public void dfs(int s, int e)// 使用dfs递归添加括号
    	{
    		if ((int) (Math.random() * 4) == 0) // 四分之一的概率,不进行任何操作
    		{
    			return;
    		}
    		if (e - s <= 1)// 只有一个元素或没有元素,不进行任何操作
    		{
    			return;
    		}
    		int s1 = (int) (Math.random() * (e - s - 1)) + s;// 随机生成插入括号的位置
    		int e1 = (int) (Math.random() * (e - s1)) + s1;
    		while (s1 < s || e1 > e || s1 >= e1 || (s1 == s && e1 == e))// 避免无用括号
    		{
    			s1 = (int) (Math.random() * (e - s - 1)) + s;
    			e1 = (int) (Math.random() * (e - s1)) + s1;
    		}
    		if (brackets[s1] == ')' || brackets[e1] == '(') {
    			return;
    		}
    		brackets[s1] = '(';
    		brackets[e1] = ')';
    		num[s1]++;
    		num[e1]++;
    		dfs(s, s1 - 1);// 插入括号的左边几个元素
    		dfs(e1 + 1, e);// 括号之间的几个元素
    		dfs(s1, e1);// 括号右边的几个元素
    	}
    
    	String Create() {
    		int n;
    		String ans;
    		ans = "";
    		n = (int) (Math.random() * (3)) + 2;
    		;
    		Arrays.fill(brackets, '.');
    		Arrays.fill(num, 0);
    		for (int i = 1; i <= n; i++) {
    			a[i] = (int) (Math.random() * (99)) + 1;
    			sym[i] = s[(int) (Math.random() * (4))];
    		}
    		dfs(1, n);
    		while ((brackets[1] == '(') && (num[1]-- != 0)) {
    			ans += '(';
    		}
    		ans += a[1] + "";
    		for (int i = 2; i <= n; i++) {
    			ans += sym[i];
    			while (brackets[i] == '(' && num[i]-- != 0) {
    				ans += '(';
    			}
    			ans += a[i] + "";
    			while (brackets[i] == ')' && num[i]-- != 0) {
    				ans += ')';
    			}
    		}
    		return ans;
    	}
    }
    

    Exp_result.java文件:

    package com.example.cal;
    
    import java.io.Serializable;
    
    public class Exp_result implements Serializable{
    	@Override
    	public String toString() {
    		return "Exp_result [exp=" + exp + ", ans=" + ans + ", state=" + state
    				+ ", myAns=" + myAns + "]";
    	}
    
    	private static final long serialVersionUID = -6935353529177913865L;
    	private String exp;
    	private double ans;
    	private boolean state;
    	private double myAns;
    	public Exp_result() {
    		// TODO Auto-generated constructor stub
    	}
    	
    	public Exp_result(String exp, double ans) {
    		super();
    		this.exp = exp;
    		this.ans = ans;
    	}
    
    	public String getExp() {
    		return exp;
    	}
    	public void setExp(String exp) {
    		this.exp = exp;
    	}
    	public double getAns() {
    		return ans;
    	}
    	public void setAns(double ans) {
    		this.ans = ans;
    	}
    	public boolean isState() {
    		return state;
    	}
    	public void setState(boolean state) {
    		this.state = state;
    	}
    
    	public double getMyAns() {
    		return myAns;
    	}
    
    	public void setMyAns(double myAns) {
    		this.myAns = myAns;
    	}
    	
    	
    }
    

    手机运行效果如下:

    团队合照:

    队友:高逸凡

    博客链接:http://www.cnblogs.com/yifan2016/p/5361063.html

    app下载链接:小学生四则运算

    总结:能够做出个有点小用处东西,感觉不错,继续努力啊!

  • 相关阅读:
    poj 3666 Making the Grade
    poj 3186 Treats for the Cows (区间dp)
    hdu 1074 Doing Homework(状压)
    CodeForces 489C Given Length and Sum of Digits...
    CodeForces 163A Substring and Subsequence
    CodeForces 366C Dima and Salad
    CodeForces 180C Letter
    CodeForces
    hdu 2859 Phalanx
    socket接收大数据流
  • 原文地址:https://www.cnblogs.com/wsqJohn/p/5360976.html
Copyright © 2011-2022 走看看