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語言實現銀行系統”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
信用卡透支額度一般是多少?信用卡透支額度具體多少是由我們的信用、資產和收入等各種因素共同決定的,資信條件越好,我們的額度也就越好,申請到的信用卡等級也就越高。一般情況下,普通人首次申請信用卡一般是普卡,額度通常是在1萬以下,3千至5千的居多。隨著良好的用卡記錄和信用情況,我們通過養卡就可以申請增加額度或是直接給信用卡升級。如果是升級到金卡,一般透支額度最高可能有5萬,白金卡金通常是在5萬以上了。但...
現在的寬帶套餐琳瑯滿目,用戶的選擇范圍更廣,從100M到1000M,從預付費到后付費,從單套餐到移動寬帶融合套餐,從一年到兩年、三年等等。,容易被挑剔。那么,用戶應該如何選擇寬帶呢?以北京為例:第一,明確寬帶用途和使用環境使用環境是指自己的寬帶是單獨使用還是多戶共用寬帶。首先,如果只是用來瀏覽網頁,看電影,聊QQ,對網絡要求不高,那么可以選擇帶寬稍微低一點的,比如10M,50M。其次,如果你是網游...
(資料圖)隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如跪求修真者玩網游之類的小說,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!1、《網游之超級鬼才》,作者是浪子傾城;2、《網游之風流騎士》,作者是冷石;3、《網游之天地》,作者是隱為者;4、《網游之古劍太初》,作者是不古;5、《網游之傲視金庸》,作者是酒葫蘆;6、《網游之職業人生》,作者是天佐;7、《...