




 





 






#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;
         }
  
 }