📄 menufunc.cpp
字号:
#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 + -