发布时间:2025-12-10 23:14:41 浏览次数:2
main.c
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<windows.h>#defineMaxNum200#defineN_P6typedefstruct{intAccountNumber[3];charname[20];charpassword[N_P+1];unsignedlongamount;intstate;}Account;voidLoad(FILE*,Account*);voidShowMenu(int);intMakeChoice(int);voidEnterPassword(char*);voidCreatAccount(unsignedchar*,Account*,int);//第一个参数为加密关键字,第二个参数为账户序号intJudgePassword(char*,char*);intdecrypt(int*,unsignedchar*);voidLogIn(unsignedchar*,Account*,int);//第二个参数为当前账户数目,登陆成功返回1,失败返回0intEnterAccountNumber(unsignedchar*,int);voidEnterNum(char*,int);voidOperate(unsignedchar*,Account*,int,int);voidShowSubMenu(char*);voidAdministratorMode(unsignedchar*,unsignedchar*,Account*,char*,int);voidShowAdministratorMenu();voidWriteToFile(FILE*,unsignedchar*,Account*,char*,int);intmain(){FILE*fp;inti,total;unsignedcharkey[4],key_en[4];charadministrator_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,"%d\n%s\n%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)){case1:system("cls");LogIn(key_en,user,total);break;case2:system("cls");CreatAccount(key_en,user,total++);break;case3:system("cls");AdministratorMode(key,key_en,user,administrator_password,total);break;default:system("cls");WriteToFile(fp,key,user,administrator_password,total);return0;}}return0;}function.c
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include<windows.h>#defineMaxNum200#defineN_P6//账户状态0为正常1为挂失2为冻结3为销户typedefstruct{intAccountNumber[3];charname[20];charpassword[N_P];unsignedlongamount;intstate;}Account;voidLoad(FILE*,Account*);voidShowMenu(int);intMakeChoice(int);voidEnterPassword(char*);voidCreatAccount(unsignedchar*,Account*,int);//第一个参数为加密关键字,第二个参数为账户序号intJudgePassword(char*,char*);intdecrypt(int*,unsignedchar*);voidLogIn(unsignedchar*,Account*,int);//第二个参数为当前账户数目,登陆成功返回1,失败返回0intEnterAccountNumber(unsignedchar*,int);voidEnterNum(char*,int);voidOperate(unsignedchar*,Account*,int,int);voidShowSubMenu(char*);voidAdministratorMode(unsignedchar*,unsignedchar*,Account*,char*,int);voidShowAdministratorMenu();voidWriteToFile(FILE*,unsignedchar*,Account*,char*,int);voidLoad(FILE*fp,Account*user){intcount=0;//将文件中的用户信息存到数组中while(fscanf(fp,"\n%d%d%d%s%s%lu%d\n",&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;}voidShowMenu(inttotal){printf("****中国银行烟大计163-1分行****\n");printf("目前共有%d名注册用户*****\n",total);printf("1.登陆*************************\n");printf("2.开户*************************\n");printf("3.进入管理员模式***************\n");printf("4.退出*************************\n");}intMakeChoice(intn){intjudge;printf("请输入1~%d\n",n);scanf("%d",&judge);while(judge<1||judge>n)//确保输入的是1~n{printf("输入不合法,请输入1~%d\n",n);fflush(stdin);//如果不加这句,输入一些字母会导致函数无限循环scanf("%d",&judge);}returnjudge;}voidEnterPassword(char*password){inti;chart;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('*');}}voidEnterNum(char*s,intn){inti=0;chart;while(i<n){t=getch();if(t=='\b'){printf("\b\b");--i;continue;}elseif(t=='\r'||t=='\n')break;while(t<'0'||t>'9')t=getch();s[i]=t;putchar(t);++i;}}intJudgePassword(char*temp_password,char*password){inti;for(i=0;i<N_P;++i){if(temp_password[i]!=password[i])break;}if(i==N_P)return0;elsereturn1;}voidCreatAccount(unsignedchar*key,Account*user,intnum){if(num>=MaxNum){printf("银行用户数量已达到上限!\n按任意键返回主界面");getch();return;}inti,flag,num_de[3];intnum_en[3];chartemp_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;elseif(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]='\0';break;}}user[num].amount=0;user[num].state=0;printf("\n账户创建成功!\n按任意键返回主菜单");getch();}intdecrypt(int*num_en,unsignedchar*key){inti,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];returnnum;}intEnterAccountNumber(unsignedchar*key,inttotal){inti,num;intnum_en[3];charnum_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");elsebreak;}returnnum;}voidLogIn(unsignedchar*key,Account*user,inttotal){intnum,i;charpassword[N_P];num=EnterAccountNumber(key,total);//判断账户状态if(user[num].state==3){printf("该账户已销户,无法使用!\n");printf("按任意键返回操作界面");getch();return;}elseif(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);elseif(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);}voidShowSubMenu(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");}voidOperate(unsignedchar*key,Account*user,intnum,inttotal){inti,num_t;unsignedlongamount_t,max=1;charpassword[N_P],temp_password[N_P],amount_judge[6];for(i=0;i<(sizeof(unsignedlong)*8-1);++i)//计算最大存款额maxmax*=2;while(1){system("cls");ShowSubMenu(user[num].name);switch(MakeChoice(8)){case1:system("cls");while(1){printf("请输入存款金额:");for(i=0;i<6;++i)amount_judge[i]='\0';EnterNum(amount_judge,5);amount_t=atol(amount_judge);if(amount_t>99999)printf("\n单次存款金额为0~99999元,存款失败!\n");elseif(amount_t>=max-user[num].amount)printf("总金额超出上限,存款失败!\n");else{user[num].amount+=amount_t;printf("\n存款成功!按任意键返回操作界面");getch();system("cls");break;}}break;case2:system("cls");if(user[num].state==1){printf("该账户已挂失,无法执行取款操作!\n");printf("按任意键返回操作界面");getch();break;}while(1){printf("请输入取款金额:");for(i=0;i<6;++i)amount_judge[i]='\0';EnterNum(amount_judge,5);amount_t=atol(amount_judge);if(amount_t>99999)printf("\n单次存款金额为0~99999元,存款失败!\n");elseif(amount_t>user[num].amount)printf("\n账户余额不足,取款失败!\n");else{user[num].amount-=amount_t;printf("\n取款成功!按任意键返回操作界面");getch();system("cls");break;}}break;case3:system("cls");printf("用户姓名:%s",user[num].name);printf("账户余额:%lu\n",user[num].amount);printf("账户状态:");if(user[num].state==1)printf("已挂失\n");elseprintf("正常\n");printf("按任意键返回操作界面");getch();system("cls");break;case4: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]='\0';EnterNum(amount_judge,5);amount_t=atol(amount_judge);if(amount_t>99999)printf("\n单次存款金额为0~99999元,存款失败!\n");elseif(amount_t>user[num].amount)printf("账户金额不足,转账失败!\n");elseif(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;case5:system("cls");printf("您确定要挂失吗?\n");printf("1.确定2.取消\n");if(MakeChoice(2)==1){user[num].state=1;printf("挂失成功!\n按任意键返回主界面");getch();}system("cls");break;case6:system("cls");printf("您确定要销户吗?销户后所有功能都将无法实现,账户内的存款将冻结!\n");printf("1.确定2.取消\n");if(MakeChoice(2)==1){user[num].state=3;printf("销户成功!\n按任意键返回主界面");getch();system("cls");return;}elsebreak;case7:system("cls");while(1){printf("\n请输入原密码:");EnterPassword(password);if(JudgePassword(password,user[num].password))printf("\n原密码输入错误!\n");elsebreak;}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;}}}voidAdministratorMode(unsignedchar*key_orig,unsignedchar*key,Account*user,char*administrator_password,inttotal){intnum;charpassword[N_P],temp_password[N_P];while(1)//输入密码{printf("请输入管理员密码密码:");EnterPassword(password);if(JudgePassword(password,administrator_password))printf("密码输入错误!\n");elsebreak;}printf("\n登陆成功!按任意键继续");getch();while(1){system("cls");ShowAdministratorMenu();switch(MakeChoice(6)){case1:system("cls");num=EnterAccountNumber(key,total);printf("请设置密码:");EnterPassword(password);printf("您设置的密码是:");puts(user[num].password);printf("\n按任意键返回操作界面");getch();break;case2:system("cls");num=EnterAccountNumber(key,total);printf("您确定要解除此用户的挂失状态吗?\n");printf("1.确定2.取消\n");if(MakeChoice(2)==1){user[num].state=0;printf("解除挂失成功!\n按任意键返回主界面");getch();}break;case3: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;case4: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;case5: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;}}}voidShowAdministratorMenu(){printf("****中国银行烟大计163-1分行****\n");printf("**********管理员模式***********\n");printf("1.修改用户密码*****************\n");printf("2.解除挂失*********************\n");printf("3.解除冻结*********************\n");printf("4.修改管理员密码***************\n");printf("5.修改账号生成关键字***********\n");printf("6.返回主界面*******************\n");}voidWriteToFile(FILE*fp,unsignedchar*key,Account*user,char*administrator_password,inttotal){inti,j;rewind(fp);fprintf(fp,"%d\n%6s\n%3s\n",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%d\n",user[i].name,user[i].password,\user[i].amount,user[i].state);}fclose(fp);}到此,关于“怎么用C语言实现银行系统”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注本站网站,小编会继续努力为大家带来更多实用的文章!