加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

C语言银行系统课程设计

发布时间:2020-12-15 01:04:04 所属栏目: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 na

本文为大家分享了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 *,int); //第二个参数为当前账户数目,登陆成功返回1,失败返回0 
int EnterAccountNumber(unsigned char *,int ); 
void EnterNum(char *,int ); 
void Operate(unsigned char *,int,int ); 
void ShowSubMenu(char *); 
void AdministratorMode(unsigned char *,unsigned char *,char *,int); 
void ShowAdministratorMenu(); 
void WriteToFile(FILE *,Account*,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,total++); 
   break; 
  case 3: 
   system("cls"); 
   AdministratorMode(key,key_en,total); 
   break; 
  default: 
   system("cls"); 
   WriteToFile(fp,key,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 *,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,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,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,int num,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,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,j; 
 rewind(fp); 
 fprintf(fp,"%dn%6sn%3sn",total,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); 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • C语言实现学生信息管理系统(单链表)
  • C语言单链表版学生信息管理系统
  • 学生信息管理系统C语言版
  • C语言实现简单学生学籍管理系统
  • C语言学生学籍管理系统课程设计
  • C语言实现学生学籍管理系统
  • C语言实现图书管理系统
  • C语言实现歌曲信息管理系统
  • C语言职工信息管理系统源码
  • C语言银行储蓄系统源码

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读