首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言實作 ATM 系統:結構體、鏈表、檔案持久化完整教學

     編輯:關於C

系統架構概覽

本專案模擬自動櫃員機核心流程:帳戶驗證、存取款、查詢餘額、修改密碼、資料持久化。採用模組化設計,核心資料結構為單向鏈表,檔案作為離線儲存。

核心資料結構

// User.h
typedef struct User {
    char UserAccount[17];   // 16 位卡號 + '\0'
    char UserPassword[7];   // 6 位密碼 + '\0'
    int  Money;             // 餘額(分為單位)
    struct User *next;      // 鏈表指標
} User;

User *head = NULL;          // 鏈表頭
User *Current_user = NULL;  // 當前登入用戶

模組劃分

模組職責關鍵函式
UI選單顯示、畫面清理showMenu()
FileController帳戶檔案讀寫、初始化initdata(), writeIntoFile()
AccountController帳戶查找、密碼驗證、存取款邏輯checkAccount(), WithDraw(), Deposit()
Main主流程控制、使用者互動startATM(), OperationMenu()

關鍵演算法細節

1. 檔案初始化與載入

void initdata(FILE *fp, const char *path) {
    if (fopen_s(&fp, path, "r+") == 0 && fgetc(fp) == EOF) {
        // 檔案不存在或為空,寫入預設測試帳戶
        initFile(fp, path);
    }
    rewind(fp);
    User *user = (User*)malloc(sizeof(User));
    Current_user = head = user;
    while (fscanf_s(fp, "%16s %6s %d\n", user->UserAccount, 17,
                               user->UserPassword, 7,
                               &user->Money) != EOF) {
        user->next = (User*)malloc(sizeof(User));
        user = user->next;
    }
    fclose(fp);
}

注意:fscanf_s 需指定緩衝區大小,防止緩衝區溢位。

2. 帳戶查找(線性搜尋)

bool checkAccount(const char *account, User **outUser) {
    User *p = head;
    while (p) {
        if (strcmp(p->UserAccount, account) == 0) {
            *outUser = p;
            Current_user = p;
            return true;
        }
        p = p->next;
    }
    return false;
}

3. 密碼驗證與輸入掩碼

void InputPassword(const char *account, char *pwd) {
    int i = 0;
    system("cls");
    printf("用戶名:"); showAccount(account);
    printf("\n請輸入密碼:");
    while ((pwd[i] = _getch()) != '\r') {
        if (pwd[i] == 8 && i > 0) { i--; pwd[i] = '\0'; } // 退格
        else if (pwd[i] >= '0' && pwd[i] <= '9' && i < 6) { i++; }
        system("cls");
        printf("用戶名:"); showAccount(account);
        printf("\n請輸入密碼:");
        for (int k = 0; k < i; ++k) putchar('*');
    }
    pwd[i] = '\0';
}

4. 交易邏輯(以取款為例)

void WithDraw(int amount) {
    if (amount > Current_user->Money) {
        printf("餘額不足\n"); return;
    }
    Current_user->Money -= amount;
    printf("取款成功,餘額:%d\n", Current_user->Money);
}

主流程狀態機

  1. InputAccount → 輸入卡號
  2. checkAccount → 帳戶存在性檢查
  3. 最多 3 次 InputPassword + checkPassword
  4. 登入成功進入 OperationMenu 循環:
  5. 1. 取款 2. 存款 3. 查詢 4. 改密 5. 退卡
  6. 退出時 writeIntoFile 將鏈表資料覆寫回檔案

編譯與執行

gcc Main.c User.c UI.c FileController.c AccountController.c -o atm
./atm

依賴:Windows 平台需 conio.h(_getch)、system("cls");Linux 可替換為 termios 非標準輸入與 ANSI 轉義序列。

潛在改進方向

  • 引入雜湊表(帳號為 Key)將查找從 O(n) 降為 O(1)。
  • 使用 SQLite 替代平面檔案,支援並發與交易。
  • 密碼儲存改為鹽值雜湊(bcrypt/Argon2),而非明文。
  • 增加交易流水記錄(時間、類型、金額、餘額)。
  • 跨平台抽象層:封裝清屏、無回顯輸入、延遲等 OS 相關操作。

完整原始碼結構

ATM/
├── Main.c
├── User.h
├── UI.h
├── FileController.h
├── AccountController.h
└── Makefile

各模組 .c 檔對應 .h 實作,主程式 Main.c 統籌流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved