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

C語言實戰:模擬銀行ATM系統完整代碼解析

     編輯:關於C語言

專案概述

本文詳細解析一個使用 C 語言編寫的銀行 ATM 模擬系統。該程式實現了密碼驗證、存款、取款、轉帳、利息計算等核心銀行業務功能,展示了結構化程式設計的基本思想,適合初學者學習檔案操作、函式模組化與迴流控制。

核心功能模組

1. 歡迎介面與密碼驗證

程式啟動時顯示歡迎横幅,隨即進入密碼驗證流程。使用 getch() 隱藏輸入字元,並以星號 * 回顯,最多允許嘗試三次。預設密碼為 123456,驗證成功後進入主選單,失敗則鎖定帳戶並退出。

2. 主選單與服務分發

主迴圈持續顯示服務選單:

  • 1. 存款:輸入金額,增加帳戶餘額。
  • 2. 取款:輸入金額,扣減帳戶餘額(未做餘額不足檢查)。
  • 3. 轉帳:輸入金額,扣減餘額(模擬轉出)。
  • 4. 計息:輸入存款年限,按年利率 3.5% 計算複利,逐年顯示利息與本金累計。
  • 0. 退出:結束服務並顯示感謝訊息。

使用 switch-case 結構分發功能,配合全域變數 sum_money 維護餘額狀態。

3. 利息計算演算法

Count_rate() 函式採用複利公式:

for(i=1; i<=year; i++) {
    interest = sum_money * interest_rate;
    sum_money += interest;
    printf("%2d year, interest:%f, sum:%f\n", i, interest, sum_money);
}

每年結息一次,本金滾動增長,直觀展示複利效應。

程式碼亮點與改進建議

  • 模組化設計:各功能獨立封裝為函式,主流程清晰。
  • 安全性缺陷:密碼硬編碼於原始碼,生產環境應加密儲存;取款/轉帳缺乏餘額檢查,易導致負餘額。
  • 輸入健壯性:scanf() 無錯誤處理,非數字輸入會導致死迴圈,建議改用 fgets() + sscanf()。
  • 跨平台相容:使用 conio.h 的 getch() 僅限 Windows,Linux/macOS 需用 termios 實現無回顯輸入。

完整原始碼

/**************************************************************
 **** Auther: liuyongshui
 ***** About: This is the BANK ATM application
 ****** Date: 20130511
 **************************************************************/
#include <stdio.h>
#include <string.h>
#include <conio.h>

#define INTEREST_RATE 0.035

float sum_money = 654321.0;
float interest_rate = 0.035;

void Star(void);
void Choice(void);
int Check_password(void);
void Deposit_money(void);
void Withdraw_money(void);
void Transfer_money(void);
void Count_rate(void);

int main() {
    int num, mark, sign = 1;
    Star();
    printf("\t\tWELCOME TO LEDUODUO BANK\t\t\t\t\n");
    mark = Check_password();
    if (mark) {
        printf("LOGIN SUCCESSFUL!\n");
    } else {
        printf("SORRY, LOGIN FAILED!\n");
        sign = 0;
    }

    while (1) {
        if (sign == 0) {
            printf("\nService terminated by user!\n");
            break;
        }
        Choice();
        printf("\nPlease select a service NUMBER: ");
        scanf("%d", &num);
        switch (num) {
            case 1: Deposit_money(); break;
            case 2: Withdraw_money(); break;
            case 3: Transfer_money(); break;
            case 4: Count_rate(); break;
            case 0: sign = 0; break;
            default: printf("Invalid option!\n");
        }
    }
    printf("Thank you for using our service!\n");
    Star();
    return 0;
}

// 繪製分隔線
void Star(void) {
    for (int i = 0; i < 60; i++) printf("*");
    printf("\n");
}

// 顯示選單
void Choice(void) {
    printf("\nPlease select a service:\n");
    printf("\t1: Deposit\n\t2: Withdraw\n\t3: Transfer\n\t4: Interest Calculation\n\t0: Quit\n\n");
}

// 密碼驗證(最多 3 次)
int Check_password(void) {
    char ch, code[10] = {'\0'}, password[10] = "123456";
    int i, j, k, flag;
    for (i = 0; i < 3; i++) {
        printf("Please enter 6-digit PIN: ");
        k = 0; flag = 1;
        while ((ch = getch()) != '\r' && k < 6) {
            putchar('*');
            code[k++] = ch;
        }
        for (j = 0; j < 6; j++) {
            if (password[j] != code[j]) { flag = 0; break; }
        }
        if (flag) {
            printf("\nPIN correct!\n");
            return 1;
        } else {
            if (i < 2) printf("\nWrong PIN! Try again.\n");
            else printf("\nAccount locked after 3 failed attempts!\n");
        }
    }
    return 0;
}

// 存款
void Deposit_money(void) {
    float money;
    printf("\n--- Deposit ---\nEnter amount: ");
    scanf("%f", &money);
    sum_money += money;
    printf("Current balance: %.2f\n", sum_money);
    Star();
}

// 取款
void Withdraw_money(void) {
    float money;
    printf("\n--- Withdraw ---\nEnter amount: ");
    scanf("%f", &money);
    sum_money -= money;
    printf("Withdrawn: %.2f, Balance: %.2f\n", money, sum_money);
    Star();
}

// 轉帳
void Transfer_money(void) {
    float money;
    printf("\n--- Transfer ---\nEnter amount: ");
    scanf("%f", &money);
    sum_money -= money;
    printf("Transferred: %.2f, Balance: %.2f\n", money, sum_money);
    Star();
}

// 計息
void Count_rate(void) {
    int year, i;
    float interest;
    printf("\n--- Interest Calculation ---\nEnter years: ");
    scanf("%d", &year);
    for (i = 1; i <= year; i++) {
        interest = sum_money * interest_rate;
        sum_money += interest;
        printf("Year %2d: Interest = %.2f, Total = %.2f\n", i, interest, sum_money);
    }
    Star();
}

ATM 程式執行畫面

延伸學習方向

  1. 引入結構體 Account 管理多用戶資料,配合檔案 I/O 持久化。
  2. 加入交易記錄功能,使用連結串列或動態陣列儲存流水號、時間、金額、類型。
  3. 使用 mutex 或檔案鎖實現多執行緒/多進程下的併發安全。
  4. 移植至圖形介面(GTK/Qt)或網頁後端(CGI/FastCGI),體驗全棧開發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved