以前寫的一個計算器,稍微改進了一下

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 ;
 }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章