文章程式碼顯示

2019年9月1日 星期日

《筆記》C語言 - 補充_6: enum 的實際用處

之前在學 enum 的時候一直覺得這東西的用處不大
直到進入業界之後,才知道這東西使用的頻率實在太高了
於是我就寫了一個例子來做為一個示範,模擬一下 enum 的實際用處是什麼

在一個小型的專案裡面(例如只有你一個人) ,你大可以不使用 enum
但只要程式變的很大,沒使用 enum 甚至是 struct 的狀況下,程式碼的可讀性就會很差

這邊我用一個 "判斷風扇狀態" 的實際案例做為演示
此例子演示了使用 enum 後,雖然在剛開始做宣告的地方必須多下一點功夫
但這可以讓你後續的程式邏輯都可以用 "文字" 的方式來做呈現

說實話,在實際工作場合中真的很少看到 "判斷式" 裡面會直接輸入一個數字的
因為這樣程式碼的彈性會變的很差,可讀性也會變的很差(也就是說其他同事看到你這串程式碼的時候,會疑惑這個數字是在做什麼的)



#include "stdio.h"

/* 定義 boolean */
typedef enum {
    False,
    True,
}bool;

/* 定義風扇現在的狀態(是否在運轉) */
typedef enum {
    NonWorking,
    Working,
}Fan_Status_bool;
Fan_Status_bool FanStatus = NonWorking; /* 初使化風扇現在的狀態 */

/* 定義風扇現在的轉速等級 */
typedef enum {
    NoSpeed,        // 沒在轉
    LowSpeed = 1000, // 1000 轉
    MidSpeed = 2000, // 2000 轉
    HighSpeed = 3000, // 3000 轉
}Fan_Speed_Level_Status;
Fan_Speed_Level_Status FanSpeedLevel = NoSpeed; /* 初使化風扇的轉速等級 */

/* 藉由此函數, 模擬我們得到一個 fanSpeed */
int getFanSpeed(int test_number);

/* 實務上, 我們通常會建立這樣子的函式用來快速判斷一個風扇的狀態*/
bool isFanWorking(Fan_Status_bool _FanStatus);
bool FanWorking = False; /*初始化 Fan 是否在 working 的狀態*/

/* 用一個函數專門用來 print 出風扇的轉速等級 */
void printFanSpeedLevel(Fan_Speed_Level_Status _FanSpeedLevel);

/* ===== main ===== */
int main()
{
    for (int test_number=0; test_number < 4; test_number++){
        printf("test_number = %d , getFanSpeed frunction return %d ===>  ", 
        test_number, getFanSpeed(test_number));
        
        if ( getFanSpeed(test_number) == NoSpeed){
            FanStatus = NonWorking;
            FanSpeedLevel = NoSpeed;
        }
        else if ( getFanSpeed(test_number) == LowSpeed){
            FanStatus = Working;
            FanSpeedLevel = LowSpeed;
        }
        else if ( getFanSpeed(test_number) == MidSpeed){
            FanStatus = Working;
            FanSpeedLevel = MidSpeed;
        }
        else if ( getFanSpeed(test_number) == HighSpeed){
            FanStatus = Working;
            FanSpeedLevel = HighSpeed;
        }
        
        FanWorking = isFanWorking(FanStatus);
        (FanWorking == True) ? ( printf("The Fan is working. ") ) : 
                               ( printf("The Fan is NOT working !") ); //三元運算子
                               
        printFanSpeedLevel(FanSpeedLevel);
    }// for end
    
    return 0;
}

int getFanSpeed(int _test_number){
    // 隨意定義一個 TestArray 來產生測試的資料
    // 藉由 test_number 回傳一個轉速的值
    // 模擬我們藉由這個函式,透過底層的硬體等等的,得到的轉速
    int fanSpeed_TestArray[4] = {
        0,
        1000, // 1000 轉
        2000, // 2000 轉
        3000 // 3000 轉
    };
    return fanSpeed_TestArray[_test_number];
}

bool isFanWorking(Fan_Status_bool _FanStatus){
    switch (_FanStatus){
        case NonWorking:
            return False;
        case Working:
            return True;
    }
}

void printFanSpeedLevel(Fan_Speed_Level_Status _FanSpeedLevel){
    switch (_FanSpeedLevel){
        case NoSpeed:
            printf(" \r\n");// Fan is not working, print nothing
            break;
        case LowSpeed:
            printf(" The Fan Speed Level is LowSpeed\r\n");
            break;
        case MidSpeed:
            printf(" The Fan Speed Level is MidSpeed\r\n");
            break;
        case HighSpeed:
            printf(" The Fan Speed Level is HighSpeed\r\n");
            break;
    }
}









我的 Youtube 頻道,一定要訂閱
我將定期推出程式語言的新手教學影片


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引