问答题【说明】某考务处理系统主要功能是考生管理和成绩管理:1.对考生送来的报名表进行检查。2.对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3.对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4.填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5.根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图1所示,第0层图如图2所示,加工2子图如图3所示。【数据流图】
问答题[说明]某市人才交流中心为促进当地人力资源的合理配置,加强当地企业与人才的沟通,拟建立人才信息交流网。[需求分析结果]1.每个前来登记的个人需填写《人才入库登记表》,如表2-17所示,并出示相关证件,经工作人员审核后录入个人信息。表2-17人才入库登记表个人编号:_______ 登记日期:___年___月___日姓名性别出生日期照片籍贯身份证号毕业院校专业学历证书名称1.编号2.移动电话家庭电话电子邮件求职意向及薪水职位名称最低薪水备注1.2.个人简历及特长 2.每个前来登记的企业需填写《企业信息登记表》,如表2-18所示,并出示相关证明及复印件,经工作人员核实后录入企业信息。 3.个人和企业的基本信息只需在第一次登记时填写,个人编号和企业编号由系统自动生成。个人和企业的基本信息由计算机长期存储,以后个人只需提供个人编号和求职意向信息,企业只需提供企业编号和岗位需求信息。 4.个人的求职意向信息和企业的岗位需求信息在两个工作日内由工作人员录入数据库并发布。 [概念模型设计] 根据需求阶段收集的信息,设计人才、岗位和企业的实体联系图如图2-24所示(不完整)。 表2-18企业信息登记表企业编号:_______ 登记日期:__年__月__日企业名称地址企业网址联系人联系电话电子邮件岗位需求职位专业学历薪水备注企业简介 [逻辑结构设计]1.将概念模型设计的实体联系图转换为以下关系模式人才(个人编号,姓名,性别,出生日期,身份证号,毕业院校,专业,学历,证书名称,证书编号,联系电话,电子邮件,个人简历及特长)企业(企业编号,企业名称,联系人,联系电话,地址,企业网址,电子邮件,企业简介)求职意向((2))岗位需求((3))2.由于一个人可能持有多个证书,因此对“人才”关系模式进行优化,得到如下两个新的关系模式人才((4))证书((5))根据上述的设计过程,回答以下问题。
问答题【说明】
所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。
应用贪婪法求解该问题。程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择边组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。
函数中使用的预定义符号如下:
#define M 100
typedef struct{/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/
float x;
int p1, p2;
}tdr;
typedef struct{/*p1、p2为和端点相联系的两个端点,n为端点的度*/
int n, P1, p2;
}tr;
typedef struct{/*给出两点坐标*/
float x,y;
}tpd;
typedef int tl[M];
int n=10;
【函数】
float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/
void sortArr(tdr a[M], int m);
/*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/
int isCircuit(tr[M], int i, int j);
/*判断边(i, j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/
void selected(tr r[M], int i, int j);/*边(i,j)选入端点关系表r*/
void course(tr r[M], tl 1[M]);/*从端点关系表r中得出回路轨迹表*/
void exchange(tdr a[M], int m, int b);
/*调整表排序表,b表示是否可调,即是否有边长度相同的边存在*/
void travling(tpd pd[M], int n, float dist, t1 locus[M])
/*dist记录总路程*/
{
tdr dr[M];/*距离关系表*/
tr r[M];;/*端点关系表*/
int i, j, k, h, m;/*h表示选入端点关系表中的边数*/
int b;/*标识是否有长度相等的边*/
k=0;
/*计算距离关系表中各边的长度*/
for(i=1;i<n;i++){
for(j=i+1;j<=n;j++){
k++;
dr[k].x={{U}} (1) {{/U}};
dr[k].p1=i;
dr[k].p2=j;
}
}
m=k;
sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/
do{
b=1;
dist=0;
k=h=0;
do{
k++;
i=dr[k].p1;
j=dr[k].p2;
if((r[i].n<=1)
h++;
dist+=dr[k].x;
}else if({{U}} (4) {{/U}}){
/*最后一边选入r成回路,则该边必须加入且得到解*/
selected(r,i,j);
h++;
dist+=dr[k].x;
}
}
}while((k!=n)
if(h==n){/*最后一边选入构成回路,完成输出结果*/
course(r,locus);
}else{/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/
{{U}} (5) {{/U}};
}
}while(!b);
}
问答题[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当系统中的文件内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。
[C程序]
#include<stdio.h>
#define OBS_MAXNUM 20/*一个OfficeDoc变量最多能够关联的DocExplorer结构变量的个数*/
typedef void(______)(struct OfficeDoc*, struct DocExplorer*);
struct DocExplorer {
func update; /*DocExplorer结构采用的更新函数*/
/*其他的结构字段省略*/
};
Struct OfficeDoc {
______ myObs[OBS_MAXNUM];
/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/
int index; /*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/
};
Void attach (struct OfficeDoc *doc, struct DocExplorer *ob) {
/*关联Obersver结构ob与OfficeDoc结构doc*/
int loop = 0;
if (doc→index >=OBS_MAXNUM |] ob == NULL) return;
for (loop=0; loop<doc→index; loop++)
if (doc→myObs [loop] == ob) return;
doc→myObs [doc→index] = ob;
doc→index++;
}
void detach (struct OfficeDoc *doc, struct DocExplorer *b) {
/*解除doc结构与ob结构间的关系*/
int loop;
if (ob == NULL) return;
for (loop = 0; loop < doc→ index; loop++) {
if (doc→myObs [loop] == ob) {
if (loop <=doc→index-2)
doc→myObs [loop] = doc→myObs [______];
doc→myObs[doc→index-1] = NULL;
doc—÷index-一j
break;
}
}
}
void update1 (struct OfficeDoc *doc, struct DocExplorer *ob) {
/*更新ob结构的值,更新代码省略*/
}
void update2 (struct OfficeDoc *doc, struct DocExplorer *ob) {
/*更新ob结构的值,更新代码省略*/
}
void notifyObs (struct OfficeDoc *doc) {
/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/
int loop;
for (loop = 0; loop <doc→index; loop++) {
(doc→myObs [loop])→update(______);
}
}
void main() {
struct OfficeDoc doc; /*定义一个OfficeDoc变量*/
struct DocExplorer explorer1, explorer2; /*定义两个DocExplorer变量*/
/*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/
doc. index=0;
explorer1. update = update1; /*设置explorer1 变量的更新函数*/
explorer2. update = update2; /*设置explorer2 变量的更新函数*/
attach ( /*关联explorer1与doc对象*/
attach ( /*关联explorer2与doc对象*/
/*其他代码省略*/
______; /*通知与OfficeDoc相关的所有DocExploer变量*/
return;
}
问答题 阅读以下说明和流程图,回答问题1和问题2,将解答写在对应栏内。
【说明】
存在某鲜花批发系统,系统中处理的信息单元有鲜花和客户,对鲜花使用编号进行唯一标识,鲜花的具体信息包括:名称、颜色、等级。客户包括鲜花种植商,鲜花经销商,客户不使用编号,只需要名称和地址。系统功能如下所述。
(1)当系统统计销存清单时发现某种鲜花当前库存数量少于指定最低库存量时,向鲜花种植商发出采购单,订单中要记录所需鲜花的信息、数量、供应商名称和地址。
(2)收到鲜花种植商的鲜花后,向系统录入归档送货单,要记录交易对应的采购单和实际金额。
(3)当某种鲜花库存数量大于或等于订购数量时,接受鲜花经销商的订货单,并更新销存清单,系统要求订单中标明鲜花的信息和经销商的信息。
(4)鲜花经销商订购的鲜花到达批发环节后,系统生成提货单,包括鲜花信息和经销商信息,然后将提货单发给经销商,等待提货。
(5)系统还要随时可以接受管理人员对于销售和库存的查询,并生成销售与库存情况表,提供给管理人员,包括鲜花信息、本周销售数量、库存数量。
现在假定顶层图是正确的,客户信息文件已经存在并可使用。
问答题【说明】软件设计师东方飞龙利用UML设计了一个迷你小型复数类,其类图如图13-11所示。【代码13-l】/*___________________________________*//*********文件MiniComplex.h*********//*___________________________________*/#include<iostream>usingnamespacestd;classMiniComplex(1)://重载流插入和提取运算符(2)ostreamisObject>>complex.realPart>>ch>>complex.imagPart>>ch;returnisObject;MiniComplex(doublereal=0,doubleimag=0);//构造函数MiniComplexoperator+(constMiniComplex/*_______________________________________________________*//*********文件MiniComplex.cpp**********//*_______________________________________________________*/#include"MiniComplex.h"boolMiniComplex::operator==(constMiniComplexMiniComplex::MiniComplex(doublereal,doubleimag)realPart=real;imagPart=imag!MiniComplexMiniComplex::operator+(constMiniComplextemp.realPart=realPart+otherComplex.realPart;temp.imagPart=imagPart+otherComplex.imagPart;returntemp;MiniComplexMiniComplex::operator--(constMiniComplextemp.realPart=realPart-otherComplex.realPart;temp.imagPart=imagPart-otherCompler.imagPart;returntemp;MiniComplexMiniComplex::operator*(constMiniComplextempimagPart=(realPart*otherComplex.imagPart)+(imag-Part*otherComplex.realPart);returntemp,MiniComplexMiniComplex::operator/(constMiniComplexfloattt;tt=1/(otherComplex.realPart*otherComplex.realPart+otherComplex.imagPart*otherComplex.imagPart);temp.realPart=((realPart*otherComplex.realPart)+(imagPart*otherComplex.imagPart))*tt;temp.imagPart=((imagPart*otherComplex.realPart)-(realPart*otherComplex.imagPart))*tt;returntemp;/*__________________________________________________*//********主函数所在文件main.cpp********//*_________________________________________________*/#include<iostream>#include"(5)"usingnamespacestd;intmain(void)MiniComplexnum1(23,34),num2;cin>>num2;cout<<"InitialValueofNuml="<<num1<<"/nInitialValueofNum2="<<num2<<end1;cout<<num1<<"+"<<num2<<"="<<num1+num2<<end1;//使用重载的加号运算符cout<<num1<<"-"<<num2<<"="<<num1-num2<<end1;//使用重载的减号运算符cout<<num1<<"*"<<num2<<"-"<<num1*num2<<end1;//使用重载的乘号运算符cout<<num1<<"/"<<num2<<"="<<num1/num2<<end1;//使用重载的除号运算符return0;
问答题阅读下列说明和数据流图,回答问题1至问题3,将解答填入对应栏内。[说明]某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。[图1-1][图1-2][图1-3][数据字典](1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:配件号+配件名+规格+数量+允许的最低库存量
问答题[问题2]
该图书管理系统的主要关系模式如下,请补充“借还记录”和“预约登记”关系中的空缺。
管理员(工号,姓名)
读者(读者ID,姓名,电话,E-mail)
书目(ISBN号,书名,作者,出版商,出版年月,册数,经办人)
图书(图书ID,ISBN号,存放位置,状态,经办人)
借还记录( {{U}} (a) {{/U}},借出时间,应还时间,归还时间)
预约登记( {{U}}(b) {{/U}},预约时间,预约期限,图书ID)
注:时间格式为“年.月.日 时:分:秒”。
问答题【程序说明】
该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。
【程序】
#include<stdio.h>
void strmerge(char,a,char *b,char *c) //将字符串a,b合并到字符串c中
{
char t,*w;
w=c;
while({{U}} (1) {{/U}})
{//找到字符串a,b当前字符中较小的字符
if(*a< *b)
{
t= *a;
{{U}} (2) {{/U}};
{
else if (*a>*b)
{
t= *b;
{{U}} (3) {{/U}};
}
else //字符串a,b当前字符相等
{
t= *a;
a++;
b++;
}
if({{U}} (4) {{/U}}) //开始,可直接赋值
*w=t;
else if(t!=*w)
//如果a,b中较小的当前字符与c中当前字符不相等,才赋值{{U}} (5) {{/U}};
}
if(*a!=/'/0') //如果字符串a还没有结束,则将a的剩余部分赋给C
while(*a!='/0')
if(*a!=*w)
{
*(++w)=*a;
a++;
}
else
{{U}} (6) {{/U}};
if(*6!='/0') //如果字符串b还没有结束,则将b的剩余部分赋给c
while(*b!='/0')
if(*b! = *w)
{
*(++w)=*b;
b++;
}
else
b++;
{{U}} (7) {{/U}};
}
void strsort(char*s) //将字符串S中的字符排序
{
int i,j,n;
char t,*w;
W=S;
for(n=0;*w!='/0';n++) //得到字符串长度n
w++;
for(i=0;i<n-1;i++) //对字符串s进行排序,按字母先后顺序
for(j=i+1;j<n;j++)
if({{U}} (8) {{/U}})
{
t=s[i];
s[i]=s[j];
{{U}} (9) {{/U}};
}
}
void main()
{
char s1[100],s2[100],s3[100];
printf("/nPlease,input the first string:");
scanf("%s",s1);
printf("/nPlease input the second string:");
scanf("%s",s2);
strsort(s1); //将字符串s1排序
strsort(s2); //将字符串s2排序
printf("%s/n",s1);
printf("%s/n",s2);
s3[0]='/0'; //字符串s3的第一个字符先置'/0'结束标志
{{U}}(10) {{/U}} //将s1和s2合并,按照字母顺序排列,
//且要删去相同字符,存入s3中
printf("%s",s3);
}
问答题[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。(1)在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器,示意图如下图所示。(2)当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。(3)在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后将获得一张出场卡,用于离开停车场。(4)当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出警告信号。(5)系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到了下表所示的类/用例/状态列表、图1所示的用例图、图2所示的初始类图以及图3所示的描述入口自动栏杆行为的UML状态图。类/用例/状态列表用例名说明类名说明状态名说明Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离丌停车场PaymentMachine付款机器Disable没有车位Reportsatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏
问答题【说明】设有关于银行借贷管理系统的E-R图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。为了答题的方便,图中的实体和属性同时给出了中英文说明,回答问题时只需写出英文名即可。
问答题【问题 3】 (3 分)
为了使商场有紧急事务时能联系到轮休的员工,要求每位员工必须且只能登记一位紧急联系人的姓名和联系电话,不同的员工可以登记相同的紧急联系人。则在图2-1中还需添加的实体是(1),该实体和图2-1中的员工存在(2)联系(填写联系类型)。给出该实体的关系模式。
问答题【说明】流程图描述了某高校图书订购与编目系统的处理流程。全校的图书典藏在校图书馆和各系的资料室中。学校每年分若干批向出版单位订购图书,同一批订购的图书将陆续邮寄到学校。出版单位在寄出图书的同时附上到书清单和发票,发票上仅给出一份到书清单中书的总册数和总金额。学校收到图书和发票后,先参照订购单验收,然后进行编目,并把有关信息存放在书种文件、书名文件、作者文件和复本文件中,以供读者检索。书种文件记录了每种书的有关信息。所谓一种书是指同一作者、同一书名、同一出版单位和同一出版年份出版的书。例如,2004年张明在科技出版社出版了《软件工程》(印数8000册)和《数据库基础》(印数5000册),则张明在2004年出版了两种书。在全校的藏书中,如果一种书只有一册,则该书的信息存放在书种文件中:如果一种书有多册,则其中一册书的信息存放在书种文件中,其余的书作为复本将信息存放在复本文件中。复本文件的结构与书种文件的结构相同,每种书都有一个书号,书号唯一地标识了一种书。在书库中,每册书有一个登录号,登录号唯一地标识了一册书。此外,为了图书检索的方便,将图书按学科分类,分类号用来标识不同的学科领域。各类单据和文件的结构如下所示。订购单:订购批号、书名、作者名、出版单位、出版年份、单价、订购册数、订购部门代码、订购日期。到书清单:订购批号、书名、作者名、出版单位、出版年份、单价、册数。发票:订购批号、发票号、总册数、总金额。书种文件:分类号、登录号、书名代码、作者代码、出版单位、出版年份、单价、复本标志、典藏部门代码、借出标志。其中,复本标志用来指示该种书在书库中有没有复本:对于书名相同的若干种书,书名代码是相同的。书名文件:书名代码、书名。作者文件:作者代码、作者名。【问题1】指出验收文件至少应由哪些数据项组成。【问题2】由于处理5和处理6的分类,可能导致分类后的文件中一张发票无法找到与它对应的那些书,从而当一组发票的金额之和与一组到书清单中的书价之和不等时,无法知道是哪一张发票和哪一份清单不一致。如果仍使用原流程图,那么当到书清单文件的结构做何改动后,能找出不一致的发票和相应的书目。【问题3】若在书种文件中增加数据项“书号”,则如何重新设计复本文件的结构,使数据冗余最小。
问答题【问题1】 假设当前该旅馆各个房间的情况见表3。
序号i
ROOM
RANK
NBED
STATUS
1
101
3
4
0
2
102
3
4
1
3
201
2
3
0
4
202
2
4
1
5
301
1
6
0 当输入M=4,R=0时,该算法的输出是什么?
问答题试题六(共15分)阅读下列说明和Java代码,将应填入____(n)____处的字句写在答题纸的对应栏内。[说明]现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQLServer和Access两种数据库以及系统中的数据库表Department为例,其类图如图6-1所示。
问答题[问题1]
请使用说明中的术语,给出上图中类Customer和类Person的属性。
问答题【说明】某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-7所示:{{B}}表10-7{{/B}}为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-12所示:其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接口FlyBehavior与QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。【Java代码】{{U}}(1){{/U}}FlyBehavior{publicvoidfly();};{{U}}(2){{/U}}QuackBehavior{publicvoidquack();};classFlyWithWingsimplementsFlyBehavior{publicvoidfly(){System.out.println(“使用翅膀飞行!”);}};classFlyNoWayimplementsFlyBehavior{publicvoidfly(){System.out.println(“不能飞行!”);}};classQuackimplementsQuackBehavior{publicvoidquack(){System.out.println(“发出/‘嘎嘎/’声!”);}};classSqueakimplementsQuackBehavior{publicvoidquack(){System.out.println(“发出空气与橡皮摩擦声!”);}};classQuackNoWayimplementsQuackBehavior{publicvoidquack(){System.out.println(“不能发声!”);}};abstractclassDuck{protectedFlyBehavior{{U}}(3){{/U}};protectedQuackBehavior{{U}}(4){{/U}};publicvoidfly(){{{U}}(5){{/U}};}publicvoidquack(){{{U}}(6){{/U}};};public{{U}}(7){{/U}}voiddisplay();};classRubberDuckextendsDuck{publicRubberDuck(){flyBehavior=new{{U}}(8){{/U}};quackBehavior=new{{U}}(9){{/U}};}publicvoiddisplay(){/*此处省略显示橡皮鸭的代码*/}};//其他代码省略
问答题阅读下列说明和图,回答问题。[说明]某网上购物平台的主要功能如下:(1)创建订单。顾客(Customer)在线创建订单(Order),主要操作是向订单中添加项目、从订单中删除项目。订单中应列出所订购的商品(Product)及其数量(quantities)。(2)提交订单。订单通过网络来提交。在提交订单时,顾客需要提供其姓名(Name)、收货地址(Address)以及付款方式(FormofPayment)(预付卡、信用卡或者现金)。为了制定送货计划以及安排送货车辆,系统必须确定订单量(Volume)。除此之外,还必须记录每种商品的名称(Name)、造价(CostPrice)、售价(SalePrice)以及单件商品的包装体积(CubicVolume)。(3)处理订单。订单处理人员接收来自系统的订单;根据订单内容,安排配货,制定送货计划。在送货计划中不仅要指明发货日期(DelivelyDate),还要记录每个订单的限时发送要求(DeliveryTimeWindow)。(4)派单。订单处理人员将已配好货的订单转交给派送人员。(5)送货/收货。派送人员将货物送到顾客指定的收货地址。当顾客收货时,需要在运货单(DeliverySlip)上签收。签收后的运货单最终需交还给订单处理人员。(6)收货确认。当订单处理人员收到签收过的运货单后,会和顾客进行一次再确认。现采用面向对象方法开发上述系统,得到如图1所示的用例图和如图2所示的类图。图1用例图2图2类图2
