程序设计报告 B1514.docx
- 文档编号:8805656
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:32
- 大小:556.97KB
程序设计报告 B1514.docx
《程序设计报告 B1514.docx》由会员分享,可在线阅读,更多相关《程序设计报告 B1514.docx(32页珍藏版)》请在冰豆网上搜索。
程序设计报告B1514
程序设计报告
(2013/2013学年第2学期)
题目:
自动提款机模拟程序
专业应用物理
学生姓名李滨
班级学号B12080514
指导教师 骆健
指导单位计算机学院计算机科学与技术系
日期2013-03-27
自动提款机模拟程序
一、课题内容和要求
自动提款机模拟程序能为用户提供存款、取款、查询、和修改密码的功能。
为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、修改密码以及开户的功能。
用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。
本系统各个业务有如下注意点:
本程序通过c语言实现各项要求,并通过简单的操作实现各项功能。
二、需求分析
随着科技及社会的发展,人们对银行系统的要求日益提高,而自助化的银行系统级自动提款机系统日益受到人们的重视,满足人们对银行操作自主化的需求。
本次程序设计通过以c语言|c++为基础设计此程序,能够检验学生对c语言的掌握熟练程度。
程序各功能需求:
(1)登录:
当输入的卡号和密码(初始密码为123456)后,与文本文件中已存放的卡号、密码匹配,若正确,登录自动提款机。
(2)自动提款机存款:
每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
不能出现负存。
(3)修改密码:
新密码长度不小于6位,不允许出现6位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
(4)查询余额:
初始余额为10000元
(5)退出:
退出时,需要将对帐户修改的数据存入文本文件中。
(6)允许多个账户的存在并可以在文本文件中查看相关信息。
三、概要设计
1.系统总框图:
2.函数功能详解:
2.1银行登录功能
客户进入银行取款机登录界面时,按照指定的要求进行操作,当提示客户输入身份证号(卡号),当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,若客户输入的银行卡号与注册的卡号不相同,则提示客户输入有误,让客户重新输入。
三次输入银行卡号有误,系统将自动退出。
若输入卡号正确,则进入下一个流程。
当提示客户输入银行卡密码,当系统接收到客户的输入信息时,将文件中的信息输到链表中,进行遍历核对,若客户输入的银行卡密码与注册的银行卡密码不相同,则提示客户输入有误,让客户重新输入。
2.2银行取款功能
客户进入银行取款界面时,在银行取款界面中显示客户可取金额数目项目,客户按照指定金额对应的阿拉伯数字输入即可。
当客户按照指定的要求输入时,将对客户输入的金额与用户里面的余额进行比较,若客户输入的金额大于现有余额,则提示客余额不足,返回功能选择界面。
若客户输入的金额小于客户原有余额,则按p->money-=i的公式从客户原有余额中减去当下所取金额,然后提示取款成功,并显示客户现有余额。
2.3余额查询功能
客户在进入银行查询界面时,系统自动从链表中读取与该客户相匹配的余额。
2.4修改密码功能
客户进入登录界面时,系统自动提示客户输入银行卡原密码,当系统接收到客户的输入的信息时,遍历链表中的信息与客户输入的密码进行核对,若客户输入的银行卡原密码与注册的银行卡密码不相同,则提示客户输入有误,系统将自动返回功能选择界面。
若输入密码正确,提示客户输入新密码,若第一次输入的新密码不为六位或六位相同则返回界面,若所输入密码符合要求且两次输入相同则保存好客户修改的新密码。
下次登录只能用新密码才能成功登录。
3.重要函数流程图
1.登陆函数流程图
2.修改密码函数流程图
四、源程序代码
#include
#include
#include
structper/*定义结构体*/
{
charname[20];
charID[20];
intmoney;
charmima[20];
structper*next;
};
typedefstructperson/*定义另一结构体*/
{
structperkehu;
structperson*next;
}L;
voidchaxun(structper*head);/*各个函数的声明*/
voidkaihu(structper*head);
voiddenglu(structper*head);
voidcaidan(structper*head);
voidqukuan(structper*head);
voidxgmm(structper*head);
voidcunkuan(structper*head);
voidchuangjian(structperson**Phead);
voidshuchu(structperson*Phead);
voidshanchu(structperson**Phead);
voidzengjia(structperson**Phead);
voidtuichu();
1.主函数
/////////////////////////////////////////////
voidmain()
{system("colora");
charx;
charchoose;/*choose为定义输入选择的变量*/
intflag=1;
structperson*Phead=NULL;/*Phead为定义二层头指针*/
structper*head=NULL;/*head为定义一层头指针*/
printf("********************************\n");
printf("**欢迎使用ATM自动取款机系统***\n");
printf("********************************\n\n\n\n");
printf("---------------------------\n");
printf("|1开户|\n");
printf("---------------------------\n");
printf("|2登录|\n");
printf("---------------------------\n");
printf("|请选择您的需求|\n");
printf("---------------------------\n");
scanf("%s",&x);
system("cls");
switch(x)
{
case'1':
system("cls");
kaihu(head);/*调用开户函数*/
break;
case'2':
system("cls");
denglu(head);/*调用登陆函数*/
break;
}
while(flag)
{
system("cls");
tuichu();
}
}
2.开户函数
////////////////////////////////
voidkaihu(structper*head)
{
head=NULL;
FILE*fp;/*定义文件指针*/
structper*p1=NULL,*p2=NULL;/*p1,p1为定义链表指针*/
p1=(structper*)malloc(sizeof(structper));/*开辟内存单元*/
printf("请输入您的姓名:
\n");/*将数据输入链表中*/
scanf("%s",p1->name);
printf("请设置您的卡号:
\n");
scanf("%s",p1->ID);
printf("请设置您银行卡密码:
\n");
scanf("%s",p1->mima);
p1->money=10000;
p1->next=NULL;
printf("您的个人信息为\n");
printf("姓名:
%s\n卡号:
%s\n余额:
%4d\n",p1->name,p1->ID,p1->money);
printf("您的初始金额为10000元\n");
if(NULL==head)/*为新增客户开辟内存单元*/
{
head=(structper*)malloc(sizeof(structper));
head->next=p1;/*进行头插法,将其作为第一个节点*/
}
else/*为新增客户开辟内存单元*/
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*进行尾插*/
p2->next=p1;
}
if((fp=fopen("save.txt","ab+"))==NULL)/*打开文件*/
{
printf("cannotopenfile\n");
return;
}
if(fwrite(p1,sizeof(structper),1,fp)!
=1)/*将链表信息写入文件中*/
printf("filewriteerror\n");
fclose(fp);
printf("\n");
printf("恭喜您开户成功,请登录\n");
system("pause");
system("cls");
denglu(head);
}
3.登陆函数
/////////////////////////////////////////////
voiddenglu(structper*head)
{
chard[20];
charmima[20];
inti,j;
FILE*fp;/*定义文件指针*/
structper*p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL)/*打开一个二进制文件,为读方式*/
{
printf("不能打开文件\n");/*如不能打开,则结束程序*/
}
p=(structper*)malloc(sizeof(structper));/*申请空间*/
head=p;
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(1!
=fread(p,sizeof(structper),1,fp))
break;/*如果没读到数据,跳出循环*/
p->next=(structper*)malloc(sizeof(structper));/*为下一个结点申请空间*/
q=p;/*保存当前结点的指针,作为下一结点的前驱*/
p=p->next;/*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL;/*最后一个结点的后继指针为空*/
fclose(fp);
printf("***********************\n");
printf("* 欢迎使用本银行*\n");
printf("***********************\n");
for(j=1;j<4;j++)/*限制卡号输入的次数的循环*/
{
printf("请您输入卡号\n");
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("\n\n请输入您的密码\n");
scanf("%s",mima);
if(strcmp(q->mima,mima)!
=0)/*核对密码*/
{
printf("密码不正确,请重新输入密码\n");
system("pause");
system("cls");
continue;/*若密码不对,跳出循环*/
}
else
{
system("cls");
caidan(head);/*调用菜单函数*/
}
}
printf("\n\n\n您输入密码三次错误,谢谢光临\n");
system("pause");
system("cls");
exit(0);
}
}
printf("\n\n\n您输入的卡号有误,请重试\n");
system("pause");
system("cls");
}
printf("您的卡号三次输入错误,谢谢使用");
exit(0);
}
4.银行菜单函数
//////////////////////////////////////////
voidcaidan(structper*head)
{
head=NULL;
inti;/*i为客户选择输入的变量*/
while
(1)
{
printf("请选择您需要的业务\n");/*银行业务菜单*/
printf("***********************************\n");
printf("**1取款*****2查询**\n");
printf("***********************************\n");
printf("**3存款*****4修改密码**\n");
printf("***********************************\n");
printf("************5退出*****************\n");
printf("***********************************\n\n\n");
scanf("%d",&i);
if(i<5||i>0)
{
switch(i)
{
case1:
qukuan(head);/*调用银行取款函数*/
system("pause");
system("cls");
break;
case2:
system("cls");
chaxun(head);/*调用银行查询函数*/
break;;
case3:
system("cls");
cunkuan(head);/*调用银行修改密码函数*/
break;
case4:
system("cls");
xgmm(head);/*调用银行存款函数*/
break;
case5:
system("cls");
tuichu();/*调用银行退出函数*/
break;
}}
else
{
printf("您的输入有误\n");
system("pause");
system("cls");
}
}
}
5.银行取款函数函数
//////////////////////////////////////////
voidqukuan(structper*head)
{
head=NULL;/*head为链表头指针*/
inti;
FILE*fp;/*定义文件指针*/
structper*p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL)/*打开一个二进制文件,为读方式*/
{
printf("不能打开文件\n");/*如不能打开,则结束程序*/
}
p=(structper*)malloc(sizeof(structper));/*申请空间*/
head=p;
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(1!
=fread(p,sizeof(structper),1,fp))
break;/*如果没读到数据,跳出循环*/
p->next=(structper*)malloc(sizeof(structper));/*为下一个结点申请空间*/
q=p;/*保存当前结点的指针,作为下一结点的前驱*/
p=p->next;/*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL;/*最后一个结点的后继指针为空*/
fclose(fp);
system("cls");
printf("请输入您要取款的金额\n");
scanf("%d",&i);
if(i%100!
=0||i<=0)/*限制输入范围*/
{
printf("对不起,您的输入有误\n\n");
return;
}
else
{
if(i>q->money)
{
printf("对不起,您的余额不足\n");
system("pause");
system("cls");
caidan(head);/*调用取款机菜单函数*/
}
else
{
q->money-=i;/*对金额进行处理*/
if((fp=fopen("save.txt","wb+"))==NULL)/*打开文件*/
{
printf("cannotopenfile\n");
return;
}
if(fwrite(q,sizeof(structper),1,fp)!
=1)/*将修改的信息重新写入文件*/
printf("filewriteerror\n");
printf("您已成功走取%d元\n",i);
q->next=NULL;
fclose(fp);/*关闭文件*/
}
}
}
6.银行查询函数
//////////////////////////////////////////
voidchaxun(structper*head)
{
head=NULL;/*链表头指针*/
FILE*fp;/*定义文件指针*/
structper*p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL)/*打开一个二进制文件,为读方式*/
{
printf("不能打开文件\n");/*如不能打开,则结束程序*/
}
p=(structper*)malloc(sizeof(structper));/*申请空间*/
head=p;
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(1!
=fread(p,sizeof(structper),1,fp))
break;/*如果没读到数据,跳出循环*/
p->next=(structper*)malloc(sizeof(structper));/*为下一个结点申请空间*/
q=p;/*保存当前结点的指针,作为下一结点的前驱*/
p=p->next;/*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL;/*最后一个结点的后继指针为空*/
fclose(fp);
printf("您卡上原有余额为%d元\n\n",q->money);
system("pause");
system("cls");
}
7.银行修改密码函数
//////////////////////////////////////////
voidxgmm(structper*head)
{
head=NULL;/*链表头指针*/
charmima[20];
charmima1[20];
charmima2[20];
inti;
FILE*fp;/*定义文件指针*/
structper*p,*q=NULL;
if((fp=fopen("save.txt","rb+"))==NULL)/*打开一个二进制文件,为读方式*/
{
printf("不能打开文件\n");/*如不能打开,则结束程序*/
}
p=(structper*)malloc(sizeof(structper));/*申请空间*/
head=p;
while(!
feof(fp))/*循环读数据直到文件尾结束*/
{
if(1!
=fread(p,sizeof(structper),1,fp))
break;/*如果没读到数据,跳出循环*/
p->next=(structper*)malloc(sizeof(structper));/*为下一个结点申请空间*/
q=p;/*保存当前结点的指针,作为下一结点的前驱*/
p=p->next;/*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL;/*最后一个结点的后继指针为空*/
fclose(fp);
printf("请输入您的原密码\n");
scanf("%s",mima);
if(strcmp(q->mima,mima)==0)/*核对密码*/
{
{
printf("密码正确\n");
printf("请输入您的新密码:
\n");
scanf("%s",mima1);
if(strlen(mima1)!
=6)
{
printf("请输入六位的密码\n");
system("pause");
system("cls");
}
else
if(mima1[1]==mima1[2]&&mima1[2]==mima1[3]&&mima1[3]==mima1[4]&&mima1[4]==mima1[5]&&mima1[0]==mima1[1])
{printf("六位不能相同\n");
system("pause");
system("cls");
return;}
else
printf("请再次输入您的新密码\n");
scanf("%s",mima2);
if(strcmp(mima1,mima2)==0)
{strcpy(q->mima,mima2);
if((fp=fopen("save.txt","wb+"))=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计报告 B1514 程序设计 报告