安卓手机计算器算法一–
—括号处理是重点;
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;
}
/*
*/
};