<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      仿查詢分析器的C#計算器——2.記號對象

      上一篇地址:http://www.rzrgm.cn/conexpress/archive/2009/03/04/MyCalculator_01.html
      上一篇中提到了用樹形結構來分析表達式并計算求值的思路。但對程序來說,輸入的表達式只是一個字符串而已。要將表達式表示成樹型結構,首先必須可以將表達式分解成一個個節點,然后才可以由節點組成樹。這里將樹上的每一個節點稱之為記號對象TokenRecord。

      根據上面的分析得出,記號對象要求有一個存儲自身值的變量,有自己特定的計算方法,還要能知道其下級的值。由此可以得出TokenRecord的基本信息(略去非關鍵信息):
      屬性
      Index:在表達式中的列號,int類型,出錯時用于指示錯誤所在,從1開始。
      Priority:優先級,int類型,在分析表達式的時候需要。
      TokenValue:記號值,object類型
      ChildList:下級列表,List對象,用來存儲下級元素,實現樹結構。
      方法
      Execute:執行該元素的操作,abstract方法。
      SetChildCount:設置下級數量,虛方法,用于檢查下級數量合法性,在構造函數中調用。對應有一個m_ChildCount字段,用于存儲下級數量。因為檢查下級屬于元素內部的任務,所以將m_ChildCount設置為protected,也沒有對應的ChildCount屬性。
      SetPriority:設置優先級,虛方法,在構造函數中調用。
      CheckChildCount:檢查下級數量,在Execute中調用,保證表達式合法。

      其中TokenValue屬性使用object類型是因為這里支持字符串、數值和邏輯值的運算。在最開始設計的時候,曾經采用過兩個字段string和double類型來存儲字符串和數值,邏輯值也用數值表示,后來改成object更簡單了。

      TokenRecord類的代碼如下:

      Code

      設計出基類TokenRecord后,其他記號類都可以從它繼承,然后實現自己的特定計算方法即可。那么實際的表達式中有哪些類型的記號呢?經過分析得出,表達式中所包含的的操作元素無非這幾種:關鍵字,運算符,字符串,數字。
      關鍵字:if,sin,cos,true,false,pi等以英文字母開頭的詞,其中可以包含數字或者其他允許的符號
      運算符:+,-,*,/,\,>,<,>=,<=,&&,||,!等,純符號操作元素,可以由好幾個字符組成
      字符串:"hello",'good',"where's my book"等,由字符串標識符單引號或者雙引號標識的字符串。字符串中允許包含當前字符串標識符之外另一種字符串標識符,即雙引號字符串中可以包含單引號,單引號字符串中可以包含雙引號,這一點和JavaScript類似。如果在字符串中包含當前標識符,則必須用連續兩個標識符進行轉義。
      數值:12,856,42.123,-62.45,允許包含小數點和負數。(本程序中對負數的處理在某些情況下會有錯誤,有興趣的朋友可以完善一下)
      進一步分析發現,字符串和數值有一定的相似性,就是它們并不需要計算,只需要作為一個存儲單元即可。那么就可以將它們合并,稱為值記號對象TokenValue。其他記號對象在Execute中實現自己的特定算法,而值記號對象的Execute方法中不做任何操作。

      按照上面對操作元素的分類,從TokenRecord類衍生出一下幾個類:TokenValue(對應字符串和數值),TokenMethod(方法類,抽象類,對應部分關鍵字而非全部,因為有些關鍵字是常量,可以用TokenValue表示),  TokenSymbol(對應運算符,抽象類)。類圖如下:

      然后再從這些類中衍生出更多的具體的類,比如TokenIf, TokenSin, TokenCos, TokenPlus, TokenMinus。
      以這個表達式為例,23.5+(54/3-9)*2,分析出來的TokenList記號對象列表如下:
       

      記號對象

      對應表達式

      TokenValue

      23.5

      TokenPlus

      +

      TokenLeftBracket

      (

      TokenValue

      54

      TokenDivide

      /

      TokenValue

      3

      TokenMinus

      -

      TokenValue

      9

      TokenRightBracket

      )

      TokenMultiply

      *

      TokenValue

      2

      這樣就把傳入的表達式字符串表示成程序可以識別的對象了,然后再對這些記號對象進行處理,最終得到計算結果。這一節只是介紹記號對象,至于怎么將表達式轉換成記號對象,下一篇再詳細介紹。

      接下來是如何實現具體的TokenRecord類。以乘法記號類TokenMultiply為例,TokenMultiply繼承自TokenArithmetic,TokenArithmetic繼承自TokenSymbol,TokenSymbol繼承自TokenRecord。

      TokenSymbol類也是一個抽象類,只是將部分重復的設置實現了,減少其子類中重復的代碼,TokenSymbol類的代碼如下:

      Code
      TokenArithmetic類則是個完全的抽象類,只是為了進行分類而已,任何功能都沒實現,其代碼如下:
      Code
      最后是TokenMultiply類,它實現具體的乘法操作,代碼如下:
      Code
      TokenRecord中的三個虛方法SetChildCount, SetPriority, Execute都得到了實現。這里每一個具體的記號都只負責自己內部的計算,降低了類和外部的聯系,即高內聚低耦合。如果需要添加新的計算方法,只需要從TokenRecord繼承,然后實現這三個方法即可,可以很容易的進行擴展。例如本程序中實現了三角函數sin和cos,但未實現tan。如果需要實現tan,只需要根據sin或者cos的實現方法去做就可以了。甚至可以再提煉出一個抽象類,讓所有的三角函數計算都從它繼承。

      本篇就到此,下一篇將介紹如何將表達式字符串轉換成程序可以處理的TokenRecord對象列表。
      代碼下載:https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar
      posted @ 2009-03-18 15:18  Alex Leo  閱讀(2708)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 最新亚洲人成网站在线观看 | 麻豆成人精品国产免费| 日韩一区在线中文字幕| а√在线中文网新版地址在线 | 国产综合一区二区三区麻豆| 国产精品会所一区二区三区| 国产精品天堂蜜av在线播放| 国产精品无码久久久久AV| 中文字幕人妻有码久视频| 毛片tv网站无套内射tv网站| 精品无码国产一区二区三区AV| 国产精品一码二码三码四码| 国产麻豆精品手机在线观看| 激情亚洲专区一区二区三区| 亚洲综合在线日韩av| 日本少妇自慰免费完整版| 久久婷婷五月综合色丁香花| 欧美熟妇乱子伦XX视频| 久久99国产精品尤物| 任我爽精品视频在线播放| 国产精品一区二区AV| 巫溪县| 性色a码一区二区三区天美传媒| 偷拍精品一区二区三区| 国产精品特级毛片一区二区三区| 免费观看激色视频网站| 无码人妻丰满熟妇啪啪网不卡| 午夜高清福利在线观看| 亚洲日本va午夜中文字幕久久 | 国产日韩综合av在线| 国产精品熟妇视频国产偷人| 无套内谢少妇一二三四| 中文字幕有码无码AV| 亚洲免费成人av一区| 亚洲国产美女精品久久久| 亚洲一区二区三区18禁| 国产在线一区二区不卡| 久久综合综合久久综合| 亚洲人成人网站色www| 青青草原网站在线观看| 亚洲精品一区二区天堂|