Java计算器--CALance

之前用过C语言的图形界面写了一个电脑版的计算器,但效果并不是很好;因此这次花了接近一周的时间,利用Java语言写了一个Android计算器APP–CALance,不仅写了手机端的(Meizu),同时还写了手表端的(ticwatch);

其实计算器的原理都是一样的,主要的原理是:
1.利用数据结构中的四则运算,中缀专后缀,后缀再计算结果;
2.Java上面,我是利用了List中的ArrayList来存储数据的(类似于栈来存储数据);

代码方面主要分为三部分:
1.将字符串截取出来(将数字与符号分离开);
2.中缀表达式转化成后缀表达式;
3.后缀表达式计算出结果;

1.将字符串截取出来(将数字与符号分离开):

public class jiequ_str {

    public String jiequ_str(char[] b){
        int count_zuo = 0,count_you = 0;
        String t;
        List<String> c = new ArrayList<String>();       //利用集合List中的ArrayList来存储字符数组;
        String a = "";

        for (int i = 0; i < b.length; i++) {
            if(b[i] == '+'){
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");

            }else if(b[i] == '-'){
                if(i==0||b[i-1] == '('){
                    a += b[i];
                }else{
                    if(!a.equals("")){
                        c.add(a);
                        a = "";
                    }
                    c.add(b[i]+"");
                }
            }else if(b[i] == '*'){
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");
            }else if(b[i] == '/'){
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");
            }else if(b[i] == '='){
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");
            }else if(b[i] == '(')
            {
                if(count_you>count_zuo){    //判断,如果右括号比左括号先出现的话,则输出"ERROR";
                    return "ERROR";
                }
                count_zuo++;        //累计左括号的数量;
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");
            }else if(b[i] == ')'){
                count_you++;        //累计右括号的数量;
                if(!a.equals("")){
                    c.add(a);
                    a = "";
                }
                c.add(b[i]+"");
            }else if(b[i]=='出'){    //如果字符数组的第一个字符等于"出",则输出"出错";
                return "出错";
            }
            else {
                if ((b[i] == '.' && i > 0 && i < b.length-1 && (b[i+1]=='.'))||( i== 0&&b[i] == '.')
                        ||(b[i] == '.' && i > 0 && i < b.length-3 && (b[i+1]=='.'||b [i+2]=='.')) ){
                    return "ERROR";  //如果小数点连续出现或者间接出现的话,则输出"ERROR";
                }
                a += b[i];
            }
        }
        if(count_you != count_zuo)      //如果左括号与右括号的数量不一致的话,则输出"ERROR";
        return "ERROR";

        for(int i=0;i<c.size();i++)     //在编译器上显示;
            System.out.println(c.get(i));

       t = new mid_to_end().mid_to_end(c);
        return t;
    }
}

2.中缀表达式转化成后缀表达式:

public class mid_to_end {

    public String mid_to_end(List<String> c){
        String t;
        int x=-1,y=-1;
        List<String> a = new ArrayList<String>();   //用List中的ArrayList来存符号;
        List<String> b = new ArrayList<String>();   //用List中的ArrayList来存数字;
        System.out.println("size:"+c.size());      //在编译器上显示;
        for(int i=0;i<c.size();i++){
            if(c.get(i).equals("(")){
                x++;
                a.add('('+"");
            }else if(c.get(i).equals(")")){
                if(a.get(x).equals("(")){
                    a.remove(x);
                    x--;
                }else{
                    while(!a.get(x).equals("(")){
                        y++;
                        b.add(a.get(x));
                        a.remove(x);
                        x--;
                    }
                    a.remove(x);
                    x--;
                }
            }else if(c.get(i).equals("+")||c.get(i).equals("-")){

                if(x!=-1&&(a.get(x).equals("+")||a.get(x).equals("-")
                        ||a.get(x).equals("*")||a.get(x).equals("/"))){
                    y++;
                    b.add(a.get(x));
                    a.remove(x);
                    a.add(c.get(i));
                }else{
                    x++;
                    a.add(c.get(i));
                }
            }else if(c.get(i).equals("*")||c.get(i).equals("/")){

                if(x!=-1&&(a.get(x).equals("*")||a.get(x).equals("/"))){
                    y++;
                    b.add(a.get(x));
                    a.remove(x);
                    a.add(c.get(i));
                }else{
                    x++;
                    a.add(c.get(i));
                }
            }else if(c.get(i).equals("=")){
                while(x!=-1){
                    y++;
                    b.add(a.get(x));
                    x--;
                }
            }else{
                y++;
                b.add(c.get(i));
            }

        }
       t = new end_to_result().end_to_result(b);
        return t;
    }
}

3.后缀表达式计算出结果:

public class end_to_result {

    public String end_to_result(List<String> b){

        List<String> x = new ArrayList<String>(); //创建一个新的ArrayList;

        int y = b.size();
        int z = y;
        double a;

        while(y!=0){            //将b中的元素倒入新的ArrayList x中;
            x.add(b.get(y-1));
            y--;
        }
        //开始进行将元素进行计算;
        for(int i=z-1;i>=0;i--) {
            if (x.get(i).equals("+")) {
                if(i==x.size()-1||i==x.size()-2){
                    return "ERROR";
                }
                a = Double.valueOf(x.get(i + 2)) + Double.valueOf(x.get(i + 1));
                x.remove(i + 2);
                x.remove(i + 1);
                x.set(i,a + "");
            } else if (x.get(i).equals("-")) {
                if(i==x.size()-1||i==x.size()-2){
                    return "ERROR";
                }
                a = Double.valueOf(x.get(i + 2)) - Double.valueOf(x.get(i + 1));
                x.remove(i + 2);
                x.remove(i + 1);
                x.set(i, a + "");
            } else if (x.get(i).equals("*")) {
                if(i==x.size()-1||i==x.size()-2){
                    return "ERROR";
                }
                a = Double.valueOf(x.get(i + 2)) * Double.valueOf(x.get(i + 1));
                x.remove(i + 2);
                x.remove(i + 1);
                x.set(i, a + "");
            } else if (x.get(i).equals("/")) {
                if(i==x.size()-1||i==x.size()-2){
                    return "ERROR";
                }
                a = Double.valueOf(x.get(i + 2)) / Double.valueOf(x.get(i + 1));
                x.remove(i + 2);
                x.remove(i + 1);
                x.set(i,a + "");
            } else {
                continue;
            }
        }
        if(x.size() == 0)
            return 0+"";        //如果文本内容的长度为0,则输出0;
        return Double.valueOf(x.get(0))+"";
    }
}

最后,代码的实现效果如下:
在手机端上:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
在手表端上:
这里写图片描述
这里写图片描述
这里写图片描述
end……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值