android实现简单计算器功能

前端之家收集整理的这篇文章主要介绍了android实现简单计算器功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了android实现简单计算器的具体代码,供大家参考,具体内容如下

  1. // 日期:2014/9/26
  2.  
  3. // 首先,人们的输入习惯为中缀表达式。为了便于计算,程序会将中缀表达式会转换为后缀表达式
  4.  
  5. ////////////////////////////////////////////////////////////////////////////////////////
  6. // 目前软件还存在
  7. // 1.输入运算数和运算符不匹配时,崩溃的现象。(如:只输入一个操作数)
  8. // 2.一个数字中重复输入两个小数点。(如4.5.6)
  9. // 这两个重大的bug,后续会继续修改
  10.  
  11. ////////////////////////////////////////////////////////////////////////////////////////
  12. // 只有一种布局。这也会在后续考虑完善。
  13. // 若有其他不完善的地方,请指正。(╯▽╰)
  14.  
  15. package com.example.countea;
  16.  
  17. import android.os.Bundle; //不太明白到底是啥
  18. import android.app.Activity;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.view.View;
  22. import android.view.View.OnClickListener;
  23. import android.widget.Button;
  24. import android.widget.EditText;
  25.  
  26. import android.widget.Toast; // 显示版权信息
  27. import java.util.Iterator; // 迭代器
  28. import java.util.LinkedList; // 双向列表
  29.  
  30. public class MainActivity extends Activity {
  31. private EditText content;
  32. private EditText operaline;
  33. private Double first_num = 0.0; // 第一个操作数
  34. private Double sec_num = 0.0; // 第二个操作数
  35. //无法设置bool型变量?????
  36. private static int equal_flg = 0; // 等号的状态:FALSE表示未按过等号,TRUE表示已经按过等号
  37. private double negative_mark = 0; // 正负数标记
  38. LinkedList<String> Infix = new LinkedList<String>(); // 对content进行解析,即存放中缀表达式的链表
  39. LinkedList<String> Suffix = new LinkedList<String>(); // 存放后缀表达式的链表
  40. LinkedList<Double> Suffix_Num = new LinkedList<Double>(); // 存放后缀表达式的数字链表
  41. LinkedList<String> OP = new LinkedList<String>(); // 1.作为临时存放运算符的链表;2.存放后缀表达式的运算符
  42.  
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState)
  45. {
  46. super.onCreate(savedInstanceState);
  47. setContentView(R.layout.activity_main);
  48.  
  49. // 处理"c"清屏按钮功能
  50. Button clear = (Button) findViewById(R.id.clear);
  51. clear.setOnClickListener(new OnClickListener() {
  52.  
  53. @Override
  54. public void onClick(View v)
  55. {
  56. // TODO Auto-generated method stub
  57. content = (EditText) findViewById(R.id.content);
  58. content.setText("");
  59. equal_flg = 0;
  60.  
  61. first_num = 0.0;
  62. sec_num = 0.0;
  63. OP.clear();
  64. Suffix.clear();
  65. Suffix_Num.clear();
  66. operaline.setText("");
  67. operaline.setSelection(operaline.getText().length());
  68. }
  69. });
  70.  
  71. // 处理CE删除当前操作按钮功能
  72. Button current_clear = (Button) findViewById(R.id.current_clear);
  73. current_clear.setOnClickListener(new OnClickListener() {
  74. @Override
  75. public void onClick(View v)
  76. {
  77. // TODO Auto-generated method stub
  78. content = (EditText) findViewById(R.id.content);
  79. content.setText("");
  80. equal_flg = 0;
  81.  
  82. first_num = 0.0;
  83. sec_num = 0.0;
  84. OP.clear();
  85. Suffix.clear();
  86. Suffix_Num.clear();
  87. }
  88. });
  89.  
  90. // 处理back退格按钮功能
  91. Button back = (Button) findViewById(R.id.back);
  92. back.setOnClickListener(new OnClickListener() {
  93.  
  94. @Override
  95. public void onClick(View v) {
  96. // TODO Auto-generated method stub
  97. content = (EditText) findViewById(R.id.content);
  98. String str = content.getText().toString();
  99. if (content.getText().length() != 0)
  100. content.setText(str.substring(0,str.length() - 1));
  101. content.setSelection(content.getText().length()); //暂时不知道有什么用,若编辑框为空则无需处理,验证是否会导致异常退出
  102. }
  103. });
  104.  
  105. // 考虑对符号键和数字键是否需要分开实现
  106. // 实现对"0123456789.+-*/()"按钮的监听;而对"="按钮的监听则采用匿名内部类的方法在onCreate()方法体内进行
  107. OnClickListener mylistener = new OnClickListener()
  108. {
  109. @Override
  110. public void onClick(View v) {
  111. // TODO Auto-generated method stub
  112. Button num_btn = (Button) v;
  113. content = (EditText) findViewById(R.id.content);
  114.  
  115. // 储存界面运算式
  116. String content_str = content.getText().toString();
  117.  
  118. // 当已经有一次运算时,再次按“数字键”清除上次的结果
  119. if((1==equal_flg)/*&&(num_btn.getText().toString().equals("1")
  120. ||num_btn.getText().toString().equals("2")
  121. ||num_btn.getText().toString().equals("3")
  122. ||num_btn.getText().toString().equals("4")
  123. ||num_btn.getText().toString().equals("5")
  124. ||num_btn.getText().toString().equals("6")
  125. ||num_btn.getText().toString().equals("7")
  126. ||num_btn.getText().toString().equals("8")
  127. ||num_btn.getText().toString().equals("9")
  128. ||num_btn.getText().toString().equals("0"))*/)
  129. {
  130. content.setText("0");
  131. content.setSelection(content.getText().length());
  132. Toast.makeText(MainActivity.this,"还真执行了!",Toast.LENGTH_LONG).show();
  133. equal_flg=0;
  134. }
  135.  
  136. // 重复输入运算符、括号或者“.”的处理
  137. if(("+".equals(content_str.substring(content_str.length()-1,content_str.length()))
  138. ||"-".equals(content_str.substring(content_str.length()-1,content_str.length()))
  139. ||"*".equals(content_str.substring(content_str.length()-1,content_str.length()))
  140. ||"/".equals(content_str.substring(content_str.length()-1,content_str.length()))
  141. ||".".equals(content_str.substring(content_str.length()-1,content_str.length())))&&((num_btn.getText().toString().equals("+")
  142. ||num_btn.getText().toString().equals("-")
  143. ||num_btn.getText().toString().equals("*")
  144. ||num_btn.getText().toString().equals("/")
  145. ||num_btn.getText().toString().equals("."))))
  146. {
  147. content_str=content_str.substring(0,content_str.length()-1);
  148. //Toast.makeText(MainActivity.this,"手抖了吗?",Toast.LENGTH_LONG).show();
  149. }
  150.  
  151. // 重复按“.”的处理
  152. /*if(num_btn.getText().toString().equals("."))
  153. {
  154. // 如果界面只有数字,则改变当前数字的符号
  155. if("0"!=content_str)
  156. {
  157. judge_str = turn_mark(judge_str);
  158. content.setText(judge_str);
  159. content.setSelection(content.getText().length());
  160. // Toast.makeText(MainActivity.this,"GET",Toast.LENGTH_LONG).show();
  161. }
  162. }*/
  163.  
  164. // 不实现拼接
  165. // 当前数据为0,下次输入为非0数字或括号
  166. if("0".equals(content.getText().toString())
  167. &&!(num_btn.getText().toString().equals("+"))
  168. &&!(num_btn.getText().toString().equals("-"))
  169. &&!(num_btn.getText().toString().equals("*"))
  170. &&!(num_btn.getText().toString().equals("/"))
  171. &&!(num_btn.getText().toString().equals(".")))
  172. {
  173. // 强制转换测试是否有危险??????
  174. content_str = (String) num_btn.getText();
  175. //Toast.makeText(MainActivity.this,num_btn.getText(),Toast.LENGTH_LONG).show();
  176. }
  177.  
  178. // 实现拼接
  179. // 当前数据为0且下次输入为运算符或点号
  180. else
  181. {
  182. content_str += num_btn.getText();
  183. //Toast.makeText(MainActivity.this,content_str,Toast.LENGTH_LONG).show();
  184. }
  185. content.setText(content_str);
  186. content.setSelection(content.getText().length());
  187. }
  188. };
  189.  
  190. // 无需特别处理的数字和符号按钮
  191. Button num1 = (Button) findViewById(R.id.num_1);
  192. num1.setOnClickListener(mylistener);
  193. Button num2 = (Button) findViewById(R.id.num_2);
  194. num2.setOnClickListener(mylistener);
  195. Button num3 = (Button) findViewById(R.id.num_3);
  196. num3.setOnClickListener(mylistener);
  197. Button num4 = (Button) findViewById(R.id.num_4);
  198. num4.setOnClickListener(mylistener);
  199. Button num5 = (Button) findViewById(R.id.num_5);
  200. num5.setOnClickListener(mylistener);
  201. Button num6 = (Button) findViewById(R.id.num_6);
  202. num6.setOnClickListener(mylistener);
  203. Button num7 = (Button) findViewById(R.id.num_7);
  204. num7.setOnClickListener(mylistener);
  205. Button num8 = (Button) findViewById(R.id.num_8);
  206. num8.setOnClickListener(mylistener);
  207. Button num9 = (Button) findViewById(R.id.num_9);
  208. num9.setOnClickListener(mylistener);
  209. Button point = (Button) findViewById(R.id.point);
  210. point.setOnClickListener(mylistener);
  211. Button left = (Button) findViewById(R.id.left);
  212. left.setOnClickListener(mylistener);
  213. Button right = (Button) findViewById(R.id.right);
  214. right.setOnClickListener(mylistener);
  215. Button plus = (Button) findViewById(R.id.plus);
  216. plus.setOnClickListener(mylistener);
  217. Button subtract = (Button) findViewById(R.id.subs);
  218. subtract.setOnClickListener(mylistener);
  219. Button multiply = (Button) findViewById(R.id.multiply);
  220. multiply.setOnClickListener(mylistener);
  221. Button divide = (Button) findViewById(R.id.division);
  222. divide.setOnClickListener(mylistener);
  223.  
  224. // 对按钮0的处理
  225. Button num0 = (Button) findViewById(R.id.num_0);
  226. num0.setOnClickListener(new OnClickListener()
  227. {
  228. @Override
  229. public void onClick(View v)
  230. {
  231. content = (EditText) findViewById(R.id.content);
  232. // 当前编辑框中的值为0
  233. if ("0".equals(content.getText().toString())||""== content.getText().toString())
  234. {
  235. content.setText("0");
  236. }
  237. // 编辑框已有非0数据
  238. else
  239. {
  240. String str = content.getText().toString();
  241. str += "0";
  242. content.setText(str);
  243. }
  244. content.setSelection(content.getText().length());
  245. // Toast.makeText(MainActivity.this,Toast.LENGTH_LONG).show();
  246. }
  247. });
  248.  
  249. // 对“-/+”的处理
  250. Button mark_sign = (Button) findViewById(R.id.mark_sign);
  251. mark_sign.setOnClickListener(new OnClickListener()
  252. {
  253. @Override
  254. public void onClick(View v)
  255. {
  256.  
  257. content = (EditText) findViewById(R.id.content);
  258. String judge_str = content.getText().toString();
  259.  
  260. // 如果界面只有数字,则改变当前数字的符号
  261. if("0"!=judge_str&&((-1==judge_str.indexOf("+"))
  262. ||(-1==judge_str.indexOf("-")))
  263. ||(-1==judge_str.indexOf("*"))
  264. ||(-1==judge_str.indexOf("/"))
  265. ||(-1==judge_str.indexOf("("))
  266. ||(-1==judge_str.indexOf(")")))
  267. {
  268. judge_str = turn_mark(judge_str);
  269. content.setText(judge_str);
  270. content.setSelection(content.getText().length());
  271. // Toast.makeText(MainActivity.this,Toast.LENGTH_LONG).show();
  272. }
  273. }
  274. });
  275. // 实现"="按钮的功能
  276. Button equal = (Button) findViewById(R.id.equal);
  277. equal.setOnClickListener(new OnClickListener()
  278. {
  279. @Override
  280. public void onClick(View v)
  281. {
  282. // TODO Auto-generated method stub
  283. content = (EditText) findViewById(R.id.content);
  284. operaline = (EditText) findViewById(R.id.operatline);
  285. // str_Infix为待转换的中缀表达式
  286. String str_Infix = content.getText().toString();
  287. // 友好的界面提示处理
  288. String equate = str_Infix;
  289. equate += "=";
  290. operaline.setText(equate);
  291. operaline.setSelection(content.getText().length());
  292. // 调用Analysis函数对content进行解析
  293. MainActivity.this.Analysis(str_Infix);
  294. System.out.println(Infix);
  295. // 至此,中缀表达式已存放到Infix链表中
  296.  
  297. Iterator<String> it = Infix.iterator();
  298. while (it.hasNext())
  299. {
  300. String tmp_str = it.next();
  301. if (isNum(tmp_str))
  302. {
  303. // 如果是数字或小数点则直接进入Suffix链表;
  304. Suffix.addLast(tmp_str);
  305. }
  306. // 如果不是数字或小数点的话;
  307. else
  308. {
  309. int OP_level = OP.isEmpty() ? 0 : getLevel(OP.getLast());
  310. // tmp_str比OP的顶运算符优先级高则入OP
  311. if (getLevel(tmp_str) > OP_level)
  312. {
  313. OP.addLast(tmp_str);
  314. }
  315. // tmp_str比OP的顶运算符优先级低
  316. else
  317. {
  318. // tmp_str为")",则将OP一直出栈直到遇到"("
  319. if (getLevel(tmp_str) == -1)
  320. {
  321. String temp_OP = OP.removeLast();
  322. while (getLevel(temp_OP) != -2) {
  323. Suffix.addLast(temp_OP);
  324. temp_OP = OP.removeLast();
  325. }
  326. }
  327. // tmp_str为"(",则直接入OP
  328. else if (getLevel(tmp_str) == -2)
  329. {
  330. OP.addLast(tmp_str);
  331. }
  332. // tmp_str比OP_level优先级低又不是"(" ")",// 则OP一直出栈直到OP为空或tmp_str比OP_level优先级高
  333. else
  334. {
  335. String str2 = OP.removeLast();
  336. while (getLevel(str2) >= OP_level)
  337. {
  338. Suffix.addLast(str2);
  339. if (OP.isEmpty())
  340. {
  341. break;
  342. }
  343. str2 = OP.removeLast();
  344. }
  345. OP.addLast(tmp_str);
  346. }
  347. }
  348. }
  349. }
  350. Infix.clear();// 清空Infix链表
  351. // OP中剩余的元素出OP进入Suffix
  352. while (!OP.isEmpty())
  353. {
  354. Suffix.addLast(OP.removeLast());
  355. }
  356. System.out.println(Suffix);
  357. // 至此,中缀表达式已全部转化为后缀表达式Suffix
  358.  
  359. // 后缀表达式的计算过程???未指定操作数时 默认为0
  360. while (!(Suffix.isEmpty()))
  361. {
  362. String count_str = Suffix.removeFirst();
  363. if (isOP(count_str))
  364. {
  365. char compare_ch = count_str.charAt(0);
  366. first_num = Suffix_Num.removeLast();
  367. sec_num = Suffix_Num.removeLast();
  368. switch (compare_ch) {
  369. case '*':
  370. Suffix_Num.addLast(sec_num * first_num);
  371. break;
  372. case '/':
  373. // 测试注意除数和被除数的顺序
  374. if (first_num != 0)
  375. {
  376. Suffix_Num.addLast(sec_num / first_num);
  377. break;
  378. } else
  379. {
  380. content = (EditText) findViewById(R.id.content);
  381. // ?????无法再编辑框内,设置提示
  382. content.setText("∞");
  383. content.setSelection(content.getText().length());
  384. }
  385. case '+':
  386. Suffix_Num.addLast(sec_num + first_num);
  387. break;
  388. case '-':
  389. Suffix_Num.addLast(sec_num - first_num);
  390. break;
  391. }
  392. }
  393. else
  394. {
  395. Suffix_Num.addLast(Double.parseDouble(count_str));
  396. }
  397. }
  398. // 至此,求得的结果已在Suffix_Num列表中
  399.  
  400. // 这部分的逻辑为 result 存放从Suffix_Num列表中取出的数据,处理结果后显示到界面上。
  401. Double result=Suffix_Num.removeFirst();
  402. String res_str=Double.toString(result);
  403.  
  404. if("0".equals(res_str.substring(res_str.length()-1,res_str.length())))
  405. {
  406. if(".".equals(res_str.substring(res_str.length()-2,res_str.length()-1)))
  407. {
  408. res_str=res_str.substring(0,res_str.length()-2);
  409. //Toast.makeText(MainActivity.this,res_str,Toast.LENGTH_LONG).show();
  410. };
  411. };
  412. content.setText(res_str);
  413. content.setSelection(content.getText().length());
  414. equal_flg = 1;
  415. if("-".equals(res_str.substring(0,1)))
  416. res_str=turn_mark(res_str);
  417. }
  418. });
  419. // 操作数清空?????android有自动释放机制?
  420. first_num = 0.0;
  421. sec_num = 0.0;
  422. OP.clear();
  423. Suffix.clear();
  424. Suffix_Num.clear();
  425. }
  426.  
  427. // 自定义isNum()方法来检测元素是否为数值
  428. public boolean isNum(String str) {
  429. int num = 0;
  430. for (int i = 0; i < str.length(); i++) {
  431. String strr = str.substring(i,i + 1);
  432. if (strr.equals("0") || strr.equals("1") || strr.equals("2")
  433. || strr.equals("3") || strr.equals("4") || strr.equals("5")
  434. || strr.equals("6") || strr.equals("7") || strr.equals("8")
  435. || strr.equals("9") || strr.equals("."))
  436. num = num + 1;
  437. }
  438. if (num == str.length())
  439. return true;
  440. else
  441. return false;
  442. }
  443.  
  444. // 自定义isOP()方法来检测Suffix列表的元素是否为运算符
  445. public boolean isOP(String strr) {
  446. if (strr.equals("+") || strr.equals("-") || strr.equals("*")
  447. || strr.equals("/"))
  448. return true;
  449. else
  450. return false;
  451. }
  452.  
  453. // 定义运算符的等级
  454. public int getLevel(String str) {
  455. if (str.equals("*") || str.equals("/")) {
  456. return 2;
  457. } else if (str.equals("+") || str.equals("-")) {
  458. return 1;
  459. } else if (str.equals("(")) {
  460. return -2;
  461. } else if (str.equals(")")) {
  462. return -1;
  463. } else {
  464. return 0;
  465. }
  466. }
  467.  
  468. // 改变正负号
  469. public String turn_mark(String str)
  470. {
  471. String temp = "(";
  472. temp += "-";
  473. temp += str;
  474. temp += ")";
  475. str = temp;
  476. return str;
  477. }
  478.  
  479. // 实现对编辑框内容以数字和操作符分开储存
  480. public void Analysis(String str) {
  481. String sub = "";
  482.  
  483. for (int i = 0; i < str.length(); i++)
  484. {
  485. // 用substring遍历需要解析的数组
  486. String strr = str.substring(i,i + 1);
  487. if (isNum(strr))
  488. {
  489. sub += strr;
  490. }
  491. else
  492. {
  493. if (sub != "")
  494. {
  495. Infix.addLast(sub); // 首先sub进Infix
  496. sub = ""; // 将sub清空
  497. }
  498. Infix.addLast(strr); // "+-*/" "(" ")" 则直接进Infix表
  499. }
  500. }
  501. // ?????测试for下面的IF是否是因为循环无法判断最后一个数
  502. if (isNum(str.substring(str.length() - 1))) {
  503. Infix.addLast(sub); // 首先sub进Infix
  504. sub = ""; // 将sub清空
  505. }
  506.  
  507. }
  508.  
  509. @Override
  510. public boolean onCreateOptionsMenu(Menu menu)
  511. {
  512. /*
  513. * // Inflate the menu; this adds items to the action bar if it is
  514. * present. getMenuInflater().inflate(R.menu.main,menu);
  515. */
  516. menu.add(0,1,"退出");
  517. menu.add(0,2,"关于");
  518. menu.add(0,3,"帮助");
  519. return super.onCreateOptionsMenu(menu);
  520. /* return true; */
  521. }
  522.  
  523. @Override
  524. public boolean onOptionsItemSelected(MenuItem item) {
  525. // TODO Auto-generated method stub
  526. //finish();
  527. if (item.getItemId() == 2)
  528. {
  529. // 利用Toast来显示提示信息
  530. Toast.makeText(MainActivity.this,"作者:歡 联系:cdch@gmail.com",Toast.LENGTH_LONG).show();
  531. }
  532. if (item.getItemId() == 3)
  533. {
  534. // 利用Toast来显示提示信息
  535. Toast.makeText(MainActivity.this,"适用于一般算数运算!",Toast.LENGTH_LONG).show();
  536. }
  537.  
  538. return super.onOptionsItemSelected(item);
  539. };
  540.  
  541. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的Android相关文章