计算器开发算法-1

1 篇文章 0 订阅
1 篇文章 0 订阅

安卓手机计算器算法一–
—括号处理是重点;
package com.example.counter;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.widget.Toast;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String string;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_layout);
    textView = (TextView) findViewById(R.id.textview);
    string = new String();

    Button button0 = (Button) findViewById(R.id.button_0);
    button0.setOnClickListener(this);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(this);
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(this);
    Button button3 = (Button) findViewById(R.id.button_3);
    button3.setOnClickListener(this);
    Button button4 = (Button) findViewById(R.id.button_4);
    button4.setOnClickListener(this);
    Button button5 = (Button) findViewById(R.id.button_5);
    button5.setOnClickListener(this);
    Button button6 = (Button) findViewById(R.id.button_6);
    button6.setOnClickListener(this);
    Button button7 = (Button) findViewById(R.id.button_7);
    button7.setOnClickListener(this);
    Button button8 = (Button) findViewById(R.id.button_8);
    button8.setOnClickListener(this);
    Button button9 = (Button) findViewById(R.id.button_9);
    button9.setOnClickListener(this);

    Button buttonjia = (Button) findViewById(R.id.button_jiahao);
    buttonjia.setOnClickListener(this);
    Button buttonjian = (Button) findViewById(R.id.button_jianhao);
    buttonjian.setOnClickListener(this);
    Button buttoncheng = (Button) findViewById(R.id.button_chenghao);
    buttoncheng.setOnClickListener(this);
    Button buttonchu = (Button) findViewById(R.id.button_chuhao);
    buttonchu.setOnClickListener(this);
    Button buttondenghao=(Button) findViewById(R.id.button_denghao);
    buttondenghao.setOnClickListener(this);

    Button buttonzuokuohao = (Button) findViewById(R.id.button_zuokuohao);
    buttonzuokuohao.setOnClickListener(this);
    Button buttonyoukuohao = (Button) findViewById(R.id.button_youkuohao);
    buttonyoukuohao.setOnClickListener(this);

    Button buttonpoint = (Button) findViewById(R.id.button_point);
    buttonpoint.setOnClickListener(this);
    Button buttondel = (Button) findViewById(R.id.button_shanchu);
    buttondel.setOnClickListener(this);
    Button buttonclear = (Button) findViewById(R.id.button_clear);
    buttonclear.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button_0:
            string = string + "0";
            textView.setText(string);
            break;
        case R.id.button_1:
            string = string + "1";
            textView.setText(string);
            break;
        case R.id.button_2:
            string = string + "2";
            textView.setText(string);
            break;
        case R.id.button_3:
            string = string + "3";
            textView.setText(string);
            break;
        case R.id.button_4:
            string = string + "4";
            textView.setText(string);
            break;
        case R.id.button_5:
            string = string + "5";
            textView.setText(string);
            break;
        case R.id.button_6:
            string = string + "6";
            textView.setText(string);
            break;
        case R.id.button_7:
            string = string + "7";
            textView.setText(string);
            break;
        case R.id.button_8:
            string = string + "8";
            textView.setText(string);
            break;
        case R.id.button_9:
            string = string + "9";
            textView.setText(string);
            break;


        case R.id.button_jiahao:
            string = string + "+";
            textView.setText(string);
            break;
        case R.id.button_jianhao:
            string = string + "-";
            textView.setText(string);
            break;
        case R.id.button_chenghao:
            string = string + "*";
            textView.setText(string);
            break;
        case R.id.button_chuhao:
            string = string + "÷";
            textView.setText(string);
            break;

        case R.id.button_denghao:
            string =caculate(string);
            textView.setText(string);
            break;

        case R.id.button_zuokuohao:
            string = string + "(";
            textView.setText(string);
            break;

        case R.id.button_youkuohao:
            string = string + ")";
            textView.setText(string);
            break;

        case R.id.button_point:
            string = string + ".";
            textView.setText(string);
            break;

        case R.id.button_clear:
            string = new String();
            textView.setText(string);
            break;

        case R.id.button_shanchu:
            if (string.length() > 0) {
                string = string.substring(0, string.length() - 1);
            } else {
                string = new String();
            }
            textView.setText(string);
            break;
    }
}


