当前位置:文档之家› 银行卡管理系统

银行卡管理系统

第一章系统概述1.1目的:银行卡管理系统是采用先进的数据仓库技术帮助银行全面科学分析客户信息、挖掘客户价值的强有力的经营管理工具。

它对银行加强管理、防范风险、提高收益,以客户为中心提供个性化服务,提高服务水平,最终增强核心竞争力具有现实和深远的意义。

银行卡决策支持系统的重要意义在于系统已具有客户关系管理的雏形,建立了客户关系管理的核心。

1.2 任务:这个银行卡系统的需要完成的功能主要有六个:开户,存款,取款,挂失,销户,转载等功能。

1.3 开发环境:在windows下用visual c++工具开发。

第二章可行性分析2.1 问题定义:开发一个简易的银行卡管理系统,这个系统的开发分两步进行,首先是简易银行卡1系统的分析与设计,分析这个系统要完成什么功能,然后是银行卡系统的编码与实现。

2.2 整体分析:(1)技术可行性------可行;(2)经济可行性------可行;(3)操作可行性------可行;(4)法律可行性------可行;2.3 系统流程图图1-1 系统流程图图1-2 数据流图第三章需求分析3.1功能需求这个银行卡系统的需要完成的功能主要有六个:开户,存款,取款,挂失,销户,转载等功能:(1)开户 : 可以接收一个新的用户,生成一个新的账号。

(2)存款 : 在输入正确的账号和密码的情况下,可以接收用户输入的存款金额,并且加上余额然后将结果置为当前金额。

(3)取款 : 在输入正确的账号和密码的情况下,可以接收用户输入的取款金额,并且用余额减去它然后将结果置为当前金额,取款金额应不大于当前金额。

(4)查询:在输入正确的账号和密码的情况下,可以查询用户余额。

(5)挂失 : 在输入正确的账号和密码的情况下,可以进行挂失操作。

当用户挂失后,再不能用这个账号进行任何操作。

(6)销户 : 在输入正确的账号和密码的情况下,可以进行消户操作。

当用户销户后,该账号被永久性删除。

3.2数据定义用一个结构体来定义一个银行卡,这个结构体包括银行卡的卡号,持卡人的姓名,卡上的金额,还有银行卡的挂失信息。

用户名 : 开户人的名字,可以接受中英文字符。

帐号 : 证明开户人身份的号码。

可由用户自己指定,并且不能和已有的帐号相同。

余额 : 帐号里的当前金额。

挂失信息:用来说明银行卡是否已经挂失,用1表示挂失,0表示未挂失。

