填空题[问题2] 使用关系代数表达式写出查询所有年龄在20岁以下的学生姓名和年龄。
填空题[说明]在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树型结构,如图4-1所示。信号源是树根,树中的每个节点(除了根)表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。每个节点有一个d值,表示从其父节点到该节点的信号衰减量。例如,在图4-1中,节点w、p、q的d值分别为2、1、3,树根节点表示信号源,其d值为0。每个节点有一个M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的M值为0。对于非叶子j,M(j)=maxM(k)+d(k)|k是j孩子节点,在此公式中,要计算节点的M值,必须先算出其所有子节点的M值。在计算M值的过程中,对于某个节点i,其有一个子节点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器,否则,从节点i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点i处放置放大器并不能解决到达叶子节点的信号衰减问题。例如,在图4-1中,从节点p到其所有叶子节点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得节点p的M值为2。同样,需要在节点q、v处放置信号放大器,如图4-2阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号源输出的信号等价。函数placeBoosters(TreeNode*root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。全局变量Tolerance保存信号衰减容忍值。树的节点类型定义如下:typedefstructTreeNodeintid;/*当前节点的识别号*/intChildNum;/*当前节点的子节点数目*/intd;/*父节点到当前节点的信号衰减值*/structTreeNode**childptr;/*向量,存放当前节点到其所有子节点的指针*/intM;/*当前节点到其所有子节点的信号衰减值中的最大值*/boolboost;/*是否在当前节点放置信号放大器的标志*/TreeNode;[C语言函数]voidplaceBooster(TreeNode*root)/*计算root所指节点处的衰减量,如果衰减量超出容忍值,则放置放大器*/TreeNode*p;inti,degradation;if((1))degradation=0;root->M=0;i=0;if(i>=root->ChildNum)return;p=(2);for(;i<root->ChildNumi++,p=(3))(P->M=0;(4);if(p->d+p->M>Tolerance)/*在P所指节点中放置信号放大器*/P->boost=true;P->M=0;if(p->d+p->M>degradation)degradation=p->d+p->M;Root->M=(5);
填空题[说明] 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 main ( ) int n, i; printf ( "/n please input a number: /n"); scanf ( "% d" , printf ( "%d =" ,n); for( (1) ) while( (2) ) if( (3) ) printf ("%d*",i); (4) else break; printf (“%d”,n);
填空题[说明] 所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。 应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。 函数中使用的预定义符号如下: #define M 100 typedef struct/为两端点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 t1[M]; int n = 10; [函数] float distance(tpd a, tpd b);/*计算端点a、b之间的距离*/ void sortArr(tdr a[M], int m); /*将已经计算好的距离关系表按距离大小从小到大排序形成排序表, m为边的条数*/ int isCircuit(tr r[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], t1 1 [W]);/*从端点关系表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 = ______; dr[k].p1 = i; dr[k].p2 = j; m = k; sortArr (dr, m);/*按距离大小从小到大排序形成排序表*/ do b = i; 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(______) selected(r, i, j); /*最后一边选入r成回路,完成输出结果*/ h++; dist += dr[k].x; while((k != n) if((h == n)) /*最后一边选入构成回路, 完成输出结果*/ course(r, locus); else/*找不到解, 调整dr, 交换表中边长相同的边在表中的顺序, 并将b置0*/ ______; while(!b);
填空题[问题4] 在E-R模型中,如果实体间是1:N的联系,如何设计相应部分的关系模型?
填空题[问题1] 如果将上述应用的数据库设计成如下关系模式;
RS (A#,A1,A2,A3,B#,B1,B2,D1),请指出该关系模式的候选键。
填空题[问题1] 试解释这个对象联系图。
填空题[问题2] 用边界值分析法设计测试用例,检查逻辑覆盖标准。
填空题[问题2] 试用ORDB的定义语言,定义这个数据库。
填空题[说明] 假设二叉树采用连接存储结构进行存储,root 指向根接点,p 所指结点为任一给定的结点,编写一个求从根结点到p所指结点之间路径的函数。 void path (root, p) btree * root, * p; Btree *stack[m0], *s; int tag[m0], top =0, i, find =0; s =root; do while (s ! = NULL) stack [top] = s; tag[top] =0; ( (1) ) if (top >0) ( (2) ) if (tag[top] = =1) if( (3) ) for (i=1; i< =top; i+ + printf ("%d" ,stack[i]- >data); find=1; else top - -; if( (4) ) p=p- >right; ( (5) ) while (find || (s! = NULL
填空题#include <stdio. h> void main( ) int digit; long in , s; seanf(" % Id", (1) ; (2) ; while(in >0) (3) ; s = s + digit* digit; (4) ; pfinff( "sum = % 1dn", s );
填空题[说明]在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据,先打印销售票据内容,然后再打印脚注。图显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。[C++代码]classComponentpublic:______voidprtTicket()=0;;classSalesTicket:publicComponentpublic:voidprtTicket()cout<<"SalesTicket!"<<endl;;classDecorator:publicComponentpublic:virtualvoidprtTicket();Decorator(Component*myC);private:______myComp;;Decorator∷Decorator(Component*myC)myComp=myC;voidDecorator∷prtTicket()myComp->prtTicket();classFooter:publicDecoratorpublic:Footer(Component*myC);voidprtTicket();voidprtFooter();;Footer∷Footer(Component*myC):______voidFooter∷prtFooter()cout<<"Footer"<<end1;voidFooter∷prtTicket()______;prtFooter();classSalesOrderpublic:voidprtTicket();;voidSalesOrder∷prtTicket()Component*myST;myST=newFooter______;myST->prtTicket();
填空题[说明] 已有一个工程文件,窗体上有两个图片框,名称为P1,P2。分别用来表示信号灯合汽车,其中在P1中轮流装入“黄灯.ico”、“红灯.ico”、“绿灯.ico”文件来实现信号灯的切换;还有两个计时器 Timer1 和Timer2,Timer1 用于变换信号灯,黄灯1秒,红灯2秒,绿灯3秒;Timer2用于控制汽车向左移动。运动时,信号灯不断变换,单击“开车”按钮后,汽车开始移动,如果移动到信号灯前或信号灯下,遇到红灯或黄灯,则停止移动。下面是实现上述功能的程序,请填空。 Private Sub Timer41_ Timer() a=a+1 If (1) Then a=1 End If Select Case a Case 1 P1. Picture = LoadPicture( “黄灯.ico” ) Case 2, 3 P1. Picture = LoadPicture( “红灯”.ico” ) Case4, 5, 6 P1. Picture = LeadPicture( “绿灯. ico” ) (2) End Select End Sub Private Sub Timer2_Timer( ) If (3) And (P2. Left > P1. Left And P2. Left < P1. Left + P1. Width) Or P2. Left < = 100 Then Timer2. Enabled = False Else (4) End If End Sub
填空题阅读下列函数说明和C代码,将应填入 (n) 外的字句写在对应栏内。 [说明] 为网球比赛的选手安排比赛日程。设有n(n=2m)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。 设n位选手被顺序编号为1,2,…,n,比赛的日程表是一个n行n-1列的表,第i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛日程导出全体2m选手的比赛日程。从众所周知的只有两位选手的比赛日程出发,反复这个过程,直至为n位选手安排好比赛日程为止。 如两位选手比赛日程表如下所示: 1 1 2 2 1 如四位选手比赛日程表如下所示: 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 函数中使用的预定义符号如下: #define M 64 int a[M+1][M]; [函数] voidd main() int twoml,twom,i,j,m,k; printf("指定n(=2的k次幂)位选手,请输入k:/n"); scanf("%d",&k); /*8预设两位选手的比赛日程*/ a[1][1] =2; a[2][1] =1; m=1; twoml=1; while ( (1) ) m++; twoml+=twoml; twom=twoml*2;/*为2^m位选手安排比赛日程*/ /*填日程表的左下角*/ for(i=twoml+1; (2) ;i++) for(j=1; j a[i][j]=a[i-twoml][j]+twoml; /*填日程表的右上角*/ a[1][twoml]= (3) ;/+填日程表右上角的第1列*/ for(i=2; i a[i][twoml]=a[i-1][twoml]+1; /*填日程表右上角的其他列,参照前一列填当前列*/ for(j=twoml+1; j(twom;j++) for(i=1; i a[i][j]= (4) ; a[twoml][j]=a[1][j-1]; /*填日程表的右下角*/ for(j=twoml; j for(i=1;i a[ (5) [j]=i; /*输出日程表*/ for(i=1; i for(j=1;j printf("%4d",a[i][j]); printf("/n"); printf("/n");
填空题[说明] 编写一工资调整程序。若基本工资大于等于800元,工资增加20%,若小于800元大于 600元,则工资增加15%,若小于600元则工资增加10%。要求在文本框Text1 中增加某职工的基本工资,单击“计算”按钮,在标签框Label1中输出增加后的工资。 Private Sub Command1_ Click( ) Dim x As Integer, y As Single (1) Select Case x Case Is > = 800 y=x*1.2 Case Is > = 600 y=x, 1.5 (2) y=x*1.1 (3) Label1. Caption = y (4) Private Sub Command2_ Click() Unload Me End Sub
填空题[说明] 编写一个Application,从键盘输入整数n,并计算从1到n的累加和。
import java. io. *;
public class Application1 {
public static void main(String [] args) {
String s = " ";
int n, sum = 0;
System. out. println (“计算从1到n 的累加和。”);
System. out. print( “请输入n的值:”);
try {
{{U}}(1) {{/U}}
BufferedReader br = new BufferedReader(isr);
{{U}}(2) {{/U}}
}
catch(Exception e) { }
{{U}} (3) {{/U}}
for(int i=l; i< =n; i++)
{{U}} (4) {{/U}}
System. out. println ( “你刚才的输入是:” + n);
System. out. println ( “1到n的累加和是:”+ sum);
}
}
填空题阅读以下说明和程序流程图,将应填入{{U}}(n){{/U}}处的字句写在对应栏内。[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。注:数组下标从0开始。流程图(图4-1)用于计算长整数的加(减)法。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注,此处不考虑溢出情况,即数组足够大。这样在程序中引进两个指针pA和pB,分别指向绝对值较大者和较小者。而对绝对值相加,情况,让pA指向LA,pB指向LB,不区分绝对值大小。pA±pB可用通式pA+flag*pB来计算,flag为+1时即对应pA+pB,flag为-1时即对应pA-pB。需特别注意的是,对于相减,不够减时要进行借位,而当最高位借位后正好为0时,结果的总位数应减1;对于加法,有最高进位时,结果的总位数应加1。流程图中涉及的函数说明如下:(1)cmp(int*LA,int*LB)函数,用于比较长整数LA与LB的绝对值大小,若LA绝对值大于LB绝对值则返回正值,LA绝对值小于LB绝对值返回负值,相等则返回0。(2)max(intA,intB)函数,用于返回整数A与B中较大数。另外,对流程图中的写法进行约定:(1)“:=”表示赋值,如“flag:=LA[0]+LB[0]”表示将“LA[0]+LB[0]”的结果赋给flag,相当于C中的赋值语句:“flag=LA[0]+LB[0];”;(2)“:”表示比较运算,如“flag:1”表示flag与1比较。
填空题[说明]现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图显示了各个类间的关系。这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是JAVA语言实现,能够正确编译通过。[Java代码]//DP1.java文件publicclassDP1staticpublicvoiddraw_a_line(doublex1,doubley1,doublex2,doubley2)//省略具体实现//DP2.java文件publicclassDP2staticpublicvoiddrawline(doublex1,doubley1,doublex2,doubley2)//省略具体实现//mrawing.java文件______publicclassDrawingabstractpublicvoiddrawLine(doublex1,doubley1,doublex2,doubley2);//VlDrawing.java文件publicclassVlDrawingextendsDrawingpublicvoiddrawLine(doublex1,doubley1,doublex2,doubley2)DP1.draw_a_line(x1,y1,x2,y2);//V2Drawing.java文件publicclassV2DrawingextendsDrawingpublicvoiddrawLine(doublex1,doubley1,doublex2,doubley2)//画一条直线______;//Shape.java文件abstractpublicclassShapeabstractpublicvoiddraw();private_______dp;Shape(Drawingdp)_dp=dp;protectedvoiddrawLine(doublex1,doubley1,doublex2,doubley2)______;//mectangle.java文件publicclassRectangleextendsShapeprivatedouble_x1,_x2,_y1,_y2;publicRectangle(Drawingdp,doublex1,doubley1,doublex2,doubley2)______;_x1=x1;_x2=x2;_y1=y1;_y2=y2;publicvoiddraw()//省略具体实现
填空题阅读以下函数说明和Java代码,将应填入 (n) 处的字句写在对应栏内。 [说明] 很多时候,希望某些类只有一个或有限的几个实例,典型解决方案是所谓单身(Singleton)模式。但在多线程情况下,Singleton模式有可能出现问题,需要进行同步检查。如果对“检查singleton对象是否已经创建”进行同步,则存在严重的瓶颈,所有的线程都必须等待检查对象是否存在。解决方式是一种称为Double-Checked-Locking模式,其意图是将非必须的锁定优化掉,同步检查最多只发生一次,因此不会成为瓶颈。以下是Java语言实现,能够正确编译通过。 [Java代码] public class USTax private static USTax instance=null; (1) USTax() private (2) static void doSync() if(instance==null) System.out.println("实例不存在,创建实例.."); instance= (3) ; System.out.println("实例创建成功"); else System.out.println("实例已被创建了"); public static USTax getInstance() if(instance==null) System.out.println("实例暂时不存在"); (4) ;//同步控制 else System.out.println("实例已经存在"); return (5) ;
填空题[说明]函数combine(a,b,c)是计算两个整数的组合数。由于计算结果可能超出long整型的可表示范围,故采用数组方式存储,例如:k位长整数m用数组c[]存储结构如下:m=c[k]×10k-1+c[k-1]×10k-2+…+c[2]×10+c[1],利用c[0]存储长整数m的位数,即c[0]=k。数组的每个元素只存储长整数m的一位数字,长整数运算时,产生的中间结果的某位数字可能会大于9,这是就应该调用format将其归整,使数组中的每个元素始终只存储长整型的一位数字。整数据a和b(a≥b)的组合为:,其中u1=a,u2=a-1,…,ub=a-b+1,d1=1,d2=2,…,db=b。为了计算上述分式,先从u1,u2,…,ub中去掉d1×d2×…×db的因子,得到新的u1,u2,…,ub,然后冉将它们相乘。[函数]#defineMAXN100intgcd(inta,intb)//求两个整数a和b的最大公因子if(a<b)intc=a;a=b;b=c;for(inti=b;i>=2;i--)if(______)returni;return1;voidformat(int*a)//将长整型数纰归整inti;for(i=1;i>a[0]‖a[i]>=10;i++)if(i>=a[0])______;a[i+1]+=a[i]/10;a[i]=a[i]%10;if(i>a[0])______;voidcombine(inta,intb,int*c)inti,j,k,x;intd[MAXN],u[MAXN];k=0;for(i=a;i>=a-b+1;i--)u[++k]=i;u[0]=b;for(i=1;i<=b;i++)d[i]=i;for(i=i;i<=u[0];i++)//从u各元素去掉d中整数的因子for(j=i;j<=b;j++)x=gcd(u[i],d[j]);//计算最大公约数u[i]/=x;d[j]/=x;______;c[1]=1;长整数C初始化for(i=i;i<=u[0];i++)//将u中各整数相乘,存于长整数C中if(u[i]!=1)for(j=i;j<=c[0];j++)e[j]=______;format(c);//将长整数c归整
