C语言银行系统课程设计分享!

本文为大家分享了C语言银行系统课程设计,供大家参考,具体内容如下

main.c

  #include <stdio.h>   #include <stdlib.h>   #include <string.h>   #include <conio.h>   #include <windows.h>   #define MaxNum 200   #define N_P 6   typedef struct   {    int AccountNumber[3];    char name[20];    char password[N_P+1];    unsigned long amount;    int state;   } Account;   void Load(FILE *,Account *);   void ShowMenu(int );   int MakeChoice(int );   void EnterPassword(char *);   void CreatAccount(unsigned char *,Account *,int); //第一个参数为加密关键字,第二个参数为账户序号   int JudgePassword(char *,char *);   int decrypt(int *,unsigned char *);   void LogIn(unsigned char *,Account *,int); //第二个参数为当前账户数目,登陆成功返回1,失败返回0   int EnterAccountNumber(unsigned char *,int );   void EnterNum(char *,int );   void Operate(unsigned char *,Account *,int ,int );   void ShowSubMenu(char *);   void AdministratorMode(unsigned char *,unsigned char *,Account *,char *,int);   void ShowAdministratorMenu();   void WriteToFile(FILE *,unsigned char *,Account*,char *,int);   int main()   {    FILE *fp;    int i,total;    unsigned char key[4],key_en[4];    char administrator_password[10];    Account *user;    user=(Account *)malloc(sizeof(Account)*MaxNum);    fp=fopen("bank.txt","r+");    if(fp==NULL)    {     printf("银行数据库无法打开,按任意键结束程序!n");     getch();     exit(1);    }    fscanf(fp,"%dn%sn%s",&total,administrator_password,key);    for(i=0;i<3;++i)//用key_en保存key的值     key_en[i]=key[i];    key_en[0]=(key_en[0]<<3)|(key_en[0]>>(sizeof(key_en[0])*8-3));    key_en[2]=(key_en[2]>>3)|(key_en[2]<<(sizeof(key_en[2])*8-3));    Load(fp,user);//将数据存入数组user中    while(1)    {     system("cls");     ShowMenu(total);     switch(MakeChoice(4))     {     case 1:      system("cls");      LogIn(key_en,user,total);      break;     case 2:      system("cls");      CreatAccount(key_en,user,total++);      break;     case 3:      system("cls");      AdministratorMode(key,key_en,user,administrator_password,total);      break;     default:      system("cls");      WriteToFile(fp,key,user,administrator_password,total);      return 0;     }    }    return 0;   }       

