本人是一名在校学生,由于上个学期的课程内容包括移动开发,其中的实验也算是大部分是自己完成的,所以算是写博客记录一下吧。
第一次写,有啥问题及时交流哈,不喜勿喷,谢谢啦。
1.UI设计:
利用EditText、Button控件(控件不唯一,个人喜好);
布局可以采用相对布局,每个小控件的间距自己设即可;
(以下是部分UI代码)
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal"
android:columnCount="4"
android:rowCount="7"
android:layout_marginBottom="8dp"
>
<EditText
android:id="@+id/text"
android:layout_height="200dp"
android:layout_columnSpan="4"
android:layout_gravity="fill"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="20dp"
android:editable="false"
android:gravity="bottom|right"
android:inputType="numberDecimal"
android:text="0"
android:textSize="55sp"
android:background="@null"/>
<Button
android:id="@+id/btn_clear"
android:text="AC"
android:textSize="30sp"
/>
2.部分java代码:
(1)在界面中使用的控件的定义和注册;
(2)控件的点击事件;
(3)计算器本身的计算功能运用的相关数学函数直接引用相关库函数即可;
(4)注意传参问题。
Button btn_clear;
btn_clear=(Button)findViewById(R.id.btn_clear);
public void onClick(View v) {
String str = text.getText().toString();
switch (v.getId()) {
case R.id.btn_0:
if(str.equals("0")){
str="0";
}
else{
if (str.charAt(str.length()-1)=='÷'){
Toast.makeText(MainActivity.this,"除数不能为0",Toast.LENGTH_SHORT).show();
}else
str+="0";
}
text.setText(str);
break;
(ps:这个计算器比较简单,一共只有两个代码文件java和xml)
1.MainActivity.java
package com.example.admin.calculator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_clear;
Button btn_del;
Button btn_percent;
Button btn_div;
Button btn_root;
Button btn_tan;
Button btn_cos;
Button btn_sin;
Button btn_7;
Button btn_8;
Button btn_9;
Button btn_mul;
Button btn_4;
Button btn_5;
Button btn_6;
Button btn_sub;
Button btn_1;
Button btn_2;
Button btn_3;
Button btn_add;
Button btn_0;
Button btn_p;
Button btn_equ;
EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_clear=(Button)findViewById(R.id.btn_clear);
btn_clear.setOnClickListener(this);
btn_del=(Button)findViewById(R.id.btn_del);
btn_del.setOnClickListener(this);
btn_percent=(Button)findViewById(R.id.btn_percent);
btn_percent.setOnClickListener(this);
btn_div=(Button)findViewById(R.id.btn_div);
btn_div.setOnClickListener(this);
btn_root=(Button)findViewById(R.id.btn_root);
btn_root.setOnClickListener(this);
btn_tan =(Button)findViewById(R.id.btn_tan);
btn_tan.setOnClickListener(this);
btn_cos=(Button)findViewById(R.id.btn_cos);
btn_cos.setOnClickListener(this);
btn_sin=(Button)findViewById(R.id.btn_sin);
btn_sin.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_mul=(Button)findViewById(R.id.btn_mul);
btn_mul.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_sub=(Button)findViewById(R.id.btn_sub);
btn_sub.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_add=(Button)findViewById(R.id.btn_add);
btn_add.setOnClickListener(this);
btn_0=(Button)findViewById(R.id.btn_0);
btn_0.setOnClickListener(this);
btn_p=(Button)findViewById(R.id.btn_p);
btn_p.setOnClickListener(this);
btn_equ=(Button)findViewById(R.id.btn_equ);
btn_equ.setOnClickListener(this);
text=(EditText) findViewById(R.id.text);
text.setOnClickListener(this);
}
public void onClick(View v) {
String str = text.getText().toString();
switch (v.getId()) {
case R.id.btn_0:
if(str.equals("0")){
str="0";
}
else{
if (str.charAt(str.length()-1)=='÷'){
Toast.makeText(MainActivity.this,"除数不能为0",Toast.LENGTH_SHORT).show();
}else
str+="0";
}
text.setText(str);
break;
case R.id.btn_1:
if(str.equals("0")){
str="1";
}
else{
str+="1";
}
text.setText(str);
break;
case R.id.btn_2:
if(str.equals("0")){
str="2";
}
else{
str+="2";
}
text.setText(str);
break;
case R.id.btn_3:
if(str.equals("0")){
str="3";
}
else{
str+="3";
}
text.setText(str);
break;
case R.id.btn_4:
if(str.equals("0")){
str="4";
}
else{
str+="4";
}
text.setText(str);
break;
case R.id.btn_5:
if(str.equals("0")){
str="5";
}
else{
str+="5";
}
text.setText(str);
break;
case R.id.btn_6:
if(str.equals("0")){
str="6";
}
else{
str+="6";
}
text.setText(str);
break;
case R.id.btn_7:
if(str.equals("0")){
str="7";
}
else{
str+="7";
}
text.setText(str);
break;
case R.id.btn_8:
if(str.equals("0")){
str="8";
}
else{
str+="8";
}
text.setText(str);
break;
case R.id.btn_9:
if(str.equals("0")){
str="9";
}
else{
str+="9";
}
text.setText(str);
break;
case R.id.btn_clear:
str="0";
text.setText(str);
break;
case R.id.btn_del:
if(str.length()==1){
str="0";
text.setText(str);
}
else{
text.setText(str.substring(0,str.length()-1));;
}
break;
case R.id.btn_add:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this,"运算式书写不合法!",Toast.LENGTH_LONG).show();
//str="0";
}else {
str += "+";
}
text.setText(str);
break;
case R.id.btn_sub:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else
str+="-";
text.setText(str);
break;
case R.id.btn_mul:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else
str+="x";
text.setText(str);
break;
case R.id.btn_div:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else
str+="÷";
text.setText(str);
break;
case R.id.btn_percent:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else {
// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */
Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型
d = d / 100;//将数字转为小数形式
// str = Double.toString(d);//将小数转为Sting型
//str=str+str1;
String rs=String.format("%.6f",d);//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str=Double.toString(getResult());
str=rs;
text.setText(str);
}
break;
case R.id.btn_root:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else {
// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */
Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型
d = Math.sqrt(d);//计算开平方结果
String rs=String.format("%.6f",d);//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str = Double.toString(d);//将小数转为Sting型
str=rs;
//str=str+str1;
text.setText(str);
}
break;
case R.id.btn_tan:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else {
// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */
Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型
// d = Math.tan(Math.toRadians(20));
if (d!=0 && d%90==0){
Toast.makeText(MainActivity.this,"输入数据不合法",Toast.LENGTH_SHORT).show();
}else {
d = Math.tan(d*Math.PI /180);
String rs=String.format("%.6f",d);//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str = Double.toString(d);//将小数转为Sting型
str=rs;
//str=str+str1;
text.setText(str);}
}
break;
case R.id.btn_cos:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else {
// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */
Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型
// d = Math.cos(Math.toRadians(30));
d = Math.cos(d*Math.PI /180);
String rs=String.format("%.6f",d);//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str = Double.toString(d);//将小数转为Sting型
str=rs;
//str=str+str1;
text.setText(str);
}
break;
case R.id.btn_sin:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else {
// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */
Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型
d = Math.sin(d*Math.PI /180);
String rs=String.format("%.6f",d);//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str = Double.toString(d);//将小数转为Sting型
str=rs;
//str=str+str1;
text.setText(str);
}
break;
case R.id.btn_equ:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {
Toast.makeText(MainActivity.this,"运算式书写不合法!",Toast.LENGTH_LONG).show();
//str="0";
}else{
String rs=String.format("%.6f",getResult());//规避极小误差
rs=rs.replaceAll("0+?$","");//去掉多余的0
rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉
//str=Double.toString(getResult());
str=rs;
}
text.setText(str);
break;
case R.id.btn_p:
if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷') {
Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();
}else if (str.contains(".")){
Toast.makeText(MainActivity.this,"运算式书写不合法",Toast.LENGTH_SHORT).show();
}else
str+=".";
text.setText(str);
break;
}
}
//计算运算表达式的结果:
//定义两个表,分别存放数字和运算符,先对运算符进行判断,然后取其左右两个数字,进行相关运算,最后返回结果
public Double getResult(){
String exp=text.getText().toString();//得到运算表达式
List<Double> numbers=splitNumfromExp(exp);//分离数字
List<Character> ops= splitOpfromExp(exp);//分离运算符
//先算乘除
for (int i=0;i<ops.size();i++){///判断运算符是否为乘除
char op=ops.get(i);
if (op=='x'||op=='÷'){
ops.remove(i);//将符号取出,后面的符号往前顺序移动
double d1=numbers.remove(i);//从数字数组中取出运算符左右的两个数字
double d2=numbers.remove(i);
if (op=='x'){
d1*=d2;
}else {
if (d2== 0) {
d1 =0;
}else{
d1/=d2;
}
}
numbers.add(i,d1);//把运算结果放入数字数组中i的位置,原来位置的数以及后面的顺序后移
i--;
}
}
//后算加减
while (!ops.isEmpty()){
char op=ops.remove(0);
double d1=numbers.remove(0);
double d2=numbers.remove(0);
if(op=='+'){
d1+=d2;
}else{
d1-=d2;
}
//把结果放入数字数组中0的位置
numbers.add(0,d1);
}
return numbers.get(0);///返回运算结果
}
//从表达式中分离运算符
public List<Character> splitOpfromExp(String exp){
exp = text.getText().toString();
List<Character> ops=new ArrayList<>();
//SringTokenizer是一个分隔字符串的应用类,
StringTokenizer st=new StringTokenizer(exp,"0123456789.#");//解析exp字符串,并提供指定的分隔符(此处为数字、小数点、负号)
while (st.hasMoreTokens()){//hasMoreTokens():返回是否还有分隔符
char c=st.nextElement().toString().trim().charAt(0);///trim():去掉字符串首尾的空格
//nextElement():返回从当前位置到下一个分隔符的字符串
ops.add(c); //调用list接口的函数add(),将得到的运算符添加到列表尾部
}
return ops;
}
//从表达式中分离出数字
public List<Double> splitNumfromExp(String exp){
exp=text.getText().toString();
List<Double> numbers=new ArrayList<>();
StringTokenizer st=new StringTokenizer(exp,"+-x÷");
while (st.hasMoreTokens()){
String numStr=st.nextElement().toString().trim();
numbers.add(Double.parseDouble(numStr));
}
return numbers;
}
}
2.UI界面
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal"
android:columnCount="4"
android:rowCount="7"
android:layout_marginBottom="8dp"
>
<EditText
android:id="@+id/text"
android:layout_height="200dp"
android:layout_columnSpan="4"
android:layout_gravity="fill"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="20dp"
android:editable="false"
android:gravity="bottom|right"
android:inputType="numberDecimal"
android:text="0"
android:textSize="55sp"
android:background="@null"/>
<Button
android:id="@+id/btn_clear"
android:text="AC"
android:textSize="30sp" />
<Button
android:id="@+id/btn_del"
android:text="←"
android:textSize="30sp" />
<Button
android:id="@+id/btn_percent"
android:text="%"
android:textSize="30sp" />
<Button
android:id="@+id/btn_div"
android:text="÷"
android:textSize="30sp" />
<Button
android:id="@+id/btn_root"
android:text="√ ̄"
android:textSize="30sp" />
<Button
android:id="@+id/btn_tan"
android:text="tan"
android:textSize="30sp" />
<Button
android:id="@+id/btn_cos"
android:text="cos"
android:textSize="30sp" />
<Button
android:id="@+id/btn_sin"
android:text="sin"
android:textSize="30sp" />
<Button
android:id="@+id/btn_7"
android:text="7"
android:textSize="30sp" />
<Button
android:id="@+id/btn_8"
android:text="8"
android:textSize="30sp" />
<Button
android:id="@+id/btn_9"
android:text="9"
android:textSize="30sp" />
<Button
android:id="@+id/btn_mul"
android:text="x"
android:textSize="30sp" />
<Button
android:id="@+id/btn_4"
android:text="4"
android:textSize="30sp" />
<Button
android:id="@+id/btn_5"
android:text="5"
android:textSize="30sp" />
<Button
android:id="@+id/btn_6"
android:text="6"
android:textSize="30sp" />
<Button
android:id="@+id/btn_sub"
android:text="—"
android:textSize="30sp" />
<Button
android:id="@+id/btn_1"
android:text="1"
android:textSize="30sp" />
<Button
android:id="@+id/btn_2"
android:text="2"
android:textSize="30sp" />
<Button
android:id="@+id/btn_3"
android:text="3"
android:textSize="30sp" />
<Button
android:id="@+id/btn_add"
android:text="+"
android:textSize="30sp" />
<Button
android:id="@+id/btn_0"
android:text="0"
android:textSize="30sp" />
<Button
android:id="@+id/btn_p"
android:text="."
android:textSize="30sp" />
<Button
android:id="@+id/btn_equ"
android:layout_columnSpan="2"
android:layout_gravity="fill_horizontal"
android:text="="
android:textSize="30sp" />
</GridLayout>