計算器小程序的改進

軟件綜合實踐的第一次理解做業java

方法1,2參考連接  https://blog.csdn.net/Frank_Jay/article/details/52900089編程

方法3參考連接    https://blog.csdn.net/q982151756/article/details/80647663小程序

//簡易計算器小程序設計模式

閱讀過程:數組

1.  網上看到一個簡單的小程序,是關於輸入數字和加減乘除符號,能夠運算結果的安全

(閱讀後理解搜索的在代碼後註釋着)app

 1 //方法1:
 2 
 3 package jsj;
 4 
 5 import java.util.Scanner;
 6 
 7 /*
 8 
 9  * 《大話設計模式》中的計算器實現代碼
10  * https://blog.csdn.net/Frank_Jay/article/details/52900089
11 
12  * */
13 
14 public class Operation {     //Operation 類
15 
16     public static double GetResult(double numA, double numB, String opr) {//3個參數
17 
18         double result = 0d;//數值後面的d,表示是double類型數,好比 double b = 3.2d 
19 
20         switch (opr) {   //opr表示符號的選擇
21 
22             case "+":
23 
24                 result = numA + numB;
25 
26                 break;  
27 
28             case "-":
29 
30                 result = numA - numB;
31 
32                 break;
33 
34             case "*":
35 
36                 result = numA * numB;
37 
38                 break;
39 
40             case "/":
41 
42                 result = numA / numB;
43 
44                 break;
45 
46         }
47 
48         return result;
49 
50     }
51 
52  
53 
54     public static void main(String[] args) {
55 
56         System.out.println("請輸入數字A:");   //友好交互提示
57 
58         Scanner scan = new Scanner(System.in);
59         // 從鍵盤接收數據
60 
61         String strNumA = scan.nextLine(); // next方式接收字符串
62         //nextLine()方法返回的是Enter鍵以前沒有被讀取的全部字符,它是能夠獲得帶空格的字符串的
63         //next()方法在讀取內容時,會過濾掉有效字符前面的無效字符,
64         //對輸入有效字符以前遇到的空格鍵、Tab鍵或Enter鍵等結束符,next()方法會自動將其過濾掉
65         // 判斷是否還有輸入
66         System.out.println("請輸入運算符號(+、-、*、/):");
67 
68         String strOpr = scan.nextLine();
69 
70         System.out.println("請輸入數字B");
71 
72         String strNumB = scan.nextLine();
73 
74         String strResult = "";
75 
76         double Result = GetResult(Double.parseDouble(strNumA), Double.parseDouble(strNumB), strOpr);
77         //數字類型的String字符串轉換爲浮點數一般採用parseDouble()和valueOf()方法
78         /*
79          Double.parseDouble(java.lang.String)的參數只能是String,
80                       若是參數改成double類型提示「The method parseDouble(String) in the type Double is not applicable for the arguments (double)」錯誤。
81          Double.valueOf()的參數類型能夠是浮點型或者是字符串都可。
82         */
83 
84         strResult = String.valueOf(Result);
85 
86         System.out.println("結果爲"+strResult);
87 
88     }
89 
90  
91 
92 }

運行結果:ide

請輸入數字A:函數

11工具

請輸入運算符號(+、-、*、/):

*

請輸入數字B

8

結果爲88.0

