银行账户管理程序.docx
《银行账户管理程序.docx》由会员分享,可在线阅读,更多相关《银行账户管理程序.docx(27页珍藏版)》请在冰豆网上搜索。
![银行账户管理程序.docx](https://file1.bdocx.com/fileroot1/2022-11/24/3f0054e5-0832-412b-9a3d-b705953446f8/3f0054e5-0832-412b-9a3d-b705953446f81.gif)
银行账户管理程序
1前言
自从第一台计算机诞生以来,程序设计方法与程序设计语言不断发展,面向对象的程序设计师使计算机解决问题的方式更符合人类的思维方式,更能直接的描述客观世界,使用面向对象程序设计的思想和方法进行系统设计和编程,能很好的解决了从现实世界的问题空间到计算机解空间的直接映射,并且能使所设计的系统能更加准确地模拟现实世界。
通过增加代码的可重用性、可扩充性和程序自动生成功能来提高编程效率,并且大大减少软件维护的开销;同时面向对象的系统从程序的结构、运行机制上保证了程序的安全性、灵活性;大大提高了程序代码段的复用性、易维护性和易扩展性,从而被越来越多的软件设计人员所接受。
“面向对象”不再是软件开发中的一个时髦名词,而是对软件开发人员的基本要求,面向对象程序设计已经成为程序设计领域的主流技术。
本次课程设计主要是利用C++的类的定义和使用以及成员变量和成员函数的定义和使用等设计了一个银行账户管理程序,并实现了以下功能:
账户的信息有账号(唯一)、姓名、余额、身份证号码、单位、电话号码、地址等,允许用户进行如下操作:
开户、销户、存款、取款、转账、查询,一个用户可以有多个户头,账户的数值没有上限。
2需求分析
2.1要求
程序运行时,可以由用户选择进行何种操作,用户销户后账号被回收,并且该账号可以继续分配给其它账户,不允许用户透支。
开户操作要求输入用户信息后自动获取账号。
根据姓名或账号可以进行用户的信息查询,所有的账户信息应存放到一个文件中,可以随时的访问和更新。
2.2任务
设计一个银行账户管理程序,账户的信息有账号(唯一)、姓名、余额、身份证号码、单位、电话号码、地址等,允许用户进行如下操作:
开户、销户、存款、取款、转账、查询,一个用户可以有多个户头,账户的数值没有上限。
2.3运行环境
(1)WINDOWS2000/XP系统
(2)VisualC++6.0编译环境或DEVC++5.0编译环境
2.4开发工具
C++语言
3分析和设计
3.1系统分析及设计思路
3.1.1类与对象
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。
类的一般形式为:
class类名
{
protect:
〈保护的数据和成员函数〉
public:
〈公用的数据和成员函数〉
private:
〈私有的数据和成员函数〉
};
对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。
对象的一般格式为:
<类名><对象名表>;
3.1.2成员函数的实现
成员函数的实现,可以放在类体内,也可以放在类体外,但必须在类体内给出原型说明。
放在类体内定义的函数被默认为内联函数,而放在类体外定义的函数是一般函数,如果要定义为内联函数则需要在前面加上关键字inline。
与普通函数不同的是,成员函数是属于某个类的,在类体外定义成员函数的一半形式为:
<返回类型><类名>:
:
<成员函数>(<参数说明>)
{
函数体
}
3.1.3本程序涉及的类—users
根据类的定义:
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。
本设计的账户信息(姓名、余额、身份证号码、单位、电话号码、地址等)恰好可以定义成一个类—users,伪代码如下:
classusers//账户类
{
private:
charid[5];//账号
charpassword[11];//密码
charname[9];//账户名
charid_card[19];//身份证号码
charcompany[40];//单位
charcompany_phone[12];//单位电话
charmoble_phone[12];//手机
charaddress[31];//地址
longbalance;//余额
users*next;//指向下一个账户
public:
users(ifstream&file_in);//构造函数,同时从文件读取账户数据
……
voidnew_user();//新建账户信息
voidput_id(intid_new);//获取账号
char*get_id();//返回账号
……//取款
voidsaving();//存款
voidsaving(longmoney);//转入帐
longvirement();//转出账
……
};
3.1.4main函数的实现
一个程序中main是最简单但是最重要的函数,他负责着整个程序的调用运行,我们设计的这个main函数思路很简单,但是实现起来稍微复杂一些,本想简化一下,可是始终没有解决,本程序main函数基于一个switch()语句来实现各个操作的选择,在case后面再调用具体操作函数来实现操作,由于要选择的操作比较多,所以才显得复杂些,具体伪代码如下:
intmain()
{
intchoice;
do
{zi_title();
cin>>choice;
boolblag=0;
switch(choice)
{
case1:
cout<<"---开户---\n";
user=newusers;
user->put_id(n_id(head));
user->new_user();
……
case2:
cout<<"---销户---\n";
if(head==0){cout<<"还没有账户!
建议开户!
"<……
case3:
cout<<"---存款---\n";
user=u_search(head,2,0);
……
case4:
cout<<"---取款---\n";
user=u_search(head,2,0);
user->take_money();
break;
case5:
cout<<"---转账---\n";
……
case6:
cout<<"---查询---\n";
cout<<"选择查询条件:
\n1-账户名2-账号3-身份证号选项:
";
……
case0:
f_out.open("banksystem.txt");
if(f_out.fail())
{cout<<"文件打开错误!
"<exit
(1);
}
……
default:
cout<<"没有该选项!
"<break;}
}while(choice);
cout<<"谢谢使用!
"<return0;
}
3.2主要类图
users
-id[5]
-password[11]
-password[11]
-name[9]
-company[40]
-company_phone[12]
-moble_phone[12]
-address[31]
-balance
+new_user()
+put_id()
+get_balance()
+take_money()
+saving()
+saving()
+virement()
图3.1users类图
3.3函数流程图
开户new_user函数流程图如下:
图3.2开户new_user流程图
存款users:
:
saving函数流程图如下:
图3.3存款users:
:
saving流程图
转账users:
:
virement函数流程图如下:
图3.4转账users:
:
virement流程图
4具体代码实现
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
//清空该行
voidnew_line()
{
charsymbol;
do{
cin.get(symbol);
}while(symbol!
='\n');
}
//数字转换到字符串
voidint2str(intn,char*str)
{
charbuf[10]="";
inti=0;
intlen=0;
inttemp=n<0?
-n:
n;//temp为n的绝对值
if(str==NULL)
{
return;
}
while(temp)
{
buf[i++]=(temp%10)+'0';//把temp的每一位上的数存入buf
temp=temp/10;
}
len=n<0?
++i:
i;//如果n是负数,则多需要一位来存储负号
str[i]=0;//末尾是结束符023
while
(1)
{
i--;
if(buf[len-i-1]==0)
{
break;
}
str[i]=buf[len-i-1];//把buf数组里的字符拷到字符串
}
if(i==0)
{str[i]='-';//如果是负数,添加一个负号
}
}
//该用于管理开启程序的账户和密码
voidsafe_conduct()
{intinput_num=0;
charun[11],pw[11];
cout<<"请先登陆:
(用户名为:
9021315密码为:
0000)"<boolblag;//标志错误
do{
blag=0;
cout<<"用户名:
";
cin>>un;
cout<<"密码:
";
cin>>pw;
if(strcmp(un,"9021315")!
=0)
{
blag=1;
cout<<"用户名输入错误!
"<}
if(!
blag)
{
if(strcmp(pw,"0000")!
=0)
{
blag=1;
cout<<"用户密码输入错误!
"<}
}
if(blag)
{
input_num++;
switch(input_num)
{
case1:
cout<<"您还可以输入两次!
"<case2:
cout<<"您还可以输入一次!
"<case3:
cout<<"您没有权限继续输入,程序将要关闭!
"<}
}
}while(blag);
}
//用于管理账户信息
classusers//账户类
{
private:
charid[5];//账号
charpassword[11];//密码
charname[9];//账户名
charid_card[19];//身份证号码
charcompany[40];//单位
charcompany_phone[12];//单位电话
charmoble_phone[12];//手机
charaddress[31];//地址
longbalance;//余额
users*next;//指向下一个账户
public:
users(ifstream&file_in);//构造函数,同时从文件读取账户数据
users(){balance=0;next=NULL;}//重载构造函数,使之用于开户
voidnew_user();//新建账户信息
voidput_id(intid_new);//获取账号
char*get_id();//返回账号
char*get_password();
char*get_name();//返回账户名
char*get_id_card();//返回身份证号
char*get_mob_ph();//返回手机号
longget_balance();//返回余额
voidtake_money();//取款
voidsaving();//存款
voidsaving(longmoney);//转入帐
longvirement();//转出账
voidout_to_file(ofstream&file_out);//写入文件
voidout_to_screen();//输出到屏幕
voidput_next(users*n);//得到指针
users*back_next();//返回指针
};
users:
:
users(ifstream&file_in)
{
file_in>>id>>name>>id_card>>company>>company_phone>>moble_phone>>address>>balance;
next=NULL;
}
voidusers:
:
new_user()
{charnew_pw[11],ok_new_pw[11];
cout<<"请您输入账户名:
";
cin>>name;
boolblag;
do{
blag=0;
cout<<"请您输入密码:
";
cin>>new_pw;
for(char*i=new_pw;*i!
='\0';i++)//检查密码是否合法
{
if(*i<='!
'||*i>='~')
{blag=1;
cout<<"密码不符合规范!
!
请重新输入!
!
"<break;
}
}
cout<<"确认密码:
";
cin>>ok_new_pw;
if(strcmp(new_pw,ok_new_pw)!
=0)
{
blag=1;
cout<<"密码不同!
"<}elseblag=0;
}while(blag);
strcpy(password,new_pw);
cout<<"请输入您身份证号码:
";
cin>>id_card;
cout<<"请输入您的单位:
";
cin>>company;
cout<<"情输入您的单位电话:
";
cin>>company_phone;
cout<<"请输入您的手机号:
";
cin>>moble_phone;
cout<<"请输入您的地址:
";
cin>>address;
cout<cout<<"您申请的账户信息为:
账号:
"<"<"<"<"
<"<"<
"<}
voidusers:
:
put_id(intid_new)
{
charnew_id[5];
intnum;
for(inti=3;i>=0;i--)//数字转换成字符串
{num=id_new%10;
new_id[i]=num+'0';
id_new/=10;
}
new_id[4]='\0';
strcpy(id,new_id);
}
char*users:
:
get_id()
{returnid;}
char*users:
:
get_password()
{returnpassword;}
char*users:
:
get_name()
{returnname;}
char*users:
:
get_id_card()
{returnid_card;}
char*users:
:
get_mob_ph()
{returnmoble_phone;}
longusers:
:
get_balance()
{returnbalance;}
voidusers:
:
take_money()
{
if(balance<=0)
{cout<<"您的余额已经为空!
无法取款!
\n存款后可以再取!
"<return;}
longm;
boolblag;
do{
blag=0;
cout<<"请输入取款金额:
";
cin>>m;
if(m>=balance)
{blag=1;
cout<<"您输入的金额大于余额,无法取出!
!
请重新输入!
!
"<}
}while(blag);
balance=balance-m;
}
voidusers:
:
saving()
{
longm;
boolblag;
do
{blag=0;
cout<<"请输入存款金额:
";
cin>>m;
if(m<0)
{cout<<"请正确输入金额!
";
blag=1;
}
}while(blag);
balance=balance+m;
}
voidusers:
:
saving(longmoney)
{balance=balance+money;}
longusers:
:
virement()
{longmoney;
boolblag;
do{
blag=0;
cout<<"请输入要转账的金额:
";
cin>>money;
if(money>=balance)
{
cout<<"余额不足!
请重新输入!
"<blag=1;}
}while(blag);
balance=balance-money;
returnmoney;}
voidusers:
:
out_to_file(ofstream&file_out)
{
file_out<<'\n'<voidusers:
:
out_to_screen()
{cout.setf(ios:
:
left);
cout<"<<"<<"<<"<<"<<"<<"<
<"<<cout.setf(ios:
:
right);
}
voidusers:
:
put_next(users*n)
{next=n;}
users*users:
:
back_next()
{returnnext;}
//查询:
选择查询条件:
1-账户名;2-账号;3-身份证号;
users*u_search(users*head,intchoice,boolb=1)
{
users*p;
boolblag=1;
switch(choice)
{
case0:
break;
case1:
charname[9];
cout<<"输入账户名:
";
cin>>name;
for(p=head;p!
=NULL;p=p->back_next())
{
if(strcmp(p->get_name(),name)==0)
{
p->out_to_screen();
blag=0;}
}
break;
case2:
charid[5];
cout<<"输入账号:
";
cin>>id;
for(p=head;p!
=NULL;p=p->back_next())
{
if(strcmp(p->get_id(),id)==0)
{
if(b)
{p->out_to_screen();
blag=0;}
else
returnp;
}
}
break;
case3:
charid_card[19];
cout<<"输入身份证号:
";
cin>>id_card;
for(p=head;p!
=NULL;p=p->back_next())
{if(strcmp(p->get_id_card(),id_card)==0)
{
p->out_to_screen();
blag=0;
}
}
break;
default:
cout<<"选项错误!
"<returnNULL;
}
if(blag){cout<<"没有该账户!
"<}
intn_id(users*head)
{intid;
intnow_id=0,num;
users*p;
charne_id[5];
boolblag;
for(id=0;id<=9999;id++)
{
blag=1;
now_id=id;
int2str(now_id,ne_id);//数字转换成字符串
for(inti=3;