⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menufunc.cpp

📁 银行仿真系统 简单易行的银行系统 具有用户登录 利率查询 转帐等功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "head.h"
#include<fstream>
#include<vector>
bool protect(Account * inewP)						//密码保护									
{
	char key[7];
	for(int i = 0 ; i < 3 ; i ++)					//有3次机会
	{
		cout << "请您输入6位密码: ";
		cin >> key;
		if(strcmp(key,inewP->GetPass()) == 0)
			return 1;								//正确返回1
		else
			cout << "密码输入有误!";
	}
	return 0;										//三次均有误,返回0

}

bool protect(Enter * inewP)						//密码保护									
{
	char key[7];
	for(int i = 0 ; i < 3 ; i ++)					//有3次机会
	{
		cout << "请您输入6位密码: ";
		cin >> key;
		if(strcmp(key,inewP->Getpass()) == 0)
			return 1;								//正确返回1
		else
			cout << "密码输入有误!";
	}
	return 0;										//三次均有误,返回0

}

void ChangDay(Date & date )						//更新日期								
{
	cout << "请正确输入当前 年 月 日 : ";
	cin >> date.year >> date.month >> date.day;
}

Account * Add()                  //添加账户
{
	char fname[35];	   			//帐户名
	double fmoney;				//本金
	char fID[19];				//银行卡号或者存折号码
	Date fLastDay;				//最后存款日期
	char fpassword[7],fpass[7];	//取款时需在密码器上输入6位密码
	char telnum[12];
	cout << "请输入帐户姓名: ";
	cin >> fname;
	cout << "请输入银行卡号或者存折号码: ";
	cin >> fID;
	cout << "请输入6位数字密码: ";
	cin >> fpassword;
	for(int i=0;i<6;i++)                         //判断输入是否为六位数字
	{
		if((fpassword[i]<48)||(fpassword[i]>57))
		{
			cout<<"应输入六位数字,请重新输入"<<endl;
			cin>>fpassword;
			i=0;
		}
	}
	cout << "请再次输入6位密码: ";
	cin >> fpass;
	while ( strcmp(fpassword,fpass) != 0){
		cout << "输入的密码不一致."<< endl 
			<<"请重新输入: ";
		cin >> fpass;
	}
	ChangDay( fLastDay );			//更新日期
	cout << "请输入要储存的金额(元):  " ;
	cin >> fmoney;
	cout<<"请输入您的手机号码(没有请输'0')  "<<endl;
	cin>>telnum;
	Telephone tTel(telnum,0);
	Account * newone = new Account(fname,fmoney,fID,fLastDay.year,fLastDay.month,fLastDay.day,fpassword,NULL,0.01,tTel);
	if(!newone)						//申请不上内存
	{
		cout << "内存不足!" << endl;
		exit(-1);
	}
	return newone;
}

Enter * Addclerk()       //添加管理员
{
	char fname[35];	   			//管理员编号
	char fpassword[7],fpass[7];	//管理员密码
	cout << "请输入管理员编号: ";
	cin >> fname;
	cout << "请输入6位数字密码: ";
	cin >> fpassword;
	for(int i=0;i<6;i++)                         //判断输入是否为六位数字
	{
		if((fpassword[i]<48)||(fpassword[i]>57))
		{
			cout<<"应输入六位数字,请重新输入"<<endl;
			cin>>fpassword;
			i=0;
		}
	}
	cout << "请再次输入6位密码: ";
	cin >> fpass;
	while ( strcmp(fpassword,fpass) != 0){
		cout << "输入的密码不一致."<< endl 
			<<"请重新输入: ";
		cin >> fpass;
	}
	Enter * newone = new Enter(fname,fpassword);
	if(!newone)						//申请不上内存
	{
		cout << "内存不足!" << endl;
		exit(-1);
	}
	return newone;
}

Account *ReadFile()                                        //读取用户文件并返回用户文件中链表的head
{
	Account *head=NULL,*p0=NULL,*p1=NULL;	
    char fname[35],tele[15];//帐户名
	double fmoney,a;				//本金
	char fID[19];				//18位身份证号码
	Date fLastDay;				//最后存款日期
	char fpassword[7];	//取款时需在密码器上输入6位密码
	ifstream infile("Customer.txt"); //读取文件
	if(infile)
	{infile>>fname>>fmoney>>fID>>fLastDay.year>>fLastDay.month>>fLastDay.day>>fpassword>>tele>>a;
		while((infile.eof())!=1) //判断是否到文件的结尾
		{
	       p0 = new Account(fname,fmoney,fID,fLastDay.year,fLastDay.month,fLastDay.day,fpassword,tele,a);
	       if(head==NULL)head=p0;
	       else p1->pointer=p0;
	       p1=p0;
		   infile>>fname>>fmoney>>fID>>fLastDay.year>>fLastDay.month>>fLastDay.day>>fpassword>>tele>>a;
		}
	     if(head!=NULL)
		 { 
		   p0->pointer=NULL;
	       infile.close();
		 }
	}
	return head;
}

