欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C++】【简单ATM取款系统】

程序员文章站 2024-02-27 21:19:51
...

写在前面的话

  禹州两周的实训任务,实际上两天就写的差不多了。写的很简单,只有一份"源.cpp";三个类: 用户、账本、收支记录。大纲是仿照着教材上面写的,自己按实训要求补充了一些东西。

任务要求

银行卡项目

主功能页面

  1. 用户注册
    用户注册要求:
    卡号:由用户自己输入,要求全部为0-9数字至少10位,最高13位
    密码:必须包含:数字、字母、下划线,且倒数第三位必须是‘@’字符
    可以注册多个用户,而且用户名不能重复注册
  1. 用户登录
    用户根据用户名密码进行登录。如果三次密码错误,冻结一天。
  1. 取钱功能
    用户可以选择
    (1). 100
    (2). 200
    (3). 300
    (4). 400
    (5). 500
    (6). 1000
    (7). 其他金额输入金额
    (0). 返回上一层
  1. 存钱功能
    用户可以输入金额点存入,那么余额自动加上存入的钱
  1. 收支明细
    用户点此功能自动显示存取款的明细表,要求显示:日期时间、以及存钱或者取钱
    每页显示5条,要求可以翻页显示。
  1. 查询余额
    显示用户的余额
  1. 计算器
    要求能支持最高50位数的加减。
  1. 备注
    所有用户名、密码、余额可存放在一个文件中。每个用户名下的收支明细为单独一个文件。



运行截图


欢迎菜单页面

【C++】【简单ATM取款系统】

主菜单页面

【C++】【简单ATM取款系统】

用户注册页面

【C++】【简单ATM取款系统】

用户登录页面

【C++】【简单ATM取款系统】

用户菜单页面

【C++】【简单ATM取款系统】

取钱功能页面

【C++】【简单ATM取款系统】

存钱功能页面

【C++】【简单ATM取款系统】

收支明细查询页面

【C++】【简单ATM取款系统】

余额查询页面

【C++】【简单ATM取款系统】

计算器功能页面

【C++】【简单ATM取款系统】
【C++】【简单ATM取款系统】



代码实现


收支记录类

类的声明:

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

相关标签: C++ ATM