EL.Gou的博客

EL.Gou的博客

ATM机模拟C++版:ATM_Simulator

功能要求:
    1. 模拟ATM(自动柜员机)主界面
    2. 模拟ATM(自动柜员机)的查询功能(Quary)
    3. 模拟ATM(自动柜员机)存款功能(Credit)
    4. 模拟ATM(自动柜员机)取款功能(Debit)
    5. 退出功能模块五(即:返回主界面return)
程序要求:
    1. 用字符数组保存用户卡号和密码,用以进行身份验证。
    2. 注意程序的健壮性(考虑输错密码多次的锁定,每日取款不超过20000元的限定,单笔不超过2000元的限定。)
    3. 用文件保存用户卡号和密码,用以进行身份验证
    4. 完成打印凭条的功能
    5. 异常处理(吞卡)
文件说明:
    1. ATM_Simulator.cpp为程序实现文件
    2. ATM_Simulator.dat为用户信息文件,第1~3行为日期信息,其中包含的信息有:账户名 、账户密码、账户状态、账户余额、今日已取款额等,每个用户的信息占用5行
    3. ATM_Simulator_Saving为用户存款凭证
    4. ATM_Simulator_GetMoney为用户取款凭证
算法思路:
    1. 主界面实现登陆功能,用户从主界面输入账户名,若不存在该账户名,则输出“该账户不存在”,并让用户重新输入;否则,输入密码,判断输入的密码是否符合当前账户的密码,若符合,则进入次级菜单(),否则,输出“密码错误”,并让用户重新输入密码,输入三次密码错误后,提示“为了您的账户安全,您的账户已被系统暂时限制服务,请联系工作人员处理!”,返回主界面。
    2.用户在次级界面选择功能;若选择查询功能,则显示当前账户名,并显示账户余额,用户确认后返回次级菜单;若选择存款功能,则请用户输入存款金额,确认后输出存入账户名(即当前账户名),存入金额,用户确认后修改当前用户余额,并返回次级菜单;若选择取款功能,则请用户输入取款金额,并且取款金额不能超过2000,若当前取款金额超过2000或者今日取款金额已超过20000,则输出提示信息,并返回次级菜单;若选择退出退出当前账户,则返回主菜单,重复步骤1。
注意事项:
    1. 存取款金额限制为100的整数倍

    2. 存款金额单次最大为10000

实现代码如下:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//文件名 : ATM_Simulator.cpp
//创建者 : EL_Gou
//创建日期 : 2017.04.15
//开发环境 : Visual Studio 2017
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
#include <ctime>

#define MAX_NUM 999

using namespace std;

//账户信息存储
class S_Info {
public:
	string Num;        //账户名
	string Passwd;        //账户密码
	int Signal;        //账户状态(正整数为正常状态,0为锁卡状态)
	double Value;        //账户余额
	double Limited;        //今日已取款额度
};

S_Info User_Info[MAX_NUM];

class S_User{
public:
	S_User();
	int Menu();        //菜单
	int UpdateFile();        //更新ATM_Sinulator.dat文件信息
	int GetInfo();        //读取用户信息
	int Identify();        //用户身份验证
	int Query();        //查询操作
	int Saving();        //存款操作
	int GetMoney();        //取款操作
	int Exit();        //退出当前账户
	int Time_Get();        //时间判断
private:
	int User_Num;        //用户位数记录
	int User_identify;        //用户数组位置标记
	//记录时间
	int year;        //年
	int mouth;        //月
	int day;        //文件读取日
	struct tm *time_p;
};

S_User::S_User()
{
	int User_Num = 0;
	int User_identify = 0;
	year = 0;
	mouth = 0;
	day = 0;
	for (int i = 0; i < MAX_NUM; i++)
	{
		User_Info[i].Value = 0;
		User_Info[i].Limited = 0;
	}
}

//时间判断
int S_User::Time_Get()
{
	time_t timer;
	timer = time(NULL);        //获得时间
	time_p = localtime(&timer);        //转换为本地时间
	//记录当前时间
	int t_year = time_p->tm_year + 1900;
	int t_mouth = time_p->tm_mon + 1;
	int t_day = time_p->tm_mday;
	int t_hour = time_p->tm_hour;
	int t_min = time_p->tm_min;
	int t_sec = time_p->tm_sec;
	//若当前已经为新的一天则刷新日取款限制
	//判断当前年份是否为新的年份,若是,则刷新日取款限制
	if (t_year > year)
	{
		for (int i = 0; i < User_Num; i++)
		{
			User_Info[i].Limited = 0;
		}
		//替代文件时间
		year = t_year;
		mouth = t_mouth;
		day = t_day;
		UpdateFile();        //将改动写入文件
	}
	//判断当前月份是否为新的月份,若是,则刷新日取款限制
	else if (t_mouth != mouth)
	{
		for (int i = 0; i < User_Num; i++)
		{
			User_Info[i].Limited = 0;
		}
		//替代文件时间
		year = t_year;
		mouth = t_mouth;
		day = t_day;
		UpdateFile();        //将改动写入文件
	}

	//判断当前日是否为新的一日,若是,则刷新日取款限制
	else if (t_day != day)
	{
		for (int i = 0; i < User_Num; i++)
		{
			User_Info[i].Limited = 0;
		}
		//替代文件时间
		year = t_year;
		mouth = t_mouth;
		day = t_day;
		UpdateFile();        //将改动写入文件
	}
	return 0;
}

