C語(yǔ)言銀行系統(tǒng)課程設(shè)計(jì)
本文為大家分享了C語(yǔ)言銀行系統(tǒng)課程設(shè)計(jì),供大家參考,具體內(nèi)容如下
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); //第一個(gè)參數(shù)為加密關(guān)鍵字,第二個(gè)參數(shù)為賬戶(hù)序號(hào)
int JudgePassword(char *,char *);
int decrypt(int *,unsigned char *);
void LogIn(unsigned char *,Account *,int); //第二個(gè)參數(shù)為當(dāng)前賬戶(hù)數(shù)目,登陸成功返回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("銀行數(shù)據(jù)庫(kù)無(wú)法打開(kāi),按任意鍵結(jié)束程序!\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);//將數(shù)據(jù)存入數(shù)組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
//賬戶(hù)狀態(tài) 0為正常 1為掛失 2為凍結(jié) 3為銷(xiāo)戶(hù)
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); //第一個(gè)參數(shù)為加密關(guān)鍵字,第二個(gè)參數(shù)為賬戶(hù)序號(hào)
int JudgePassword(char *,char *);
int decrypt(int *,unsigned char *);
void LogIn(unsigned char *,Account *,int); //第二個(gè)參數(shù)為當(dāng)前賬戶(hù)數(shù)目,登陸成功返回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;
//將文件中的用戶(hù)信息存到數(shù)組中
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("****中國(guó)銀行煙大計(jì)163-1分行****\n");
printf("目前共有%d名注冊(cè)用戶(hù)*****\n",total);
printf("1.登陸*************************\n");
printf("2.開(kāi)戶(hù)*************************\n");
printf("3.進(jìn)入管理員模式***************\n");
printf("4.退出*************************\n");
}
int MakeChoice(int n)
{
int judge;
printf("請(qǐng)輸入1~%d\n",n);
scanf("%d",&judge);
while(judge<1||judge>n)//確保輸入的是1~n
{
printf("輸入不合法,請(qǐng)輸入1~%d\n",n);
fflush(stdin);//如果不加這句,輸入一些字母會(huì)導(dǎo)致函數(shù)無(wú)限循環(huán)
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')//執(zhí)行退格刪除操作
{
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("銀行用戶(hù)數(shù)量已達(dá)到上限!\n按任意鍵返回主界面");
getch();
return;
}
int i,flag,num_de[3];
int num_en[3];
char temp_password[N_P],password[N_P];
//將num的個(gè)位十位和百位分解,num_de[2]存?zhèn)€位,以此類(lèi)推
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("請(qǐng)輸入用戶(hù)姓名:");
fflush(stdin);
scanf("%19[^\n]",user[num].name);
for(i=0; i<strlen(user[num].name); ++i)
{
if(user[num].name[i]==' ')
{
printf("用戶(hù)名中不能包含空格!\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("您的賬號(hào)是:");
for(i=0; i<3; ++i)
printf("%03d ",num_en[i]);
while(1)
{
printf("\n請(qǐng)?jiān)O(shè)置密碼:");
EnterPassword(password);
printf("\n請(qǐng)?jiān)俅未_認(rèn)密碼:");
EnterPassword(temp_password);
if(JudgePassword(temp_password,password))
printf("\n兩次輸入不相等,密碼設(shè)置失?。?);
else
{
strcpy(user[num].password,password);
user[num].password[N_P]='\0';
break;
}
}
user[num].amount=0;
user[num].state=0;
printf("\n賬戶(hù)創(chuàng)建成功!\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)//輸入賬號(hào)
{
printf("請(qǐng)輸入賬號(hào):");
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則賬號(hào)輸入錯(cuò)誤
printf("\n賬號(hào)輸入錯(cuò)誤!\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);
//判斷賬戶(hù)狀態(tài)
if(user[num].state==3)
{
printf("該賬戶(hù)已銷(xiāo)戶(hù),無(wú)法使用!\n");
printf("按任意鍵返回操作界面");
getch();
return;
}
else if(user[num].state==2)
{
printf("該賬戶(hù)因輸入密碼錯(cuò)誤次數(shù)達(dá)三次,已凍結(jié)!\n請(qǐng)進(jìn)入管理員模式解除異常狀態(tài)!\n");
printf("按任意鍵返回操作界面");
getch();
return;
}
//判斷結(jié)束
i=0;
while(1)//輸入密碼
{
printf("\n請(qǐng)輸入密碼:");
EnterPassword(password);
if(JudgePassword(password,user[num].password)&&(++i<3))
printf("\n密碼輸入錯(cuò)誤,您還有%d次機(jī)會(huì)\n",3-i);
else if(i>=3)
{
user[num].state=2;
printf("\n密碼錯(cuò)誤次數(shù)過(guò)多,賬戶(hù)已凍結(jié)!\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.查詢(xún)*************************\n");
printf("4.轉(zhuǎn)賬*************************\n");
printf("5.掛失*************************\n");
printf("6.銷(xiāo)戶(hù)*************************\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) //計(jì)算最大存款額max
max*=2;
while(1)
{
system("cls");
ShowSubMenu(user[num].name);
switch(MakeChoice(8))
{
case 1:
system("cls");
while(1)
{
printf("請(qǐng)輸入存款金額:");
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("該賬戶(hù)已掛失,無(wú)法執(zhí)行取款操作!\n");
printf("按任意鍵返回操作界面");
getch();
break;
}
while(1)
{
printf("請(qǐng)輸入取款金額:");
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賬戶(hù)余額不足,取款失敗!\n");
else
{
user[num].amount-=amount_t;
printf("\n取款成功!按任意鍵返回操作界面");
getch();
system("cls");
break;
}
}
break;
case 3:
system("cls");
printf("用戶(hù)姓名:%s",user[num].name);
printf("賬戶(hù)余額:%lu\n",user[num].amount);
printf("賬戶(hù)狀態(tài):");
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("該賬戶(hù)已掛失,無(wú)法執(zhí)行轉(zhuǎn)賬操作!\n");
printf("按任意鍵返回操作界面");
getch();
break;
}
num_t=EnterAccountNumber(key,total);
while(1)
{
printf("請(qǐng)輸入轉(zhuǎn)賬金額:");
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("賬戶(hù)金額不足,轉(zhuǎn)賬失敗!\n");
else if(amount_t>=max-user[num_t].amount)
printf("\n對(duì)方總金額超出上限,轉(zhuǎn)賬失?。n");
else
{
user[num].amount-=amount_t;
user[num_t].amount+=amount_t;
printf("\n轉(zhuǎ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("您確定要銷(xiāo)戶(hù)嗎?銷(xiāo)戶(hù)后所有功能都將無(wú)法實(shí)現(xiàn),賬戶(hù)內(nèi)的存款將凍結(jié)!\n");
printf("1.確定 2.取消\n");
if(MakeChoice(2)==1)
{
user[num].state=3;
printf("銷(xiāo)戶(hù)成功!\n按任意鍵返回主界面");
getch();
system("cls");
return;
}
else
break;
case 7:
system("cls");
while(1)
{
printf("\n請(qǐng)輸入原密碼:");
EnterPassword(password);
if(JudgePassword(password,user[num].password))
printf("\n原密碼輸入錯(cuò)誤!\n");
else
break;
}
while(1)
{
printf("\n請(qǐng)輸入新密碼:");
EnterPassword(password);
printf("\n請(qǐng)?jiān)俅未_認(rèn)密碼:");
EnterPassword(temp_password);
if(JudgePassword(temp_password,password))
printf("\n兩次輸入不相等,密碼設(shè)置失?。?);
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("請(qǐng)輸入管理員密碼密碼:");
EnterPassword(password);
if(JudgePassword(password,administrator_password))
printf("密碼輸入錯(cuò)誤!\n");
else
break;
}
printf("\n登陸成功!按任意鍵繼續(xù)");
getch();
while(1)
{
system("cls");
ShowAdministratorMenu();
switch(MakeChoice(6))
{
case 1:
system("cls");
num=EnterAccountNumber(key,total);
printf("請(qǐng)?jiān)O(shè)置密碼:");
EnterPassword(password);
printf("您設(shè)置的密碼是:");
puts(user[num].password);
printf("\n按任意鍵返回操作界面");
getch();
break;
case 2:
system("cls");
num=EnterAccountNumber(key,total);
printf("您確定要解除此用戶(hù)的掛失狀態(tài)嗎?\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您確定要解除此用戶(hù)的凍結(jié)狀態(tài)嗎?\n");
printf("1.確定 2.取消\n");
if(MakeChoice(2)==1)
{
user[num].state=0;
printf("解除凍結(jié)成功!\n按任意鍵返回主界面");
getch();
}
break;
case 4:
system("cls");
while(1)
{
printf("請(qǐng)輸入新密碼:");
EnterPassword(password);
printf("\n請(qǐng)?jiān)俅未_認(rèn)密碼:");
EnterPassword(temp_password);
if(JudgePassword(temp_password,password))
printf("\n兩次輸入不相等,密碼設(shè)置失敗!\n");
else
{
strcpy(administrator_password,password);
break;
}
}
printf("\n管理員密碼修改成功!\n按任意鍵返回操作界面");
getch();
break;
case 5:
system("cls");
printf("當(dāng)前的賬號(hào)生成關(guān)鍵字為“%s”,更改之后所有之前創(chuàng)建的賬戶(hù)將無(wú)法打開(kāi)!\n",key_orig);
printf("您確定要更改賬號(hào)生成關(guān)鍵字嗎?\n");
printf("1.確定 2.取消\n");
if(MakeChoice(2)==1)
{
printf("請(qǐng)輸入新的關(guān)鍵字:");
scanf("%3s",key_orig);
printf("當(dāng)前的關(guān)鍵字已更改為“%s”\n按任意鍵返回操作界面",key_orig);
getch();
}
break;
default:
return;
}
}
}
void ShowAdministratorMenu()
{
printf("****中國(guó)銀行煙大計(jì)163-1分行****\n");
printf("**********管理員模式***********\n");
printf("1.修改用戶(hù)密碼*****************\n");
printf("2.解除掛失*********************\n");
printf("3.解除凍結(jié)*********************\n");
printf("4.修改管理員密碼***************\n");
printf("5.修改賬號(hào)生成關(guān)鍵字***********\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);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Opencv實(shí)現(xiàn)用于圖像分割分水嶺算法
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
本文標(biāo)題:C語(yǔ)言銀行系統(tǒng)課程設(shè)計(jì)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/942.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


