软件工程实验报告.docx

上传人:b****5 文档编号:7818551 上传时间:2023-01-26 格式:DOCX 页数:40 大小:666.35KB
下载 相关 举报
软件工程实验报告.docx_第1页
第1页 / 共40页
软件工程实验报告.docx_第2页
第2页 / 共40页
软件工程实验报告.docx_第3页
第3页 / 共40页
软件工程实验报告.docx_第4页
第4页 / 共40页
软件工程实验报告.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

软件工程实验报告.docx

《软件工程实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程实验报告.docx(40页珍藏版)》请在冰豆网上搜索。

软件工程实验报告.docx

软件工程实验报告

池州学院

软件工程课程设计报告

(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(length

len=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+len

fclose(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1