歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用Qt和Interpreter設計模式開發計算器(附源碼)

計算器軟件其實有很多種,但是基本上都是模仿計算器,用鼠標點擊按鍵來操作,這次我們反其道而行之,采用類似文本輸入的操作方式。

功能

1.鍵盤輸入算式,回車後計算結果。

2.根據當前輸入的函數的一部分,自動找到備選函數。這時可以用上/下鍵選擇需要的函數後,按空格鍵確定輸入。在整個過程中一直可以表示函數的幫助信息。我們可以參考幫助信息,選擇合適的函數。

3.支持三角函數,反三角函數,求和,平均值,乘方,開方,對數,當然還有包含嵌套的四則運算。

相關資源下載(包括可執行文件,可直接在WindowsXP,Windows7環境下執行及源代碼,工程文件)下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /pub/2011/10/30/使用Qt和Interpreter設計模式開發計算器源碼/

執行畫面如下 

技術要點:

除了操作界面以外,實際我們是要做這樣一個解析器,就面臨這一個如何描述我們所面的需求的問題。在這裡我們使用EBNF的一種形式,它由W3C定義。我們可以在XML Path Language (XPath) 2.0 (Second Edition)中找到它的細節。

一下是我們在計算器中輸入的表達式的描述。

  1. [1]Expr::= AdditiveExpr   
  2.    
  3.   
  4. [2] AdditiveExpr::=MultiplicativeExpr ( ("+" | "-") MultiplicativeExpr )*  
  5.   
  6.    
  7.   
  8. [3]MultiplicativeExpr::= UnaryExpr ( ("*" | "/" | "%" ) UnaryExpr)*  
  9.   
  10.    
  11.   
  12. [4]UnaryExpr::=("-" | "+")* PrimaryExpr  
  13.   
  14.    
  15.   
  16. [5]PrimaryExpr::= NumericLiteral | ParenthesizedExpr | FunctionCall  
  17.   
  18.    
  19.   
  20. [6]NumericLiteral::=IntegerLiteral | DecimalLiteral | DoubleLiteral  
  21.   
  22.    
  23.   
  24. [7]ParenthesizedExpr::="(" Expr? ")"  
  25.   
  26.    
  27.   
  28. [8]FunctionCall::=FunctionName "(" (Expr(","Expr)*)? ")"  
  29.   
  30.    
  31.   
  32. [9]IntegerLiteral ::=Digits  
  33.   
  34.    
  35.   
  36. [10]DecimalLiteral ::=("." Digits) | (Digits "." [0-9]*)  
  37.   
  38.    
  39.   
  40. [11]DoubleLiteral::=(("." Digits) | (Digits ("." [0-9]*)?)) [eE] [+-]? Digits  
  41.   
  42.    
  43.   
  44. [12]Digits ::=[0-9]+  
  45.   
  46.    
  47.   
  48. [13] FunctionName=sinr  
  49.   
  50.                 |sind  
  51.   
  52.                 |cosr  
  53.   
  54.                 |sind  
  55.   
  56.                 |tanr  
  57.   
  58.                 |tand  
  59.   
  60.                 |asinr  
  61.   
  62.                 |asind  
  63.   
  64.                 |acosr  
  65.   
  66.                 |acosd  
  67.   
  68.                 |atanr  
  69.   
  70.                 |atand  
  71.   
  72.                 |power  
  73.   
  74.                 |root  
Copyright © Linux教程網 All Rights Reserved