溫馨提示×

溫馨提示×

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

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

android中怎么實現計算器功能

發布時間:2021-08-09 16:40:40 來源:億速云 閱讀:155 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關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 pide = (Button) findViewById(R.id.pision); pide.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

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女