#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"conio.h"
#include"time.h"
#define N 20
#define M 20
#define TRUE 1
#define FALSE 0
#define MIN_INPUT ' '
#define MAX_INPUT 127 //127即0x7e
struct jilu
{
float add; //存款金额
float dra; //取款金额
char dname[20]; //识别账号
char dnum[20];//识别姓名
char ope[20];//经办人姓名
char time[128]; //系统当前时间
float sy; //剩余金额
};
struct depositor
{
char num[20]; //客户账号
char name[20]; //客户姓名
char per[20]; //用户身份证号
char sec[20]; //用户密码
float mon; //存款金额
char addr[20]; //储户地址
};
void menu();
int GetPassword(unsigned char* pszPw,int iMaxSize);//使输入的密码显示为*
int reads(struct depositor dep[N]);//从文件中读入客户信息
int readsc(struct jilu jl[M]); //从文件读入存款记录
int readsd(struct jilu jl[M]); //从文件读入取款记录
void save(struct depositor dep[N],int n); //保存修改后的客户信息数据
void add(); //开户函数
void del(); //销户函数
void change(); //改密函数
void show(); //显示余额函数
void show1();//存款
void show2();//存款记录
void show3();//取款
void show4();//取款记录
void show5();//清屏函数
void show6();
void show7(char panduan[20]);
void main()
{
int n;
system("color 1e");
while(1)
{
menu();
printf("\n请输入您要选择的操作序号,按回车键确认:");
scanf("%d",&n);
switch(n)
{
case 1: add();break;
case 2: show();break;
case 3: del();break;
case 4: change();break;
case 0: exit(0);
case 5: show1();break;
case 6: show2();break;
case 7: show3();break;
case 8: show4();break;
case 9: show6();break;
default: printf("\n输入错误,请输入列表中存在的序号!\n ");
show5();
}
}
}
void menu() //菜单函数
{
printf("\n******************************* 银行个人账户管理系统 **************************** ");
printf("\n 1 储户开户");
printf("\n 2 余额查询");
printf("\n 3 储户销户");
printf("\n 4 密码修改");
printf("\n 5 存款");
printf("\n 6 个人存款记录");
printf("\n 7 取款");
printf("\n 8 个人取款记录");
printf("\n 0 退出");
printf("\n 9 查询所有客户存款记录");
printf("\n\n******************************************************************************** ");
}
int
reads(struct depositor dep[N]) // 读取储户内容
{
FILE *fp;
int i=0;
if((fp=fopen("account.txt","r"))==NULL)
{
printf("文件打开失败!\n");
show5();
return 0;
}
else
{
for(i=0;!feof(fp);i++)
fscanf(fp,"\n%s %s %s %s %f %s\n",dep[i].name,dep[i].num,dep[i].per,dep[i].sec,&dep[i].mon,dep[i].addr);
} fclose(fp);
return i;
}
int readsc(struct jilu jl[M]) //读取存款记录
{
FILE *fp;
int i=0;
if((fp=fopen("cun.txt","r"))==NULL)
{
printf("文件打开失败!没有任何存款记录\n");
return 0;
}
else
{
for(i=0;!feof(fp);i++)
fscanf(fp,"\n%s %f %s %s %s %f\n",jl[i].dnum,&jl[i].add,jl[i].dname,jl[i].ope,jl[i].time,&jl[i ].sy);
fclose(fp);
return i;
}
}
int readsd(struct jilu jl[M]) //读取取款记录
{
FILE *fp;
int i=0;
if((fp=fopen("qu.txt","r"))==NULL)
{
printf("文件打开失败!没有任何取款记录\n");
return 0;
}
else
{
for(i=0;!feof(fp);i++)
fscanf(fp,"\n%s %f %s %s %s %f\n",jl[i].dnum,&jl[i].dra,jl[i].dname,jl[i].ope,jl[i].time,&jl[i].sy);
}
fclose(fp);
return i;
}
void save(struct depositor dep[N],int n) // 储户保存后信息
{
FILE *fp;
int i=0;
if((fp=fopen("account.txt","w"))==NULL)
{
printf("文件打开失败!\n");
show5();
return;
}
else
{
for(i=0;i<n;i++)
{
fprintf(fp,"\n%s %s %s %s %f %s\n",dep[i].name,dep[i].num,dep[i].per,dep[i].sec,dep[i].mon,dep[i].addr);
}
}
fclose(fp);
}
void add()/*储户开户*/
{
FILE *fp;
unsigned char pw[99];
struct depositor dep;
char panduan[20];
int iMaxSize=80;
system("cls");
if((fp=fopen("account.txt","a"))==NULL) //如果文件已经存在,可以追加储户信息
{
if((fp=fopen("account.txt","w"))==NULL) // 文件不存在时,创建新文件,输入储户信息
{
printf("用户不存在!\n");
show5();
return ;
}
}
printf("\n请依次填写储户信息,以回车键作为间隔\n");
printf("\n账号: ");
scanf("%s",dep.name);
strcpy(panduan,dep.name);
show7(panduan);
fprintf(fp,"\n%s\n",panduan);
printf("\n姓名: " );
scanf("%s",dep.num);
fprintf(fp,"\n%s\n",dep.num);
printf("\n电话:");
scanf("%s",dep.per);
fprintf(fp,"\n%s\n",dep.per);
printf("\n密码:");
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(dep.sec,pw);
fprintf(fp,"\n%s\n",dep.sec);
printf("\n\n请重新输入密码,按回车键确认:");
if( GetPassword(pw,iMaxSize) == TRUE )
while(strcmp(pw,dep.sec)!=0)
{printf("\n\n输入的密码错误,请重新输入:");
if( GetPassword(pw,iMaxSize) == TRUE );}
printf("\n\n金额:");
scanf("%f",&dep.mon);
fprintf(fp,"\n%f\n",dep.mon);
printf("\n住址:");
scanf("%s",dep.addr);
fprintf(fp,"\n%s\n",dep.addr);
if(dep.mon<10 )
{
printf("\n 储户金额低于十元,不予开户 \n");
show5();
return;
}
printf("\n*************************************开 户 成 功 ********************************** ");
show5();
fclose(fp);
}
void show() //余额查询
{
unsigned char pw[99];
int iMaxSize=80;
struct depositor dep[N];
int i,n;
char s[20];
char t[20];
system("cls");
n=reads(dep);
printf("\n请用户输入账号,密码,用回车隔开,按回车键确认:\n\n");
scanf("%s",s);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if (strcmp(s,dep[i].name)==0 && strcmp(t,dep[i].sec)==0)
break;
if (i>=n ||strcmp(t,dep[i].sec)!=0)
{
printf("\n输入错误\n");
show5();
return ;
}
else
{
printf("\n*********************************储户余额如下 *********************************** ");
printf("\n%.2f\n", dep[i].mon);
show5();
}
}
void show1() //存款
{
unsigned char pw[99];
int iMaxSize=80;
FILE *fp;
int i,n;
char s[20];
char t[20] ;
struct depositor dep[N];
struct jilu jl;
system("cls");
n=reads(dep);
printf("\n请用户输入账号,密码,用回车隔开,按回车键确认:\n\n");
scanf("%s",s);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if (strcmp(s,dep[i].name)==0 &&strcmp(t,dep[i].sec)==0)
break;
if (i>=n ||strcmp(t,dep[i].sec)!=0)
{
printf("\n 输入错误 \n");
show5();
return ;
}
else
{
if((fp=fopen("cun.txt","a"))==NULL) //如果文件已经存在,可以追加储户信息
{
if((fp=fopen("cun.txt","w"))==NULL) // 文件不存在时,创建新文件,输入储户信息
{
printf("记录不存在!\n");
show5();
return;
}
}
strcpy(jl.dnum,dep[i].num);
fprintf(fp,"\n%s\n",jl.dnum);
printf("\n请输入存款金额,并按回车键确认:\n\n");
scanf("%f",&jl.add);
fprintf(fp,"\n%f\n",jl.add);
strcpy(jl.dname,dep[i].name);
fprintf(fp,"\n%s\n",jl.dname);
printf("\n请输入操作员姓名,并按回车键确认:\n\n");
scanf("%s",jl.ope);
fprintf(fp," %s",jl.ope);
_tzset();
_strtime(jl.time);
_strdate(jl.time);
fprintf(fp,"\n%s\n",jl.time);
jl.sy=jl.add+dep[i].mon;
fprintf(fp,"\n%f\n",jl.sy);
dep[i].mon=dep[i].mon+jl.add;
save(dep,n);
printf("\n您已成功存款%.f\n",jl.add);
printf("\n现在总金额为%.f\n",dep[i].mon);
show5();
}
fclose(fp);
}
void show2() //存款记录
{
unsigned char pw[99];
int iMaxSize=80;
FILE *fp;
int i,n,z,k,l=1;
char s[20];
char t[20];
struct depositor dep[N];
struct jilu jl[M];
system("cls");
z=readsc(jl);
n=reads(dep);
if((fp=fopen("cun.txt","r"))!=NULL)
{
printf("\n请用户输入账号,密码,用回车隔开,按回车键确认:\n\n");
scanf("%s",s);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if (strcmp(s,dep[i].name)==0 &&strcmp(t,dep[i].sec)==0)
break;
if (i>=n||strcmp(t,dep[i].sec)!=0)
{
printf("\n 输入错误 \n");
show5();
return ;
}
else
printf("\n存款记录如下:\n\n编号 存款金额 存款时间 剩余金额 操作员\n");
for(k=0;k<z;k++)
{
if(strcmp(dep[i].name,jl[k].dname)==0)
printf("\n%-8d%-12.f%-12s%-12.f%s\n",l++,jl[k].add,jl[k].time,jl[k].sy,jl[k].ope);
}
show5();
}
else
show5();
}
void show3() //取款
{
unsigned char pw[99];
int iMaxSize=80;
FILE *fp;
int i,n;
char s[20];
char t[20];
struct depositor dep[N];
struct jilu jl;
system("cls");
n=reads(dep);
printf("\n请用户输入账号,密码,用回车隔开,按回车键确认:\n\n");
scanf("%s",s);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if (strcmp(s,dep[i].name)==0 &&strcmp(t,dep[i].sec)==0)
break;
if (i>=n ||strcmp(t,dep[i].sec)!=0)
{
printf("\n输入错误 \n");
show5();
return ;
}
else
{
if((fp=fopen("qu.txt","a"))==NULL) //如果文件已经存在,可以追加储户信息
{
if((fp=fopen("qu.txt","w"))==NULL) // 文件不存在时,创建新文件,输入储户信息
{
printf("记录不存在!\n");
show5();
return ;
}
}
strcpy(jl.dnum,dep[i].num);
fprintf(fp,"\n%s\n",jl.dnum);
printf("\n请输入取款金额,并按回车键确认:\n\n");
scanf("%f",&jl.dra);
if(jl.dra<=dep[i].mon)
{
fprintf(fp,"\n%f",jl.dra);
strcpy(jl.dname,dep[i].name);
fprintf(fp,"\n%s\n",jl.dname);
printf("\n请输入操作员姓名,并按回车键确认:\n\n");
scanf("%s",jl.ope);
fprintf(fp,"\n%s\n",jl.ope);
_tzset();
_strtime(jl.time);
_strdate(jl.time);
fprintf(fp,"\n%s\n",jl.time);
jl.sy=dep[i].mon-jl.dra;
fprintf(fp,"\n%f\n",jl.sy);
dep[i].mon=dep[i].mon-jl.dra;
save(dep,n);
printf("\n您已成功取款%.f\n",jl.dra);
printf("\n现在总金额为%.f\n",dep[i].mon);
show5();
}
else
{
printf("\n取款金额大于剩余金额,取款失败\n");
show5();
}
}
fclose(fp);
}
void show4() //取款记录
{
unsigned char pw[99];
int iMaxSize=80;
FILE *fp;
int i,n,z,k,l=1;
char s[20];
char t[20];
struct depositor dep[N];
struct jilu jl[M];
system("cls");
z=readsd(jl);
n=reads(dep);
if((fp=fopen("qu.txt","r"))!=NULL)
{
printf("\n请用户输入账号,密码,用回车隔开,按回车键确认:\n\n");
scanf("%s",s);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if (strcmp(s,dep[i].name)==0 &&strcmp(t,dep[i].sec)==0)
break;
if (i>=n || strcmp(t,dep[i].sec)!=0)
{
printf("\n 输入错误 \n");
show5();
return ;
}
else
{
printf("\n取款记录如下:\n\n编号 取款金额 取款时间 剩余金额 操作员\n");
for(k=0;k<z;k++)
if(strcmp(dep[i].name,jl[k].dname)==0)
printf("\n%-8d%-12.f%-12s%-12.f%s\n",l++,jl[k].dra,jl[k].time,jl[k].sy,jl[k].ope);
show5();
}
}
else
show5();
}
void del() //储户信息删除函数
{
unsigned char pw[99];
int iMaxSize=80;
struct depositor dep[N];
char number[20];
char t[20];
int n,i,j;
system("cls");
n=reads(dep);
printf("\n请输入要删除储户账号,密码,用回车隔开,按回车键确认:");
scanf("%s",number);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
for(i=0;i<n;i++)
if(strcmp(number,dep[i].name)==0 && strcmp(t,dep[i].sec)==0)
break;
if(i>=n || strcmp(t,dep[i].sec)!=0)
{
printf("没有找到该储户信息!\n");
show5();
return;
}
else
{
for(j=i+1;j<n;j++)
dep[j-1]=dep[j];
}
save(dep,n-1);
printf("销户成功!\n");
show5();
} void change() //储户密码更改
{
unsigned char pw[99];
int iMaxSize=80;
struct depositor dep[N];
int n,i;
char t[20];
char number[20];
system("cls");
printf("\n请输入要更改密码的储户账号,密码,用空格隔开,按回车键确认:\n");
scanf("%s",number);
if( GetPassword(pw,iMaxSize) == TRUE )
strcpy(t,pw);
n=reads(dep);
for(i=0;i<n;i++)
if(strcmp(number,dep[i].name)==0 &&strcmp(t,dep[i].sec)==0)
break;
if(i>=n ||strcmp(t,dep[i].sec)!=0)
{
printf("无此储户信息!");
show5();
return;
}
printf("\n请输入更改后密码,按回车键确认:\n");
scanf("%s",&dep[i].sec);
save(dep,n);
printf("\n修改成功\n");
show5();
}
void show5()//该函数控制清屏
{
int c;
printf("\n确认请按1\n\n");
scanf("%d",&c);
if(c==1)
system("cls");
} /*函数整体功能为使输入的密码在控制台显示为* * 所有功能有此函数实现: * pszPw : 保存密码的缓冲 * iMaxSize :最大的密码长度,该长度必须小于缓冲区大小。 * 返回值为TRUE为成功获取密码。总是返回TRUE */
int GetPassword(unsigned char* pszPw,int iMaxSize)
{
unsigned char ch;
int i=0;
int bIsEcho=TRUE;
//while( ! kbhit() && i<iMaxSize )
while( ( ch = (unsigned char)getch() ) && i < iMaxSize )
{
//ch = (unsigned char)
getch();
bIsEcho=TRUE;
if ( ch == 13)
{
pszPw[i++]=0;
break;
}
else if
( ch >= MIN_INPUT && ch <= MAX_INPUT) /*所有可打印字符*/
{
pszPw[i++]=ch;
}
else if
( ch == 8 && i> 0 ) /*退格键*/
{
pszPw[i--] = 0; bIsEcho = FALSE; putchar( ch );
putchar( ' ' );
putchar( ch );
}
else bIsEcho = FALSE;
if(bIsEcho) putchar('*');
}
pszPw[i]=0;
return TRUE;
}
void show6()
{
FILE *fp;
int n,z,k,l,j;
struct depositor dep[N];
struct jilu jl[M];
system("cls");
z=readsc(jl);
n=reads(dep);
if((fp=fopen("cun.txt","r"))!=NULL)
for(j=0;j<n;j++)
{
l=1;
for(k=0;k<z;k++)
if(strcmp(dep[j].name,jl[k].dname)==0)
{
printf("\n账号:%s\t\t姓名:%s\n",dep[j].name,dep[j].num);
break;
}
printf("\n存款记录如下:\n\n编号 存款金额 存款时间 剩余金额 操 作员\n");
for(k=0;k<z;k++)
{
if(strcmp(dep[j].name,jl[k].dname)==0)
printf("\n%-8d%-12.f%-12s%-12.f%s\n",l++,jl[k].add,jl[k].time,jl[k].sy,jl[k].ope);
}
}
show5();
}
void show7(char panduan[20])
//控制所输入的账号不能和文件中已有的账号一样,若相同则必须重新输入
{
int i=0;
struct depositor dep[N];
int n=reads(dep);
for(;i<n;i++)
while(strcmp(panduan,dep[i].name)==0)
{printf("\n此账号已存在,请重输:\n\n");
scanf("%s",panduan);
i=0;
}
}