银行储蓄系统

2023-10-09 23:10
文章标签 系统 银行 储蓄

本文主要是介绍银行储蓄系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/* 
 *Copyright  (c)  2014,烟台大学计算机学院 
 *All rights reserved. 
 *文件名称: test.cpp 
 *作        者:陈丹 
 *完成日期:2015年7月16日 
 *版本号:v1.0 
 * 

主函数

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <cstdio>
#include "staff.h"
#include "bank.h"
#include "user.h"
#include <ctime>
using namespace std;
void ctime();
int main()
{cout<<"+-----------------------------------+"<<endl;cout<<"+ ※※※                             +"<<endl;cout<<"+       Welcome to dream bank       +"<<endl;cout<<"+                            ※※※  +"<<endl;cout<<"+-----------------------------------+"<<endl;//ctime();Bank b;if(!b.passtaff())            //业务员登录exit(1);                 //退出系统cout<<endl;ctime();b.showMenu();                //显示菜单b.manage();                  //开始工作return 0;
}
/*-----------------------------------------------------------------------------------------**函数名称:ctime*功能描述:获取系统信息*输入参数:*输出参数:输出现在时间并将其保存到time.txt文件中*返回值:*说明:     这个函数借鉴的度娘。*-----------------------------------------------------------------------------------------*/
void ctime()
{tm *year; //年tm *month; //月tm *day; //日tm *hour;//时tm *minute;tm *second;time_t t;t=time(0);year   = localtime(&t);month  = localtime(&t);day    = localtime(&t);hour   = localtime(&t);minute = localtime(&t);second = localtime(&t);cout<<"现在时间:"<<(year ->tm_year+1900)<<"年"  //返回的是今年减1900,所以要加上1900<<(month->tm_mon+1)<<"月"     //因为Month (0 – 11; January = 0),所以要加1<<day   ->tm_mday<<"日"<<hour  ->tm_hour<<"时"<<minute->tm_min<<"分"<<second->tm_sec<<"秒";ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}outfile<<(year ->tm_year+1900)<<"年"  //返回的是今年减1900,所以要加上1900<<(month->tm_mon+1)<<"月"     //因为Month (0 – 11; January = 0),所以要加1<<day   ->tm_mday<<"日"<<hour  ->tm_hour<<"时"<<minute->tm_min<<"分"<<second->tm_sec<<"秒";
}

bank.h

#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <iostream>
#include <cmath>
#include <iomanip>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <conio.h>
#include "user.h"
#include <ctime>
using namespace std;
class Bank
{
public:Bank(){nownum=0;}bool passtaff();             //业务员信息void openfile();             //导入文件void savefile2(int acc, string nam, char id[18], char di[30],char pho[11],int pw, double mon,int sta);   //保存一行数据void caculfile();            //计算void savefile();             //保存文件void manage();               //开始工作void showMenu();             //显示菜单void openAccount();          //开户void deleteAccount();        //销户void saveMoney();            //存款void drawMoney();            //取款void refer();                //查询void transfer();             //转账void reportLoss();           //挂失void hangSolution();         //解挂void changePassword();       //改密void changename();           //改姓名void changeidcard();         //改身份证void changedizhi();          //改地址void changephone();          //改电话void display();             //显示个人信息void changedisplays();      //修改个人信息int getUser();              //查找用户int jishu();                  //计算用户数
private:int nownum;User *users;//User数组,动态数组 体现在保存文件方面   delete[]users
};#endif // BANK_H_INCLUDED

bank.cpp

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <stdio.h>
#include <fstream>
#include "staff.h"
#include "bank.h"
#include <ctime>
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:inputPassword*功能描述:接收密码,并且将其转化成数字,最后输出为“******”,并且密码要求不能全为0*输入参数:ch一位一位的输入*输出参数:"******"*返回值:  返回密码*说明:    这里要注意如何将字符转化成数字,并且这里只有用getch()和putchar('*')才能成功使得密码成为"******"格式*-----------------------------------------------------------------------------------------*/
int inputPassword()
{char ch;  //接收字符形式密码int iPass=0;   //要转换为数字int i;while(1){for(i=0; i<6; i++){ch=getch();  //输入但不显示putchar('*');   //输出*if(isdigit(ch))iPass=iPass*10+(ch-'0');else{iPass=0;break;  //退出for循环后,再次接受}}fflush(stdin); //清除键盘缓存区中已经有的输入cout<<endl;if(iPass==0)  //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环{cout<<"密码要求全为数字,且不能全0!"<<endl;;cout<<"请重新输入密码: ";}elsebreak;}return iPass;
}
/*-----------------------------------------------------------------------------------------**函数名称:passtaff*功能描述:用于业务员账户的登录,输入账户号码,并且接收密码,并且将其转化成数字,输出为“******”,判断账户跟密码是否正确,正确则返回true,成功登录,如果错误则输出"请输入密码:"字样,错误三次自动退出系统。*输入参数:业务员账户,以及密码ch一位一位的输入*输出参数:"******"*返回值:  输入的业务员密码true/false*说明:    注意业务员的密码的输入,以及错误三次退出*-----------------------------------------------------------------------------------------*/
bool Bank::passtaff()
{Staff s1;string acc;char ch;cout<<"请输入业务员账户:";cin>>acc;for(int j=0; j<3; ++j){int pw=0;cout<<"请输入密码:";for(int i=0; i<6; i++){ch=getch();  //输入但不显示putchar('*');   //输出*pw=pw*10+(ch-'0');}if(s1.pass(acc,pw)){return true;}else{cout<<"\n用户名或密码错误。"<<endl;}}cout<<"\n错误三次,系统自动退出。"<<endl;return false;
}
/*-----------------------------------------------------------------------------------------**函数名称:showMenu*功能描述:显示菜单,输出所有的操作选项。*输入参数:*输出参数:*返回值:*说明:     输出尽量整齐有序,美观。*-----------------------------------------------------------------------------------------*/
void Bank::showMenu()
{cout<<endl;cout<<"+--------------------------------+"<<endl;cout<<"+ 1 开户      2 销户      3 存款 +"<<endl;cout<<"+ 4 取款      5 查询      6 转账 +"<<endl;cout<<"+ 7 挂失      8 解挂      0 退出 +"<<endl;cout<<"+ 9 修改信息         10 个人信息 +"<<endl;cout<<"+--------------------------------+"<<endl;
}
/*-----------------------------------------------------------------------------------------**函数名称:manage*功能描述:开始工作菜单,接收操作指令,用switch()语句完成*输入参数:输入所选操作*输出参数:输出所选操作的具体*返回值:*说明:    switch()语句的应用*-----------------------------------------------------------------------------------------*/
void Bank::manage()
{int order=1;do{openfile();cout<<"请输入操作指令:";cin>>order;switch(order){case 1:openAccount();break;case 2:deleteAccount();break;case 3:saveMoney();break;case 4:drawMoney();break;//取款case 5:refer();break;//查询case 6:transfer();break;//转账case 7:reportLoss();break;//挂失case 8:hangSolution();break;//解挂case 9:changedisplays();break;//修改个人信息case 10:display();break;//显示个人信息case 0:cout<<endl;cout<<"+--------------------------------------+"<<endl;cout<<"+        谢谢您的使用,再见!          +"<<endl;cout<<"+--------------------------------------+"<<endl;exit(1);break;}savefile();}while(1);
}
/*-----------------------------------------------------------------------------------------**函数名称:openAccount*功能描述:开户,按照提示输入个人信息,如果输入的个人信息合格,即可成功开户,否则不能开户*输入参数:输入各个信息*输出参数:如果输入合格,则输出"开户成功"*返回值:*说明:    注意各项输入,身份证号与电话号都是固定位数。*-----------------------------------------------------------------------------------------*/
void Bank::openAccount()  //开户
{int acc;   //账号char nam[20];   //姓名int pw;   //密码char di[30]; //地址char pho[11];//电话double mon;   //金额int sta;   //状态char id[18];   //身份证号cout<<"正在开户"<<endl;acc=10001+nownum;cout<<"账号:"<<acc<<endl;cout<<"户主姓名:";cin>>nam;cout<<"身份证号:";for(int n=0; n<18; n++){cin>>id[n];}cout<<"地址:";cin>>di;cout<<"联系电话(请输入正确的手机号码):";for(int n=0; n<11; n++){cin>>pho[n];}int Pass1, Pass2;cout<<"密码:";Pass1=inputPassword();  //输入密码1cout<<"确认密码:";Pass2=inputPassword();  //输入密码2if(Pass1==Pass2){pw=Pass1;sta=0; //账户状态为“正常”cout<<"存入金额:";cin>>mon;if(mon>50) //一般银行开户最低金额为50{users[nownum].setUser(acc,nam,id,di,pho,pw,mon,sta);//出了好几次错的地方  id++nownum;                           //正式用户数增加1,确认了新用户已经加入cout<<"开户成功!"<<endl;}elsecout<<"金额少于50元,开户失败"<<endl;}else{cout<<"两次密码不一致,未成功开户!"<<endl; //没有N++,则读入的值无效}
}
/*-----------------------------------------------------------------------------------------**函数名称:deleteAccount*功能描述:销户,输入用户账号以及密码,显示出账户余额,完成销户的功能(在这里保存销户的具体,输出到"time.txt")*输入参数:输入用户账号及密码以及'y'/'n'*输出参数:输出余额,若输入'y',则输出"销户成功!本次取款金额为:"的字样,若输入'n',则输出"你取消了操作,销户失败!"*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::deleteAccount()
{int who;  //查找到该账号在数组中对应的下标who=getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){users[who].showMoney("余额:");   //提示"余额"二字,显示金额cout<<"确认销户(y/n)?";if(getchar()=='y'||getchar()=='Y'){users[who].showMoney("销户成功!本次取款金额为:");users[who].money=0;  //取款后余额变0users[who].status=2;  //状态变为注销}else{cout<<"你取消了操作,销户失败!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作}}
}
/*-----------------------------------------------------------------------------------------**函数名称:saveMoney*功能描述:存款,输入用户账号,存款完毕后显示出账户余额,完成存款的功能(在这里保存存款的具体,输出到"time.txt")*输入参数:输入用户账号及存入金额*输出参数:若状态为0,则输出余额,若状态为1,输出"该用户处于挂失状态,存款失败!",若状态为2,则输出"该用户已经销户,存款失败!"*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::saveMoney() //存款
{int who;double money;who=getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{if(users[who].status==0){users[who].showName();//cout<<endl;cout<<"输入存款额:";cin>>money;users[who].money+=money;users[who].showMoney("存款后,金额为:");ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"存入金额"<<money<<"元"<<endl;outfile.close();}else if(users[who].status==1){cout<<"该用户处于挂失状态,存款失败!"<<endl;}else if(users[who].status==2){cout<<"该用户已经销户,存款失败!"<<endl;}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:drawMoney*功能描述:取款,输入用户账号以及密码,通过对账号及密码的判断,输入取款金额,完成取款的功能(在这里保存取款的具体,输出到"time.txt")*输入参数:输入用户账号,密码,以及取款金额*输出参数:若输入的取款金额大于账户中全部金额,则输出"余额不足,取款失败!",否则输出"取款后,余额为:"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::drawMoney() //取款
{int who;double money;who=getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{if(users[who].isNormalUser()){users[who].showName();if(users[who].passwordIsRight()){cout<<"输入取款额:";cin>>money;if(money>users[who].money){cout<<"余额不足,取款失败!"<<endl;}else{users[who].money-=money;users[who].showMoney("取款后,余额为:");}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"取出金额"<<money<<"元"<<endl;outfile.close();}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:refer*功能描述:查询用户状态以及已办业务,输入用户账号以及密码,通过对账号及密码的判断,输出该账户的状态及余额,若选择继续查询,则输出time.txt文件中该账户曾办业务的信息。*输入参数:输入用户账号,密码,'y'/'n'*输出参数:输出该账户的状态及余额以及用户办业务的详细信息*返回值:*说明:     注意这里对time.txt文件中用户信息的调用,注意{}的适用范围。*-----------------------------------------------------------------------------------------*/
void Bank::refer()    //查询
{int who;int cacc;char pan;string cnam;string sta[3]= {"正常","挂失","已经销户"};string hms;string cyw;who=getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){users[who].showMoney("余额:");cout<<"状态:"<<sta[users[who].status]<<endl;cout<<"是否进行详细查询(y/n)?"<<endl;;cin>>pan;if(pan=='y'){ifstream infile("time.txt",ios::in);if(!infile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}while(infile>>hms>>cacc>>cnam>>cyw) //天啦撸,一定要注意这里的判断!{if(users[who].account==cacc){cout<<hms<<'\t'<<cacc<<'\t'<<cnam<<'\t'<<cyw<<endl;}}if(users[who].account!=cacc){cout<<"当前未办理过任何业务。"<<endl;}infile.close();}else{cout<<"+-------------查询结束-------------+"<<endl;cout<<endl;}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:transfer*功能描述:转账,输入用户账号以及密码,通过对账号及密码的判断,再输入被转用户的账号,输入转账金额,若金额不够,则输出"余额不足,转账失败!"的字样,若金额足够,则输出转账后余额,完成转账的功能(在这里保存转账的具体,输出到"time.txt")*输入参数:输入用户账号,密码,以及被转账者的账号与转账金额*输出参数:若输入的转账金额大于账户中全部金额,则输出"余额不足,转账失败!",否则输出"转账后,余额为:"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::transfer()   //转账
{int whoout, whoin;double money;cout<<"转出自";whoout=getUser();  //根据账号查询用户,返回用户的下标if(whoout>=0)   //说明id账户存在{if(users[whoout].isNormalUser()){users[whoout].showName();if(users[whoout].passwordIsRight()){cout<<"输入转账金额:";cin>>money;if(money>users[whoout].money){cout<<"余额不足,转账失败!"<<endl;}else{cout<<"转出到";whoin = getUser();  //根据账号查询用户,返回用户的下标if(whoin>=0)   //说明id账户存在{if(users[whoin].isNormalUser()){users[whoout].money-=money;users[whoin].money+=money;users[whoout].showMoney("转账后,余额为:");}}}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[whoout].account<<'\t'<<users[whoout].name<<'\t'<<"转出金额"<<money<<"元"<<endl;outfile.close();}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:reportLoss*功能描述:挂失,输入用户账号以及密码,通过对账号及密码的判断,使得用户状态变为挂失,完成挂失的功能(在这里保存挂失的具体,输出到"time.txt")*输入参数:输入用户账号,密码*输出参数:若用户状态本为0,则将状态变为1,挂失成功,若用户原来状态为1/2,那么则不能成功挂失。*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::reportLoss()   //挂失
{int who;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){if(users[who].status==0){users[who].status=1;cout<<"挂失成功"<<endl;}else if(users[who].status==1){cout<<"该账户已经处于挂失状态"<<endl;}else if(users[who].status==2){cout<<"该账户已销户,不能挂失"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:hangSolution*功能描述:解挂,输入用户账号以及密码,通过对账号及密码的判断,使得用户状态变为正常状态0,完成解挂的功能(在这里保存解挂的具体,输出到"time.txt")*输入参数:输入用户账号,密码*输出参数:若用户状态本为1,则将状态变为0,解挂成功,若用户原来状态为2,那么则不能成功解挂,若用户原来状态为0,那么则不能做此操作*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::hangSolution() //解挂
{int who;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){if(users[who].status==0){cout<<"该账户处于正常状态,不需要解除挂失"<<endl;}else if(users[who].status==1){users[who].status=0;cout<<"解除挂失成功"<<endl;}else if(users[who].status==2){cout<<"该账户已销户,操作无效"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changePassword*功能描述:改密,输入用户账号以及密码,通过对账号及密码的判断,输入两次新密码,如果两次相同则成功修改密码,否则,密码修改失败(在这里保存改密的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新密码*输出参数:若输入两次密码相同,则输出"密码修改成功!"的字样,若不同,则输出"两次输入不同,修改失败!"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changePassword() //改密
{int who;int iPass1, iPass2;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新密码:";iPass1=inputPassword();  //输入密码1cout<<"确认密码:";iPass2=inputPassword();  //输入密码2if(iPass1==iPass2){users[who].password=iPass1;cout<<"密码修改成功!"<<endl;}else{cout<<"两次输入不同,修改失败!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变密码:"<<users[who].password<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changename*功能描述:修改用户名,输入用户账号以及密码,通过对账号及密码的判断,输入新姓名以及'y'/'n',若输入'y',则改名成功,若输入'n',则取消本次修改(在这里保存修改用户名的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新姓名,'y'/'n'*输出参数:若输入'y'则输出"用户名修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/void Bank::changename() //修改用户名
{int who;string nam;char pan;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新姓名:";cin>>nam; //输入用户名cout<<"确认修改姓名(y/n)?";cin>>pan;if(pan=='y'){users[who].name=nam;cout<<"用户名修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变用户名:"<<users[who].name<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changedizhi*功能描述:修改地址,输入用户账号以及密码,通过对账号及密码的判断,输入新地址以及'y'/'n',若输入'y',则改地址成功,若输入'n',则取消本次修改(在这里保存修改地址的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新地址,'y'/'n'*输出参数:若输入'y'则输出"地址修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changedizhi() //修改地址
{int who;char di[30];char pan;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新地址:";gets(di); //输入地址cout<<"确认修改地址(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<30; n++)users[who].dizhi[n]=di[n];cout<<"地址修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变地址:"<<users[who].dizhi<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changeidcard*功能描述:修改身份证号,输入用户账号以及密码,通过对账号及密码的判断,输入新身份证号以及'y'/'n',若输入'y',则改身份证号成功,若输入'n',则取消本次修改(在这里保存修改身份证号的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新身份证号,'y'/'n'*输出参数:若输入'y'则输出"身份证号修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changeidcard()
{int who;char id[18];char pan;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新身份证号:";gets(id); //输入身份证号cout<<"确认修改身份证号(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<18; n++){users[who].idcard[n]=id[n];}cout<<"身份证号修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"修改身份证号:"<<users[who].idcard<<endl;outfile.close();}}return;}
/*-----------------------------------------------------------------------------------------**函数名称:changephone*功能描述:修改手机号,输入用户账号以及密码,通过对账号及密码的判断,输入新电话号以及'y'/'n',若输入'y',则改电话号成功,若输入'n',则取消本次修改(在这里保存修改电话号的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新电话号,'y'/'n'*输出参数:若输入'y'则输出"电话号号修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明:     注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changephone()
{int who;char pho[11];char pan;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新电话号:";gets(pho); //输入电话号cout<<"确认修改电话号(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<11; n++){users[who].phone[n]=pho[n];}cout<<"电话号修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变电话号:"<<users[who].phone<<endl;outfile.close();}}return;}
/*-----------------------------------------------------------------------------------------**函数名称:changedisplays*功能描述:修改个人信息,输入需要操作选项的序号,使其跳转到所选函数内,完成对信息的修改*输入参数:输入n,即操作序号*输出参数:*返回值:*说明:     依旧是switch()语句*-----------------------------------------------------------------------------------------*/
void Bank::changedisplays() //修改个人信息
{int n;cout<<"+----请输入想要修改的项目:----+"<<endl;cout<<"+-----------1.姓名-------------+"<<endl;cout<<"+-----------2.身份证号---------+"<<endl;cout<<"+-----------3.密码-------------+"<<endl;cout<<"+-----------4.地址-------------+"<<endl;cout<<"+-----------5.电话-------------+"<<endl;cout<<"请输入:";cin>>n;switch(n){case 1:changename();break;case 2:changeidcard();break;case 3:changePassword();break;case 4:changedizhi();break;case 5:changephone();break;}
}
/*-----------------------------------------------------------------------------------------**函数名称:getUser*功能描述:查找用户,输入用户账户,利用二分法,查找是否有该用户的存在,返回关键字(找不到即为-1,其他即为找到)*输入参数:输入用户账号*输出参数:*返回值:  返回index(关键字)*说明:    利用二分法查找账号,更快捷简便*-----------------------------------------------------------------------------------------*/
int Bank::getUser() //查找用户   二分法
{int id;cout<<"账号:";cin>>id;int index=-1;int low=0, high=nownum-1, mid;while(low<=high){mid = (low+high)/2;if(users[mid].account==id){index=mid;break;   //找到了,立即退出循环}else if (users[mid].account>id)high=mid-1;elselow=mid+1;}if (index<0)cout<<"该用户不存在,本次操作失败!"<<endl;return index; //若找到,其值在0~N-1间,否则,保持-1
}
/*-----------------------------------------------------------------------------------------**函数名称:openfile*功能描述:导出文件,将用户信息从users.txt里面导出,并计算用户数*输入参数:*输出参数:*返回值:*说明:    将用户信息从users.txt里面导出,并计算用户数*-----------------------------------------------------------------------------------------*/
void Bank::openfile()//导出文件
{ifstream infile("users.txt",ios::in);int i=0;if(!infile){cerr<<"open error!"<<endl;exit(1);}nownum=jishu();        //jis里面有return当前总用户数users=new User[nownum+1];while(infile>>users[i].account>>users[i].name>>users[i].idcard>>users[i].dizhi>>users[i].phone>>users[i].password>>users[i].money>>users[i].status){++i;}infile.close();
}
/*-----------------------------------------------------------------------------------------**函数名称:savefile*功能描述:保存文件,将用户信息保存到users.txt里面,并利用动态数组,delete []users; 在这里释放了剩余空间*输入参数:*输出参数:*返回值:*说明:    将用户信息保存到users.txt里面*-----------------------------------------------------------------------------------------*/
void Bank::savefile() //保存文件
{ofstream qingkfile("users.txt",ios::trunc);//trunc 打开并清空文件qingkfile.close();ofstream outfile("users.txt",ios::out);if(!outfile){cerr<<"open error!"<<endl;exit(1);}for(int i=0; i<nownum; ++i)          //注意这里的空格即‘\t',关系到是否能正常保存用户信息{outfile<<users[i].account<<'\t'<<users[i].name<<'\t';for(int n=0; n<18; n++){outfile<<users[i].idcard[n];}outfile <<'\t'<<users[i].dizhi<<'\t';for(int n=0; n<11; n++){outfile<<users[i].phone[n];}outfile<<'\t'<<users[i].password<<'\t'<<users[i].money<<'\t'<<users[i].status<<endl;}outfile.close();delete []users;                   //释放剩余空间return;
}
/*-----------------------------------------------------------------------------------------**函数名称:display*功能描述:显示个人信息*输入参数:输入用户账号以及密码,若验证通过,则调用display()函数显示信息*输出参数:输出个人的信息*返回值:*说明:*-----------------------------------------------------------------------------------------*/
void Bank::display()      //显示个人信息
{int who;who = getUser();  //根据账号查询用户,返回用户的下标if(who>=0)   //说明id账户存在{users[who].displays();}
}
/*-----------------------------------------------------------------------------------------**函数名称:jishu*功能描述:计算用户数*输入参数:*输出参数:*返回值:  返回用户总数*说明:    用while()计算用户的总数*-----------------------------------------------------------------------------------------*/
int Bank::jishu()
{int acc;   //账号char nam[20];   //姓名char id[18]; //身份证号char di[30];//地址char pho[11];//电话int pw;   //密码double mon;   //金额int sta;   //状态int i=0;int nownum;ifstream infile("users.txt");while(infile>>acc>>nam>>id>>di>>pho>>pw>>mon>>sta){++i;}infile.close();return i;
}

staff.h

#ifndef STAFF_H_INCLUDED
#define STAFF_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
struct staffTatus
{string account;int password;
};
class Staff
{
public:bool pass(string sacc,int ps);
private:staffTatus stafft;
};#endif // STAFF_H_INCLUDED

staff.cpp

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include "staff.h"
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:pass*功能描述:判断业务员的登录信息*输入参数:*输出参数:*返回值:   返回判断*说明:     =*-----------------------------------------------------------------------------------------*/
bool Staff::pass(string sacc,int ps)
{bool judge=false;fstream infile("staff.txt",ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}while(!infile.eof()){infile>>stafft.account>>stafft.password;if(stafft.account==sacc&&ps==stafft.password){judge=true;break;}}infile.close();return judge;
}

user.h

#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
//定义user类
class User
{
public:User(){}void setUser(int acc, string nam,char id[18],char di[30],char pho[11],int pw, double mon,int sta);bool isNormalUser();       //判断用户状态是否正确bool passwordIsRight();    //判断密码是否正确void showName();          //输出用户名void displays();          //输出用户个人信息void showMoney(string prompt);//显示余额friend class Bank;        //友元类
private:int account;string name;char dizhi[30];char phone[11];int password;double money;char idcard[18];int status;
};#endif // USER_H_INCLUDED

user.cpp

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <conio.h> //将密码变成*号
#include "user.h"
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:inputpassw*功能描述:接收密码,并且将其转化成数字,最后输出为“******”,并且密码要求不能全为0*输入参数:ch一位一位的输入*输出参数:"******"*返回值:  返回密码*说明:    这里要注意如何将字符转化成数字,并且这里只有用getch()和putchar('*')才能成功使得密码成为"******"格式*-----------------------------------------------------------------------------------------*/
int inputpassw()
{char ch;  //接收字符形式密码(这里必须输入字符,因为只有字符才能转化成'*')int iPass=0;   //要转换为ascll的形式int i;while(1){for(i=0; i<6; i++){ch=getch();  //输入但不显示putchar('*');   //输出*if(isdigit(ch))iPass=iPass*10+(ch-'0');  //假设第一位输入1,第二位输入2,那么此时密码就应该是1*10+2=12####else{iPass=0;break;  //退出for循环后,再次接受}}fflush(stdin); //清除键盘缓存区中已经有的输入(不会,copy,详细解释见weizhi)cout<<endl;if(iPass==0)  //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环{cout<<"密码要求全为数字,且不能全0!"<<endl;;cout<<"请重新输入密码: ";}elsebreak;}return iPass;
}
/*-----------------------------------------------------------------------------------------**函数名称:setUser*功能描述:建立用户*输入参数:*输出参数:*返回值:*说明:    用户的各个信息*-----------------------------------------------------------------------------------------*/
void User::setUser(int acc,string nam,char id[18],char di[30],char pho[11],int pw, double mon,int sta)
{account=acc;name=nam;for(int n=0;n<30;n++){dizhi[n]=di[n];}for(int n=0;n<11;n++){phone[n]=pho[n];}password=pw;money=mon;for(int n=0;n<18;n++){idcard[n]=id[n];}status=sta;
}
/*-----------------------------------------------------------------------------------------**函数名称:passwordIsRight*功能描述:判断用户密码*输入参数:输入密码*输出参数:*返回值:  返回判断结果*说明:*-----------------------------------------------------------------------------------------*/
bool User::passwordIsRight()
{int iPass;bool right=true;cout<<"输入密码:";iPass=inputpassw();if(iPass!=password){right = false;cout<<"输入密码错误,不能继续操作!"<<endl;}return right;
}void User::showName()
{cout<<"用户名:"<<name<<endl;}void User::showMoney(string prompt)
{cout<<prompt<<money<<endl;
}bool User::isNormalUser()            //判断用户状态是否正确
{bool normal = true;if(status!=0){normal = false;cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能继续操作..."<<endl;}return normal;
}
void User::displays()
{cout<<"卡号:"<<account<<endl;cout<<"姓名:";cout<<name<<endl;cout<<"地址:";cout<<dizhi<<endl;cout<<"电话: ";for(int n=0;n<11;n++){cout<<phone[n];}
cout<<endl;
}

运行结果

1.业务员登录


2.开户


3.销户


4.存款


5.取款


6.查询


7.转账


8.挂失与解挂


9.修改信息






10.查看个人信息


11.退出


用到的文件:

staff.txt(业务员)


users.txt(用户)



time.txt(业务)


学习总结:

  总觉得还有bug,这一个星期每天改一点,每天都有新成果,直到今天上午运行成功,心里真的很兴奋,都说写一个程序用不了多久,调程序才费时间,恩,深深地体会到了来自程序的恶意。对于这种大程序,一定要耐住性子,加油!

这篇关于银行储蓄系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176228

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has