您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言如何實現自動存取款機模擬系統”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言如何實現自動存取款機模擬系統”吧!
/* c語言課程設計項目名稱:自動存取款機模擬系統 作者:施瑞文 專業:軟件工程(商業智能) 時間:2018.2.27 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<time.h> #define N sizeof(struct Account) #define M sizeof(struct Money) struct Account //賬戶信息 { char name[10]; //賬號昵稱 char password[18]; //密碼 struct Account *next; //指針域 }; typedef struct Account Acc; typedef Acc *Accp; struct Money //錢 { float money; char time[10];//時間 char date[10];//日期 struct Money *next; }; typedef struct Money mon; typedef mon *monp; //函數聲明區 void HideCursor(); //隱藏光標 void toxy(int x, int y); //將光標移動到X,Y坐標處 void color(short x); //設置顏色 void menu(); //菜單 Accp ff(); //將文件中的內容讀出 void signin(); //登陸或注冊 void login(); // 注冊賬號 void logon(); // 賬號登陸 void amend_password(); //修改密碼 void add_money(); //存款 void find_money(); //查詢 void get_money(); //取款 void transfer_money(); //轉賬 void save_account(Accp p); //將p所指向的內容存入文件中 void save_money(monp p); //將p所指向的內容存入文件中 float Sum(); //求余額 void over(); //退出系統 void list(); //賬單明細 monp ss(); char _name[20],_password[18]; //全局變量記住當前登陸賬戶 void color(short x) { if(x>=0&&x<=15) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x); } } void HideCursor() //隱藏光標 { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void toxy(int x, int y) //將光標移動到X,Y坐標處 { COORD pos = { x , y }; HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out, pos); } Accp ff() //將存賬號的文件里的內容輸出到鏈表中 { FILE *fp; //文件指針 int n=0; Accp head=NULL; Accp p2,p; fp=fopen("account","a+"); //以只讀的方式打開文件 if(fp==NULL) { printf("cannot open file\n"); } else { while(!feof(fp)) //判斷文件位置標志是否移動到文件末尾 { n++; p=(Accp)malloc(N); //向內存申請一段空間 fread(p,N,1,fp); //將fp所指向的文件中的內容賦給p if(n==1) { head=p; p2=p; } else //創建鏈表 { p2->next=p; p2=p; } } p2->next=NULL; } fclose(fp); //關閉文件 return head; //返回頭指針 } void menu() //菜單 { system("cls"); //清屏 do{ color(14); //看著舒服的顏色 char t; toxy(50,5); printf(" 自動存取款機模擬系統"); toxy(50,6); printf("當前賬戶為:%s",_name); toxy(48,8); printf("| 1.取款 |"); toxy(48,10); printf("| 2.轉賬 |"); toxy(48,12); printf("| 3.余額 |"); toxy(48,14); printf("| 4.明細 |"); toxy(48,16); printf("| 5.存款 |"); toxy(48,18); printf("| 6.修改密碼 |"); toxy(48,20); printf("| 7.退出系統 |"); t=getch(); //利用不回顯函數,輸入t,可以不用手動按回車鍵 switch(t) { case '1':get_money();break; case '2':transfer_money();break; case '3':find_money();break; case '4':list();break; case '5':add_money();break; case '6':amend_password();break; case '7':over();break; default :;break; } }while(1); //永遠為真 } void signin() //登陸或注冊 { system("cls"); color(12); HideCursor(); //隱藏光標 char t; toxy(50,5); printf("自動存取款機模擬系統"); toxy(44,8); printf("----------------------------"); toxy(45,10); printf("請輸入(1:登陸;2:注冊.)"); toxy(44,12); printf("----------------------------"); while(1) { t=getch(); switch(t) { case '1':logon();break; case '2':login();break; default :break; } } } void logon() // 賬號登陸 { system("cls"); //清屏 color(10); //設置顏色 Accp p,head; head=ff(); //調用函數 ,返回值為頭結點的指針 do{ p=head; char t,c,k; int i=0;; toxy(50,5); printf("自動存取款機模擬系統"); toxy(45,6); printf("***************************"); toxy(45,8); printf(" 登陸狀態 "); toxy(45,10); printf("* 請輸入您的賬號:"); gets(_name); toxy(45,12); printf("* 請輸入您的密碼:"); for(;;) //此處為輸入密碼不回顯操作 { k=getch(); //輸入k if(k=='\r') //如果輸入k為回車,則跳出循環 { break; } else if(k=='\b') //如果輸入k為刪除鍵 { if(i>0) //如若密碼還沒完全刪除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是刪除鍵,也不是回車鍵 { _password[i]=k; //把k的值賦給_password[i]; printf("*"); //輸出*號,保護用戶隱私 i++; //密碼位數加1 } } _password[i]='\0'; while(p!=NULL&&strcmp(p->name,_name)!=0) //遍歷鏈表,尋找當前輸入的賬戶的賬號 { p=p->next; } if(p!=NULL) //如果p不為空 { if(strcmp(p->password,_password)==0) //如果輸入的密碼正確 { toxy(48,16); printf("正在登陸...."); Sleep(500); //暫停0.5秒 system("cls"); color(10); toxy(48,10); printf("登陸成功!"); break; //跳出循環 } else //如果輸入的密碼錯誤 { toxy(48,16); printf("正在登陸...."); Sleep(500); system("cls"); color(10); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 密碼錯誤!是否繼續? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { t=getch(); //輸入t if(t=='1') { system("cls"); //清屏 color(10); break; } else if(t=='2') //如果輸入t為n,進入開始界面 { signin();break; } } } } else //如果p為空,即輸入的賬號不正確 { toxy(48,16); printf("正在登陸...."); Sleep(500); system("cls"); color(10); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 賬號錯誤!是否繼續? |"); toxy(46,11); printf("| |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) //死循環防止其他按鍵干擾 { c=getch(); if(c=='1') { system("cls"); color(10); break; } else if(c=='2') { signin();break; } } } }while(1); //永遠為真 Sleep(500); //暫停0.5秒 menu(); //賬號密碼均正確,進入主菜單 } void login() //注冊賬號 { system("cls"); color(10); Accp p1; p1=(Accp)malloc(N); //向內存申請一段空間 do{ color(10); char name[20],password[18],againpassword[18],c,k; int i=0;; toxy(50,5); printf("自動存取款機模擬系統"); toxy(45,6); printf("**************************"); toxy(45,8); printf(" 正在注冊"); toxy(45,10); printf("* 請輸入賬號:"); gets(name); toxy(45,12); printf("* 請輸入密碼:"); for(;;) //此處為輸入密碼不回顯操作 { k=getch(); //輸入k if(k=='\r') //如果輸入k為回車,則跳出循環 { break; } else if(k=='\b') //如果輸入k為刪除鍵 { if(i>0) //如若密碼還沒完全刪除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是刪除鍵,也不是回車鍵 { password[i]=k; //把k的值賦給_password[i]; printf("*"); //輸出*號,保護用戶隱私 i++; //密碼位數加1 } } password[i]='\0'; i=0; toxy(45,14); printf("* 請確認您的密碼:"); for(;;) //此處為輸入密碼不回顯操作 { k=getch(); //輸入k if(k=='\r') //如果輸入k為回車,則跳出循環 { break; } else if(k=='\b') //如果輸入k為刪除鍵 { if(i>0) //如若密碼還沒完全刪除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是刪除鍵,也不是回車鍵 { againpassword[i]=k; //把k的值賦給_password[i]; printf("*"); //輸出*號,保護用戶隱私 i++; //密碼位數加1 } } againpassword[i]='\0'; if(strcmp(password,againpassword)==0) //如果輸入的兩次密碼均正確 { strcpy(p1->name,name); strcpy(p1->password,password); toxy(48,16); printf("正在注冊...."); Sleep(500); system("cls"); color(12); toxy(48,10); printf("注冊成功!"); Sleep(500); //暫停0.5秒 break; //跳出循環 } else //如果輸入的兩次密碼不同 { toxy(48,16); printf("正在注冊...."); Sleep(500); system("cls"); color(12); toxy(46,8); printf("-----------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 注冊失敗!是否繼續注冊? |"); toxy(46,11); printf("| |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-----------------------------"); while(1) { c=getch(); if(c=='1') { system("cls"); color(12); break; } else if(c=='2') { signin(); break; } } } }while(1); //永遠為真 save_account(p1); //調用函數,將p1所指向的內容存儲到文件中 toxy(48,12); printf("正在自動為您登陸...."); Sleep(500); menu(); //注冊成功后進入主菜單 } /*修改密碼 方法比較笨,這里是先將儲存在文件中的賬戶信息 輸出在一個鏈表中,遍歷鏈表,尋找當前登陸的賬戶賬號,修改該節點的p->password, 再將修改后的鏈表存到文件中,需要注意的是修改之后再存到文件中需要將該文件中的內容 清空*/ void amend_password() //修改密碼 { system("cls"); //清屏 color(14); //看著舒服的顏色 HideCursor(); Accp p,head; //隱藏光標,看著更舒服 head=ff(); FILE *fp; do { color(14); HideCursor(); //隱藏光標,看著舒服 p=head; char password[18],newpassword[18],t,k; int i=0; toxy(50,5); //將光標移動到坐標為(50,5)的位置 printf("自動存取款機模擬系統"); toxy(50,8); printf("修改密碼"); toxy(48,10); printf("請輸入舊密碼:"); for(;;) //此處為輸入密碼不回顯操作 { k=getch(); //輸入k if(k=='\r') //如果輸入k為回車,則跳出循環 { break; } else if(k=='\b') //如果輸入k為刪除鍵 { if(i>0) //如若密碼還沒完全刪除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是刪除鍵,也不是回車鍵 { password[i]=k; //把k的值賦給_password[i]; printf("*"); //輸出*號,保護用戶隱私 i++; //密碼位數加1 } } password[i]='\0'; i=0; toxy(48,12); printf("請輸入新密碼:"); for(;;) //此處為輸入密碼不回顯操作 { k=getch(); //輸入k if(k=='\r') //如果輸入k為回車,則跳出循環 { break; } else if(k=='\b') //如果輸入k為刪除鍵 { if(i>0) //如若密碼還沒完全刪除 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是刪除鍵,也不是回車鍵 { newpassword[i]=k; //把k的值賦給_password[i]; printf("*"); //輸出*號,保護用戶隱私 i++; //密碼位數加1 } } newpassword[i]='\0'; while(p!=NULL&&strcmp(p->name,_name)!=0)//遍歷鏈表,尋找當前登陸賬戶的賬號 { p=p->next; } if(p!=NULL) //如果p不為空 { if(strcmp(p->password,password)==0) //如果舊密碼輸入正確 { strcpy(p->password,newpassword); //將舊密碼改為新密碼 break; //跳出循環 } else //如果舊密碼輸入錯誤 { system("cls"); color(12); toxy(46,8); printf("--------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 密碼錯誤!是否繼續? |"); toxy(46,11); printf("| |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("--------------------------"); while(1) { t=getch(); //輸入t if(t=='1') { system("cls"); color(12); break; } else if(t=='2') menu(); } } } }while(1); //永遠為真 p=head->next; //使p指向第二個結點 fp=fopen("account","w"); //先清空原文件內容再將修改后的信息寫入文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(head,N,1,fp)!=1) //將head所指向的數據寫入fp所指向的文件 { printf("file write error\n"); } fclose(fp); //關閉文件 fp=fopen("account","a"); // 打開account文件,方式為追加 while(p!=NULL) //p不為空就執行循環體 { if(fwrite(p,N,1,fp)!=1) //將p所指向的1個大小為N的數據結構寫入fp所指向的文件 { printf("file write error\n"); } p=p->next; //使p指向下一個結點 } fclose(fp); //關閉文件 toxy(48,14); printf("修改成功!正在跳轉..."); Sleep(500); //暫停0.5秒 } void save_account(Accp p1) //將p1所指向的內容存儲到文件中 { FILE *fp; //文件指針 fp=fopen("account","a"); //以追加的方式打開文件 if(fp==NULL) { printf("cannot open file\n"); } if(fwrite(p1,N,1,fp)!=1) //將p1所指向的1個大小為N的數據結構寫入fp所指向的文件中 { printf("file write error\n"); } fclose(fp); //關閉文件 } void add_money() //存款 { do { system("cls"); //清屏 color(11); monp p; char t; char time[10],date[10]; p=(monp)malloc(M); //向內存申請一段空間 toxy(48,8); printf("請輸入您需要存入的金額:"); scanf("%f",&p->money); getchar(); //吸收回車鍵 _tzset(); _strtime(time); strcpy(p->time,time); _strdate(date); strcpy(p->date,date); toxy(48,10); printf("正在操作,請稍后...."); Sleep(500); save_money(p); system("cls"); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 存入成功!是否繼續? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { t=getch(); if(t=='1') { break; } else if(t=='2') { menu(); } } }while(1); } void find_money() //查詢余額 { system("cls"); color(13); float sum=0; sum=Sum(); toxy(46,12); printf("余額為:%f",sum); toxy(46,16); printf("按任意鍵回到主菜單"); getch(); menu(); } void get_money() //取款 { do { system("cls"); color(11); monp p; float money,sum; char t; char time[10],date[10]; toxy(46,12); printf("請輸入您要取的金額:"); scanf("%f",&money); getchar();//吸收回車鍵 sum=Sum(); if(money>sum) //如果要取的金額大于余額 { toxy(46,14); printf("余額不足,請重新輸入!"); Sleep(500); continue; //結束本次循環 } p=(monp)malloc(M); //向內存申請一段空間 _tzset(); _strtime(time); strcpy(p->time,time); _strdate(date); strcpy(p->date,date); p->money=-money; save_money(p); toxy(46,14); printf("正在操作,請稍后...."); Sleep(500); system("cls"); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 取款成功!是否繼續? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { t=getch(); if(t=='1') { break; } else if(t=='2') { menu();break; } } }while(1); } void list() //明細 { system("cls"); color(10); monp head,p; int i=10; head=ss(); p=head; toxy(50,5); printf(" 自動存取款機模擬系統"); toxy(54,6); printf("賬單明細"); toxy(30,7); printf("-------------------------------------------------------------"); toxy(31,8); printf("金 額 時 間 日 期"); toxy(30,9); printf("-------------------------------------------------------------"); while(p!=NULL) { toxy(30,i); if(p->money>=0) { printf("+%f %-24s%s",p->money,p->time,p->date); } else { printf("%f %-24s%s",p->money,p->time,p->date); } p=p->next; i++; } toxy(50,i); printf("請按任意鍵返回主菜單"); getch(); menu(); } void transfer_money() //轉賬 { do { system("cls"); color(10); FILE *fp1; monp p,head,p1; float money,sum=0; char name[20],t; char time[10],date[10]; toxy(46,12); printf("請輸入您要轉入的賬號:"); gets(name); toxy(46,14); printf("請輸入您要轉出的金額:"); scanf("%f",&money); getchar(); //吸收回車鍵 sum=Sum(); if(money>sum) //如果要轉出的金額大于余額 { toxy(46,16); printf("余額不足!"); Sleep(500); continue; //結束本次循環 } fp1=fopen(name,"rb"); //以只讀的方式打開名字為name的二進制文件 if(fp1==NULL) //如果文件不存在 { toxy(46,16); printf("賬戶不存在!"); fclose(fp1); Sleep(500); continue; } fp1=fopen(name,"ab"); //以追加的方式打開名字為name的二進制文件 p=(monp)malloc(M); //向內存申請一段空間 p->money=-money; _tzset(); _strtime(time); strcpy(p->time,time); _strdate(date); strcpy(p->date,date); save_money(p); p1=(monp)malloc(M); p1->money=money; strcpy(p1->time,time); strcpy(p1->date,date); if(fwrite(p1,M,1,fp1)!=1) //將p1所指向的一個大小為M的節點 存入fp1所指向的文件中 { printf("轉賬失敗,請重試!"); continue; } fclose(fp1); toxy(46,18); printf("正在操作,請稍后...."); Sleep(500); system("cls"); toxy(46,8); printf("-------------------------"); toxy(46,9); printf("| |"); toxy(46,10); printf("| 轉賬成功!是否繼續? |"); toxy(46,12); printf("| 1.是 2.否 |"); toxy(46,13); printf("| |"); toxy(46,14); printf("-------------------------"); while(1) { t=getch(); if(t=='1') { break; } else if(t=='2') { menu(); } } }while(1); } float Sum() { monp head=NULL,p; float sum=0; head=ss(); p=head; while(p!=NULL) { sum+=p->money; //求和 p=p->next; } if(head==NULL) sum=0; return sum; } monp ss() //求余額 { FILE *fp; //文件指針 monp p,head=NULL,p2,pre=NULL; int n=0; //float sum=0; fp=fopen(_name,"ab+"); //以只讀的方式打開名字為_name的二進制文件 if(fp==NULL) { printf("cannot open file"); } else { while(!feof(fp)) //判斷標記是否移動到文件末尾 { n++; p=(monp)malloc(M); //向內存申請一段空間 fread(p,M,1,fp); //將fp所指向的文件中的一段大小為M的 內容賦給p if(n==1) { head=p; p2=p; } else //創建鏈表 { pre=p2; p2->next=p; p2=p; } p2->next=NULL; } } fclose(fp); //關閉文件 if(pre!=NULL) pre->next=NULL; return(head); //返回sum值 } void save_money(monp p) //將p所指向的內容存入文件中 { FILE *fp; //文件指針 fp=fopen(_name,"ab"); //以追加的方式打開名字為_name的二進制文件 if(fp==NULL) { printf("cannot open file"); } if(fwrite(p,M,1,fp)!=1) //將p所指向的一段大小為M的內容存入fp所指向的文件中 { printf("write error"); } fclose(fp); //關閉文件 } void over() //退出軟件 { char t; toxy(48,11); printf("-----------------------"); toxy(48,12); printf("| 您確定要退出嗎? |"); toxy(48,14); printf("| 1.確定 2.取消 |"); toxy(48,15); printf("-----------------------"); while(1) { t=getch(); //輸入t switch(t) { case '1': system("cls"); color(6); toxy(48,10); printf("正在安全退出...."); Sleep(1000); //暫停1秒 system("cls"); color(8); toxy(48,10); printf("已安全退出軟件"); toxy(48,12); printf("謝謝使用!"); toxy(48,14); printf("by-by^_^"); exit(0); break; //終止程序 case '2': menu(); break; //調用函數,進入菜單 default :break; } } } main() //簡潔明了的主函數~~~ { signin(); //調用函數 }
感謝各位的閱讀,以上就是“C語言如何實現自動存取款機模擬系統”的內容了,經過本文的學習后,相信大家對C語言如何實現自動存取款機模擬系統這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。