银行卡管理系统.docx
- 文档编号:27448082
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:39
- 大小:306.47KB
银行卡管理系统.docx
《银行卡管理系统.docx》由会员分享,可在线阅读,更多相关《银行卡管理系统.docx(39页珍藏版)》请在冰豆网上搜索。
银行卡管理系统
第一章系统概述
1.1目的:
银行卡管理系统是采用先进的数据仓库技术帮助银行全面科学分析客户信息、挖掘客户价值的强有力的经营管理工具。
它对银行加强管理、防范风险、提高收益,以客户为中心提供个性化服务,提高服务水平,最终增强核心竞争力具有现实和深远的意义。
银行卡决策支持系统的重要意义在于系统已具有客户关系管理的雏形,建立了客户关系管理的核心。
1.2任务:
这个银行卡系统的需要完成的功能主要有六个:
开户,存款,取款,挂失,销户,转载等功能。
1.3开发环境:
在windows下用visualc++工具开发。
第二章可行性分析
2.1问题定义:
开发一个简易的银行卡管理系统,这个系统的开发分两步进行,首先是简易银行卡系统的分析与设计,分析这个系统要完成什么功能,然后是银行卡系统的编码与实现。
2.2整体分析:
(1)技术可行性------可行;
(2)经济可行性------可行;
(3)操作可行性------可行;
(4)法律可行性------可行;
2.3系统流程图
图1-1系统流程图
2.4数据流图
文档(txt格式)
图1-2数据流图
第三章需求分析
3.1功能需求
这个银行卡系统的需要完成的功能主要有六个:
开户,存款,取款,挂失,销户,转载等功能:
(1)开户:
可以接收一个新的用户,生成一个新的账号。
(2)存款:
在输入正确的账号和密码的情况下,可以接收用户输入的存款金额,并且加上余额然后将结果置为当前金额。
(3)取款:
在输入正确的账号和密码的情况下,可以接收用户输入的取款金额,并且用余额减去它然后将结果置为当前金额,取款金额应不大于当前金额。
(4)查询:
在输入正确的账号和密码的情况下,可以查询用户余额。
(5)挂失:
在输入正确的账号和密码的情况下,可以进行挂失操作。
当用户挂失后,再不能用这个账号进行任何操作。
(6)销户:
在输入正确的账号和密码的情况下,可以进行消户操作。
当用户销户后,该账号被永久性删除。
3.2数据定义
用一个结构体来定义一个银行卡,这个结构体包括银行卡的卡号,持卡人的姓名,卡上的金额,还有银行卡的挂失信息。
用户名:
开户人的名字,可以接受中英文字符。
帐号:
证明开户人身份的号码。
可由用户自己指定,并且不能和已有的帐号相同。
余额:
帐号里的当前金额。
挂失信息:
用来说明银行卡是否已经挂失,用1表示挂失,0表示未挂失。
structLabor{
stringnames;//字符串型---用户名
stringmima;//字符串型---密码
longdoublejine;//DOUBLE型---存储金额(不能为负数)
intn;//当N等于1时,说明可以正常登陆,若N等于0,说明已挂失
};
3.3运行要求
银行卡管理系统的硬件和软件的配置如下:
系统软件:
WindowXP/win7
文档系统:
txt文档
3.4数据字典
第四章总体设计
4.1处理流程图
本系统由三大模块组成,包括开户、基本操作和忘记密码,而基本操作又由六大子模块构成,包括查询余额、存款、取款、挂失/解挂、修改密码和销户。
图4-1处理流程图
4.2模块接口说明
该银行卡系统运行后会出现一个操作界面,主要有开户,存款,取款,挂失,销户,转账以及退出等操作,输入相应的数字就可以选用任意一种操作,输入另外的数字则显示输入错误。
分别用函数实现开户,存款,取款,挂失,销户,转账等功能,并用一个txt文档来保存用户信息,当新开一个用户的时候就将该用户的银行卡信息写入该文档中并保存。
当用户进入银行卡系统后,需要实现相应的功能的时候,该系统首先根据用户的卡号来查找该用户,然后做相应的处理,如果没有找到则提示错误。
LaboNode*CreateLabList(charfilename[],LaboNode*phead);
//将文件中的数据转换成链表存储,文件乃是用的TXT文档,其中存有用户数据信息,返回的是链表表头
voidSave(charfilename[],LaboNode*ph);
//保存至文件中,即完成打操作后,系统保存你完成修改的信息
voidLossof(LaboNode*phead);
//挂失,你先得输入正确的用户名与密码才能挂失。
voidDisLossof(LaboNode*phead);
//取消挂失,得输入正确的用户名与密码。
voidRegis(LaboNode*phead);
//注册帐号,用户名要没有注册过的,密码二次输入要一致
LaboNode*Query(LaboNode*phead);
//登陆查询,返回的是你输入用户名与密码正确的那个结点,你便可以在下面对其进行操作。
voidDeposit(LaboNode*p);
//存款,P乃是登陆中所得的那个结点
存款不能为负
voidWithdraw(LaboNode*p);
//取款,P乃是登陆中所得的那个结点
取款不能为负且不能大于卡上余额
voidRevise(LaboNode*p);
//修改密码,P乃是登陆中所得的那个结点,
删除时要两次输入密码,且两次密码要一致
LaboNode*Cancel(LaboNode*phead,LaboNode*p);
//注销。
从链表中把P结点删除,
此处有phead.故而将会于链表之上直接删除
voidOperate(LaboNode*phead,LaboNode*p);
//登陆后进行的操作,如:
取款,存款,修改密码,消户。
第五章详细设计
5.1各详细设计图
开户流程图:
存款流程图:
是是
否
否
是
是否
否
是
是是
否
是
取款流程图:
否
否
是
是
否是
否
是否
否
修改密码流程图:
注销流程图:
否
是否
是
挂失流程图:
解挂流程图:
否否
是
是
是是
否否
是是
否
否
5.2程序描述:
1.RegisterDlg过程
对注册界面中输入的各项信息进行检验其合法性。
若发现错误,则输出该类型错误信息,若无发现错误,则提示用户注册成功,并显示用户的用户名,卡号等信息。
2.ForgetPwdDlg过程
对忘记密码界面中输入的用户名和身份证号通过数据库进行核对,若数据库中存在此用户,则输出用户的用户名,卡号和密码。
若发现错误,则弹出相应的错误信息。
3.M_BANKDlg过程
对登录界面中输入的用户名和密码通过数据库进行核对,若正确,则进入基本操作界面,若错误,则弹出相应的错误信息。
4.Checkmoney过程
根据登录时所输入的用户名和密码,找到其在数据库中对应的账户金额,并将其显示出来。
5.SaveMoneyDlg过程
对存款界面中输入的金额进行检验,若不合法,则弹出错误信息;若无误,则根据登录时所输入的用户名和密码,找到其在数据库中对应的用户,并修改账户金额,同时将其显示出来。
6.DrawMoneyDlg过程
对存款界面中输入的金额进行检验,若不合法,则弹出错误信息;若无误,则根据登录时所输入的用户名和密码,找到其在数据库中对应的用户,并修改账户金额,同时将其显示出来。
7.LockUnlockDlg过程
根据登录时所输入的用户名和密码,找到其在数据库中对应的用户权限,若处于挂失状态,则只能执行解挂操作;若处于解挂状态,则只能执行挂失操作,其他情况均为错误操作,若执行了,则系统弹出相应的错误信息。
8.ModifyPwdDlg过程
对修改密码界面总输入的原密码和新密码进行判断,若合法,则修改数据库中的用户密码,然后返回登录界面;若有误,则弹出相应的错误信息。
9.UnaccountDlg过程
根据登录时所输入的用户名和密码,找到其在数据库中对应的账户金额,并将其显示出来。
用户可以根据金额选择取款或直接销户的操作。
若选择销户,必须提示销户带来的严重后果,提示用户谨慎操作。
若选择取款,则弹到取款界面。
第六章测试与运行记录
测试用例可用等价划法:
当我们打开系统,便会跳出如上的选择界面,你可以选择1~4种操作,当按其它任何键后,都会退出来。
并非一定要是“5”键。
当按“1”时:
从上面我们可以得到很多信息,首先,我们账号要是一个没有被注册的。
Tom已经被注册。
故不能用。
再就是我们输入密码要一致,不一致便会要重新输入。
然后便是金额的问题,第一个,金额不能为负数。
第二个,金额不能为非数字,其中都有判断。
当我们按“y”确定创建账户。
便会创建成功。
如下:
当我们进入界面,选择登陆操作,输入正确的用户名与密码。
我们可以清楚看到,zhang的卡上有78块钱。
我们可以选择1~4种操作。
按其它键便会退出。
当我们按“1”键时:
我们存款金额,一不能为负数,二不能非数字。
当真地存款确认后,我们便可发现账号上加上了我们存款数额。
当按不退出账号时,我们再次进入操作界面:
当我们选择“2”取款时,我们要注意的约束条件有:
1.不能为负数。
2.不能为非数字。
3.取款金额不能超过已有金额。
当满足以上三个条件且确认取款,那么便会取款成功。
当我们选择修改密码时:
如果两次输入新密码不一致,那么便要重新输入,直到成功。
当我们用消户时:
消户成功后,我们便失去了这个用户的信息。
我们可以再次进入管理系统:
我们发现,我们输入zhang这个用户后,提示的是“该用户不存在”,当我们退出来,对用户进行挂失:
我们可以发现,挂失一次再挂失便会提示。
而且,我们可以进入“labor.txt”中看一下情况:
我们可以发现,tong这个用户已经挂失,后面为0
当我们解挂:
我们再来看“labor.txt”:
我们可以看到,后面又变成了1了。
好,我们先对tong进行挂失,我们再登陆看看是什么情况:
当我们把已经挂失的帐号进行登陆时,我们会发现,它提示我们帐号已经挂失。
我们只要对其再进行解挂,我们便又可以再次访问之。
第七章设计完成结果分析与获得的主要成果
这个银行卡管理系统完成了开户,存款,取款,挂失,销户,转载等主要功能。
结束语
通过本次的实验,使我全面地了解了软件工程的各个阶段要完成的工作。
在对问题定义以及可行性研究之后。
对照于给出的需求分析。
我大致在了解了要完成工作的量。
利用结构化程序设计,模块独立化编写。
完成了大致的编写。
这次的实验,使我明白了软件测试便是寻找错误的过程,而并不是证明软件正确性。
使我在自己的程序中,寻找出了许多的问题,并且一一改正。
这对于我往后的编程是有十分大的帮助的。
通过本次的实验,让我体会到编写一个健壮的程序并不是一个简单的事情,往往我们还得要有好的测试方法才能把程序中错误的地方找出来。
这对于以后工作与生活,是有十分重要的影响的。
而且通过工程化地编写程序,使得我对于软件工程的思想有了更加进一步的了解,而且通过需求分析,总体设计,详细设计等步骤,使我编写程序更加得心应手。
而测试的方法更是让我能够更加快速地找到问题并提供解决办法。
可以说,这次实验是一次十分成功的实验,使我能够熟练使用软件工程思想发现问题,分析问题并解决问题。
参考文献
(1)张海藩软件工程导论(第五版)北京清华大学出版社,2006
(2)周苏、王文等软件工程及其应用天津天津科学技术出版社,2004
(3)StanleyB.LippmanC++Primer北京人民邮电出版社,2007
附录一:
程序清单
程序各功能代码如下:
enumStatus{UNHOOKED,HOOKED};
enumMenuType{MAINMENU,ADM_SUBMENU,USER_SUBMENU};
enumFuncType{NONE,ADM_MOD,USER_MOD,OPEN_ACCOUNT,REPORT_LOSS,UNHOOKING,CLOSE_ACCOUNT,
SAVING,DRAWING,INQUIRING,TRANSFERING,MODIFY_PASSWORD,EXIT};
structDate//日期结构体
{
intmonth;
intday;
intyear;
};
structUserInfo//用户信息结构体
{
charuserNum[14];
charuserName[15];
charuserID[19];
charpassword[7];
DateopenDate;
Statusstatus;
intmoney;
};
structUserNode//用户链表
{
UserInfouserinfo;
UserNode*next;
};
//所用到的各个函数
UserNode*head=NULL,*p=NULL;
voidWait();
voidSave(charfilename[]);
voidRemoveUserList();
voidGenCardNum(charcardnum[],UserNode*&head);
UserInfo&GetUserInfo(UserInfo&userinfo);
UserNode*CreateUserList(charfilename[]);
UserNode*OpenAccount(UserInfo&userinfo);
UserNode*Entry(UserNode*&head);
boolCloseAccount(UserNode*&head);
boolHookAccount(UserNode*&head);
boolUnhookAccount(UserNode*&head);
voidSaving(UserNode*&);
voidDrawing(UserNode*&);
voidInquiring(UserNode*&);
voidTransfering(UserNode*&);
voidModifyPassword(UserNode*&);
intcount;
voidWait()
{
longj=0;
for(doublei=1000000;i>0;)
{
i=i-0.002;
j++;
j--;
}
}
UserNode*CreateUserList(charfilename[])
{
UserNode*p;
intstatus=0;
ifstreamuserdata(filename);
if(!
userdata)
{
cout<<"文件不存在!
"< returnNULL; } while(! userdata.eof()) { if(p=newUserNode) { userdata>>p->userinfo.userNum; userdata>>p->userinfo.userName; userdata>>p->userinfo.userID; userdata>>p->userinfo.password; userdata>>p->userinfo.money; userdata>>p->userinfo.openDate.year>>p->userinfo.openDate.month>>p->userinfo.openDate.day; userdata>>status;p->userinfo.status=(Status)status; p->next=head; head=p; } } userdata.close(); returnhead; } voidRemoveUserList() { for(UserNode*p2,*p1=head;p1;p1=p2) { p2=p1->next; deletep1; } head=NULL; } UserNode*OpenAccount(UserInfo&userinfo) { UserNode*p; charc; if(p=newUserNode) { strcpy(p->userinfo.userNum,userinfo.userNum); strcpy(p->userinfo.userName,userinfo.userName); strcpy(p->userinfo.userID,userinfo.userID); strcpy(p->userinfo.password,userinfo.password); p->userinfo.openDate.year=userinfo.openDate.year; p->userinfo.openDate.month=userinfo.openDate.month; p->userinfo.openDate.day=userinfo.openDate.day; p->userinfo.money=userinfo.money; p->userinfo.status=userinfo.status; p->next=head; head=p; } cout<<"确认-Y/否-N: "; cin>>c; cout<<"您的卡号为: "< if(c=='Y') { Save("userinfo.txt"); returnp; } else { p=head; head=head->next; deletep; returnhead; } } boolHookAccount(UserNode*&head) { charcardnum[14],c; intstatus=1; cout<<"请输入用户卡号: "; cin>>cardnum; UserNode*p1=head,*p2=head->next; if(! strcmp(head->userinfo.userNum,cardnum)) { if(head->userinfo.status==1){cout<<"此卡已经挂失! "< cout<<"确认-Y/取消-N: "; cin>>c; if(c=='Y') { head->userinfo.status=(Status)status; Save("userinfo.txt"); returntrue; } elsereturnfalse; } while(p2! =NULL) { if(! strcmp(p2->userinfo.userNum,cardnum))break; else{p1=p2;p2=p2->next;} } if(p2==NULL){cout<<"此卡号不存在,无法挂失! "< if(p2->userinfo.status==1){cout<<"此卡已经挂失! "< cout<<"确认-Y/取消-N: "; cin>>c; if(c=='Y') { p2->userinfo.status=(Status)status; Save("userinfo.txt"); returntrue; } elsereturnfalse; } boolUnhookAccount(UserNode*&head) { charcardnum[14],c; intstatus=0; cout<<"请输入用户卡号: "; cin>>cardnum; UserNode*p1=head,*p2=head->next; if(! strcmp(head->userinfo.userNum,cardnum)) { if(head->userinfo.status==0){cout<<"此卡没有挂失,无需解挂! "< head->userinfo.status=(Status)status; cout<<"确认-Y/取消-N: "; cin>>c; if(c=='Y') { Save("userinfo.txt"); returntrue; } elsereturnfalse; } while(p2! =NULL) { if(! strcmp(p2->userinfo.userNum,cardnum))break; else{p1=p2;p2=p2->next;} } if(p2==NULL){cout<<"此卡号不存在,无法解挂! "< if(p2->userinfo.status==0){cout<<"此卡没有挂失,无需解挂! "< p2->userinfo.status=(Status)status; cout<<"确认-Y/取消-N: "; cin>>c; if(c=='Y') { Save("userinfo.txt"); returntrue; } elsereturnfalse; } boolCloseAccount(UserNode*&head) { intcount=0; charcardnum[14],code[7],c; cout<<"请输入用户卡号: "; cin>>cardnum; UserNode*p1=head,*p2=head->next; if(p1==NULL) { cout<<"用户记录为空,无法销户! "< returnfalse; } if(! strcmp(head->userinfo.userNum,cardnum)) { cout<<"请输入密码: "; cin>>code; count++; while(strcmp(head->userinfo.password,code)! =0&&count<=3) { cout<<"密码错误,请重新输入: "; cin>>code; count++; } if(count>3)returnfalse; cout<<"用户卡号: "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行卡 管理 系统