📄 calculatortest12.java
字号:
/*
* @(#)Calculator.java 1.0 04/03/02
*
* You can modify the template of this file in the
* directory ..\JCreator\Templates\Template_1\Project_Name.java
*
* You can also create your own project template by making a new
* folder in the directory ..\JCreator\Template\. Use the other
* templates as examples.
*
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.applet.Applet;
import javax.swing.*;
/*public class CalculatorTest1 extends Applet {
Label prompt,output;
Button submit;
TextField input;
Calculator m_Calculator;
String rString;
public void init(){
rString="";
m_Calculator=new Calculator();
prompt=new Label("Input an Expression: ");
input=new TextField(10);
submit=new Button("Show Result");
output=new Label(" ");
add(prompt);
add(input);
add(submit);
add(output);
}
public void paint(Graphics g){
g.drawString ("result "+rString,80,150);
}
public boolean action(Event e,Object o)
{
//if(e.target==submit){
rString=m_Calculator.run(input.getText());
//output.setText(rString);
rString=rString+" end";
repaint();
return true;
// }
}
}*/
public class CalculatorTest12 {
public static void main(String args[])
{
CalFrame m_frame=new CalFrame();
//Calculator m_calculator=new Calculator();
//m_calculator.run(asdf.getText());
m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m_frame.show();
}
}
class CalFrame extends JFrame{
public CalFrame(){
//get Dimension
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int screenHeight=screenSize.height;
int screenWidth=screenSize.width;
//center Frame Screen
setSize(screenWidth/2,screenHeight/2);
setLocation(screenWidth/4,screenHeight/4);
//set icon and title
//Image img=kit.getImage("icon.gif");
// setIconImage(img);
setTitle("Calculator");
//add the frame into content panel
CalPanel m_panel=new CalPanel();
Container contentPane=getContentPane();
contentPane.add(m_panel);
}
}
class CalPanel extends JPanel implements ActionListener{
JButton m_button;
JTextField m_input;
JLabel m_prompt;
String rString;//result string
Calculator m_calculator;
CalPanel(){
m_prompt=new JLabel("Enter an Expression: ");
m_button=new JButton("计算");
m_input=new JTextField(15);
//AddListener
m_button.addActionListener(this);
add(m_prompt);
add(m_input);
add(m_button);
//change look and feel
String plat1="javax.swing.plaf.metal.MetalLookAndFeel";
String plat2="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
String plat3="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
try{
UIManager.setLookAndFeel(plat2);
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e){
e.printStackTrace();
}
}
public void paintComponent(Graphics g){
g.drawString("Result: "+ rString+" end",20,200);
}
public void actionPerformed(ActionEvent event)
{
//handel event
m_calculator=new Calculator();
rString=m_calculator.run(m_input.getText());
}
}
class Calculator {
private double a,b;
private String ch="",op="#";
private char thera;
private int i=0;
public Calculator(){
opnd=new Stack();
optr=new Stack();
optr.push("#");
}
public String run(String oString){
char getch[]=new char[20];
char ch,op='#',theta;
double a,b;
int i=0,j=0;
String val="";
ArrayList source=new ArrayList();
oString=oString+"#";
source=divideString(oString);
//for(i=0;i<source.size();i++)
//JOptionPane.showMessageDialog(null,source.get(i).toString());
ch=source.get(0).toString().charAt(0);
Loop:
while(ch!='#'||op!='#')
{ //JOptionPane.showMessageDialog(null,"ch="+String.valueOf(ch)+" op="+String.valueOf(op));
if(isNumber(ch)){
opnd.push(source.get(i));
//JOptionPane.showMessageDialog(null,"ok");
i++;
ch=source.get(i).toString().charAt(0);
continue Loop;}
else if(lp(op)<rp(ch)){
optr.push(source.get(i));
//***change op
op=source.get(i).toString().charAt(0);
i++;
ch=source.get(i).toString().charAt(0);
continue Loop;
}
else if(lp(op)==rp(ch)){
optr.pop();
//***change op
op=optr.peek().toString().charAt(0);
i++;
ch=source.get(i).toString().charAt(0);
continue Loop;
}
else{//push(a+b)
theta=optr.pop().toString().charAt(0);
b=Double.parseDouble(opnd.pop().toString());
a=Double.parseDouble(opnd.pop().toString());
opnd.push(operate(theta,a,b));
}
op=optr.peek().toString().charAt(0);
}
return opnd.peek().toString();
//return "sss";
}
public void clear(){
opnd.removeAllElements();
optr.removeAllElements();
optr.push("#");
}
private int lp(char ch){
int opClass=0;
switch(ch){
case '+':
case '-': opClass=3;break;
case '*':
case '/': opClass=5;break;
case '(': opClass=1;break;
case ')': opClass=6;break;
case '#': opClass=0;break;
}
return opClass;
}
private int rp(char ch){
int opClass=0;
switch(ch){
case '+':
case '-': opClass=2;break;
case '*':
case '/': opClass=4;break;
case '(': opClass=6;break;
case ')': opClass=1;break;
case '#': opClass=0;break;
}
return opClass;
}
private boolean isNumber(char ch){
char[] s={'1','2','3','4','5','6','7','8','9','0','.'};
for(int i=0;i<s.length;i++)
if(ch==s[i]) return true;
return false;
}
private boolean isOptr(char ch){
char[] s={'+','-','*','/','(',')','#'};
for(int i=0;i<s.length;i++)
if(ch==s[i]) return true;
return false;
}
private String operate(char theta,double a, double b){
double val=0;
String s="operate return.";
switch(theta){
case '+': val=a+b; break;
case '-': val=a-b; break;
case '*': val=a*b; break;
case '/': val=a/b; break;
}
return Double.toString(val);
}
private ArrayList divideString(String oString)
{
char ch;
char[] getch=new char[30];
char[] setch=new char[30];
//olength is original String's max index
//rlength is result String's length
int i=0,j=0,olength,dlength=0;
ArrayList m_arrylst=new ArrayList();
String dString="";
olength=oString.indexOf('#');
oString.getChars(0,oString.length(),getch,0);
//filter the unlawed character and use a setch[] to save it
while(i<=olength){
if(!isNumber(getch[i])&&!isOptr(getch[i]))
i++;
else {
setch[dlength]=getch[i];
dlength++;
i++;
}
}
/* to show wecher the result String is right
for(i=0;i<dlength;i++)
{
JOptionPane.showMessageDialog(null,String.valueOf(setch[i]));
}*/
//change setch[] into a string
for(i=0;i<dlength;i++){
dString=dString+String.valueOf(setch[i]);
}
//divide the String.
//Note: the follow code use dString and setch[i]
for(i=0;i<dlength;i++){
if(isNumber(setch[i])){
continue;
}
else if(isOptr(setch[i])){
//the follow 4 lines code correct error
int k;
if(i==0)
k=i;
else
k=i-1;
//Express (2-6)*3 error correct
if(isNumber(setch[k]))
m_arrylst.add(dString.substring(j,i));
m_arrylst.add(String.valueOf(setch[i]));
}
j=i+1;
}
//JOptionPane.showMessageDialog(null,dString);
return m_arrylst;
}
private Stack opnd;
private Stack optr;
}
class IllegalExpression extends Exception
{
IllegalExpression(){
super("Illegal Expression.");
}
IllegalExpression(Calculator clt,int index){
this();
m_Calculator=clt;
m_index=index;
}
public String toString(){
String errDes="";
switch(m_index)
{
case 1: errDes="Operator expected."; break;
case 2: errDes="Missing left parenthesis."; break;
case 3: errDes="Missing right parenthesis."; break;
case 4: errDes="Invalid input."; break;
}
return errDes;
}
private Calculator m_Calculator;
private int m_index;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -