我的实现原理:
1.在安卓上显示数字键盘不能用EditView这个组件,因为这个组件会召唤出小键盘,反人类设计,所以说数字都要用button写,显示要用TextView;
2.我要实现创建两个数组,一个是int型数组a[ ],在下面代码中设置的长度是19,用来存放各种数字,还有一个是字符串数组b[ ],在下面的代码中我设置的长度是18,因为在正常的输入中,进行运算的数字总比运算符多一位,与此同时我还要声明一个int静态变量postion,我要用这一个变量来追踪两个数组的内容,postion当然初始化为0。
3.我还要设置两个字符串变量firStr,secStr,因为我打算将用户输入的数字处理过程与用户输入过程的呈现分开,两个字符串初始都为“”;
假设现在程序开始运行,用户开始进行输入,现在用户已经输入一个数字5,那么执行的是firStr +="5";secStr+="5";用户又输入一个数字2;那么执行的是firStr +=”2“;secStr +="2";现在firStr == sexStr == "52";假设用户在输入这两个数字之后,他想输入一个运算符"+";那么当他摁"+"这个按钮时的点击事件是:a[postion] = String.valueOf(firStr);b[postion++] = "+";firStr ="";firStr我要清空用来处理下一串数字,而secStr不变,除了清楚按钮之外,任何按钮的点击事件中都会有一句:textView。setText(secStr),因为它是用来显示的;
4.假如现在用户输入的结果是1 + 2 * 3* 4+ 2 =,那么当按下等号时,要先把firStr保存起来。那么a[ ] ={1,2,3,4,2},b[] = {"+","*","*","+"},然后开始进行运算,四则运算是有优先级的,我决定首先遍历b[]数组;我需要先设定一个布尔值,下面代码中我设置的是haveStatic;我还声明了几个变量,下面是核心代码:
int i;
int start= 0;
int end = 0;
for(i = 0;i<postion ;i++){
if("*".equals(b[i])) {
if (haveStatic == false) {
start = i;
end = i+1;
haveStatic = true;
Log.i("hsd", "havestatic赋值为true");
}
else {
end++;
}
}
if("/".equals(b[i])) {
if (a[i+1] != 0) {
if (haveStatic == false) {
start = i;
end = i+1;
haveStatic = true;
Log.i("hsd", "havestatic赋值为true");
}
else {
end++;
}
} else {
aBoolean = true;
break;
}
}
if("+".equals(b[i]) || "-".equals(b[i]) ) {
Log.i("location", String.valueOf(i));
Log.i("location", String.valueOf(start));
Log.i("location", String.valueOf(end));
if (haveStatic == true) {
for (int r = start; r < end; r++){
Log.i("sdadasa", "for循环");
if("*".equals(b[r])){
a[start] *= a[r+1];
b[r] = "+";
a[r+1] = 0;
Log.i("location", "加号变乘号可");
}
if("/".equals(b[r])){
a[start] /= a[r+1];
b[r] = "+";
a[r+1] = 0;
}
}
Log.i("hsd", "havestatic==true");
haveStatic = false;
}
else {
Log.i("hsd", "havestatic==false");
}
}
}
计算式1 + 2 * 3* 4+ 2 执行上面循环之后:a[ ] ={1,2,3,4,2},b[] = {"+","*","*","+"}变为a[ ] ={1,24,0,0,2},b[] = {"+","+","+","+"}
然后再对b[]数组进行一次循环就可以只计算加减啦;
5.其实还有一个问题,就是上面的代码我是在 *或者/后面还有+或者-才能处理前面的局部的结果如果碰到1+2*3*4-5*6*7=怎么办呢?
6.如果用户一上来不输入数字直接输入运算符怎么办呢???
7.如果用户最后摁等号之前没有输入数字而是留了个运算符该怎么办呢?
8.如果用户除以0怎么呢??
9.如果用户输入的运算符超过18个了怎么办呢???
10.如果现在等号出了结果,用户清除直接再输入数字怎么办呢??
看代码吧!!
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#30353B"
android:paddingLeft="15dp"
android:paddingRight="15dp"
tools:context="com.example.myapplication.MainActivity">
<LinearLayout
style="@style/alinStyle"
android:layout_above="@+id/linearLayout"
android:layout_alignParentRight="true"
android:layout_marginBottom="0dp"
android:id="@+id/linearLayout2"></LinearLayout>
<LinearLayout
style="@style/parentLinStyle"
android:layout_above="@+id/linearLayout2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout4">
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="7"
android:id="@+id/btn_7" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="8"
android:id="@+id/btn_8" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="9"
android:id="@+id/btn_9" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="X"
android:id="@+id/btn_cheng" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
</LinearLayout>
<LinearLayout
style="@style/alinStyle"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout3"></LinearLayout>
<LinearLayout
style="@style/parentLinStyle"
android:id="@+id/linearLayout"
android:layout_above="@+id/linearLayout3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="0"
android:id="@+id/btn_0" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="C"
android:id="@+id/btn_qingchu" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="="
android:id="@+id/btn_deng" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="/"
android:id="@+id/btn_chu" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
</LinearLayout>
<LinearLayout
style="@style/alinStyle"
android:layout_above="@+id/linearLayout4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout5"></LinearLayout>
<LinearLayout
style="@style/parentLinStyle"
android:layout_above="@+id/linearLayout5"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout6">
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="4"
android:id="@+id/btn_4" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="5"
android:id="@+id/btn_5" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="6"
android:id="@+id/btn_6" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="—"
android:id="@+id/btn_jian" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
</LinearLayout>
<LinearLayout
style="@style/alinStyle"
android:layout_above="@+id/linearLayout6"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout7"></LinearLayout>
<LinearLayout
style="@style/parentLinStyle"
android:layout_above="@+id/linearLayout7"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout8">
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="1"
android:layout_height="match_parent"
android:id="@+id/btn_1" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="2"
android:id="@+id/btn_2" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="3"
android:id="@+id/btn_3" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
<Button
style="@style/aButtonStyle"
android:text="+"
android:id="@+id/btn_jia" />
<LinearLayout
style="@style/linStyle"></LinearLayout>
</LinearLayout>
<LinearLayout
style="@style/alinStyle"
android:layout_above="@+id/linearLayout8"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/linearLayout9"></LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout9"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/relativeLayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ffffff"
android:textColor="#FFFFFF"
android:textSize="40dp"
android:id="@+id/textView2"
android:maxLines="3"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relativeLayout"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<TextView
android:maxLines="3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ffffff"
android:textColor="#6fFFFFFF"
android:textSize="30dp"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
</RelativeLayout>
style.xml:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="aButtonStyle">
<item name="android:layout_height">match_parent</item>
<item name="android:layout_width">0dp</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">22dp</item>
<item name="android:background">#00FFFFFF</item>
<item name="android:layout_weight">1</item>
</style>
<style name="linStyle">
<item name="android:layout_width">2dp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:background">#2fe7e7e8</item>
</style>
<style name="alinStyle">
<item name="android:background">#2fe7e8e9</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">2dp</item>
<item name="android:orientation">horizontal</item>
</style>
<style name="parentLinStyle">
<item name="android:background">#00FFFFFF</item>
<item name="android:layout_height">70dp</item>
<item name="android:layout_width">match_parent</item>
</style>
</resources>
mainactivity.java
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import java.util.Stack;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_1,btn_2,btn_3,btn_4,btn_5,btn_6,btn_7,btn_8,btn_9,btn_0,
btn_jia,btn_jian,btn_cheng,btn_chu,btn_qingchu,btn_deng;
private TextView textView,textView1;
private static Boolean havaresult = false,aBoolean=false,haveStatic=false;
private static String firStr = "";
private static String secStr = "";
private static int postion = 0 ,result = 0;
private int[] a = new int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
private String[] b = new String[]{"","","","","","","","","","","","","","","","","",""};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("整型数组长度", "onCreate: " + a.length);
Log.i("字符串数组长度", "onCreate: " + b.length);
initSetting();
initView();
}
private void initView() {
textView = (TextView) findViewById(R.id.textView);
textView1= (TextView) findViewById(R.id.textView2);
btn_0 = (Button) findViewById(R.id.btn_0);
btn_0.setOnClickListener(this);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_1.setOnClickListener(this);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_2.setOnClickListener(this);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_3.setOnClickListener(this);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_4.setOnClickListener(this);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_5.setOnClickListener(this);
btn_6 = (Button) findViewById(R.id.btn_6);
btn_6.setOnClickListener(this);
btn_7 = (Button) findViewById(R.id.btn_7);
btn_7.setOnClickListener(this);
btn_8 = (Button) findViewById(R.id.btn_8);
btn_8.setOnClickListener(this);
btn_9 = (Button) findViewById(R.id.btn_9);
btn_9.setOnClickListener(this);
btn_jia = (Button) findViewById(R.id.btn_jia);
btn_jia.setOnClickListener(this);
btn_jian = (Button) findViewById(R.id.btn_jian);
btn_jian.setOnClickListener(this);
btn_cheng = (Button) findViewById(R.id.btn_cheng);
btn_cheng.setOnClickListener(this);
btn_chu= (Button) findViewById(R.id.btn_chu);
btn_chu.setOnClickListener(this);
btn_deng = (Button) findViewById(R.id.btn_deng);
btn_deng.setOnClickListener(this);
btn_qingchu = (Button) findViewById(R.id.btn_qingchu);
btn_qingchu.setOnClickListener(this);
}
private void initSetting() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
// Translucent status bar
window.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_0 :
number("0");
break;
case R.id.btn_1 :
number("1");
break;
case R.id.btn_2 :
number("2");
break;
case R.id.btn_3 :
number("3");
break;
case R.id.btn_4 :
number("4");
break;
case R.id.btn_5 :
number("5");
break;
case R.id.btn_6 :
number("6");
break;
case R.id.btn_7 :
number("7");
break;
case R.id.btn_8 :
number("8");
break;
case R.id.btn_9:
number("9");
break;
case R.id.btn_jia :
if(havaresult ==true){
textView.setText(secStr);
secStr="";
int x =result;
qingchu();
a[0] = x;
secStr=a[0]+"+";
textView1.setText(secStr);
b[0] = "+";
postion++;
havaresult = false;
//jia();
}else{
jia();
}
break;
case R.id.btn_jian :
if(havaresult ==true){
textView.setText(secStr);
secStr="";
int x =result;
qingchu();
a[0] = x;
secStr=a[0]+"-";
textView1.setText(secStr);
b[0] = "-";
postion++;
havaresult = false;
// jian();
havaresult = false;
}else{
jian();
}
break;
case R.id.btn_cheng :
if(havaresult ==true){
textView.setText(secStr);
secStr="";
int x =result;
qingchu();
a[0] = x;
secStr=a[0]+"X";
textView1.setText(secStr);
b[0] = "*";
postion++;
havaresult = false;
//cheng();
havaresult = false;
}else{
cheng();
}
break;
case R.id.btn_chu :
if(havaresult ==true){
textView.setText(secStr);
secStr="";
int x =result;
qingchu();
a[0] = x;
secStr=a[0]+"/";
textView1.setText(secStr);
b[0] = "/";
postion++;
havaresult = false;
//chu();
havaresult = false;
}else{
chu();
}
break;
case R.id.btn_deng :
if(havaresult == false){
deng();}
break;
case R.id.btn_qingchu :
qingchu();
textView1.setText("");
secStr = "";
havaresult = true;
break;
default:
break;
}
}
private void number(String i) {
if(havaresult == false) {
firStr += i;
secStr += i;
textView1.setText(secStr);
}else {
textView.setText(secStr);
qingchu();
secStr = "";
firStr += i;
secStr += i;
textView1.setText(secStr);
havaresult = false;
}
}
private void qingchu() {
firStr = "";
result = 0;
postion = 0;
for(int i = 0 ;i <10;i++){
a[i] = 0;
}
for (int i = 0;i<9;i++){
b[i]="";
}
}
private void deng() {
int i;
int start= 0;
int end = 0;
if(firStr != ""){
a[postion] = Integer.valueOf(firStr);
firStr = "";
postion++;
}else{
b[postion - 1] = "+";
postion++;
}
Log.i("整型数组a 第一次遍历之前:", getaString(a));
Log.i("字符串数组b第一次遍历之前:", getaString(b));
for(i = 0;i<postion ;i++){
if("*".equals(b[i])) {
if (haveStatic == false) {
start = i;
end = i+1;
haveStatic = true;
Log.i("hsd", "havestatic赋值为true");
}
else {
end++;
}
}
if("/".equals(b[i])) {
if (a[i+1] != 0) {
if (haveStatic == false) {
start = i;
end = i+1;
haveStatic = true;
Log.i("hsd", "havestatic赋值为true");
}
else {
end++;
}
} else {
aBoolean = true;
break;
}
}
if("+".equals(b[i]) || "-".equals(b[i]) ) {
Log.i("location", String.valueOf(i));
Log.i("location", String.valueOf(start));
Log.i("location", String.valueOf(end));
if (haveStatic == true) {
for (int r = start; r < end; r++){
Log.i("sdadasa", "for循环");
if("*".equals(b[r])){
a[start] *= a[r+1];
b[r] = "+";
a[r+1] = 0;
Log.i("location", "加号变乘号可");
}
if("/".equals(b[r])){
a[start] /= a[r+1];
b[r] = "+";
a[r+1] = 0;
}
}
Log.i("hsd", "havestatic==true");
haveStatic = false;
}
else {
Log.i("hsd", "havestatic==false");
}
}
}
if (haveStatic == true) {
for (int r = start; r < end; r++){
Log.i("sdadasa", "for循环");
if("*".equals(b[r])){
a[start] *= a[r+1];
b[r] = "+";
a[r+1] = 0;
Log.i("location", "加号变乘号可");
}
if("/".equals(b[r])){
a[start] /= a[r+1];
b[r] = "+";
a[r+1] = 0;
}
}
Log.i("hsd", "havestatic==true");
haveStatic = false;
}
Log.i("整型数组a 第一次遍历之后:", getaString(a));
Log.i("字符串数组b第一次遍历之后:", getaString(b));
result= a[0];
String f = String.valueOf(a[0]);
for(i = 0;i<postion-1 ;i++){
if("+".equals(b[i])){
result += a[i+1];
f +="+" + a[i+1];
}
if("-".equals(b[i])){
result -= a[i+1];
f +="-" + a[i+1];
}
}
Log.i("第二次遍历的运算过程:", f + "="+String.valueOf(result));
if(aBoolean ==false){
secStr =secStr+"="+result;
textView1.setText(secStr);
}
if(aBoolean==true){
textView1.setText("错误");
aBoolean = false;
qingchu();
}
havaresult = true;
}
private void chu() {
if(firStr != ""){
a[postion] = Integer.valueOf(firStr);
if(isok()){
b[postion] = "/";
secStr+="/";
textView1.setText(secStr);
postion+=1;
firStr = "";
}else{
qingchu();
secStr = "";
textView1.setText("你最多输入18个运算符!!");
textView.setText(secStr);
}
}else{
}
}
private void cheng() {
if(firStr != ""){
a[postion] = Integer.valueOf(firStr);
if(isok()){
b[postion] = "*";
secStr+="X";
textView1.setText(secStr);
postion+=1;
firStr = "";
}else{
qingchu();
secStr = "";
textView1.setText("你最多输入18个运算符!!");
textView.setText(secStr);
}
}
}
private void jian() {
if(firStr != ""){
a[postion] = Integer.valueOf(firStr);
if(isok()){
b[postion] = "-";
secStr+="-";
textView1.setText(secStr);
postion+=1;
firStr = "";
}else{
qingchu();
secStr = "";
textView1.setText("你最多输入18个运算符!!");
textView.setText(secStr);
}
}
}
private void jia() {
if(firStr != ""){
a[postion] = Integer.valueOf(firStr);
if(isok()){
b[postion] = "+";
secStr+="+";
textView1.setText(secStr);
postion+=1;
firStr = "";
}else{
qingchu();
secStr = "";
textView1.setText("你最多输入18个运算符!!");
textView.setText(secStr);
}
}
}
public boolean isok() {
if(postion >= 18){
return false;
}else {
return true;
}
}
public String getaString(int ao[]){
String v="";
for(int i=0; i<postion;i++){
v+=a[i] + " ";
}
return v;
}
public String getaString(String ao[]){
String v="";
for(int i=0; i<postion;i++){
v+=" "+b[i];
}
return v;
}
}
写布局没有写上小数点,真是菜啊也懒得改了。代码可能有点啰嗦,留着以后回来改。