问答题阅读以下说明和图,根据要求回答问题1~问题4。[说明]某电子商务公司开办了在线电子商务网站,主要为各注册的商家提供在线商品销售功能。为更好地吸引用户,该公司计划为注册的商家提供商品(Commodity)促销(Promotion)功能。商品的分类(Category)不同,促销的方式和内容也会有所不同。注册商家可发布促销信息。商家首先要在自己所销售商品的分类中,选择促销涉及的某一具体分类,然后选出该分类的一个或多个商品(一种商品仅属于一种分类),接着制定出一个比较优惠的折扣政策和促销活动的优惠时间,最后由系统生成促销信息并将该促销信息公布在网站上。商家发布促销信息后,网站的注册用户便可通过网站购买促销商品。用户可选择参与某一个促销(Promotion)活动,并选择具体的促销商品(Commodity),输入购买数量等购买信息。系统生成相应的一份促销订单(POrder)。只要用户在优惠活动的时间范围内,通过网站提供的在线支付系统,确认在线支付该促销订单(即完成支付),就可以优惠的价格完成商品的购买活动,否则该促销订单失效。系统采用面向对象方法开发,系统中的类及类之间的关系用UML类图表示,如图6-18所示是该系统类图中的一部分;系统的动态行为采用UML序列图表示,如图6-19所示是发布促销的序列图。
问答题创建S表时,SNo使用CHAR(5)并且唯一,SName使用CHAR(30),Status使用CHAR(8),City使用CHAR(20)。请在下列用于创建表S的SQL语句空缺处填入正确的内容。
CREATE TABLE S(SNo CHAR(5),
SName CHAR(30),
Status CHAR(8),
City CHAR(20),
______;
问答题【说明】某考务处理系统主要功能是考生管理和成绩管理:1.对考生送来的报名表进行检查。2.对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3.对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4.填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5.根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图1-1所示,第0层图如图1—2所示,加工2子图如图1-3所示。【数据流图】1.【问题1】指出哪张图的哪些文件可以不必画出。
问答题试题六(共15分)阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图6-1所示。图6-1设计类图
问答题阅读下列程序和控制流图,将应填入{{U}}(n){{/U}}的字句。【程序】下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。intGetMax(intn,intdatalist[]){intk=0;for(intj=1;j<n;j++)if(datalist[j]>datalist[k])k=j;returnk;}【控制流图】
问答题[说明]对二叉树进行遍历是二叉树的一个基本运算。遍历是指按某种策略访问二叉树的每个节点,且每个节点仅访问一次的过程。函数InOrder()借助栈实现二叉树的非递归中序遍历运算。设二叉树采用二叉链表存储,节点类型定义如下:typedefstructBtNode{ElemTypedata;/*节点的数据域,ElemType的具体定义省略*/structBtNode*lchild,*rchild;/*节点的左、右孩子指针域*/}BtNode,*BTree;在函数InOrder()中,用栈暂存二叉树中各个节点的指针,并将栈表示为不含头节点的单向链表(简称链栈),其节点类型定义如下:typedefstructStNode{/*链栈的节点类型*/BTreeelem;/*栈中的元素是指向二叉链表节点的指针*/structStNode*link;}StNode;假设从栈顶到栈底的元素为en,en-1,…,e1,则不含头节点的链栈示意图如下图所示。[C程序]intInOrder(BTreeroot)/*实现二叉树的非递归中序遍历*/{BTreeptr;/*ptr用于指向二叉树中的节点*/StNode*q;/*q暂存链栈中新创建或待删除的节点指针*/StNode*stacktop=NULL;/*初始化空栈的栈顶指针stacktop*/ptr=root;/*ptr指向二叉树的根节点*/while(______||stacktop!=NULL){while(ptr!=NULL){q=(StNode*)malloc(sizeof(StNode));if(q==NULL)return-1;q→elem=ptr;______;stacktop=q;/*stacktop指向新的栈顶*/ptr=______;/*进入左子树*/}q=stacktop;______;/*栈顶元素出栈*/visit(q);/*visit是访问节点的函数,其具体定义省略*/ptr=______;/*进入右子树*/free(q);/*释放原栈顶元素的节点空间*/}return0;}/*InOrder*/
问答题【说明】下面是一个用C编写的快速排序算法。为了避免最坏情况,取基准记录pivot时,采用从left、right和mid=[(left+right)/2]中取中间值,并交换到right位置的办法。数组a存放待排序的一组记录,数据类型为T,left和right是待排序子区间的最左端点和最右端点。 void quicksort (int a[], int left, int right) int temp; if (left<right) hat pivot = median3 (a, left, right); //三者取中子程序 int i = left, j = right-1; for(;;) while (i <j while (i <j if(i<j) temp = a[i]; a[j] = a[i]; a[i] = temp; i++; j--; else break; if (a[i] > pivot) temp = a[i]; a[i] = a[right]; a[right] = temp; quicksort( (1) ); //递归排序左子区间 quieksort(a,i+1 ,right); //递归排序右子区间 void median3 (int a[], int left, int right) int mid= (2) ; int k = left; if(a[mid] < a[k])k = mid; if(a[high] < a[k]) k = high; //选最小记录 int temp = a[k]; a[k] = a[left]; a[left] = temp; //最小者交换到 left if(a[mid] < a[right]) temp=a[mid]; a[mid]=a[right]; a[right]=temp;消去第二个递归调用 quicksort (a,i+1,right)。 采用循环的办法:void quicksort (int a[], int left, int right) int temp; int i,j; (3) int pivot = median3(a, left, right); //三者取中子程序 i = left; j = righi-1; for (;; ) while (i<j while (i<j if(i <j) temp = a[i]; a[j]; = a[i]; a[i]=temp; i++; j--; else break; if(a[i]>pivot) (4) ;a[i]=pivot; quicksoft ( (5) ); //递归排序左子区间 left = i+1;
问答题[说明]使用MFC的CSocket类在两个或者多个应用程序之间建立通信。服务器应用程序先创建一个特殊的Socket,用于监听客户应用程序的连接请求,然后再创建新的Socket来完成连接。从客户和服务器两端读取该连接,直到一个需要处理的报文到来为止。以下C++程序将封装这些功能,这样所有应用程序需要完成的只是创建一个Socket连接,然后处理到来的报文。这将包括一个新的服务器Socket类、新客户端Socket类和新的报文队列类。创建新的服务器Socket类程序的框架如下。第1个函数ListenEx()用于通知Socket开始监听客户应用程序。第2个函数OnAccept()在接收到连接请求时被调用。在其中创建新的Socket,并立刻设置它开始从客户应用程序读取报文,这些是通过调用第3个函数RecvThread()来完成的,该函数位于它自己的线程中。[C++程序][ListenEX()函数]
问答题[说明]已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图3-28所示。[Java代码]
问答题阅读下列某网上订书管理系统的说明和E-R图,根据要求回答问题1~问题3。[说明]某网上订书系统的E-R图(已消除了不必要的冗余)如图6-17所示(图中没有标出主码)。图中实体的说明如表6-10所示,相关属性说明如表6-11所示。{{B}}表6-10某网上订书系统实体说明 表6-11某网上订书系统相关属性说明{{/B}}{{B}}实体{{/B}}{{B}}说明{{/B}}{{B}}主要属性{{/B}}{{B}}说明{{/B}}Books书店内的书qty_in_stock图书库存量Customers与书店有业务的顾客year_published出版日期Orders顾客向书店下的购书单ordernum购书单编号cid顾客编号bid唯一标识每种图书的编码cardnum顾客信用卡号码orderdate填购书单日期qty订购某种图书的数量ship_date发货日期一个顾客可以在同一天填写多张购书单,每张购书单上可填写多种图书,每种图书可以订购多本,bid相同的图书在同一张购书单上不能出现多次。注:为简化起见,不考虑信用卡号码泄漏所带来的安全性等问题。
问答题【说明】[程序6说明]单源最短路径的分支限界算法。const int MAXNUM=29999;#include<iostream>#include<vector>#include<algorithm>#include<functional>using namespace std;template <class VertexType,class EdgeType>class MinNode //程序中使用的最小化堆的结点说明friend class Graph<VertexType,EdgeType>public:MinNode (int nl, EdgeType length1) VexNum=nl;length=length1;bool operator>(const MinNode<VertexType,EdgeType> //记录源点序号,序号数组p及distance下标相一致。源点为初始扩展顶点 EdgeType length; //记录源点到本顶点的当前最短路径的长度,源点到自身的长度为0template<class VertexType,classEdgeType>void Graph<VertexType,EdgeType>:: shortestpath(VertexType start) int j,k,source;//source 记录源点的序号。 EdgeType*distance= (2) ; int*p=new int[MaxNumVertex]; vector<MinNode<VertexType,EdgeType> >H; for(source=0;source<MaxNumVertex;source++) if(NodeList[source]==start)break; if (source>=MaxNumVertex)cout<<”This is error!”<<end1;return; MinNode<VertexType,Edge Type> (3) ; for(k=0;k<MaxNumVertex;k++) distance[k]:MAXXUM; //记录源点到本顶点k的最终的最短路径的长度 p[k]=source; //记录最短路径上的本顶点的直接前驱顶点的序号 distance[source]=0;p[source]=-1;//m 是源点,前一顶点不存在 vector<MinNode<VertexType, EdgeType>>::iterator q; while(1) for(j=0;j<MaxNumVertex;j++) if((AdjMatrix[E.VexNum* MaxNumVertex+j]<MAXNUM) &&( (4) <distance[j])) distance[j]=E.length+AdjMatrix[E.VexNum* MaxNumVertex+j]; p[j]=E. VexNum; //记录顶点j的前一顶点 MinNode<VertexType, EdgeType> (5) ; H.push_ back(N); push_heap(H. begin(),H.end(),greater<MinNode<VertexType, EdgeType>>()); if(H.empty()=true)break; //若优先队列为空,那么算法结束 else pop_ heap(H.begin(),H. end(),greater<MinNode<VertexType, EdgeType>>()); q=H.end()-1; //从最小化堆中取路径最短的顶点 E=*q; H.pop_ back(); //删除从最小化堆中“挤”出的顶点 //end while for(k=0;k<MaxNumVertex;k++) cout<<"Shorstest path from vertex"<<k<<"is"<<distance[k]<<end1; j=k;cout<<"All vertices are:"; while(j!=source)cout<<j<<"->";j=p[j]; cout<<source<<”.”<<end1; //打印顶点的最短路径长度和至源点的最短路径上经过的顶点序列 return;
问答题【问题1】
根据上述说明和实体-联系图,得到该住房管理系统的关系模式如下所示,请补充住宿关系。
房间(房间号,收费标准,床位数目)
客人(身份证号,姓名,性别,出生日期,地址)
住宿({{U}} (1) {{/U}},入住日期,退房日期,预付款额)
问答题【说明】下面是一个Applet程序,其功能是建立一个图形用户界面的窗口,包括一个文本显示区和一个按钮,点击按钮,可以在文本区已有的文本基础上追加显示10条"WelcometoChina"信息,并且文本区由滚动条控制文本的上下滚动。程序运行结果如图4所示。importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;/*<appletcode="ex5_6.class"width=800height=400></applet>*/publicclassex5_6extendsJApplet{JButtonjb=newJButton("AddText");JTextPanejtp=newJTextPane();publicvoidinit(){jb.addActionListener(newActionListener()){publicvoidactionPerformed(ActionEvente){for(inti=1;i<10;i++){{U}}(1){{/U}}+"WelcometoChina!/n";}};Containercp={{U}}(2){{/U}};cp.add(newJScrollPane(jtp));cp.add({{U}}(3){{/U}});}publicstaticvoidmain(String[]args){ex5_6obj5_6=newex5_6();Stringstr=obj5_6.getClass().toString();if(str.indexOf("class")!=-1)str=str.Substring(6);JFramefrm=newJFrame(str);frm.addWindowListener(new{{U}}(4){{/U}}{publicvoidwindowClosing(WindowEventwe){System.exit(0);}});{{U}}(5){{/U}}.add(ex5_6);frm.setSize(300,400);frm.setVisble(true);}}ex5_6.htm|<HTML><HEAD><TITLE>ex5_6</TITLE></HEAD><BODY><appletcode="ex5_6.class"Width=800height=400></applet></BODY></HTML>
问答题[函数5]
int DeleteNode(Bitree *r,int e){
Bitree p=* r,pp,s,c;
while({{U}} (1) {{/U}}){/ * 从树根结点出发查找键值为e的结点 * /
pp=p;
if(e<p->data) p=p->Lchild;
else p=p->Rchild
}
if(! p)return-1;/ * 查找失败 * /
if(p->Lchild && p->Rchild){/ * 处理情况③ * /
s={{U}} (2) {{/U}};pp=p;
while({{U}} (3) {{/U}}){pp=s;s=s->Rchild;}
p->dara=s->data;P=s;
}
/ * 处理情况①、② * /
if({{U}} (4) {{/U}})c=p->Lchild;
else c=p->Rchild
if(p==*r) *r=c;
else if({{U}} (5) {{/U}})pp->Lchild=c;
else pp->Rchild=c;
free(p);
return 0;
}
问答题根据E-R图中给出的词汇,按照“有关模式名(属性,属性,…)”的格式,将此E-R图转换为3个关系模式,指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。
问答题[问题1]
试将[算法2-1)和[算法2-2]中(1)~(7)处补充完整。
[问题2]
从下面的选项中选择相应的判断逻辑填补[算法2-2]中的“判断条件1”至“判断条件 3”。注意,若“判断条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。
(a)字符是括号(b)字符是左括号(c)字符是右括号(d)栈空(e)栈不空
(f)栈顶元素表示的是与当前字符匹配的左括号
(g)栈顶元素表示的是与当前字符匹配的右括号
问答题【问题4】
加工1(录入比对处理)除能够检查出初录数据和复录数据不一致外,还应当检测出下列哪些错误。
①输入的无效字符 ②输入的半个汉字 ③显示器无法显示
④初录员重复录入同一账户 ⑤汇总数据与会计账目不符 ⑥打印机卡纸
问答题【程序说明】
定义一个多边形结构:struct polygon实现以下内容:(1)建立该结构的链表:create函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为0时,链表创建结束。(3)编写一个函数disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。
【程序】
#include "iomanip.h"
struct polygon
{
int n;
int* x;
int *y;
polygon * next;
};
void Push(polygon * & head,int n)
{
polygon * newNOde=newpolygon;
newNOde=newpo,Ygon;
newNOde->next={{U}} (1) {{/U}};
newNOde->x=new int [n];
newNOde->y=new int[n];
newNOde->n={{U}} (2) {{/U}};
for(int i=0;i<={{U}} (3) {{/U}};i++){
cout<<“请输入多边形各顶点x、y坐标,坐标值之间用空格分隔:”;
cin>>newNOde->x[i]>>newNOde->y[i];
}
{{U}} (4) {{/U}}=head; //在head前不需要额外的。
head=newNOde;
}
polygon * create()
{
polygon * head=NULL;
polygon * tail;
int n;
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
if(n==0)return{{U}} (5) {{/U}};
Push(head,{{U}} (6) {{/U}};
tail=head;
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
while(n!=0)
{
Push(tail->next,{{U}} (7) {{/U}}; //在tail->next增加结点
tail =tail->next; //advance tail to point to last node
cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”;
cin>>n;
}
return head;
}
void disp(polygon * head)
{
int i,No=1;
cout<<setw(10)<<"x" <<setw(6)<<"y"<<end1;
while(head!=NULL)
{
cout<<“第” <<No<<“结点:” <<end1;
for(i=0;i<=head->n-1;i++)
cout<<setw(10)<<head- >x[i]<<setw(6)<<head- >y[i]<<endl;
{{U}} (8) {{/U}};
head={{U}} (9) {{/U}};
}//Match while statement
}
void del(polygon * head)
{
polygon * p;
while(head!=NULL)
{
p={{U}} (10) {{/U}};
head=head->next;
delete p->x;
delete P->y;
deletep;
}//Match while statement
}
void main()
{
polygon * head;
head=create();
disp(head);
del(head);
}
问答题阅读以下技术说明,根据要求回答下列问题。[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器等,其示意图见图8-18。2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到如表8-8所示的类/用例/状态列表,如图8-19所示的用例图,如图8-20所示的初始类图以及如图8-21所示的描述入口自动栏杆行为的UML状态图。表8-8类/用例/状态列表用户名说明类名说明状态名说明Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离开停车场PaymentMachine付款机器Disable没有车位ReportStatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏
问答题[说明]在数据链路层扩展局域网时使用网桥。网桥工作在数据链路层,它根据MAC帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的MAC地址,然后确认将该帧转发到哪个端口。最简单的网桥有两个端口(即接口)。网桥的每个端口与一个网段相连。每当收到一个帧时,通过查找转发表将收到的帧转发。当一个网桥刚刚连接到局域网上时,其转发表是空的,此时若收到一个帧,按照以下算法处理和建立自己的转发表:(1)从端口x收到的无差错的帧(如有差错即丢弃),在转发表中查找目的站MAC地址;(2)如有,则查找出到此MAC地址应走的端口d,然后进行(3),否则转到(5);(3)如到这个MAC地址去的端口d=x,则丢弃此帧(因为这表示不需要经网桥进行转发),否则从端口d转发此帧;(4)转到(6);(5)向网桥除x以外的所有端口转发此帧(这样做可以保证找到目的站);(6)如源站不在转发表中,则将源站MAC地址加入转发表,登记该帧进入网桥的端口号,设置计时器,然后转到(8),如源站在转发表中,则执行(7);(7)更新计时器;(8)等待新的数据帧,转到(1)。这时,网桥就在转发表中登记以下三个信息:站地址——登记收到帧的源MAC地址、端口——登记收到的帧进入该网桥的端口号、时间——登记收到的帧进入该网桥的时间。现有五个工作站分别连接在三个局域网上,并且用两个网桥连接起来,如图3-1。每一个网桥的两个端口号都标明在图上。在一开始,两个网桥中的转发表都是空的。以后有以下各站向其他的站发送了数据帧,即H1发送给H5,H3发送给H2,H4发送给H3,H2发送给H1。[图3-1]