2.閱讀過程2:以爲這樣的輸入太麻煩了,能不能直接輸入出結果呢?改進一下,不是單獨輸入,而是一塊兒輸入,直接出結果。

  1 //方法2
  2 
  3 package jsj;
  4 
  5 
  6 import java.util.Scanner;
  7 //java.util.Scanner 是 Java5 的新特徵,咱們能夠經過 Scanner 類來獲取用戶的輸入
  8 
  9 public class Calculator {
 10 
 11      public static void main(String[] args) {
 12 
 13          System.out.println("-----------------------------------");
 14 
 15          System.out.println("請輸入一個算術表達式,如:45*23");
 16 
 17          Scanner in = new Scanner(System.in);// 從鍵盤接收數據
 18       
 19          String str = in.nextLine();// nextline方式接收字符串
 20 
 21          StringBuffer buffer = new StringBuffer();
 22          /*當對字符串進行修改的時候,須要使用 StringBuffer 和 StringBuilder 類。 
 23                              和 String 類不一樣的是,StringBuffer 和 StringBuilder 類的對象可以被屢次的修改,而且不產生新的未使用對象。 
 24            StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不一樣在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。 
 25                               因爲 StringBuilder 相較於 StringBuffer 有速度優點,因此多數狀況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的狀況下,則必須使用 StringBuffer 類。 */
 26 
 27          StringBuffer buffer1 = new StringBuffer();
 28 
 29          char t = ' ';//默認初始化符號位,即「+-*/」
 30 
 31          for (int i = 0; i < str.length(); i++) {
 32 
 33              if (str.charAt(i) == '+' || str.charAt(i) == '-'
 34 
 35                      || str.charAt(i) == '*' || str.charAt(i) == '/') {
 36 
 37                  t = str.charAt(i);//把符號位賦值給t
 38                 //charAt()功能相似於數組,能夠把字符串看做是char類型的數組,它是把字符串拆分獲取其中的某個字符;返回指定位置的字符。 
 39                 // charAt(i),i爲int類型,i從0開始。 
 40  
 41 
 42                  for (int j = i + 1; j < str.length(); j++) {
 43 
 44                      buffer1.append(str.charAt(j));
 45               //append() 方法在被選元素的結尾(仍然在內部)插入指定內容。
 46              /*Stringbuffer 有append()方法 
 47                Stringbuffer實際上是動態字符串數組 
 48              /*Stringbuffer 有append()方法 
 49                append()是往動態字符串數組添加,跟「xxxx」+「yyyy」至關那個‘+’號 
 50              /*Stringbuffer 有append()方法 
 51                                         跟String不一樣的是Stringbuffer是放一塊兒的 
 52                String1+String2 和Stringbuffer1.append("yyyy")雖然打印效果同樣,但在內存中表示卻不同 
 53                String1+String2 存在於不一樣的兩個地址內存 
 54                Stringbuffer1.append(Stringbuffer2)放在一塊兒 */
 55                      
 56                  }
 57 
 58                  break;
 59 
 60              } else {
 61 
 62                  buffer.append(str.charAt(i));
 63 
 64              }
 65 
 66          }
 67 
 68          String c = buffer.toString();//將buffer對象轉換成指定的字符編碼的字符串。
 69          /*好比:
 70           StringBuffer sb = new StringBuffer("abcd") ;
 71            sb.append("efg") ;
 72            String str = sb.toString() ;
 73            System.out.println(str) ; // out : "abcdefg" 
 74 
 75                  使用StringBuffer的toString()方法,能夠將StringBuffer轉換成String */
 76 
 77          String d = buffer1.toString();
 78 
 79          double a = Double.parseDouble(c);
 80 
 81          double b = Double.parseDouble(d);
 82         /* 
 83            Double.parseDouble方法是把數字類型的字符串,轉換成double類型
 84            Double.valueOf方法是把數字類型的字符串,轉換成Double類型
 85                               好比:字符 0.94
 86                              採用 valueOf  獲得的結果是 0.9400000000000001
 87                              而採用 parseDouble 獲得的結果是 0.94*/
 88 
 89          double sum = 0;
 90 
 91          if (t == '+') {
 92 
 93              sum = a + b;
 94 
 95          }
 96 
 97          if (t == '-') {
 98 
 99              sum = a - b;
100 
101          }
102 
103          if (t == '*') {
104 
105              sum = a * b;
106 
107          }
108 
109          if (t == '/') {
110 
111              sum = a / b;
112 
113          }
114 
115          System.out.println("程序運算...");
116 
117          System.out.println(c+t+d+"="+sum);
118 
119          System.out.print("-----------------------------------");
120 
121      }
122 
123 }

運行結果:

-----------------------------------

請輸入一個算術表達式,如:45*23

11*8

程序運算...

11*8=88.0

-----------------------------------

 

心得:

方法二是方法1的改進,更加符合人的邏輯思惟,相比於方法1更加快捷方便。

理解用戶需求:一個快捷的運算輸入(方法二),而不是一個個的拆分輸入(方法1),那麼想要更好地擴展使用,能夠用有界面結構的計算機小程序。

 

3.閱讀過程3:

仍是太麻煩了,能不能呈界面化,更加簡單些,不要是數據化,這樣會更加清晰!

  1 //方法3:
  2 
  3 package jsj;
  4 
  5 import javax.swing.*;
  6 import java.awt.*;
  7 import java.awt.event.ActionEvent;
  8 import java.awt.event.ActionListener;
  9 import java.util.Stack;
 10 
 11 class MyException extends Exception{
 12     public MyException() {
 13         super();
 14     }
 15     public MyException(String message) {
 16         super(message);
 17     }
 18 }
 19 
 20 public class MyCalculator extends JFrame{
 21     /*
 22      * 
 23      */
 24 
 25     private JTextField textField;               //輸入文本框
 26     private String input;                       //結果
 27     private String operator;                    //操做符
 28 
 29     public MyCalculator() {
 30         input = "";
 31         operator = "";
 32 
 33         JPanel panel = new JPanel();
 34         textField = new JTextField(30);
 35         textField.setEditable(false);                       //文本框禁止編輯
 36         textField.setHorizontalAlignment(JTextField.LEFT);
 37         //textField.setBounds(100, 100, 20, 20);            //在容器佈局爲空狀況下生效
 38         textField.setPreferredSize(new Dimension(200,30));//設置該組件的初始大小
 39 
 40         //將textField加入本JFrame中,佈局爲邊界佈局,位置爲north
 41         this.add(textField, BorderLayout.NORTH);
 42 
 43         String[] name= {"7","8","9","+","4","5","6","-","1","2","3","*","0","C","=","/"};
 44 
 45         //將這個panel的佈局設置爲網格佈局,有四行四列,行間距和列間距爲1
 46         panel.setLayout(new GridLayout(4,4,1,1));
 47 
 48         for(int i=0;i<name.length;i++) {
 49 
 50             JButton button = new JButton(name[i]);
 51 
 52             //設置按鈕的時間監聽
 53             button.addActionListener(new MyActionListener());
 54             //將按鈕加入到panel中
 55             panel.add(button);
 56         }
 57         //將panel加入到本JFrame中,佈局爲邊界佈局,位置爲centre
 58         this.add(panel,BorderLayout.CENTER);
 59     }
 60 
 61     class MyActionListener implements ActionListener{       //內部類實現按鈕響應
 62 
 63         @Override
 64         public void actionPerformed(ActionEvent e) {
 65             int cnt=0;
 66             String actionCommand = e.getActionCommand();     //獲取按鈕上的字符串
 67             if(actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*")
 68                 || actionCommand.equals("/")) {
 69                 input += " " + actionCommand + " ";
 70             }
 71             else if(actionCommand.equals("C")) {                    //清除輸入
 72                 input = "";
 73             }
 74             else if(actionCommand.equals("=")) {                    //按下等號
 75                 try {
 76                     input+= "="+calculate(input);
 77                 } catch (MyException e1) {
 78                     if(e1.getMessage().equals("被除數不能爲0"))
 79                         input = e1.getMessage();
 80                     else
 81                         input = e1.getMessage();
 82                 }
 83                 textField.setText(input);
 84                 input="";
 85                 cnt = 1;
 86             }
 87             else
 88                 input += actionCommand;                         //按下數字
 89 
 90             //由於若是不按「=」按鈕cnt一直未0,因此能夠保證顯示輸入的數字和操做鍵
 91             if(cnt == 0)
 92                 textField.setText(input);
 93         }
 94     }
 95     //這裏須要藉助棧來完成表達式的計算,首先將字符串分割成字符串數組,
 96     //由中綴的定義知數組奇數位爲運算符(從第0位開始),偶數位爲操做數,
 97     // 所以可將偶數爲操做數進棧,碰見+(-)運算符,則將下一個數以正(負)的形式壓人棧中,
 98     // 碰見*或/運算符,則將棧頂元素出棧與數組後一元素進行計算,並將其結果從新壓入棧中,
 99     // 直至遍歷至數組最後一個元素。
100 
101     private String calculate(String input) throws MyException{       //計算函數
102         String[] comput = input.split(" ");
103         //System.out.println(input);
104         Stack<Double> stack = new Stack<>();
105         Double m = Double.parseDouble(comput[0]);
106         stack.push(m);                                      //第一個操做數入棧
107 
108         for(int i = 1; i < comput.length; i++) {
109             if(i%2==1) {
110                 if(comput[i].equals("+"))
111                     stack.push(Double.parseDouble(comput[i+1]));
112                 if(comput[i].equals("-"))
113                     stack.push(-Double.parseDouble(comput[i+1]));
114                 if(comput[i].equals("*")) {            //將前一個數出棧作乘法再入棧
115                     Double d = stack.peek();                //取棧頂元素
116                     stack.pop();
117                     stack.push(d*Double.parseDouble(comput[i+1]));
118                 }
119                 if(comput[i].equals("/")) {            //將前一個數出棧作乘法再入棧
120                     double help = Double.parseDouble(comput[i+1]);
121                     if(help == 0)
122                         throw new MyException("被除數不能爲0");
123  //不會繼續執行該函數
124                     double d = stack.peek();
125                     stack.pop();
126                     stack.push(d/help);
127                 }
128             }
129         }
130 
131         double d = 0d;
132 
133         while(!stack.isEmpty()) {           //求和
134             d += stack.peek();
135             stack.pop();
136         }
137 
138         String result = String.valueOf(d);
139         return result;
140     }
141 
142     public static void main(String[] args) {
143         JFrame f = new MyCalculator();
144         f.setTitle(f.getClass().getSimpleName());
145         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
146         f.setBounds(400, 200, 500, 300);
147         f.setVisible(true);
148     }
149 }

計算器頁面顯示:

總結:

//我大部分的學習,搜索都放在代碼註釋上了,從方法一到方法二是邏輯上的改進,不用斷開輸入,方法二到方法三是用戶界面的改進,從無界面到習慣的有界面的改進。

該界面(方法3)相比於方法1,2更加簡單明瞭,也就是電腦中自帶的計算器界面。

程序是爲了方便用戶使用的,Java引入圖形化界面編程。

瞭解了一下內容:

1.JFrame 是容器類

2.AWT 是抽象窗口組件工具包,是 Java 最先的用於編寫圖形節目應用程序的開發包。

3.Swing 是爲了解決 AWT 存在的問題而新開發的包,它以 AWT 爲基礎的。

複習和學習了Java的GUI圖形界面設計,以及監聽器,堆棧等等的綜合運用。

方法1,2參考連接  https://blog.csdn.net/Frank_Jay/article/details/52900089

方法3參考連接    https://blog.csdn.net/q982151756/article/details/80647663

相關文章
相關標籤/搜索