本文詳細解析一個使用 C 語言編寫的銀行 ATM 模擬系統。該程式實現了密碼驗證、存款、取款、轉帳、利息計算等核心銀行業務功能,展示了結構化程式設計的基本思想,適合初學者學習檔案操作、函式模組化與迴流控制。
程式啟動時顯示歡迎横幅,隨即進入密碼驗證流程。使用 getch() 隱藏輸入字元,並以星號 * 回顯,最多允許嘗試三次。預設密碼為 123456,驗證成功後進入主選單,失敗則鎖定帳戶並退出。
主迴圈持續顯示服務選單:
使用 switch-case 結構分發功能,配合全域變數 sum_money 維護餘額狀態。
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();
}
Account 管理多用戶資料,配合檔案 I/O 持久化。mutex 或檔案鎖實現多執行緒/多進程下的併發安全。