}
voidGetValue()
{
A_Num=Count_OP+50000;//记录新建结点的位置
cin>>A_Name>>PassWord>>A_OverMoney;
if(A_OverMoney<10)
reinput;
}
voidSaveORGet()//存钱或者取钱
{
cin>>jud;
if(jud=='s')//存钱
{
cin>>change_amount;
A_OverMoney+=change_amount;
}
elseif(jud=='t')//取钱
{
cin>>change_amount;
A_OverMoney+=change_amount;
}
else
{
cout<<输入错误;
}
}
boolChechPassWord()
{
cin>>x;//输入密码
if(x==PassWord)
{
Disp();
returnOK;
}
else
{
cout<<密码错误;
returnNO;
}
}
voidDestroy()//销户
{
A_Num=0;
A_Name="";
A_OverMoney=0;
PassWord=Random;
}
}
2.主函数和其他函数的伪码算法;
全局函数:
voidNewAcount_Num()
{
p[Count_OP].GetValue();
p[Count_OP].Disp();
Count_OP+=1;//增加一个记录
}
voidChangeMoney()
{
cin>>no;
k=no-50000;
if(k>0)
{
if(p[k].CheckPassWord()=OK)//验证密码
{
p[k].A_SaveORGet();
}
elseif(p[k].CheckPassWord()=NO)
cout<<密码错误;
}
elsecout<<不存在的账户;
}
voidDeleteAcount()
{
cin>>no;
k=no-50000;//哈希函数的使用
if(k>0)
{
if(p[k].CheckPassWord()=OK)//验证密码
{
cin>>ch;
if(ch=='s')
p[k].Destroy();
}
elsecout<<未删除;
}
elsecout<<账号输入错误;
}
主函数:
voidmain()
{
switch(choice)
{
case1:
NewAcount_Num();break;
case2:
search_Num();break;
case3:
ChangeMoney_Num();break;
case4:
DeleteAcount_Num();break;
case5:
exit(0);
default:
{gotoloop1;system("cls");}
}
}
3.主要函数的程序流程图,
各个成员函数流程图:
成员函数:
4.画出函数之间的调用关系图。
四、调试分析
实际完成的情况说明(完成的功能,支持的数据类型等);
要求的功能全部完成。
程序的性能分析,包括时空分析;
本程序使用的是哈希表查找方法,所以,查找速度还是比较快的,时间复杂度为。
上机过程中出现的问题及其解决方案;
1、本来想用结构体的,但是我对类比较了解,所以就用了类;可是后来在主函数里面调用全局功能函数,没法实现,因为属性都是私有的。
于是我便想出了用全局函数调用类成员函数,进而改变类属性的方法。
而后来发现,这样是整个程序的结构也更加的清晰。
2、本来想设计两种查找方法:
账号查询和姓名查询的。
但是后来发现用姓名查询不太符合实际。
所以就保留了账号查询方法。
3、最初的设计没有密码,后来在某同学的提醒下,我决定也加上密码,然后就在类属性里面加入了PassWord,可是问题是,密码都是暗文,如何使输入时显示暗文,这个问题我没有解决。
密码本来想定义成string类型的,但是,根据实际,还是定义成了int型的。
4、当用户忘记密码时怎么办?
可以查询,开户的所有信息在文件里面也可以查询。
5、用户开户时存入负数怎么办?
干脆模仿银行开户时必须存入10元的做法,如果用户开户时输入金额小于10元,则提示并让用户重新输入。
6、用户查询的时候需要输入账号,假如用户输入的账号小于50000怎么办,输入的账号大于50000但是没有开过户怎么办?
我在查询的时候加了一判断语句,如果输入账号小于50000则提示错误,返回主菜单。
如果输入的账号不存在,那么其密码未初始化,无论输入任何密码,几乎不可能正确。
7、存取款的时候,编程出了点小错误:
无论密码输入对能存取钱,输入错误也能提示输入错误,但是也能存取钱,经检查发现,是未把存取款处理语句放到判断执行语句里面。
8、存取款的时候,如果用户输入s或者t之外的字符,就会出现错误,我的解决办法:
用if-elseif-else语句。
9、存取款如果用户输入负值怎么办?
跟开户的处理办法一样。
10、在构造函数的定义中我发现,其实最好不要给PassWord初始化,因为,不给他初始化,它会有一个不确定的值,这样,后面如果用户输入的账号不是已开户的账号时,在密码验证的那一步不会通过。
程序中可以改进的地方说明;
1.密码输入改为暗码。
2.密码限制,不能无限输入。
3.从文件读取之前存入的信息。
我只是写入到文件了,这里的作用也只能是备份信息的。
4.未做到:
一次输入密码之后选择存取款、查询等功能。
五、测试结果
开户:
查询:
存款:
销户:
六、用户手册
双击该程序:
出现以下界面:
你可以选择开户操作,查询操作,存取款操作,销户操作。
输入各个功能对应的数字,并按下回车。
(1)输入1,按下回车,出现以下界面:
接下来您需要输入所开户的姓名,然后按回车,接着会提示让您创建密码,您需要输入不是以零开头的7位以下的数字作为您的密码,否则您的账户可能会丢失。
接下来,请输入您要存储的金额,请输入非零开头的7位以下的数字,否则您的存款可能会丢失。
创建完账户会有以下提示,您需要按下回车以返回主菜单。
(2)返回主菜单后,您可以进行查询您的存款,输入2按回车,根据提示,输入您的账号,和密码,如果输入错误,程序会给出您具体操作提示,您需要根据提示进行操作。
(3)之后您还可以进行存取款操作,在主菜单选择3,输入账号和密码,出现以下界面,
现在您需要输入s或者t,输入s表示您要存款,t则是要取款,其他字符,会返回主菜单,
假设要取钱,您就输入t,然后,输入要取出的金额就是了。
(4)如果要销户,您需要在主界面选择4,输入账号,输入密码,选择确定,账户就会被删掉,删掉的账户不可以再利用。
七、体会与自我评价
银行活期储蓄管理系统制作心得与体会
两周的时间,就做了这么一个系统,而且还漏洞百出,不能应用到银行里面去。
由此可见,编程这条路还是很漫长的,就像老师说的:
c语言学完了,就以为自己会编程了,其实不然,现在学的还只是基础入门的东西,真正的实用的软件目前还是做不出来。
这是我最大的感慨。
这两周的时间里,除了这些感慨,当然我也学到了很多品德和知识,编程或者说软件开发,绝对不是随笔,需要有计划、有目的的去做,首先得需要进行结构的设计,我要做的软件需要哪些功能,要实现这些功能需要什么样的逻辑结构,各个结构之间怎么连接,应该使用什么样的存储结构,这都需要事先设计好。
各个部分分别用于什么样的用途,这需要在设计过程中做记录的,否则真的很容易忘记。
编程的过程中,需要集中精力,要清晰明白地记着自己做到哪里了,这一部分是什么功能,它跟其他的部分是什么关系,都要综合考虑,否则,很容易才出现牵一发而动全身的麻烦。
有时候,我遇到问题,会想是不是vs编译器的问题,但是经过这次课程设计,我懂得了,编译器出现问题的概率真的是很小很小,而自己考虑不周到的概率确实非常的大,所以,以后要全面、仔细考虑各种问题。
编程过程中,还有一个看似不是问题却不容忽略的大问题,就是很多同学不会休息,我中午一般不休息,但是下午编程的效率确实很低。
编程过程需要高度集中注意力,所以,好好休息时必要的。
源代码
#include"iostream"
#include"windows.h"
#include"fstream"
#include"iomanip"
#include"string"
constboolOK=1;
constboolNO=0;
usingnamespacestd;
intCount_OP=0;//用来记录新建储户的位置
ofstreamoutput("储户信息.bat");
ifstreaminput("储户信息.bat");
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////每个账户是一个基本单位,可以看作是一个对象。
///
///每个储蓄账户由账号、户主名组成,此外还要包括该储户的当前金额。
(当然如果可以的话,还应该包括交易记录。
///
////能进行搜索,我要求既能通过账号搜索,又能通过姓名搜索。
///
////我想,账号搜索用哈希表。
///
////假设账号共五位,从50000到50020,对象是从0-20,那么哈希函数为i=A_Num-50000;///
////////////////////////////////////////////////////////////////////////////////////////////////////////////
classDepositor
{
private:
longintA_Num;//储蓄帐号
stringA_Name;//储户姓名
doubleA_Overmoney;//储蓄余额
intPassWord;//用户密码
public:
Depositor()
{
A_Num=0;
A_Name="";
A_Overmoney=0;
}
voidGetValue()
{
//output<<"alskdjf;laks"<A_Num=Count_OP+50000;
cout<<"您的账号是"<cin>>A_Name;
cout<<"请为您的账户创建密码"<cin>>PassWord;
loop2:
cout<<"请输入您要存储的金额"<cin>>A_Overmoney;
if(A_Overmoney<10)
{cout<<"对不起,开户最少10元,请重新输入"<}
voidA_SaveORGet()//存钱或者取钱(类成员函数)。
{
charjud;
doublechange_amount;
loop1:
cout<<"存钱还是取钱?
存-s,取-t"<cin>>jud;
if(jud=='s')
{
re1:
cout<<"请输入要存入的金额"<cin>>change_amount;
if(change_amount<0)
{cout<<"输入金额错误,请重新输入"<else{
A_Overmoney+=change_amount;
cout<<"存钱成功,存入"<}
elseif(jud=='t')
{
re2:
cout<<"请输入要取出的钱"<cin>>change_amount;
if(change_amount>A_Overmoney||change_amount<0)
{cout<<"金额不足"<else{A_Overmoney-=change_amount;
cout<<"取钱成功,取出"<}
else{cout<<"输入错误,返回重试"<}
boolJud()
{
if(A_Num==0)
{returnNO;}
else{returnOK;}
}
//验证密码,如果正确会输出当前详情
boolCheckPassWord()
{
longintx;
cout<<"请输入该账户的密码"<cin>>x;
if(x==PassWord)
{Disp();returnOK;}
else{cout<<"密码错误,请返回重试"<}
voidDisp()
{
cout<cout<cout<}
voidWrite_inFile()
{
ofstreamoutput("储户信息.bat",ios:
:
app|ios:
:
out);
output<}
voidDestroy()
{
A_Num=0;
A_Name="";
A_Overmoney=0;
PassWord=0;
}
};
Depositorp[2000];//存储用户数上限;
voidNewAcount_Num();
voidsearch_Num();
voidChangeMoney_Num();
voidDeleteAcount_Num();
voidmain()
{
loop1:
cout<<"本行账号从50000开始。
"<cout<<"请选择要进行的操作"<cout<cout<cout<cout<cout<cout<cout<cout<cout<intchoice;
cin>>choice;
for(intm=0;m<10;m++)
printf("\a");
switch(choice)
{
case1:
NewAcount_Num();break;
case2:
search_Num();break;
case3:
ChangeMoney_Num();break;
case4:
DeleteAcount_Num();break;
case5:
exit(0);
default:
{gotoloop1;system("cls");};
}
system("pause");
system("cls");
gotoloop1;
system("pause");
}
voidsearch_Num()
{
longintno;
cout<<"输入您要查询的账号"<cin>>no;
longintk=no-50000;
if(k>=0)
{
p[k].CheckPa