作者 by admin / 2022-09-10 / 暂无评论 / 2622 个足迹
题目
使用Android Studio写一个简易的计算器,只需要实现整数的基本运算即可。
界面上需要包含0-9和加减乘除,并有退格、清零功能。
所需知识:
Java:String的基本知识,数组(或者List)的运用
Android:绑定控件Button和TextView并使用,Button的按键监听,设置TextView的文本内容
实现计算器不同的功能,所编写的代码的难度也不同
较简单:实现两位数的加减乘除并输出结果
中等:计算一个计算式的加减乘除并保证先乘除后加减
较难:实现以上目标的同时,加入历史数据查看并添加错误判断,如果还想实现历史数据本地存储,请学习SharedPreferences
写完之后请将运行视频发到群里,需要你计算:
较简单:加减乘除案例各一个,如1+1、5-2、2*2、9/3
中等及较难:一次运算包含加减乘除中的其中三种运算,如55*22+66/22
解
题目本身不难,重点在于实现计算器的计算逻辑,如果只考虑整数的话很简单。我使用的思路是将一整个计算式(字符串格式)转为数字和符号的List,如[55,*,22,+,66,/,22],遵循先乘除后加减,先遍历寻找乘号和除号,每次寻找到便抽取该符号的前后数字进行相应计算,计算后将结果写至该符号前数字,删去符号和符号后数字。随后再遍历加号和减号,步骤同上。直到List长度为1时输出结果。
如计算1+2*3,List变化:[1,+,2,*,3] (计算2*3) -> [1,+,6,*,3] (写结果) -> [1,+,6] (删除) -> [7,+,6] (计算1+6) -> [7] (删除,至此可以输出结果)
我的核心计算函数:
/**
* 计算函数,传入一行待计算的字符串,输出其结果
* @param str
* 传入的字符串
* @return
*/
public static String CalRes(String str){
int symbolNum=0;//统计计算符号个数
str=str.replace("-","+-");//将减号变加号,实现负数运算
List<String> cal=new ArrayList<>();
// TODO 利用split分割出数字
String[] num=str.split("[+*/]");
// TODO 向symbol写入计算符号
for(int i=0;i<str.length();i++){
switch (str.charAt(i)){
case '+':
cal.add("+");
symbolNum++;
break;
case '*':
cal.add("*");
symbolNum++;
break;
case '/':
cal.add("/");
symbolNum++;
break;
case '-':
break;
default:
if(i+1>=str.length()||str.charAt(i+1)=='+'||
str.charAt(i+1)=='*'|| str.charAt(i+1)=='/'){
cal.add(num[symbolNum]);
}
}
}
if(num.length!=symbolNum+1){//如果数字个数不等于符号个数加一,说明有错误,不能计算
return "ERROR!";
}else {
Log.d("Cal",cal.toString());
// TODO 这里开始计算
// TODO 计算乘法,检测到乘号后,将两个值相乘写入第一个值,并置空其他的index方便清除
for (int i = 0; i < cal.size(); i++) {
if (cal.get(i).equals("*")) {
int s1 = Integer.parseInt(cal.get(i - 1));
int s2 = Integer.parseInt(cal.get(i + 1));
s1 = s1 * s2;
cal.set(i - 1, String.valueOf(s1));
cal.set(i, "");
cal.set(i + 1, "");
cal.remove("");//清除空值,清除两次是因为生成了两个空值
cal.remove("");
i = 0;//计算完后返回到开头重新寻找指定符号
}
}
Log.d("Cal", cal.toString());
// TODO 计算除法
for (int i = 0; i < cal.size(); i++) {
if (cal.get(i).equals("/")) {
int s1 = Integer.parseInt(cal.get(i - 1));
int s2 = Integer.parseInt(cal.get(i + 1));
s1 = s1 / s2;
cal.set(i - 1, String.valueOf(s1));
cal.set(i, "");
cal.set(i + 1, "");
cal.remove("");//清除空值
cal.remove("");
i = 0;
}
}
Log.d("Cal", cal.toString());
// TODO 计算加法
for (int i = 0; i < cal.size(); i++) {
if (cal.get(i).equals("+")) {
int s1 = Integer.parseInt(cal.get(i - 1));
int s2 = Integer.parseInt(cal.get(i + 1));
s1 = s1 + s2;
cal.set(i - 1, String.valueOf(s1));
cal.set(i, "");
cal.set(i + 1, "");
cal.remove("");//清除空值
cal.remove("");
i = 0;
}
}
Log.d("Cal", cal.toString());
//不需要计算减法,是因为我将减号全部编程加号和符号,即 “-5” -> “+(-5)”
//返回计算结果
return cal.get(0);
}
}
如果要加入小数计算,这个逻辑会复杂一点,在计算时可以使用kahan求和算法、小数转整数解决、调用BigDecimal函数、自定义字符串计算函数等等来解决,当然求懒可以加一倍精度,改用decimal。
最后附上我写的安卓工程,包含详细注释。
Calculators.zip
PS:该工程中没有做被除数是0的错误判断,懒得改。
评论已关闭