我估计看了以下该模拟程序的要求可能会有一些人会怀疑是不是和我一个学校的,没错,咱们就是一个学校的,当初大一的时候看到这个实验整个人都懵了,完全不会玩,因此最后也是求助别人,但是其实也没看懂别人几百行的代码。前一段时间也是听导师说这个程序是教我们C++的一个经典的实验,自学了Java之后对类的使用和理解也才算真正是入门了。个人觉得这个实验值得一做,所以就去看了当时的实验要求并开始写这个程序。整个程序大概写了四五小时左右。
代码主要使用类来进行实现,因为面向对象设计嘛。由于要实现一个账户转账给另一个账户转账,从银行的角度来设计需要用到数据库了,这里并不要求我们这么麻烦,所以在写了LoanAccount借款账户之后马上实例化了一个对象,因为会在DepositAccount存款账户中需要用到。基本信息储存在account.in文件中,操作之后其中的数据也会随之改变,当然你要是想保留数据可以把运行后的数据输出到另一个文本文档中。
这个程序最关键的是先做需求分析,一个ATM需要具有哪些功能(当初自己这点就完全没想,所以啥也写不出来)。如果你是大佬觉得代码不行请跳过,如果你还属于小白无法写出这个程序,我希望本文能对您有所帮助,切勿题都不看直接copy,博主不希望你没有实质性的收获,因为代码较长,可能会上传有误,若发现代码运行不成功,请评论留言,同时欢迎讨论,下面是实验要求。
ATM模拟程序能够完成ATM的主要功能,包括:
1.显示欢迎词及提示信息;
2.用户插卡,ATM验证用户账号及密码有效性,输入错误3次即被锁卡;
3.用户的帐户有两类,一类是存款帐户,一类是借款帐户,存款帐户里的钱是用户自己的钱, 借款帐户无余额只有信用额度和已借银行的钱.。
4.存款帐户的可以查询余额:初始余额为10000元;
5.借款帐户的可以查询当前欠银行的钱的数量和信用额度;
6.存款帐户和借款帐户都可以取款,每次取款额为100的整数倍,有单笔和单日金额限制,存款帐户的余额不能为负,借款帐户欠的钱不能超过信用额度;
7.存款帐户的可以转账,可将本账户中的存款转入其它账户,转入账户账号需两次输入确认;
8.借款帐户的可以接受还款(转账),接收其它存款账户将钱转入本账户;
9.修改密码:密码为6位数字,新密码需要两次输入确认;
10.退卡。
设计实现命令行界面,界面应友好、方便操作。参考界面如图1所示。
程序所涉及到的用户资料、银行帐户、存取款记录等信息保存在数据文件中。其中银行账户的格式如下:
Account.h头文件
#ifndef Atmprogram
#define Atmprogram
#include <iostream>
#include <string>
using namespace std;
class Account
{
private:
string userAccount; //用户账号
string userName; //用户姓名
string idCard; //用户身份证
string userPassword; //用户密码
public:
Account(string account, string name, string id, string pwd)
{
userAccount = account;
userName = name;
idCard = id;
userPassword = pwd;
}
void setAccount(string account)
{
userAccount = account;
}
void setName(string name)
{
userName = name;
}
void setId(string id)
{
idCard = id;
}
void setPassword(string pwd)
{
userPassword = pwd;
}
string getAccount()
{
return userAccount;
}
string getName()
{
return userName;
}
string getId()
{
return idCard;
}
string getPassword()
{
return userPassword;
}
void getCard() //插卡交互界面
{
cout << "----------------------欢迎来到中国银行----------------------" << endl;
cout << "请插入您的银行卡" << endl;
cout << "请稍等,系统正在确认..." << endl;
cout << "请输入你的密码(温馨提示:输入错误3次即被锁卡):";
string password;
for (int i = 0; i < 3; i++)
{
cin >> password;
if (password == getPassword())
{
cout << "恭喜您登陆成功" << endl;
operate();
break;
}
else if (i == 2)
cout << "您已经输错密码三次,系统自动锁卡,请于次日凭身份证领卡" << endl;
else
cout << "您的密码有误,请重新输入(您还有" << 2 - i << "次重输机会):";
}
cout << "----------------------期待下次为您服务----------------------" << endl;
}
void changePassword() //修改密码
{
string pwd1, pwd2;
cout << "请输入新的密码:";
while (true)
{
cin >> pwd1;
if (pwd1 == getPassword())
cout << "新密码不能与旧密码相同,请重新输入新的密码:";
else
break;
}
cout << "请确认新的密码:";
cin >> pwd2;
if (pwd1 == pwd2)
{
setPassword(pwd1);
cout << "密码修改成功\n"
<< endl;
}
else
cout << "前后密码不一致,修改失败\n"
<< endl;
}
virtual void operate(){};
virtual void withdraw(){};
};
class LoanAccount : public Account //借款账户
{
private:
int credit; //信用额度
int debt; //当前欠款
public:
LoanAccount(string account, string name, string id, string pwd, int cre, int dt) : Account(account, name, id, pwd)
{
credit = cre;
debt = dt;
}
int getCredit()
{
return credit;
}
int getDebt()
{
return debt;
}
void setCredit(int cre)
{
credit = cre;
}
void setDebt(int dt)
{
debt = dt;
}
void operate()
{
cout << "此账户为借款账户,以下为您的基本信息" << endl;
cout << "-------------------------------------" << endl;
cout << "账号 " << getAccount() << endl;
cout << "姓名 " << getName() << endl;
cout << "身份证 " << getId() << endl;
cout << "密码 " << getPassword() << endl;
cout << "信用额度 " << getCredit() << endl;
cout << "当前欠款 " << getDebt() << endl;
cout << "-------------------------------------" << endl;
cout << "----------------------本机提供以下服务----------------------" << endl;
int num;
while (true)
{
cout << "1.还款 2.取款 3.查询欠款 4.查询信用额度 5.修改密码 6.退卡" << endl;
cout << "请根据提示栏输入对应数字进入相应服务:";
cin >> num;
switch (num)
{
case 1:
repayment();
break;
case 2:
withdraw();
break;
case 3:
checkDebt();
break;
case 4:
checkCredit();
break;
case 5:
changePassword();
break;
case 6:
cout << "您已经退卡" << endl;
return;
default:
cout << "无效的输入,执行退卡" << endl;
return;
}
}
}
void repayment() //还款
{
if (getDebt() == 0)
cout << "您欠款已经还清,无需还款" << endl;
else
{
cout << "您目前待还" << getDebt() << "元" << endl;
int money;
cout << "请将您的存款整理好放入ATM机中并输入还款金额:";
cin >> money;
cout << "系统正在处理中..." << endl;
setDebt(getDebt() - money);
if (getDebt() == 0)
cout << "您本次还款" << money << "元,欠款已经还清,即将返回主界面...\n"
<< endl;
else
cout << "您本次还款" << money << "元,还有" << getDebt() << "元待还,即将返回主界面...\n"
<< endl;
}
}
void repayment(int money) //转账还款
{
setDebt(getDebt() - money);
}
void withdraw() //取款
{
int remain = getCredit() - getDebt();
if (remain < 100)
cout << "您的额度不足,无法进行取款" << endl;
else
{
cout << "请输入取款金额:";
int money;
static int withdraw2 = 0;
while (true)
{
cin >> money;
if (money % 100 == 0)
{
if (remain - money < 0)
{
cout << "您的余额不足,当前还可取" << remain << "元,请重新输入取款金额:";
}
else if (money > 5000)
{
cout << "单笔取款最大限额为5000元,请重新输入取款金额:";
}
else
{
if (withdraw2 + money > 14000)
{
cout << "单日最大取款金额为14000元,您今日还可以取" << 14000 - withdraw2 << "元,请重新输入取款金额:";
}
else
{
cout << "请稍等,系统正在处理中..." << endl;
setDebt(getDebt() + money);
withdraw2 += money;
cout << "取款成功,即将返回主界面...\n"
<< endl;
return;
}
}
}
else
cout << "每次取款额为100的整数倍,请重新输入取款金额:";
}
}
}
void checkDebt() //查询欠款
{
if (getDebt() == 0)
cout << "您的欠款已经还清" << endl;
else
{
cout << "您当前欠款:" << getDebt() << "元" << endl;
cout << "即将返回主界面...\n"
<< endl;
}
}
void checkCredit() //查询信用额度
{
cout << "您当前的信用额度为:" << getCredit() << "元" << endl;
cout << "即将返回主界面...\n"
<< endl;
}
};
LoanAccount loan("", "", "", "", 0, 0); //实例化一个借款账户,因为需要在存款账户的转账中用到
class DepositAccount : public Account //存款账户
{
private:
int balance; //用户余额
public:
DepositAccount(string account, string name, string id, string pwd, int bal) : Account(account, name, id, pwd)
{
balance = bal;
}
int getBal()
{
return balance;
}
void setBal(int bal)
{
balance = bal;
}
void operate()
{
cout << "此账户为存款账户,以下为您的基本信息" << endl;
cout << "-------------------------------------" << endl;
cout << "账号 " << getAccount() << endl;
cout << "姓名 " << getName() << endl;
cout << "身份证 " << getId() << endl;
cout << "密码 " << getPassword() << endl;
cout << "余额 " << getBal() << endl;
cout << "-------------------------------------" << endl;
cout << "----------------------本机提供以下服务----------------------" << endl;
int num;
while (true)
{
cout << "1.存款 2.取款 3.转账 4.查询余额 5.修改密码 6.退卡" << endl;
cout << "请根据提示栏输入对应数字进入相应服务:";
cin >> num;
switch (num)
{
case 1:
deposit();
break;
case 2:
withdraw();
break;
case 3:
transfer();
break;
case 4:
checkBalances();
break;
case 5:
changePassword();
break;
case 6:
cout << "您已经退卡" << endl;
return;
default:
cout << "无效的输入,执行退卡" << endl;
return;
}
}
}
void deposit() //存款
{
int money;
cout << "请将您的存款整理好放入ATM机中并输入存款金额:" << endl;
cin >> money;
cout << "系统正在处理中..." << endl;
setBal(getBal() + money);
cout << "存款成功,即将返回主界面...\n"
<< endl;
}
void withdraw() //取款
{
if (getBal() < 100)
cout << "您的余额不足,无法进行取款" << endl;
else
{
cout << "请输入取款金额:";
int money;
static int withdraw1 = 0;
while (true)
{
cin >> money;
if (money % 100 == 0)
{
if (getBal() - money < 0)
{
cout << "您的余额不足,请重新输入取款金额:";
}
else if (money > 1000)
{
cout << "单笔取款最大限额为1000元,请重新输入取款金额:";
}
else
{
if (withdraw1 + money > 5000)
{
cout << "单日最大取款金额为5000元,您今日还可以取" << 5000 - withdraw1 << "元,请重新输入取款金额:";
}
else
{
cout << "请稍等,系统正在处理中..." << endl;
setBal(getBal() - money);
withdraw1 += money;
cout << "取款成功,即将返回主界面...\n"
<< endl;
return;
}
}
}
else
cout << "每次取款额为100的整数倍,请重新输入取款金额:";
}
}
}
void transfer() //转账
{
while (true)
{
string account1, account2;
cout << "请输入转入账户账号:";
cin >> account1;
cout << "请确认转入账户账号:";
cin >> account2;
if (account1 == account2)
{
cout << "请耐心等待系统确认..." << endl;
cout << "确认完毕,请输入转账金额(取消转账请输入0):";
int money;
while (true)
{
cin >> money;
if (money == 0)
{
cout << "请稍等,系统正在取消转账..." << endl;
cout << "成功取消转账,即将返回主界面...\n"
<< endl;
return;
}
else if (money > getBal())
{
cout << "您的转账金额超出了您的余额!" << endl;
cout << "若您想继续转账,请重新输入金额(取消转账请输入0):";
}
else if (loan.getAccount() == account1)
{
cout << "系统正在处理中..." << endl;
if (money > loan.getDebt())
{
cout << "你所转账的借款账户只欠了" << loan.getDebt() << "元" << endl;
cout << "如果您同意只转账" << loan.getDebt() << "元请按1,按0重新输入金额:";
int flag;
cin >> flag;
if (flag == 1)
{
money = loan.getDebt();
loan.repayment(money);
setBal(getBal() - money);
cout << "转账成功,即将返回主界面...\n"
<< endl;
return;
}
else
{
cout << "请重新输入金额(取消转账请输入0):" << endl;
}
}
else
{
loan.repayment(money);
setBal(getBal() - money);
cout << "转账成功,即将返回主界面...\n"
<< endl;
return;
}
}
else
{
cout << "系统正在处理中..." << endl;
setBal(getBal() - money);
cout << "转账成功,即将返回主界面...\n"
<< endl;
return;
}
}
break;
}
else
cout << "两次账号输入不一致,请重新输入" << endl;
}
}
void checkBalances() //查询余额
{
cout << "您的余额为:" << getBal() << "元" << endl;
cout << "即将返回主界面...\n"
<< endl;
}
};
DepositAccount depo("", "", "", "", 0); //反正已经实例化了一个借款账户,顺便把存款账户也实例化了
#endif
ATM.cpp源文件
#include "Account.h"
#include <fstream>
void initDepo(DepositAccount &de, string str[4], int bal) //初始化存款账户
{
de.setAccount(str[0]);
de.setName(str[1]);
de.setId(str[2]);
de.setPassword(str[3]);
de.setBal(bal);
}
void initLoan(LoanAccount &lo, string str[], int cre, int debt) //初始化借款账户
{
lo.setAccount(str[0]);
lo.setName(str[1]);
lo.setId(str[2]);
lo.setPassword(str[3]);
lo.setCredit(cre);
lo.setDebt(debt);
}
void printDepo(DepositAccount de)
{
cout << de.getAccount() << " ";
cout << de.getName() << " ";
cout << de.getId() << " ";
cout << de.getPassword() << " ";
cout << de.getBal() << endl;
}
void printLoan(LoanAccount lo)
{
cout << lo.getAccount() << " ";
cout << lo.getName() << " ";
cout << lo.getId() << " ";
cout << lo.getPassword() << " ";
cout << lo.getCredit() << " ";
cout << lo.getDebt() << endl;
}
int main()
{
ifstream ifs;
ifs.open("account.in", ios::in);
string str[4];
int bal, cre, debt;
for (int i = 0; i < 4; i++)
ifs >> str[i];
ifs >> bal;
initDepo(depo, str, bal);
for (int i = 0; i < 4; i++)
ifs >> str[i];
ifs >> cre >> debt;
initLoan(loan, str, cre, debt);
ifs.close();
depo.getCard();
cout << endl;
loan.getCard();
freopen("account.in", "w", stdout);
printDepo(depo);
printLoan(loan);
return 0;
}
测试文件account.in
1234567891234567891 Peter 510225199908141234 123456 8000
2691843158321816816 Bob 500381199908141234 123456 20000 7000