本文為大家分享了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,"%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)) { 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 %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; } 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~%d/n",n); scanf("%d",&judge); while(judge<1||judge>n)//確保輸入的是1~n { printf("輸入不合法,請輸入1~%d/n",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]='/0'; 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]='/0'; 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]='/0'; 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("賬戶余額:%lu/n",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]='/0'; 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,"%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); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答
圖片精選