经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
android实现简单计算器功能
来源:jb51  时间:2019/9/18 8:34:09  对本文有异议

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号