中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android怎么實現簡單計算器功能

發布時間:2021-04-16 09:31:52 來源:億速云 閱讀:183 作者:小新 欄目:移動開發

這篇文章主要介紹了android怎么實現簡單計算器功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

具體內容如下

// 日期:2014/9/26
 
// 首先,人們的輸入習慣為中綴表達式。為了便于計算,程序會將中綴表達式會轉換為后綴表達式
 
////////////////////////////////////////////////////////////////////////////////////////
// 目前軟件還存在
// 1.輸入運算數和運算符不匹配時,崩潰的現象。(如:只輸入一個操作數)
// 2.一個數字中重復輸入兩個小數點。(如4.5.6)
// 這兩個重大的bug,后續會繼續修改
 
////////////////////////////////////////////////////////////////////////////////////////
// 只有一種布局。這也會在后續考慮完善。
// 若有其他不完善的地方,請指正。(╯▽╰)
 
 
package com.example.countea;
 
import android.os.Bundle;          //不太明白到底是啥
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
import android.widget.Toast;         // 顯示版權信息
import java.util.Iterator;         // 迭代器
import java.util.LinkedList;         // 雙向列表
 
public class MainActivity extends Activity {
 private EditText content;
 private EditText operaline;
 private Double first_num = 0.0;       // 第一個操作數
 private Double sec_num = 0.0;       // 第二個操作數
 //無法設置bool型變量?????
 private static int equal_flg = 0;       // 等號的狀態:FALSE表示未按過等號,TRUE表示已經按過等號
 private double negative_mark = 0;       // 正負數標記
 LinkedList<String> Infix = new LinkedList<String>();  // 對content進行解析,即存放中綴表達式的鏈表
 LinkedList<String> Suffix = new LinkedList<String>();  // 存放后綴表達式的鏈表
 LinkedList<Double> Suffix_Num = new LinkedList<Double>(); // 存放后綴表達式的數字鏈表
 LinkedList<String> OP = new LinkedList<String>();   // 1.作為臨時存放運算符的鏈表;2.存放后綴表達式的運算符
 
 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 
 // 處理"c"清屏按鈕功能
 Button clear = (Button) findViewById(R.id.clear);
 clear.setOnClickListener(new OnClickListener() {
 
 @Override
 public void onClick(View v) 
 {
 // TODO Auto-generated method stub
 content = (EditText) findViewById(R.id.content);
 content.setText("");
 equal_flg = 0;
 
 first_num = 0.0;
 sec_num = 0.0;
 OP.clear();
 Suffix.clear();
 Suffix_Num.clear();
 operaline.setText("");
 operaline.setSelection(operaline.getText().length());
 }
 });
 
