Android Studio

您所在的位置:网站首页 简易计算器的实现 Android Studio

Android Studio

2024-07-11 00:53| 来源: 网络整理| 查看: 265

第一次写博客嘿嘿嘿,很激动,记录一下Android开发课第一次试验——简易计算器。

P.S.刚接触Android Studio,纯探索式完成,代码以及内容有些粗糙QAQ

好啦,进入正题

首先是布局activity_main.xml文件,先上代码:

下面是MainActivity.java文件,主要分为四种键分开处理:C键(单个字符清除键),=键(EditText获取所有表达式字符处理键),数字键以及操作符键: 首选是数字键(0~9),其主要实现把本身的value(activity中设置)传给EditText显示出来,由于代码基本一致,就先放一个例子:

zero.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(zero.getText().toString()); } });

其次是操作符键(+-*/.),其实现思路原本和数字键一样,但是不知道为什么append方法不适用于这些操作符,有大佬知道原因的话,烦请告知啊QAQ,于是:

add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"+"); } });

之后是C(单个字符清除键),其思路是假设EditText中有n个字符,先取出n-1个字符,再把第n位用“ ”代替,代码如下:

clc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int count=0;//记录覆盖的空格的个数,由于空格也计入字符串长度中,对下面的每次删去的个数有影响,所以记录并在下面减去 String s = msg.getText().toString(); for(int i=0;i=s.length()-1) count = s.length()-1; s = (String) s.subSequence(0,s.length()-1-count); s = s.concat(""); msg.setText(s); } });

最后是=键(表达式处理得出结果键),其思路是把中缀表达式转化成后缀表达式,在通过后缀表达式计算,代码如下(代码十分粗糙,由于只会C,不大会java,很多方法都是先查的QAQ):

equ.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int i = 0, j = 0, k = 0,count=1;//count 记录小数点后面有几位 char b; String str=msg.getText().toString(); double data[] = new double[100];//模拟数字栈 String strr = "";//模拟操作符栈 //入栈 for (i = 0; i < str.length(); i++) { count=1; data[j]=0; //首先判断是都是数字,注意多位数的情况 while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) { data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1)); i++; } j++; //考虑操作数是小数的情况 if((i < str.length()) &&(str.substring(i,i+1).equals("."))) { i++; j--; while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) { data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1)); i++; count=count*10; } data[j]=data[j]*1.0/count; j++; System.out.println(data[j]); } if (i >= str.length()) break; if ((k == 0)||(i= pric(strr.charAt(k - 1)))) { strr = strr.concat(str.substring(i, i + 1)); //System.out.println("strr:"+strr); k++; } else { //还要考虑一直大于的情况,一直字符串出栈 while (k >= 1 && (pric(str.charAt(i)) < pric(strr.charAt(k - 1)))) { j--; k--; b = strr.charAt(k); if (b == '+') data[j - 1] = add(data[j - 1], data[j]); else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]); else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]); else if (b == '/') data[j - 1] = div(data[j - 1], data[j]); } strr = (String) strr.subSequence(0, k); strr = strr.concat(str.substring(i, i + 1)); k++; } } k--; //出栈 while (k >= 0 && j >= 0) { j--; b = strr.charAt(k); System.out.println("b:" + b); if (b == '+') data[j - 1] = add(data[j - 1], data[j]); else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]); else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]); else if (b == '/') data[j - 1] = div(data[j - 1], data[j]); k--; } msg.setText(Double.toString(data[0])); } @org.jetbrains.annotations.Contract(pure = true) private double add(double a, double b) { return a+b; } @org.jetbrains.annotations.Contract(pure = true) private double sub(double a, double b) { return a-b; } @org.jetbrains.annotations.Contract(pure = true) private double mul(double a, double b) { return a*b; } @org.jetbrains.annotations.Contract(pure = true) private double div(double a, double b) { return a*1.0/b; } @org.jetbrains.annotations.Contract(pure = true) private int pric(char a) { if(a=='+')return 1; else if(a=='-')return 2; else if(a=='*')return 3; else if(a=='/')return 4; return 0; } });

然后放一下MainActivity.java所有代码:

private EditText msg; private Button zero; private Button one; private Button two; private Button three; private Button four; private Button five; private Button six; private Button seven; private Button eight; private Button nine; private Button add; private Button sub; private Button mul; private Button div; private Button mod; private Button dot; private Button clc; private Button equ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.msg = findViewById(R.id.msg); this.zero = findViewById(R.id.zero); this.one = findViewById(R.id.one); this.two = findViewById(R.id.two); this.three = findViewById(R.id.three); this.four = findViewById(R.id.four); this.five = findViewById(R.id.five); this.six = findViewById(R.id.six); this.seven = findViewById(R.id.seven); this.eight = findViewById(R.id.eight); this.nine = findViewById(R.id.nine); this.add = findViewById(R.id.add); this.sub = findViewById(R.id.sub); this.mul = findViewById(R.id.mul); this.div = findViewById(R.id.div); this.equ = findViewById(R.id.equ); this.clc = findViewById(R.id.clc); this.dot = findViewById(R.id.dot); zero.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(zero.getText().toString()); } }); one.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(one.getText().toString()); } }); two.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(two.getText().toString()); } }); three.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(three.getText().toString()); } }); four.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(four.getText().toString()); } }); five.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(five.getText().toString()); } }); six.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(six.getText().toString()); } }); seven.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(seven.getText().toString()); } }); eight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(eight.getText().toString()); } }); nine.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.append(nine.getText().toString()); } }); add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"+"); } }); sub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"-"); } }); mul.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"*"); } }); div.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"/"); } }); dot.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg.setText(msg.getText()+"."); } }); clc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int count=0;//记录覆盖的空格的个数 String s = msg.getText().toString(); for(int i=0;i=s.length()-1) count = s.length()-1; s = (String) s.subSequence(0,s.length()-1-count); s = s.concat(""); msg.setText(s); } }); equ.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int i = 0, j = 0, k = 0,count=1;//count 记录小数点后面有几位 char b; String str=msg.getText().toString(); double data[] = new double[100];//模拟数字栈 String strr = "";//模拟字符栈 //入栈 for (i = 0; i < str.length(); i++) { count=1; data[j]=0; while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) { data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1)); i++; }//取数字保存在data中 j++; if((i < str.length()) &&(str.substring(i,i+1).equals("."))) { i++; j--; while ((i < str.length()) && (str.substring(i, i + 1).equals("0") || str.substring(i, i + 1).equals("1") || str.substring(i, i + 1).equals("2") || str.substring(i, i + 1).equals("3") || str.substring(i, i + 1).equals("4") || str.substring(i, i + 1).equals("5") || str.substring(i, i + 1).equals("6") || str.substring(i, i + 1).equals("7") || str.substring(i, i + 1).equals("8") || str.substring(i, i + 1).equals("9")) && (j < 100)) { data[j] = data[j] * 10 + Integer.parseInt(str.substring(i, i + 1)); i++; count=count*10; }//取数字保存在data中 data[j]=data[j]*1.0/count; j++; System.out.println(data[j]); } if (i >= str.length()) break; if ((k == 0)||(i= pric(strr.charAt(k - 1)))) { strr = strr.concat(str.substring(i, i + 1)); k++; } else {//还要考虑一直大于的情况,一直字符串出栈 while (k >= 1 && (pric(str.charAt(i)) < pric(strr.charAt(k - 1)))) { j--; k--; b = strr.charAt(k); if (b == '+') data[j - 1] = add(data[j - 1], data[j]); else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]); else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]); else if (b == '/') data[j - 1] = div(data[j - 1], data[j]); } strr = (String) strr.subSequence(0, k); strr = strr.concat(str.substring(i, i + 1)); k++; } } k--; //出栈 while (k >= 0 && j >= 0) { j--; b = strr.charAt(k); System.out.println("b:" + b); if (b == '+') data[j - 1] = add(data[j - 1], data[j]); else if (b == '-') data[j - 1] = sub(data[j - 1], data[j]); else if (b == '*') data[j - 1] = mul(data[j - 1], data[j]); else if (b == '/') data[j - 1] = div(data[j - 1], data[j]); k--; } System.out.println(data[0]); msg.setText(Double.toString(data[0])); } @org.jetbrains.annotations.Contract(pure = true) private double add(double a, double b) { return a+b; } @org.jetbrains.annotations.Contract(pure = true) private double sub(double a, double b) { return a-b; } @org.jetbrains.annotations.Contract(pure = true) private double mul(double a, double b) { return a*b; } @org.jetbrains.annotations.Contract(pure = true) private double div(double a, double b) { return a*1.0/b; } @org.jetbrains.annotations.Contract(pure = true) private int pric(char a) { if(a=='+')return 1; else if(a=='-')return 2; else if(a=='*')return 3; else if(a=='/')return 4; return 0; } }); }

然后说一下这个计算器的BUG: 1.中缀转后缀表达式的中间无法解决出现负数的情况,负数入栈还不知道怎么考虑 2.%虽然设计在上面也没有考虑 其他暂时还未发现什么bug,有发现的同学告知一下哈!

最后强调一下Android Studio的Debug真的很好用,具体见博客: https://blog.csdn.net/csdn_aiyang/article/details/79483848

好啦,结束啦!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3