Account * Find(Account * ihead)							//寻找帐户的基础函数
{
	Account * p , * q;		
	char fID[19];
	cout << "请输入银行卡号或者存折号码:  " ;
	cin >> fID;
	p = ihead;
	q = p;
	while(p)
	{
		if(strcmp(fID,p->GetID()) != 0 )		//p所指的帐户不是所求,移动p,q一位
		{
			q = p;
			p = p->pointer;
		}
		else			
			break;								//找到了帐户
	}
	if(!p)return NULL;										//找不到则返回NULL,即不存在帐户记录
	return p;
}


Enter * Find(Enter * ihead)							//寻找管理员的基础函数
{
	Enter * p , * q;		
	char fID[19];
	cout << "请输入管理员编号:  " ;
	cin >> fID;
	p = ihead;
	q = p;
	while(p)
	{
		if(strcmp(fID,p->Getnum()) != 0 )		//p所指的管理员不是所求,移动p,q一位
		{
			q = p;
			p = p->pointer;
		}
		else			
			break;								//找到了管理员
	}
	if(!p)return NULL;										//找不到则返回NULL,即不存在帐户记录
	return p;
}

Account * ProFind( )	//寻找帐户(若是空列表则选择添加新帐户,或以后添加)
{
	Account *pnewP=NULL, *head=NULL,*q=NULL;
	char YorN;
	if((q=Find(ReadFile()))==NULL)     //判断账户是否存在
		{
			cout << "帐户不存在." << endl << "添加帐户请按'Y',以后添加请按其他键." << endl;
		    cin >> YorN;
		   if(YorN == 'Y' || YorN == 'y')
		   {
			  pnewP = Add();			  //添加帐户
			  FileCustomer(pnewP,ReadFile());//将最新用户信息写入文件
			  return NULL;
		   }
		   cout << endl;
		   return NULL;
		}
	else return q;
}

Account *FindCustomer(Account *p,Account  *head)    //判断该用户是否修改过密码
{
	Account *p0;
	p0=head;
	while(p0!=NULL)
	{
		if(strcmp(p0->GetID(),p->GetID())==0)
		{
			if(((p->GetDay().year)*365+(p->GetDay().month)*30.5+(p->GetDay().day)-(p0->GetDay().year)*365-(p0->GetDay().month)*30.5-(p0->GetDay().day))>=7)
			{
				cout<<"您于7天前修改的密码已经生效!"<<endl;
				p->ChaPass(p0->GetPass());
				Delete(p0,head);    //删除修改过密码的用户文件中密码已经生效的用户
				return p;
			}
		}
		p0=p0->pointer;
	}
	return p;
}

void Delete(Account *p,Account *head)   //删除修改过密码的用户文件中链表中密码已经生效的用户
{
	Account *p0,*p1;
	p1=head;
	if(p1->pointer==NULL)head=NULL;
	else if(p==p1)head=p1->pointer;
	else while((p!=p1)&&(p1->pointer)!=NULL)
	{
		p0=p1;
		p1=p1->pointer;
	}
	if(p==p1)p0->pointer=p1->pointer;
	else p0->pointer=NULL;
	FileCustomer3(head);      //将修改过密码的用户文件刷新
}

void FileCustomer3(Account *p2)                //将修改过密码的用户文件刷新
{
  ofstream ofile("Customer(change password).txt");  //将修改过密码的用户写入文件
  while(p2!=NULL)
  {
   ofile<<p2->GetName()<<" "<<p2->GetMon()<<" "<<p2->GetID()<<" "<<p2->GetDay().year<<" "<<p2->GetDay().month<<" "<<p2->GetDay().day<<" "<<p2->GetPass()<<" "<<p2->Tel.TelNum()<<" "<<p2->Tel.Getremain()<<endl;
   p2=p2->pointer;
  }  
  ofile.close();
}


Enter * proFind()	//寻找管理员
{
    Enter *q;
	if((q=Find(ReadFile1()))==NULL)
	{
		cout << "此管理员不存在." << endl;
		return NULL;
	}
	else return q;
}

Enter * ReadFile1()     //读取管理员文件并返回职员文件中链表的head
{
  Enter *p0=NULL,*p1=NULL,*head=NULL;
  char num[10],password[7];
  ifstream file("Clerk.txt");  //读取管理员信息
	if(file)
	{
		file>>num>>password;
		while((file.eof())!=1)
		{
	       p0 = new Enter(num,password);
	       if(head==NULL)head=p0;
	       else p1->pointer=p0;
	       p1=p0;
		   file>>num>>password;
		}
	     if(head!=NULL)
		 { 
		   p0->pointer=NULL;
	       file.close();
		 }
	}
	return head;
}

