问答题{{B}}试题1~试题4是必答题{{/B}}阅读以下某房屋租赁服务系统的技术说明和数据流图,根据要求回答问题1~问题4。[说明]某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能。(1)登记房主信息:对于每名房主,系统需登记其姓名、住址和联系电话,系统还将为其分配一个唯一的身份标识(ID)和密码,并将这些信息写入房主信息文件。(2)登记房屋信息:所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。(3)收取手续费:房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。(4)登记租赁者信息:所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,租赁者信息包括姓名、现住址、电话号码、出生年月、性别,以及系统分配的唯一身份标识(ID)和密码。这些信息都保存在租赁者信息文件中。(5)租赁房屋:已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统将安排租赁者与房主见面的时间和地点,并将见面信息(包含见面双方的基本信息)通知租赁者和房主。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。(6)变更房屋状态:当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。该房屋租赁服务系统的顶层数据流图如图5-10所示,图5-11是其第0层数据流图。
问答题[问题2]
根据题意,补充图2-5中缺失的联系和联系的类型,使其成为完善的实体联系图。其中,联系名分别取名为联系1,联系2,联系3,……。
问答题阅读下列算法说明和流程图,根据要求回答问题1~问题3。[说明]某机器上需要处理n个作业job1,job2,…,jobn,其中:(1)每个作业jobi(1≤i≤n)的编号为i,jobi有一个收益值P[i]和最后期限值d[i];(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;(3)job1~jobn的收益值呈非递增顺序排列,即p[1]≥p[2]≥…≥p[n];(4)如果作业jobi在其期限之内完成,则获得收益p[i];如果在其期限之后完成,则没有收益。为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图3-25是基于贪心策略求解该问题的流程图。(1)整型数组J[]有n个存储单元,变量k表示在期限之内完成的作业数,J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k)里的作业按其最后期限非递减排序,即d[J[1]]≤…≤d[J[k]]。(2)为了便于在数组J中加入作业,增加一个虚拟作业job0,并令d[0]=0,J[0]=0。(3)算法大致思想是:先将作业job1的编号1放入J[1],然后,依次对每个作业jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。(4)流程图中的主要变量说明如下。i:循环控制变量,表示作业的编号;k:表示在期限内完成的作业数;r:若jobi能插入数组J,则其在数组J中的位置为r+1;q:循环控制变量,用于移动数组J中的元素。
问答题[说明2]在M阶B树中插入一个关键字时,首先在最接近外部节点的某个非叶子节点中增加一个关键字,若该节点中关键字的个数不超过M-1,则完成插入;否则,要进行节点的“分裂”处理。所谓“分裂”,就是把节点中处于中间位置上的关键字取出来并插入其父节点中,然后以该关键字为分界线,把原节点分成两个节点。“分裂”过程可能会一直持续到树根,若树根节点也需要分裂,则整棵树的高度增1。例如,在图1所示的B树中插入关键字25时,需将其插入节点e中。由于e中已经有3个关键字,因此将关键字24插入节点e的父节点b中,并以24为分界线将节点e分裂为e1和e2两个节点,结果如图2所示。函数Isgrowing(BTreeNode*root,ElemKeyTypeakey)的功能是:判断在给定的M阶B树中插入关键字akey后,该B树的高度是否增加,若增加则返回TRUE,否则返回FALSE。其中,root是指向该M阶B树根节点的指针。在函数Isgrowing中,首先调用函数SearchBtree查找关键字akey是否在给定的M阶B树中,若在则返回FALSE(表明无需插入关键字akey,树的高度不会增加);否则,通过判断节点中关键字的数目考查插入关键字akey后该B树的高度是否增加。函数lsgrowing的代码如下:boolIsgrowing(BTreeNode*root,ElemKeyTypeakey){BTreeNode*t,*f;if(!SearchBtree(______){t=f;while(______){t=t→parent;}if(!t)returnTRUE;}returnFALSE;}
问答题试题二(15分)阅读下列说明和E-R图,回答问题1至问题3,将解答填入答题纸的对应栏内。[说明]某网上订书系统的E-R图(已消除了不必要的冗余)如图2-1所示(图中没有标出主码)。图中实体的说明如表2-1所示,相关属性说明如表2-2所示。一个顾客可以在同一天填写多张购书单,每张购书单上可填写多种图书,每种图书可以订购多本,bid相同的图书在同一张购书单上不能出现多次。注:为简化起见,不考虑信用卡号码泄漏所带来的安全性等问题。[图2-1]
问答题【说明】 本题将有向网(带权有向图)定义为类Adjacency WDigraph。类中的数据成员n表示有向网中的顶点数;a为带权邻接矩阵,用于存储有向网中每一对顶点间弧上的权值;c为二维数组,存储有向网中每一对顶点间的最短路径长度;kay为二维数组,存储最短路径,kay[i][j]=k表示顶点i到达顶点j的最短路径必须经过顶点k。类中的主要成员函数有: Input():输入有向网的顶点数、各条弧及权值,建立带权领接矩阵a。若顶点i到顶点j有弧,则a[i][j]取弧上的权值,否则a[i][j]的值取NoEdge。 AllPairs();用弗洛伊德(Floyd)算法求有向网中每一对顶点间的最短路径长度。 OutShortestPath (int i, int j:计算顶点i到顶点j的最短路径。 outputPath(int i, int j):输出顶点i到顶点j的最短路径上的顶点。 Floyd算法的基本思想是递推地产生一个矩阵序列C0,C1,C2,…,Cn,其中C0是已知的带权邻接矩阵,a,Ck(i, j(0≤i,j<)表示从顶点i到顶点j的中间顶点序号不大于k的最短路径长度。如果i到j的路径没有中间顶点,则对于0≤k<n,有Ck(i,j)=C0(i,j)= a[i][j]。递推地产生C1,C2,…,Cn的过程就是逐步将可能是最短路径上的顶点作为路径上的中间顶点进行试探,直到为全部路径都找遍了所有可能成为最短路径上的中间顶点,所有的最短路径也就全部求出,算法就此结束。 【C++代码】#include < iostream. h >#define NoEdge 10000// 当两个顶点之间没有边相连时,在邻接矩阵中用NoEdge表示void Make2DArray(int * * class AdjacencyWDigraph private int n; //有向网中的顶点数目 int* *a; //存储顶点间弧上的权值 int* *c; //存储计算出的最短路径长度 int* * kay; //存储求出的最短路径pubic: int Vertices( )const j return n; void AllPairs( ); void Input( ); //输入有向网的顶点数、各条弧及权值,建立邻接矩阵a void OutShortestPath(int i, int j); //计算顶点i到j的最短路径(试卷中未列出) ~ AdjacencyWDigraph ( ); //析构函数(试卷中未列出)private: void outputPath(int i, int j);;void AdjacencyWDigraph: :AllPairs( ) int i,j,k,t1,t2,t3; for(i=1;i<=n; k++) for(j=1;j<=n; ++j) c[i][j]= (1) ; kay[i][j]=0; for(k=1;k<=n; k++) for(i=1;i<=n; i++) if(i= =k) continue; t1=c[i][k]; for(j=1;j<=n; j++) if(j==k||j==i) continue; t2 =c[k] [j]; t3 =c[i] [j]; if( t1 ! = NoEdge kay[i][j]= (3) ; //for //forvoid AdjacencyWDigraph:: outputPath(int i, int j) //输出顶点i到j的最短路径上的顶点 if(i==j) return; if(kay[i] [j]==0)cout<<j <<"; else outputPath(i, (4) ); outputPath( (5) );void Adjacency WDigraph: :lnput( )int i,j,u,v,w,E; cout << "输入网中顶点个数:";cin> >n; cout << "输入网中弧的个数:"; cin> >E; Make2DArray (a, n+1, n+1); for(i=1;i<=n; i++) for(j=1; j<=n; j++) a[i][j]=NoEdge; for(i=1;i< =n; i++) a[i][i]=0; Make2DArray(c, n+1, n+1); Make2DArray(kay, n+1, n+1) for(i=1;i<=E; i++)cout<<"输入弧的信息(起点终点权值); "; cin> >u> >v> >w; a[u][v] =w;void Make2DArray(int * * x=new int* [rows+1]; for(i=0;i<rows+1;i ++ ) x[i]=new int [cols+1]; for(i=1;i<= rows; i ++) for(j=1;j<=cols; j++) x[i][j]=0;
问答题[说明]在一些应用场合中,需要对用户的输入数据进行检查监控。以下VisualBasic程序实现了对新添加到List列表的内容进行监控,拒绝向List列表添加重复信息。例如,在List列表中存在元素“a01001;a01002”,如果用户输入数据为“aOl001”或“a01002”,系统则弹出提示信息,拒绝将新数据加入List列表;如果用户输入的数据不同与List列表中的任何一个元素,则作为新元素加入List中。VisualBasic界面显示如图11-5所示。根据程序功能说明,完成程序代码。[代码1]BeginVB.FormForm1Caption=“List列表拒绝添加重复信息”//...窗体描述(略)BeginVB.CommandButtonCommand2Caption=“退出”//...窗体描述(略)EndBeginVB.CommandButtonommand1Caption=“添加”//...窗体描述(略)EndBeginVB.TextBoxText1//...窗体描述(略)EndBeginVB.ListBoxList1Height=1860ItemData="Form1.frx":0000Left=1020List="Form1.frx":0002TabIndex=0Top=525Width=2580EndBeginVB.LabelLabellBackStyle=0'TransparentCaption="请输入编号"//...窗体描述(略)EndEnd[代码2]AttributeVB_Name="Form1"AttributeVB_GlobalNameSpace=FalseAttributeVB_Creatable=FalseAttributeVB_PredeclaredId=TrueAttributeVB_Exposed=FalsePrivateSubForm_Load()Listl.AddItem"a01001"Listl.AddItem"a01002"EndSubPrivateSubCommand1Click()DimMyvalAsLongFori=0To(1)(2)If(3)ThenMsgBox"系统不允许重复输入,请重新输入"ExitSubEndIf(4)(5)EndSub
问答题【算法说明】下面是一段插入排序的程序,将R[k+1]插入到R[1...k]的适当位置。R[0]=R[k+1];j=k;while(R[j]>R[0])R[j+1]=R[j];j--;R[j+1]=R[0];【流程图】【测试用例设计】(while循环次数为0、1、2次)测试用例表
问答题[说明]散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。例如,设散列函数为Hash(Key)=Keymod7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图2-27所示。为简化起见,散列文件的存储单位以内存单元表示。函数InsertToHashTable(intNewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值0;否则返回值-1。采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P设定基桶的数目。函数中使用的预定义符号如下。
问答题[问题2]
请在下列选项中选择合适的答案,填入图3-2的方框c至方框f。
B的公钥,B的私钥,摘要算法,A的私钥,A的公钥,会话密钥
问答题【说明】某供销系统接受顾客的订货单。当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单并更新了库存后,向顾客发㈩提货单。该系统还可随时向总经理提供销售和库存情况表。该供销系统的分层数据流图中部分数据流和文件的组成如下:【文件】配件库存=配件名+规格+数量+允许的最低率库存量【数据流】订货单=配件号+配件名+规格+数量+顾客名+地址提供单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名十地址送货单=配件号+配件名+规格+数量+金额假定顶层图是正确的,“供应商”文件已由其他系统生成。【数据流图】假定题中提供的顶层图是正确的,请回答下列问题:
问答题【问题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时,该算法的输出是什么?
问答题阅读下列说明和图,回答问题。[说明]某会议策划公司为了方便客户,便于开展和管理各项业务活动,需要构建一个基于网络的会议预定系统。[需求分析](1)会议策划公司设有受理部、策划部和其他部门。部门信息包括部门号、部门名称、部门主管、电话和邮箱号。每个部门有多名员工处理部门的日常事务,每名员工只能在一个部门工作。每个部门有一名主管负责管理本部门的事务和人员。(2)员工信息包括员工号、姓名、部门号、职位、联系方式和工资。其中,职位包括主管、业务员、策划员等。业务员负责受理会议申请。若申请符合公司规定,则置受理标志并填写业务员的员工号。策划部主管为已受理的会议申请制定策划任务,包括策划内容、参与人数、要求完成时间等。一个已受理的会议申请对应一个策划任务,一个策划任务只对应一个已受理的会议申请,但一个策划任务可由多名策划员参与执行,且一名策划员可以参与多项策划任务。(3)客户信息包括客户号、单位名称、通信地址、所属省份、联系人、联系电话、银行账号。其中,一个客户号唯一标识一个客户。一个客户可以提交多个会议申请,但一个会议申请对应唯一的一个客户号。(4)会议申请信息包括申请号、开会日期、会议地点、持续天数、会议人数、预算费用、会议类型、酒店要求、会议室要求、客房类型、客房数、联系人、联系方式、受理标志和业务员的员工号等。客房类型有豪华套房、普通套房、标准间、三人间等,且申请号和客房类型决定客房数。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如图所示。[关系模式设计]部门(部门号,部门名称,主管,电话,邮箱号)员工(员工号,姓名,{{U}}(a){{/U}},联系方式,工资)客户(客户号,单位名称,通信地址,所属省份,联系人,联系电话,银行账号)会议申请({{U}}(b){{/U}},开会日期,会议地点,持续天数,会议人数,预算费用,会议类型,酒店要求,会议室要求,客房数,联系人,联系方式,受理标志,员工号)策划任务({{U}}(c){{/U}},策划内容,参与人数,要求完成时间)执行策划({{U}}(d){{/U}},实际完成时间)
问答题[说明] 冒泡排序算法的基本思想是:对于无序序列(假设扫描方向为从前向后,进行升序排列),两两比较相邻数据,若反序则交换,直到没有反序为止。一般情况下,整个冒泡排序需要进行众(1≤k≤n)趟冒泡操作,冒泡排序的结束条件是在某一趟排序过程中没有进行数据交换。若数据初态为正序时,只需1趟扫描,而数据初态为反序时,需进行n-1趟扫描。在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年的一些改进的算法中[2,3],只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。 局部冒泡排序的基本思想是:对于N个待排序数据组成的序列,在一趟从前向后扫描待排数据序列时,两两比较相邻数据,若反序则对后一个数据作一趟前向的局部冒泡排序,即用冒泡的排序方法把反序对的后一个数据向前排到适合的位置。扫描第—对数据对,若反序,对第2个数据向前冒泡,使前两个数据成为,有序序列;扫描第二对数据对,若反序,对第3个数据向前冒泡,使得前3个数据变成有序序列;……;扫描第i对数据对时,其前i个数据已成有序序列,若第i对数据对反序,则对第i+1个数据向前冒泡,使前i+1个数据成有序序列;……;依次类推,直至处理完第n-1对数据对。当扫描完第n-1对数据对后,N个待排序数据已成了有序序列,此时排序算法结束。该算法只对待排序列作局部的冒泡处理,局部冒泡算法的 名称由此得来。 以下为C语言设计的实现局部冒泡排序策略的算法,根据说明及算法代码回答问题1和问题2。 [变量说明] #define N=100 //排序的数据量 typedef struct //排序结点 int key; info datatype; ...... node; node SortData[N]; //待排序的数据组 node类型为待排序的记录(或称结点)。数组SortData[]为待排序记录的全体称为一个文件。key是作为排序依据的字段,称为排序码。datatype是与具体问题有关的数据类型。下面是用C语言实现的排序函数,参数R[]为待排序数组,n是待排序数组的维数,Finish为完成标志。 [算法代码] void Part-BubbleSort (node R[], int n) int=0 ; //定义向前局部冒泡排序的循环变量 //暂时结点,存放交换数据 node tempnode; for (int i=0;i<n-1;i++) ; if (R[i].key>R[i+1].key) (1) while ( (2) ) tempnode=R[j] ; (3) R[j-1]=tempnode ; Finish=false ; (4) // end while // end if // end for // end function
问答题[Java代码]
//Subject.java 文件
public interface Subject {
public void attach(Observer DocExplorer);
public void detach(Observer DocExplorer);
void notifyObservers();
}
//Observer.java 文件
public interface Observer{
void update({{U}} (1) {{/U}});
}
//OfficeDoc.java 文件
import java.util.*;
public class OfficeDoc implements Subject(//OfficeDoc 类实现 Subject 接口
private Vector ObserverVeetor=new java.util.Vector();
//存储与OfficeDoc相关联的DocExplorer 对象
public void attach(Observer observer){
//将某 DocExplorer 对象与OfficeDoc 相关联
ObserverVector.addElement(observer);
}
public void detach(Observer observer){
//解除某DocExplorer 对象与OfficeDoc的关联关系
ObserverVector.removeElement(observer);
}
public void notifyObservers(){
//当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象
Enumeration enumeration={{U}} (2) {{/U}};
while (enumeration.hasMoreElements()){
((Observer)enumeration.nextElement()).{{U}} (3) {{/U}};
}
}
public Enumeration Observers(){
return ObserverVector.elements();
}
//其他公文类的属性和方法省略
}
//DoeExplorer.java 文件
public class DocExplorer implements {{U}}(4) {{/U}}{
public void update({{U}} (5) {{/U}}){
//更新DocExplorer自身的状态,代码省略
}
}
问答题【程序说明】 定义一个多边形结构:struct polygon实现以下内容:(1)建立该结构的链表:create函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为0时,链表创建结束。(3)编写一个函数disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。 【程序】 #include "iostxeam. h" #include "iomanip. h" stmct polygon int n; int *x; int *y; polygon *next; ; void Push(polygon* newNode = new polygon; newNode->next= (1) ; newNode->x = new int[n]; newNode->y = new int[n]; newNode->n= (2) ; for(int i=0; i<= (3) ; i++) cout<<"请输入多边形各顶点x、y坐标, 坐标值之间用空格分隔: "; cin>>newNode->x[i]>>newNode->y[i]; (4) = head; //在head前不需要额外的* head = newNode; polygon *create() polygon* head = NULL; polygon* tail; int n; cout<<"请输入多边形顶点的个数(顶点个数为0时结束): "; cin>>n; if(n==O) return (5) ; Push(head, (6) ); tail = head; cout<<"请输入多边形顶点的个数(顶点个数为0时结束): "; cin>>n; while(n!=0) Push(tail->next, (7) ); // 在tail->next增加结点 tail = tail->next; //advance tail to point to last node cout<<"请输入多边形顶点的个数(顶点个数为0时结束): "; cin>>n; remm head; void disp(polygon *head) inti, No=l; eout<<setw( 10)<<"x"<<setw(6)<<"y"<<endl; while(head !=NULL) cout<<"第"<<No<<"结点: "<<endl; for(i=0;i<=head->n-1;i++) cout<<setw(10)<<head->x [i] <<setw(6)<<head->y[i]<<endl; (8) ; he ad= (9) ; //Match while statement void del(polygon *head) polygon *p; while(head!=NIILL p= (10) ; head=head->next; delete p->x; delete p->y; delete p; //Match while statement void main() polygon *head; head=create(); disp(head); del(head);
问答题对于教学数据库的三个基本表S(S#,SNAME,AGE,SEX),SLLS#,C#,GRADE),C(C#, CNAME,TEACHER)。现根据查询条件填充下面SQL语句空白的部分。 1.检索LIU老师所授课程的课程号和课程名。 2.检索至少选修LIU老师所授课程中一门课程的女学生姓名。 3.检索WANG同学不学的课程的课程名。 4.检索全部学生都选修的课程的课程号与课程名。 5.检索选修课程包含LIU老师所授课程的学生学号。 [说明] 1.SELECT (1) FROM C WHERE TEACHER='LIU' 2. SELECT S. SNAME FROM S,SC WHERE S.S#=SC.S#AND S. SEX='F'AND SC.C#= (2) (SELECTC# FROM C WHERE TEACHER = 'LIU') 3. SELECT CNAME FROM C wHEREc#< > (3) (SELECTSC. C# FROM S,SCWHERE S.S#=SC.S#AND S. SNAME=' WANG') 4. 由题知,该问题是在表C中找课程号和课程名,要求这门课被全部学生所选。 SELECT C#,CNAME FROM C WHERE NOT EXISTS (SELECT * FRoM S WHERE NOT EXISTS (SELECT * FROM S WHERE NOT EXISTS (SELECT * FROM SC WHERE (4) 5. SELECT DISTINCT S# FROM SC WHERE (5) (SELECT C# FROM C WHERE TEACHER = 'LIU'
问答题阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。【说明】某宾馆拟开发一个宾馆客房预订子系统,主要是针对客房的预订和入住等情况进行管理。【需求分析结果】1.员工信息主要包括:员工号、姓名、出生年月、性别、部门、岗位、住址、联系电话和密码等信息。岗位有管理和服务两种。岗位为“管理”的员工可以更改(添加、删除和修改)员工表中本部门员工的岗位和密码,要求将每一次更改前的信息保留;岗位为“服务”的员工只能修改员工表中本人的密码,且负责多个客房的清理等工作。2.部门信息主要包括:部门号、部门名称、部门负责人、电话等信息。一个员工只能属于一个部门,一个部门只有一位负责人。3.客房信息包括:客房号、类型、价格、状态等信息。其中类型是指单人间、三人间、普通标准间、豪华标准间等;状态是指空闲、入住和维修。4.客户信息包括:身份证号、姓名、性别、单位和联系电话。5.客房预定情况包括:客房号、预定日期、预定入住日期、预定入住天数、身份证号等信息。一条预定信息必须且仅对应一位客户,但一位客户可以有多条预定信息。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如下图所示。【逻辑结构设计】逻辑结构设计阶段设计的部分关系模式(不完整)如下:员工({{U}}(4){{/U}},姓名,出生年月,性别,岗位,住址,联系电话,密码)权限(岗位,操作权限)部门(部门号,部门名称,部门负责人,电话)客房({{U}}(5){{/U}},类型,价格,状态,入住日期,入住时间,员工号)客户({{U}}(6){{/U}},姓名,性别,单位,联系电话)更改权限(员工号,{{U}}(7){{/U}},密码,更改日期,更改时间,管理员号)预定情况({{U}}(8){{/U}},预定日期,预定入住日期,预定入住天数)
问答题[说明]对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器Iterator实现。图7-1显示了各个类间的关系。以下是JAVA语言实现,能够正确编译通过。[图7-1][C代码]typedefbool(*fun1)();typedef(1)(*fun2)();constintBOOK_MAX=10;//最大书本数structBookcharname30;;structBookShelf//书架structBookbooks[BOOKMAX];intindex;//书架上最后一本书的下标加1,即下一本书的下标,如0表示有0本书;StructBook*getBookAt(structBookShelf*BS,intindex)//从书架BS上取得下标为index的书//只有当下标大于等于0且不大于当前书架上的最后一本书对应的下标,才取书成功://否则失败,返回NULLif(index>=0returnNULL;boolappendBook(structBookShelf*BS,structBookbook)if(BS->indexBS->books[BS->index++]=book;returntrue;returnfalse;intgetLength(structBookShelf*bookShelf)returnbookShelf->index;structIterator//迭代器fun1hasNext;//判断是否还有下一个元素fun2next;//取得下一个元素;structBookshelfIteratorf//书架迭代器intindex;struetBookShelf*bookShelf;bookShelfIterator=0,NULL;boolBShasNext()//判断是否还有下一本书if(bookShelfIterator.indexreturntrue;elsereturnfalse;structBook*BSnext()//取得下一本书,并将index加1,以便下一次正确访问returngetBookAt(bookShelfIterator.bookShelf,(3));voidmain()structBookShelfbookShelf;bookShelf.index=0;//将书籍上架,省略代码//将bookShelf与bookShelfIterator相关联bookShelfIterator.bookShelf=(4);structIteratoriterator;iterator.hasNext=BShasNext;iterator.next=BSnext;structBook*b;while((5))//遍历书架,输出书名b=iterator.next();printf("%s/n",b->name);
问答题阅读下列说明和图,回答问题1至问题3。【说明】图书管理系统详细记录图书库存情况、读者信息及读者借阅记录(包括借书日期和还书日期)。新书入库时要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期。同一个书名由于版次、作者等不同有可能存在多“种”图书,其间用“分类目录号”区分。系统为每一位合法读者编制一个唯一的借书证号,读者需要提供姓名、单位。一个读者最多可以同时借阅5本图书。借阅图书时,新添借阅记录,并将对应的“归还标记”字段置为“false”,表示“尚未归还”;归还图书时,将相应的“归还标记”字段置为“true”,表示“已经归还”。一本书可能供多位读者借阅,同一本书读者可以重复借阅。如图9-17所示为该系统的E-R图。