 // 處理CE刪除當前操作按鈕功能
 Button current_clear = (Button) findViewById(R.id.current_clear);
  current_clear.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) 
 {
 // TODO Auto-generated method stub
 content = (EditText) findViewById(R.id.content);
 content.setText("");
 equal_flg = 0;
 
 first_num = 0.0;
 sec_num = 0.0;
 OP.clear();
 Suffix.clear();
 Suffix_Num.clear();
 }
 });
 
 // 處理back退格按鈕功能
 Button back = (Button) findViewById(R.id.back);
 back.setOnClickListener(new OnClickListener() {
 
 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub
 content = (EditText) findViewById(R.id.content);
 String str = content.getText().toString();
 if (content.getText().length() != 0)
  content.setText(str.substring(0, str.length() - 1));
  content.setSelection(content.getText().length()); //暫時不知道有什么用,若編輯框為空則無需處理,驗證是否會導致異常退出
 }
 });
 
 // 考慮對符號鍵和數字鍵是否需要分開實現
 // 實現對"0123456789.+-*/()"按鈕的監聽;而對"="按鈕的監聽則采用匿名內部類的方法在onCreate()方法體內進行
 OnClickListener mylistener = new OnClickListener() 
 {
 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub
 Button num_btn = (Button) v;
 content = (EditText) findViewById(R.id.content);
 
 // 儲存界面運算式
 String content_str = content.getText().toString();
 
 // 當已經有一次運算時,再次按“數字鍵”清除上次的結果
 if((1==equal_flg)/*&&(num_btn.getText().toString().equals("1")
  ||num_btn.getText().toString().equals("2")
  ||num_btn.getText().toString().equals("3")
  ||num_btn.getText().toString().equals("4")
  ||num_btn.getText().toString().equals("5")
  ||num_btn.getText().toString().equals("6")
  ||num_btn.getText().toString().equals("7")
  ||num_btn.getText().toString().equals("8")
  ||num_btn.getText().toString().equals("9")
  ||num_btn.getText().toString().equals("0"))*/)
 {
  content.setText("0");
  content.setSelection(content.getText().length());
  Toast.makeText(MainActivity.this,"還真執行了!", Toast.LENGTH_LONG).show();
  equal_flg=0; 
 }
 
 // 重復輸入運算符、括號或者“.”的處理
 if(("+".equals(content_str.substring(content_str.length()-1,content_str.length()))
  ||"-".equals(content_str.substring(content_str.length()-1,content_str.length()))
  ||"*".equals(content_str.substring(content_str.length()-1,content_str.length()))
  ||"/".equals(content_str.substring(content_str.length()-1,content_str.length()))
  ||".".equals(content_str.substring(content_str.length()-1,content_str.length())))&&((num_btn.getText().toString().equals("+")
  ||num_btn.getText().toString().equals("-")
  ||num_btn.getText().toString().equals("*")
  ||num_btn.getText().toString().equals("/")
  ||num_btn.getText().toString().equals("."))))
 {
  content_str=content_str.substring(0, content_str.length()-1);
  //Toast.makeText(MainActivity.this,"手抖了嗎?", Toast.LENGTH_LONG).show();
 } 
 
 // 重復按“.”的處理
 /*if(num_btn.getText().toString().equals("."))
 {
  // 如果界面只有數字,則改變當前數字的符號
  if("0"!=content_str)
  {
  judge_str = turn_mark(judge_str);  
  content.setText(judge_str);
  content.setSelection(content.getText().length());
  // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
  }
 }*/ 
 
 // 不實現拼接
 // 當前數據為0,下次輸入為非0數字或括號
 if("0".equals(content.getText().toString())
  &&!(num_btn.getText().toString().equals("+"))
  &&!(num_btn.getText().toString().equals("-"))
  &&!(num_btn.getText().toString().equals("*"))
  &&!(num_btn.getText().toString().equals("/"))
  &&!(num_btn.getText().toString().equals(".")))
 {
  // 強制轉換測試是否有危險??????
  content_str = (String) num_btn.getText();
  //Toast.makeText(MainActivity.this,num_btn.getText(), Toast.LENGTH_LONG).show();
 }
 
 // 實現拼接
 // 當前數據為0且下次輸入為運算符或點號
 else
 {
  content_str += num_btn.getText();
  //Toast.makeText(MainActivity.this,content_str, Toast.LENGTH_LONG).show();
 }
 content.setText(content_str);
 content.setSelection(content.getText().length());
 }
 };
 
 // 無需特別處理的數字和符號按鈕
 Button num1 = (Button) findViewById(R.id.num_1);
 num1.setOnClickListener(mylistener);
 Button num2 = (Button) findViewById(R.id.num_2);
 num2.setOnClickListener(mylistener);
 Button num3 = (Button) findViewById(R.id.num_3);
 num3.setOnClickListener(mylistener);
 Button num4 = (Button) findViewById(R.id.num_4);
 num4.setOnClickListener(mylistener);
 Button num5 = (Button) findViewById(R.id.num_5);
 num5.setOnClickListener(mylistener);
 Button num6 = (Button) findViewById(R.id.num_6);
 num6.setOnClickListener(mylistener);
 Button num7 = (Button) findViewById(R.id.num_7);
 num7.setOnClickListener(mylistener);
 Button num8 = (Button) findViewById(R.id.num_8);
 num8.setOnClickListener(mylistener);
 Button num9 = (Button) findViewById(R.id.num_9);
 num9.setOnClickListener(mylistener);
 Button point = (Button) findViewById(R.id.point);
 point.setOnClickListener(mylistener);
 Button left = (Button) findViewById(R.id.left);
 left.setOnClickListener(mylistener);
 Button right = (Button) findViewById(R.id.right);
 right.setOnClickListener(mylistener);
 Button plus = (Button) findViewById(R.id.plus);
 plus.setOnClickListener(mylistener);
 Button subtract = (Button) findViewById(R.id.subs);
 subtract.setOnClickListener(mylistener);
 Button multiply = (Button) findViewById(R.id.multiply);
 multiply.setOnClickListener(mylistener);
 Button divide = (Button) findViewById(R.id.division);
 divide.setOnClickListener(mylistener);
 
 
 // 對按鈕0的處理
 Button num0 = (Button) findViewById(R.id.num_0);
 num0.setOnClickListener(new OnClickListener() 
 {
 @Override
 public void onClick(View v) 
 {
 content = (EditText) findViewById(R.id.content);
 // 當前編輯框中的值為0
 if ("0".equals(content.getText().toString())||""== content.getText().toString())
 {
  content.setText("0");
 }
 // 編輯框已有非0數據
 else
 {
  String str = content.getText().toString();
   str += "0";
   content.setText(str);
 }
 content.setSelection(content.getText().length());
 // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
 } 
 });
 
 // 對“-/+”的處理
 Button mark_sign = (Button) findViewById(R.id.mark_sign);
 mark_sign.setOnClickListener(new OnClickListener() 
 {
 @Override
 public void onClick(View v) 
 {
 
 content = (EditText) findViewById(R.id.content);
 String judge_str = content.getText().toString();
 
 // 如果界面只有數字,則改變當前數字的符號
 if("0"!=judge_str&&((-1==judge_str.indexOf("+"))
  ||(-1==judge_str.indexOf("-")))
  ||(-1==judge_str.indexOf("*"))
  ||(-1==judge_str.indexOf("/"))
  ||(-1==judge_str.indexOf("("))
  ||(-1==judge_str.indexOf(")")))
 {
  judge_str = turn_mark(judge_str);  
  content.setText(judge_str);
  content.setSelection(content.getText().length());
  // Toast.makeText(MainActivity.this,"GET", Toast.LENGTH_LONG).show();
 }
 } 
 });
 // 實現"="按鈕的功能
 Button equal = (Button) findViewById(R.id.equal);
 equal.setOnClickListener(new OnClickListener() 
 {
 @Override
 public void onClick(View v) 
 {
 // TODO Auto-generated method stub
 content = (EditText) findViewById(R.id.content);
 operaline = (EditText) findViewById(R.id.operatline);
 // str_Infix為待轉換的中綴表達式
 String str_Infix = content.getText().toString();
 // 友好的界面提示處理
 String equate = str_Infix;
 equate += "=";
 operaline.setText(equate);
 operaline.setSelection(content.getText().length());
 // 調用Analysis函數對content進行解析
 MainActivity.this.Analysis(str_Infix);   
 System.out.println(Infix);
 // 至此,中綴表達式已存放到Infix鏈表中
 
 Iterator<String> it = Infix.iterator();
 while (it.hasNext()) 
 {  
  String tmp_str = it.next();
  if (isNum(tmp_str)) 
  {
   // 如果是數字或小數點則直接進入Suffix鏈表;
  Suffix.addLast(tmp_str);
  }
  // 如果不是數字或小數點的話;
  else 
  {
  int OP_level = OP.isEmpty() ? 0 : getLevel(OP.getLast());
  // tmp_str比OP的頂運算符優先級高則入OP
  if (getLevel(tmp_str) > OP_level) 
  {
  OP.addLast(tmp_str);
  }
  // tmp_str比OP的頂運算符優先級低
  else 
  {
  // tmp_str為")",則將OP一直出棧直到遇到"("
  if (getLevel(tmp_str) == -1) 
  {
  String temp_OP = OP.removeLast();
  while (getLevel(temp_OP) != -2) {
   Suffix.addLast(temp_OP);
   temp_OP = OP.removeLast();
  }
  }
  // tmp_str為"(",則直接入OP
  else if (getLevel(tmp_str) == -2) 
  {
  OP.addLast(tmp_str);
  }
  // tmp_str比OP_level優先級低又不是"(" ")",
  // 則OP一直出棧直到OP為空或tmp_str比OP_level優先級高
  else 
  {
  String str2 = OP.removeLast();
  while (getLevel(str2) >= OP_level) 
  {
   Suffix.addLast(str2);
   if (OP.isEmpty()) 
   {
   break;
   }
   str2 = OP.removeLast();
  }
  OP.addLast(tmp_str);
  }
  }
  }
 }
 Infix.clear();// 清空Infix鏈表
 // OP中剩余的元素出OP進入Suffix
 while (!OP.isEmpty()) 
 {
  Suffix.addLast(OP.removeLast());
 }
 System.out.println(Suffix);
 // 至此,中綴表達式已全部轉化為后綴表達式Suffix
 
 // 后綴表達式的計算過程???未指定操作數時 默認為0
 while (!(Suffix.isEmpty())) 
 {
  String count_str = Suffix.removeFirst();
  if (isOP(count_str)) 
  {
  char compare_ch = count_str.charAt(0);
  first_num = Suffix_Num.removeLast();
  sec_num = Suffix_Num.removeLast();
  switch (compare_ch) {
  case '*':
  Suffix_Num.addLast(sec_num * first_num);
  break;
  case '/':
  // 測試注意除數和被除數的順序
  if (first_num != 0) 
  {
  Suffix_Num.addLast(sec_num / first_num);
  break;
  } else 
  {
  content = (EditText) findViewById(R.id.content);
  // ?????無法再編輯框內,設置提示
  content.setText("∞");
  content.setSelection(content.getText().length());
  }
  case '+':
  Suffix_Num.addLast(sec_num + first_num);
  break;
  case '-':
  Suffix_Num.addLast(sec_num - first_num);
  break;
  }
  } 
  else 
  {
  Suffix_Num.addLast(Double.parseDouble(count_str));
  }
 }
 // 至此,求得的結果已在Suffix_Num列表中
 
 // 這部分的邏輯為 result 存放從Suffix_Num列表中取出的數據,處理結果后顯示到界面上。
 Double result=Suffix_Num.removeFirst();
 String res_str=Double.toString(result);
 
 if("0".equals(res_str.substring(res_str.length()-1,res_str.length())))
 {
  if(".".equals(res_str.substring(res_str.length()-2,res_str.length()-1)))
  {
  res_str=res_str.substring(0,res_str.length()-2);
  //Toast.makeText(MainActivity.this,res_str, Toast.LENGTH_LONG).show();
  };
 };
  content.setText(res_str);
  content.setSelection(content.getText().length());
  equal_flg = 1;
  if("-".equals(res_str.substring(0,1)))
  res_str=turn_mark(res_str);
 }
 });
 // 操作數清空?????android有自動釋放機制?
 first_num = 0.0;
 sec_num = 0.0;
 OP.clear();
 Suffix.clear();
 Suffix_Num.clear();
 }
 
 // 自定義isNum()方法來檢測元素是否為數值
 public boolean isNum(String str) {
 int num = 0;
 for (int i = 0; i < str.length(); i++) {
 String strr = str.substring(i, i + 1);
 if (strr.equals("0") || strr.equals("1") || strr.equals("2")
  || strr.equals("3") || strr.equals("4") || strr.equals("5")
  || strr.equals("6") || strr.equals("7") || strr.equals("8")
  || strr.equals("9") || strr.equals("."))
 num = num + 1;
 }
 if (num == str.length())
 return true;
 else
 return false;
 }
 
 // 自定義isOP()方法來檢測Suffix列表的元素是否為運算符
 public boolean isOP(String strr) {
 if (strr.equals("+") || strr.equals("-") || strr.equals("*")
 || strr.equals("/"))
 return true;
 else
 return false;
 }
 
 // 定義運算符的等級
 public int getLevel(String str) {
 if (str.equals("*") || str.equals("/")) {
 return 2;
 } else if (str.equals("+") || str.equals("-")) {
 return 1;
 } else if (str.equals("(")) {
 return -2;
 } else if (str.equals(")")) {
 return -1;
 } else {
 return 0;
 }
 }
 
 // 改變正負號
 public String turn_mark(String str) 
 {
 String temp = "(";
 temp += "-";
 temp += str;
 temp += ")";
 str = temp;
 return str;
 }
 
 // 實現對編輯框內容以數字和操作符分開儲存
 public void Analysis(String str) {
 String sub = "";
 
 for (int i = 0; i < str.length(); i++) 
 {
 // 用substring遍歷需要解析的數組
 String strr = str.substring(i, i + 1);
 if (isNum(strr)) 
 {
 sub += strr;
 }
 else 
 {
 if (sub != "")
 {
  Infix.addLast(sub); // 首先sub進Infix
  sub = "";    // 將sub清空
 }
 Infix.addLast(strr);  // "+-*/" "(" ")" 則直接進Infix表
 }
 }
 // ?????測試for下面的IF是否是因為循環無法判斷最后一個數
 if (isNum(str.substring(str.length() - 1))) {
 Infix.addLast(sub);   // 首先sub進Infix
 sub = "";      // 將sub清空
 }
 
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) 
 {
 /*
 * // Inflate the menu; this adds items to the action bar if it is
 * present. getMenuInflater().inflate(R.menu.main, menu);
 */
 menu.add(0, 1, 1, "退出");
 menu.add(0, 2, 2, "關于");
 menu.add(0, 3, 3, "幫助");
 return super.onCreateOptionsMenu(menu);
 /* return true; */
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 // TODO Auto-generated method stub
 //finish();
 if (item.getItemId() == 2) 
 {
 // 利用Toast來顯示提示信息
 Toast.makeText(MainActivity.this,"作者:歡 聯系:cdch@gmail.com", Toast.LENGTH_LONG).show();
 }
 if (item.getItemId() == 3) 
 {
 // 利用Toast來顯示提示信息
 Toast.makeText(MainActivity.this,"適用于一般算數運算!", Toast.LENGTH_LONG).show();
 }
 
 return super.onOptionsItemSelected(item);
 };
 
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“android怎么實現簡單計算器功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江川县| 克山县| 泗洪县| 宽甸| 上思县| 舒兰市| 和田县| 内江市| 吉安县| 阿拉尔市| 武胜县| 鸡西市| 嘉祥县| 桐城市| 东方市| 临澧县| 本溪| 湟中县| 吉水县| 峨山| 漾濞| 石棉县| 湖南省| 阳高县| 维西| 通海县| 加查县| 连平县| 文登市| 四子王旗| 卓资县| 嘉定区| 乐亭县| 那曲县| 临朐县| 永春县| 酒泉市| 马鞍山市| 盈江县| 高阳县| 永新县|