1. 程式人生 > >函式指標實現轉移表代替switch語句

函式指標實現轉移表代替switch語句

下面舉例說明函式指標陣列實現轉移表來代替switch語句,例如一個簡單的學生管理系統要實現學生的新增,刪除,修改.....等

主函式裡面我們首先想到程式碼如下:我們會根據選擇的操作在switch中呼叫刪除,新增,修改等函式,不會在case語句下面實現具體的操作函式

#include <stdio.h>

enum operate
{
    Add=1,
    Del,
    Mod
}operation;

int main()
{
    operation opt;
    printf("Please select operate:\n 1:Add\n 2:Del 3:Mod\n");
    scanf("%d",&opt);
    switch(opt)
    {
        case Add:
        {
            addstudent(studentname,StudentListHead);
            break;
        }
        case Del:
        {
            delstudent(studentname,StudentListHead);
            break;
        }
        case Mod:
        {
            modifystudent(studentname,StudentListHead);
            break;
        }
        default:
        {
            break;
        }
    }
}

但是如果系統要新增學生資訊查詢等等很多操作則switch語句會非常多,不易於維護和修改,經過觀察發現各個處理函式的引數相同,我們就

可以通過函式指標陣列轉移表來替代switch語句具體實現如下:

#include <stdio.h>

enum operate
{
    Add=1,
    Del,
    Mod
}operation;

void (*operatefunction[])(char*,StudentList)={addstudent,delstudent,modifystudent}
int main()
{
    operation opt;
    printf("Please select operate:\n 1:Add\n 2:Del 3:Mod\n");
    scanf("%d",opt);
    operatefunction[opt-1];
}
如上用轉移表代替switch,如果增加新的operate,只需增加operate列舉中的操作和函式指標陣列中的成員,不需要更改main函式中的內容,

在實際的專案中可以將列舉型別定義和函式指標陣列宣告放在.h標頭檔案中完成,這樣增加新機能時修改更加靈活。

例如增加學生資訊查詢程式碼如下:

#include <stdio.h>

enum operate
{
    Add=1,
    Del,
    Mod,
    Check//增加查詢操作
}operation;

//增加checkstudent函式
void (*operatefunction[])(char*,StudentList)={addstudent,delstudent,modifystudent,checkstudent}

int main()
{
    operation opt;
    printf("Please select operate:\n 1:Add\n 2:Del 3:Mod\n 4:Check\n");
    scanf("%d",opt);
    operatefunction[opt-1];//不需要修改
}

修改:呼叫函式未加引數operatefunction[opt-1];-->operatefunction[opt-1](studentname,StudentListHead);