當前位置:才華齋>計算機>C語言>

C語言如何實現ATM機存取款系統

C語言 閱讀(6.16K)

C語言利用結構體和建構函式並且採用輸入輸出檔案實現ATM機系統。下面是小編為大家帶來的關於C語言如何實現ATM機存取款系統的知識,歡迎閱讀。

C語言如何實現ATM機存取款系統
  C語言如何實現ATM機存取款系統

利用結構體和建構函式並且採用輸入輸出檔案實現ATM機系統。

  主要功能有:

利用三種方法查詢、開戶、登陸、選單、取款、修改密碼、存款、轉賬、建立個人資訊、輸出、刪除、增加、退出。是一個功能齊全,完備的ATM機系統。

#include

#include

#include

struct per //定義結構體

{

char name[20];

char ID[20];

int money;

char mima[6];

struct per * next;

};

typedef struct person //定義另一結構體

{

struct per kehu;

struct person *next;

}L;

void chaxun(struct per *head); //各個函式的宣告

void kaihu(struct per *head);

void denglu(struct per *head);

void caidan(struct per *head);

void qukuan(struct per *head);

void xgmm(struct per *head);

void cunkuan(struct per *head);

void zhuanzhang(struct per *head);

void chuangjian(struct person **Phead);

void shuchu(struct person *Phead);

void shanchu(struct person **Phead);

void zengjia(struct person **Phead);

void chaxun1(struct person *Phead);

void chaxun2(struct person *Phead);

void chaxun3(struct person *Phead);

void tuichu();

void menu();

/*主函式*/

//////////////////////////////////////////////////

void main()

{

char x;

char choose; //choose為定義輸入選擇的變數

int flag=1;

struct person *Phead=NULL; //Phead為定義二層頭指標

struct per *head=NULL; //head為定義一層頭指標

printf("*****************************");

printf("**歡迎使用ATM自動取款機系統**");

printf("*****************************");

printf("——————————————");

printf("| 1 開戶 |");

printf("——————————————");

printf("| 2 登陸 |");

printf("——————————————");

printf("| 3 前臺客戶資訊查詢中心|");

printf("——————————————");

printf("| 4 請選擇您的需求 |");

printf("——————————————");

scanf("%s",&x);

system("cls");

switch(x)

{

case '1':system("cls");

kaihu(head); //呼叫開戶函式

break;

case '2':system("cls");

denglu(head); //呼叫登陸函式

break;

case '3':system("cls");

menu(); //呼叫後臺選單函式

break;

}

while(flag)

{

system("cls");

menu(); //呼叫後臺選單函式

choose=get);

switch(choose)

{

case '1':chuangjian(&Phead);

shuchu(Phead); //呼叫後臺輸出函式

system("pause");

system("cls");

break;

case '2':chaxun1(Phead); //呼叫後臺卡號查詢函式

system("pause");

system("cls");

break;

case '3':chaxun2(Phead); //呼叫後臺姓名查詢函式

system("pause");

system("cls");

break;

case '4':

chaxun3(Phead); //呼叫後臺餘額查詢函式

system("pause");

system("cls");

break;

case '5':shanchu(&Phead); //呼叫後臺刪除使用者函式

system("pause");

system("cls");

break;

case '6':

zengjia(&Phead); //呼叫後臺增加使用者函式

system("pause");

system("cls");

break;

case '7':shuchu(Phead); //呼叫後臺輸出函式函式

system("pause");

system("cls");

break;

case '8':shuchu(Phead);

system("pause");

system("cls");

break;

case '0':flag=0;

printf("The end.");

break;

}

}

}

/*開戶函式*/

////////////////////////////////////////////////////////

void kaihu(struct per *head)