struct Labor{string names; //字符串型---用户名string mima; //字符串型---密码long double jine; //DOUBLE型---存储金额(不能为负数)int n; //当N等于1时,说明可以正常登陆,若N等于0,说明已挂失};3.3运行要求银行卡管理系统的硬件和软件的配置如下: 系统软件: Window XP/win7 文档系统:txt 文档3.4 数据字典第四章总体设计4.1处理流程图本系统由三大模块组成,包括开户、基本操作和忘记密码,而基本操作又由六大子模块构成,包括查询余额、存款、取款、挂失/解挂、修改密码和销户。

图4-1 处理流程图4.2模块接口说明该银行卡系统运行后会出现一个操作界面,主要有开户,存款,取款,挂失,销户,转账以及退出等操作,输入相应的数字就可以选用任意一种操作,输入另外的数字则显示输入错误。

分别用函数实现开户,存款,取款,挂失,销户,转账等功能,并用一个txt文档来保存用户信息,当新开一个用户的时候就将该用户的银行卡信息写入该文档中并保存。

当用户进入银行卡系统后,需要实现相应的功能的时候,该系统首先根据用户的卡号来查找该用户,然后做相应的处理,如果没有找到则提示错误。

LaboNode*CreateLabList(char filename[],LaboNode*phead);//将文件中的数据转换成链表存储,文件乃是用的TXT文档,其中存有用户数据信息,返回的是链表表头void Save(char filename[],LaboNode*ph);//保存至文件中,即完成打操作后,系统保存你完成修改的信息void Lossof(LaboNode*phead);//挂失,你先得输入正确的用户名与密码才能挂失。

void DisLossof(LaboNode*phead);//取消挂失,得输入正确的用户名与密码。

void Regis(LaboNode*phead);//注册帐号,用户名要没有注册过的,密码二次输入要一致LaboNode*Query(LaboNode*phead);//登陆查询,返回的是你输入用户名与密码正确的那个结点,你便可以在下面对其进行操作。

void Deposit(LaboNode*p);//存款,P乃是登陆中所得的那个结点存款不能为负void Withdraw(LaboNode*p);//取款,P乃是登陆中所得的那个结点取款不能为负且不能大于卡上余额void Revise(LaboNode*p);//修改密码,P乃是登陆中所得的那个结点,删除时要两次输入密码,且两次密码要一致LaboNode*Cancel(LaboNode*phead,LaboNode*p);//注销。

从链表中把P结点删除,此处有phead.故而将会于链表之上直接删除void Operate(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)Stanley B.Lippman C++ Primer 北京人民邮电出版社,2007附录一:程序清单程序各功能代码如下:enum Status {UNHOOKED,HOOKED};enum MenuType {MAINMENU, ADM_SUBMENU, USER_SUBMENU};enum FuncType {NONE, ADM_MOD, USER_MOD, OPEN_ACCOUNT, REPORT_LOSS, UNHOOKING, CLOSE_ACCOUNT,SA VING, DRAWING, INQUIRING, TRANSFERING, MODIFY_PASSWORD,EXIT};struct Date //日期结构体{int month;int day;int year;};struct UserInfo //用户信息结构体{char userNum[14];char userName[15];char userID[19];char password[7];Date openDate;Status status;int money;};struct UserNode //用户链表{UserInfo userinfo;UserNode *next;};// 所用到的各个函数UserNode *head=NULL,*p=NULL;void Wait();void Save(char filename[]);void RemoveUserList();void GenCardNum(char cardnum[],UserNode *&head); UserInfo &GetUserInfo(UserInfo &userinfo); UserNode *CreateUserList(char filename[]); UserNode *OpenAccount(UserInfo &userinfo); UserNode *Entry(UserNode *&head);bool CloseAccount(UserNode *&head);bool HookAccount(UserNode *&head);bool UnhookAccount(UserNode *&head);void Saving(UserNode *&);void Drawing(UserNode *&);void Inquiring(UserNode *&);void Transfering(UserNode *&);void ModifyPassword(UserNode *&);int count;void Wait(){long j=0;for(double i=1000000;i>0;){i=i-0.002;j++;j--;}}UserNode *CreateUserList(char filename[]){UserNode *p;int status=0;ifstream userdata(filename);if(!userdata){cout<<"文件不存在!"<<endl;return NULL;}while(!userdata.eof()){if(p=new UserNode){userdata>>p->erNum;userdata>>p->erName;userdata>>p->erID;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();return head;}void RemoveUserList(){for(UserNode *p2,*p1=head;p1;p1=p2){p2=p1->next;delete p1;}head=NULL;}UserNode *OpenAccount(UserInfo &userinfo){UserNode *p;char c;if(p=new UserNode){strcpy(p->erNum,erNum);strcpy(p->erName,erName);strcpy(p->erID,erID);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<<"您的卡号为: "<<p->erNum<<endl;if(c=='Y'){Save("userinfo.txt");return p;}else{p=head;head=head->next;delete p;return head;}}bool HookAccount(UserNode *&head){char cardnum[14],c;int status=1;cout<<"请输入用户卡号: ";cin>>cardnum;UserNode *p1=head,*p2=head->next;if(!strcmp(head->erNum,cardnum)){if(head->userinfo.status==1) {cout<<"此卡已经挂失!"<<endl;return false;}cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){head->userinfo.status=(Status)status;Save("userinfo.txt");return true;}else return false;}while(p2!=NULL){if(!strcmp(p2->erNum,cardnum)) break;else {p1=p2;p2=p2->next;}}if(p2==NULL) {cout<<"此卡号不存在,无法挂失!"<<endl;return false;}if(p2->userinfo.status==1) {cout<<"此卡已经挂失!"<<endl;return false;}cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){p2->userinfo.status=(Status)status;Save("userinfo.txt");return true;}else return false;}bool UnhookAccount(UserNode *&head){char cardnum[14],c;int status=0;cout<<"请输入用户卡号: ";cin>>cardnum;UserNode *p1=head,*p2=head->next;if(!strcmp(head->erNum,cardnum)){if(head->userinfo.status==0) {cout<<"此卡没有挂失,无需解挂!"<<endl;return false;}head->userinfo.status=(Status)status;cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){Save("userinfo.txt");return true;}else return false;}while(p2!=NULL){if(!strcmp(p2->erNum,cardnum)) break;else {p1=p2;p2=p2->next;}}if(p2==NULL) {cout<<"此卡号不存在,无法解挂!"<<endl;return false;}if(p2->userinfo.status==0) {cout<<"此卡没有挂失,无需解挂!"<<endl;return false;} p2->userinfo.status=(Status)status;cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){Save("userinfo.txt");return true;}else return false;}bool CloseAccount(UserNode *&head){int count=0;char cardnum[14],code[7],c;cout<<"请输入用户卡号: ";cin>>cardnum;UserNode *p1=head,*p2=head->next;if(p1==NULL){cout<<"用户记录为空,无法销户!"<<endl;return false;}if(!strcmp(head->erNum,cardnum)){cout<<"请输入密码: ";cin>>code;count++;while(strcmp(head->userinfo.password,code)!=0 && count<=3){cout<<"密码错误,请重新输入: ";cin>>code;count++;}if(count>3) return false;cout<<"用户卡号: "<<p1->erNum<<endl;cout<<"用户姓名: "<<p1->erName<<endl;cout<<"用户身份证号: "<<p1->erID<<endl;cout<<"用户密码: "<<p1->userinfo.password<<endl;cout<<"用户储蓄额: "<<p1->userinfo.money<<endl;cout<<"开户日期: "<<p1->userinfo.openDate.year<<"年"<<p1->userinfo.openDate.month<<"月"<<p1->userinfo.openDate.day<<"日"<<endl;cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){head=p2;delete p1;Save("userinfo.txt");return true;}else return false;}while(p2!=NULL){if(!strcmp(p2->erNum,cardnum)) break;else {p1=p2;p2=p2->next;}}if(p2==NULL) {cout<<"此卡号不存在,无法销户!"<<endl;return false;}cout<<"请输入密码: ";cin>>code;count++;while(strcmp(p2->userinfo.password,code)!=0 && count<3){cout<<"密码错误,请重新输入: ";cin>>code;count++;}if(count>=3) return false;cout<<"用户卡号: "<<p2->erNum<<endl;cout<<"用户姓名: "<<p2->erName<<endl;cout<<"用户身份证号: "<<p2->erID<<endl;cout<<"用户密码: "<<p2->userinfo.password<<endl;cout<<"用户储蓄额: "<<p2->userinfo.money<<endl;cout<<"开户日期: "<<p2->userinfo.openDate.year<<"年"<<p1->userinfo.openDate.month<<"月"<<p1->userinfo.openDate.day<<"日"<<endl;cout<<"确认-Y/取消-N: ";cin>>c;if(c=='Y'){p1->next=p2->next;delete p2;Save("userinfo.txt");return true;}else return false;}UserInfo &GetUserInfo(UserInfo &userinfo){char code[7];int status=0;userinfo.status=(Status)status;cout<<"请输入用户姓名: ";cin>>erName;cout<<"请输入用户身份证号: ";cin>>erID;cout<<"请输入密码: ";cin>>userinfo.password;cout<<"请再次输入密码: ";cin>>code;while(strcmp(userinfo.password,code)){cout<<"请重新输入密码: ";cin>>userinfo.password;cout<<"请再次输入密码: ";cin>>code;}cout<<"请输入储蓄金额: ";cin>>userinfo.money;cout<<"请输入开户日期: ";cin>>userinfo.openDate.year>>userinfo.openDate.month>>userinfo.openDate.day;GenCardNum(erNum,head);return userinfo;}void GenCardNum(char cardnum[],UserNode *&head){cardnum[14];char str1[100],str2[100];int n;int i=0;int bits=0;int count=0;for(UserNode *p=head;p;p=p->next)count++;n=count;do{str1[i++]=n%10+'0';bits++;n=n/10;}while(n>0);for(int j=0;j<13-bits;j++)cardnum[j]='0';cardnum[j]='\0';for(int k=bits-1;k>=0;k--)str2[bits-1-k]=str1[k];str2[bits]='\0';strcat(cardnum,str2);count++;}UserNode *Entry(UserNode *&head){int count=0;char cardnum[14],code[7];cout<<"请输入卡号: ";cin>>cardnum;UserNode *p1=head,*p2=head->next;if(p1==NULL){cout<<"用户记录为空,无法登录!"<<endl;return p1;}if(!strcmp(head->erNum,cardnum)){if(head->userinfo.status==1){cout<<"此卡已经挂失,无法登录!"<<endl;return NULL;}cout<<"请输入密码: ";cin>>code;count++;while(strcmp(head->userinfo.password,code)!=0 && count<=3){cout<<"密码错误,请重新输入: ";cin>>code;count++;}if(count>3) return NULL;cout<<"操作正在处理中,请稍后..."<<endl;return head;}while(p2!=NULL){if(!strcmp(p2->erNum,cardnum)) break;else {p1=p2;p2=p2->next;}}if(p2==NULL) {cout<<"此卡号不存在,无法登录!"<<endl;return NULL;} if(p2->userinfo.status==1){cout<<"此卡已经挂失,无法登录!"<<endl;return NULL;}cout<<"请输入密码: ";cin>>code;count++;while(strcmp(p2->userinfo.password,code)!=0 && count<3){cout<<"密码错误,请重新输入: ";cin>>code;count++;}if(count>=3) return NULL;cout<<"操作正在处理中,请稍后..."<<endl;Wait();return p2;}void Saving(UserNode *&p){int money;char c;cout<<"请输入存款额: ";cin>>money;cout<<"操作正在处理中,请稍后..."<<endl;Wait();p->userinfo.money=p->userinfo.money+money;Save("userinfo.txt");cout<<"是否打印凭条?(是-Y/否-N): ";cin>>c;if(c=='Y'){cout<<"凭条正在打印中..."<<endl;Wait();}return;}void Drawing(UserNode *&p){int money;char c;cout<<"请输入取款额: ";cin>>money;if(money>p->userinfo.money){cout<<"余额不足!";return;}else{cout<<"操作正在处理中,请稍后..."<<endl;Wait();p->userinfo.money=p->userinfo.money-money;Save("userinfo.txt");cout<<"请及时取走钞票,否则将会被回收!"<<endl;Wait();cout<<"是否打印凭条?(是-Y/否-N): ";cin>>c;if(c=='Y'){cout<<"凭条正在打印中..."<<endl;Wait();}}return;}void Inquiring(UserNode *&p){cout<<"您的余额: "<<p->userinfo.money<<endl; }void Transfering(UserNode *&p){char cardnum[14],c;int money;cout<<"请输入对方卡号: ";cin>>cardnum;for(UserNode *q=head;q;q=q->next){if(!strcmp(cardnum,q->erNum))break;}if(q==NULL){cout<<"此卡号不存在,无法进行转账!";return;}cout<<"请输入转账额: ";cin>>money;if(money>p->userinfo.money){cout<<"您卡上的余额不足,无法进行转账!";return;}cout<<"操作正在处理中,请稍后..."<<endl;Wait();p->userinfo.money=p->userinfo.money-money;q->userinfo.money=q->userinfo.money+money;Save("userinfo.txt");cout<<"转账成功!"<<endl;cout<<"是否打印凭条?(是-Y/否-N): ";cin>>c;if(c=='Y') cout<<"凭条正在打印中..."<<endl;Wait();}void ModifyPassword(UserNode *&p){char password[7];cout<<"请输入原密码: ";cin>>password;cout<<"请输入新密码: ";cin>>p->userinfo.password;Save("userinfo.txt");return;}void Save(char filename[]){UserNode *p;int status;ofstream userdata(filename);if(!userdata){cout<<"输出文件无法打开!"<<endl;return;}for(p=head;p;p=p->next){userdata<<" "<<p->erNum;userdata<<" "<<p->erName;userdata<<" "<<p->erID;userdata<<" "<<p->userinfo.password;userdata<<" "<<p->userinfo.money;userdata<<" "<<p->userinfo.openDate.year<<" "<<p->userinfo.openDate.month<<" "<<p->userinfo.openDate.day;status=p->userinfo.status;userdata<<" "<<status;}userdata.close(); }。

相关主题