⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculatortest12.java

📁 java实现的计算器,提供给大家,希望能够有所帮助.也希望爱好JAVA的朋友一同探讨研究.
💻 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 + -