例:有一个大学图书管理系统,该系统除了一般的图书管理功能外,还能够为学生和教工从其他图书馆借阅图书和文献资料提供服务。
因此系统应该具备以下功能:
⑴ 基本数据维护功能
⑵ 基本业务功能
⑶ 数据库管理功能
⑷ 信息查询功能
---- 功能需求
⑴基本数据维护功能
提供使用者录入、修改并维护基本数据的途径。基本数据包括读者的信息、图书资料的相关信息,可以对这些信息进行修改,更新。
⑵基本业务功能
读者借、还书籍的登记管理功能,随时根据读者借、还书籍的情况更新数据库系统,如果书籍已经借出,可以进行预留操作以及书籍的编目、入库、更新等操作。
⑶数据库管理功能
对所有图书信息及读者信息进行统一管理维护的功能,对书籍的借还也要进行详细的登记,以便协调整个图书馆的运作。
⑷信息查询功能
提供对各类信息的查询功能,如对本图书馆的用户借书信息、还书的信息、书籍源信息、预留信息等进行查询,对其他图书馆的书籍、资料源信息的查询功能。
----非功能需求
① 系统安全性需求:为保证系统安全性,对本图书馆的各项功能进行分级、分权限操作,对各类用户进行确认。对其他图书馆借阅图书和文献资料服务控制访问范围:如限IP、限用户等。
② 对系统可用性的需求:为了方便使用者,要求对所有交互操作提供在线帮助功能。
③ 对系统查询速度的需求:要求系统在20 s之内响应查询服务请求。
④ 对系统可靠性的需求:要求系统失败发生率小于1%。
----- 领域需求
例如:对“大学图书管理系统”,提出一些与图书管理的业务相关的需求:
⑴ 图书编目要求按照《中国图书馆分类法》进行;
⑵ 由于版权,某些文献资料只能在图书馆规定的阅览室阅读,并复制和打印。
第一条需求是遵循我国图书管理的规定,执行对图书的分类管理的标准。而第二条需求则是版权法对图书馆文献资料的保护的需要,描述了对一类文献资料有的使用和服务。
3.2 软件需求分析方法
酒店管理系统
按照功能分解为以下子系统:
1.客房预定系统 2.前台接待系统 3.前台收银系统 4.账务系统
5.管家系统 6.电话系统 7.客房系统 8.合约系统
9.经理系统 10.总经理系统11.密码管理系统 12.报表系统
13.账务报表
例:盘存/销售系统,用户提出系统应有以下功能:
① 计算买主订单 ② 准备销售报表
③ 建立买主文件和应收账 ④ 运行更新的盘存文件
⑤ 产生托运单和包装单 ⑥ 保证库存及时订货
1、 结构化分析方法
是一种以数据、数据的封闭性为基础,从问题空
间到某种表示的映射方法,由数据流图(DFD图)表示。
结构化分析方法—图书预订系统
例:学生成绩管理系统
在该系统中,教务人员录入学生信息、课程信息和成绩信息,学生可以随时查询自己所选课程的成绩。由于学生成绩属于敏感信息,系统必须提供必要的安全措施以防非法存取。
第1层
第2层
需求案例分析
案例一 医院病房监护系统
(采用结构化分析方法)
案例二 网上竞拍系统
(采用基于用例的方法)
案 例 一 医院病房监护系统
一、问题的描述
在医院ICU病房里,将病症监视器安置在每个病床,对病人进行监护。监视器将病人的组合病症信号实时地传送到监护系统进行分析处理。
在中心值班室里,值班护士使用监护系统对病人的情况进行监控,监护系统实时地将病人的病症信号与标准的病诊信号进行比较分析,当病症出现异常时,系统会立即自动报警,并打印病情报告和更新病历。
根据医生的要求随时打印病人的病情报告,系统还定期自动更新病历。
经过初步的需求分析,得到系统功能要求:
1. 监视病人的病症(血压、体温、脉搏等)。
2. 定时更新病历。
3. 病情出现异常情况时报警。
4. 随机地产生某一病人的病情报告。
二、系统功能需求
1. 监视病员的病症
♦ 采集病症信号(血压、体温、脉搏等)。
♦ 组合病症信号。
♦ 将模拟病症信号转换为数字信号(A/D转换)。
2. 定时更新病历
♦ 将病症信号进行格式化并加入更新日期、时间。
♦ 更新病历库中病人的信息。
♦ 可人工设定更新病历的时间间隔。
二、系统功能需求
3. 病情出现异常情况时报警
♦ 根据标准病症信号库中的值,判断是否报警。
♦ 将报警信号转换为各种模拟信号(D/A转换)。
♦ 实时打印病情报告,立即更新病历。
4. 随机地产生某一病员的病情报告
非功能需求
1. 监视器与网络的可靠性要求,涉及人的生命安全。
2. 效率需求中对时间、空间的需求,所采集的病症信号数据量大。
3. 互操作需求--如要求监视器采样频率可人工调整等。
4. 对病人病历的隐私的要求。
医院病房监护系统分层DFD图
顶层确定了系统的范围,其外部实体为病人和护士。
伪代码
S1;
if (x>5) then S2
else S3;
while (y<0) S4;
S5;
if u>0 then
{
S6;
while (k>5) S7;
}
S8;
顺序结构对应的伪码,其中‘seq’和‘end’是关键字:
A seq
do B;
do C;
do D;
A end
选择结构对应的伪码,其中‘select’、‘or’ 、‘do’和‘end’是关键字,cond1、cond2和cond3分别是执行B、C或D的条件:
A select
cond1 do B;
or cond2 do C;
or cond3 do D;
A end
重复结构对应的伪码,其中‘iter’、‘until’、‘while’和‘end’是关键字(重复结构有until和while两种形式),cond是条件:
A iter until(或while)cond
do B;
A end
程序1
if ( A < B ) goto 120;
if ( B < C ) goto 110;
100 write ( C );
goto 140;
110 write ( B );
goto 140;
120 if ( A < C ) goto 130;
goto 100;
130 write ( A );
140 end
程序2
if ( A < B ) and ( A < C ) then
write ( A )
else
if ( A B ) and ( B < C ) then
write ( B )
else
write ( C )
endif
endif
程序1
f0 = f (a); f1 = f (b);
if ( f0 * f1 <= 0 ) {
x0 = a; x1 = b;
for ( i = 1;i <= n;i++ ){
xm = ( x0+x1 ) / 2; fm = f (xm);
if ( abs (fm) < eps || abs (x1-x0) < eps)
goto finish;
if ( f0 * fm > 0 ) { x0 = xm; f0 = fm;}
else x1 = xm;
}
finish:printf ();
}
程序2
f0 = f (a); f1 = f (b);
if ( f0 * f1 <= 0 ) {
x0 = a; x1 = b;
for ( i = 1;i <= n;i++ ){
xm = ( x0+x1 ) / 2; fm = f (xm);
if ( abs (fm) < eps || abs (x1-x0) < eps)
break;
if ( f0 * fm > 0 ) { x0 = xm; f0 = fm;}
else x1 = xm;
}
printf ();
}
例:二分法求方程 f (x)=0 在区间[a,b]中的根
程序3
f0 = f (a); f1 = f (b);
if ( f0 * f1 <= 0 ) {
x0 = a; x1 = b;i == 1;finished = 0;
while ( i <= n && 0 == finished){
xm = ( x0+x1 ) / 2; fm = f (xm);
if ( abs (fm) < eps || abs (x1-x0) < eps)
finished = 1;
if ( 0 == finished) {
if ( f0 * fm > 0 ) { x0 = xm; f0 = fm;}
else x1 = xm;
}
}
printf ();
}
main ( ) { //程序框架
建立2到100的数组A[ ],其中A[i]=i;
-----------------------------------1
建立2到10的素数表 B[ ],其中存放2
到10以内的素数;-----------2
若A[i]=i是B[ ]中任一数的倍数,则
剔除A[i];---------------------3
输出A[ ]中所有没有被剔除的数;
-----------------------------------4
}
main ( ) {
/*建立2到100的数组A[ ],其中A[i]=i*/
for ( i = 2;i <= 100;i++ ) A[i] = i;
/* 建立2到10的素数表B[ ],其中存放2到
10以内的素数*/
B[1]= 2;B[2]= 3;B[3]= 5;B[4]= 7;
/*若A[i]=i是B[ ]中任一数的倍数,则剔
除A[i]*/
for ( j = 1;j <= 4;j++ )
检查A[ ]所有的数能否被B[j]整除并将
能被整除的数从A[ ]中剔除; -----3.1
/*输出A[ ]中所有没有被剔除的数*/
for ( i = 2;i <= 100;i++ )
若A[i]没有被剔除,则输出之 ---4.1
}
对框架中的局部再做细化,得到整个程序。
for ( i = 2;i <= 100;i++)
if ( A[i]/B[j] * B[j] == A[i] )
A[i] = 0;
/*输出A[ ]中所有没有被剔除的数*/
for ( i = 2; i <= 100;i++)
/*若A[i]没有被剔除,则输出之*/
if ( A[i] != 0 )
printf ( “A[%d]=%d\\n”, I, A[i] );
}
例:打印A、B、C中的最小值
程序1
if ( A < B ) goto 120;
if ( B < C ) goto 110;
100 write ( C );goto 140;
110 write ( B );goto 140;
120 if ( A < C ) goto 130;
goto 100;
130 write ( A );
140 end
由于“正式成绩清单”中缺少“考生通知单”中的姓名、通信地址等数据,这些数据也无法由加工2.3自己产生,因此,加工2.3不满足数据守恒的条件
“统计成绩”第二级分解的结构图