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;
}
}