<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    用Applet實現表達式求值

    Posted on 2006-08-09 14:19 誰伴我闖蕩 閱讀(589) 評論(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技術
    不錯 繼續努力

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


    網站導航:
     
    有事在這里給我留言噢!
    主站蜘蛛池模板: 国产成人免费在线| 亚洲a在线视频视频| 91精品免费不卡在线观看| 欧洲乱码伦视频免费国产| 67194在线午夜亚洲| 亚洲网红精品大秀在线观看| 久久精品国产亚洲精品| 在线观看亚洲免费| 91精品免费国产高清在线| 国产成人久久AV免费| 亚洲阿v天堂在线2017免费| 蜜桃传媒一区二区亚洲AV| 亚洲噜噜噜噜噜影院在线播放| 亚洲av午夜成人片精品网站 | 日韩亚洲Av人人夜夜澡人人爽| 亚洲av中文无码| 日本免费一区二区三区最新| 7723日本高清完整版免费| 无码少妇精品一区二区免费动态| 美女巨胸喷奶水视频www免费| 国产亚洲精品第一综合| 亚洲国产区男人本色| 久久亚洲精品国产亚洲老地址| 亚洲天堂福利视频| 亚洲视频国产视频| 久久精品亚洲一区二区三区浴池| 亚洲乱亚洲乱妇无码麻豆| 久久久久久A亚洲欧洲AV冫| 久久亚洲中文字幕精品一区| 亚洲一区二区精品视频| 毛茸茸bbw亚洲人| 中文字幕精品亚洲无线码二区| 国产亚洲精品精品国产亚洲综合| 亚洲人成电影网站国产精品| 亚洲av无码成人精品区| 亚洲黄片毛片在线观看| 亚洲午夜久久久影院伊人| 亚洲AV无码一区东京热| 亚洲嫩模在线观看| 亚洲三级视频在线观看| 亚洲色偷偷综合亚洲AV伊人蜜桃 |