问答题[说明]某医院的门诊管理系统实现了为患者提供挂号、处方药品收费的功能。具体的需求及设计如下。(1)医院医师具有编号、姓名、科室、职称、出诊类型和出诊费用,其中出诊类型分为专家门诊和普通门诊,与医师职称无关;各个医师可以具有不同的出诊费用,与职称和出诊类型无关。(2)患者首先在门诊挂号处挂号,选择科室和医师,根据选择的医师缴纳挂号费(医师出诊费)。收银员为患者生成挂号单,如下表所示,其中,就诊类型为医师的出诊类型。××医院门诊挂号单收银员:13011 时间:2007年2月1日08:58就诊号姓名科室医师就诊类型挂号费20070205015叶萌内科杨玉明专家门诊5元(3)患者在医师处就诊后,凭借挂号单和医师手写处方到门诊药房交费买药。收银员根据就诊号和医师处方中开列的药品信息,查询药品库(如表1所示),生成门诊处方单(如表2所示)。(4)由于药品价格会发生变化,因此门诊管理系统必须记录处方单上药品的单价。表1药品库药品编码药品名称类型库存货架编号单位规格单价/元12007牛蒡子中药51590B1410G炒0.034011090百部中药36950B1523G片0.0313表2 ××医院门诊处方单时间:2007年2月1日10:31就诊号20070205015病人名称叶萌医师姓名杨玉明金额总计0.65项目总计2收银员21081药品编码药品名称数量单位单价/元金额/元12007牛蒡子10G0.03400.3411090百部10G0.03130.31根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下。[实体联系图](见下图)[关系模式]挂号单(就诊号,病患姓名,医师编号,时间,______)收银员(编号,姓名,级别)医师(编号,姓名,科室,职称,出诊类型,出诊费用)门诊处方(______,收银员,时间)处方明细(就诊号,______)药品库(药品编码,药品名称,______)
问答题【说明】 本题将有向网(带权有向图)定义为类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]={{U}} (1) {{/U}}; 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]={{U}} (3) {{/U}};} }//for }//forvoid AdjacencyWDigraph:: outputPath(int i, int j){ //输出顶点i到j的最短路径上的顶点 if(i==j) return; if(kay[i] [j]==0)cout<<j <<"; else { outputPath(i,{{U}} (4) {{/U}}); outputPath({{U}} (5) {{/U}});}}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;
问答题【说明】 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为: m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2] 其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数,1表示负数。 运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减的情况。注:不考虑溢出情况,即数组足够大。 【函数】 int cmp(int *LA, int *LB); /*比较长整数LA与LB的绝对值大小*/ /*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/ int ADD(int *LA, int*LB, int *LC) /*计算长整数LA与LB的和,结果存储于LC中*/ /*注意:正数与负数的和相当于正数与负数绝对值的差*/ /*数据有误返回0,正常返回1*/ if(LA==NULL || LB==NULL || LC==NULL)return 0; int *pA, *pB,i,N,carry,flag; flag=LA[0]+LB[0]; switch(flag)/*根据参与运算的两个数的符号进行不同的操作*/ case 0: case 2: LC[0]=LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/ pA=LA; pB=LB; (1) ; break; case 1:/*LA与LB异号*/ /*比较两者的绝对值大小,结果符号与较大者相同*/ flag= (2) ; if(flag>0)/*LA较大*/ LC[0]=LA[0]; pA=LA; pB=LB; else if(flag<0)/*LB较大*/ LC[0]=LB[0]; pA=LB; pB=LA; else/*LA与LB相等*/ LC[0]=0; LC[1]=0; return 1; flag=-1; break; default: return 0; break; /*switch*/ /*绝对值相加减*/ /*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减的情况*/ (3) ; N=LA[1]>LB[1]?LA[1]:LB[1]; for(i=0;i<N;i++) if(i>=pA[1])/*LA计算完毕*/ carry+=flag *pB[i+2]; else if(i>=pB[1])/*LB计算完毕*/ carry +=pA[i+2]; else carry +=pA[i+2]+flag *pB[i+2]; LC[i+2]=Carry%10; carry /=10; if( (4) )/*需要借位,针对减法*/ LC[i+2]+=10; carry--; /*for*/ if( (5) )/*最高进位,针对加法*/ LC[i+2]=carry; i++; if(LC[i+1]==0)i--;严若最高位为零,针对减法*/ LC[1]=i; return 1; ;/*ADD*/
问答题阅读下列说明和图表,回答问题1到问题3。 [说明] 在多道程序系统中,各个程序之间是并发执行的,共享系统资源。CPU需要在各个运行的程序之间来回地切换,这样的话,要想描述这些多道的并发活动过程就变得很困难。为此,操作系统设计者提出了进程的概念。 进程是具有独立功能的程序关于某个数据集合上的一次动态执行过程,是系统进行资源分配和调度的独立单位。
问答题[问题4](3分)
根据说明,给出数据流“转账请求”、“顾客订单物流查询请求”和“商家订单物流查询请求”的各组成数据项。
问答题阅读以下说明和图,根据要求回答问题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个关系模式,指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。