條件命令可以讓程式有條件的執行某些程式碼。如果你的程式裡想要有「如果某件事是真的,才執行某些事」的功能,那麼就是使用條件命令的時候了。接下來這篇文章會簡單的介紹如何使用Tcl的條件式命令,讓你的程式可以選擇性的執行某些程式。
3.1 條件命令
讓我們先來設計一個程式,看看條件命令該何時使用。假設你設計了一個計算圓面積的程式,它可以讓使用者輸入半徑,然後自動算出圓面積。這個程式執行起來像這個樣子:圖3-1 圓面積計算程式
使用者可以在文字方塊上輸入圓的半徑,按下計算後程式會自動算出圓面積,然後顯示在同一個文字方塊上。例如:5*5*3.14=78.5
圖3-2 計算結果
它的程式碼如下:
這個程式使用::txt儲存文字方塊上顯示的文字,按下計算按鈕後會執行:
請先看到中括號裡的內容,它是我們之前提過的子命令。依照規則它會被優先執行,在中括號裡頭我們使用expr命令來計算$::txt*$::txt*3.14的值,其中::txt的內容是我們輸入的半徑,所以計算出來的結果就是圓面積。當子命令執行完成後,我們再用set命令把結果回存到::txt變數裡,這樣會讓結果顯示在文字方塊上。請注意!! 在之前的程式裡-command後面都只有放一行程式,這次我們改用多行程式的寫法,換句話說當使用者按下.btn後,夾在-command大括號裡的程式不管有多少行都會被執行。
乍看之下上面的程式好像沒什麼問題,不過實際上在某些情況下它是會運作失常的。例如,使用者故意輸入一個負數的值,或著是輸入了英文字母。想決解這些問題,可以使用條件式,因為我們要做「如果使用者輸入了正整數,才執行計算」的功能。為了單純我們先假設使用者只會輸入正數或負數而不會輸入其它的字元,那改寫後程式變成這樣:
注意到程式的第3行,我們使用了if命令限定「只有::txt的值大於0的時候,才執行第4行的程式」。這樣一來程式就不會去計算負數的輸入值了。
3.1.1 if條件命令
if是大部份程式語言都會提供的功能,它可以用條件式來限定某些程式是否要被執行。其語法如下:if 條件式 程式區塊
在習慣上我們會用一對大括號夾起條件式及程式區塊,而且三個項目中之間一定要用空白隔開。例如:
執行結果為:
hello
上面的程式使用if命令去判斷「如果$flag等於1,才執行puts "hello"」。
如果你想要條件式成立時可以執行多行程式,可以這樣寫:
§ 特別注意
if、條件式、程式區塊,這三個項目中間最少要用1個空白隔開,否則會被當成是不合法的命令。
3.1.2 條件式
條件式基本上是由運算元及運算符號所組成,運算元可以是數值、字串、變數、命令的執行結果。運算符號則包含一般的數學上常見的加、減、乘、除...等,及邏輯運算符號。表3-1是Tcl常用的運算符號,我們可以任意的組合這些符號來使用,但前提是組合出來的條件式必需是合理的數學式,而且必須讓條件式最終的運算結果是true、false或是數值,Tcl把除了0以外的數值都當成是true而0則當成是false。表3-1常用的運算符號
符號 | 說明 |
+ | 數學的加法。 |
- | 數學的減法。 |
* | 數學的乘法。 |
/ | 數學的除法。 |
% | 取餘數。 |
> | 判斷是否大於。 |
>= | 判斷是否大於等於。 |
< | 判斷是否小於。 |
<= | 判斷是否小於等於。 |
== | 判斷是否相等。 |
!= | 判斷是否不相等。 |
&& | 邏輯的and運算。 |
|| | 邏輯的or運算。 |
以下是一些if命令的使用例子。假設變數a的值是5,變數b的值是7。
範例 | 條件是否為真 |
if {1} {puts "true"} | 是 |
if {0} {puts "true"} | 否 |
if {1==1} {puts "true"} | 是 |
if {1>0} {puts "true"} | 是 |
if {8>15} {puts "true"} | 否 |
if {3*2>9} {puts "true"} | 否 |
if {5%3} {puts "true"} | 是 |
if {$a > 4} {puts "true"} | 是 |
if {$a <=3 && $b>4 } {puts "true"} | 否 |
if {$a == $b} {puts "true"} | 否 |
if {$a == 5 || $b == 3} {puts "true"} | 是 |
3.1.3 if命令程式實例
接下來我們要製作一個超簡單的MP3播放程式,多感受一點if命令的使用時機。這個程式的外觀很簡單只有一個選擇檔案的按鈕。如圖3-3是我們即將完成的程式:圖3-3 簡易MP3播放器
當使用者按下選擇檔案的按鈕後,會跳出開啟檔案的對話方塊,然後使用者可以去選擇一個mp3的檔案或者是按取消(如圖3-4)。若使用者有選擇檔案,我們就假設它是一個正確的mp3檔案然後播放它,如果使用者沒有選擇檔案,那我們就不做任何事。
圖3-4 檔案選擇對話方塊
它的程式碼如下:
程式的第1行告訴Tcl要載入snack套件。snack提供了播放音樂檔案的功能,我們需要透過它來解碼MP3檔案。程式的第3~9行是建立按鈕的命令,其中4~8行是按下選擇檔案按鈕時執行的程式。第11行很單純的把.btnPlay按鈕顯示在螢幕上。
接下來請把焦點放在第4行。中括號裡的tk_getOpenFile命令會呼叫選擇檔案的對話方塊,而接在後面的-title可以用來指定它的視窗標題。當tk_getOpenFile執行後使用者可做兩種操作。一種是選中了某一個檔案然後按開啟,另一種是關閉對話方塊或按下取消鈕。如果是前者tk_getOpenFile的執行結果就是被選中檔案的完整路徑,否則的話執行結果將會是空的字串。而根據子命令的規則,不管使用者的選擇為何,其結果終將被儲存在ans變數裡。
然後請注意到第5行。我們透過if命令來判斷ans的值,如果ans不等於空字串,就表示使用者之前選中了一個檔案,那就執行第6~7行來播放音樂。其它的情況下則不做任何事。
第6行的snack::sound是snack套件提供的命令,它的功能是建立MP3播放物件,跟在後面的-file用來指定要播放的MP3檔案。我們把建立出來的播放物件儲存在player變數裡,然後在第6行使用它的play功能來播放MP3檔案。Ok!完成了。請打開喇叭然後執行這個程式。
§ 空字串
空字串指的是一對雙引號裡面沒有夾任何的字元,當然也不能包含空白鍵打出來的空白字元。
§ 關於snack套件
snack套件可以播放的格式並不只有MP3,它還可以播放許多其它的格式例如, OGG 、WAV...檔案等。另外,snack並不是Tcl內建的命令,如果你的開發環境沒有提供這個套件,那你可能沒有辦法正常的執行程式3-4。若發生這樣的狀況建議安裝ActiveTcl,然後在Windows環境下打開命令提示字元,並輸入「teacup install snack」指令來安裝,像下面的圖一樣。在Linux、Mac下請開啟終端機然後輸入一樣的命令來安裝。
3.2 二選一的條件命令 if ... else ...
下方的程式示範了一個不管條件是否成立,最少都會執行某一些程式的例子。在這個例子裡sex如果為0就會執行第二個if的命令,其它的情況下都會執行第一個if命令。換句話說這是「如果...就這樣做,否則就那樣做」的程式邏輯。 事實上用兩個if來做這種二選一的事並沒有什麼不妥,但大部份的程式語言都會提供比較漂亮的語法來專門處理這種狀況,因為二選一的情況真的太常發生了。以下是Tcl用來處理二選一情況的命令。語法的意義是,如果條件式成立就執行程式區塊1,否則就執行程式區塊2。
if 條件式 程式區塊1 else 程式區塊2
接下來的程式和上面的功能一樣,但使用了if...else...的語法,請試著比較看看。
§ 關於if...else...
在上面的程式中2~6行可以寫成像下面的一行,但多行的排版方式會讓程式碼看起來更清礎。
if {$sex == 0} {puts "女仕您好"} else {puts "先生您好"}
3.3 多選一的條件命令 if ... elseif ... else ...
這種條件命令比較複雜一點,主要的用途是在處理多選一的情況。其觀念是讓程式設計者可以設定多組條件式及多個程式區塊,如果其中一個條件式成立時即執行對應的程式區塊,它的語法如下:if 條件式1 程式區塊1 elseif 條件式2 程式區塊2 elseif 條件式3 程式區塊3 .... else 程式區塊X
當條件式1成立就執行程式區塊1,當條件式2成立就執行程式區塊2...依此類推,當條件式n成立就執行程式區塊n,最後的else及程式區塊X會在所有條件都不成立時被執行,若你希望所有條件都不成立時不要做任何事,可以把else及程式區塊X省略。
§ 注意
事實上你可以設定任意組的條件式及程式區塊,Tcl允許你這麼做,但請注意,不管在任何情況下,最多都只會有一個程式區塊被執行,而且是最先符合的先執行。
3.3.1 程式範例
下面的程式展示了三一律的情況:程式輸出的結果是:
變數num的值等於5
3.4 多選一的條件命令 switch ...
switch也是一個多選一的程式結構,但它特別適合用在從多個項目中比對符合的值,然後執行對應的程式區塊, 它的語法如下:switch ?選項? 字串 比對值1 程式區塊1 比對值2 程式區塊2 ... default 程式區塊X
用兩個問號夾起來的項目表示可以選擇性的給予。switch語法的意義是,如果字串等於比對值1就執行程式區塊1,如果字串等於比對值2就執行程式區塊2...以此類推,如果字串等於比對值n就執行程式區塊n,如果都比對失敗就執行default後面的程式區塊X,其中default及程式區塊X是可以省略的。
3.4.1 程式範例
接下來要示範一個數字轉換星期的程式,我們透過switch去比對num的值,並轉換為星期一~星期日輸出。程式輸出的結果是:
星期三
如果對應的程式區塊裡有多行程式,下面的排版方式會比較漂亮。
本章回顧
條件命令可以限定某些程式片段符合特定的條件才執行,Tcl提供了4種條件命令,最簡單的一種如下:夾在第2個大括號裡的程式,只有在條件式運算結果為真的時候才會執行。條件式運算的結果必需是數字、true或flase三者之一,其中除了0還有flase之外的都是真。
二選一的情況可以使用這種條件命令:
多選一則可以使用這種方式:
或是用switch:
無論是上面的哪一種條件命令,都可以在大括號裡的程式碼再出現條件命令,讓條件命令巢狀的執行。
按右上方的「#」號切換側邊欄