当前位置:   article > 正文

Java 实现计算器功能_java实现计算器

java实现计算器

一个简单的计算器功能,我是按照老师的课程设计指导书分步骤来的,所以写的垃圾代码比较多,形成了一座“大屎山”,如果正常写的话,完全可以用最后一步将输入数字以及操作符放在栈中进行操作,当select=3时的代码会有一些帮助,输入格式都是带空格的,这里面也包含了一些其他功能:

1.存储最近计算结果

2.浏览所有计算历史

3.根据id查找结果

4.清空历史记录

5.与最近计算结果进行二次运算(支持(opera n)形式)

6.进行带括号运算(但只支持(n opera n) opera (n opera n)形式)

7.包含很多对于输入格式不正确的异常捕捉

这是我写的第一个略微长一点的java程序,垃圾代码比有用代码多哈哈哈


  1. package shiyan.Project;
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4. import java.util.Stack;
  5. class calculator { //计算器类
  6. String expre; //表达式
  7. int type=0; //表达式是double型运算还是int型运算,type为0,int;为1,double
  8. int div0=0; //evaluate中div0>0,则第二个数字为0
  9. int div1=0; //evalua1中判断除数是否为0
  10. double recent=0; //最近存储
  11. public static ArrayList list=new ArrayList<>(); //集合声明,存储列表
  12. float result=0;
  13. double firstDouble;
  14. double secondDouble;
  15. //构造函数初始化
  16. public calculator(){} //创建存储列表
  17. public calculator(String expre){
  18. this.expre=expre;
  19. }
  20. //判断表达式是否合法
  21. public float evaluate(String expression) {
  22. //以空格为分界符分割
  23. String[] str = expression.split(" ");
  24. //判断str数组长度,不等于3,则error
  25. if (str.length != 3 ) {
  26. System.out.println("Invaild input.");
  27. return Float.MIN_VALUE;
  28. }
  29. //判断是浮点型还是整形
  30. int flag = 0; //标志位,判断是否有小数点,flag=0,则为int
  31. char[] num1 = str[0].toCharArray(); //第一数字字符串,检查是否有小数点
  32. for (int i = 0; i < num1.length; i++) {
  33. if (num1[i] == '.') {
  34. flag++;
  35. }
  36. }
  37. char[] num2 = str[2].toCharArray(); //第二数字字符串,检查是否有小数点
  38. for (int i = 0; i < num2.length; i++) {
  39. if (num2[i] == '.') {
  40. flag++;
  41. }
  42. }
  43. //判断flag
  44. if (flag == 0) {
  45. type = 0;
  46. } else {
  47. type = 1;
  48. }
  49. //转换为数字
  50. //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
  51. try{
  52. firstDouble = Double.parseDouble(str[0]);
  53. secondDouble = Double.parseDouble(str[2]);
  54. }
  55. catch(Exception ex){ //若转换出现异常,则报错
  56. System.out.println("Invaild input.");
  57. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  58. }
  59. if (secondDouble == 0) {
  60. div0++; //判断第二个数字是否为0
  61. }
  62. //判断运算符是否有效 and 计算结果,暂时都是double型
  63. switch (str[1]) {
  64. case "+": {
  65. result = (float) (firstDouble + secondDouble);
  66. break;
  67. }
  68. case "-": {
  69. result = (float) (firstDouble - secondDouble);
  70. break;
  71. }
  72. case "*": {
  73. result = (float) (firstDouble * secondDouble);
  74. break;
  75. }
  76. case "/": {
  77. if (div0 != 0) { //判断第二个数字是否为0
  78. System.out.println("Invaild input.");
  79. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  80. } else {
  81. result = (float) (firstDouble / secondDouble);
  82. break;
  83. }
  84. }
  85. default:{System.out.println("Invaild input.");
  86. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  87. }
  88. }
  89. return 1;
  90. }
  91. //返回运行结果
  92. public float getCurrentValue(){
  93. if (type==0){ //int型输出
  94. int FianlResult=(int)(result);
  95. System.out.println("运算结果为"+FianlResult);
  96. return FianlResult;
  97. }
  98. else{ //double型输出
  99. System.out.println("运算结果为"+result);
  100. return (float)(result);
  101. }
  102. }
  103. //设置最近存储结果
  104. public void setMemoryValue(float memval){
  105. recent=memval;
  106. list.add(recent);
  107. //System.out.println("历史记录为"+list);
  108. }
  109. //清空列表
  110. public void clearMemory(){
  111. list.clear();
  112. }
  113. //获取全部存储结果
  114. public float getMemoryValue(){
  115. for (int i=0;i<list.size();i++){
  116. System.out.print(list.get(i));
  117. System.out.print(" ");
  118. }
  119. return 0;
  120. }
  121. //获得某个存储结果
  122. public float getHistoryValue(int index){
  123. try{ //可能出现数组越界,有异常捕捉
  124. System.out.println(list.get(index));
  125. }catch(Exception ex){
  126. System.out.println("数组越界,输入错误");
  127. }
  128. return 0;
  129. }
  130. //再次计算
  131. public float evaluate1(String expression1,float m){
  132. String[] str1=expression1.split(" ");
  133. if (str1.length != 2) {
  134. System.out.println(expression1);
  135. System.out.println("Invaild input.");
  136. return Float.MIN_VALUE;
  137. }
  138. //判断是浮点型还是整形
  139. int flag = 0; //标志位,判断是否有小数点,flag=0,则为int
  140. char[] num1 = str1[1].toCharArray();
  141. for (int i = 0; i < num1.length; i++) {
  142. if (num1[i] == '.') {
  143. flag++;
  144. }
  145. }
  146. //判断flag
  147. if (flag == 0) {
  148. type = 0;
  149. } else {
  150. type = 1;
  151. }
  152. try {
  153. firstDouble = Double.parseDouble(str1[1]);
  154. }
  155. catch(Exception ex){ //若转换出现异常,则报错
  156. System.out.println("Invaild input.");
  157. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  158. }
  159. if (firstDouble == 0) {
  160. div1++; //判断第二个数字是否为0
  161. }
  162. //判断运算符是否有效 and 计算结果,暂时都是double型
  163. switch (str1[0]) {
  164. case "+": {
  165. result = (float) (firstDouble + m);
  166. break;
  167. }
  168. case "-": {
  169. result = (float) (m-firstDouble );
  170. break;
  171. }
  172. case "*": {
  173. result = (float) (firstDouble * m);
  174. break;
  175. }
  176. case "/": {
  177. if (div1 != 0) { //判断第二个数字是否为0
  178. System.out.println("Invaild input.");
  179. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  180. } else {
  181. result = (float) (m/firstDouble);
  182. break;
  183. }
  184. }
  185. default:{System.out.println("Invaild input.");
  186. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  187. }
  188. }
  189. return result;
  190. }
  191. //带括号计算
  192. public float evaluate2(String expression){
  193. //以空格为分界符分割
  194. String[] str = expression.split(" ");
  195. //判断str数组长度,不等于7,则error
  196. //System.out.println(str.length);
  197. if (str.length != 7 ) {
  198. System.out.println("Invaild input1.");
  199. return Float.MIN_VALUE;
  200. }
  201. //处理括号
  202. str[0]= str[0].substring(1);
  203. str[2]=str[2].substring(0,str[2].length()-1);
  204. String opera=str[3];
  205. str[4]= str[4].substring(1);
  206. str[6]=str[6].substring(0,str[6].length()-1);
  207. //转换为数字
  208. //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
  209. try{
  210. firstDouble = Double.parseDouble(str[0]);
  211. secondDouble = Double.parseDouble(str[2]);
  212. }
  213. catch(Exception ex){ //若转换出现异常,则报错
  214. System.out.println("Invaild input2.");
  215. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  216. }
  217. //System.out.println(str[1]);
  218. //判断运算符是否有效 and 计算结果,暂时都是double型
  219. switch (str[1]) {
  220. case "+": {
  221. result = (float) (firstDouble + secondDouble);
  222. break;
  223. }
  224. case "-": {
  225. result = (float) (firstDouble - secondDouble);
  226. break;
  227. }
  228. case "*": {
  229. result = (float) (firstDouble * secondDouble);
  230. break;
  231. }
  232. case "/": {
  233. if (div0 != 0) { //判断第二个数字是否为0
  234. System.out.println("Invaild input3.");
  235. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  236. } else {
  237. result = (float) (firstDouble / secondDouble);
  238. break;
  239. }
  240. }
  241. default:{System.out.println("Invaild input5.");
  242. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  243. }
  244. }
  245. float r1=result;
  246. //处理第二个表达式
  247. try{
  248. firstDouble = Double.parseDouble(str[4]);
  249. secondDouble = Double.parseDouble(str[6]);
  250. }
  251. catch(Exception ex){ //若转换出现异常,则报错
  252. System.out.println("Invaild input2.");
  253. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  254. }
  255. //判断运算符是否有效 and 计算结果,暂时都是double型
  256. switch (str[5]) {
  257. case "+": {
  258. result = (float) (firstDouble + secondDouble);
  259. break;
  260. }
  261. case "-": {
  262. result = (float) (firstDouble - secondDouble);
  263. break;
  264. }
  265. case "*": {
  266. result = (float) (firstDouble * secondDouble);
  267. break;
  268. }
  269. case "/": {
  270. if (div0 != 0) { //判断第二个数字是否为0
  271. System.out.println("Invaild input3.");
  272. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  273. } else {
  274. result = (float) (firstDouble / secondDouble);
  275. break;
  276. }
  277. }
  278. default:{System.out.println("Invaild input4.");
  279. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  280. }
  281. }
  282. float r2=result;
  283. switch (opera) {
  284. case "+": {
  285. result = r1 + r2;
  286. break;
  287. }
  288. case "-": {
  289. result = r1 - r2;
  290. break;
  291. }
  292. case "*": {
  293. result = r1 * r2;
  294. break;
  295. }
  296. case "/": {
  297. if (div0 != 0) { //判断第二个数字是否为0
  298. System.out.println("Invaild input3.");
  299. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  300. } else {
  301. result = r1 / r2;
  302. break;
  303. }
  304. }
  305. default:{System.out.println("Invaild input5.");
  306. return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
  307. }
  308. }
  309. System.out.println("运算结果为:"+result);
  310. return result;
  311. }
  312. }
  313. public class Homework {
  314. //main 函数
  315. public static void main(String[] args) {
  316. Stack s1=new Stack<>();//运算栈
  317. Stack s2=new Stack<>();//中间结果栈
  318. Stack s3=new Stack<>();
  319. calculator c=new calculator();//存储对象,用来存储计算记录
  320. float m=0; //存储最近一次计算结果
  321. while (true){
  322. System.out.println();
  323. System.out.println("输入表达式:");
  324. Scanner input=new Scanner(System.in);
  325. String expression= input.nextLine(); //输入带空格表达式
  326. System.out.println("选择模式:(1-不带括号的简单运算,2-带括号的多值运算,3-不带括号的多值运算)");
  327. int select=input.nextInt();
  328. if (select==2){
  329. calculator d=new calculator(expression);
  330. m=d.evaluate2(expression);
  331. }
  332. else if (select==1){
  333. calculator d=new calculator(expression);
  334. double Isok=d.evaluate(expression); //判断是否有效
  335. if (Isok==1) { //有效继续
  336. m=d.getCurrentValue(); //返回计算结果
  337. }
  338. }
  339. else if (select==3){
  340. String[] opera=expression.split(" ");
  341. //System.out.println(opera.length);
  342. for (int i=0;i< opera.length;i++){
  343. if (i%2==0){
  344. try{
  345. float temp=Float.parseFloat(opera[i]);
  346. s2.push(temp);
  347. }catch(Exception ex){
  348. System.out.println("Input Illegelly");
  349. }
  350. }
  351. else{
  352. if (s1.isEmpty()){
  353. s1.push(opera[i]);
  354. }
  355. else if ((opera[i].equals("*") || opera[i].equals("/")&&(s1.peek().equals("+")||s1.peek().equals("-")))){
  356. s1.push(opera[i]);
  357. }
  358. else{
  359. s2.push(s1.pop());
  360. i--;
  361. }
  362. }
  363. }
  364. while (!s1.isEmpty()){
  365. s2.push(s1.pop());
  366. }
  367. while(!s2.isEmpty()){
  368. s1.push(s2.pop());
  369. }
  370. while (!s1.isEmpty()){
  371. String op="";
  372. float result=0;
  373. try{
  374. op=s1.pop().toString();
  375. float temp=Float.parseFloat(op);
  376. s3.push(temp);
  377. }catch(Exception exception){
  378. float op1= Float.parseFloat(s3.pop().toString());
  379. float op2= Float.parseFloat(s3.pop().toString());
  380. switch (op){
  381. case "+":{result=op2+op1;break;}
  382. case "-":{result=op2-op1;break;}
  383. case "*":{result=op1*op2;break;}
  384. case "/":{result=op2/op1;break;}
  385. }
  386. s3.push(result);
  387. }
  388. }
  389. m=(float)(s3.pop());
  390. System.out.println(m);
  391. }
  392. System.out.println("解下来的操作(m-存储、c-清空、mr-历史结果、h-查找、over-结束任务):");
  393. Scanner next=new Scanner(System.in);
  394. String key=next.next(); //输入接下来的操作
  395. switch (key){
  396. case "m":{c.setMemoryValue(m); //存储并且选择实现第二次运算
  397. System.out.println("接下来的操作(i-输入表达式、n-取消):");
  398. String n= input.next();
  399. switch (n){
  400. case "n":{continue;} //不进行运算
  401. case "i":{ //进行运算并输入表达式
  402. System.out.println("上一次运算结果为"+m);
  403. System.out.println("输入表达式(operator[space]operand):");
  404. Scanner input1=new Scanner(System.in);
  405. String expression1=input1.nextLine();
  406. float k =c.evaluate1(expression1,m); //返回结果
  407. if (k!=Float.MIN_VALUE){
  408. System.out.println("运算结果为"+k);
  409. }
  410. break;}
  411. }
  412. break;}
  413. case "c":{c.clearMemory();break;} //清空
  414. case "mr":{c.getMemoryValue();break;}
  415. case "h":{
  416. System.out.println("选择你想要查找的id:");
  417. int id=next.nextInt(); //输入想要查找的id
  418. c.getHistoryValue(id);break;}
  419. case "over":{return;}
  420. default:{System.out.println("Invaild input.");}
  421. }
  422. }}}

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/275831
推荐阅读
相关标签
  

闽ICP备14008679号