软件工程实验报告.docx
《软件工程实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程实验报告.docx(40页珍藏版)》请在冰豆网上搜索。
![软件工程实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/1a8feab0-972e-470f-b4e3-c3db82f58e97/1a8feab0-972e-470f-b4e3-c3db82f58e971.gif)
软件工程实验报告
池州学院
软件工程课程设计报告
(2011—2012学年第二学期)
课程名称:
软件工程课程设计
题目:
院系:
专业:
班级:
组号:
组员姓名:
指导老师:
日期:
年月日
一、课程设计的目的与要求
通过软件开发的时间训练,进一步掌握软件工程的方法与技术,提高软件开发的能力,培养工程设计能力和综合分析、解决问题的能力。
具体如下:
1.学习是实践在分析和设计计算机应用系统的知识,包括面向对象的系统分析与设计,编码和测试方面的知识。
2.熟悉自动化的软件开发工具RationalRose2003、Visio2002ProCN,并将其用于软件开发的全过程。
3.熟悉和了解软件开发的整体过程和每个过程工程文档的编辑,对软件工程有一个整体的认识,有助于以后的课程学习。
4.通过小组合作,培养团队协作能力和团队精神。
二、设计正文
1.概述
1.1课程题目:
银行储蓄管理系统
1.2系统的主要目标:
本系统的目标是为了方便储户,实现银行储蓄管理系统的基本功能,包括新增用户、存款、取款、查询、销户等基本功能。
1.3系统的开发环境及运行环境:
操作系统:
WindowsXP
建模工具:
RationalRose2003
开发工具:
VisualC++6.0
2.系统需求分析
系统中要求每个人银行管理者都有一个系统帐号,并每个帐号都有密码,系统的一切操作(如:
增加存储用户)都由管理者执行,而不是由存诸用户执行,也主是说存储用户并不直接与系统交互,而是通过管理员与系统交互。
该系统主要有两部份业务功能,存款与取款。
储户填写的存款单或取款单由业务员输入系统,如果是存款则系统记录存款人姓名,住址,身份证号码,,存款日期,密码(可选)等信息,并打印存单给储户;如果是取款而且存款时留有密码,则系统首先核对储户密码,若密码正确或存款时未留密码,则系统计算得利息并打印出利息清单给储户。
2.1用例图
图2.1银行储蓄管理系统用例图
用例图说明:
2.系统的外部角色有:
储户和管理员
3.系统主要用例的文档描述:
(1)储户管理用例:
储户可见的功能包括存款、取款、查询三个用例功能。
(2)信息管理用例:
业务员可见的功能包括用户管理、开户、和销户。
3.系统用例之间的关系:
(1):
储户用例和业务员用例是交互关系。
(2):
业务员用例和用户管理用例之间是交互关系。
(3):
储户管理用例和存款、取款、查询用例之间是包含关系。
(4):
信息管理用例和用户管理、开户、销户用例之间是包含关系。
4.系统关键用例的正常事件流图和异常事件流图
银行储蓄系统顶层数据流图
开户数据流图
存款数据流图
取款数据流图
:
2.2.顺序图
2.2.1登录顺序图
2.2.2注册新用户
2.2.3取款顺序图
2.2.4存款顺序图
2.2.5销户顺序图
2.2.6查询顺序图
3系统总体设计
银行储蓄管理系统是实现用户查询、取款、存款,业务员实现开户、销户及日常信息维护的一个平台,整个系统共三个部分,分为三个模块:
储户模块,业务员模块,公有模块,分别用于完成各自的功能。
以下为银行储蓄管理系统总设计图和各个模块的功能说明:
3.1子系统设计
(1)总体设计图
银行储蓄管理系统总体设计图
(2)各个模块的功能
储户模块:
实现对自己的账户进行查询、取款、存款的功能。
业务员模块:
实现开户、销户以及对储户信息的管理。
公有模块:
实现业务员的身份验证和退出系统等。
3.2设计人机交互系统
人机交互系统结构图
4详细设计
4.1业务员登陆流程图
业务员和储户登录流程图
4.2储户存取款流程图
储户存\取款流程图
4.3新增用户流程图
4.4储户注销流程图
4.5查询流程图
5系统实现
本系统采用三层构架来实现,即分为用户界面层(UI),业务逻辑层(BLL)和数据访问层(DAL),用户界面层是展示给用户的界面,方便用户与系统进行交互,业务逻辑层是对系统业务实体的封装,完成业务功能,数据访问层直接与数据库打交道,为业务逻辑层提供数据支持;
5.1业务员登录
说明:
需要对业务员账号和密码进行核实,才可进入此系统;在此系统中为了保证系统的安全性,我们采用系统内置的业务员账号和密码(账号:
admin密码:
123456);
以下是对业务员账号密码进行验证的代码:
voidCAdimin:
:
Check()
{
//TODO:
Addextravalidationhere
CDialog2dlg;
CStrings;
charstr1[20],str2[10]="admin",code1[15],code2[10]="123456";
m_name.GetWindowText(s);
strcpy(str1,s);
m_code.GetWindowText(s);
strcpy(code1,s);
if(!
strcmp(str1,str2)&&!
strcmp(code1,code2))
{
CDialog:
:
OnOK();
dlg.DoModal();
}
else
AfxMessageBox("用户名或密码错误!
");
}
5.2开户:
说明:
业务员登录成功后,即可进入客户管理界面里面包含有开户功能(初次登录都需要此操作,否则无法进行下去);在开户的界面里会需要用户填写真实信息它包括:
姓名,出生日期,性别,身份证号,家庭住址,以及登录密码;
注册成功后会将用户信息存储到user_information里!
并为用户自动生成一个用户账号。
代码如下:
voidCAdmin:
:
User_add()
{
user*p;
CStrings;
FILE*fp,*fp1;
intflag=0;
//intlength;
charq[20],num[20];
p=new(user);
p=user_init(p);
m_name.GetWindowText(s);
strcpy(p->name,s);
if(strlen(s)==0)
flag=1;
while((fp=fopen("user_information","r"))==NULL)
{
fp=fopen("user_information","w");
fclose(fp);
}
fseek(fp,0,SEEK_END);
if(!
ftell(fp))
strcpy(num,"6222021316000000000");
else
{
fseek(fp,-122L,SEEK_END);//定位到文件结尾前的第122字节,fp存放此处地址
fread(q,1,19L,fp);//从fp存放的地址往后读取19字节
q[19]='\0';
strcpy(num,q);
}
fclose(fp);
strcpy(p->number,getnum(num));
m_bir.GetWindowText(s);
strcpy(p->birthday,s);
if(strlen(s)==0)
flag=1;
m_sex.GetWindowText(s);
strcpy(p->sex,s);
if(strlen(s)==0)
flag=1;
m_id.GetWindowText(s);
strcpy(p->id,s);
if(strlen(s)==0)
flag=1;
m_addr.GetWindowText(s);
strcpy(p->addr,s);
if(strlen(s)==0)
flag=1;
m_code.GetWindowText(s);
strcpy(p->code,s);
if(strlen(s)==0)
flag=1;
if(flag==0)
{
if((fp=fopen("user_information","r"))!
=NULL)
{inti=0,flag1=0,len;
longmaxl,length;
charc1[20],c2[135];
fseek(fp,0,SEEK_END);
maxl=ftell(fp);//获取文件长度
len=sizeof(user);
if(maxl<1)
{
fclose(fp);
fp=fopen("user_information","w");
fwrite(p,len,1,fp);
fclose(fp);
}
else
{
fp1=fopen("temp","w");
fclose(fp1);
fp1=fopen("temp","a");
do
{
length=17+len*i;
fseek(fp,length,SEEK_SET);
fread(c1,19,1,fp);
c1[19]='\0';//获得记录中的账号
if(strcmp(p->number,c1)>0||(flag1&&strcmp(p->number,c1)<0))
{
fseek(fp,length-17,SEEK_SET);
fread(c2,len,1,fp);
fwrite(c2,len,1,fp1);
}
else
{
fwrite(p,len,1,fp1);
fseek(fp,length-17,SEEK_SET);
fread(c2,len,1,fp);
fwrite(c2,len,1,fp1);
flag1=1;//说明已知的条目已经插入记录中了
}
i++;
}while((length+len)if(flag1==0)
fwrite(p,len,1,fp1);
fclose(fp);
fclose(fp1);
remove("user_information");
rename("temp","user_information");
}
s.Format("恭喜新建成功,%s的卡号是%s",p->name,num);
AfxMessageBox(s);
deletep;
CDialog:
:
OnOK();
}
else
{
AfxMessageBox("新建失败!
");
fclose(fp);
}
}
else
AfxMessageBox("请认真填写信息!
");
}
运行效果:
填写用户信息:
自动分配账号:
注:
本系统自带账号回功能可回收之前注销的账号继续使用,节约账号资源
5.3用户登录:
说明:
客户如果需要进行存款,取款和查询操作,首先需要登录:
该功能是为了保证储户安全而设置的,核实正确后,方可进行个人操作。
代码如下:
voidCAdmin:
:
Check_user()
{
inti=0,length=0,maxl=0,len=0;
charb1[20],b2[7],c1[20],c2[7],name[17];
CStrings;
FILE*fp;
m_number.GetWindowText(s);
strcpy(b1,s);
m_code.GetWindowText(s);
strcpy(b2,s);
while((fp=fopen("user_information","r"))==NULL)
{
fp=fopen("user_information","w");
fclose(fp);
}
fseek(fp,0,SEEK_END);
maxl=ftell(fp);//获取文件长度
do////////////////核实用户
{
length=17+sizeof(user)*i;
len=length;
fseek(fp,length,SEEK_SET);
fread(c1,19,1,fp);
c1[19]='\0';//获得记录中的账号
if(!
strcmp(b1,c1))
{
length=96;
fseek(fp,length,SEEK_CUR);
fread(c2,6,1,fp);
c2[6]='\0';//获得记录中的密码
if(!
strcmp(b2,c2))
break;
else
length=maxl;
AfxMessageBox("密码错误!
");
}
i++;
}while(lengthlen=len-17;
fseek(fp,len,SEEK_SET);
fread(name,16,1,fp);
name[16]='\0';//保存当前用户的名字
fclose(fp);
if(length>maxl)
AfxMessageBox("账号错误!
");
if(length{
CDialog5lag;
strcpy(lag.name,name);
strcpy(lag.number,b1);
CDialog:
:
OnOK();
lag.DoModal();
}
}
运行效果图:
登录成功会进入:
若我们输入错误的用户名,密码会提示:
5.4存款操作
说明:
用户登录成功后,即可进行存款操作,由客户填写存款单并有业务员键入;存款成功款项写入user_all内,并打印存款单给用户。
代码如下:
voidCUser:
:
Money_save()
{
CStrings;
charn[90]={"\0"},p[15],q[20];
inti,flag=0,m,len;
longmaxl,length;
doublebalance=0;
FILE*fp;
l=new(list);
f=new(list);
list_init(l);//防乱码,初始化!
list_init_0(f);
m_sum.GetWindowText(s);
strcpy(n,s);
for(i=0;n[i]!
='\0';i++)
if((n[i]<'0'&&n[i]!
='.')||n[i]>'9')
{
flag=1;
break;
}
if(i==0&&n[i]=='\0')
{
flag=-1;
}
elseif(flag!
=1)
flag=0;
if(!
flag)
{
strcpy(l->sum,n);
strcpy(f->sum,n);
m=strlen(l->sum);
l->sum[m]='';
}
OnEditchangeCombo2();
strcpy(l->number,number);
strcpy(f->number,number);
l->number[19]='';
strcpy(l->ioway,"存");
strcpy(f->ioway,"存");
l->ioway[2]='';
m_date.GetWindowText(s);
strcpy(l->date,s);
strcpy(f->date,s);
m=strlen(l->date);
l->date[m]='';
if(!
flag)//输入的金额合法
{
while((fp=fopen("user_all","r"))==NULL)//获取当前账号账户余额
{
fp=fopen("user_all","w");
fclose(fp);
}
memset(p,0,15);
i=0;
fseek(fp,0,SEEK_END);
maxl=ftell(fp);//获取文件长度
len=sizeof(list);//一条记录的长度
do
{
length=len*i;
fseek(fp,length,SEEK_SET);
fread(q,20,1,fp);
q[19]='\0';//获得记录中的账号
if(!
strcmp(number,q))
{
fseek(fp,length+63,SEEK_SET);
fread(p,15,1,fp);
}
i++;
}
while(length+lenfclose(fp);
balance=convert_char_to_double(p)+input_sum;//得到新的余额
s.Format("%f",balance);
strcpy(l->balance,s);
len=strlen(l->balance);
l->balance[len]='';
fp=fopen("user_all","a");
fwrite(l,sizeof(list),1,fp);
fclose(fp);
fp=fopen("存款单.txt","w");
fprintf(fp," ---------存款单-----------------\r\n");
fprintf(fp,"|存款人:
|%-20s| \r\n",name);
fprintf(fp," --------------------------------\r\n");
fprintf(fp,"|账号:
|%-20s| \r\n",f->number);
fprintf(fp," --------------------------------\r\n");
fprintf(fp,"|存款金额:
|%-20s| \r\n",f->sum);
fprintf(fp," --------------------------------\r\n");
fprintf(fp,"|存款种类:
|%-20s| \r\n",f->kind);
fprintf(fp," --------------------------------\r\n");
fprintf(fp,"|存款日期:
|%-20s| \r\n",f->date);
fprintf(fp," --------------------------------\r\n");
fclose(fp);
deletel;
CDialog:
:
OnOK();
}
elseif(flag==1)
AfxMessageBox("请输入合法金额数!
");
else
AfxMessageBox("请输入金额!
!
");
}
运行效果:
存款单:
5.5取款操作:
说明:
取款是在尚有余额的情况下并且取款金额不能大于当前账户的余额,否则报错;主要代码如下:
voidCUser:
:
Money_get()
{
CStrings;
charn[90]={"\0"},p[15],q[20];
inti,flag=0,m,len;
longmaxl,length;
doublebalance=0;
FILE*fp;
l1=new(list);
f1=new(list);
list_init(l1);//防乱码,初始化!
list_init_0(f1);
m_sum.GetWindowText(s);
strcpy(n,s);
for(i=0;n[i]!
='\0';i++)
if((n[i]<'0'&&n[i]!
='.')||n[i]>'9')
{
flag=1;
break;
}
if(i==0&&n[i]=='\0')
{
flag=-1;
}
elseif(flag!
=1)
flag=0;
if(!
flag)
{
strcpy(l1->sum,n);
strcpy(f1->sum,n);
m=strlen(l1->sum);
l1->sum[m]='';
}
OnEditchangeCombo2();
strcpy(l1->number,number);
strcpy(f1->number,number);
l1->number[19]='';
strcpy(l1->ioway,"取");
strcpy(f1->ioway,"取");
l1->ioway[2]='';
m_date.GetWindowText(s);
strcpy(l1->date,s);
strcpy(f1->date,s);
m=strlen(l1->date);
l1->date[m]='';
if(!
flag)
{
while((fp=fopen("user_all","r"))==NULL)//获取当前账号账户余额
{
fp=fopen("user_all","w");
fclose(fp);
}
memset(p,0,15);
i=0;
fseek(fp,0,SEEK_END);
maxl=ftell(fp);//获取文件长度
len=sizeof(list);//一条记录的长度
do
{
length=len*i;
fseek(fp,length,SEEK_SET);
fread(q,20,1,fp);
q[19]='\0';//获得记录中的账号
if(!
strcmp(number,q))
{
fs