void FileClerk(Enter *pnewP,Enter *head)       //将最新职员信息写入文件
{Enter *p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL;
int i=0;
p1=head;
if(p1==NULL)
{
	head=pnewP;
    pnewP->pointer=NULL;
}
else 
{
	while(p1!=NULL)
	{
		p4=p1->pointer;
		if(p1==head)
		{ 
			if(strcmp(p1->Getnum(),pnewP->Getnum())==0)
			{  head=pnewP;
			   head->pointer=p4;
		       i++;
			   break;
			}
		}
		else 
		{
			  if(strcmp(p1->Getnum(),pnewP->Getnum())==0)
			  {
				 p3->pointer=pnewP;
				 pnewP->pointer=p4;
				 i++;
				 break;
			  }
		}
	    p3=p1;
	    p1=p1->pointer;
	}
    if(i==0)
	{
		p3->pointer=pnewP;
        pnewP->pointer=NULL;
	}
}
p2=head;
ofstream ofile("Clerk.txt");   //将最新职员信息写入文件
while(p2!=NULL)
{
   ofile<<p2->Getnum()<<" "<<p2->Getpass()<<" "<<endl;
   p2=p2->pointer;
}  
ofile.close();
cout << "职员信息已更新!" << endl;
}

Account *ReadFile2()     //读取用户信息并返回修改过密码的用户文件中链表的head
{
    Account *head=NULL,*p0=NULL,*p1=NULL;	
    char fname[35],tele[15];//帐户名
	double fmoney,a;				//本金
	char fID[19];				//18位身份证号码
	Date fLastDay;				//最后存款日期
	char fpassword[7];	//取款时需在密码器上输入6位密码
	ifstream infile("Customer(change password).txt"); //读取用户信息
	if(infile)
	{infile>>fname>>fmoney>>fID>>fLastDay.year>>fLastDay.month>>fLastDay.day>>fpassword>>tele>>a;
		while((infile.eof())!=1)
		{
	       p0 = new Account(fname,fmoney,fID,fLastDay.year,fLastDay.month,fLastDay.day,fpassword,tele,a);
	       if(head==NULL)head=p0;
	       else p1->pointer=p0;
	       p1=p0;
		   infile>>fname>>fmoney>>fID>>fLastDay.year>>fLastDay.month>>fLastDay.day>>fpassword>>tele>>a;
		}
	     if(head!=NULL)
		 { 
		   p0->pointer=NULL;
	       infile.close();
		 }
	}
	return head;
}

void FileCustomer(Account *pnewP,Account *head)   //将最新用户信息写入文件
{Account *p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL;
int i=0;
p1=head;
if(p1==NULL)
{
	head=pnewP;
    pnewP->pointer=NULL;
}
else 
{
	while(p1!=NULL)
	{
		p4=p1->pointer;
		if(p1==head)
		{ 
			if(strcmp(p1->GetID(),pnewP->GetID())==0)
			{  head=pnewP;
			   head->pointer=p4;
		       i++;
			   break;
			}
		}
		else 
		{
			  if(strcmp(p1->GetID(),pnewP->GetID())==0)
			  {
				 p3->pointer=pnewP;
				 pnewP->pointer=p4;
				 i++;
				 break;
			  }
		}
	   p3=p1;
	   p1=p1->pointer;
	}
    if(i==0)
	{
		p3->pointer=pnewP;
        pnewP->pointer=NULL;
	}
}
p2=head;
ofstream ofile("Customer.txt"); //将用户信息写入文件
while(p2!=NULL)
{
   ofile<<p2->GetName()<<" "<<p2->GetMon()<<" "<<p2->GetID()<<" "<<p2->GetDay().year<<" "<<p2->GetDay().month<<" "<<p2->GetDay().day<<" "<<p2->GetPass()<<" "<<p2->Tel.TelNum()<<" "<<p2->Tel.Getremain()<<endl;
   p2=p2->pointer;
}  
ofile.close();
cout << "帐户已更新!" << endl;
}


Account * Withdraw(Account * person)					//帐户取款
{
	double wMoney;
	Date wDay;
	if(!protect(person))						//三次输入密码均不正确,quit
		return NULL;	
	person->UpdatePro();						//更新存款(加利息)
	cout << "请输入要提取的金额(单位:元)  ";
	cin >> wMoney;
	while( wMoney > person->GetMon() )
	{
		cout << "取款金额超出存款金额!" << endl << "请重新输入提取金额(单位:元)  " ;
		cin >> wMoney;
	}
	person->ChaMon(person->GetMon() - wMoney);
	cout << "取款成功!" << endl;
	cout << "您的余额还有:  "<<person->GetMon() << endl;
	return person;	
}

Account * Deposit(Account * dperson)					//帐户存款

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -