c++课程设计银行账户管理系统.docx
《c++课程设计银行账户管理系统.docx》由会员分享,可在线阅读,更多相关《c++课程设计银行账户管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
c++课程设计银行账户管理系统
青岛理工大学
C++面向对象课程设计报告
院(系):
计算机工程学院
专业:
软件工程
学生姓名:
_华逸帆
班级:
_软件121班_ 学号:
201207185
题目:
__银行账户管理系统
起迄日期:
_2014.6.23~2013.7.5
设计地点:
计算机学院机房
指导教师:
李兰
完成日期:
2014年7月5日
1.概要设计…………………………………………………….1
1.1设计思想……………………………………………….1
1.2设计方法……………………………………………….1
1.3系统中主要模块和其他模块间的关系描述………....1
2.需求分析……………………………………………………..2
3.总体设计……………………………………………………..2
4.模块设计……………………………………………………..3
4.1开户功能模块………………………………………….3
4.1.1功能模块分析……………………………...……..3
4.1.2代码设计及分析………………………………….4
4.1.3运行结果………………………………………….5
4.2销户功能模块………………………………………….5
4.2.2功能模块分析……………………………………5
4.2.3代码设计及分析…………………………………5
4.2.3运行结果………………………………………….7
5.系统使用说明……………………………………………….7
6.附录………………………………………………………….7
6.1设计体会……………………………………………….7
6.2源程序………………………………………………….8
1.概要设计
1.1设计思想
银行账户管理系统,通过设计一个控制台应用程序来实现工作人员遍历管理所有银行用户的银行账户功能。
通过C++面向对象的程序设计语言,利用面向对象的设计思想,将程序运用面向对象的方法逐块划分,对每个对象的性质进行分析设计。
1.2实现方法
总体设计方法,是构建一个链表,来存储用户的资料,数据存储方面,用存储文件技术代替存储数据库技术。
构建一个银行账户类,封装链表的头结点,创建用户银行账户各个属性的函数及其变量。
构建一个程序操作类,用于封装实现打印操作菜单,实现主程序的操作选择等方法。
1.3系统中主要模块及各模块间的关系的描述
系统中的主要模块:
结构体节点:
用于存放用户所用的账户信息(,单位,,账户号,余额,地址,是否为联名账户等)
银行账户类:
用于封装链表的头结点,记录删除所回收的账户号,和删除回收的账户数目;构造函数在创建对象时,完成从文件中读出用户账户所有信息的操作,析构函数在对象即将消亡时,完成将整个链表中的所有信息逐个节点的存入文件中的操作。
程序操作类:
用于实现程序中,菜单打印操作,菜单选择等操作。
其他各个模块:
节点构建函数构(开户函数):
链表构建函数为银行账户类的私有函数成员,银行账户类的大三功能函数之一,即是链表构建的方法,也是用户开户的方法,当构造函数运行时从文件中读入数据存入链表时调用,在用户选择开户操作时调用,实现添加一个节点的功能,进而实现链表一个节点逐个构造的功能。
节点删除函数(销户函数):
节点删除函数为银行账户类的私有成员,银行账户类的三大功能函数之一,即是链表删除的方法,也是用户销户的方法,当用户选择销户操作时,调用节点删除函数,删除并释放节点。
资金操作函数(存款,取款,转账函数):
资金操作函数为银行账户类的私有成员,银行账户的三大功能函数之一,是用户所有对资金操作的方法的集合。
在用户选择任何一种资金操作时调用资金操作函数,完成对用户账户资金的操作,同时对节点中相对应的变量进行修改,并且返回操作结果。
操作选择函数:
选择操作函数为银行类的公有成员,根据打印菜单函数,用户输入任意一个选项选择操作,相对应的银行账户的操作。
并且判断用户是否按照规定输入,将用户输入的选择传入操作函数。
操作函数:
操作函数为银行操作类的私有成员,根据传来的参数选择是否调用,三大功能函数,并且返回操作结果。
其他功能函数:
基本均为银行账户类的私有成员函数,节点信息输入函数:
实现节点信息逐个输入,和账号生成的功能,主要是在开户函数中调用。
节点遍历函数:
根据传入的字符串,遍历查链表,返回符合规定的节点指针。
文件读写操作函数():
实现节点信息文件中的读写功能,同时实现类中私有变量链表长度,回收账号,回收账号数目的读写操作,主要实在对象的构造函数和析构函数中调用。
2.需求分析
银行账户管理系统,是由银行工作人员对银行用户的账户进行操作管理的系统。
是一款使用者为银行工作人员,但服务对象是银行用户的管理系统。
不考虑银行工作人员账号注册用户名密码的情况下,只需要对银行用户账户的信息进行操作和管理就能完成要求。
银行用户账户的属性中含有,用户的用户真实姓名,身份证号码,公司,地址,电话号码,账户号码,账户余额等属性。
除账户余额外,其余变量类型均应该为string类型,账户余额的类型应该为,double类型。
身份证号码,长度应为18位,电话号码的长度应为11位。
账户余额不能超值,最小值为零。
账户号码应由系统自动生成,一个用户名额下可以有多个账户,每个账户由账户号来区别开来。
另外应该设立一种联名账户,这种账户有两个人共同管理,及一个账户由两个用户名,有两个身份证号码。
此外,系统中的每个变量的输入都应该有判断正误的判断,对错误无效的变量输入应该反馈结构不接受。
系统中所有的用户信息应该在程序开始时从文件中读出,再程序结束时写入文件,这样实现用户信息的存储代替存入数据库的方法。
3.总体设计
管理系统总体结构由构建的链表存储信息,程序结束后所有的用户信息都存入文件中,程序开始时再从文件中读取相关的信息。
声明一个结构体变量Node,包含string类型的变量:
用户名,身份证号码,电话号码,公司,地址,账户号,联名用户用户名,联名用户身份证号码,double类型的变量余额,Node*类型的变量next。
定义一个Link类,封装链表的头指针Node*head,链表的长度length,回收的账号lack【】,回收的账号数目number。
构造函数,在建立对象时构建链表,通过存入链表的length值判断链表的长度及已存在的银行账户个数,从而调用构造链表的add()函数,在add()函数中调用file_read()函数读出存在文件中银行账户的信息。
程序开始打印出菜单供用户选择。
开户,对应add()函数,add函数调用out_node()函数,根据提示输入用户银行账户所有信息,并根据length长度和用户的身份证号码后12位生成账户账号。
销户操作,对应delcte()函数,根据传递的参数用户账号字符串,查找对应的银行账户,然后对节点进行删除释放。
存款,取款,转账操作对应money()函数,根据传递的参数,用户的账户号码,及选择的选项,执行相对的操作,通过账户号码找到相对应的节点,在对节点的money变量进行简单的加减操作。
析构函数,在对象消亡时进行调用,本程序也就是在程序即将结束时进行调用,将链表中的每个节点所有信息,按照一定的顺序存入指定的文件中,再将银行类中的链表的长度length,回收的账号数组lack【】,回收的账号数目按照一定的顺序存入文件中。
4.程序模块设计
4.1开户功能模块:
4.1.1模块功能分析:
开户功能膜块在面向用户方面应该实现应该具有如下功能,银行账户所有信息输入的功能,提示用户是否申请为联名账户,并且防止用户随意输入错误无效的信息。
在面向系统结构方面,应该具有构建链表节点功能,创建链表节点,并且根据所处的位置加入链表,尾节点的next指针应该指向NULL。
最后返回操作结果,执行成功返回true,失败返回false。
4.1.2代码的设计及分析:
booladd(boolt,ifstream&input)//是否是从文件中读出银行账户信息
{
Node*pel,*tail;
if(head==NULL)//构建链表头结点
{
head=newNode();
if(!
t)//是否第一次使用系统
{
out_node(head,length);
length++;
}
else//不是第一次使用系统,从文件中读取信息
read_file(head,input);
head->next=NULL;
returntrue;
}
else
{
pel=head;
while(pel->next)//在链表的末端添加节点
{
pel=pel->next;
}
tail=newNode();
tail->next=NULL;
if(!
t)//是否第一次使用系统
{
out_node(tail,length);
length++;
}
else//不是第一次使用系统,从文件中读取信息
read_file(tail,input);
pel->next=tail;
pel=tail;
returntrue;
}
}
4.1.3运行结果:
4.2销户模块:
4.2.1模块功能分析
模块功能分析:
销户函数模块,面像用户来说需要实现以下功能:
用户通过输入一个银行账户号码,查找相对应的银行账户,如果银行账户不存在,返回给用户银行账户不存在的信息,如果存在,提示用户是否删除,用户确认删除,将对应的银行账户信息删除,反馈给用户删除成功的信息。
面对系统内部来说,应该实现以下功能:
通过所输入的string类型变量查找符合要求的节点,用户确认删除,用delete函数释放节点内存,重新接好链表。
此外应该防止用户随意输入的无效和错误信息。
最后返回操作结果,执行成功返回true,失败返回false。
4.2.2代码的设计及分析:
booldelect(stringnum)
{
Node*pel,*q;
intc,i;
if(head->num==num)//如果删除的是头结点
{
cout<<"请问您确定要销户吗?
1.yes2.no"<while(true)
{
cin>>c;
if(c==1)
{
for(i=0;i<=50;i++)//回收删除的银行账号到一个数组里,并记录数组中,值得个数
{
if(lack[i]!
=NULL)
{
lack[i]=((int)head->num[0]-'0');
number++;
break;
}
}
pel=head;
head=head->next;
length--;
delete(pel);
returntrue;
}
elseif(c==2)
returnfalse;
elsecout<<"输入有误!
请重新输入!
"<}
}
pel=head;
while(pel->next!
=NULL)
{
if(num==pel->next->num)//查找要删除的节点
{
cout<<"请问您确定要销户吗?
1.yes2.no"<while(true)
{
cin>>c;
if(c==1)
{
for(i=0;i<=50;i++)//回收删除的银行账号到一个数组里,并记录数组中,值得个数
{
if(lack[i]{
lack[i]=((int)head->num[0]-'0');
number++;
break;
}
}
q=pel->next;
pel->next=q->next;
delete(q);
length--;
returntrue;
}
elseif(c==2)//如果要销户
returnfalse;
elsecout<<"输入有误!
重新输入!
"<}
}
pel=pel->next;
}
if(pel->next==NULL)
{
cout<<"没有找到所查找的账户"<returnfalse;
}
}
4.2.3运行结果:
5.系统使用说明
系统开始运行,屏幕上回打印出功能菜单,根据功能菜单提示的来选择功能操作,在退出系统时,一定要通过系统提供正确的结束进程方式,才能自动的保存所有的操作。
银行账户的所有信息会在下次系统启动时自动加载到系统中。
6.附录
6.1设计体会:
通过此次C++程序设计,我切身的体会到了面向对象程序和面向过程程序语言的区别,区别不仅仅存在于两种程序语言中,也存在与编程思想中。
面向对象的程序编程思想主要是把需求模块化,根据每个模块特定的属性,需要实现的功能来编写模块,创建对象。
纸上得来终觉浅,细节方便我也学习到了很,例如析构函数的调用实在对象的生存周期结束时,而对象的生存周期也有很明确的规定,比如说一次循环中创建的对象,在这次循环结束时,这个对象的生存周期就已经结束了;早期的C++编译器不支持string类型的数组,因为数组的长度应该是一定不便的,而string类型的数组违反了早期C++开发环境这一规定;对文件对象iftream作为参数传给函数时,形参的形式只能为引用,因为其对象的拷贝构造函数默认为私有变量。
等等很多细节问题使我学到了很多,又熟练运用了C++程序设计的技巧。
本次设计我将银行账户几乎所有成员都封装到了私有变量中,增强了程序的密封性。
将保存于读取数据悄无声息的在构造函数和析构函数中完成了,降低了用户的操作次数是本程序的亮点。
但本系统代码还不够精简,有待改进。
6.2源程序:
//银行账户.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structNode//定义一个结构体变量,包含所有银行账户信息。
{
doublemoney;
stringnum;
stringname,name1;//字符串数组为联名账户做准备
stringIDnum,IDnum1;
stringcompany;
stringphonenum;
stringaddress;
Node*next;
};
classLink//链表类
{
private:
Node*head;//封装头指针和链表长度
intlength;
intlack[50],number;//用于记录回收的账号,和回收的账号数目
/**********节点信息输入函数**************/
voidout_node(Node*dot,inti)
{
stringnum1;//用于生成账号
charnum2[10];//用于生成账号
intj=0;//循环变量j
cout<<"请输入相关数据:
"<cout<<"请输入公司"<>dot->company;
while(true)//电话号码长度判断
{
cout<<"请输入电话号码"<>dot->phonenum;
if(dot->phonenum.length()==11)break;
elsecout<<"输入有误!
请重新输入!
"<}
cout<<"请输入地址"<>dot->address;
dot->money=0;//用户的初始余额为零
cout<<"请输入姓名1"<>dot->name;
while(true)//身份号长度判断
{
cout<<"请输入身份证号1"<>dot->IDnum;
if(dot->IDnum.length()==18)break;
elsecout<<"身份证号码长度有误,请重新输入"<}
num1=dot->IDnum.substr(6,12);//用于生成账号
if(number==0)//如果有回收的账号,先用被回收的账号
itoa(i,num2,10);
else
{
while(true)
{
if(lack[j]>=0)
{
i=lack[j];
lack[j]=-1;
number--;
itoa(i,num2,10);
break;
}
j++;
}
}
if(!
question())//是否设置为联名账户
{
cout<<"请输入姓名2"<>dot->name1;
while(true)//身份号长度判断
{
cout<<"请输入身份证号2"<>dot->IDnum1;
if(dot->IDnum.length()==18)
break;
elsecout<<"身份证号码长度有误,请重新输入"<}
dot->num=num2+dot->IDnum1.substr(6,12)+num1;//生成账户号,联名账户由两个身份证号,后12为组成
}
else
{
dot->num=num2+num1;//生成账户号,一般账户由身份证号后12位加总账户数组成
}
cout<<"您的银行账户卡号为"<num<}
/***************************节点信息写入文件函数******************************/
voidwrite_file()//程序结束时统一将所有信息写入文件
{
ofstreamoutput("bank.txt");
Node*pel;
for(pel=head;pel!
=NULL;pel=pel->next)
{
output<num<<"";
output<IDnum<<"";
output<name<<"";
if(pel->IDnum1!
=""||pel->name1!
="")//如果是联名账户
{
output<IDnum1<<"";
output<name1<<"";
}
output<address<<"";
output<company<<"";
output<money<<"";
output<phonenum<}
}
/**********************节点信息读出文件函数***********************************/
voidread_file(Node*dot,ifstream&input)//程序开始时将所有信息读入到文件中
{
input>>dot->num;
input>>dot->IDnum;
input>>dot->name;
if(dot->num.length()>20)//如果是联名账户,联名账户的账号长度应为24
{
input>>dot->IDnum1;
input>>dot->name1;
}
input>>dot->address;
input>>dot->company;
input>>dot->money;
input>>dot->phonenum;
}
/******************************节点查询函数**********************************/
Node*iterates(stringnum)//根据传入的账号查找账户
{
Node*pel;
pel=head;
do
{
if(num==pel->num)
{
returnpel;
}
pel=pel->next;
}while(pel!
=NULL);
returnNULL;
}
/****************************************************************/
/**************三大功能(开户,销户,金额操作)****************/
/****************************************************************/
/************************添加节点函数(开户)******************************/
booladd(boolt,ifstream&input)//是否是从文