JAVA——简单科学计算器设计

  1 package Calculator_JCoder;
  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.awt.event.KeyEvent;
  7 import java.awt.event.KeyListener;
  8 import java.text.DecimalFormat; 
  9 import javax.swing.*;
 10 import java.util.*;
 11 import java.math.*;
 12 
 13 public class Calculator extends JFrame implements ActionListener {
 14     static Font F = new Font("宋体",Font.BOLD,25);
 15     static Font _F = new Font("宋体",Font.BOLD,40);
 16     static DecimalFormat DF = new DecimalFormat("0.000");
 17     static String IN = "";
 18     static JTextField Text_Res = new JTextField("0");
 19     static JTextField Text_Now = new JTextField("");
 20     static JButton Keys[] = new JButton[21];
 21     static String KeysName[] = {
 22             "7", "8", "9", "4", "5", "6", "1", "2",
 23             "3", "0", ".", "+", "-", "*", "/", "=", 
 24             "CE", "(", ")", "^", "C"
 25     };
 26     
 27     static int CMP(char a){
 28         if(a == '#'){return 0;}
 29         if(a == '('){return 1;}
 30         if(a == '+' || a == '-'){return 3;}
 31         if(a == '*' || a == '/'){return 4;}
 32         if(a == '^'){return 5;}
 33         if(a == ')'){return 6;}
 34         return -1;
 35     }
 36     
 37     static String Change(String in){
 38         in += "#";
 39         int L = in.length();
 40         String t = "";
 41         String NPR = "";
 42         Stack<Character> S = new Stack();
 43         for(int i = 0;i < L;i ++){
 44             if(in.charAt(i) >= '0' && in.charAt(i) <= '9'){t += in.charAt(i);}
 45             else if(in.charAt(i) == '.'){t += in.charAt(i);}
 46             else if(in.charAt(i) == '#'){
 47                 if(t.length() != 0){NPR += t + " ";}
 48                 t = "";
 49             }
 50             else if(in.charAt(i) == '+' || in.charAt(i) == '-' || in.charAt(i) == '*' || in.charAt(i) == '/' || in.charAt(i) == '^'){
 51                 if(t.length() != 0){NPR += t + " ";}
 52                 t = "";
 53                 if(S.size() == 0){
 54                     S.push(in.charAt(i));
 55                 }
 56                 else if(CMP(S.peek()) < CMP(in.charAt(i))){
 57                     S.push(in.charAt(i));
 58                 }
 59                 else if(CMP(S.peek()) >= CMP(in.charAt(i))){
 60                     while(S.size() > 0 && CMP(S.peek()) >= CMP(in.charAt(i))) {
 61                         NPR += S.peek() + " ";
 62                         S.pop();
 63                     }
 64                     S.push(in.charAt(i));
 65                 }
 66             }
 67             else if(in.charAt(i) == '('){
 68                 if(t.length() != 0){NPR += t + " ";}
 69                 t = "";
 70                 S.push(in.charAt(i));
 71             }
 72             else if(in.charAt(i) == ')'){
 73                 if(t.length() != 0){NPR += t + " ";}
 74                 t = "";
 75                 while(S.peek() != '('){
 76                     NPR += S.peek() + " ";
 77                     S.pop();
 78                 }
 79                 S.pop();
 80             }
 81         }
 82         while(S.size() != 0){
 83             NPR += S.peek() + " ";
 84             S.pop();
 85         }
 86         //System.out.println(NPR);
 87         return NPR;
 88     }
 89     
 90     static double Solve(double a,double b,char c){
 91         double out = 0.0;
 92         if(c == '+'){
 93             out = a + b;
 94         }
 95         else if(c == '-'){
 96             out = a - b;
 97         }
 98         else if(c == '*'){
 99             out = a * b;
100         }
101         else if(c == '/'){
102             out = a / b;
103         }
104         else if(c == '^'){
105             out = Math.pow(a,b);
106         }
107         return out;
108     }
109     
110     static double Cal(String now){
111         String Sp[] = now.split("\ ");
112         Stack<Double> S = new Stack();
113         for(int i = 0;i < Sp.length;i ++){
114             if(Sp[i].length() == 0){continue;}
115             if(Sp[i].charAt(0) <= '9' && Sp[i].charAt(0) >= '0'){
116                 S.push(Double.valueOf(Sp[i]));
117             }
118             else{
119                 double b = S.peek();S.pop();
120                 double a = S.peek();S.pop();
121                 double c = Solve(a,b,Sp[i].charAt(0));
122                 S.push(c);
123             }
124         }
125         double ans = S.peek();
126         return ans;
127     }
128     
129     static String SetS(int x){
130         if(x == 1){return "+";}
131         if(x == 2){return "-";}
132         if(x == 3){return "*";}
133         if(x == 4){return "/";}
134         return "0";
135     }
136 
137     
138     public void init() {
139         JPanel KeysP = new JPanel();
140         KeysP.setLayout(null);
141         KeysP.setSize(500,500);
142         for(int i = 0;i <= 20;i ++){
143             Keys[i] = new JButton(KeysName[i]);
144             KeysP.add(Keys[i]);
145             Keys[i].setFont(F);
146         }
147         Keys[0].setBounds(20,20,60,60);
148         Keys[1].setBounds(85,20,60,60);
149         Keys[2].setBounds(150,20,60,60);
150         Keys[3].setBounds(20,85,60,60);
151         Keys[4].setBounds(85,85,60,60);
152         Keys[5].setBounds(150,85,60,60);
153         Keys[6].setBounds(20,150,60,60);
154         Keys[7].setBounds(85,150,60,60);
155         Keys[8].setBounds(150,150,60,60);
156         Keys[9].setBounds(20,215,125,60);
157         Keys[10].setBounds(150,215,60,60);
158         Keys[11].setBounds(215,20,60,60);
159         Keys[12].setBounds(280,20,60,60);
160         Keys[13].setBounds(215,85,60,60);
161         Keys[14].setBounds(280,85,60,60);
162         Keys[15].setBounds(215,150,125,60);
163         Keys[16].setBounds(215,215,125,60);
164         Keys[17].setBounds(345,20,60,60);
165         Keys[18].setBounds(345,85,60,60);
166         Keys[19].setBounds(345,150,60,60);
167         Keys[20].setBounds(345,215,60,60);    
168         
169         Text_Res.setHorizontalAlignment(JTextField.RIGHT);
170         Text_Now.setHorizontalAlignment(JTextField.RIGHT);
171         Text_Res.setEditable(false);
172         Text_Now.setEditable(false);
173         Text_Res.setBackground(Color.WHITE);
174         Text_Now.setBackground(Color.WHITE);
175         JPanel TextP = new JPanel();
176         TextP.setLayout(null);
177         TextP.setSize(500,100);
178         TextP.add(Text_Res);
179         Text_Res.setBounds(20, 60, 385, 60);
180         TextP.add(Text_Now);
181         Text_Now.setBounds(20, 20, 385, 40);
182         Text_Res.setFont(_F);
183         Text_Now.setFont(F);
184         
185         JPanel BigP = new JPanel();
186         BigP.setSize(800,600);
187         BigP.setLayout(null);
188         BigP.add(KeysP);
189         BigP.add(TextP);
190         KeysP.setBounds(0, 120, 600, 600);
191         TextP.setBounds(0, 0, 500, 200);
192         getContentPane().setLayout(null);
193         getContentPane().add(BigP);
194         
195         for (int i = 0; i <= 20; i ++) {
196             Keys[i].addActionListener(this);
197         }
198         
199     }
200     
201     public void actionPerformed(ActionEvent e) {
202         String Get = e.getActionCommand();
203         if("0123456789.+-*/^()".indexOf(Get) >= 0){
204             IN = IN + Get;
205             Text_Now.setText(IN);
206         }
207         else if("=".indexOf(Get) >= 0){
208             double show = Cal(Change(IN));
209             //System.out.println(show);
210             //System.out.println(show);
211             String t1 = String.valueOf(show);
212             String t2 = String.valueOf(DF.format(show));
213             Text_Res.setText(t1);
214             IN = t2;
215         }
216         else if("CE".compareTo(Get) == 0){
217             int L = IN.length();
218             if(L != 0){IN = IN.substring(0,L - 1);}
219             Text_Now.setText(IN);
220         }
221         else if("C".compareTo(Get) == 0){
222             IN = "";
223             Text_Now.setText(IN);
224             Text_Res.setText("0");
225         }
226     }
227     
228     public Calculator(){
229         super();
230         init();
231         this.setTitle("Calculator By-J_Coder");
232         this.setResizable(false);
233         this.setLocation(100,100);
234         this.setSize(440,450);
235     }
236 
237     public static void main(String[] args) {
238         Calculator window = new Calculator();
239         window.setVisible(true);
240         window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
241     }
242 }
原文地址:https://www.cnblogs.com/love-fromAtoZ/p/9704113.html