{

head=NULL;

FILE *fp; //定義檔案指標

struct per *p1=NULL,*p2=NULL; //p1,p2為定義連結串列指標

p1=(struct per*)malloc(sizeof(struct per)); //開闢記憶體單元

printf("請輸入您的姓名:"); //請資料輸入連結串列中

scanf("%s",p1->name);

printf("請設定您的卡號:");

scanf("%s",p1->ID);

printf("請設定您銀行卡密碼:");

scanf("%s",p1->mima);

p1->money=0;

p1->next=NULL;

printf("您的個人資訊為");

printf("姓名:%s卡號:%s餘額:%4d",p1->name,p1->ID,p1->money);

if(NULL==head) //為新使用者開闢記憶體單元

{

head=(struct per *)malloc(sizeof(struct per));

head->next=p1; //進行頭插法,將其作為第一個節點

}

else //為新增客戶開闢記憶體單元

{

for(p2=head;p2->next!=NULL;p2=p2->next); //進行尾插

p2->next=p1;

}

if((fp=fopen("","ab+"))==NULL) //開啟檔案

{

printf("cannot poen file");

return;

}

if(fwrite(p1,sizeof(struct per),1,fp)!=1) //將連結串列資訊寫入檔案中

printf("file write error");

fclose(fp);

printf("");

printf("恭喜您開戶成功,請登入");

system("pause");

system("cls");

denglu(head);

}

//登陸函式

/////////////////////////////////////////////////////

void denglu(struct per *head)

{

char d[20];

char mima[20];

int i,j;

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前節點的指標,作為下一結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

printf(" **********************");

printf(" ***歡迎來都建設銀行***");

printf(" **********************");

for(j=1;j<4;j++) //限制卡號輸入的次數的迴圈

{

printf("請輸入您的卡號");

scanf("%s",d);

for(q=head;q!=NULL;q=q->next) //遍歷連結串列

{

if(strcmp(q->ID,d)!=0) //核對賬號

{

continue; //跳出迴圈

}

else

{

for(i=1;i<4;i++) //限制密碼輸入的次數的迴圈

{

printf("請輸入您的密碼");

scanf("%s",mima);

if(strcmp(q->mima,mima)!=0) //核對密碼

{

printf("密碼不正確。請重新輸入密碼");

system("pause");

system("cls");

continue; //若密碼不對,跳出迴圈

}

else

{

system("cls");

caidan(head); //呼叫選單函式

}

}

printf("您輸入密碼三次錯誤,謝謝光臨");

system("pause");

system("cls");

exit(0);

}

}

printf("您輸入的卡號有誤,請重試");

system("pause");

system("cls");

}

printf("您的卡號三次輸入錯誤,謝謝使用");

exit(0);

}

//銀行選單函式

/////////////////////////////////////////////////////////////

void caidan(struct per *head)

{

head=NULL;

int i; //i為客戶選擇輸入的變數

while(1)

{

printf("請選擇您需要的業務"); //銀行業務選單

printf("*********************************");

printf("** 1 取款 ***** 2 查詢 **");

printf("*********************************");

printf("** 3 轉賬 ***** 4 修改密碼**");

printf("*********************************");

printf("** 5 存款 ***** 6 退出 **");

printf("*********************************");

scanf("%d",&i);

if(i<6||i>0)

{

switch(i)

{

case 1:qukuan(head); //呼叫銀行取款函式

system("pause");

system("cls");

break;

case 2:system("cls");

chaxun(head); //呼叫銀行查詢函式

break;

case 3:system("cls");

zhuanzhang(head); //呼叫銀行轉賬函式

break;

case 4:system("cls");

xgmm(head); //呼叫銀行修改密碼函式

break;

case 5:system("cls");

cunkuan(head); //呼叫銀行存款函式

break;

case 6:system("cls");

tuichu(); //呼叫銀行退出函式

break;

}

}

else

{

printf("您的輸入有誤");

system("pause");

system("cls");

}

}

}

//銀行取款函式

//////////////////////////////////////////////////

void qukuan(struct per *head)

{

head=NULL; //head為連結串列頭指標

int i;

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒有讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前結點的指標,作為下一個結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

system("cls");

printf("************************************");

printf("** 1: 100元 ***** 2:200元 **");

printf("************************************");

printf("** 3: 300元 ***** 4:400元 **");

printf("************************************");

printf("** 5: 500元 ***** 6:600元 **");

printf("************************************");

printf("請按要求選擇您要取款的金額");

scanf("%d",&i);

if(i>6||i<=0) //限制輸入範圍

{

printf("對不起,您的輸入有誤");

return;

}

else

{

i=100*i; //對應選項乘以一百為取款金額

if(i>q->money)

{

printf("對不起,您的金額不足");

system("pause");

system("cls");

caidan(head); //呼叫取款機選單函式

}

else

{

q->money-=i; //對金額進行處理

if((fp=fopen("","wb+"))==NULL) //開啟檔案

{

printf("cannot open file");

return;

}

if(fwrite(q,sizeof(struct per),1,fp)!=1) //將修改的資訊重新寫入檔案

printf("file write error");

printf("您已經成功取走%d元");

q->next=NULL;

fclose(fp); //關閉檔案

}

}

}

//銀行轉賬函式

/////////////////////////////////////////////

void zhuanzhang(struct per *head)

{

head=NULL;

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前結點的指標,作為下一個結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

int i,j,k;

printf("請輸入帳號號碼");

scanf("%d",&i);

printf("請再次輸入帳號號碼"); //核對卡號

scanf("%d",&j);

if(i!=j)

{

printf("兩次賬號不同,請重新輸入");

zhuanzhang(head);

}

else

{

system("cls");

printf("************************************");

printf("** 1: 100元 ***** 2:200元 **");

printf("************************************");

printf("** 3: 300元 ***** 4:400元 **");

printf("************************************");

printf("** 5: 500元 ***** 6:600元 **");

printf("************************************");

printf("請輸入轉賬金額");

scanf("%d",&k);

if(k>6||k<=0)

{

printf("對不起,您的輸入有誤");

return;

}

else

{

k=k*100;

if(k>q->money) //對餘額進行判斷

{

printf("對不起,您的餘額不足");

system("pause");

system("cls");

caidan(head);

}

else

{

printf("您已成功轉賬%d元",k);

q->money-=k;

if((fp=fopen("","wb+"))==NULL)

{

printf("cannot open file");

return;

}

if(fwrite(q,sizeof(per),1,fp)!=1) //將資料重新寫入檔案

printf("file write error");

q->next=NULL;

fclose(fp);

system("pause");

system("cls");

}

}

}

}

//銀行查詢函式

/////////////////////////////////////////////////

void chaxun(struct per *head)

{

head=NULL; //連結串列頭指標

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前結點的指標,作為下一個結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

printf("您卡上原有餘額%d元",q->money);

system("pause");

system("cls");

}

//銀行修改密碼函式

//////////////////////////////////////////////////

void xgmm(struct per *head)

{

head=NULL; //連結串列頭指標

char mima[20];

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前結點的指標,作為下一個結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

printf("請輸入您的原密碼");

scanf("%s",mima);

if(strcmp(q->mima,mima)==0) //核對密碼

{

{

printf("密碼正確");

printf("請輸入您的新密碼:");

scanf("%s",q->mima);

if((fp=fopen("","wb+"))==NULL) //檔案頭指標

{

printf("cannot open file");

}

if(fwrite(q,sizeof(struct per),1,fp)!=1) //將修改的密碼重新寫入檔案

printf("file write error");

fclose(fp);

printf("修改密碼成功");

}

}

else

{

printf("您輸入的密碼與原密碼不同");

return;

system("pause");

}

q->next=NULL;

}

//銀行存款函式

////////////////////////////////////

void cunkuan(struct per *head)

{

int i;

head=NULL; //連結串列頭指標

FILE *fp; //定義檔案指標

struct per *p,*q=NULL;

if((fp=fopen("","rb+"))==NULL) //開啟一個二進位制檔案,為讀方式

{

printf("不能開啟檔案"); //如不能開啟,則結束程式

}

p=(struct per*)malloc(sizeof(struct per)); //申請空間

head=p;

while(!feof(fp)) //迴圈讀資料直到檔案尾結束

{

if(1!=fread(p,sizeof(struct per),1,fp))

break; //如果沒讀到資料,跳出迴圈

p->next=(struct per *)malloc(sizeof(struct per)); //為下一個結點申請空間

q=p; //儲存當前結點的指標,作為下一個結點的前驅

p=p->next; //指標後移,新讀入資料鏈到當前表尾

}

q->next=NULL; //最後一個結點的後繼指標為空

fclose(fp);

system("cls");

printf("您卡上原有餘額%d元",q->money);

printf("************************************");

printf("** 1: 100元 ***** 2:200元 **");

printf("************************************");

printf("** 3: 300元 ***** 4:400元 **");

printf("************************************");

printf("** 5: 500元 ***** 6:600元 **");

printf("************************************");

printf("請選擇您要存入的餘額");

scanf("%d",&i);

if(i>6||i<=0)

{

printf("對不起,您的輸入有誤");

return;

}

else

{

i=100*i;

q->money+=i;

if((fp=fopen("","wb+"))==NULL) //開啟檔案

{

printf("cannot open file");

}

if(fwrite(q,sizeof(struct per),1,fp)!=1) //將修改的密碼重新寫入檔案

printf("file write error");

printf("您已經成功存取%d元",i);

q->next=NULL;

fclose(fp);

system("pause");

system("cls");

}

}

//退出銀行函式

///////////////////////////////////////////

void tuichu()

{

printf("謝謝使用");

exit(0);

}

//後臺執行選單函式

///////////////////////////////////////////////////////

void menu()

{

printf("****************歡迎來到建設銀行取款機系統****************");

printf("**************************************************");

printf("**** 1 建立資訊並顯示 ****** 2 卡號查詢資訊 ****");

printf("**************************************************");

printf("**** 3 姓名查詢資訊 ****** 4 餘額查詢資訊 ****");

printf("**************************************************");

printf("**** 5 刪除某卡號資訊 ****** 6 增加新的使用者 ****");

printf("**************************************************");

printf("**** 7 按餘額降序輸出 ****** 8 輸出 ****");

printf("**************************************************");

printf("**** 0 退出 ****** 謝謝光臨 ****");

printf("**************************************************");

printf("請選擇您需要的業務");

}

//後臺執行建立連結串列函式

////////////////////////////////////////////////////

void chuangjian(struct person **Phead) //*(*Phead)為指向結構體指標的地址

{

struct person *p,*t; //定義操作指標

char n[20];

char a[20];

int s;

if(*Phead) *Phead=NULL;

printf("請輸入卡號 姓名 餘額 (若要結束請輸入三個為零)");

printf("請輸入卡號");

scanf("%s",n);

printf("請輸入姓名");

scanf("%s",a);

printf("請輸入預存金額");

scanf("%d",&s);

if(s==0) return;

p=(L *)malloc(sizeof(L)); //將資訊輸入連結串列中

strcpy(p->,n);

strcpy(p->,a);

*Phead=p; //將指標重新指向頭指標

printf("請輸入卡號");

scanf("%s",n);

printf("請輸入姓名");

scanf("%s",a);

printf("請輸入預存金額");

scanf("%d",&s);

while(s)

{

t=p; //將p的值賦給t,p又可以儲存下一個結點

p=(L *)malloc(sizeof(L)); //為新結點開闢新的記憶體

strcpy(p->,n);

strcpy(p->,a);

p->y=s;

p->next=NULL;

t->next=p; //將p的值接在t(即上一個結點的後面)

printf("請輸入卡號"); //尾插法

scanf("%s",n);

printf("請輸入姓名");

scanf("%s",a);

printf("請輸入預存金額");

scanf("%d",&s);

}

}

//後臺執行輸出連結串列函式

/////////////////////////////////////////////

void shuchu(struct person *Phead)

{

printf("");

if(NULL==Phead)

{

printf("沒有客戶資訊可輸出!"); //若頭指標指向空,則沒有客戶資訊

return;

}

while(Phead) //遍歷輸出連結串列中所有客戶資訊

{

printf("卡號:%s姓名:餘額:%d",Phead->,Phead->,Phead->y);

Phead=Phead->next;

}

printf("");

}

//後臺執行卡號查詢函式

///////////////////////////////////////////////////

void chaxun1(struct person*Phead)

{

char m[20]; //定義輸入查詢客戶卡號的變數

if(NULL==Phead) //若頭指標向空,則沒有客戶資訊

{

printf("沒有客戶資訊可查詢!");

return;

}

printf("請輸入要查詢的'客戶卡號:");

scanf("%s",m);

while(NULL!=Phead&&strcmp(Phead->,m)!=0) //在連結串列中遍歷尋找中,直到連結串列存在並且卡號核對無誤

Phead=Phead->next;

if(Phead==NULL) //若指標指最後指向空,則沒有客戶資訊

printf("對不起,沒有該使用者!");

else

printf("卡號:%s姓名:餘額:%d",Phead->,Phead->,Phead->y);

} //若找到,則輸出客戶資訊

//後臺執行姓名查詢函式

/////////////////////////////////////////////////////

void chaxun2(struct person *Phead)

{

char m[20]; //定義輸入查詢客戶卡號的變數

if(NULL==Phead) //若頭指標向空,則沒有客戶資訊

{

printf("沒有客戶資訊可查詢!");

return;

}

printf("請輸入要查詢的客戶姓名:");

scanf("%s",m);

while(NULL!=Phead&&strcmp(Phead->,m)!=0) //在連結串列中遍歷尋找中,直到連結串列存在並且姓名核對無誤

Phead=Phead->next;

if(Phead==NULL) //若指標指最後指向空,則沒有客戶資訊

printf("對不起,沒有該使用者!");

else

printf("卡號:%s姓名:餘額:%d",Phead->,Phead->,Phead->y);

} //若找到,則輸出客戶資訊

//後臺執行餘額查詢函式

/////////////////////////////////////////////////////

void chaxun3(struct person *Phead)

{

long x; //定義輸入查詢客戶餘額的變數

if(NULL==Phead) //若頭指標向空,則沒有客戶資訊

{

printf("沒有客戶資訊可查詢!");

return;

}

printf("請輸入要查詢的客戶資訊的餘額:");

scanf("%ld",&x);

while(NULL!=Phead&&Phead->y!=x) //在連結串列中遍歷尋找中,直到連結串列存在並且餘額核對無誤,繼續尋找

Phead=Phead->next;

if(Phead==NULL) //若指標指最後指向空,則沒有客戶資訊

printf("對不起,沒有該使用者!");

else

printf("該客戶的資訊為");

printf("卡號:%s姓名:餘額:%d",Phead->,Phead->,Phead->y);

} //若找到,則輸出客戶資訊

//後臺執行刪除客戶資訊函式

///////////////////////////////////////////////////

void shanchu(struct person **Phead) //*(*Phead)為指向結構體指標的地址

{

char k[20]; //定義輸入查詢客戶姓名卡號的變數

struct person *p=*Phead,*t;

if(NULL==(*Phead)) //若指標最後指向空,則沒有客戶資訊

{

printf("沒有客戶資訊可刪除!");

return;

}

printf("請輸入要刪除的客戶卡號:");

scanf("%s",k);

if(p->==k) //若第一個客戶就是,則讓頭指標指向下一個結點

*Phead=(*Phead)->next,free(p);

else

{

while(NULL==p->next&&p->next->!=k) //遍歷尋找,核對客戶卡號

p=p->next; //當p->next沒指向空,並且客戶的卡號還沒找到,則繼續尋找

if(p->next==NULL)

printf("對不起,沒有該客戶!");

else

{

t=p->next; //如果找到,則把p->next的值賦給t

p->next=p->next->next;

}

}

}

//後臺執行增加使用者資訊函式

////////////////////////////////////////////////////////////

void zengjia(struct person **Phead) //*(*Phead) 為指向結構體指標的地址

{

char n[20]; //定義輸入增加客戶卡號的變數

char a[20]; //定義輸入增加客戶姓名的變數

int s;

L *p,*t,*k; //定義操作指標變數

printf("請輸入要插入的客戶資訊");

printf("請輸入卡號"); //尾插法

scanf("%s",&n);

printf("請輸入姓名");

scanf("%s",a);

printf("請輸入預存金額");

scanf("%d",&s);

p=(L *)malloc(sizeof(L)); //開闢空間

strcpy(p->,a); //將新的客戶資訊寫入連結串列

p->y=s;

strcpy(p->,n);

if(NULL==(*Phead)) //如果是空連結串列,則把新客戶資訊作為第一個結點

{

*Phead=p; //頭插法

(*Phead)->next=NULL;

return ;

}

else

{

p->next=(*Phead); //頭插法

(*Phead)=p;

}

}