#include <stdio.h> #include <string.h> #define SIZE 100 #define LEN 20 enum state {EXIT, RUN, WRONG_NAME, WRONG_CODE, Y, N}; // 函數原型的宣告 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); int main(void) { // 宣告預設的帳號及密碼 char userID[SIZE][LEN]; char userCODE[SIZE][LEN]; // 宣告暫存使用者輸入的帳號及密碼 char inputName[LEN]; char inputCode[LEN]; // 宣告暫存新註冊的帳號及密碼 char newName[LEN]; char newCode[LEN]; // 宣告暫存成功登入的帳號及密碼 char whoName[LEN]; char whoCode[LEN]; // 宣告狀態變數、迴圈變數及陣列索引值變數 int state, i, j, k; int counter; // administrator 為預設的管理者帳號, 0000 為其密碼 strcpy(userID[0], "administrator"); strcpy(userCODE[0], "0000"); for (i = 1; i < SIZE; i++) { strcpy(userID[i], ""); strcpy(userCODE[i], ""); } counter = 1; while (1) { state = WRONG_NAME; printf("login: "); scanf("%s", inputName); // "exit" 為內建指令,用來離開迴圈 if (!strcmp(inputName, "exit")) { state = EXIT; printf("\n\n您將要離開本登入程式....\n\n"); break; } // "new" 為內建指令,用來新建帳號密碼 if (!strcmp(inputName, "new")) { state = RUN; printf("\n請輸入新的註冊帳號: "); scanf("%s", newName); printf("請輸入新的登入密碼: "); scanf("%s", newCode); strcpy(userID[counter], newName); strcpy(userCODE[counter], newCode); counter++; printf("\n新的帳號、密碼已建立,請重新登入....\n"); continue; } // 從陣列中判斷是否有使用者輸入的帳號,若有才再繼續要求輸入密碼 for (i = 0; i < SIZE; i++) { if (!strcmp(inputName, userID[i])) { printf("password: "); scanf("%s", inputCode); if (i == 0 && !strcmp(inputCode, userCODE[i])) { counter = manage(counter, userID, userCODE); printf("\n\n"); state = RUN; break; } if (!strcmp(inputCode, userCODE[i])) { strcpy(whoName, inputName); strcpy(whoCode, inputCode); printf("\n\n哈囉, %s , 歡迎使用本登入程式...\n\n", whoName); state = RUN; break; } else { state = WRONG_CODE; break; } } } // 判斷目前狀態,顯示提示訊息 if (state == RUN) { continue; } else if (state == WRONG_NAME) { printf("\n\n沒有這名使用者喔!請重新登入....\n\n"); continue; } else if (state == WRONG_CODE) { printf("\n\n密碼錯誤,請重新登入....\n\n"); continue; } } printf("\n\n程式即將關閉,所有建立的資料都會消失....\n\n"); return 0; } 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; } } } 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]); } } 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; } 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; } } 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); } } } } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:ncf2.c 功能:使用區域變數規劃帳號管理程式 作者:張凱慶 時間:西元2010年7月 */
程式說明及編譯執行,請繼續參考
沒有留言:
張貼留言