当前位置: 首页 > news >正文

C++课设:银行账户管理系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《编程项目实战》

目录

    • 一、系统架构设计:面向对象的艺术
      • 1. 核心类设计
      • 2. 封装特性的体现
    • 二、完整代码与核心功能
      • 1. 完整代码
      • 2. 账号生成算法
      • 3. 转账业务的安全实现
      • 4. 密码安全处理
    • 三、数据持久化与文件操作
      • 1. CSV格式的数据存储
      • 2. 文件操作的最佳实践
    • 四、用户界面设计与交互体验
      • 1. 菜单驱动的界面设计
      • 2. 状态管理机制
      • 3. 国际化支持
    • 五、安全性与错误处理
      • 1. 输入验证机制
      • 2. 异常处理策略
      • 3. 用户友好的错误提示
    • 总结

在这个数字化时代,银行系统的安全性和效率至关重要。今天我们将深入探讨一个用C++编写的银行账户管理系统,它不仅展示了面向对象编程的精髓,还体现了现代软件开发的最佳实践。这个系统支持开户、登录、存取款、转账等核心功能,是学习C++和系统设计很好的案例。

一、系统架构设计:面向对象的艺术

1. 核心类设计

我们的银行系统采用了经典的面向对象设计,主要包含两个核心类:

  • Account类:封装了账户的基本信息和操作
  • BankSystem类:管理整个银行系统的业务逻辑

面向对象编程以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。让我们看看这些特性在我们的系统中是如何体现的:

class Account {
private:string accountNumber;    // 账号string accountName;      // 账户名string password;         // 密码double balance;          // 余额public:// 构造函数、存取款方法等bool deposit(double amount);bool withdraw(double amount);bool verifyPassword(string pwd) const;
};

在这里插入图片描述

2. 封装特性的体现

封装(Encapsulation)是面向对象编程的基石之一。封装是将数据(属性)和操作这些数据的方法(行为)捆绑在一个单元(类)中,同时隐藏对象的内部细节。

在我们的Account类中:

  • private成员变量:accountNumberpasswordbalance等敏感信息被隐藏
  • public接口方法:deposit()withdraw()等提供受控访问
  • 数据验证:所有操作都经过严格的参数检查

二、完整代码与核心功能

1. 完整代码

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#include <conio.h>
#include <windows.h>
#include <ctime>
#include <cstdlib>
#include <sstream>
#include <algorithm>using namespace std;// 设置控制台编码支持中文显示
void setConsoleEncoding() {SetConsoleOutputCP(936);  // 设置为GBK编码system("chcp 936");       // 切换到GBK代码页system("cls");
}// 将数字转换为字符串(兼容C++98)
string doubleToString(double value) {stringstream ss;ss << fixed << setprecision(2) << value;return ss.str();
}// 将字符串转换为double(兼容C++98)
double stringToDouble(const string& str) {return atof(str.c_str());
}// 将整数转换为字符串(兼容C++98)
string intToString(int value) {stringstream ss;ss << value;return ss.str();
}// 账户类
class Account {
private:string accountNumber;    // 账号string accountName;      // 账户名string password;         // 密码double balance;          // 余额public:// 构造函数Account() : balance(0.0) {}Account(string accNum, string name, string pwd, double bal) : accountNumber(accNum), accountName(name), password(pwd), balance(bal) {}// Getter方法string getAccountNumber() const { return accountNumber; }string getAccountName() const { return accountName; }string getPassword() const { return password; }double getBalance() const { return balance; }// Setter方法void setPassword(string pwd) { password = pwd; }void setBalance(double bal) { balance = bal; }// 存款bool deposit(double amount) {if (amount > 0) {balance += amount;return true;}return false;}// 取款bool withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;return true;}return false;}// 验证密码bool verifyPassword(string pwd) const {return password == pwd;}// 显示账户信息void displayAccount() const {cout << "+--------------------------------+" << endl;cout << "|          账户信息              |" << endl;cout << "+--------------------------------+" << endl;cout << "| 账号: " << setw(23) << left << accountNumber << " |" << endl;cout << "| 户名: " << setw(23) << left << accountName << " |" << endl;cout << "| 余额: " << setw(23) << left << (string("¥") + doubleToString(balance)) << " |" << endl;cout << "+--------------------------------+" << endl;}// 转换为字符串用于文件存储string toString() const {return accountNumber + "," + accountName + "," + password + "," + doubleToString(balance);}// 从字符串创建账户对象static Account fromString(const string& str) {size_t pos1 = str.find(',');size_t pos2 = str.find(',', pos1 + 1);size_t pos3 = str.find(',', pos2 + 1);string accNum = str.substr(0, pos1);string name = str.substr(pos1 + 1, pos2 - pos1 - 1);string pwd = str.substr(pos2 + 1, pos3 - pos2 - 1);double bal = stringToDouble(str.substr(pos3 + 1));return Account(accNum, name, pwd, bal);}
};// 银行系统类
class BankSystem {
private:vector<Account> accounts;string filename;Account* currentUser;public:// 构造函数BankSystem(string file) : filename(file), currentUser(NULL) {loadAccounts();}// 默认构造函数BankSystem() : filename("accounts.txt"), currentUser(NULL) {loadAccounts();}// 析构函数~BankSystem() {saveAccounts();}// 生成账号string generateAccountNumber() {srand((unsigned)time(0));string accNum = "62";for (int i = 0; i < 14; i++) {accNum += intToString(rand() % 10);}// 确保账号唯一for (size_t i = 0; i < accounts.size(); i++) {if (accounts[i].getAccountNumber() == accNum) {return generateAccountNumber(); // 递归重新生成}}return accNum;}// 开户bool openAccount(string name, string password) {if (name.empty() || password.empty()) {cout << "[错误] 账户名和密码不能为空!" << endl;return false;}string accountNumber = generateAccountNumber();Account newAccount(accountNumber, name, password, 0.0);accounts.push_back(newAccount);cout << "[成功] 开户成功!" << endl;cout << "您的账号是: " << accountNumber << endl;cout << "请妥善保管您的账号和密码!" << endl;saveAccounts();return true;}// 用户登录bool login(string accountNumber, string password) {for (size_t i = 0; i < accounts.size(); i++) {if (accounts[i].getAccountNumber() == accountNumber && accounts[i].verifyPassword(password)) {currentUser = &accounts[i];cout << "[成功] 登录成功!欢迎 " << accounts[i].getAccountName() << "!" << endl;return true;}}cout << "[错误] 账号或密码错误!" << endl;return false;}// 用户登出void logout() {if (currentUser) {cout << "再见," << currentUser->getAccountName() << "!" << endl;currentUser = NULL;saveAccounts();}}// 存款bool deposit(double amount) {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return false;}if (amount <= 0) {cout << "[错误] 存款金额必须大于0!" << endl;return false;}currentUser->deposit(amount);cout << "[成功] 存款成功!存入金额: ¥" << fixed << setprecision(2) << amount << endl;cout << "当前余额: ¥" << currentUser->getBalance() << endl;saveAccounts();return true;}// 取款bool withdraw(double amount) {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return false;}if (amount <= 0) {cout << "[错误] 取款金额必须大于0!" << endl;return false;}if (amount > currentUser->getBalance()) {cout << "[错误] 余额不足!当前余额: ¥" << fixed << setprecision(2) << currentUser->getBalance() << endl;return false;}currentUser->withdraw(amount);cout << "[成功] 取款成功!取出金额: ¥" << fixed << setprecision(2) << amount << endl;cout << "当前余额: ¥" << currentUser->getBalance() << endl;saveAccounts();return true;}// 转账bool transfer(string targetAccount, double amount) {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return false;}if (amount <= 0) {cout << "[错误] 转账金额必须大于0!" << endl;return false;}if (amount > currentUser->getBalance()) {cout << "[错误] 余额不足!当前余额: ¥" << fixed << setprecision(2) << currentUser->getBalance() << endl;return false;}if (targetAccount == currentUser->getAccountNumber()) {cout << "[错误] 不能向自己的账户转账!" << endl;return false;}// 查找目标账户Account* target = NULL;for (size_t i = 0; i < accounts.size(); i++) {if (accounts[i].getAccountNumber() == targetAccount) {target = &accounts[i];break;}}if (!target) {cout << "[错误] 目标账户不存在!" << endl;return false;}// 执行转账currentUser->withdraw(amount);target->deposit(amount);cout << "[成功] 转账成功!" << endl;cout << "转账金额: ¥" << fixed << setprecision(2) << amount << endl;cout << "目标账户: " << targetAccount << " (" << target->getAccountName() << ")" << endl;cout << "当前余额: ¥" << currentUser->getBalance() << endl;saveAccounts();return true;}// 查询余额void queryBalance() {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return;}currentUser->displayAccount();}// 修改密码bool changePassword(string oldPassword, string newPassword) {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return false;}if (!currentUser->verifyPassword(oldPassword)) {cout << "[错误] 原密码错误!" << endl;return false;}if (newPassword.empty()) {cout << "[错误] 新密码不能为空!" << endl;return false;}currentUser->setPassword(newPassword);cout << "[成功] 密码修改成功!" << endl;saveAccounts();return true;}// 加载账户数据void loadAccounts() {ifstream file(filename.c_str());if (file.is_open()) {string line;while (getline(file, line)) {if (!line.empty()) {accounts.push_back(Account::fromString(line));}}file.close();}}// 保存账户数据void saveAccounts() {ofstream file(filename.c_str());if (file.is_open()) {for (size_t i = 0; i < accounts.size(); i++) {file << accounts[i].toString() << endl;}file.close();}}// 检查是否已登录bool isLoggedIn() const {return currentUser != NULL;}// 获取当前用户名string getCurrentUserName() const {return currentUser ? currentUser->getAccountName() : "";}
};// 输入密码(隐藏显示)
string inputPassword() {string password;char ch;while ((ch = getch()) != '\r') {  // Enter键if (ch == '\b') {  // Backspace键if (!password.empty()) {password.erase(password.length() - 1);cout << "\b \b";}} else {password += ch;cout << '*';}}cout << endl;return password;
}// 显示主菜单
void showMainMenu() {cout << "\n+===================================+" << endl;cout << "|        银行账户管理系统           |" << endl;cout << "+===================================+" << endl;cout << "|  1. 用户登录                      |" << endl;cout << "|  2. 开户申请                      |" << endl;cout << "|  0. 退出系统                      |" << endl;cout << "+===================================+" << endl;cout << "请选择功能 (0-2): ";
}// 显示用户菜单
void showUserMenu(const string& userName) {cout << "\n+===================================+" << endl;cout << "|        欢迎 " << setw(20) << left << userName << "|" << endl;cout << "+===================================+" << endl;cout << "|  1. 账户查询                      |" << endl;cout << "|  2. 存款业务                      |" << endl;cout << "|  3. 取款业务                      |" << endl;cout << "|  4. 转账业务                      |" << endl;cout << "|  5. 修改密码                      |" << endl;cout << "|  0. 退出登录                      |" << endl;cout << "+===================================+" << endl;cout << "请选择功能 (0-5): ";
}// 主函数
int main() {setConsoleEncoding();BankSystem bank;int choice;cout << "欢迎使用银行账户管理系统!" << endl;while (true) {if (!bank.isLoggedIn()) {// 未登录状态showMainMenu();cin >> choice;switch (choice) {case 1: {  // 用户登录string accountNumber, password;cout << "\n=== 用户登录 ===" << endl;cout << "请输入账号: ";cin >> accountNumber;cout << "请输入密码: ";password = inputPassword();bank.login(accountNumber, password);break;}case 2: {  // 开户申请string name, password;cout << "\n=== 开户申请 ===" << endl;cout << "请输入账户名: ";cin >> name;cout << "请设置密码: ";password = inputPassword();bank.openAccount(name, password);break;}case 0:  // 退出系统cout << "\n感谢使用银行账户管理系统,再见!" << endl;return 0;default:cout << "[错误] 无效选择,请重新输入!" << endl;break;}} else {// 已登录状态showUserMenu(bank.getCurrentUserName());cin >> choice;switch (choice) {case 1:  // 账户查询cout << "\n=== 账户查询 ===" << endl;bank.queryBalance();break;case 2: {  // 存款业务double amount;cout << "\n=== 存款业务 ===" << endl;cout << "请输入存款金额: ¥";cin >> amount;bank.deposit(amount);break;}case 3: {  // 取款业务double amount;cout << "\n=== 取款业务 ===" << endl;cout << "请输入取款金额: ¥";cin >> amount;bank.withdraw(amount);break;}case 4: {  // 转账业务string targetAccount;double amount;cout << "\n=== 转账业务 ===" << endl;cout << "请输入目标账号: ";cin >> targetAccount;cout << "请输入转账金额: ¥";cin >> amount;bank.transfer(targetAccount, amount);break;}case 5: {  // 修改密码string oldPassword, newPassword;cout << "\n=== 修改密码 ===" << endl;cout << "请输入原密码: ";oldPassword = inputPassword();cout << "请输入新密码: ";newPassword = inputPassword();bank.changePassword(oldPassword, newPassword);break;}case 0:  // 退出登录bank.logout();break;default:cout << "[错误] 无效选择,请重新输入!" << endl;break;}}cout << "\n按任意键继续...";getch();system("cls");}return 0;
}

效果预览:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 账号生成算法

系统采用智能的账号生成策略,确保每个账号的唯一性

string generateAccountNumber() {srand((unsigned)time(0));string accNum = "62";  // 银行标识码for (int i = 0; i < 14; i++) {accNum += intToString(rand() % 10);}// 递归确保唯一性for (size_t i = 0; i < accounts.size(); i++) {if (accounts[i].getAccountNumber() == accNum) {return generateAccountNumber();}}return accNum;
}

在这里插入图片描述

3. 转账业务的安全实现

转账功能体现了业务逻辑的完整性

bool transfer(string targetAccount, double amount) {// 多重安全检查if (!currentUser) return false;if (amount <= 0) return false;if (amount > currentUser->getBalance()) return false;if (targetAccount == currentUser->getAccountNumber()) return false;// 原子性操作currentUser->withdraw(amount);target->deposit(amount);saveAccounts();  // 立即持久化return true;
}

4. 密码安全处理

系统实现了密码的隐藏输入,提升了用户体验和安全性:

string inputPassword() {string password;char ch;while ((ch = getch()) != '\r') {if (ch == '\b') {  // 支持退格if (!password.empty()) {password.erase(password.length() - 1);cout << "\b \b";}} else {password += ch;cout << '*';  // 显示星号}}return password;
}

在这里插入图片描述

三、数据持久化与文件操作

1. CSV格式的数据存储

系统采用CSV格式进行数据持久化,既简单又可读:

// 数据序列化
string toString() const {return accountNumber + "," + accountName + "," + password + "," + doubleToString(balance);
}// 数据反序列化
static Account fromString(const string& str) {size_t pos1 = str.find(',');size_t pos2 = str.find(',', pos1 + 1);size_t pos3 = str.find(',', pos2 + 1);// 解析各字段...return Account(accNum, name, pwd, bal);
}

2. 文件操作的最佳实践

文件读写操作确保了数据的持久性:

void saveAccounts() {ofstream file(filename.c_str());if (file.is_open()) {for (size_t i = 0; i < accounts.size(); i++) {file << accounts[i].toString() << endl;}file.close();}
}

四、用户界面设计与交互体验

1. 菜单驱动的界面设计

系统采用层次化菜单结构,提供直观的用户体验:

void showMainMenu() {cout << "\n+===================================+" << endl;cout << "|        银行账户管理系统           |" << endl;cout << "+===================================+" << endl;cout << "|  1. 用户登录                      |" << endl;cout << "|  2. 开户申请                      |" << endl;cout << "|  0. 退出系统                      |" << endl;cout << "+===================================+" << endl;
}

在这里插入图片描述

2. 状态管理机制

系统通过状态模式管理用户的登录状态:

  • 未登录状态:只能访问登录和开户功能

在这里插入图片描述

  • 已登录状态:可以进行完整的银行业务操作

在这里插入图片描述

3. 国际化支持

系统特别考虑了中文显示的兼容性:

void setConsoleEncoding() {SetConsoleOutputCP(936);  // GBK编码system("chcp 936");system("cls");
}

五、安全性与错误处理

1. 输入验证机制

系统实现了多层次的输入验证

bool deposit(double amount) {if (!currentUser) {cout << "[错误] 请先登录!" << endl;return false;}if (amount <= 0) {cout << "[错误] 存款金额必须大于0!" << endl;return false;}// 执行业务逻辑...
}

在这里插入图片描述

2. 异常处理策略

  • 身份验证:严格的密码验证机制
  • 业务规则:余额检查、转账限制等
  • 数据完整性:文件操作的错误处理

3. 用户友好的错误提示

系统提供了清晰的错误信息成功反馈

[成功] 转账成功!
转账金额: ¥1000.00
目标账户: 621234567890123456 (张三)
当前余额: ¥5000.00

总结

这个银行账户管理系统虽然简洁,但麻雀虽小,五脏俱全。它完美展示了面向对象编程的精髓,体现了封装、继承、多态等核心概念在实际项目中的应用。

这个系统为学习者提供了一个实践C++面向对象编程的平台,通过分析和运行这些代码,可以更好地理解面向对象编程的各个方面。

对于C++初学者来说,这是一个绝佳的学习案例;对于有经验的开发者,它提供了系统设计的思路和最佳实践的参考。在当今AI驱动的软件开发时代,掌握这样的基础系统设计能力,依然是每个程序员的核心竞争力。

下一步,你准备好在这个基础上构建属于自己的银行系统了吗?

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

相关文章:

  • 智慧货运飞船多维度可视化管控系统
  • 华为设备OSPF配置与实战指南
  • 内网穿透之Linux版客户端安装(神卓互联)
  • Docker 常用命令详解
  • 大模型高效提示词Prompt编写指南
  • 电脑频繁黑屏怎么办
  • 探索分布式存储与通信:去中心化共享及通訊(DSAC)
  • 以人类演示视频为提示,学习可泛化的机器人策略
  • 技术文档的降维打击:3大原则+5步结构+CSDN流量密码
  • springboot--实战--大事件--文章分类接口开发详解
  • 从Node.js到React/Vue3:流式输出技术的全栈实现指南
  • 【设计模式-4.9】行为型——命令模式
  • CentOS 7 修改为静态 IP 地址完整指南
  • 一起学Spring AI:核心概念
  • 高防服务器价格高原因分析
  • 掌握 MotionLayout:交互动画开发
  • hadoop集群单词统计(ssh与web)
  • 【Unity】R3 CSharp 响应式编程 - 使用篇(集合)(三)
  • 星闪开发之Server-Client 指令交互控制OLED灯案例
  • 【后端】RPC
  • 网站建设企业宣传口号/工程建设数字化管理平台
  • 邢台做网站建设优化制作公司金信/厦门seo搜索排名
  • wap手机网站建设方案/it培训班出来现状
  • 网站开发小结/廊坊关键词排名优化
  • 做哪个视频网站赚钱/建站软件
  • 东莞网站推广衣裙/对网站进行seo优化