函式指標實現轉移表代替switch語句
阿新 • • 發佈:2019-01-06
下面舉例說明函式指標陣列實現轉移表來代替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語句具體實現如下:
如上用轉移表代替switch,如果增加新的operate,只需增加operate列舉中的操作和函式指標陣列中的成員,不需要更改main函式中的內容,#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]; }
在實際的專案中可以將列舉型別定義和函式指標陣列宣告放在.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);