编译器为:Android studio 3.1.2;
SDK API 27 Android 8.1(Oreo);
java version jdk-11.0.2;
界面采用网格布局,在界面设计区域设置一个6行4列的网格布局,第一行为显示数据的文本标签,第2行为清楚数据的按钮,第3~6行均划分为4列,共安排16个按钮,分别代表数字0、1、2...、9及加、减、乘、除、等号等符号.
具体布局代码如下
activity_main.xml
Strings.xml
计算器
clear
1
2
3
+
4
5
6
-
7
8
9
*
.
0
=
/
计算器的逻辑实现大致有两种方案:
1、当计算器接收两个操作数和一个运算符后,计算器就会输出结果
2、计算机可接收任意长的表达式,待用户输入"="后,按照运算符的优先级进行运算,输出结果.
第一种方案的逻辑易于理解和实现,第二种方案的逻辑较为复杂,需建立栈结构将中缀表达式转换为后缀表达式,同时要对表达式进行合法性检测.因此本文采用的是第一种方案.
具体逻辑代码如下
MainActivity.java
package com.example.bang.computer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button[] buttons=new Button[17];
private int[] ids=new int[]{R.id.bt1,R.id.bt2,R.id.bt3,R.id.bt4,R.id.bt5,R.id.bt6,R.id.bt7,
R.id.bt8,R.id.bt9,R.id.bt10,R.id.bt11,R.id.bt12,R.id.bt13,R.id.bt14,R.id.bt15,R.id.bt16,R.id.bt17
};
private TextView textView;
private String expression="";
//判断运算是否结束
private boolean end=false;
//判断是否存在小数点
private boolean point=false;
//判断是否存在符号
private boolean operation=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for(int i=0;i='0'&&expression.charAt(expression.length()-1)<='9'){
expression+=current;
operation=true;
}
point=false;
}
else{ //已经存在运算符
//表达式最后一位是数字
if(expression.charAt(expression.length()-1)>='0'&&expression.charAt(expression.length()-1)<='9'){
double result= count();
if(result==Double.MAX_VALUE){
expression="错误";
}else{
//保留两位小数
result =(double)Math.round(result*100)/100;
expression=""+result;
expression+=current;
point=false;
}
}
}
}
else if(current.equals("=")){
//存在符号,且表达式最后一位是数字
if(operation&&expression.charAt(expression.length()-1)>='0'&&expression.charAt(expression.length()-1)<='9'){
double result= count();
if(result==Double.MAX_VALUE){
expression="错误";
}else{
//保留两位小数
result =(double)Math.round(result*100)/100;
expression=""+result;
end=true;
}
}
}
else if(current.equals(".")){
if(!point){
//如果表达式为空 或者表达式最后位不是数字, 输入. 默认加上0
if(expression.equals("")||(expression.charAt(expression.length()-1)<'0'||expression.charAt(expression.length()-1)>'9')){
expression+="0";
}
// 存在符号 同时表达式最后位不是数字
else if(operation&& (expression.charAt(expression.length()-1)<'0'||expression.charAt(expression.length()-1)>'9')){
expression+="0";
}
expression+=current;
point=true;
}
}
else{ //此时为数字
if(end){
expression="";
}
expression+=current;
}
textView.setText(expression);
}
private double count(){
double result=0;
double num1,num2;
String str1,str2;
int operateIndex=0;
char operate='0';
for(int i=0;i
本次实验是我首个安卓项目,界面设计不够美观.同时逻辑实现较为粗糙.为了增强代码的健壮性,避免用户的非法输入导致程序崩溃,在检测表达式合法性中,加入了大量的判断,降低了代码的可读性,有较大的优化空间.虽然经过多次实验和修改,尚未发现漏洞,但仍有存在漏洞的可能.水平有限,烦请指正.