ATM机模拟C++版:ATM_Simulator

来源:互联网 发布:sql查询语句排除相同 编辑:程序博客网 时间:2024/05/18 11:16
功能要求:
    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 999using 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;}

测试文件及其他说明文件见附件:点我下载附件

0 0
原创粉丝点击