银行ATM机工作流程模拟编程(链表)
程序设计基础(一)综合作业银行ATM机工作流程模拟编程
班级学号姓名
[综合作业目的]
1、通过编程及上机调试,掌握函数、文件、结构及链表的综合应用;2、掌握查找、排序等基本算法;3、掌握模块化程序设计的方法。
[综合作业内容]
编程,模拟一个ATM(AutomaticTellerMachine,自动取款机)的工作流程。依据帐户信息:姓名、帐号、密码、余额,完成ATM机功能:登录、显示余额、取款、修改密码。
具体要求:
1、合理规划数据结构,以保存储户信息;
2、使用链表结构记录有关数据,使用链表完成相关操作;
3、使用文件记载储户信息,程序启动时加载储户信息,程序退出时保存储户信息;4、程序工作流程:
显示登录界面:帐号:
密码:接受用户输入。
若为非法用户,提示出错,并重新登录,3次出错后退出;若为合法用户,则显示操作菜单,提供下述服务:
①显示基本信息②修改密码③查询余额④存款
⑤取款(每次取款额度为¥5000元)⑥退出
5、*用户一次登录后的取款总数超过¥50000者,则程序自动产生一个明细记录,记载该
用户的登录时间、地点(登录时间、地点假设已知,并用字符串表示)。考虑此种情况较少出现,为节省存储空间,不宜在描述储户信息的数据结构中直接分配字符数组(建议在其数据结构中添加一个指向字符串数组的指针,…);6、提交设计文档及源代码清单。
[综合作业要求]
1、独立、按时完成综合作业;
2、进行需求分析,完成相关数据结构的规划与设计;3、实现菜单所列功能。具体要求:
每个功能为一个独立的函数;所有的输入之前都要有提示。
4、在程序的调试中,应用所学的计算机知识,完成大批数据的输入。并列出完整、严格的
测试结果(包括输入和输出);
5、提交完整的C代码及设计文档(包括设计方案、具体功能及实现、特点小结等)。
扩展阅读:程序设计基础(一)综合作业报告
程序设计基础(一)综合作业报告银行ATM机工作流程模拟编程
班级:XXXXXX班
学号:0000000000姓名:AAA
一、题目要求
编程,模拟一个ATM(AutomaticTellerMachine,自动取款机)的工作流程。依据帐户信息:姓名、帐号、密码、余额,完成ATM机功能:登录、显示余额、取款、修改密码。
具体要求:
1合理规划数据结构,以保存储户信息;
2使用链表结构记录有关数据,使用链表完成相关操作;
3使用文件记载储户信息,程序启动时加载储户信息,程序退出时保存储户信息;4程序工作流程:
1)显示登录界面:帐号:
密码:
接受用户输入。
2)若为非法用户,提示出错,并重新登录,3次出错后退出;3)若为合法用户,则显示操作菜单,提供下述服务:
显示基本信息修改密码查询余额存款
取款(每次取款额度为¥5000元)退出
5用户一次登录后的取款总数超过¥50000者,则程序自动产生一个明细记录,记载该
用户的登录时间、地点(登录时间、地点假设已知,并用字符串表示)。考虑此种情况较少出现,为节省存储空间,不宜在描述储户信息的数据结构中直接分配字符数组(建议在其数据结构中添加一个指向字符串数组的指针,…);6提交设计文档及源代码清单。
二、设计方案
基本思路:用户的原始数据被保存在一个account文本文件中,程序启动时,建立链
表,加载用户数据。提示用户登录,检查用户信息正确后,允许进行下一步操作;对于用户不正确的操作,均进行提示或警告,让其重新操作;程序结束,选择0安全退出并储存用户数据。
框架结构:logon_system()模拟登录界面,用户登录后,在menu中进行主菜单的处理,
用户根据需要选择进行下一步操作,将其他功能的具体实现分别放到子函数或者子菜单中进行,实现分支选择操作。
三、具体功能及实现基本功能:
(1)从文件中读入数据初始化
建立链表,从account文本文件中加载用户数据。
(2)显示登录界面,并有提示
这一功能在logon_system()函数中实现,显示登录界面,提示用户进行登录操作,并有相关温馨提示。
(3)检查登录信息是否正确
这一功能在access()中实现,如果用户输入信息不正确,提示用户重新操作。具体包括:输入的账号在account文件中不存在,即没有这个储蓄账户;输入的密码错误,提示用户重新输入,若三次输入不成功,程序自动退出,每次错误输入后,提示用户剩余输入次数;密码不足六位,提示用户重新输入,这种错误不减少用户的输入次数。
(4)显示主菜单,用户选择后,进入子菜单
显示主菜单功能在menu()中实现,包括
取款:选择后进入取款界面(draw_money()函数实现),提供50、100、
200、500、800、1000、201*及自由输入金额(extra()实现)的取款。其中输入金额不是整50或100的进行提示,取款金额超过当前能够取出的最大整金额进行提示(isoverdraw()实现),并显示当前最多能取款的整数金额。取款超过5000的进行记录并对用户说明(extra()实现)。
存款:提示用户输入存款金额,其中输入金额不是整50或100的进行提示
(deposit()实现)。
查询:显示当前余额(query()实现)。
改密:提示用户输入旧密码,两次输入新密码来达到确认效果,每次输入密
码,对于密码不足六位、原密码输入错误、两次输入新密码不一致,均有提示,并让用户重新操作(revise()实现)。退出:用户结束操作,退出程序。
四、特点小结
由函数实现每个功能,思路清晰,结构明了;分枝型操作,便于用户进行;注重细节的程序设计思路,几乎对每一步操作都进行了判错以及提示处理,保证了
程序能正常地运行;
详尽的提示信息,友好的界面设计,提高了程序的实用性和观赏性;
五、程序代码
#include#include#includetypedefstructme{
inthour,minute,second;charaddress[100];floatmm;}memo;
typedefstructacc{
longnumber;charname[9];charpass[7];floatm;
structacc*next;structme*mnext;
}ac;
ac*create_list();ac*access(ac*head);voidsave(ac*head);voidmenu();
floatisoverdraw(float,int);voiddraw_money(ac*);voiddeposit(ac*);voidquery(ac*);voidrevise(ac*);voidlogon_system();floatextra(ac*);intmain(){
intflag,select;ac*t,*head;
head=create_list();logon_system();t=access(head);if(t==NULL){
printf("三次输入错误,系统将自动退出!\\n");return0;}
flag=1;while(flag){
printf("户主:%s帐号:%Ld\\n\\n\\n",t->name,t->number);menu();
scanf("%d",&select);
while(select5){
printf("输入有误,请重新选择:\\n");scanf("%d",&select);}
system("CLS");switch(select){
case1:draw_money(t);break;case2:deposit(t);break;case3:query(t);break;case4:revise(t);break;
case0:save(head);return1;}}
return1;}
/*程序开始时,建链表,加载用户信息*/ac*create_list(){
ac*p,*head=NULL;FILE*fp;
fp=fopen("E:\\\\account.txt","r");if(fp==NULL){
printf("filenotexits\\n");exit(0);}
while(!feof(fp)){
p=(ac*)malloc(sizeof(ac));fscanf(fp,"%d",&(p->number));fscanf(fp,"%s",p->name);fscanf(fp,"%s",p->pass);
fscanf(fp,"%f\\n",&(p->m));//在account文本文件中,每个人的信息间有换行符,故"%f\\n"p->mnext=NULL;p->next=head;head=p;}
fclose(fp);returnhead;}
/*检查用户登录信息,对密码错误、密码位数不足、账户不存在等情况进行提示,只有密码错误t++,否则t不变*/ac*access(ac*head){
ac*p;intt=0;
intn,flag=0;charpp[100];while(tnumber==n&&strcmp(p->pass,pp)==0&&strlen(pp)==6){
flag=1;break;}
elseif(p->number==n&&strcmp(p->pass,pp)!=0&&strlen(pp)==6){
printf("密码错误,请重新输入!剩余输入次数%d\\n",2-t);p=head;break;}
elseif(p->number==n&&strlen(pp)!=6){
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");t--;//这种情况t不变,故先减一,抵消后面t++的作用p=head;break;}else
p=p->next;}
if(flag==1)break;elseif(p==NULL)
printf("您输入的账户不存在,请重新输入:\\n");elset++;}
if(t>=3)
returnNULL;else
returnp;}
/*显示菜单*/voidmenu(){
printf("\\t1取款\\n");printf("\\t2存款\\n");printf("\\t3查询\\n");printf("\\t4改密\\n");printf("\\t0退出\\n");
printf("请选择您要的服务:\\n");}
/*取钱:如果用户输入非整50或100、超支现象,提示重新进行操作*/voiddraw_money(ac*t){
intx;
printf("\\t1.505.800\\n\\n");printf("\\t2.1006.1000\\n\\n");printf("\\t3.201*.201*\\n\\n");printf("\\t4.5008.输入金额\\n\\n");printf("请选择:\\n");scanf("%d",&x);while(x=9){
printf("输入有误,请重新选择:\\n");scanf("%d",&x);}
switch(x){
case1:t->m=isoverdraw(t->m,50);break;//判断是否超支case2:t->m=isoverdraw(t->m,100);break;case3:t->m=isoverdraw(t->m,200);break;case4:t->m=isoverdraw(t->m,500);break;case5:t->m=isoverdraw(t->m,800);break;case6:t->m=isoverdraw(t->m,1000);break;
case7:t->m=isoverdraw(t->m,201*);break;case8:t->m=extra(t);break;}
}/*存款:只能整存*/voiddeposit(ac*t){
floatm;
printf("请输入您要存入的金额:\\n");scanf("%f",&m);while((int)m%50!=0){
printf("我们只能提供面值为50或100的服务,请重新输入您要存入的金额:\\n");
scanf("%f",&m);}
if((int)m%50==0){
t->m=t->m+m;
printf("存款成功!\\n");}}
/*显示余额*/
voidquery(ac*t){
printf("你当期的余额为:%.2f元\\n\\n\\n",t->m);}
voidlogon_system(){
printf("\\n\\n");
printf("\\t欢迎使用中国MM银行自动服务系统,我们将竭诚为您服务!");printf("\\n\\n\\n");printf("\\t帐号:\\n");printf("\\n");
printf("\\t密码:\\n\\n\\n\\n\\n");
printf("\\t温馨提示:1.请保护好您的密码,谨防泄漏;\\n\\t\\t2.若出现吞卡或不出钞现象,\\
请及时与工作人员联系,\\n\\t\\t不要相信其它任何提示信息,以防上当受骗。");
printf("\\n\\n\\n");
printf("请输入您的帐号及密码:\\n");}
/*给用户提供自由输入取款金额的功能*/floatextra(ac*t){
floatm,x,k;
printf("请输入取款金额:\\n");scanf("%f",&m);
while((int)m%50!=0){
printf("您的输入有误,我们只能提供面值金额为50或100的服务,请重新输入取款金额:\\n");scanf("%f",&m);}
if(mm,m);returnx;}
else//取款超过5000则被记录{
k=t->m-m;
x=isoverdraw(t->m,m);//是否超支if(k>0){
t->mnext=(memo*)malloc(sizeof(memo));t->mnext->hour=12;t->mnext->minute=12;t->mnext->second=12;
strcpy(t->mnext->address,"武汉科技大学");printf("温馨提示:为了保护您的财产安全,您本次操作将系统自动被记录!\\n");}
returnx;}}
/*修改密码:对输入不足六位、输入错误密码、两次输入新密码前后不一致等情况,提示用户重新输入*/voidrevise(ac*t){
inti;
charpass_a[3][7];
printf("请输入当前密码:\\n");scanf("%s",pass_a[0]);
while(strcmp(pass_a[0],t->pass)!=0){
if(strlen(pass_a[0])==6)
printf("您输入的密码有误,请重新输入:\\n");else{
printf("您输入的密码有误,请重新输入:\\n");
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");}
scanf("%s",pass_a[0]);}
printf("请输入新密码:\\n");//输入新密码时也可能出现密码不足六位的情况
scanf("%s",pass_a[1]);
while(strlen(pass_a[1])!=6){
printf("您输入的密码有误,请重新输入:\\n");
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");scanf("%s",pass_a[1]);}
printf("请再次输入新密码:\\n");scanf("%s",pass_a[2]);
while(strlen(pass_a[2])!=6){
printf("您输入的密码有误,请重新输入:\\n");
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");scanf("%s",pass_a[2]);}
while(strcmp(pass_a[1],pass_a[2])!=0){
printf("两次新密码输入不一致,请重新输入新密码:\\n");scanf("%s",pass_a[1]);while(strlen(pass_a[1])!=6){printf("您输入的密码有误,请重新输入:\\n");
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");scanf("%s",pass_a[1]);}
printf("请再次输入新密码:\\n");scanf("%s",pass_a[2]);
while(strlen(pass_a[2])!=6){
printf("您输入的密码有误,请重新输入:\\n");
printf("温馨提示:密码是六位数字或字母,请重新输入!\\n");scanf("%s",pass_a[2]);}}
for(i=0;ipass[i]=pass_a[1][i];printf("密码修改成功!\\n");}
/*检查用户取款是否超支*/
floatisoverdraw(floatm,intn){
intk;m=m-n;if(m}
FILE*fp;
fp=fopen("E:\\\\account.txt","w");if(fp==NULL){
printf("Can"topenfile\\n");return;}
p=head;
while(p!=NULL){
fprintf(fp,"%d%s%s%f\\n",p->number,p->name,p->pass,p->m);p=p->next;}
fclose(fp);
六、过程展示
显示登录系统
用户登录,出现错误,进行提示
取款界面,引导用户正确操作
取款超过5000,被记录
存款界面
查询余额
修改密码
附:account文件
友情提示:本文中关于《银行ATM机工作流程模拟编程(链表)》给出的范例仅供您参考拓展思维使用,银行ATM机工作流程模拟编程(链表):该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。