??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲 日韩 色 图网站,亚洲精品无码成人片久久,中文亚洲成a人片在线观看http://www.tkk7.com/junky/category/16580.htmlzh-cnWed, 10 Oct 2007 08:17:54 GMTWed, 10 Oct 2007 08:17:54 GMT60什么是批处?http://www.tkk7.com/junky/archive/2007/10/10/151618.htmljunkyjunkyWed, 10 Oct 2007 01:41:00 GMThttp://www.tkk7.com/junky/archive/2007/10/10/151618.htmlhttp://www.tkk7.com/junky/comments/151618.htmlhttp://www.tkk7.com/junky/archive/2007/10/10/151618.html#Feedback0http://www.tkk7.com/junky/comments/commentRss/151618.htmlhttp://www.tkk7.com/junky/services/trackbacks/151618.html阅读全文

junky 2007-10-10 09:41 发表评论
]]>
同步和异步的区别集锦http://www.tkk7.com/junky/archive/2006/12/18/88659.htmljunkyjunkyMon, 18 Dec 2006 15:43:00 GMThttp://www.tkk7.com/junky/archive/2006/12/18/88659.htmlhttp://www.tkk7.com/junky/comments/88659.htmlhttp://www.tkk7.com/junky/archive/2006/12/18/88659.html#Feedback0http://www.tkk7.com/junky/comments/commentRss/88659.htmlhttp://www.tkk7.com/junky/services/trackbacks/88659.html
举个例子Q普通B/S模式Q同步)AJAX技术(异步Q?br />同步Q提交请?>{待服务器处?>处理完毕q回 q个期间客户端浏览器不能qQ何事
异步: h通过事g触发->服务器处理(q是览器仍然可以作其他事情Q?>处理完毕
--------------------------------------------------------------------------------------------------------------------
同步是你叫我去吃饭Q我听到了就和你d饭;如果没有听到Q你׃停的叫,直到我告诉你听到了,才一起去吃饭?br />异步是你叫我,然后自己d饭,我得到消息后可能立即赎ͼ也可能等C班才d饭?

所以,要我请你吃饭q同步的方法,要请我吃饭就用异步的ҎQ这样你可以省钱?br />--------------------------------------------------------------------------------------------------------------------
举个例子 打电话时同步 发消息是异步


lD?

异步通信”是一U很常用的通信方式。异步通信在发送字W时Q所发送的字符之间的时间间隔可以是L的。当Ӟ接收端必Ld好接收的准备Q如果接收端L的电源都没有加上Q那么发送端发送字W就没有意义Q因为接收端Ҏ无法接收Q。发送端可以在Q意时d始发送字W,因此必须在每一个字W的开始和l束的地方加上标志,卛_上开始位和停止位Q以便接收端能够正地每一个字W接收下来。异步通信的好处是通信讑֤单、便宜,但传输效率较低(因ؓ开始位和停止位的开销所占比例较大)?
异步通信也可以是以作ؓ发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首部必须设有一些特D的比特l合Q得接收端能够扑և一帧的开始。这也称为定界。定界q包含确定的结束位|。这有两U方法。一U是在的尾部设有某U特D的比特l合来标志的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送Ӟq不是说发送端对中的每一个字W都必须加上开始位和停止位后再发送出去,而是_发送端可以在Q意时间发送一个Q而与之间的时间间隔也可以是Q意的。在一帧中的所有比Ҏq箋发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先q行比特同步Q?每个字符开始发送的旉可以是Q意的t0 0 1 1 0 1 1 0起始位结束位t每个帧开始发送的旉可以是Q意的以字Wؓ单位发送以帧ؓ单位发送开始l束
“同步通信”的通信双方必须先徏立同步,卛_方的旉要调整到同一个频率。收发双方不停地发送和接收q箋的同步比Ҏ。但q时q有两种不同的同步方式。一U是使用全网同步Q用一个非常精的L钟对全网所有结点上的时钟进行同步。另一U是使用准同步,各结点的旉之间允许有微的误差Q然后采用其他措施实现同步传输?br />

串口q行通信的方式有两种Q同步通信方式和异步通信方式。同步通信方式要求通信双方以相同的旉频率q行Q而且准确协调Q通过׃n一个单个时钟或定时脉冲源保证发送方和接收方的准同步,效率较高Q异步通信方式不要求双方同步,收发方可采用各自的时钟源Q双斚w循异步的通信协议Q以字符为数据传输单位,发送方传送字W的旉间隔不确定,发送效率比同步传送效率低?
具体


专业?

串行通信可以分ؓ两种cdQ同步通信、异步通信?br />
  1.异步通信的特点及信息帧格式:
  以v止式异步协议ZQ下图显C的是v止式一帧数据的格式Q?

       
                      ?

  h式异步通信的特ҎQ一个字W一个字W地传输Q每个字W一位一位地传输Qƈ且传输一个字W时QL以“v始位”开始,以“停止位”结?字符之间没有固定的时间间隔要求。每一个字W的前面都有一位v始位Q低电^Q逻辑|Q字W本w由5-7位数据位l成Q接着字符后面是一位校验位Q也可以没有校验位)Q最后是一位或一位半或二位停止位Q停止位后面是不定长的空闲位。停止位和空闲位都规定ؓ高电qI逻辑|Q,q样׃证v始位开始处一定有一个下x?br />  从图中可看出Q这U格式是靠v始位和停止位来实现字W的界定或同步的Q故UCؓh式协议?
  异步通信可以采用正逻辑或负逻辑Q正负逻辑的表C如下表所C:

 

逻辑0

逻辑1

正逻辑

低电q?/font>

高电q?/font>

负逻辑

高电q?/font>

低电q?/font>


  异步通信的信息格式如下边的表所C?/span>

起始?/font>

逻辑0

1?/font>

数据?/font>

逻辑0?

5位?位?位??/font>

校验?/font>

逻辑0?

1位或?/font>

停止?/font>

逻辑1

1位,1.5位或2?/font>

I闲?/font>

逻辑1

L数量



  注:表中位数的本质含义是信号出现的时_故可有分CQ如1.5?/span>
  例:传?位数?5HQ?100,0101BQ,奇校验,1个停止位Q则信号U上的L形象?所C那P异步通信的速率Q若9600bpsQ每字符8位,1起始Q?停止Q无奇偶Q则实际每字W传?0位,?60字符/U?/span>


           


                        ?

2.异步通信的接收过E?/p>

  接收端以“接收时钟”和“L特率因子”决定一位的旉长度。下面以波特率因子等?6Q接收时钟每16个时钟周期,使接收移位寄存器UM一ơ)、正逻辑Z说明Q如?所C?br />          

                      ?

  Q?Q开始通信Ӟ信号UؓI闲Q逻辑1Q?当检到??的蟩变时Q开始对“接收时钟”计数。 

  Q?Q当计到8个时钟时Q对输入信号q行,若仍Z电^Q则认q是“v始位”BQ而不是干C受?/p>

  Q?Q接收端到起始位后Q隔16个接收时钟,对输入信h一ơ,把对应的g为D0位数据。若为逻辑1, 作ؓ数据?Q若为逻辑0Q作为数据位0?/p>

  Q?Q再?6个接收时钟,对输入信h一ơ,把对应的g为D1位数据。?Q直到全部数据位都输入?/p>

  Q?Q检校验位PQ如果有的话Q?/p>

  Q?Q接收到规定的数据位个数和校验位?通信接口电\希望收到停止位S(逻辑1)Q若此时未收到逻辑1Q说明出C错误Q在状态寄存器中置“错误”标志。若没有错误Q对全部数据位进行奇偶校验,无校验错Ӟ把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志?/p>

  Q?Q本q信息全部接收完,把线路上出现的高电^作ؓI闲位?/p>

  Q?Q当信号再次变ؓ低时Q开始进入下一q的检?/p>

  3、异步通信的发送过E?/p>

  发送端以“发送时钟”和“L特率因子”决定一位的旉长度?/p>

  Q?Q当初始化后Q或者没有信息需要发送时Q发送端输出逻辑1Q即I闲位,I闲位可以有L数量?/p>

  Q?Q当需要发送时Q发送端首先输出逻辑0Q作v始位?/p>

  Q?Q接着Q发送端首先发送D0位,直到各数据位发送完?/p>

  Q?Q如果需要的话,发送端输出校验位?/p>

  Q?Q最后,发送端输出停止位(逻辑1Q?/p>

  Q?Q如果没有信息需要发送时Q发送端输出逻辑1Q即I闲位,I闲位可以有L数量。如果还有信息需要发送,转入W(2Q步?/p>

  对于以上发送、接收过E应注意以下几点Q?/p>

  Q?Q接收端L在每个字W的头部Q即起始位)q行一ơ重新定位,因此发送端可以在字W之间插入不{长的空闲位Q不影响接收端的接收?/p>

  Q?Q发送端的发送时钟和接收端的接收旉Q其频率允许有一定差异,当频率差异在一定范围内Q不会引h收端错位,能够正确接收。ƈ且这U频率差异不会因多个字符的连l接收而造成误差累计Q因为每个字W的开始(起始位处Q接收方均重新定位)。只有当发送时钟和接收旉频率差异太大Q引h收端采样错位Q才造成接收错误?/p>

  Q?Qv始位、校验位、停止位、空闲位的信P由“发送移位寄存器”自动插入。在接收方,“接收移位寄存器”接收到一帧完整信息(起始、数据、校验、停止)后,仅把数据的各位送至“数据输入寄存器”,即CPU从“数据输入寄存器”中d的信息,只是有效数字Q不包含起始位、校验位、停止位信息?/span>



1、同步通信方式的特点:

  采用同步通信Ӟ许多字W组成一个信息组Q这P字符可以一个接一个地传输Q但是,在每l信息(通常UCؓ帧)的开始要加上同步字符Q在没有信息要传输时Q要填上I字W,因ؓ同步传输不允许有间隙。在同步传输q程中,一个字W可以对??位。当Ӟ对同一个传输过E,所有字W对应同LCQ比如说n位。这P传输Ӟ按每n位划分ؓ一个时间片Q发送端在一个时间片中发送一个字W,接收端则在一个时间片中接收一个字W?br />同步传输Ӟ一个信息中包含许多字W,每个信息帧用同步字符作ؓ开始,一般将同步字符和空字符用同一个代码。在整个pȝ中,׃个统一的时钟控制发送端的发送和I字W用同一个代码。接收端当然是应该能识别同步字符的,当检到有一串数位和同步字符相匹配时Q就认ؓ开始一个信息Q于是,把此后的C作ؓ实际传输信息来处理?
  2、面向字W的同步协议QIBM的BSC协议Q?/b>
       

  该协议规定了10个特D字W(UCؓ控制字符Q作Z息传输的标志。其格式?br />  SYN SOH 标题 STX 数据?ETB/ETX 块校?br />  SYNQ同步字W(Synchronous characterQ,每可加1个(单同步)?个(双同步)同步字符?
  SOHQ标题开始(Start of HeaderQ?br />  标题QHeaderQ包含源地址Q发送方地址Q、目的地址Q接收方地址Q、\由指C?br />  STXQ正文开始(Start of TextQ?br />  数据块:正文QTextQ,由多个字W组成?br />  ETB:块传输结束(end of transmission blockQ, 标识本数据块l束?br />  ETXQ全文结束(end of textQ,Q全文分q块传输Q?br />  块校验:对从SOH开始,直到ETB/ETX字段的检验码?br />  3、面向bit的同步协议(ISO的HDLCQ?/b>
              

  一帧信息可以是L位,用位l合标识帧的开始和l束?帧格式ؓQ?br />  F?A?C?I?FC?F?br />  F场:标志?作ؓ一帧的开始和l束Q标志字Wؓ8位,01111110?
  A场:地址场,规定接收方地址Q可?的整倍位。接收方查每个地址字节的第1位,如果?0"Q则后边跟着另一
  个地址字节。若?1"Q则该字节ؓ最后一个地址字节?br />  C场:控制场。指CZ息场的类型,8位或16位。若W?字节的第1位ؓ0Q则q有W?个字节也是控制场?br />  I场:信息场。要传送的数据?br />  FC场:帧校验场?6位@环冗余校验码CRC。除F场和自动插入?0"位外Q均参加CRC计算?br />  4、同步通信?0位插入和删除技?
  在同步通信中,一帧信息以一个(或几个)Ҏ字符开始,例如QF?01111110B?br />但在信息帧的其他位置Q完全可能出现这些特D字W,Z避免接收Ҏq些Ҏ字符误认为的开始,发送方采用?位插入技?Q相应地Q接收方采用"0位删除技??br />  发送方?位插入:除了起始字符外,当连l出??Ӟ发送方自动插入一?。得在整个信息帧中Q只有v始字W含有连l的6??br />  接收方的"0位删除技?Q接收方收到q箋6?Q作为的v始,把连l出??后的0自动删除?br />  5、同步通信?字节填充技?
  N要传送的原始信息帧ؓQ?br />  SOT DATA EOT
  节填充技术采用字W替换方式,使信息的DATA中不出现起始字符SOT和结束字WEOT?
  设按下表方式q行替换Q?br />       DATA中的原字W?  替换?br />       SOT        ESC X
       EOT         ESC Y
       ESC         ESC Z
   其中QESC=1AHQX、Y、Z可指定ؓL字符Q除SOT、EOT、ESC外)?br />   发送方按约定方式对需要发送的原始帧进行替换,q把替换后的新的帧发送给接收斏V例如图所C:
             

  接收ҎU定方式q行相反替换Q可以获得原始信息?br />  6、异步通信和同步通信的比?/b>
  Q?Q异步通信单,双方旉可允怸定误差。同步通信较复杂,双方旉的允许误差较?br />  Q?Q异步通信只适用于点<--> 点,同步通信可用于点<--> 多?br />  Q?Q通信效率Q异步通信低,同步通信高?





junky 2006-12-18 23:43 发表评论
]]>
快速精的Ҏ学表辑ּ求??http://www.tkk7.com/junky/archive/2006/10/25/77240.htmljunkyjunkyWed, 25 Oct 2006 09:31:00 GMThttp://www.tkk7.com/junky/archive/2006/10/25/77240.htmlhttp://www.tkk7.com/junky/comments/77240.htmlhttp://www.tkk7.com/junky/archive/2006/10/25/77240.html#Feedback0http://www.tkk7.com/junky/comments/commentRss/77240.htmlhttp://www.tkk7.com/junky/services/trackbacks/77240.html
  • 表达式语法分?
  • 表达式检?
  • 一步一步的求?
  • 表达式语法分?/strong>

    W3Eval 的数学表辑ּ由数字、变量、操作符、函数和括号l成。除了缺省的十进制计数制?W3Eval q支持二q制、八q制和十六进制。这些以其它计数制计数的数必M # 开_q紧?b ?o 或?h 来分别表CZq制、八q制或十六进制?

    W3Eval 的变量是不限长度的大写字母和数字序列Q其首字W必L字母。W3Eval 有一些预定义的变量,不过它也支持用户定义的变量?/p>

    W3Eval 支持带有固定或不定数量自变量的函数?函数可分Z下几l:

    • 三角函数Qsin、cos、tan、cot、sec、cscQ?
    • 反三角函敎ͼasin、acos、atan、atan2、acot、asec、acscQ?
    • 双曲U函敎ͼsinh、cosh、tanh、coth、sech、cschQ?
    • 反双曲线函数Qasinh、acosh、atanh、acoth、asech、acschQ?
    • 指数函数Qlog、log2、log10、exp、exp2、exp10、sqrt、curQ?
    • l合学函敎ͼCombinatoricQ(comb、combr、perm、permr、var、varrQ?
    • l计函数Qsum、avg、min、max、stddev、countQ?
    • 其它Qabs、ceil、fact、floor、pow、random、rint、round、sign、frac、hypot、deg、rad、trunc、intQ?

    W3Eval 对表辑ּq行 语法分析Q也是指它识别辑ּ的算术成分,q将它们转化成语aW号QtokenQ,然后把它们放入向量。表辑ּ一旦处于这U状态,׃ؓ下面两步做好了准备:表达式检查和求倹{?

    W3Eval ?W号QtokenQ?/i>是算术表辑ּ的组成部分; 记号QmarkQ?/i>是独立的字符Q??applet 使用Q作别各U符L内部标志。每U符h唯一?mark 与之对应。W3Eval 的表辑ּp 1 所C的W号l成?

    ?1. W3Eval 的符?/strong>

    TokenMarkc?/b>
    十进制数Double
    二进制数String
    十六q制?/td>String
    八进制数String
    变量Variable
    函数Function
    操作W?/td>Operator
    开括号String
    闭括?/td>String
    逗号String

    用以表示函数、操作符和变量类的定义如清单 1 所C:


    清单 1. Function、Operator ?Variable cȝ定义
    public class Function
       {
       public String function;
       public int number_of_arguments;
    
       public Function( String function, int number_of_arguments )
          {
          this.function=function;
          this.number_of_arguments=number_of_arguments;
          }
    
       public String toString()
          {
          return function;
          }
       }
    
    public class Operator
       {
       public String operator;
       public byte priority;
    
       public Operator( String operator, byte priority )
          {
          this.operator=operator;
          this.priority=priority;
          }
    
       public String toString()
          {
          return operator;
          }
       }
    
    public class Variable
       {
       public String variable;
       public double value;
    
       public Variable( String variable, double value )
          {
          this.variable=variable;
          this.value=value;
          }
    
       public String toString()
          {
          return variable;
          }
       }
    

    Token cd清单 2 所C?


    清单 2. Token c?/b>
    public class Token
       {
       public Object token;
       public char mark;
       public int position;
       public int length;
    
       public Token ( Object token, char mark, int position, int length )
          {
          this.token=token;
          this.mark=mark;
          this.position=position;
          this.length=length;
          }
    
       public String toString()
          {
          return token.toString()+" ; "+mark+" ; "+position+" ; "+length+"
    ";
          }
       }
    

    表达式检?/strong>

    查正规表辑ּ正确性的所有代码都在一个独立的cM。详l的表达式检查能够确定错误确切的cd和位|?错误查有七类Q?/p>

    括号查?/b>W3Eval 的表辑ּ可以包含三种括号Q标准圆括号、方括号和花括号。如果表辑ּ包含相同数量的开括号和闭括号Qƈ且每个开括号与一个相应的同种闭括L匚wQ则表达式的括号语法正确。三U括号在语义上等P如下面的代码D|C?


    清单 3. 三种括号
    import java.util.Stack;
    
    public class Parentheses_check
       {
    
       public static boolean is_open_parenthesis( char c )
          {
          if ( c=='(' || c=='[' || c=='{' )
             return true;
          else
             return false;
          }
    
       public static boolean is_closed_parenthesis( char c )
          {
          if ( c==')' || c==']' || c=='}' )
             return true;
          else
             return false;
          }
    
       private static boolean parentheses_match( char open, char closed )
          {
          if ( open=='(' && closed==')' )
             return true;
          else if ( open=='[' && closed==']' )
             return true;
          else if ( open=='{' && closed=='}' )
             return true;
          else
             return false;
          }
    
       public static boolean parentheses_valid( String exp )
          {
          Stack       s = new Stack();
          int         i;
          char        current_char;
          Character   c;
          char        c1;
          boolean     ret=true;
    
          for ( i=0; i < exp.length(); i++ )
             {
    
             current_char=exp.charAt( i );
    
             if ( is_open_parenthesis( current_char ) )
                {
                c=new Character( current_char );
                s.push( c );
                }
             else if ( is_closed_parenthesis( current_char ) )
                {
                if ( s.isEmpty() )
                   {
                   ret=false;
                   break;
                   }
                else
                   {
                   c=(Character)s.pop();
                   c1=c.charValue();
                   if ( !parentheses_match( c1, current_char ) )
                      {
                      ret=false;
                      break;
                      }
                   }
                }
             }
    
          if ( !s.isEmpty() )
             ret=false;
    
          return ret;
          }
       }
    

    token 查?/b>查表辑ּ语法。确保表辑ּ所有部分都被认为是合法的?

    表达式开头的?/b>Q请参阅 清单 4Q??/b>保表达式从合法的符号开始。不可以用操作符、逗号或闭括号作ؓ表达式的开始符?


    清单 4. 正确的表辑ּ开头的?/b>
    private static boolean begin_check( Vector tokens, Range r, StringBuffer err )
       {
       char     mark;
       Token    t;
    
       t=(Token)tokens.elementAt( 0 );
       mark=t.mark;
    
       if ( mark=='P' )
          err.append( Messages.begin_operator );
       else if ( mark==')' )
          err.append( Messages.begin_parenthesis );
       else if ( mark=='Z' )
          err.append ( Messages.begin_comma );
       else
          return true;
    
       r.start=0;
       r.end=t.length;
       return false;
       }
    

    表达式末查?/b>保表达式以合法W号l束。不可以用操作符、函数、逗号或开括号作ؓ表达式结束符?

    W号序列的检查?/b>查表辑ּ中的W号序列。在下面的表gQ若 X 轴上的符号和 Y 轴上的符号对应的交界处用 X 作了记号Q则相应 X 轴上的符号可以接?Y 轴上W号的后面?

    ?2. 合法的符号序?/strong>

    _DBHOVFP()Z
    D______?/td>_?/td>?/td>
    B______?/td>_?/td>?/td>
    H______?/td>_?/td>?/td>
    O______?/td>_?/td>?/td>
    V______?/td>_?/td>?/td>
    F_______?/td>__
    P?/td>?/td>?/td>?/td>?/td>?/td>_?/td>__
    (?/td>?/td>?/td>?/td>?/td>?/td>_?/td>__
    )______?/td>_?/td>?/td>
    Z?/td>?/td>?/td>?/td>?/td>?/td>_?/td>__

    函数查?/b>保表达式中所有函数的自变量数量正?

    逗号查?/b>逗号只能用于分隔函数的自变量。若用于表达式其它地方,׃合法?

    一步一步的求?/strong>

    只有能顺利通过以上概括的所有检查的表达式,W3Eval 才求倹{从而确保内Z W3Eval 中的前提条g不会出现问题。后面的法用于单步执行表达式求|

    1. 扑և嵌入最q那对括号?
    2. 在这Ҏ号中Q找Z先最高的操作W?
    3. 若这Ҏ号中没有操作W:
      • 如果表达式再不包含Q何其它的括号Q求|q程Q完成?
      • 如果表达式包含括P但不包含操作W,则存在一个函数。对函数求|然后转到步骤 5?
    4. 获取操作数ƈ执行q算?
    5. 从向量中除去用过的符号ƈ在同一位置攑օl果?
    6. 除去冗余括号?
    7. 向量中剩余的符L合到字符串ƈ在屏q上昄l果?

    现在Q我们将更ؓ详细的查看算法的每一步,同时查看大部分有意思的代码片段?/p>

    步骤 1Q?/b>为避免括L处理QW3Eval 定哪个子表辑ּ处于嵌套最q那对括号中。这Q务需要两步。第一步,W3Eval 必须扑ևW一个闭括号Q?


    清单 5. 扑ևW一个闭括号
    public static int pos_first_closed_parenthesis( Vector tokens )
       {
       Token   t;
    
       for ( int i=0; i<tokens.size(); i++ )
          {
          t=(Token)tokens.elementAt( i );
          if ( t.mark==')' )
             return i;
          }
       return 0;
       }
    

    W二步,扑և与第一步找到的闭括L匚w的开括号Q如 清单 6 所C?/font>?


    清单 6. 扑և匚w的开括号
    public static int pos_open_parenthesis( Vector tokens, int closed_parenthesis )
       {
       int      i;
       Token    t;
    
       i=closed_parenthesis-2;
    
       while ( i>=0 )
          {
          t=(Token)tokens.elementAt( i );
          if ( t.mark=='(' )
             {
             return i;
             }
          i--;
          }
       return 0;
       }
    

    步骤 2Q?/b>要实现求值的单步执行QW3Eval 在嵌套最q那对括号中找Z先最高的操作W。(操作W的优先U已编码到 applet 中;请参?参考资?/font>以获取完整的代码清单。)


    清单 7. 扑և优先U最高的操作W?/b>
    public static int pos_operator( Vector tokens, Range r )
       {
       byte     max_priority=Byte.MAX_VALUE;
       int      max_pos=0;
    
       byte     priority;
       String   operator;
       Token    t;
    
       for ( int i=r.start+2; i<=r.end-2; i++ )
          {
          t=(Token)tokens.elementAt( i );
          if ( t.mark!='P' )
             continue;
          priority=((Operator)t.token).priority;
          operator=((Operator)t.token).operator;
    
          if ( priority < max_priority || ( operator.equals("^") ||
             operator.equals("**") ) && priority == max_priority )
             {
             max_priority=priority;
             max_pos=i;
             }
          }
       return max_pos;
       }
    

    步骤 3Q?/b>如果表达式中不包含其它括P求值的q程完成。如果表辑ּ包含括号Q但不包含操作符Q则存在需要求值的函数?


    清单 8. 查是否还有其它操作符
    ...
    int poz_max_op=pos_operator( tokens, range );
    // if there are no operators
    if ( poz_max_op==0 )
       {
       if ( no_more_parentheses )
          {
          return false;
          }
       else
          {
          double   result;
          result=function_result( tokens, range.start-1 );
          function_tokens_removal( tokens, range.start-1 );
    
          t = new Token ( new Double(result), 'D', 0, 0 );
          tokens.setElementAt( t, range.start-1 );
    
          parentheses_removal( tokens, range.start-1 );
          return true;
          }
       }
    ...
    

    步骤 4Q?/b>所有的操作W都是二元的Q也是说第一个操作数位于操作W之前,W二个操作符位于操作W之后?


    清单 9. 获取操作数ƈ执行q算
    ...
    double operand1, operand2;
    
    // first operand is before...
    t=(Token)tokens.elementAt( poz_max_op-1 );
    operand1=operand_value( t );
    
    // ...and second operand is after operator
    t=(Token)tokens.elementAt( poz_max_op+1 );
    operand2=operand_value( t );
    
    // operator
    t=(Token)tokens.elementAt( poz_max_op );
    String op=((Operator)t.token).operator;
    
    double result=operation_result( operand1, operand2, op );
    
    tokens.removeElementAt( poz_max_op+1 );
    tokens.removeElementAt( poz_max_op );
    
    t = new Token ( new Double(result), 'D', 0, 0 );
    tokens.setElementAt( t, poz_max_op-1 );
    
    parentheses_removal( tokens, poz_max_op-1 );
    ...
    

    操作数可以是变量Q还可以是十q制、十六进制、八q制或二q制数?/p>
    清单 10. 获取操作?/b>
    public static double operand_value( Token t )
       {
       if ( t.mark=='V' )
          return ((Variable)t.token).value;
       else if ( t.mark=='D' )
          return ((Double)t.token).doubleValue();
       else if ( t.mark=='H' )
          return base_convert( ((String)t.token).substring(2), 16 );
       else if ( t.mark=='O' )
          return base_convert( ((String)t.token).substring(2), 8 );
       else if ( t.mark=='B' )
          return base_convert( ((String)t.token).substring(2), 2 );
       }
    

    接下来的Ҏ不同计数制的数转化为十q制的Ş式?/p>
    清单 11. 数转化为十q制?/b>
    public static long base_convert( String s, int base )
       {
       long r=0;
       int i, j;
    
       for ( i=s.length()-1, j=0; i>=0; i--, j++ )
          r=r+digit_weight( s.charAt( i ) )*(long)Math.pow( base, j );
       return r;
       }
    
    public static int digit_weight( char c )
       {
       if ( Character.isDigit( c ) )
          return c-48;
       else if ( 'A'<=c && c<='f' )
          return c-55;
       else if ( 'a'<=c && c<='f' )
          return c-87;
       return -1;
       }
    

    一旦确定操作数和操作符后,可以执行运了Q如 清单 12所C?

    步骤 5Q?/b>在这步中QW3Eval 从向量中除去用过的符号ƈ在同一位置攑օl果。对于函数求DcL况,除去的是函数、括受自变量和逗号Q而对于操作符求DcL况而言Q除ȝ则是操作数和操作W?

    步骤 6Q?/b>在求值的q一步,W3Eval 从表辑ּ中除d余括受?


    清单 13. 除去冗余括号
    private static void parentheses_removal( Vector tokens, int pos )
       {
       if ( 
          pos>1 &&
    amp;&&
    amp;
          ((Token)tokens.elementAt( poz-2 )).mark!='F' &&
    amp;&&
    amp;
          ((Token)tokens.elementAt( poz-1 )).mark=='(' &&
    amp;&&
    amp;
          ((Token)tokens.elementAt( poz+1 )).mark==')'
          ||
          pos==1 &&
    amp;&&
    amp;
          ((Token)tokens.elementAt( 0 )).mark=='(' &&
    amp;&&
    amp;
          ((Token)tokens.elementAt( 2 )).mark==')'
          )
          {
          tokens.removeElementAt( poz+1 );
          tokens.removeElementAt( poz-1 );
          }
       return;
       }
    

    步骤 7Q?/b>在求值的最后一步,向量中剩余的W号被结合到字符Ԍq在屏幕上显C?


    清单 14. l合W号q显C结?/b>
    public static String token_join( Vector tokens )
       {
       String   result=new String();
       Token    t;
    
       for ( int i=0; i < tokens.size(); i++ )
          {
          t=(Token)tokens.elementAt( i );
    
          if ( t.mark=='D' )
             {
             double n=((Double)t.token).doubleValue();
             result=result + formated_number( n );
             }
          else
             result=result + t.token;
    
          if ( result.endsWith( ".0" ) )
             result=result.substring( 0, result.length()-2 );
          result=result + " ";
          }
       return result;
       }
    





    回页?/font>


    l论

    本文分析了一?applet Q它能一步一步的对算术表辑ּ求倹{同时还按顺序回了最有意思的代码片段Qƈ了两U不同的表达式求值方法?/p>

    下一?W3Eval 有望在各斚w得到增强Q包括有能力d用户定义的功能;支持分数、复数和矩阵Q改良的囑Ş用户界面QGUIQ;大小和速度优化以及安全性方面的增强。我鼓励您提供您自己对于增强斚w的设惟?/p>

    我希望您会发?W3Eval 是个对表辑ּ求值有益的在线工具Q它在某U程度上比经典的Ҏ更简单自然。我q期待这里谈到的代码和算法您明?Java 语言有助于处理数学问题?/p>



    回页?/font>


    参考资?





    回页?/font>


    关于作?/font>

    Author photo

    Nikola Stepan ?ABIT Ltd. 的Y件工E师Q他在那里从事银行业软g的设计和开发。他有广博的信息pȝ斚w的学术背景和丰富的编E经验(从低U编E到信息pȝQ。他特别喜欢面向对象~程语言、关pL据库、因特网~程和系l编E。他?1999 q在克罗C Varazdin ?Faculty of Organisation and Informatic 获得信息pȝ学士学位。他会说克罗C语、英语和一点d语。请通过 nikola.stepan@vz.tel.hr?Nikola 联系?




    junky 2006-10-25 17:31 发表评论
    ]]>
    վ֩ģ壺 ɫһۺ| ɫͼ| Ƶ߲Ŵȫ| avվyy| Ƶ| պƷһ| ۺɫ7777վ777| һѻɫëƬ| ޳aëƬ| þþ뾫Ʒպ| 91԰Ƶ| ƬAëƬ| ߹ۿƵ| ޱһ| AVһɫ| ³ʦӰԺѹۿ| ޹ۺ| ޼ƵͼƬ| þѹۿƷ| ˾þۺӰԺ| 67194ҹ| վѹۿ| ͵͵޸պ| ޾Ʒպav| 99ƷƵѹۿ| avպƬ߹ۿ| Ļmv| ҹѸƬۿ| ޾Ʒպ?V| Ļ޾Ʒһ| þþþþAVվ| ŷ͵Ʒ | ɫAVպ߹ۿ| 16Ůڵ| ޴߶ר| һaƬþ| ձa߹ۿ| avҹƷר| Ƶ߹ۿ| һAVٸӰ| ɫaѿ|