您的位置:首页 > 其它

以前写的一个计算器,稍微改进了一下

2006-09-24 13:06 302 查看
package test ;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Calculate extends JFrame implements ActionListener
{

private JButton button;
private JTextField text;
private JPanel p,p2;
String
s[]={"7","8","9","/","4","5","6","*","1","2",
"3","-","0",".","=","+","CE","1/x","BACK","+/-"};

double currentNumber = 0; //当前数字
int decimalDigits = -1 ; //小数位数,默认为-1,当按了.数 设为0
String currentText = "" ; //当前文本
CalculateStack stack ; //堆栈类

String currentOpr = "" ; //当前操作
boolean isequal = false ; //等于好标志
boolean issign = false ; //运算触发标志位

public Calculate()
{ super("LIXIAOHONG计算器");

addWindowListener(new FrameListener());

text=new JTextField("0",25);
text.setHorizontalAlignment(JTextField.RIGHT);
text.setEditable(false) ;
p=new JPanel();
p2=new JPanel();
stack = new CalculateStack(5) ;

for(int i=0;i<20;i++)
{
button=new JButton(s[i]);
button.addActionListener(this);
button.setBackground(Color.pink);//null
p.add(button);
}

p.setLayout(new GridLayout(5,4));
p2.add(text,BorderLayout.NORTH);
p2.add(p,BorderLayout.CENTER);

getContentPane().add(p2);
pack();

setResizable(false);
setSize(290,210);
setVisible(true);

try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

public void actionPerformed(ActionEvent ae)
{

for(int i=0;i<20;i++)

{

if(ae.getActionCommand().equals(s[i]))
{
switch(i)
{
case 0:case 1:case 2: // text 7,8,9
if(issign){
// stack.push(currentNumber) ;
currentNumber = 0 ;
decimalDigits = -1 ;
issign = false ;
}

if(currentNumber == 0&&decimalDigits==-1)
currentNumber = i+7;
else if(currentNumber != 0&&decimalDigits==-1)
currentNumber = currentNumber*10 + (i+7) ;
else if(decimalDigits != -1){
decimalDigits++ ;
currentNumber = currentNumber + (1/Math.pow(10, decimalDigits))*(i+7) ;

}

currentText = currentNumber+"" ;
enterText(currentText,text,false);
stack.display() ;
break;

case 4: case 5:case 6: // text 456
if(issign){
// stack.push(currentNumber) ;
currentNumber = 0 ;
decimalDigits = -1 ;
issign = false ;
}

if(currentNumber == 0&&decimalDigits==-1)
currentNumber = i;
else if(currentNumber != 0&&decimalDigits==-1)
currentNumber = currentNumber*10 + (i) ;
else if(decimalDigits != -1){
decimalDigits++ ;
currentNumber = currentNumber + (1/Math.pow(10, decimalDigits))*(i) ;

}

currentText = currentNumber+"" ;
enterText(currentText,text,false);
stack.display() ;
break;

case 8:case 9: case 10: // text 123
if(issign){
//stack.push(currentNumber) ;
currentNumber = 0 ;
decimalDigits = -1;
issign = false ;
}

if(currentNumber == 0&&decimalDigits==-1)
currentNumber = i-7;
else if(currentNumber != 0&&decimalDigits==-1)
currentNumber = currentNumber*10 + (i-7) ;
else if(decimalDigits!=-1){
decimalDigits++ ;
currentNumber = currentNumber + (1/Math.pow(10, decimalDigits))*(i-7) ;
}

currentText = currentNumber+"" ;
enterText(currentText,text,false);
stack.display() ;
break;

case 12: // text 0
if(issign){
//stack.push(currentNumber) ;
currentNumber = 0 ;
decimalDigits = -1;
issign = false ;
}

if(currentNumber == 0&&decimalDigits==-1){
currentNumber = 0;
currentText = currentNumber+"" ;
enterText(currentText,text,false);
}
else if(currentNumber != 0&&decimalDigits==-1){
currentNumber = currentNumber*10 ;
currentText = currentNumber+"" ;
enterText(currentText,text,false);
}
else if(decimalDigits!=-1){
decimalDigits++ ;
currentText = currentText +"0" ;
enterText(currentText,text,true);
}

stack.display() ;
break;

case 13: //text .

if(decimalDigits == -1){
decimalDigits = 0 ;
System.out.println(currentText+"/..........1.");
currentText = (int)currentNumber+"." ;
enterText((int)currentNumber+".",text,true);
}
stack.display() ;
break ;

case 15:case 11:case 7:case 3://+and- ,*and
if(!currentText.equals("")){
stack.push(currentNumber) ;
currentOpr = s[i] ;
if((currentOpr.equals("+")||currentOpr.equals("-"))&&stack.length()>=3){
double p1 = Double.parseDouble( stack.pop().toString() );
String s1 = stack.pop().toString() ;
double p2 = Double.parseDouble( stack.pop().toString() );
double res = 0 ;
if(s1.equals("+")){
res = p1 + p2 ;
stack.push(res) ;
}else if(s1.equals("-")){
res = p2 - p1 ;
stack.push(res) ;
}else if(s1.equals("*")){
res = p2 * p1 ;
stack.push(res) ;
}else if(s1.equals("/")){
res = p2 / p1 ;
stack.push(res) ;
}
enterText(res+"",text,true);
}else if((currentOpr.equals("*")||currentOpr.equals("/"))&&stack.length()>=3){
double p1 = Double.parseDouble( stack.pop().toString() );
String s1 = stack.pop().toString() ;
double p2 = Double.parseDouble( stack.pop().toString() );
double res = 0 ;
if(s1.equals("*")){
res = p2 * p1 ;
stack.push(res) ;
if(isDot1())
enterText(res+"",text,true);
else enterText(res+"",text,false);
}else if(s1.equals("/")){
res = p2 / p1 ;
stack.push(res) ;
if(isDot1())
enterText(res+"",text,true);
else enterText(res+"",text,false);
}else if(s1.equals("+")||s1.equals("-")){
stack.push(p2) ;
stack.push(s1) ;
stack.push(p1) ;
}

}
if(currentOpr.equals("*")||currentOpr.equals("/")){
//stack.push(currentOpr) ;
}
currentText = "" ;
currentNumber = 0 ;
decimalDigits = -1 ;
stack.push(currentOpr) ;
}else if(isequal){
stack.push(currentNumber) ;
currentOpr = s[i] ;
currentText = "" ;
currentNumber = 0 ;
decimalDigits = -1 ;
isequal =false ;
stack.push(currentOpr) ;
}
stack.display() ;
break;

case 14: //,=
if(!currentText.equals("")){
stack.push(currentNumber) ;
currentNumber = 0 ;
decimalDigits = -1 ;
}
isequal = true ;
String ct = operator() ;
currentText = "";
currentNumber = Double.parseDouble(ct) ;
//stack.push(currentNumber) ;
enterText(ct,text,true);
stack.display() ;
break ;

case 16: // CE
currentText = "" ;
currentNumber = 0 ;
currentOpr = "" ;
decimalDigits = -1 ;
text.setText(""+0);
stack.pointer = 0 ;
break;

case 17: // 1/x
if(currentNumber!=0){
currentNumber = 1/currentNumber ;
if(isDot1())
enterText(currentNumber+"",text,true);
else enterText(currentNumber+"",text,false);
issign = true ;
}
break;

case 18: //退格键,,l=j为了能自己退格
if(decimalDigits==-1){
currentNumber = (int)currentNumber/10 ;
currentText = (int)currentNumber +"" ;
enterText(currentNumber+"",text,false);
}else{

if(decimalDigits==0){
currentNumber = (int)currentNumber/10 ;
currentText = (int)currentNumber +"" ;
enterText(currentNumber+"",text,false);
}else{
String subNumber = text.getText().substring(0,text.getText().length()-1) ;
currentText = subNumber ;
currentNumber = Double.parseDouble(subNumber) ;
enterText(currentNumber+"",text,true);
}
decimalDigits-- ;
}

break;

case 19: //取相反数,,l=j是为了能取自己的相反数
if(currentNumber!=0){
currentNumber = -currentNumber ;
if(isDot1())
enterText(currentNumber+"",text,true);
else enterText(currentNumber+"",text,false);
issign = true ;
}
break;
default:

}
}
}
}

public void enterText(String j1,JTextField text,boolean isDot)
{
if(isDot)
text.setText(j1);
else{
double j = Double.parseDouble(j1) ;
if(j==(int)j)
text.setText(""+(int)j);
else
text.setText(j1 );
}
}

public void enterText(double j,JTextField text)
{

if(j==(int)j)
text.setText(""+(int)j);
else
text.setText(j+"" );
}

public boolean isDot1(){
if(currentNumber==(int)currentNumber) return false ;
else
return true ;
}

public String operator(){
double result = 0 ;
int len = stack.length() ;
if(len==3){
double i1 = (Double)stack.pop();
String sign = stack.pop().toString() ;
double i2 = (Double)stack.pop() ;
if(sign.equals("*")){
result = i1 * i2 ;
}else if(sign.equals("/")){
result = i2 / i1 ;
} if(sign.equals("+")){
result = i1 + i2 ;
}else if(sign.equals("-")){
result = i2 - i1 ;
}
issign = true ;
//stack.push(result) ;
}else if(len == 5){
double i1 = (Double)stack.pop();
String sign1 = (String)stack.pop().toString() ; ;
double i2 = (Double)stack.pop() ;
String sign2 = (String)stack.pop().toString() ; ;
double i3 = (Double)stack.pop() ;
//System.out.println(sign1+ " "+sign2) ;
if(sign1.equals("*")){
result = i1 * i2 ;
}else if(sign1.equals("/")){
result = i2 / i1 ;
}else if(sign1.equals("+")){
result = i1 + i2 ;
}else if(sign1.equals("-")){
result = i2 - i1 ;
}

if(sign2.equals("+")){
result = i3 + result ;
}else if(sign1.equals("-")){
result = i3 - result ;
}
//stack.push(result) ;
issign = true ;
}else if(len==4){
String sign = (String)stack.pop().toString() ;

double i1 = (Double)stack.pop() ;
String sign1 = (String)stack.pop().toString() ;
double i2 = (Double)stack.pop() ;

if(sign1.equals("*")){
result = i1 * i2 ;
}else if(sign1.equals("/")){
result = i2 / i1 ;
}else if(sign1.equals("+")){
result = i1 + i2 ;
}else if(sign1.equals("-")){
result = i2 - i1 ;
}
//stack.push(result) ;
issign = true ;
}
stack.isOperator = false ;

return result+"" ;
}

public static void main(String args[])
{

//double aa = (1/Math.pow(10, 2))*7;
// System.out.println(aa);
new Calculate();
}
private void jbInit() throws Exception {
this.getContentPane().setBackground(SystemColor.controlText);
}

/**内部类:自定义继承WindowListener的侦听器FrameListener*/
class FrameListener extends WindowAdapter
{
/**处理点击窗体关闭按钮事件,实现程序的关闭停止*/
public void windowClosing(WindowEvent we)
{
exit();
}
}
public void exit()
{
String exitMessage = "Are you sure you want to exit?";
//if (JOptionPane.showConfirmDialog(this, exitMessage) == JOptionPane.YES_OPTION)
// {
System.exit(0);
//}
}
}

class CalculateStack extends Stack{
boolean isOperator ;

CalculateStack(int size) {
super(size);
isOperator = false ;
}

@Override
public boolean push(Object o){
try
{
container[pointer] = o ;
pointer++ ;
//System.out.println(o+" "+pointer);
if((o.toString()).equals("*")||(o.toString()).equals("/")||pointer==4){
isOperator = true ;
}
return true ;
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("Push error, stack overflow!"+e);
return false;
}
}

}

class Stack{
protected Object[] container ;
protected int pointer ;
protected int stacksize ;
Stack(int size){
container = new Object[size] ;
pointer = 0 ;
stacksize = size ;
}

public boolean push(Object o){
try
{
container[pointer] = o ;
pointer++ ;
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("Push error, stack overflow!"+e);
return false;
}
return true;
}

public Object pop(){
try
{
pointer-- ;
return container[pointer] ;
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("Pop error, stack empty!"+e);
return -1;
}

}

public boolean isempty()
{
return pointer == 0 ? true:false;
}

public void display()
{
int ptr = 0;

//System.out.println("The stack content are:");
for ( ptr = 0; ptr < pointer; ptr++)
{
System.out.print(container[ptr]+" " );
}
System.out.println("");
}

public int length(){
return pointer ;
}

public int size(){
return stacksize ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