【C++】【简单ATM取款系统】
程序员文章站
2024-02-27 21:19:51
...
【C++】【简单ATM取款系统】
写在前面的话
禹州两周的实训任务,实际上两天就写的差不多了。写的很简单,只有一份"源.cpp";三个类: 用户、账本、收支记录。大纲是仿照着教材上面写的,自己按实训要求补充了一些东西。
任务要求
- 银行卡项目
-
主功能页面:
-
-
用户注册
用户注册要求:
卡号:由用户自己输入,要求全部为0-9数字至少10位,最高13位
密码:必须包含:数字、字母、下划线,且倒数第三位必须是‘@’字符
可以注册多个用户,而且用户名不能重复注册
-
用户注册
-
-
用户登录
用户根据用户名密码进行登录。如果三次密码错误,冻结一天。
-
用户登录
-
-
取钱功能
用户可以选择
(1). 100
(2). 200
(3). 300
(4). 400
(5). 500
(6). 1000
(7). 其他金额输入金额
(0). 返回上一层
-
取钱功能
-
-
存钱功能
用户可以输入金额点存入,那么余额自动加上存入的钱
-
存钱功能
-
-
收支明细
用户点此功能自动显示存取款的明细表,要求显示:日期时间、以及存钱或者取钱
每页显示5条,要求可以翻页显示。
-
收支明细
-
-
查询余额
显示用户的余额
-
查询余额
-
-
计算器
要求能支持最高50位数的加减。
-
计算器
-
-
备注
所有用户名、密码、余额可存放在一个文件中。每个用户名下的收支明细为单独一个文件。
-
备注
运行截图
欢迎菜单页面
主菜单页面
用户注册页面
用户登录页面
用户菜单页面
取钱功能页面
存钱功能页面
收支明细查询页面
余额查询页面
计算器功能页面
代码实现
收支记录类
类的声明:
class AccountRecord {
private:
time_t FreeTime; //账号解冻时间
vector<pr> Income; //收支记录
int Income_cnt; //收支记录数量
public:
friend class AccountItem; //用户友元类
AccountRecord(); //构造函数
void Write(ofstream&); //写入文档
AccountRecord& Read(ifstream&); //从文档读入
time_t GetFreeTime(); //获取解冻时间
vector<pr> GetIncome(); //获取收支记录
void UpdateFreeTime(time_t); //更新解冻时间
void UpdateIncome(vector<pr>); //更新收支记录
void Free_Account(); //冻结账号一天
bool Is_Free(); //检测账号是否被冻结
void Add_Income(pr); //增加收支记录
void DispalyIncome(); //输出收支明细
};//操作记录类
类的定义:
/******************* 用户操作记录类函数 *********************/
AccountRecord::AccountRecord() { FreeTime = time(NULL); Income.clear(); Income_cnt = 0; }//构造函数
time_t AccountRecord::GetFreeTime() { return FreeTime; }//获取解冻时间
vector<pr> AccountRecord::GetIncome() { return Income; } //获取收支记录
void AccountRecord::Free_Account() { time_t t; time(&t); t += 60 * 60 * 24; FreeTime = t; }//冻结账号一天
bool AccountRecord::Is_Free() { time_t t; return time(&t) <= FreeTime; }//检查账号是否被冻结
void AccountRecord::Add_Income(pr temp) {
Income.push_back(temp);
Income_cnt = Income.size();
}//增加收支记录
void AccountRecord::UpdateFreeTime(time_t t) { FreeTime = t; }
void AccountRecord::UpdateIncome(vector<pr> vec) { Income.assign(vec.begin(), vec.end()); Income_cnt = Income.size(); }
void AccountRecord::DispalyIncome() {
if (Income.empty()) { cout << "当前用户无收支情况!" << endl; SPC; return; }
int Size = Income.size(), Page = Size % 5 ? Size / 5 + 1 : Size / 5;
for (int i = 0, j = 0; i < Page;) {
PRINTL;
printf("当前显示为第%d页\t共%d页\n\n", i + 1, Page);
printf("\t\t日期\t\t\t收支金额\n");
for (int k = j; k < j + 5 && k < Size; ++k) {
printf("%8d. ", k + 1); Get_Time(Income[k].first); cout << "\t\t";
if (Income[k].second < 0) cout << "取出 "; else cout << "存入 ";
cout << fabs(Income[k].second) << endl;
}
PRINTL;
printf("\tP.上一页\tN.下一页\n\tA.输入页面进行查询\n\t0.返回上一层\n");
PRINTL;
printf("请输入选项前的代码以继续操作:"); string str; cin >> str;
int op = 0; if (str == "P") op = -1; else if (str == "N") op = 1;
else if (str == "0") { cout << "正在退出,请稍后...\n"; SPC; return; }
else if (str == "A") {
cout << "请输入您需要跳转的页面:";
cin >> str; int switch_on = String_To_Int(str);
if (switch_on >= 1 && switch_on <= Page) { i = switch_on - 1; j = i * 5; }
else { printf("输入页数不存在,请重新输入!\n"); SPC; continue; }
}
else { cout << "错误的命令,请重新输入!" << endl; SPC; continue; }
if ((i + op >= 0) && (i + op < Page)) { i += op; j = i * 5; }
else { cout << "访问的页面不存在,请重新输入!" << endl; SPC; continue; }
cout << "正在跳转,请稍后..." << endl; SPC;
}
}//输出收支明细
void AccountRecord::Write(ofstream& s) {
s << Income_cnt << endl;
for (auto it = Income.begin(); it != Income.end(); ++it)
s << it->first << " " << it->second << endl;
}
AccountRecord& AccountRecord::Read(ifstream& s) {
int n; s >> n;
for (int i = 0; i < n; ++i) {
pr temp; s >> temp.first >> temp.second; Income.push_back(temp);
}
return *this;
}
用户类
类的声明:
class AccountItem {
private:
string m_Anumber; //账号
string m_Password; //密码
string m_Name; //姓名
double m_Balance; //存款余额
AccountRecord m_Record; //操作记录
public:
AccountItem(); //无参构造函数
AccountItem(string, string, string, double); //构造函数
void Display(); //显示对象
void Write(ofstream&); //写入文档
void Read(ifstream&); //从文档读出
string GetNumber();//取账号。返回对象的账户
string GetPassword(); //取密码。返回对象的密码
double GetBalance(); //取存款余额。返回对象的存款金额
string GetName(); //取账户姓名。返回对象的账户姓名
AccountRecord& GetRecord(); //取操作记录
void UpdatePassword(string); //修改密码。
void UpdateBalance(double); //赋值存款余额。
void UpdateName(string); //修改账户姓名。
void DeductBalance(double); //修改存款余额。从当前对象的余额存款中减去参数表示的钱款。
string Input_PassWord(); //输入密码并显示*号
bool CheckNumber(string);//检测账号。判断输入的账户是否合法。若合法,返回true;否则返回false。
bool CheckPassWord(string);//检测密码。判断输入的密码是否合法。若合法,返回true;否则返回false。
bool IsNull(); //判空。判断对象的账户是否为空
void Draw_Save_Money(int); //取钱
void DisplayBalance(); //查询余额
};//用户类
类的定义:
/******************* 用户类函数 *********************/
AccountItem::AccountItem() { m_Anumber = m_Password = m_Name = ""; m_Balance = 0; } //无参构造函数
AccountItem::AccountItem(string Anumber, string Password, string Name, const double Balance) {
m_Anumber = Anumber; m_Password = Password; m_Name = Name; m_Balance = Balance;
}//构造函数
void AccountItem::Display() {
PRINTL;
cout << "账号: " << m_Anumber << endl; cout << "密码: " << m_Password << endl;
cout << "姓名: " << m_Name << endl; cout << "存款余额: " << m_Balance << endl;
PRINTL;
} //显示对象
void AccountItem::DisplayBalance() {
PRINTX;
cout << "\t查询账户:" << m_Anumber << endl;
cout << "\t客主姓名:" << m_Name << endl;
cout << "\t当前余额为:"; printf("%f\n", m_Balance);
PRINTX;
SPC;
} //查询余额
void AccountItem::Write(ofstream& s) {
s << m_Anumber << endl; s << m_Password << endl;
s << m_Name << endl; s << m_Balance << endl;
s << m_Record.FreeTime << endl;
}//修改账目
void AccountItem::Read(ifstream& s) {
s >> m_Anumber >> m_Password >> m_Name >> m_Balance >> m_Record.FreeTime;
}//从输入流读入数据
bool AccountItem::CheckNumber(string Anumber) {
int len = Anumber.size();
if (len < 10 || len > 13) return false; //至少10位,最高13位
for (int i = 0; i < len; ++i) if (Anumber[i] < '0' || Anumber[i] > '9') return false; //全部为0-9数字
return true;
} //检测账号合法性
bool AccountItem::CheckPassWord(string PassWord) {
int len = PassWord.size(); if (len < 4) return false; //长度至少为4位
bool digit, alpha, underline; digit = alpha = underline = false;
for (int i = 0; i < len; ++i)
if (PassWord[i] >= '0' && PassWord[i] <= '9') digit = true; //包含数字
else if (PassWord[i] >= 'a' && PassWord[i] <= 'z' || PassWord[i] >= 'A' && PassWord[i] <= 'Z') alpha = true; //包含字母
else if (PassWord[i] == '_') underline = true; //包含下划线
bool aite = true; if (PassWord[len - 3] != '@') aite = false; //倒数第三位必须是‘@’字符
if (aite && digit && alpha && underline) return true; return false;
} //检查密码合法性
string AccountItem::GetNumber() { return m_Anumber; }//取账号
string AccountItem::GetPassword() { return m_Password; }//取密码
AccountRecord& AccountItem::GetRecord() { return m_Record; }//取操作记录,返回其引用
void AccountItem::DeductBalance(double Pay) { m_Balance += Pay; }//修改存款金额
double AccountItem::GetBalance() { return m_Balance; }//存款金额
string AccountItem::GetName() { return m_Name; }//取账户姓名
void AccountItem::UpdatePassword(string Password) { m_Password = Password; }//修改密码。
void AccountItem::UpdateBalance(double Balance) { m_Balance = Balance; } //修改存款余额。
void AccountItem::UpdateName(string Name) { m_Name = Name; } //修改账户姓名。
void AccountItem::Draw_Save_Money(int Select) {
string op = Select ? "取出" : "存入";
while (true) {
PRINTL;
cout << "请选择需要" << op << "钱的数量:" << endl;
cout << "\t1、100" << endl; cout << "\t2、200" << endl;
cout << "\t3、300" << endl; cout << "\t4、400" << endl;
cout << "\t5、500" << endl; cout << "\t6、1000" << endl;
cout << "\t7、其他金额(输入金额)" << endl; cout << "\t0、返回上一层" << endl;
PRINTL;
printf("请输入选项前的数字以继续操作:"); string str; cin >> str; int Count = String_To_Int(str);
ll AccountCount = 0;
switch (Count) {
case 1: AccountCount = 100; break;
case 2: AccountCount = 200; break;
case 3: AccountCount = 300; break;
case 4: AccountCount = 400; break;
case 5: AccountCount = 500; break;
case 6: AccountCount = 1000; break;
case 7:
cout << "请输入您需要" << op << "的金额(整百的倍数):" << endl;
cin >> str; AccountCount = String_To_Int(str); break;
case 0: cout << "正在退出系统中,请稍后..." << endl; SPC; return;
default: cout << "错误的命令,请重新输入!" << endl; SPC; continue;
}
if (AccountCount % 100) { cout << "请输入整百倍数的金额!" << endl; SPC; continue; }
//判断存款是否足够
AccountCount = Select ? -AccountCount : AccountCount;
if (m_Balance < -AccountCount) { cout << "取款失败,余额不足!" << endl; SPC; continue; }
else {
cout << "\n即将" << op << abs(AccountCount) << "元,是否确认?\n" << endl;
cout << " Y.确认" << op << " " << "\tN.取消" << op << endl << endl;
string Yes_No; cout << "请输入您的选择:"; cin >> Yes_No;
if (Yes_No == "Y" || Yes_No == "y") {
DeductBalance(AccountCount); //修改对象的存款余额
time_t t; m_Record.Add_Income(pr(time(&t), AccountCount));
MyAccountbook.UpdateItem(*this); //修改账目本
save();//将修改后的账目本写到文件中
cout << op << "成功!" << endl; SPC; return;
}
else if (Yes_No == "N" || Yes_No == "n") {
cout << "已取消" << op << "操作!" << endl; SPC; return;
}
else {
cout << "错误的命令,请重新输入!" << endl; SPC;
}
}
}
}//存取钱
bool AccountItem::IsNull() { if (m_Anumber == "") return true; return false; }//判空
string AccountItem::Input_PassWord() {
string PassWord; PassWord.clear();
char ch; while (ch = getch(), ch != '\r' && ch != '\n') {
if (ch != 8) { //不是退格就录入
PassWord.push_back(ch); putchar('*'); //并输出*号
}
else {
//这里是删除一个,我们通过输出退格符\b,回退一个,输出空格盖住刚才的*,再回撤一格等待输入
putchar('\b'); putchar(' '); putchar('\b');
if (!PassWord.empty()) PassWord.pop_back();
}
}
putchar('\n'); return PassWord;
}//输入密码并显示*号
账本类
类的声明:
class Accountbook {
private:
vector<AccountItem> m_Account; //AccountItem对象数组
int m_AccountCount; //数组中的对象个数
public:
Accountbook(); //构造函数
int LoadAccountItem(ifstream&); //加载账号信息
void StoreAccountItem(ofstream&); //保存账号信息
void LoadAccountRecord(ifstream&); //加载收支明细
void StoreAccountRecord(ofstream&); //保存收支明细
void User_Register(); //用户注册
void User_Login(); //用户登录
AccountItem FindItem(string); //在账本本中查询
void AddItem(AccountItem); //新增一个用户
bool UpdateItem(AccountItem); //修改账目中的一个记录
void Clear(); //清空账本
};//账本类
类的定义:
/******************* 账本类函数 *********************/
Accountbook::Accountbook() { m_Account.clear(); m_AccountCount = 0; };//构造函数
int Accountbook::LoadAccountItem(ifstream& InputStream) {
while (true) {
AccountItem temp; temp.Read(InputStream);
if (InputStream.fail()) break;
else m_Account.push_back(temp);
}
m_AccountCount = m_Account.size();
return m_AccountCount; //返回读入对象的个数
} //从文件中读入对象
void Accountbook::StoreAccountItem(ofstream& OutputStream) {
for (auto it = m_Account.begin(); it != m_Account.end(); ++it) it->Write(OutputStream);
}//将对象输出到文件
void Accountbook::LoadAccountRecord(ifstream& InputStream) {
for (auto it = m_Account.begin(); it != m_Account.end(); ++it) {
AccountRecord Record; Record.Read(InputStream);
it->GetRecord().UpdateIncome(Record.GetIncome());
}
}
void Accountbook::StoreAccountRecord(ofstream& OutputStream) {
for (auto it = m_Account.begin(); it != m_Account.end(); ++it) it->GetRecord().Write(OutputStream);
}//保存收支明细
AccountItem Accountbook::FindItem(string _No) {
for (auto it = m_Account.begin(); it != m_Account.end(); ++it)
if (it->GetNumber() == _No) return *it; //若查询到,返回该对象
return AccountItem(); //若未查询到,返回一个空对象
} //按给定账户在账目本中查询
void Accountbook::AddItem(AccountItem Item) { m_Account.push_back(Item); m_AccountCount = m_Account.size(); }//新增用户
bool Accountbook::UpdateItem(AccountItem Item) {
//按账号在账目本中查询账户与所给对象相同的对象
for (auto it = m_Account.begin(); it != m_Account.end(); ++it) {
if (it->GetNumber() == Item.GetNumber()) {
it->UpdatePassword(Item.GetPassword()); //密码
it->UpdateName(Item.GetName()); //姓名
it->UpdateBalance(Item.GetBalance()); //余额
it->GetRecord().UpdateFreeTime(Item.GetRecord().GetFreeTime()); //解冻时间
it->GetRecord().UpdateIncome(Item.GetRecord().GetIncome()); //收支记录
return true; //如查询到,修改对象内容
}
}
return false;
} //按所给对象修改对象内容, 但是账户不能修改
void Accountbook::Clear() { m_Account.clear(); m_AccountCount = 0; }//清空账本
void Accountbook::User_Register() { //用户注册
AccountItem NewItem;
while (true) {
PRINTL;
cout << "请输入您需要注册的卡号(10~13位数字)(输入-1返回主菜单):" << endl;
string AccountNo; cin >> AccountNo;
if (AccountNo == "-1") { system("cls"); return; }
if (NewItem.CheckNumber(AccountNo)) {
AccountItem FountItem = MyAccountbook.FindItem(AccountNo);
if (FountItem.IsNull()) {
string AccPassword[2]; cout << "请输入密码(必须包含:数字、字母、下划线,且倒数第三位必须是‘@’字符): " << endl;
AccPassword[0] = NewItem.Input_PassWord();
if (NewItem.CheckPassWord(AccPassword[0])) {
cout << "请再次确认密码: " << endl; AccPassword[1] = NewItem.Input_PassWord();
if (AccPassword[0] == AccPassword[1]) {
string AccountName; cout << "请输入您的姓名:" << endl; cin >> AccountName;
NewItem = AccountItem(AccountNo, AccPassword[0], AccountName, 0);
MyAccountbook.AddItem(NewItem); save();
cout << "注册成功!" << endl; SPC; return;
}
else { cout << "第二次密码与第一次输入不匹配,请重新注册!" << endl; SPC; }
}
else { cout << "密码输入格式不正确,请重新注册!" << endl; SPC; }
}
else { cout << "该账户已被注册,请重新输入!" << endl; SPC; }
}
else { cout << "卡号输入格式不正确,请重新输入!" << endl; SPC; }
}
}
void Accountbook::User_Login() { //用户登录
AccountItem NewItem;
while (true) {
PRINTL;
cout << "请输入您需要登录的账号(输入-1返回主菜单):" << endl;
string AccountNo; cin >> AccountNo; system("cls");
if (AccountNo == "-1") { system("cls"); return; }
AccountItem FountItem = MyAccountbook.FindItem(AccountNo);
if (!FountItem.IsNull()) {
//Get_Time(FountItem.GetRecord().GetFreeTime());
if (FountItem.GetRecord().Is_Free()) {
PRINTL; cout << "\n账号" << AccountNo << " 已被冻结。\n请于"; Get_Time(FountItem.GetRecord().GetFreeTime());
cout << "之后重试!\n\n", PRINTL; SPC; return;
}
int i = 0; for (; i < 3; ++i) {
PRINTL;
cout << "用户:" << AccountNo << " 您好!\n温馨提示:" << endl;
cout << "(密码由数字、字母、下划线组成,且倒数第三位是‘@’字符)" << endl;
cout << "(连续输入错误三次,账号将被冻结一天!)" << endl;
cout << "(不输入密码直接按回车键即可退出本界面)" << endl;
PRINTL;
printf("请输入您的密码(第%d次尝试):\n", i + 1);
string AccPassWord = NewItem.Input_PassWord();
if (AccPassWord == "") { system("cls"); return; }
if (AccPassWord == FountItem.GetPassword()) {
cout << "身份验证通过!正在跳转..." << endl; SPC;
User_Menu(FountItem); return;
}
else { cout << "密码错误,请重试!" << endl; SPC; }
}
if (i == 3) {
PRINTL;
FountItem.GetRecord().Free_Account();
cout << "连续三次密码错误,该账户已被冻结一天!" << endl;
cout << "请于"; Get_Time(FountItem.GetRecord().GetFreeTime()); cout << "之后重试!" << endl;
MyAccountbook.UpdateItem(FountItem); save();
PRINTL; SPC; return;
}
}
else { PRINTL; cout << "账户" << AccountNo << "不存在,请重新输入!" << endl; PRINTL; SPC; }
}
}
大整数类
类的声明:
class BigNumber {
private:
bool unsign; //unsign true为正, false为负
//vector<char> digit;
string digit; //存倒序的数字
public:
BigNumber(); //无参构造函数
BigNumber(int); //整数转大整数
BigNumber(string&); //字符串转大整数
friend BigNumber operator+(BigNumber, BigNumber); //重载'+'号运算符,加法
friend BigNumber operator-(BigNumber, BigNumber); //重载'-'号运算符,减法
friend bool operator<(const BigNumber&, const BigNumber&); //重载'<'运算符
friend BigNumber operator-(const BigNumber&); //重载'-'号运算符,得相反数
friend istream& operator>>(istream&, BigNumber&); //重载输入运算符
friend ostream& operator<<(ostream&, const BigNumber&); //重载输出运算符
}; //大整数类
类的定义:
/******************* 大整数类函数 *********************/
BigNumber::BigNumber() { unsign = true; digit.clear(); }//无参构造函数
BigNumber::BigNumber(int num) {
if (num >= 0) unsign = true;
else { unsign = false; num *= -1; }
digit.clear();
do {
digit.push_back((char)num % 10);
num /= 10;
} while (num);
} //整数转大整数
BigNumber::BigNumber(string& str) {
digit.clear(); unsign = true;
for (auto it = str.rbegin(); it != str.rend(); ++it) {
if (*it >= '0' && *it <= '9') digit.push_back(*it - '0');
else if (*it == '-') unsign = false;
}
}//字符串转大整数
BigNumber operator+(BigNumber a, BigNumber b) {
BigNumber c;
if (a.unsign == b.unsign) { //符号相同
c.unsign = a.unsign;
string::iterator ita = a.digit.begin(), itb = b.digit.begin();
for (; ita != a.digit.end() && itb != b.digit.end(); ++ita, ++itb)
c.digit.push_back(*ita + *itb);
while (ita != a.digit.end()) { c.digit.push_back(*ita); ++ita; }
while (itb != b.digit.end()) { c.digit.push_back(*itb); ++itb; }
string::iterator itc = c.digit.begin();
char to_add = 0; //进位
for (; itc != c.digit.end(); ++itc) {
*itc += to_add;
to_add = *itc / 10;
*itc %= 10;
}
if (to_add) c.digit.push_back(to_add);
}
else {
if (a.unsign && !b.unsign) c = a - (-b); // 3 + (-2)
else if (!a.unsign && b.unsign) c = b - (-a); //(-1) + 4
}
return c;
}//重载'+'号运算符
BigNumber operator-(BigNumber a, BigNumber b) {
BigNumber c;
if (a.unsign == b.unsign) {
//99 - 3
//3 - 99
if (b < a) {
c.unsign = true;
if (!a.unsign && !b.unsign) swap(a, b);
}//44 - 22
else {
c.unsign = false;
if (a.unsign && b.unsign) swap(a, b);
}//22 - 44
string::iterator ita = a.digit.begin(), itb = b.digit.begin();
for (; ita != a.digit.end() && itb != b.digit.end(); ++ita, ++itb)
c.digit.push_back(*ita - *itb);
while (ita != a.digit.end()) { c.digit.push_back(*ita); ++ita; }
while (itb != b.digit.end()) { c.digit.push_back(*itb); ++itb; }
string::iterator itc = c.digit.begin();
char to_sub = 0; //借位
for (; itc != c.digit.end(); ++itc) {
*itc -= to_sub; to_sub = 0;
if (*itc >= 0) continue;
*itc += 10;
to_sub = 1;
}
while (c.digit.size() && !c.digit[c.digit.size() - 1]) c.digit.pop_back(); //去前导0
if (c.digit.empty()) { c.digit.push_back((char)0); c.unsign = true; } // 2 - 2
}
else c = a + (-b); //3 - (-4) //(-2) - 5
/*if (a.unsign && !b.unsign)
else if (!a.unsign && b.unsign) c = a + (-b);
}*/
return c;
} //重载'-'号运算符
bool operator<(const BigNumber& a, const BigNumber& b) {
if (a.unsign && !b.unsign) return false; //3 > -2
else if (!a.unsign && b.unsign) return true; //-2 < 3
bool small = false;
int lena = a.digit.size(), lenb = b.digit.size();
if (lena > lenb) small = false; //33 > 1
else if (lena < lenb) small = true; // 1 < 33
else {
int i = lena - 1, j = lenb - 1;
while (i >= 0 && a.digit[i] == b.digit[j]) --i, --j;
if (i >= 0 && a.digit[i] > b.digit[j]) small = false; //332 > 331
if (i >= 0 && a.digit[i] < b.digit[j]) small = true; //331 < 332
}
if (!a.unsign && !b.unsign) return !small; //-3 < -2
return small;
}//重载'<'运算符
BigNumber operator-(const BigNumber& x) {
BigNumber c; c = x; c.unsign = !c.unsign; return c;
}//重载'-'号运算符,得相反数
istream& operator>>(istream& in, BigNumber& x) {
string a; in >> a; x = a;
return in;
}//重载输入运算符
ostream& operator<<(ostream& out, const BigNumber& x) {
if (!x.unsign) out << "-";
for (auto it = x.digit.rbegin(); it != x.digit.rend(); ++it) out << (char)(*it + '0');
return out;
}//重载输出运算符
菜单项函数
函数声明:
/******************* 菜单项 *********************/
void Main_Menu(); //主菜单
void User_Menu(AccountItem); //用户菜单
void Welcome_Page(); //欢迎页面
void Manual(); //使用手册
void Producer_Infor(); //制作人员信息
函数定义:
/******************* 菜单项函数 *********************/
void Main_Menu() {
while (true) {
system("color 60");
PRINTX;
cout << "尊敬的用户,您好!" << endl;
cout << "当前系统时间:"; time_t t; Get_Time(time(&t)); cout << endl;
PRINTX;
cout << "\t\t1.用户注册" << endl;
cout << "\t\t2.用户登录" << endl;
cout << "\t\t0.退出系统" << endl;
PRINTX;
printf("请输入选项前的数字以继续操作:"); string op; cin >> op;
int switch_on = String_To_Int(op); system("cls");
switch (switch_on) {
case 1: MyAccountbook.User_Register(); break;
case 2: MyAccountbook.User_Login(); break;
case 3: break;
case 0: return;
default: printf("错误的指令,请重新输入!\n"); SPC; break;
}
}
}
void User_Menu(AccountItem Item) {
while (true) {
system("color 30");
PRINTX;
cout << "尊敬的用户" << Item.GetNumber() << ": 您好!" << endl;
cout << "当前系统时间:"; time_t t; Get_Time(time(&t)); cout << endl;
PRINTX;
cout << "\t\t1.取钱功能" << endl;
cout << "\t\t2.存钱功能" << endl;
cout << "\t\t3.收支明细" << endl;
cout << "\t\t4.查询余额" << endl;
cout << "\t\t5.计算器" << endl;
cout << "\t\t0.返回主菜单" << endl;
PRINTX;
printf("请输入选项前的数字以继续操作:"); string op; cin >> op;
int switch_on = String_To_Int(op); system("cls");
switch (switch_on) {
case 1: Item.Draw_Save_Money(1); break;
case 2: Item.Draw_Save_Money(0); break;
case 3: Item.GetRecord().DispalyIncome(); break;
case 4: Item.DisplayBalance(); break;
case 5: Calculator(); break;
case 0: return;
default: printf("错误的指令,请重新输入!\n"); SPC; break;
}
}
}//用户菜单
void Welcome_Page() {
while (true) {
system("color 1A");
PRINTL;
printf("欢迎使用本自动取款机系统!\n");
printf("使用过程中如遇技术问题请及时联系制作人员!\n");
PRINTL;
printf("\t1、进入系统\n");
printf("\t2、查看制作人员信息\n");
printf("\t3、查看本系统使用手册\n");
printf("\t0、退出系统\n");
PRINTL;
printf("请输入选项前的数字以继续操作:");
string op; cin >> op;
int switch_on = String_To_Int(op); system("cls");
switch (switch_on) {
case 1: Main_Menu(); break;
case 2: Producer_Infor(); break;
case 3: Manual(); break;
case 0: return;
default: printf("错误的指令,请重新输入!\n"); SPC; break;
}
}
}//欢迎页面
void Producer_Infor() {
printf("****************************************\n");
printf("* 制作者信息如下: *\n");
printf("* 姓名:lgc *\n");
printf("* 班级:计算机科学与技术18-1班 *\n");
printf("* 学号:5418******** *\n");
printf("* 电话:187******** *\n");
printf("* QQ:26******** *\n");
printf("****************************************\n");
SPC;
}//制作人员信息
void Manual() {
printf("*******************************************************************************\n");
printf("用户须知:\n初始管理员账户:gz007\t密码:20000308\n证件号:5418********\n\n");
printf("鉴于制作人员水平有限。\n请严格按照系统提示进行操作,以免引起程序奔溃!!!\n");
printf("*******************************************************************************\n");
SPC;
}//使用手册
杂项函数
函数声明:
/******************* 杂项 *********************/
void save(); //存档
void load(); //读档
int String_To_Int(string);//字符串变成整数
void Get_Time(time_t); //输出时间
void Calculator(); //计算器
函数定义:
/******************* 杂项功能函数 *********************/
void save() { //存档
ofstream OutputStream("Account.in"); //打开要写的文件
MyAccountbook.StoreAccountItem(OutputStream);
OutputStream.close(); //关闭文件
OutputStream.open("Account2.in");
MyAccountbook.StoreAccountRecord(OutputStream);
OutputStream.close(); //关闭文件
}
void load() { //读档
ifstream InStream("Account.in"); //打开要读的文件
MyAccountbook.LoadAccountItem(InStream);
InStream.close(); //关闭文件
InStream.open("Account2.in");
MyAccountbook.LoadAccountRecord(InStream);
InStream.close(); //关闭文件
}
int String_To_Int(string op) { //字符串变成整数
int sum = 0;
for (auto it = op.begin(); it != op.end(); ++it)
if (*it >= '0' && *it <= '9') sum = sum * 10 + (*it - '0');
else return -1;
return sum;
}
void Get_Time(time_t tim) {
struct tm* at; at = localtime(&tim);
char now[80]; strftime(now, 79, "%Y-%m-%d %H:%M:%S", at);
printf("%s", now);
}//输出时间
void Calculator() {
while (true) {
PRINTX;
cout << " 欢迎使用计算器! 暂仅支持(正负)整数的加减法计算" << endl;
cout << "\t\t1.加法计算" << endl;
cout << "\t\t2.减法计算" << endl;
cout << "\t\t0.返回用户菜单" << endl;
PRINTX;
cout << "输入操作前的序号以继续:"; string op; cin >> op;
int switch_on = String_To_Int(op); system("cls");
switch (switch_on) {
case 1: op = "+"; break;
case 2: op = "-"; break;
case 0: return;
default: printf("错误的指令,请重新输入!\n"); SPC; continue;
}
PRINTX;
cout << "当前正在执行";
if (op == "+") cout << "加法"; else if (op == "-") cout << "减法"; cout << "操作:" << endl;
BigNumber A; cout << "请输入第一个整数:"; cin >> A;
BigNumber B; cout << "请输入第二个整数:"; cin >> B;
BigNumber C; if (op == "+") C = A + B; else if (op == "-") C = A - B;
cout << "计算结果如下:\n" << A << " " << op << " " << B << " = " << C << endl;
PRINTX; SPC;
}
} //计算器
主函数部分
头文件部分:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<conio.h>
#include<ctime>
#include<cmath>
#include<cstdlib>
#include<string>
#include<vector>
#include<algorithm>
//冻结屏幕,清屏
#define SPC system("pause"); system("cls");
#define PRINTX printf("*************************************************\n");
#define PRINTL printf("+---------------------------------------------+\n");
using namespace std;
typedef pair<time_t, double> pr; //为pair型结构重命名
typedef long long ll; //为long long型重命名
主函数部分:
/******************* 主函数部分 *********************/
static Accountbook MyAccountbook; //总账本
int main() {
load(); //加载文件
Welcome_Page(); //进入欢迎页
printf("\n\t退出系统成功,祝您生活愉快!\n\n"); SPC;
return 0;
}
心得总结
写这种大项目的经验少,多文件编程也不会,说到底这份代码只是在完成任务,并不是一个真正的项目,还是太菜了,如有错误,欢迎各位大佬指正。orz
上一篇: 二十五.前后端联调OSS服务
下一篇: 微信开发中mysql字符编码问题