public String caculate(String xstring) {
  if(xstring.indexOf("null")>0)return  null;
    //check is the number of "(" the same as ")".
    int check1 = string.indexOf('(');
    int check2 = string.indexOf(')');
    String check11=String.valueOf(check1);
    String check22=String.valueOf(check2);

    if (check1 != check2) {
        Toast.makeText(MainActivity.this, check11+check22, Toast.LENGTH_SHORT).show();
        return "null";
    }





    //用count统计遍历字符串是遇到的第一个右括号的右边的左括号数量。
    //用[]k1记录左括号的数量。
    //k2计数changestring中字符个数;
    //changestring 用来接收遍历字符串遍历的字符。
    //算法:当遇到第一个右括号的时候计算他与左边最近左括号之间的式子;
    int count=0;
    int []k1=new int[xstring.length()];
    int k2=0;
    String value;
    String changestring=new String();
    for(int i=0;i<xstring.length();i++){


        changestring=changestring+String.valueOf(xstring.charAt(i));
        k2++;

        if(xstring.charAt(i)=='(') {
            k1[count]=i;
            count++;
        }
        if(xstring.charAt(i)==')') {
            count--;
            String substye=changestring.substring(k1[count]+1,k2-1);
            if(k1[count]==0){
                changestring=new String();
                k2=0;
            }
            else {
                changestring = changestring.substring(0, k1[count] - 1);
                k2=k2-substye.length()-2;
            }

            value=simplecalulation(substye);
            changestring=changestring+value;
            k2+=value.length();
        }
    }

    return changestring;
}

// 简单运算:只有加减乘除
// 1,将数字(数字字符串)和运算符分开,;
//2,计算运算符的前后的数字。
//3,将运算结果都存在之前运算符操作的两个数;
//4,把所有的运算符都操作了,取数组末尾的值就是该式子的运算结果;
public String simplecalulation(String xstring) {
if(xstring.indexOf(“null”)>0)return “null”;
String[] strings = xstring.split("\+|-|\*|÷");
double [] numbers=new double[strings.length];

    Toast.makeText(MainActivity.this, "in the caculate !", Toast.LENGTH_SHORT).show();


    for (int i = 0; i < strings.length; i++) {
        if (!isnumber(strings[i])) return null;
    }

    for(int i=0;i<strings.length;i++){
        numbers[i]=Double.valueOf(strings[i]);
    }

    // find the operator
    char[][] chs1 = new char[strings.length-1][2];
    char [][] chs2=new char[strings.length][2];

    int k1 = 0;
    int k2=0;
    int k=0;


    for (int i = 0; i < xstring.length(); i++) {
        if ( xstring.charAt(i) == '*' || xstring.charAt(i) == '÷') {
            chs1[k1][0] = xstring.charAt(i);
            chs1[k1][1]=(char)k;
            k++;
            k1++;
        }

        if(xstring.charAt(i) == '+' || xstring.charAt(i) == '-' ){
            chs1[k1][0] = xstring.charAt(i);
            chs1[k2][1]=(char)k;
            k++;
            k2++;
        }
    }

    //check whether the division is reasonable
    for(int i=0;i<k1;i++) {
        if (chs1[i][0] == '÷') {
            if (Double.valueOf(strings[i + 1]) == 0) {
                return null;
            }
        }
    }

    //start caculate
     //position 用来记录要处理的运算符位置。
    double x=0;
    for(int i=0;i<k1;i++){
        if(chs1[i][0]=='*'){
            x=numbers[(int) chs1[i][1]]*numbers[(int)chs1[i][1]+1];
            numbers[(int) chs1[i][1]]=x;
            numbers[(int) chs1[i][1]+1]=x;
        }
        if(chs1[i][0]=='÷'){
            x=(double) numbers[(int) chs1[i][1]]/numbers[(int)chs1[i][1]+1];
            numbers[(int) chs1[i][1]]=x;
            numbers[(int) chs1[i][1]+1]=x;
        }
    }

    for(int i=0;i<k2;i++){
        if(chs2[i][0]=='+'){
            x=numbers[(int) chs2[i][1]]+numbers[(int)chs2[2][1]+1];
            numbers[(int) chs2[i][1]]=x;
            numbers[(int) chs2[i][1]+1]=x;
        }
        if(chs2[i][0]=='-'){
            x=(double) numbers[(int) chs2[i][1]]-numbers[(int)chs2[i][1]+1];
            numbers[(int) chs2[i][1]]=x;
            numbers[(int) chs2[i][1]+1]=x;
        }
    }
    return Double.toString(numbers[k]);
}


public String deltaiheadzero (String xstring){

    int k1 = 0;
    int k2 = 0;
    int len = xstring.length();
    for (int i = 0; i < len; i++) {
        if (xstring.charAt(i) != '0') k1 = i;
    }
    for (int i = 0; i < len; i++) {
        if (xstring.charAt(len - 1 - i) != '0') k2 = len - i;
    }
    return xstring.substring(k1 - 1, k2);
}

public boolean isnumber (String xstring){

    String string1 = deltaiheadzero(xstring);

    char ch[] = string1.toCharArray();


    //judge is the point conform the rule
    for (int i = 0; i < string1.length(); i++) {
        if (ch[i] == '.') {
            if (i == 0)
                return false;
            else {
                if (ch[i - 1] != '0')
                    return false;
            }
        }

        if ((ch[i] < '0' || ch[i] > '9') && ch[i] != '.') {
            return false;
        }
    }
    return true;
}

/*
*/
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值