C 語言初學教材 - 第三章 多重選擇的 switch-case

我們用 if-else if-... 進行猜數字遊戲最後的狀態判斷,這是種多重選擇的方式,圖示如下




C 語言另外一種多重選擇的方式就是 switch-case 陳述,由於數字遊戲最後的狀態判斷是常數值相等性測試,所以很容易就能用 switch-case 來改寫。


我們另外提供 switch-case 的版本如下
#include <stdio.h>
#include <time.h>
#include <math.h>

enum STATE {RIGHT = 1, BIG_FOUR ,BIG_FIVE, SMALL_FOUR, SMALL_FIVE};

int main(void)
{
    int answer = time(NULL);
    int guess;
    int diff;
    int state = 0;
    
    answer %= 25;
    if (answer == 0) {
        answer = 25;
    }
    
    printf("請猜一個數字 1 到 25: ");
    scanf("%d", &guess);
    diff = guess - answer;
    diff = (int) fabs(diff);
    
    if (guess == answer) {
        state = RIGHT;
    }
    else {
        if (guess > answer) {
            if (diff > 5) {
                state = BIG_FIVE;
            }
            else {
                state = BIG_FOUR;
            }
        }
        else {
            if (diff > 5) {
                state = SMALL_FIVE;
            }
            else {
                state = SMALL_FOUR;
            }
        }
    }

    switch (state) {
        case RIGHT:
            printf("猜對囉!\n");
            break;
            
        case BIG_FIVE:
            printf("猜的數字比答案大....還很遠,再加把勁!\n");
            break;
        
        case BIG_FOUR:
            printf("猜的數字比答案大....不錯喔!很接近了\n");
            break;
        
        case SMALL_FIVE:
            printf("猜的數字比答案小....還很遠,再加把勁!\n");
            break;
        
        case SMALL_FOUR:
            printf("猜的數字比答案小....不錯喔!很接近了\n");
            break;
            
        default:
            printf("猜錯囉!\n");
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:gn5.c
    功能:簡單的猜數字遊戲
    作者:張凱慶
    時間:西元2010年7月 */ 


編譯執行的結果會完全一樣,這只是個用不同方法改寫的例子。


我們已經看過很多不同寫法,但是具有相同執行結果的程式。其實很多程式的功能大致上都相同,但是程式內部怎麼實現卻多有不同,有些差異在語法,如上述 if-else if... 用 switch-case 改寫的例子,有些差異則是演算法的不同。


會有不同演算法的原因,大多是長久以來程式設計師為了尋找更有效率的演算法,所以累積了很多概念不同的演算法,對大量資料來說,有些會有效率,執行的很快,有些則是不太有效率,需要多點執行時間。如果資料量非常的大,例如原本一千筆,逐漸累積到上萬筆甚至幾十幾百萬筆的時候,有效率的演算法就變得相當重要。


我們對寫程式需要認識的是演算法沒有絕對,就算當今最有效率的演算法,也可能是對某種資料或某種資料結構有效,通常得看資料的種類跟所用的資料結構,如果有人開發出新的演算法,舊的有效率的演算法就可能被束之高閣,藏在教材中當作教學範例。


然而語法是絕對的,編譯器總是會告訴我們這樣寫合不合法,因此,自己嘗試寫程式時,不要覺得自己想的邏輯對就是對,直接編譯讓編譯器告訴我們這樣行不行得通,這會是練習寫程式最佳的助手。


問題與討論
  1. 為什麼會有很多寫法不同,卻有相同執行結果的程式?
  2. 為何要選擇有效率的演算法?
  3. 誰是寫程式的最佳助手?
  4. 資料結構是指什麼?陣列算不算是一種資料結構?




沒有留言: