同樣是權限的問題,我們應該要給某個使用者具有管理帳號的權限,如同網路論壇、 BBS 站台的管理員或各版的版主。第一個問題會是要給哪個使用者管理的權限,第二個問題會是要有哪些管理的功能?
解決第一個問題比較簡單,我們只需要給某個預設的使用者這樣的權限即可,就像大部分的 UNIX-Like 作業系統都有一個 root 帳號, root 具有絕對的權力可以對系統做任何調整,包含檢閱、刪除、移動每個帳號的檔案。
因此,我們預設一個 administrator 的帳號在 userID[0] 的位置,所以我們會加入以下的程式碼
27 28 29 | // administrator 為預設的管理者帳號, 0000 為其密碼 strcpy (userID[0], "administrator" ); strcpy (userCODE[0], "0000" ); |
這裡要留意的一點,字串在 C 語言中是複合的資料型態,所以需要用到標準函數庫中 string.h 的函數 strcpy() 來進行拷貝的工作。
第二個問題並不麻煩,因為使用者可以自己新增使用者帳號,所以管理者應該要具有刪除帳號的功能,另外為了方便管理,我們打算額外提供一個管理模式的介面,管理者也應該要有印出帳號列表、搜尋帳號、排序帳號等功能,如下列表
指令 | 功能 |
---|---|
exit | 離開管理模式 |
list | 印出帳號列表 |
search | 搜尋特定帳號 |
delete | 刪除特定帳號 |
sort | 排序帳號列表 |
管理者輸入正確的帳號、密碼就會進入管理模式,所以我們會在比對帳號、密碼的 for 迴圈加入以下管理模式的程式碼
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | if (i == 0 && ! strcmp (inputCode, userCODE[i])) { printf ( "\n\n您成功以管理員模式登入....\n" ); printf ( "將入帳號管理模式,請在提示符號 # 後輸入指令\n" ); while (1) { printf ( "\n# " ); scanf ( "%s" , instruction); // exit 為離開管理模式的指令 if (! strcmp (instruction, "exit" )) { break ; } // list 為列印使用者列表的指令 if (! strcmp (instruction, "list" )) { printf ( "\n您即將開啟印出使用者帳號列表的功能....\n" ); continue ; } // search 為查詢帳號指令 if (! strcmp (instruction, "search" )) { printf ( "\n您即將開啟查詢使用者帳號的功能....\n" ); continue ; } // delete 為刪除帳號指令 if (! strcmp (instruction, "delete" )) { printf ( "\n您即將開啟刪除使用者帳號的功能....\n" ); continue ; } // sort 為排序指令 if (! strcmp (instruction, "sort" )) { printf ( "\n您即將開啟排序使用者帳號列表的功能....\n" ); continue ; } } printf ( "\n\n您即將離開管理模式,請重新登入....\n\n" ); state = RUN; break ; } |
進入管理模式也就是進入另一個 while (1) 迴圈,管理模式以井字號 # 作為提示輸入指令的符號,然後以字元陣列 instruction 變數接收使用者輸入的指令,用到新的變數,別忘了要先宣告
31 32 | // 宣告接收管理模式指令 char instruction[LEN]; |
我們同樣以 exit 為離開管理模式指令,其他的指令還沒實際寫出來,就先印出提示字串來代替吧!
完整的範例程式碼及編譯執行,請繼續參考
問題與討論
- 為什麼進入管理模式要用另一個 while (1) 迴圈?
- 還沒實作出來的指令先用提示訊息代替,這種規劃程式的方法有什麼優點?
- 離開管理模式與結束程式的指令都是 exit ,這樣的設計方式好不好?
沒有留言:
張貼留言