posts - 14, comments - 22, trackbacks - 0, articles - 4
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          用Applet實現表達式求值

          Posted on 2006-08-09 14:19 誰伴我闖蕩 閱讀(590) 評論(1)  編輯  收藏

          少了瀏覽器的支持,Applet在互聯網上永遠不會有自己的舞臺,而我卻很酷愛這種把應用程序放到界面里的東東,今天無聊,把以前寫過的一個表達式求值的程序,順手拿Applet改寫一下,再讓大家體驗一下MVC設計模式的應用吧:


          =======================ExpressionModel===================

          /*
          ?*這個就是表達式的模型組件了,它的三個屬性,分別代表了它的中則表達式和右則表達式
          ?*而那兩個屬性分別是輸入的式子和得到的結果
          ?*/
          package expression;

          import java.text.*;
          import java.util.*;

          public class ExpressionModel extends Observable
          {
          ?
          ?private ArrayList<String> middle;
          ?private ArrayList<String> right;
          ?private String input, result;

          ?public ExpressionModel()
          ?{
          ??middle = new ArrayList<String>();
          ??right = new ArrayList<String>();
          ?}

          ?//判斷一個字符是不是操作符
          ?private boolean isOperator( String op )
          ?{
          ??if( op.equals("+") || op.equals("-") || op.equals("%")
          ???? ||op.equals("*")|| op.equals("/") || op.equals("(")
          ???? ||op.equals(")") )
          ??? return true;
          ???
          ??else return false;
          ?}

          ?//得到一個操作符的優先級
          ?private int priority( String op )
          ?{
          ??if( op.equals("+") || op.equals("-") || op.equals("(") )
          ???return 1;
          ??else if( op.equals("*") || op.equals("/") || op.equals("%") )
          ???return 2;
          ??else
          ???return 0;
          ?}
          ?

          //計算兩個數和一個運算符得到的結果
          ?private String calTwoNumber( String op, String a, String b ) throws Exception
          ?{
          ??double x = Double.parseDouble( b );
          ??double y = Double.parseDouble( a );
          ??double z = 0;
          ??
          ??if( op.equals("+") )
          ???z = x + y;
          ??else if( op.equals("-") )
          ???z = x - y;
          ??else if( op.equals("*") )
          ???z = x * y;
          ??else if( op.equals("/") )
          ???z = x / y;
          ??else if( op.equals("%") )
          ???z = x % y;
          ??else
          ???z=0;
          ??
          ??return Double.toString( z );
          ?}
          ?
          //將我們輸入的中則表達式轉換成逆波蘭式
          ?private void turnToRight()
          ?{
          ??MyStack stack = new MyStack();
          ??String op;
          ??int pos = 0;
          ??
          ??StringTokenizer st = new StringTokenizer(input,"+-*/%()",true);
          ??
          ??while( st.hasMoreElements() )
          ???middle.add( st.nextToken() );
          ??
          ??while(true)
          ??{
          ???if( isOperator( middle.get(pos) ) )
          ???{
          ????if( stack.getTop() == -1 || (middle.get(pos)).equals("(") )
          ????{
          ?????stack.push( middle.get(pos) );
          ????}
          ????else
          ????{
          ?????if( (middle.get(pos)).equals(")") )
          ?????{
          ??????if( !(stack.top()).equals("(") )
          ??????{
          ???????op = stack.pop();
          ???????right.add(op);
          ??????}
          ?????}
          ?????else
          ?????{
          ??????if( priority(middle.get(pos)) <= priority(stack.top()) && stack.getTop() != -1 )
          ??????{
          ???????op = stack.pop();
          ???????if( !op.equals("(") )
          ????????right.add(op);
          ??????}
          ??????stack.push( middle.get(pos) );
          ?????}
          ????}
          ???}
          ???else
          ????right.add( middle.get(pos) );
          ???pos++;
          ???if( pos >= middle.size() )
          ????break;
          ??}
          ??
          ??while( stack.getTop() != -1 )
          ??{
          ???op = stack.pop();
          ???right.add(op);
          ??}
          ?}

          ?private void calculate( String expression ) throws Exception
          ?{
          ??input = expression;
          ??
          ??turnToRight();
          ??
          ??MyStack stack = new MyStack();
          ??String op1, op2, is = null;
          ??Iterator<String> it = right.iterator();
          ??
          ??while(it.hasNext())
          ??{
          ???is = it.next();
          ???if( isOperator(is) )
          ???{
          ????op1 = stack.pop();
          ????op2 = stack.pop();
          ????stack.push( calTwoNumber(is,op1,op2) );
          ???}
          ???else stack.push(is);
          ??}
          ??
          ??NumberFormat form = NumberFormat.getInstance();
          ??form.setMaximumFractionDigits(5);
          ??
          ??result = input + "=" + form.format( Double.parseDouble( stack.pop() ) );
          ??
          ??setChanged();
          ??notifyObservers();
          ?}
          ?
          ?public void input(String expression) throws Exception
          ?{
          ??calculate(expression);
          ??middle.clear();
          ??right.clear();
          ?}
          ?
          ?public String getResult(){
          ??return result;
          ?}
          ?
          }



          ===============MyStack==============


          //我們用到的自己的堆棧
          package expression;

          import java.util.*;

          public class MyStack
          {
          ?
          ?private LinkedList<String> list;
          ?private int top;
          ?
          ?public MyStack()
          ?{
          ??list = new LinkedList<String>();
          ??top = -1;
          ?}
          ??
          ?public void push(String value)
          ?{
          ??top++;
          ??list.addFirst(value);
          ?}
          ?
          ?public String pop()
          ?{
          ??String temp = list.getFirst();
          ??top--;
          ??list.removeFirst();
          ??return temp;
          ?}
          ?
          ?public String top()
          ?{
          ??return list.getFirst();
          ?}
          ?
          ?public int getTop()
          ?{
          ??return top;
          ?}
          ?
          }

          ===============ExpressionController========------

          //控制器組件,包括一個輸入域和兩個按紐

          package expression;

          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;

          public class ExpressionController extends JPanel
          {
          ?
          ?private ExpressionModel expressionModel;??
          ?private JTextField calTextField;
          ?
          ?public ExpressionController( ExpressionModel controllerModel ) {
          ??
          ??super();
          ??
          ??expressionModel = controllerModel;
          ??
          ??calTextField = new JTextField( 15 );
          ??JButton calButton = new JButton( "計算" );
          ??JButton delButton = new JButton( "取消" );
          ??
          ??calButton.addActionListener(
          ???new ActionListener()
          ???{
          ????public void actionPerformed( ActionEvent event )
          ????{
          ?????try
          ?????{
          ??????expressionModel.input( calTextField.getText() );
          ??????calTextField.setText("");
          ?????}
          ?????catch ( Exception exception )
          ?????{
          ??????JOptionPane.showMessageDialog (
          ???????ExpressionController.this,
          ???????"請輸入有效表達式!", "錯誤",
          ???????JOptionPane.ERROR_MESSAGE );
          ??????calTextField.setText("");
          ?????}
          ????}
          ???}
          ??);
          ??
          ??delButton.addActionListener(
          ???new ActionListener()
          ???{
          ????public void actionPerformed( ActionEvent event )
          ????{
          ?????try
          ?????{
          ??????calTextField.setText("");
          ?????}
          ?????catch ( Exception exception )
          ?????{
          ??????calTextField.setText("");
          ?????}
          ????}
          ???}
          ??);
          ??
          ??setLayout( new FlowLayout() );
          ??
          ??add( calTextField );
          ??add( calButton );
          ??add( delButton );
          ?
          ?}
          ?
          ?public Dimension getPreferredSize()
          ?{
          ??return new Dimension( 320, 40 );
          ?}
          ?
          ?public Dimension getMinimumSize()
          ?{
          ??return getPreferredSize();
          ?}
          ?
          ?public Dimension getMaximumSize()
          ?{
          ??return getPreferredSize();
          ?}
          ?
          }



          ================ExpressionView ==================
          //用來顯示結果的視圖
          package expression;

          import java.awt.*;
          import java.text.*;
          import java.util.*;

          import javax.swing.*;
          import javax.swing.border.*;

          public class ExpressionView extends JPanel implements Observer
          {
          ?
          ?private ExpressionModel expressionModel;
          ?private JLabel display = new JLabel();
          ?
          ?public ExpressionView( ExpressionModel model ) {
          ??
          ??if( model == null )
          ???throw new NullPointerException();
          ??
          ??expressionModel = model;
          ??expressionModel.addObserver( this );
          ??
          ??add( display );
          ??
          ??setBackground( Color.white );
          ??setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );
          ??
          ?}
          ?
          ?public void update( Observable observable, Object object )
          ?{
          ??display.setText( expressionModel.getResult() );
          ?}
          ?
          ?public Dimension getPreferredSize()
          ?{
          ??return new Dimension( 320, 60 );
          ?}
          ?
          ?public Dimension getMinimumSize()
          ?{
          ??return getPreferredSize();
          ?}
          ?
          ?public Dimension getMaximumSize()
          ?{
          ??return getPreferredSize();
          ?}
          ?
          ?
          }



          ===================Expression=====================

          //最后把這些組裝到這里吧

          package expression;

          import java.awt.*;
          import java.awt.event.*;

          import javax.swing.*;
          import javax.swing.border.*;

          public class Expression extends JApplet
          {
          ??
          ?public void init()
          ?{
          ??ExpressionModel model = new ExpressionModel();
          ??ExpressionView view = new ExpressionView( model );
          ??ExpressionController controller = new ExpressionController( model );
          ??
          ??Container contentPane = getContentPane();
          ??contentPane.add( view, BorderLayout.CENTER );
          ??contentPane.add( controller, BorderLayout.SOUTH );
          ??
          ??setSize( 320, 100 );
          ??
          ?}
          ??
          }

          把這幾個類打包到一個jar文件后,再創建個htm文件來訪問它

          <object
          ??? classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
          ??? codebase = "??? WIDTH = 320 HEIGHT = 100 >
          ??? <PARAM NAME = CODE VALUE = "expression.Expression" >
          ??? <PARAM NAME = ARCHIVE VALUE = "expression.jar" >
          ??? <param name = "type" value = "application/x-java-applet;version=1.5">
          ??? <param name = "scriptable" value = "false">
          </object>

          這樣就行了,不過你的機器需要安裝jre 5


          評論

          # re: 用Applet實現表達式求值  回復  更多評論   

          2006-08-12 20:20 by java技術
          不錯 繼續努力

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          有事在這里給我留言噢!
          主站蜘蛛池模板: 八宿县| 兰坪| 蒲江县| 渝北区| 营山县| 五原县| 金沙县| 故城县| 左云县| 慈溪市| 阿尔山市| 大足县| 罗定市| 莫力| 察哈| 绥宁县| 光山县| 丰台区| 乡城县| 乌拉特后旗| 镇平县| 明星| 普定县| 新竹市| 宜都市| 施甸县| 松桃| 辽阳县| 永顺县| 桑植县| 宾川县| 两当县| 太仓市| 合江县| 大田县| 嘉鱼县| 鹰潭市| 两当县| 洛扎县| 长汀县| 大安市|