C 語言初學教材 - 第四章 氣泡排序法 範例程式碼

範例程式碼



#include <stdio.h>
#include <string.h>

#define SIZE 100
#define LEN 20

enum state {EXIT, RUN, WRONG_NAME, WRONG_CODE, Y, N};

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];
    
    // administrator 為預設的管理者帳號, 0000 為其密碼
    strcpy(userID[0], "administrator");
    strcpy(userCODE[0], "0000");
    
    // 宣告接收管理模式指令
    char instruction[LEN];
    // 宣告接收搜尋目標值
    char searchname[LEN];
    // 宣告排序時用的暫存變數
    char tempName[LEN];
    char tempCode[LEN];

    // 宣告狀態變數、迴圈變數及陣列索引值變數
    int state, i, j, k;
    int counter;

    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])) {
                    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");
                            printf("\n帳號 - 密碼\n");
                            for (j = 0; j < SIZE; j++) {
                                if (!strcmp(userID[j], "")) {
                                    continue;
                                }
                                
                                printf("%s - %s\n", userID[j], userCODE[j]);
                            }
                            continue;
                        }
                        
                        // search 為查詢帳號指令
                        if (!strcmp(instruction, "search")) {
                            state = N;
                            
                            printf("\n請輸入要查找的帳號: ");
                            scanf("%s", searchname);
                            
                            for (j = 0;j < SIZE; j++) {
                                if (!strcmp(userID[j], searchname)) {
                                    state = Y;
                                    break;
                                }
                            }
                            
                            if (state == Y) {
                                printf("\n帳號 %s 已經註冊,密碼是 %s\n", userID[j], userCODE[j]);
                            }
                            else if (state == N) {
                                printf("\n還沒有 %s 的帳號註冊唷!\n", searchname);
                            }
                            continue; 
                        }
                        
                        // delete 為刪除帳號指令
                        if (!strcmp(instruction, "delete")) {
                            state = N;
                            
                            printf("\n請輸入要刪除的帳號: ");
                            scanf("%s", searchname);
                            
                            for (j = 0; j < SIZE; j++) {
                                if (!strcmp(userID[j], searchname)) {
                                    state = Y;
                                    counter--;
                                    break;
                                }
                            }
                            
                            if (state == Y) {
                                for (j; j < SIZE; j++) {
                                    strcpy(userID[j], userID[j + 1]);
                                    strcpy(userCODE[j], userCODE[j + 1]);
                                }
                                
                                printf("\n%s 的帳號資料已刪除\n", searchname);
                            }
                            else if (state == N) {
                                printf("\n%s 的帳號資料不存在,無法刪除\n", searchname);
                            }
                            continue;
                        }
                        
                        // sort 為排序指令
                        if (!strcmp(instruction, "sort")) {
                            for (j = 1; j < SIZE - 1; j++) {
                                for (k = 2; k < SIZE; k++) {
                                    if (userID[k - 1][0] > userID[k][0]) {
                                        strcpy(tempName, userID[k - 1]);
                                        strcpy(tempCode, userCODE[k - 1]);
                                        strcpy(userID[k - 1], userID[k]);
                                        strcpy(userCODE[k - 1], userCODE[k]);
                                        strcpy(userID[k], tempName);
                                        strcpy(userCODE[k], tempCode);
                                    }
                                }
                            }
                            counter = 1;
                            
                            printf("\n資料已排序完成\n");
                            continue;
                        }
                    } 
                    
                    printf("\n\n您即將離開管理模式,請重新登入....\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;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:nc8.c
    功能:利用 while 迴圈設計的登入系統
    作者:張凱慶
    時間:西元2010年7月 */


程式說明及編譯執行,請繼續參考




沒有留言: