#

Tcl的直譯器在處理每一個命令時都會執行變數、子命令及反斜線代換等動作,但不會處理數學的運算,換句話說像puts 1+2的命令,其輸出是1+2而不是想像的3,如果真的要執行運算則需要靠expr命令來做到。這篇文章簡單的說明expr的使用方法。

5.1 expr 運算命令

expr命令是Tcl裡專門用來做運算的命令,一般的情況我們透過expr及子命令代換來達成運算的需求,如下是expr命令的語法:

expr 參數1 [參數2] ... [參數N]

expr會把參數1~參數N串接起來當成是一個數學運算式來看,並求出運算式的值。以下是使用範例:



請注意!第3行和第4行的結果是不同的,如果expr裡的運算元都是整數,輸出結果會無條件捨去小數部份。expr裡的運算元允許變數及子命令代換。

5.2 expr提供的函數

上一個程式的第5行使用了sin函數,當然除了sin之外expr還提供了其它的函數,以下是expr提供的其它函數列表,別刻意去記它們,有用到再查就好。

abs(arg)對arg求絕對值
acos(arg)三角函數的 arc consine,回傳值範圍 [0,pi]
asin(arg)三角函數的arc sine,回傳值範圍 [-pi/2,pi/2]
atan(arg)三角函數的 arc tangent,回傳值範圍 [-pi/2,pi/2]
atan2(y, x)三角函數的 arc tangent(y/x),回傳值範圍[-pi,pi]
ceil(arg)求大於arg的最小浮點數值(小數部份是0)
cos(arg)三角函數的consine
cosh(arg)三角函數的 hyperbolic cosine
double(arg)把arg轉型成double型態回傳
exp(arg)對arg求指數exponential
floor(arg)求小於arg的最大浮點數
fmod(x, y)以浮點數型態回傳x/y的餘數
hypot(x, y)Computes the length of the hypotenuse of a right-angled triangle sqrt(x*x+y*y)
int(arg)傳回arg無條件捨去後的結果.
log(arg)對arg求natural logarithm
log10(arg)對arg求以10為基底的logarithm
pow(x, y)求x的y次方
rand()傳回一個pseudo-random floating-point value in the range (0,1)
round(arg)傳回arg四捨五入後的結果
sin(arg)三角函數的arc sine
sinh(arg)三角函數的 hyperbolic sine
sqrt(arg)對arg開根號
srand(arg)使用arg來重置亂數產生器,並回傳第一個產生的亂數,arg必需是整數.
tan(arg)三角函數的 arc tangent
tanh(arg)三角函數的 hyperbolic tangent
wide(arg)轉換arg為最少64位元的整數

5.3 expr位元運算

除了上述的數學函數外,expr也可以做位元運算,以下是位元運算子的列表:

~位元的NOT運算
<<位元左移
>>位元右移
&位元AND運算
^位元XOR運算
|位元OR運算

以下是使用範例:



5.4 expr邏輯運算

Tc可以做數值比較,字串也可以拿來比,不管是數值或字串的比較,只要邏輯成立expr就傳回1,否則傳回0。

>大於,可用於數值和字串
<小於,可用於數值和字串
>=大於等於,可用於數值和字串
<=小於等於,可用於數值和字串
==等於,可用於數值和字串
!=不等於,可用於數值和字串
eq等於,字串專用(逐字元比較)
ne不等於,字串專用(逐字元比較)
!邏輯的NOT運算真變假、假變真
||邏輯的OR運算
&&邏輯的AND運算

以下是使用範例:



5.5 expr計算機製作

接下來我們要使用expr命令做一個簡單的計算機,程式執行後可以讓使用者在文字輸入方塊上填入數學運算式如圖5-1:



圖5-1 expr計算機

當使用者輸入完運算式後按下右邊的Calculate就可以馬上算出結果,然後顯示在同一個文字輸入方塊上,如圖5-2:



圖5-2 expr計算機執行結果

計算機的程式碼如下:



這個程式的觀念非常的簡單。程式的第1行很單純的建立了一個文字標籤Expression。第2行再建立一個文字方塊並指定輸入的內容要儲存在全域的::txt變數裡。第3行建立一個顯示為Calculate的按鈕,當按鈕按下後會取出::txt變數的值並用expr命令運算,運算的結果再存回::txt變數。第4行透過pack命令把文字標籤、文字方塊及按鈕逐一排列在視窗上,-side用來指定排列的方法,這裡指定由left(左)到右排列。

本章回顧

Tcl的直譯器在處理每一個命令時都會執行代換的動作,但不會處理數學的運算,例如:puts 1+2輸出是1+2而不是想像的3。

expr命令是Tcl裡專門用來做運算的命令,透過子命令代換就可以達成運算的目的,語法如下:

expr 參數1 [參數2] ... [參數N]

expr會把參數1~參數N串接起來當成是一個數學運算式來看,並求出運算式的值。例如:



這樣1+2的結果就會被代換出來。

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates