问答题【说明】某大学准备开发一个学生课程注册系统,学生可以使用该系统查询新学期将开设的课程和讲课教师情况,选择自己要学习的课程进行登记注册,并可以查询成绩单;教师可以使用该系统查询新学期将开设的课程和选课学生情况,并可以登记成,绩单;注册管理员使用该系统进行注册管理,包括维护教师信息、学生信息和课程信息等。在每个学期的开始,学生可以获得该学期的课程目录表,课程目录表列出每门课程的所有信息,诸如基本信息、教师、开课系和选课条件等。新学期开始前两周为选课注册时间,在此期间学生可以选课注册,并且允许改变或取消注册申请,开学两周后注册管理员负责关闭课程注册。每个学生可以选择不超过4门课程,同时指定2门侯选课程以备主选课程未选上。每门课程最多不能超过10人,最少不能低于3人,低于3人选课的课程将被取消。一旦学生的注册过程完毕,注册系统将有关信息提交收费系统以便学生付费。如果在实际注册过程中名额已满,系统将通知学生在提交课程表之前予以更改。在学期结束时,学生可以存取系统查看电子成绩单。由于学生成绩属于敏感信息,系统必须提供必要的安全措施以防非法存取。【用例图】 表1学生课程注册系统的实体类实体类说明Professor学校中讲课的教师student学校中注册课程的学生Schedule学生在新学期选择登记的课程列表CourseCatalog学校所有课程的目录Course课程的基本信息CourseOffering新学期课程的开设信息,如讲课教师、时间、地点等信息 表2学生课程注册系统的边界类边界类说明LoginForm为教师、学生和注册管理员提供登录的操作RegisterCoursesForm为学生提供选课注册的操作ViewReportForm为学生提供成绩查询的操作selecrTeachCoursesForm为教师提供查看学生选课情况的操作SubmitCradesForm为教师提供登记成绩的操作MaintainProfessorsForm为注册管理员提供维护教师信息的操作MaintainStudentsForm为注册管理员提供维护学生信息的操作MaintainCoursesForm为注册管理员提供维护课程信息的操作CloseRegistrationForm为注册管理员提供关闭注册的操作BillingSystemNotice提供与收费系统的信息交换接口 表3学生课程注册系统的控制类控制类说明RegisterCoursesControl负责新学期学生的选课登记ViewReportControl负责学生成绩的查询SelectTeachCoursesControl负责新学期课程的学生选择情况SubmitGradesControl负责学生成绩的登记CloseRegistrationControl负责关闭课程注册【协作图】【时序图】注释1:学生打算注册新的课程。注释2:一张这学期可选择的课程列表。注释3:显示一张为学生选课用的空白登记表。
问答题【说明】在一条农村公路的一边稀疏地分布着房子,其分布如图10-5所示。某电信公司需要在某些位置放置蜂窝电话基站,由于基站的覆盖范围是6公里,因此必须使得每栋房子到某个基站的直线距离不超过6公里。为简化问题,假设所有房子在同一直线上,并且基站沿该直线放置。现采用贪心策略实现用尽可能少的基站覆盖所有的房子。实现贪心算法的流程如图10-6所示,请填充其中空白并计算该算法的时间复杂度,其中:1.d[i](1≤i≤N)表示第i个房子到公路A端的距离,N表示房子的总数,房子的编号按照房子到公路A端的距离从小到大进行编号。2.s[k]表示第k(k≥1)个基站到公路A端的距离,算法结束后k的值为基站的总数。该算法的时间复杂度为{{U}}(5){{/U}}。
问答题[说明](1)对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d)及其权值2、7、4、5,可构造如图3-26所示的最优二叉树,以及相应的结构数组Ht(如表3-12所示,其中数组元素Ht[0]不用)。{{B}}表3-12结构数组Ht{{/B}}{{B}}数组下标{{/B}}{{B}}ch{{/B}}{{B}}weight{{/B}}{{B}}parent{{/B}}{{B}}lchild{{/B}}{{B}}rchild{{/B}}1a25002b77003c45004d5600566136180267结构数组Ht的类型定义如下:(2)用“0”或“1”标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用“0”(或“1”)标识该分支(示例见图3-26)。(3)若用上述规则标识最优二叉树的每条分支后,从根结点开始到叶子结点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子结点的前缀编码。例如图3-26所示的叶子结点a、b、c、d的前缀编码分别是110、0、111、10。[函数说明1]函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中,形参root为最优二叉树的根结点下标;形参n为叶子结点个数。在函数voidLeafCode(introot,intn)构造过程中,将Ht[p].weight域用做被遍历结点的遍历状态标志。[函数4.1][函数说明2]函数voidDecode(char(作图)buff,introot)的功能是:将前缀编码序列翻译成叶子结点的字符序列,并输出。其中,形参root为最优二叉树的根结点下标;形参buff指向前缀编码序列。[函数4.2]
问答题【说明】某网络故障诊断系统,使用故障代理(aZent、Sm4PTrap等)来检测各种意外情况,如大幅丢包、路由冲突、广播风暴等。网络管理员可以在安装该系统时配置安全监控程序(如故障代理程序、实时诊断程序、报警器等),也可以在系统运行时修改配置,通过网络状态采集器和故障特征数据库,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,系统给每个故障代理赋予一个编号(即id)和类型,并设置管理员密码以启动和关闭系统,设置故障代理事件发生时应自动拨出的电话号码。当系统检测到一个故障代理事件时,就激活警报,拨出预置的电话号码,并报告关于位置和检测到的事件的性质等信息。【数据流图】1.【问题1】数据流图1(网络故障检测系统顶层图)中的A和B分别表示什么?
问答题[说明]某汽车制造工厂有两条装配线。汽车装配过程如下图所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-1,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。(3)ai,j表示在工位Si,j处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。(4)ti,j表示从Si,j处装配完成后转移到另一条装配线下一个工位的时间。(5)x0和x1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。图4-17所示的流程图描述了求最短装配时间的算法,该算法的输入为:n:表示装配线上的工位数;e[i]:表示e1和e2,i取值为0或1;a[i][j]:表示ai,j,i的取值为0或1,j的取值范围为0~n-1;t[i][j]:表示ti,j,i的取值为0或1,j的取值范围为0~n-1;x[i]:表示x0和x1,i取值为0或1。算法的输出为:fi:最短的装配时间;li:获得最短装配时间的下线装配线号(0或者1)。算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
问答题[说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。 以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。 以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。 [C代码] typedef (1) (*funl)(); enum HandValueHANDVALUE_GUU=0, HANDVALUE_CHO=1, HANDVALUE_PAA=2; //手势可取值,依次为“石头”、“剪刀”、“布” //其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头 bool won; struct Hand *WSprevHand; struct Hand//手势 enum HandValue handvalue; hand[3]=HANDVALUE_GUU, HANDVALUE_CHO, HANDVALUE_PAA; int fight(struct Hand *h1, struct Hand *h2) //比较h1和h2。h1代表的手势较大时返回1,h1较小时返回-1,相等时返回0 // if(h1->handvalue == h2->handvalue) return 0; else if((h1->handvalue+1)% (2) == h2>handvalue) return 1; else return -1; struct Hand* getHand(int handvalue) //依据手势代表的值取得手势,若handvalue不合法,返回NULL switch(handvalue) case 0: return break; case 1: return bteak; case 2; return break; return (3) ; struct Strategy//策略 funl nextHand;//下一个手势 ; struct Hand* WSnextHand() if(!won) PSprevHand = getHand(rand()%3); return PSprevHand; struct Player char name[20]; (4) strategy;//策略 int wincount; int losecount; int gamecount; ; void main() Strategy WS; WS.nextHand = WSnextHand; WSpreVHand = NULL; struct Player WSplayer; (5)(WSplayer.name,"ww"); WSplayer.wincount = 0; WSplayer.losecount = 0; WSplayer.gamecount = 0; WSplayer.strategy =
问答题[说明]
下面代码实现类A、B、C、D的继承定义和应用。仔细阅读[代码5-1],在{{U}} (n) {{/U}}处写出正确的运行结果。
[代码5-1]
#include<iostream.h>
class A {
public:
int a;
A (int v1): a(v1) {} //构造函数
void disp ( )
{
cout<<"a in class A="<<a<<endl;
}
};
class B: virtual public A {
public:
int b;
B (int v1,int v2): A(v1),b v2) {} //构造函数
void disp ( )
{
cout<<"a in class B="<<a<<endl
cout<<"b in class B="<<b<<endl;
}
};
class C: virtual public A {
public:
int c;
C (int v1,int v2): A(v1) ,c(v2) {} //构造函数
void disp ( )
{
cout<<"a in class C="<<a<<endl;
cout<<"c in class C="<<c<<endl;
}
};
class D: public B, public C {
public:
int d;
D (int v1,int v2,int v3,int v4 ): A(v1) ,B(v1,v2) ,C(v1,v3),d(v4) {} //构造函数
void disp ( )
{
cout<<"a="<<a<<endl;
cout<<"b="<< b<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
}
};
void main( )
{
D demo (10,20,30,40);
demo.disp ( );
}
[运行结果]
a={{U}} (1) {{/U}}
b={{U}} (2) {{/U}}
c={{U}} (3) {{/U}}
d={{U}} (4) {{/U}}
问答题【说明】 类Queue表示队列,类中的方法如下表所示。 isEmpty() 判断队列是否为空。如果队列不为空,返回true;否则,返回false enqueue(Object newNode) 入队操作 dequeue() 出队操作。如果队列为空,则抛出异常 类Node表示队列中的元素;类EmptyQueueException给出了队列操作中的异常处理操作。 public class TestMain //主类 public static viod main (String args[]) Queue q=new Queue(); q.enqueue("first!"); q.enqueue("second!"); q.enqueue("third!"); (1) while(true) System.out.println(q.dequeue()); catch( (2) ) public class Queue //队列 Node m_FirstNode; public Queue()m_FirstNode=null; public boolean isEmpty() if(m_FirstNode==null)return true; else return false; public viod enqueue(Object newNode) //入队操作 Node next=m_FirstNode; if(next==null)m_FirstNode=new Node(newNode); else while(next.getNext()!=null)next=next.getNext(); next.setNext(new node(newNode)); public Object dequeue() (3) //出队操作 Object node; if (isEempty()) (4) ; //队列为空, 抛出异常 else node=m_FirstNode.getObject(); m_FirstNode=m_FirstNode.getNext(); return node; public class Node //队列中的元素 Object m_Data; Node m_Next; public Node(Object data) m_Data=data; m_Next=null; public Node(Object data, Node next) m_Data=data; m_Next=-next; public void setObject(Object data) m_Data=data; public Object getObject(Object data) return m_data; public void setNext(Node next) m_Next=next; public Node getNext() return m_Next; public class EmptyQueueException extends (5) //异常处理类 public EmptyQueueException() System.out.println("队列已空! ");
问答题[问题3](3分)
用例“借书”的备选事件流4a中,根据借书制度来判定读者能否借阅图书。若图书馆的借书制度会不断地扩充,并需要根据图书馆的实际运行情况来调整具体使用哪些制度。为满足这一要求,在原有类设计的基础上,可以来用何种设计模式?简要说明原因。
问答题[说明]某银行计划开发一个自动存提款机模拟系统(ATMSystem)。系统通过读卡器(CardReader)读取ATM卡;系统与客户(Customer)的交互由客户控制台(clastomerConsole)实现:银行操作员(Operator)可控制系统肩动(SystemStartup)和系统停止(SystemShutdown);系统通过网络和银行系统(Bank)实现通信。当读卡器判断用户已将ATM卡插入后,创建会话(Session)。会话开始后,读卡器进行读卡,并要求客户输入个人验证码(PIN)。系统将卡号和个人验证码信息送到银行系统进行验证。验证通过后,客户可从菜单选择以下事务(Transaction)。(1)从ATM卡账户取款(Withdraw)。(2)向ATM卡账户存款(Deposit)。(3)进行转账(Transfer)。(4)查询(Inquire)ATM卡账户信息。一次会话可以包含多个事务,每个事务处理也会将卡号和个人验证码信息送到银行系统进行验证。若个人验证码错误,则转个人验证码错误处理(InvalidPINProcess)。每个事务完成后,客户可选择继续上述事务或退卡。选择退卡时,系统弹出ATM卡,会话结束。系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图如图1所示,一次会话的序列图(不考虑验证)如图2所示。可能的消息名称列表如下表所示。可能的消息名称列表名称说明名称说明CardInserted()ATM卡已插入performTransaction()执行事务performSession()执行会话readCard()读卡readPIN()读取个人验证码PIN个人验证码信息Create(atm,this,card,pin)为当前会话创建事务create(this)为当前ATM创建会话CardATM卡信息doAgain执行下一个事务ejectCard()弹出ATM卡
问答题有下列关于运动会管理系统的ER图,如图所示。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。假定已通过下列SQL语言建立了基本表。CREATETABLEATHLETEANAMECHAR(20),ASEXCHAR(1),ATEAMCHAR(20));CREATETABLE|TEM(INOCHAR(6)NOTNULL,INAMECHAR(20),ITIMECHAR(12),IPLACECHAR(20);CREATETABLEGAMES(ANOCHAR(6)NOTNULL,INOCHAR(6)NOTNULL,SCORRECHAR(10));为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。【E-R图】【问题】填充下列SQL程序1~4中的(1)~(7),使它们分别完成相应的功能:程序1:统计参加比赛时男运动员人数。SELECT(1)FROMATHLETEWHEREASEX='M';程序2:查100872号运动员参加的所有项目及其比赛时间和地点。SELECTITEM,INO,INAME,ITIME,IPLACEFROMGAMES,ITEMWHERE(2);AND(3);程序3:查参加100035项目的所有运动员名单。SELECTANO,ANAME,ATEAMFROMATHLETEWHERE(4);(SELECT(4)(5)FROMGAMESWHEREGAMESANO=ATHLETE.ANOANDINO='100035');程序4:建立运动员成绩视图。(6)ATHLETE-SCOREASSELECTATHLETE,ANO,ANAME,ATEAM,INAME,SCOREFORM(7)WHEREATHLETE.ANO=GAMES.ANOANDGAMES.INO=ITEM.INO;
问答题[说明]某图书管理系统的主要功能如下。(1)图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态(可借阅或己借出)。(2)资源可以分为两类:图书和唱片。对于图书,系统需登记作者和页数;对于唱片,系统需登记演唱者和介质类型(CD或者磁带)。(3)读者信息保存在图书管理系统的读者信息数据库中,记录的信息包括读者的识别码和读者姓名。系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息。现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。下表中给出了说明中出现的所有名词。表1 图书管理系统图书管理系统资源目录读者资源索引号系统名称出版时间资源状态图书唱片作者页数演唱者介质类型CD磁带读者信息读者信息数据库识别码姓名借书记录文件信息通过对上表中的名词进行分析,最终得到如下图所示的UML类图。类的说明如下表所示。表2 类的说明类名说明LibrarySystem图书管理系统BorrowerDB保存读者信息的数据库Catalogltem资源目录中保存的缚项资源Borrower读者BorrowerItems为每个读者创建的借书记录文件
问答题[说明]图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还以及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。系统要实现以下四方面的功能:购入新书、读者借书、读者还书以及图书注销。(1)购入新书:需要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。(2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。(3)读者还书:根据图书流水号,从借书占文件中读出和该图书相关的借阅记录,表明还书日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。(4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。(5)流通查询:管理员可以对图书流通情况进行查询,包括某位读者、某种图书和全局图书,给出流通情况统计表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图1是顶层数据流图,图2是第0层数据流图,图3是第1层数据流图。图1图2图3[数据字典](1)数据流条目图书管理要求=[入库单|借书单|还书单|注销单]入库单=分类目录号+数量+书名+作者+内容摘要+价格+购书日期借书单=读者号+(d)+借阅日期还书单=(e)+还书日期(2)文件说明文件名:目录文件组成:分类目录号+书名+作者+内容摘要+价格+入库日期+总数+库存数+(f)
问答题[说明]某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。1.对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括:客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括:车牌号、车型、颜色、车辆类别等信息。一个客户至少有一台车。客户及车辆信息如表2-1所示。2.记录维修车辆的故障信息。包括:维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为:维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书。如表2-2所示。3.维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表2-3所示。4.客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,记录在委托书中。根据需求阶段收集的信息,设计的实体联系图(见图2-1)和关系模式(不完整)如下所示。图2-1中业务员和维修工是员工的子实体。[概念结构设计][逻辑结构设计]客户((5),折扣率,联系人,联系电话)车辆(车牌号,客户编号,车型,颜色,车辆类别)委托书((6),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用)维修项目(维修项目编号,维修项目,单价)派工单((7),工时)员工((8),工种,员工类型,级别)
问答题请补充函数fun(),该函数可以统计一个长度为n的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为:asd ascasdfg asd as asd mlosd,子字符串为asd,则应输出4。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填人所编写的若干表达式或语句。 试题程序: #include < stdio. h > #include < string. h > #include < conio. h > int fun(char * str,char * substr) int n; char *p,*r; (1) ; while( * str) p = str; r = substr while( * r) if( (2) ) r++; p++; else break; if( (3) ) n++; str ++; return n; main( ) char str[81],substr[3]; int n; clrscr ( ); printf("输入主字符串:'); gets(str); printf('输入子字符串:" ); gets( substr ); puts(str); puts(substr); n = fun(str,substr); printf("n=%d/n",n)
问答题阅读下列函数说明,将应填入{{U}} (n) {{/U}}处的字句写在答卷纸的对应栏内。 【函数1说明】 函数compare(SqList A,SqList B)的功能是:设A=(al,…,am)和B=(b1,…,bn)均为顺序表,“比较”两个顺序表A和B的大小。设A'和B'分别为A和B中除去最大共同前缀后的子表(例如,A=(y,X,X,Z,X,Z),B=(y,x,x,z,y,x,x,2),则两者中最大的共同前缀为(y,x,x,2),在两表中除去最大共同前缀后的子表分别为A'=(X,Z)和B'=(y,x,x,2))。若A'=B'=空表,则 A=B:若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于B,的首元,则A<B;否则A>B。 提示:算法的基本思想为:若相等,则j+1,之后继续比较后继元素:否则即可得山比较结果。显然,j的初值应为0,循环的条件是j不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有3种可能出现的情况需要区分。 【函数1】 int compare(SqList A,SqList B) { //若A<B,则返回-1;若A=B,则返回o:若A>B,则返回1 j=0; while(j<{{U}} (1) {{/U}} else if( A.elem[j] > B.elem[j] ) return(i); else{{U}} (2) {{/U}} ff (A.length == B.length) return (0); else fi(A.length < B.length ) return(-1); else return(1); }//compare //函数1的时间复杂度是{{U}} (3) {{/U}} 【函数2说明】 函数 exchange_L( SLink k = 1; while( k< m ++k; } if({{U}} (6) {{/U}} // 以指针ha记a1 结点的位置 L->next = p->next; // 将b1结点链接在头结点之后 p->next = NULL; // 设am的后继为空 q:{{U}} (7) {{/U}}; // 令q 指向b1结点 while(q->next)q={{U}} (8) {{/U}}; // 查的bn结点 q->next ={{U}} (9) {{/U}}; // 将a1 结点链接到bn 结点之后 } } } //函数2的时间复杂度是{{U}} (10) {{/U}}。
问答题【说明】 一个野生动物园,有如下动物:老虎、豹、狼、丹顶鹤、鹦鹉、天鹅、金鱼、热带鱼、鳄鱼等等。
问答题从下列的3道试题(试题五至试题七)中任选1道解答,如果解答的试题数超过1道,则题号小的1道解答有效。试题五(15分,每空3分)阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]函数intToplogical(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中图G表示一个具有n个顶点的AOE-网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下:[图5-1][图5-2]
问答题阅读以下说明和数据流图,回答问题1~问题3。[说明]职工信息管理系统是用于对职工相关信息进行检索、统计、工资管理、内部调动管理等的系统。利用该系统,人事科可以对本单位职工信息进行管理,根据不同命令对信息进行增、删、改、内部调动,打印人事表格,进行统计、检索。人事科输入的系统命令需要合法性检查才能被接受、处理。系统命令包括档案维护、数据检索、统计报表、打印命令、代码维护。人事科的输入信息包括个人资料、检索选项、统计选项、代码资料、新增档案字段、档案修改资料等条目。完整的个人资料应包括职工的档案编号、姓名、工作单位、性别、出生日期、技术职称以及学历。通过系统授权,用户可以进行对职工信息数据进行查询检索,检索的条件可以是姓名、工作单位、,性别、技术职称等组合。通过系统授权,超级用户还可以对职工档案进行维护。当超级用户需要对档案进行维护时,输入档案维护命令,得到合法性确认后,可以对系统数据库档案信息进行维护,否则将拒绝执行。档案维护操作可以是增加档案、修改档案、删除档案、增加档案字段中的任何一种操作。档案维护成功后要及时更新职工信息数据文件,保存维护结果。职工管理信息系统的顶层图如图12-1所示;职工管理信息系统的第0层DFD图如图12-2所示,其中,加工3的细化图如图12-3所示,加工3.2的细化图如图12-4所示。[数据流图12-1][数据流图12-2][数据流图12-3][数据流图12-4]
