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計算機
圖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的結果就會被代換出來。
按右上方的「#」號切換側邊欄