C语言程序的设计报告模拟ATM取款机_第1页
C语言程序的设计报告模拟ATM取款机_第2页
C语言程序的设计报告模拟ATM取款机_第3页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、仲恺农业工程学院工程实训报告ATM取款机课程名称 C 语言程序设计工程实训 姓 名 林少烈院(系) 计算机科学与工程学院专业班级计算机 113 班学 号 7指导教师 王成仲恺农业工程学院教务处制1 需求分析 12 系统总框图和功能模块说明 12.1 系统总框图 12.2 功能模块说明 13 系统设计 23.1 主要结构体 23.2 主要功能函数 23.3 关键函数的流程图 34 系统调试 115 总结 216 源程序清单 236.1 头文件 236.2 主程序 236.3 解除被冻结用户 406.4 用户注册 411需求分析所设计的ATM取款机应具备以下功能:插入银行卡(用账号输入的方式代替)

2、; 密码的输入;用户信息查询;用户余额查询;取款;转账; 修改密码; 退卡。2系统总框图和功能模块说明2.1 系统总框图输入账号密码厂L输入用户账号_y A T M取款机图1系统总框图2.2 功能模块说明? 输入用户账号模块:在运行时,完成用户账号的输入(代替插卡)输入账号密码模块:在输入账号之后,完成用户密码的输入;在修改密码的过程中,完成用户输入旧密码的功能;? 信息读取功能模块:完成用户信息的读取;? 冻结账号功能模块:当输入密码 3 次错误时,冻结用户账号:? 查询用户信息模块:完成用户的信息查询(不包括余额查询)? 查询余额功能模块:完成用户余额的查询;? 取款功能模块:完成取款功能

3、模块:? 转账功能模块:完成转职功能;? 修改密码功能模块:完成用户修改密码功能;? 退卡功能模块:完成退卡功能(即:退出程序功能) 。3 系统设计3.1 主要结构体 用户账号、密码、余额 struct User/用户数据char num20;/用户账号char name10;/char password7;/密码float balance;/余额;3.2 主要功能函数void read_info();void input_num(char * num);void now_exist(char * num);void existed(char * num);void input_passwor

4、d(char * p_word, char * W);void face(); void balance_refer();/用户信息读取/输入账号/判断是否被冻结或不存在/输入密码/界面显示/余额查询void choose( nt c);/ 菜单选择void draw_ mon ey();取款void set_password();/修改密码void in put_ new_passwordChar * old_password); / 设置新密码void tran _accou nt();/转账void stamp();/打印单条void in fo_refer();/信息查询void ou

5、t();/退出程序void lock();/冻结账号void save_i nfo();/存储信息3.3关键函数的流程图in tl=O,i=O;打开文件prin tf("It cannot ope n !");读取文件信息!feof(fp)exited函数流程图now_exited函数流程图pdulfrt*chlge召 hc一 .m 曼 1. n=m-f-M;-inpuflpassword敲®choose函数流程图i讪n应岀上:draw_ mon ey 函数流程图n时 w jpqp V.- M JfO 订一-d-flbystml l- LS- I:dl十十nyst

6、sriritf5b >fciiiilhiiie.g 啊4 | Jl.input_n ew_password函数流程图读取文件数据函数流程imi;p'linTfi "Et c mrmt LipenIfwritei&useii,.i:?fcT .i+丁prin tf("lt cannot ope n !");fi;iiKe(t|i).piinir<'t u:nirmr np*?rli=0t-CA*riTti: i;i=:0产生随机数i+ran domi='0:i+Ifclose(fp);Isavenfo函

7、数流程图lock函数流程图4系统调试首先运行程序,系统提示输入账号。(1)当输入错误账号,系统提示:用户不存在,请从新输入(2)当输入错误的密码时,系统提示:密码有误,请重新输入(3)当输入正确账号与密码时,进入主页面。请需丿J®的胖号2D111O2L*SD1肅人爵码*+(4)主界面(5)在主界面选择数字1,进入查询余额界面,界面显示余额。按任意键返回(6)在主页面选择数字2,进入取款界面,系统提示输入取款的金额,当输入不是整百 数是,系统提示请输入正确的金额,请重新输入。(8)当输入负数时,系统提示:请输入正确的金额,请重新输入(9)当输入超过卡里余额的数,系统会提示余额不足,请重

8、新输入3000元,请重新(10)当输入超过3000的数时,系统会提示:对不起,一次最多能取 输入。C;d3*f zrn-JugX.-. psHop.wie.-ArF-rlK;E'lf,伽费-" TiSfSfc-r w(11)当输入正确的金额时,系统提示:交易成功,按 0返回主菜单,按9继续取款。(12)在主菜单界面选择数字3,进入修改密码界面,首先系统会提示:请输入旧密码(13)当输入就密码正确时,系统提示:请输入新密码(6位数)(14)当输入的新密码含有非数字时,系统提示:请输入正确的数字(15)当输入的新密码不足六位时,系统提示:请输入六位的密码。(16)当两次输入的新密

9、码不相同时,系统会提示:两次输入的密码不同,请重新输入(17)当输入两次密码都正确时,系统提示:密码修改成功,请牢记新密码(18)在主菜单界面选择数字4时,进入转账界面。系统提示:请输入对方的账号:(19)当输入的账号错误时,系统会提示:用户不存在,请重新输入(20)当输入自己的账号时,系统会提示:不能给自己转账,请重新输入账号'L乂p :*巧”扌二丛运亡CMpc-jg. 一巧Ti-r 臥"对下起,补:角自(22)当确定转账时,系统会提示:请输入转账金额(23)当输入转账的金额超过3000元时,系统会提示:对不起,一次转账不能超过 3000 元,请重新输入。_JLw剧sun比

10、*w1叵对不込一才最多旨甲庁顽th1半:J(25)在主菜单界面选择数字5,进入信息查询界面,界面将显示账号的信息(26)在主界面选择数字0,进去取款界面,系统提示:感您的使用,请拿回卡5总结在确认了程序设计主题之后,首先第一步是画了大概的流程图,因为ATM取款机是 我们经常接触的一个机器,所以相对来说话流程图比较容易。在画完流程图之后,就是进行代码的编写了,我采用自顶向下的方式来规划我的整 个代码流程,首先是确定了大概需要哪些函数来实现所需的功能,在函数命名的时候, 我并不是随便命名的,而是采用书上介绍的方法,用英文来命名。在命名过程中,由于 英语功底不好的我遇到了小小的麻烦(有些单词不会拼)

11、,于是就用电子词典来解决这问 题。刚开始我是把所有的自定义函数定义为void型函数。所有的函数申明写好之后就可以开始细化了,首先确定所需结构体,然后就是头文 件的定义,最后确定了所有函数的编写顺序。由于这次程序设计是ATM取款机,所有 要用到文件的知识,但又没学过,所以只能先停止代码的编写来学习文件的知识。通过 了两天的学习,虽然只是略学了皮毛,但是勉强看着书可以来自己新建文件并不数据存 入文件中。所有的准备工作完成后,真正的可以进行代码编写了,首先把所有的函数都编写出 来(容为空),然后根据从易到难的顺序逐个功能的编写。其顺序依次是:input_num函数(用户账号输入),input_pas

12、sword函数(密码输入),lock函数(冻结用户账号),readnfo 函数(读取文件数据),now_exit函数(检查是账号是否存在且未被冻结),existed函数(检查账号是否被冻结),face函数(主菜单),choose函数(功能选择),balance_refer 函数(余额 查询),draw_money函数(取款),set_password函数(修改密码), input_new_password函数(输入新密码),tran_account函数(转账),info_refer 函数(查 询信息),out函数(退卡)。在写 input_password 函数时,没办法实现密文的输出,所以研

13、究了很久,最后通过 找资料和询问师兄才解决了这一难题,并从中学到了这一技巧。在写 lock 函数时,刚开始只是用空字符来覆盖原有的账号,但是在测试时发现这样 冻结的方法行不通,因为这样子冻结的话虽然原账号没了,但是在输入账号时只要直接 按Enter键就可以进入输入密码的程序,所以这又是一个难题。在晚上睡觉时突然想到了 曾经在课外书上看到的产生随机数的函数(rand函数),于是,第二天这个所谓的难题也 解决了。所有的函数编写完毕,想到了既然冻结了账号,肯定需要一个程序来解除冻结了的 账号,所以,自己又摸索了如何解决这一问题,最后想到了一个方法:再新建一个文件(文件名为all uer inform

14、ation)作为后台来存储用户的信息,但这个文件存储的是所有未 被冻结前和未被冻结的账号信息 (即所有原始账号信息) 。而解除的方法是:先读取 all user information 这个文件里的信息,然后把里面的信息覆盖到在前台操作的文件即可。当用 户被冻结后想解除的话只需运行这个程序即可解除冻结。写了解除冻结账号的函数后,又想到需要写一个注册账号的程序,于是也顺利的完 成了,最后,通过多次的调试,把整个程序代码给完成了。6 源程序清单/用户数据6.1 头文件 /*头文件: user.h*/ #include <stdio.h> #include <stdlib.h>

15、; #include <conio.h> #include <string.h> #include <time.h> struct Userchar num20;char name10;char password7; float balance;void read_info();void input_num( char * num); void now_exist( char * num); void existed(char * num);/用户信息读取/输入账号/判断是否被冻结或不存在/转账/打印单条/信息查询/退出程序/冻结账号/存储信息/自定义头文件

16、void input_password( char * p_word, char * W); /输入密码 void face(); / 界面显示 void balance_refer();/余额查询void choose(int c);/菜单选择void draw_money();/ 取款void set_password();/设置密码void input_new_password( char * old_password);void tran_account();void stamp();void info_refer();void out();void lock();void save_

17、info();6.2 主程序/*主程序 :main*/ /*模拟 ATM 取款机 */ #include "user.h" #define U 8/全局变量 f 是用来记录用户下标(即哪个用户)/定义账号数组变量/调用 input_num 函数,输入用户账号struct User userU;int f;int main()char number20;input_num(number);return 0;/* 函数功能:输入用户账号 */void input_num( char num12)read_info();/输入账号前先调用函数 read_info 读取所以用户信息

18、, 以便后面判/断账户是否存在以及密码是否正确system("cls");printf("nnnnnnnntt 请输入您的账号: ");gets(num);now_exist(num);/调用 exist 函数检查该账号是否存在/* 函数功能:读取用户信息 */void read_info()int i=0;FILE * fp;if (fp=fopen("user information.dat","r")=NULL)/通过文件指针来读取用户数据信息(不包括被冻结用户信息)printf("It canno

19、t open !");exit(0);while (!feof(fp)fread(&useri, sizeof(struct User),1,fp); i+;fclose(fp);/* 函数功能:判断用户是否存在且未被冻结 */void now_exist( char * num)int s=O,i;/ s是用来判断用户是否存在的条件,如果存在s=1,不存在s=0;char *w="input"while(1)for(i=0;i<12;i+)if ( 0 = strcmp( num, useri.num ) )/匹配用户s=1;f=i;/如果用户存在

20、则跳出循环,并用变量f 记录用户下标,以便后面使用。break ;else s=0;if (s=1)input_password( useri.password, w );/ 如 果 用 户 存 在 , 则 调 用input_password 函数/并把用户 密码传递给它,/实现用户输入密码功能。else existed(num);/如果用户不存在,则调用existed 函数,判断是否账号被冻结/* 函数功能:判断账号是否被冻结 */void existed(char * num)int l = 0, i = 0;/ s 是用来判断用户账号是否被冻结的条件, l=1 被冻结, l=0 说明用户

21、不存在 ;FILE * fp;if ( ( fp=fopen("all user information.dat","r") ) = NULL )printf("It cannot open !");/ 用文件指针读取所有用户数据 (包括被冻结用户)exit(0);while (!feof(fp)fread(&useri, sizeof(struct User),1,fp);i+;while (1)for (i=0;i<12;i+)if ( strcmp(num,useri.num)=0 )/判断输入的账号是否存在l=1

22、; break ;else l=0;if ( l = 1 )printf("anntt 对不起,您的账号已被冻结,请与客服联系! nnnn"); exit(0);elseprintf("anntt 用户账号不存在,请重新输入! n"); printf("nnn 按任意键返回! ");getch();system("CLS"); input_num(num);/* 函数功能:输入密码 */void input_password( char * p_word, char * W )char password20;cha

23、r ch;int i, ts = 1; /ts 数用来统计输入密码错误的次doif (ts<=3)i = 0;printf("nntt 请输入密码: t");ch = getch();while ( ch != 13)键if ( ch = 8)printf("%c %c",ch,ch);if ( i != 0 )i-;else printf("*"); passwordi = ch; i+;ch = getch();passwordi='0'if ( 0 = strcmp( W , "set"

24、 ) )if ( (strcmp (password,"0") )=0 ) 单 system("CLS"); face();/输入字符 ch 不为回车/输入字符 ch 为退格键/继续输入字符 ch/输入 0 则返回主菜if ( 0 = strcmp(p_word,password) ) /密码相同printf("t*n");printf("t*tt tttt*n t*tt 您好!欢迎使用 XX 银行tt*nt*tttttt*n");printf("t*n");if ( 0 = strcmp( W

25、 , "input" ) )system("CLS");face();/调用 face 函数进入主界面 elseif ( 0 = strcmp( W , "set" ) )input_new_password( password );elseif ( 0 != strcmp(p_word,password)/密码不相同printf("ann 您输入的密码有误,请重新输入 !");ts+;printf("nnn 按任意键继续! "); getch();system("CLS")

26、;printf("nnnnnnn");elseprintf("nnnt 对不起,您已输入密码错误 3 次,您的账号已被冻结,请 与客服联系! ");lock();/输入 3 次错误,则提示用户账号被冻结,并调用 lock函数。 while (1);/* 函数功能:主菜单界面 */ void face()int ch; system("CLS");printf("n");n");printf("tprintf("t*ttttttt*nt*ttttttt*n");printf(&

27、quot;t*t1.查询余额 ttt2.取款 tt*nt*ttttttt*n"); printf("t*ttttttt*nt*ttttttt*n");printf("t*t3.修改密码 ttt4.转账 tt*nt*ttttttt*n");printf("t*ttttttt*nt*ttttttt*n");printf("t*t5. 信息查询 ttt0. 退卡 tt*nt*ttttttt*n"); printf("t*ttttttt*n");printf("t*n");

28、printf("tn");printf("ttt 请选择: "); scanf("%d",&ch);getchar(); choose(ch);void choose(int c) while(1)switch (c)case0: out(); break ;/退卡case1: balance_refer(); break ;/余额查询case2: draw_money(); break ;/取款case 3: set_password();break;/设置密码case4: tran_account(); break ;/转

29、账case5: info_refer(); break ;/信息查询default : system("CLS"); printf(" 输入有误,请重新输入! n 按任意键返回 "); getch(); system("CLS");face();break ;/*函数功能:查询余额 */void balance_refer()system("CLS");printf("nnnnnnnnttt您的余额是:.2f ¥n",userf.balanee);printf("nn 按任意

30、键返回! n");geteh();system("CLS");faee();/* 函数功能:取款 */ void draw_money() int take,q,e;dosystem("CLS");printf("ntttttttt0. 返回菜单 ");printf("nnnnnntt 请输入取款金额(整百数) : "); seanf("%d",&q);getehar();if (q)take=q;if ( take>=100 && take%100=0

31、)/判断是否为整百数并且大于 100 的数if (take <= userf.balanee)过余额if ( take <= 3000 )system("CLS"); userf.balanee -=take;save_info();信息/判断取款数是否不超/判断是否超过 3000/调用 save_info 函数,存储printf("nnnnnnttt 交易成功,请提取现金! n"); printf("nnnnntt0. 返回菜单 ttt9. 继续取款 "); e=geteh();if (e='9')/输入

32、 9 继续取款system("CLS");elseif (c='0')/输入 0 返回菜单system("CLS");face();elseprintf(" 输入错误,请重新输入! n");elsesystem("CLS");printf("nnnnnntt 对不起,一次最多能取 3000 元,请重新 输入! ");printf("nnnnn 按任意键返回! n");getch();system("CLS");elsesystem(&quo

33、t;CLS");printf("nnnnnnttt 您的余额不足,请重新输入! ");printf("nnnnn 按任意键返回! n");getch();system("CLS");elsesystem("CLS");printf("nnnnnnttt 请输入正确的金额!请重新输入! "); printf("nnnnn 按任意键返回! n");getch();system("CLS");elsesystem("CLS");fa

34、ce(); while (1);/* 函数功能:修改密码 */ void set_password() /w 是为了在调用 input_password 函数时区分是哪char *w="set" 个主调函数system("CLS");printf("ntttttttt0. 返回菜单 ");printf("nnnnnnn");input_password( userf.password , w );/调用输入密码函数/* 函数功能:输入新密码 */void input_new_password( char * old

35、_password)int i,d;/ d 用来判断用户新密码是否为 6位数char new_password27,ch;doi = 0; system("CLS"); printf("ntttttttt0. 返回菜单 "); printf("nnnnnntt 请输入新密码( 6 位数字): "); ch = getch();while ( ch != 13)/输入字符 ch 不为回车键if ( ch = 8)/输入字符 ch 为退格键printf("%c %c",ch,ch);if (i!=0)i-;elsepr

36、intf("*"); new_password0i = ch;i+;/继续输入字符 chch = getch(); new_password0i='0'if ( (strcmp (new_password0,"0") )=0 )/输入 0 则返回主菜system("CLS"); face();for (d=0;new_password0d!=0;d+) 是数字if ( (new_password0d>'9') | (new_password0d<'0') )/判断密码是否 s

37、ystem("CLS");printf("nnnnnnttt 请输入数字,! n"); printf("nnnnn 按任意键返回! n"); getch();input_new_password(old_password);if (d!=6)/判断密码是否为 6 位数system("CLS");printf("nnnnnnttt 请输入 6 位的密码,! n"); printf("nnnnn 按任意键返回! n"); getch();continue;if ( (strcmp

38、 (new_password0,"0") ) = 0 )/输入 0 则返回主菜system("CLS");face();else printf("nnnnnntt 请再次确认您的密码: t ");i = 0;ch = getch();while ( ch != 13)if ( ch = 8)printf("%c %c",ch,ch);if ( i != 0 )i-;elseprintf("*");new_password1i = ch; i+;/输入字符 ch 不为回车键/输入字符 ch 为退格

39、键ch = getch();new_password1i='0'/继续输入字符 chif ( (strcmp (new_password1,"0") )=0 ) 单 system("CLS"); face(); else if ( (strcmp (new_password0,new_password1) )=0 ) 码是否一致 strcpy(userf.password,new_password1);/输入 0 则返回主菜/判断输入两次密save_info();信息/调用 save_info 函数,存储printf("nnnt

40、t 密码修改成功,请牢记! "); printf("nn 按任意键返回菜单! ");getch();system("CLS");face();elsesystem("CLS");printf(" 您输入的两次密码不同,请重新输入! "); printf("nnnnn 按任意键返回! n");getch(); while (1);/* 函数功能:转账 */ void tran_account()char other_num20;int i,c,q,tran;c用来判断转账是否继续,q用来

41、判断用户行为,tran用来存储转账金额system("CLS");/输入对方账号/输入 0 返回菜单/判断是否为自身账号printf("ntttttttt0. 返回菜单 "); printf("nnnnnnttt 请输要对方的账号: ");gets(other_num);if ( strcmp(other_num,"0")=0 )face();elseif ( strcmp(other_num,userf.num)=0 ) system("CLS"); printf("nnnnnnnn

42、 tt 对不起,不能给自己转账,请重新输入账号!n");printf("nnn 按任意键返回! ");getch();system("CLS");tran_account();/递归调用elsewhile(1) for(i=0;i<U;i+)if ( strcmp(other_num,useri.num)=0 )/匹配用户 while(1) system("CLS");printf("nnnnnnnntt 对方信息: nn"); / 显示对方信息printf("ttt :%snttt 账号

43、:s",,useri.num);printf("nnnnntt0. 返回菜单 ttt9. 确认 "); c=getch();if (c='9')system("CLS");/输入 9 确认doprintf("ntttttttt0.printf("nnnnnntt返回菜单 ");请输入转账金额(整百数) :");为整百于 100 的数过余额3000信息功! n");scanf("%d",&q);getchar();if (q)/q 为

44、非 0 时进入层条件语句tran=q;if ( tran>=100 && tran%100=0 )/ 判断是否/数并且大if (tran <= userf.balance) /取款数是否不超if ( tran <= 3000 )/判断是否超过system("CLS");userf.balance -=tran;useri.balance +=tran;savenfo(); 调用 savenfo,存储printf("nnnnnnttt 交 易 成 printf("nnnnntt0. 返 回 菜 单ttt9. 继续转账 &q

45、uot;);c=getch();if (c='9')/输入 9 就行转账system("CLS");else入! n");if (c ='0') /c 为 0 返回菜单 system("CLS"); face();elseprintf(" 输入错误,请重新输system("CLS");else最多能转账 3000 元,请重新输入! ");n");请重新输入! ");system("CLS"); printf("nnnnnnt

46、t 对不起,一次printf("nnnnn 按任意键返回!getch(); system("CLS");elsesystem("CLS");printf("nnnnnnttt 您的余额不足,printf("nnnnn 按任意键返回! n"); getch();system("CLS");else请重新输入! ");system("CLS");printf("nnnnnnttt 请输入正确的金额!printf("nnnnn 按任意键返回! n&qu

47、ot;); getch();system("CLS");elsesystem("CLS");face(); while (1);elseif (c='0')face();system("CLS");printf("nnnnnnttt 用户不存在!请重新输入! ");printf("nnnnn 按任意键返回! n");getch();system("CLS");tran_account(); /递归调用/* 函数功能:查询用户信息 */void info_ref

48、er()system("CLS"); /显示用户信息printf("nnnnnnnnttt :%snttt 账号: %s",,userf.num);printf("nn 按任意键返回! n");getch();system("CLS");face();void out()system("CLS");printf("nnnnnnnntttt 感您的使用! n");printf("tttt 请取回卡! n");getch();exit(0)

49、;/* 函数功能:冻结用户账号 */ void lock()int i;FILE * fp;char random20;srand( ( unsigned) time(NULL) ); for (i=0; i<12; i+)randomi=rand()%100;/随机器/产生 12 个随机数randomi='0'strcpy(userf.num,random);将用户账户冻结/将产生的随即数替换用户的账号实现if (fp=fopen("user information.dat","wb")=NULL) printf("It

50、 cannot open !"); exit(0);/重写数据for (i=0; i<U; i+)fwrite(&useri, sizeof(struct User),1,fp);fclose(fp);getch();system("CLS");printf("nnnnnnnnntttt 请取回卡! nnnnnnn"); exit(0);void save_info()int i;FILE * fp;if (fp=fopen("user information.dat","wb")=NULL

51、) /将信息保存到用户文件printf("It cannot open !");exit(0);for (i=0;i<U;i+)fwrite(&useri, sizeof(struct User),1,fp); fclose(fp);/将信息保存到所以用户文if (fp=fopen("all user information.dat","wb")=NULL) 件 printf("It cannot open !"); exit(0);for (i=0;i<U;i+) fwrite(&useri, sizeof(struct User),1,fp);fclose(fp);6.3 解除被冻结用户/* 解除被冻结用户 */ #include <stdio.h> #include <stdlib.h> #define N 6 struct Userchar num20;char name10;char password7;float balance; userN;int main()int i;FILE * fp;if (fp=fopen("all user informa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论