//菜单
int S_User::Menu()
{
	Time_Get();
	int tmp;
	do {
		system("cls");
		cout << "  账户查询---------------------1" << endl;
		cout << "  存   款-----------------------2" << endl;
		cout << "  取   款-----------------------3" << endl;
		cout << "  退   出-----------------------0" << endl;
		cout << "请输入操作选项:";
		cin >> tmp;
	} while (tmp > 3 || tmp < 0);
	//按选项进行操作
	if (tmp == 1)
	{
		Query();        //查询操作
	}
	else if (tmp == 2)
	{
		Saving();        //存款操作
	}
	else if (tmp == 3)
	{
		GetMoney();        //取款操作
	}
	else if (tmp == 0)
	{
		Exit();        //退出当前账户
	}
	return 0;
}

//更新ATM_Sinulator.dat文件信息
int S_User::UpdateFile()
{
	//打开文件,准备写入信息
	ofstream outfile("ATM_Simulator.dat");
	outfile << year << endl;
	outfile << mouth << endl;
	outfile << day << endl;
	//向文件中写入信息
	for (int i = 0; i < User_Num; i++)
	{
		outfile << User_Info[i].Num << endl;
		outfile << User_Info[i].Passwd << endl;
		outfile << User_Info[i].Signal << endl;
		outfile << User_Info[i].Value << endl;
		outfile << User_Info[i].Limited << endl;
	}
	outfile.close();        //关闭文件
	return 0;
}

//读取用户信息
int S_User::GetInfo()
{
	//打开文件,准备读取信息
	ifstream infile("ATM_Simulator.dat");
	//读取日期信息
	infile >> year;
	infile >> mouth;
	infile >> day;
	int i = 0;
	//读取文件中的账户信息
	while (infile) 
	{
		infile >> User_Info[i].Num;
		infile >> User_Info[i].Passwd;
		infile >> User_Info[i].Signal;
		infile >> User_Info[i].Value;
		infile >> User_Info[i].Limited;
		i++;
	}
	User_Num = i - 1;
	infile.close();        //关闭文件
	return 0;
}

//用户身份验证
int S_User::Identify()
{
	GetInfo();
	system("cls");
	bool symbol = false;
	string tmp_num;
	string tmp_passwd;
	while (!symbol)
	{
		cout << "请输入账户名:";
		cin >> tmp_num;
		//查找是否存在当前账户
		for (int i = 0; i < User_Num; i++)
		{
			if (tmp_num == User_Info[i].Num)
			{
				User_identify = i;
				symbol = true;
				//判断当前卡号是否已经锁定
				if (User_Info[i].Signal == 0)
				{
					cout << "您的账户已被锁定,请联系工作人员处理!" << endl;
					system("pause");
					Identify();
				}
				break;
			}
		}
		if (symbol)
		{
			break;
		}
		system("cls");
		//限制账户位数
		if (tmp_num.length() != 19)
		{
			cout << "账户位数错误,请确认您的账户!" << endl;
		}
	}
	symbol = false;
	int i = 0;
	//判断密码是否符合
	system("cls");
	while (!symbol && i < 3)
	{
		cout << "请输入账户名:" << tmp_num << endl;
		cout << "请输入密码:";
		cin >> tmp_passwd;
		if (tmp_passwd.length() != 6)
		{
			cout << "密码位数错误,请确认您的密码!" << endl;
			continue;
		}
		if (tmp_passwd == User_Info[User_identify].Passwd)
		{
			break;
		}
		i++;
	}
	//如果密码输入超过3次,则锁定账户
	if (i >= 3)
	{
		User_Info[User_identify].Signal = 0;
		cout << "您的账户" << User_Info[User_identify].Num << "已被锁定,请联系工作人员处理!" << endl;
		User_identify = 0;
		system("pause");
		Identify();
	}
	else
	{
		system("cls");
		//显示登陆中提示界面
		cout << "登陆中 . ";
		for (int i = 0; i < 5; i++)
		{
			Sleep(400);
			cout << " . ";
		}
		cout << endl;
		Sleep(400);
		Menu();
	}
	return 0;
}

//查询操作
int S_User::Query()
{
	system("cls");
	//显示查询中提示界面
	cout << "正在查询 . ";
	for (int i = 0; i < 5; i++)
	{
		Sleep(400);
		cout << " . ";
	}
	cout << endl;
	Sleep(400);
	system("cls");
	//显示当前账户信息及余额
	cout << "当前账户为:" << User_Info[User_identify].Num << endl;
	cout << "账户余额为:"<< User_Info[User_identify].Value << endl;
	system("pause");
	Menu();
	return 0;
}

//存款操作
int S_User::Saving()
{
	double tmp = 0;
	system("cls");
	cout << "请输入存款金额:";
	cin >> tmp;        //得到要存入的金额
	int temp = int(tmp);
	if (temp % 100 != 0 || (temp / 100) > 100)
	{
		cout << "尊敬的用户,您只能存入100的整数倍纸币,最多存入100张!" << endl;
	}
	else
	{
		system("cls");
		//显示存款中提示界面
		cout << "正在存款 . ";
		for (int i = 0; i < 5; i++)
		{
			Sleep(400);
			cout << " . ";
		}
		cout << endl;
		Sleep(400);
		User_Info[User_identify].Value += tmp;        //将存款金额存入当前账户
		//输出提示信息
		system("cls");
		cout << "您的账户" << User_Info[User_identify].Num[19] << "已存入金额" << tmp << endl;
		cout << "当前账户金额为:" << User_Info[User_identify].Value << endl;
		//输出凭条信息
		//打开文件,准备写入信息
		Time_Get();
		ofstream outfile("ATM_Simulator_Saving.txt");
		outfile << "业务凭证" << endl << endl;
		outfile << "业务日期为:" << year << "/" << mouth << "/" << time_p->tm_mday << "    " << time_p->tm_hour << ":" << time_p->tm_min << ":" << time_p->tm_sec << endl;
		outfile << "业务账户为:" << User_Info[User_identify].Num << endl;
		outfile << "业务类型:存款" << endl;
		outfile << "存款金额:" << tmp << endl;
		outfile.close();        //关闭文件
	}
	system("pause");
	Menu();
	return 0;
}

//取款操作
int S_User::GetMoney()
{
	double tmp = 0.0;
	system("cls");
	cout << "请输入取款金额:";
	cin >> tmp;
	int temp = int(tmp);
	//限制取款金额只能为100的整数倍
	if ((temp % 100) != 0)
	{
		cout << "您只能取款100的整数倍" << endl;
	}
	//判断当前账户余额是否足够
	else if (tmp > User_Info[User_identify].Value)
	{
		cout << "您的账户余额不足!" << endl;
	}
	//判断取款金额是否超过单笔限额
	else if (tmp > 2000)
	{
		cout << "尊敬的用户,您的单笔取款金额不能超过2000" << endl;
	}
	//判断总取款额是否超过今日额度
	else if (tmp > 20000 - User_Info[User_identify].Limited)
	{
		cout << "尊敬的用户,您的今日取款额度超额!" << endl;
		double tmp_lim = 20000 - User_Info[User_identify].Limited;
		if (tmp_lim < 0)
		{
			tmp_lim = 0;
		}
		cout << "您今日还可取款额度为:" << tmp_lim << endl;
	}
	//若符合以上条件,则输出取款成功,并从账户余额中减去所取金额
	else
	{
		system("cls");
		//显示取款中提示界面
		cout << "正在取款 . ";
		for (int i = 0; i < 5; i++)
		{
			Sleep(400);
			cout << " . ";
		}
		cout << endl;
		Sleep(400);
		User_Info[User_identify].Value -= tmp;
		User_Info[User_identify].Limited += tmp;
		cout << "尊敬的用户,您的账户已取款" << tmp << endl;
		//输出凭条信息
		//打开文件,准备写入信息
		Time_Get();
		ofstream outfile("ATM_Simulator_GetMoney.txt");
		outfile << "业务凭证" << endl << endl;
		outfile << "业务日期为:" << year << "/" << mouth << "/" << time_p->tm_mday << "    " << time_p->tm_hour << ":" << time_p->tm_min << ":" << time_p->tm_sec << endl;
		outfile << "业务账户为:" << User_Info[User_identify].Num << endl;
		outfile << "业务类型:取款" << endl;
		outfile << "取款金额:" << tmp << endl;
		outfile.close();        //关闭文件
	}
	system("pause");
	Menu();
	return 0;
}

//退出当前账户
int S_User::Exit()
{
	system("cls");
	User_identify = 0;        //当前用户标记归零
	UpdateFile();        //更新文件信息
	Identify();
	return 0;
}

int main()
{
	S_User user;
	user.Identify();
	return 0;
}

测试文件及其他说明文件见附件:点我下载附件
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30176699/article/details/70195378
个人分类: C/C++小程序
想对作者说点什么? 我来说一句

C++编写ATM模拟程序

2012年12月04日 15KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