function.c

  #include <stdio.h>   #include <stdlib.h>   #include <string.h>   #include <conio.h>   #include <windows.h>   #define MaxNum 200   #define N_P 6   //账户状态 0为正常 1为挂失 2为冻结 3为销户   typedef struct   {    int AccountNumber[3];    char name[20];    char password[N_P];    unsigned long amount;    int state;   } Account;   void Load(FILE *,Account *);   void ShowMenu(int );   int MakeChoice(int );   void EnterPassword(char *);   void CreatAccount(unsigned char *,Account *,int); //第一个参数为加密关键字,第二个参数为账户序号   int JudgePassword(char *,char *);   int decrypt(int *,unsigned char *);   void LogIn(unsigned char *,Account *,int); //第二个参数为当前账户数目,登陆成功返回1,失败返回0   int EnterAccountNumber(unsigned char *,int );   void EnterNum(char *,int );   void Operate(unsigned char *,Account *,int,int );   void ShowSubMenu(char *);   void AdministratorMode(unsigned char *,unsigned char *,Account *,char *,int);   void ShowAdministratorMenu();   void WriteToFile(FILE *,unsigned char *,Account*,char *,int);   void Load(FILE *fp,Account *user)   {    int count=0;    //将文件中的用户信息存到数组中    while(fscanf(fp,"n%d%d%d %s %s %lu %dn",&user[count].AccountNumber[0],&user[count].AccountNumber[1],        &user[count].AccountNumber[2],user[count].name,        user[count].password,&user[count].amount,&user[count].state)!=EOF)     ++count;   }   void ShowMenu(int total)   {    printf("****中国银行烟大计163-1分行****n");    printf("目前共有%d名注册用户*****n",total);    printf("1.登陆*************************n");    printf("2.开户*************************n");    printf("3.进入管理员模式***************n");    printf("4.退出*************************n");   }   int MakeChoice(int n)   {    int judge;    printf("请输入1~%dn",n);    scanf("%d",&judge);    while(judge<1||judge>n)//确保输入的是1~n    {     printf("输入不合法,请输入1~%dn",n);     fflush(stdin);//如果不加这句,输入一些字母会导致函数无限循环     scanf("%d",&judge);    }    return judge;   }   void EnterPassword(char *password)   {    int i;    char t;    for(i=0; i<N_P; ++i)    {     t=getch();     if(t=='b')//执行退格删除操作     {      printf("b b");      i-=2;      continue;     }     while(t<'0'||t>'9')      t=getch();     password[i]=t;     putchar('*');    }   }   void EnterNum(char *s,int n)   {    int i=0;    char t;    while(i<n)    {     t=getch();     if(t=='b')     {      printf("b b");      --i;      continue;     }     else if(t=='r'||t=='n')      break;     while(t<'0'||t>'9')      t=getch();     s[i]=t;     putchar(t);     ++i;    }   }   int JudgePassword(char *temp_password,char *password)   {    int i;    for(i=0; i<N_P; ++i)    {     if(temp_password[i]!=password[i])      break;    }    if(i==N_P)     return 0;    else     return 1;   }   void CreatAccount(unsigned char *key,Account *user,int num)   {    if(num>=MaxNum)    {     printf("银行用户数量已达到上限!n按任意键返回主界面");     getch();     return;    }    int i,flag,num_de[3];    int num_en[3];    char temp_password[N_P],password[N_P];    //将num的个位十位和百位分解,num_de[2]存个位,以此类推    for(i=0; i<3; ++i)     num_de[i]=0;    for(i=0; i<3; ++i)     num_en[i]=0;    if(num<10)     num_de[2]=num;    else if(num<100)    {     num_de[2]=num%10;     num_de[1]=num/10;    }    else    {     for(i=0; i<3; ++i)     {      num_de[i]=num%10;      num/=10;     }    }    //分解完成    while(1)    {     flag=0;     printf("请输入用户姓名:");     fflush(stdin);     scanf("%19[^n]",user[num].name);     for(i=0; i<strlen(user[num].name); ++i)     {      if(user[num].name[i]==' ')      {       printf("用户名中不能包含空格!n");       flag=1;       break;      }     }     if(flag==0)      break;    }    for(i=0; i<3; ++i)     num_en[i]=num_de[i]^key[i];    for(i=0; i<3; ++i)     user[num].AccountNumber[i]=num_en[i];    printf("您的账号是:");    for(i=0; i<3; ++i)     printf("%03d ",num_en[i]);    while(1)    {     printf("n请设置密码:");     EnterPassword(password);     printf("n请再次确认密码:");     EnterPassword(temp_password);     if(JudgePassword(temp_password,password))      printf("n两次输入不相等,密码设置失败!");     else     {      strcpy(user[num].password,password);      user[num].password[N_P]='';      break;     }    }    user[num].amount=0;    user[num].state=0;    printf("n账户创建成功!n按任意键返回主菜单");    getch();   }   int decrypt(int *num_en,unsigned char *key)   {    int i,num,num_de[3];    for(i=0; i<3; ++i)     num_de[i]=num_en[i]^key[i];    num=num_de[0]*100+num_de[1]*10+num_de[2];    return num;   }   int EnterAccountNumber(unsigned char *key,int total)   {    int i,num;    int num_en[3];    char num_en_char[3];    while(1)//输入账号    {     printf("请输入账号:");     for(i=0;i<3;++i)     {      EnterNum(num_en_char,3);      num_en[i]=atoi(num_en_char);     }     num=decrypt(num_en,key);     if(num>total)//若num大于total则账号输入错误      printf("n账号输入错误!n");     else      break;    }    return num;   }   void LogIn(unsigned char *key,Account *user,int total)   {    int num,i;    char password[N_P];    num=EnterAccountNumber(key,total);    //判断账户状态    if(user[num].state==3)    {     printf("该账户已销户,无法使用!n");     printf("按任意键返回操作界面");     getch();     return;    }    else if(user[num].state==2)    {     printf("该账户因输入密码错误次数达三次,已冻结!n请进入管理员模式解除异常状态!n");     printf("按任意键返回操作界面");     getch();     return;    }    //判断结束    i=0;    while(1)//输入密码    {     printf("n请输入密码:");     EnterPassword(password);     if(JudgePassword(password,user[num].password)&&(++i<3))      printf("n密码输入错误,您还有%d次机会n",3-i);     else if(i>=3)     {      user[num].state=2;      printf("n密码错误次数过多,账户已冻结!n");      printf("即将返回主界面 ");      for(i=0; i<3; ++i)      {       printf("%d",i);       Sleep(1000);       printf("b");      }      return ;     }     else     {      printf("登陆成功!n");      break;     }    }    Operate(key,user,num,total);   }   void ShowSubMenu(char *name)   {    printf("****欢迎%s登陆本行********n",name);    printf("1.存款*************************n");    printf("2.取款*************************n");    printf("3.查询*************************n");    printf("4.转账*************************n");    printf("5.挂失*************************n");    printf("6.销户*************************n");    printf("7.改密*************************n");    printf("8.返回主菜单*******************n");   }   void Operate(unsigned char *key,Account *user,int num,int total)   {    int i,num_t;    unsigned long amount_t,max=1;    char password[N_P],temp_password[N_P],amount_judge[6];    for(i=0; i<(sizeof(unsigned long)*8-1); ++i) //计算最大存款额max     max*=2;    while(1)    {     system("cls");     ShowSubMenu(user[num].name);     switch(MakeChoice(8))     {     case 1:      system("cls");      while(1)      {       printf("请输入存款金额:");       for(i=0;i<6;++i)        amount_judge[i]='';       EnterNum(amount_judge,5);       amount_t=atol(amount_judge);       if(amount_t>99999)        printf("n单次存款金额为0~99999元,存款失败!n");       else if(amount_t>=max-user[num].amount)        printf("总金额超出上限,存款失败!n");       else       {        user[num].amount+=amount_t;        printf("n存款成功!按任意键返回操作界面");        getch();        system("cls");        break;       }      }      break;     case 2:      system("cls");      if(user[num].state==1)      {       printf("该账户已挂失,无法执行取款操作!n");       printf("按任意键返回操作界面");       getch();       break;      }      while(1)      {       printf("请输入取款金额:");       for(i=0;i<6;++i)        amount_judge[i]='';       EnterNum(amount_judge,5);       amount_t=atol(amount_judge);       if(amount_t>99999)        printf("n单次存款金额为0~99999元,存款失败!n");       else if(amount_t>user[num].amount)        printf("n账户余额不足,取款失败!n");       else       {        user[num].amount-=amount_t;        printf("n取款成功!按任意键返回操作界面");        getch();        system("cls");        break;       }      }      break;     case 3:      system("cls");      printf("用户姓名:%s",user[num].name);      printf("账户余额:%lun",user[num].amount);      printf("账户状态:");      if(user[num].state==1)       printf("已挂失n");      else       printf("正常n");      printf("按任意键返回操作界面");      getch();      system("cls");      break;     case 4:      system("cls");      if(user[num].state==1)      {       printf("该账户已挂失,无法执行转账操作!n");       printf("按任意键返回操作界面");       getch();       break;      }      num_t=EnterAccountNumber(key,total);      while(1)      {       printf("请输入转账金额:");       for(i=0;i<6;++i)        amount_judge[i]='';       EnterNum(amount_judge,5);       amount_t=atol(amount_judge);       if(amount_t>99999)        printf("n单次存款金额为0~99999元,存款失败!n");       else if(amount_t>user[num].amount)        printf("账户金额不足,转账失败!n");       else if(amount_t>=max-user[num_t].amount)        printf("n对方总金额超出上限,转账失败!n");       else       {        user[num].amount-=amount_t;        user[num_t].amount+=amount_t;        printf("n转账成功!按任意键返回操作界面");        getch();        system("cls");        break;       }      }      break;     case 5:      system("cls");      printf("您确定要挂失吗?n");      printf("1.确定 2.取消n");      if(MakeChoice(2)==1)      {       user[num].state=1;       printf("挂失成功!n按任意键返回主界面");       getch();      }      system("cls");      break;     case 6:      system("cls");      printf("您确定要销户吗?销户后所有功能都将无法实现,账户内的存款将冻结!n");      printf("1.确定 2.取消n");      if(MakeChoice(2)==1)      {       user[num].state=3;       printf("销户成功!n按任意键返回主界面");       getch();       system("cls");       return;      }      else       break;     case 7:      system("cls");      while(1)      {       printf("n请输入原密码:");       EnterPassword(password);       if(JudgePassword(password,user[num].password))        printf("n原密码输入错误!n");       else        break;      }      while(1)      {       printf("n请输入新密码:");       EnterPassword(password);       printf("n请再次确认密码:");       EnterPassword(temp_password);       if(JudgePassword(temp_password,password))        printf("n两次输入不相等,密码设置失败!");       else       {        strcpy(user[num].password,password);        break;       }      }      printf("n密码修改成功!n按任意键返回操作界面");      getch();      system("cls");      break;     default:      return;     }    }   }   void AdministratorMode(unsigned char *key_orig,unsigned char *key,Account *user,char *administrator_password,int total)   {    int num;    char password[N_P],temp_password[N_P];    while(1)//输入密码    {     printf("请输入管理员密码密码:");     EnterPassword(password);     if(JudgePassword(password,administrator_password))      printf("密码输入错误!n");     else      break;    }    printf("n登陆成功!按任意键继续");    getch();    while(1)    {     system("cls");     ShowAdministratorMenu();     switch(MakeChoice(6))     {     case 1:      system("cls");      num=EnterAccountNumber(key,total);      printf("请设置密码:");      EnterPassword(password);      printf("您设置的密码是:");      puts(user[num].password);      printf("n按任意键返回操作界面");      getch();      break;     case 2:      system("cls");      num=EnterAccountNumber(key,total);      printf("您确定要解除此用户的挂失状态吗?n");      printf("1.确定 2.取消n");      if(MakeChoice(2)==1)      {       user[num].state=0;       printf("解除挂失成功!n按任意键返回主界面");       getch();      }      break;     case 3:      system("cls");      num=EnterAccountNumber(key,total);      printf("n您确定要解除此用户的冻结状态吗?n");      printf("1.确定 2.取消n");      if(MakeChoice(2)==1)      {       user[num].state=0;       printf("解除冻结成功!n按任意键返回主界面");       getch();      }      break;     case 4:      system("cls");      while(1)      {       printf("请输入新密码:");       EnterPassword(password);       printf("n请再次确认密码:");       EnterPassword(temp_password);       if(JudgePassword(temp_password,password))        printf("n两次输入不相等,密码设置失败!n");       else       {        strcpy(administrator_password,password);        break;       }      }      printf("n管理员密码修改成功!n按任意键返回操作界面");      getch();      break;     case 5:      system("cls");      printf("当前的账号生成关键字为“%s”,更改之后所有之前创建的账户将无法打开!n",key_orig);      printf("您确定要更改账号生成关键字吗?n");      printf("1.确定 2.取消n");      if(MakeChoice(2)==1)      {       printf("请输入新的关键字:");       scanf("%3s",key_orig);       printf("当前的关键字已更改为“%s”n按任意键返回操作界面",key_orig);       getch();      }      break;     default:      return;     }    }   }   void ShowAdministratorMenu()   {    printf("****中国银行烟大计163-1分行****n");    printf("**********管理员模式***********n");    printf("1.修改用户密码*****************n");    printf("2.解除挂失*********************n");    printf("3.解除冻结*********************n");    printf("4.修改管理员密码***************n");    printf("5.修改账号生成关键字***********n");    printf("6.返回主界面*******************n");   }   void WriteToFile(FILE *fp,unsigned char *key,Account *user,char *administrator_password,int total)   {    int i,j;    rewind(fp);    fprintf(fp,"%dn%6sn%3sn",total,administrator_password,key);    for(i=0; i<total; ++i)    {     for(j=0; j<3; ++j)      fprintf(fp,"%03d ",user[i].AccountNumber[j]);     fprintf(fp,"%s %6s %lu %dn",user[i].name,user[i].password,       user[i].amount,user[i].state);    }    fclose(fp);   } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482227.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