[设计] C++课程设计-ATM (纪念大一)
#include <iostream> #include <fstream> #include <string> #include <cstring> #include <vector> #include <cstdlib> #include <cstdio> using namespace std; void shaohou() { for(int i = 0; i < 6; i++) { printf("."); for(int j = 0; j < 40000000; j++) { ; } } } class AccountItem { private: string account; // 账号 string passwd; // 密码 string name; // 姓名 double pay; // 存款余额 public: AccountItem() : account(""), passwd(""), name(""), pay(0) {} AccountItem(string m_account, string m_passwd, string m_name, const double m_pay) { account = m_account; passwd = m_passwd; name = m_name; pay = m_pay; } void display() { // 显示对象 cout << "账号 :\n" << account << endl; cout << "密码 :\n" << passwd << endl; cout << "姓名 :\n" << name << endl; cout << "余额 :\n" << pay << endl; } void write(ofstream& s); // 修改账目 void read(ifstream& s); // 读入账目数据 bool checkAccount(string m_account) { // 检测信号 if(account == m_account) return true; return false; } string getAccount() { return account; } // 取账号 string getPasswd() { return passwd; } // 取密码 string getName() { return name; } // 取帐号姓名 double getPay() { return pay; } // 得到余额 void subPay(double m_pay) { pay -= m_pay; } // 取款后-修改余额 void addPay(double m_pay) { pay += m_pay; } // 存款后-修改存款余额 void modifyPasswd(string m_passwd) { passwd = m_passwd; } // 修改密码 void saveNew(); // 开户用---存入新的数据成员 void addPerson(); // 此函数用于增加新的数据成员 bool isNull() { if(account == "") return true; return false; } }; void AccountItem::write(ofstream& s) { s << account << endl; s << passwd << endl; s << name << endl; s << pay << endl; } void AccountItem::read(ifstream& s) { //从输入流读入数据 s >> account; s >> passwd; s >> name; s >> pay; }; void AccountItem::saveNew() { //--------往里面写用的函数,存入新的成员----------- ofstream outputStream("Account.in", ios::app); if (!outputStream) { cout << "\n对不起!!!打开文件失败!!!!\n" << endl; cout << "按 Enter 键继续" << endl; cin.get(); return; } outputStream << account << "\n" << passwd << "\n" << name << "\n" << pay <<endl; outputStream.close(); } void AccountItem::addPerson() { cout << "\n根据下面提示输入新开户人信息\n" << endl; cout << "账号 :"; cin >> account; fflush(stdin); // stdin是默认的输入流文件,对应输入缓冲区,fflush(stdin)的作用就是清空输入缓冲区,避免缓冲区内残存读取函数无法取走的内容! cout << "密码 :"; cin >> passwd; fflush(stdin); cout << "姓名 :"; cin >> name; fflush(stdin); cout << "开户金额 : "; cin >> pay; fflush(stdin); saveNew(); cout << "\n\n\t开户成功,您的账号是 : " << account; cout << "请牢记!" << endl; cout << "\n\n\t您的可用余额为 : " << pay << endl; cout << "\n\n新的账户信息已经保存好!!!!!\n" << endl; cout << "按 Enter 键继续" << endl; cin.get(); //直观的讲就是显示:”按任意键继续。。。“ } ///* 以下 Accountbook 为帐号表单类。*/// ///* 新增加一个新的Accountbook类 */// ///* 把修改后的账目存储到文件 */// class Accountbook { private : vector<AccountItem> v_Account; // Account 对象数组 size_t accountCount; // 数组中的对象个数 public: Accountbook(); //构造函数 size_t loadAccountbook(ifstream& inputStream); // 读入账目本 void storeAccountbook(ofstream& outputStream); // 为修改账目本写文件 AccountItem findItem(string m_account); // 在账目本中一个一个查询,看参数(No-形参)是否与(类似李雷这种)对象的账号匹配 bool updateItem(AccountItem item); // 按所给对象修改对象内容,但是账号不能改哦! 修改账目中的一个记录 }; Accountbook::Accountbook() { v_Account = vector<AccountItem> (100); accountCount = 0; } size_t Accountbook::loadAccountbook(ifstream& inputStream) { size_t i = 0; /// 从文件中读入i个对象 while(true) { v_Account[i].read(inputStream); ++i; if(inputStream.fail()) break; } inputStream.close(); // 关闭文件 accountCount = i; return accountCount; // 返回读入对象的个数 } void Accountbook::storeAccountbook(ofstream& outputStream) { for(size_t i = 0; i < accountCount; ++i) // 将对象组通过流输出到文件 v_Account[i].write(outputStream); outputStream.close(); } // 按给定账号在账目本中查询 AccountItem Accountbook::findItem(string m_account) { for(size_t i = 0; i < accountCount; ++i) { if(v_Account[i].getAccount() == m_account) return v_Account[i]; } return AccountItem(); // 若未查询到,返回一个空对象 } //按所给对象修改对象内容,但是账号不能改哦 bool Accountbook::updateItem(AccountItem item) { string number = item.getAccount(); //按账号在账目本中查询账号与所给对象相同的对象 for(size_t i = 0; i < accountCount; i++) { if(v_Account[i].getAccount() == number) { v_Account[i] = item; return true; } } return false; } void g_login() { ifstream inputStream("Account.in"); string accNo; Accountbook myAccountbook; // myAccountbook 为 Accountbook 的一个对象 AccountItem myItem; // myItem 为 AccountItem 的一个对象 myAccountbook.loadAccountbook(inputStream); // 读入账目本 cout << " 请插卡(即输入账号):"; cin >> accNo; myItem = myAccountbook.findItem(accNo); // 在账目本中查询 if(myItem.isNull()) { cout << " ★★ 账号不存在!\n\n\n\t☆★\t立宾提醒您重新操作" << endl; return; } //读入密码 cout << " 请输入您的个人密码:"; char *pw = new char[20]; cin >> pw; //判断密码是否正确 if(myItem.getPasswd() != pw) { cout<<"\t您输入的密码错误!\n\n\n\t☆★\t立宾提醒您重新操作"<<endl; return; } double oldPay = myItem.getPay(); //取原存款余额 char w = '#'; do { cout << "请选择交易密码 : " << endl; cout << "\n\tG (取钱)" << endl; cout << "\n\tE (存款)" << endl; cout << "\n\tC (查询余额)" << endl; cout << "\n\tX (修改密码)" << endl; cout << "\n\tZ (转账)" << endl; cout << "\n\tT (退卡)" << endl; string sel; cin >> sel; /// 判断用户需要做什么! if(sel == "C" || sel == "c") { //查询存款余额 cout << "\n\n\t余额是 : " << myItem.getPay() << endl; shaohou(); } else if(sel == "X" || sel == "x") { //修改密码 cout<<"\t请输入原密码:"; string pwd; cin >> pwd; if(myItem.getPasswd() != pwd) { cout << "您输入的密码错误!\n\n\n\t☆★\t立宾提醒您重新操作"; } else { cout << "\n\n\t请输入新密码:"; cin >> pwd; string rpwd; cout << "\n\n\t请再输入一次新密码:"; cin >> rpwd; if(rpwd != pwd) { cout << "\n\n\t你输入的两次密码不相同, 请重新操作!" << endl; } else { myItem.modifyPasswd(rpwd); myAccountbook.updateItem(myItem); cout << "\n\n\t密码修改成功,请牢记!" << endl; } /// 修改后的密码写到文件中 ofstream outputStream("Account.in"); myAccountbook.storeAccountbook(outputStream); } } else if(sel == "T"|| sel == "t") {//退卡 cout << " \n\n\n ★-★-☆-☆-★-★-☆-☆-★-★-☆-☆-★-★" << endl; cout << "\n\n\n\t 感谢你对本银行的支持,欢迎下次光临!"<< endl; cout << " \n\n ★-★-☆-☆-★-★-☆-☆-★-★-☆-☆-★-★" << endl; cout << "\n\n\t☆★ 请取卡 ......" << endl; cout << "\n\n ★-★-☆-☆-★-★-☆-☆-★-★-☆-☆-★-★\n"; exit(0); } else if(sel == "E" || sel == "e") { /// 存款 cout << "请选择存款的数量 : " << endl; cout << "\n\t\t1 (存100)" << endl; cout << "\n\t\t2 (存200)" << endl; cout << "\n\t\t5 (存500)" << endl; cout << "\n\t\tA (存1000)" << endl; cout << "\n\t\tB (存2000)" << endl; char count; double ap; cin >> count; if(count == '1') ap = 100; else if(count == '2') ap = 200; else if(count == '5') ap = 500; else if(count == 'A') ap = 1000; else if(count == 'B') ap = 2000; else { cout << "\t\t选择错误" << endl; return; } cout<<"\n\n ★☆★☆请按您选择的存款数量,塞入人民币☆★☆★ "; for(size_t i = 0; i < 4; ++i) { shaohou(); shaohou(); } /// 修改对象的存款余额 myItem.addPay(ap); myAccountbook.updateItem(myItem); ofstream outputStream("Account.in"); myAccountbook.storeAccountbook(outputStream); cout << "\n\n\n ★☆★☆存款成功。您存入了" << ap << "元. ☆★☆★ "; for(size_t i = 0; i < 5; ++i) { shaohou(); } } else if(sel == "Z" || sel == "z") { // 转账 cout << "\t请输入要转到账户的账号:"; string otherAccount; cin >> otherAccount; AccountItem otherItem = myAccountbook.findItem(otherAccount); if(otherItem.isNull()) { cout << " ★★ 账号不存在!\n\n\n\t☆★\t立宾提醒您重新操作" << endl; return; } else { cout << "\t请输入转账金额 : "; double zhuane; cin >> zhuane; oldPay = myItem.getPay(); if(oldPay < zhuane) { cout << "\n\t存款余额不够!\n\n\n\t☆★\t立宾提醒您" << endl; } else { // 修改对象的存款余额 myItem.subPay(zhuane); myAccountbook.updateItem(myItem); //将修改后的账目本写到文件中 ofstream outputStream1("Account.in"); myAccountbook.storeAccountbook(outputStream1); outputStream1.close(); otherItem.addPay(zhuane); /// 修改账目本 myAccountbook.updateItem(otherItem); /// 将修改后的账目本写到文件中 ofstream outputStream2("Account.in"); myAccountbook.storeAccountbook(outputStream2); cout << "转账成功!\n\n\n\t☆★\t立宾提醒您" << endl; outputStream2.close(); shaohou(); shaohou(); shaohou(); } } } else if(sel == "G" || sel == "g") {// 取款 cout << "\t请选择取钱的数量:" << endl; cout << "\n\t\t1 (取100)" << endl; cout << "\n\t\t2 (取200)" << endl; cout << "\n\t\t5 (取500)" << endl; cout << "\n\t\tA (取1000)" << endl; cout << "\n\t\tB (取2000)" << endl; char count; double ap; cin >> count; if(count == '1') ap = 100.; else if(count == '2') ap = 200.; else if(count == '5') ap = 500.; else if(count == 'A') ap = 1000.; else if(count == 'B') ap = 2000.; else { cout << "选择错误" << endl; return; } //判断存款余额是否够 if(oldPay < ap) { cout << "\n\t存款余额不够!" << endl; } else { //修改对象的存款余额 myItem.subPay(ap); //修改账目本 myAccountbook.updateItem(myItem); cout << "\t请取钱!" << endl; //将修改后的账目本写到文件中 ofstream outputStream("Account.in"); myAccountbook.storeAccountbook(outputStream); } } shaohou(); shaohou(); cout << "\n\t你想继续进行其他操作吗?(y/n)" << endl; cin >> w; } while (w == 'y'); } int main() { AccountItem tempAccount; while(true) { char xz; cout << "\n\n\t欢迎使用立宾国际ATM系统\n"; cout << "\n\n\t请选择您要执行的操作:\n"; cout << "\n\n\tA.开户服务\n"; cout << "\n\n\tB.登录服务\n"; cout << "\n\n\tC.退出。\n"; cout << "\n\n\t请选择:"; scanf("%c", &xz); switch(xz) { case 'a' : case 'A' : { cout << "\n\n\t【开户服务】"; /// tempAccount.addPerson(); /// 添加新人 break; } case 'b' : case 'B' : { g_login(); break; } case 'c' : case 'C' : { cout << " \n\n\n ★-★-☆-☆-★-★-☆-☆-★-★-☆-☆-★-★" << endl; cout << "\n\t★★☆ 感谢您对本本银行的支持,欢迎下次光临! ☆★★\n"; exit(0); } default : { cout << "\n\t您的选择错误!\n\n\n\t☆★\t立宾提醒您重新选择!" << endl; } } cout << "\n\n\t请选择您要执行的操作:\n"; } return 0; }
--------- Account.in ----------
001 lilei 李雷 1000 002 hanmei 韩梅梅 1000 003 wangwenhao 王文豪 3900 004 maoxu 王冒旭 4000 005 hongwu 于洪武 2000 006 xiaofei 王小飞 900 007 zhangli 张丽丽 1000
// ---------------其他美观--------------
void AccountItem::welcome() { for(int i = 0; i < 2; i++) { //可以改变i的值,以美观 cout << "\n\n\n\n\n\n\n\n"; cout << "\t\t\t ●☆★◇◆○●☆★◇◆○●☆★◇◆○\n"; cout << "\t\t\t◎ 欢迎使用立宾国际ATM系统 ●\n"; cout << "\t\t\t ●☆★◇◆○●☆★◇◆○●☆★◇◆○\n"; cout << "\n\n\t\t ★希望立宾国际ATM系统可以时刻给您带来方便!★"; cout << "\n\n\n\n\t\t\t\t 陈立宾将竭诚为您提供优质的服务"; shaohou(); system("cls"); cout << "\n\n\n\n\n\n\n\n"; cout << "\t\t\t ○★☆◆◇●○★☆◆◇●○★☆◆◇●\n"; cout << "\t\t\t● 欢迎使用立宾国际ATM系统 ◎\n"; cout << "\t\t\t ○★☆◆◇●○★☆◆◇●○★☆◆◇● \n"; cout << "\n\n\t\t ☆希望立宾国际ATM系统可以时刻给您带来方便!☆"; cout << "\n\n\n\n\t\t\t\t 陈立宾将竭诚为您提供优质的服务"; shaohou(); system("cls"); } };