// 在所有函數外宣告預設的帳號及密碼 char userID[SIZE][LEN]; char userCODE[SIZE][LEN];
同樣的,我們會定義如下各個函數
// 函數原型的宣告 int manage(int counter, char id[][LEN], char code[][LEN]); void printList(char id[][LEN], char code[][LEN]); void si(char id[][LEN], char code[][LEN]); int ssearch(char array[][LEN], int size, char *target); int di(int counter, char id[][LEN], char code[][LEN]); int so(char id[][LEN], char code[][LEN]); void ssort(char array[][LEN], char code[][LEN], int size);
函數 main() 處理最外層的登入,而 manage() 處理帳號管理的部份,這是說一旦比對使用者輸入的帳號為 administrator ,密碼也與預設的 0000 相符, main() 便呼叫 manage() 進行帳號管理工作
if (i == 0 && !strcmp(inputCode, userCODE[i])) { counter = manage(counter, userID, userCODE); printf("\n\n"); state = RUN; break; }
簡單說, counter 作為參數也是回傳值,此外多了兩個參數,分別是儲存使用者帳號的 userID 及 userCODE 。定義如下
int manage(int counter, char id[][LEN], char code[][LEN]) { // 宣告接收管理模式指令 char instruction[LEN]; printf("\n\n您成功以管理員模式登入....\n"); printf("將入帳號管理模式,請在提示符號 # 後輸入指令\n"); while (1) { printf("\n# "); scanf("%s", instruction); // exit 為離開管理模式的指令 if (!strcmp(instruction, "exit")) { return counter; } // list 為列印使用者列表的指令 if (!strcmp(instruction, "list")) { printList(id, code); continue; } // search 為查詢帳號指令 if (!strcmp(instruction, "search")) { si(id, code); continue; } // delete 為刪除帳號指令 if (!strcmp(instruction, "delete")) { counter = di(counter, id, code); continue; } // sort 為排序指令 if (!strcmp(instruction, "sort")) { counter = so(id, code); continue; } } }
printList() 、 si() 、 di() 及 so() 都增加兩個參數,分別是使用者帳號的 id 及使用者密碼的 code ,這也是 manage() 所接收的參數。
函數 printList() 用為印出所有使用者帳號,定義如下
void printList(char id[][LEN], char code[][LEN]) { int i; printf("\n以下為所有註冊使用者的帳號及密碼\n"); printf("\n帳號 - 密碼\n"); for (i = 0; i < SIZE; i++) { if (id[i][0] == '\0') { continue; } printf("%s - %s\n", id[i], code[i]); } }
函數 si() 為查詢使用者帳號與管理者互動的介面,實際搜尋演算法寫在函數 ssearch() 之中。
void si(char id[][LEN], char code[][LEN]) { char searchname[LEN]; int index; printf("\n請輸入要查找的帳號: "); scanf("%s", searchname); index = ssearch(id, SIZE, searchname); if (index != -1) { printf("\n帳號 %s 已經註冊,密碼是 %s\n", id[index], code[index]); } else { printf("\n還沒有 %s 的帳號註冊唷!\n", searchname); } } int ssearch(char array[][LEN], int size, char *target) { int i; for (i = 0; i < size; i++) { if (!strcmp(array[i], target)) { return i; } } return -1; }
函數 di() 為刪除帳號指令的與管理者互動介面,定義如下
int di(int counter, char id[][LEN], char code[][LEN]) { char deletename[LEN]; int index; printf("\n請輸入要刪除的帳號: "); scanf("%s", deletename); index = ssearch(id, SIZE, deletename); if (index != -1) { for (index; index < SIZE; index++) { strcpy(id[index], id[index + 1]); strcpy(code[index], code[index + 1]); } printf("\n%s 的帳號資料已刪除\n", deletename); return counter--; } else { printf("\n%s 的帳號資料不存在,無法刪除\n", deletename); return counter; } }
di() 同樣以 ssearch() 為核心的搜尋演算法,若搜尋成功便可取得所要刪除陣列元素的索引值,然後才進行刪除的工作。
函數 so() 為排序指令的與管理者互動介面,而 ssort() 為實際核心的排序演算法,定義如下
int so(char id[][LEN], char code[][LEN]) { ssort(id, code, SIZE); printf("\n資料已排序完成\n"); return 1; } void ssort(char array[][LEN], char code[][LEN], int size) { int i, j; char tempa[LEN], tempb[LEN]; for (i = 0; i < size - 1; i++) { for (j = 1; j < size; j++) { if (array[j - 1][0] > array[j][0]) { strcpy(tempa, array[j - 1]); strcpy(tempb, code[j - 1]); strcpy(array[j - 1], array[j]); strcpy(code[j - 1], code[j]); strcpy(array[j], tempa); strcpy(code[j], tempb); } } } }
so() 最後回傳 1 這是因為排序完之後,我們把 counter 重新設為 1 。這裡我們同樣沿用已經開發好的 ssort() ,但是多增加一個二維字元陣列的參數,因為需要同時搬移兩個二維字元陣列的資料。
完整的範例程式碼及編譯執行,請繼續參考
沒有留言:
張貼留言