填空题[问题3] 将关系模式R分解到BCNF
填空题阅读以下说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [说明] 下面程序用来将打乱的单词还原为原来的次序,比如将rty还原为try。单词的原来次序存储于wordlist.txt文件中,原则上可用穷举法(rty对应的穷举为:rty、ryt、try、tyr、ytr、yrt),但考虑到破译速度,采用如下方法。 注意到单词列表中不存在组成字符完全相同的单词(如Hack12与Hack21包含完全相同的字符),因此将单词中的字符进行重组再进行比较,例如,try单词重组为rty(按ASCⅡ码顺序),这样不管打乱的单词是什么顺序,只要是由r、t、y三个字母组成的均破译为try,大大提高破译速度。程序中借助二叉排序树以进一步提高查找效率,二叉排序树左子树(如果有)上的节点对应的值均小于根节点的值,右子树(如果有)上的节点对应的值均大于根节点的值。 函数中使用的符号定义如下: #define NumberofWords 1275//单词总数 #define MaxLength 10//最长单词所含字符数 char WordList[NumberofWords][MaxLength];//存储单词列表 int cmp(Node *q,Node *p);//q与p比较。p小,返回负值;P大返回正值:相等,返回0 typedef struct Node(//二叉树节点 char *eleLetters;//重组后的字符串 int index;//对应单词表中的下标 struct Node *lChiId,*rChiid;//左右子节点 Node; [C代码] void reCompose(Node *p,char *temp) //重纰,亦即将temp字符串中的字符升序排序,存储于p节点中 //采用直接插入排序法 char c; strcpy(p->eleLetters,temp);// int len=strlen(temp); int i,j,k; for(i=0;i<len-1;i++) k=i; for(j=i+1;j<lan;j++) if(p->eleLetters[j]<P->eleLetters[k])k=J; if( (1) ) C=P->eleLetters[i]; P->eleLetters[i]=P->eleLetters[k]; P->eleLetters[k]=c; //if //for ; int find(Node root,char *temp) //在二叉排序树root中查找与temp匹配的单词。 //若匹配返回相应单词在WordList中下标;若查找失败,返回-1 Node *P,*q; int flag; P= (2) ;//临时存储 reCompose(p,temp);//将temp重组 q=root; while((flag= (3) )&&q !=NULL) if(flag<0)//搜索左子树 q=q->lChiid; else(//搜索右子树 q=q->rChild; //while if(flag==0)//找到匹配的,保存下标 return (4) ; if( (5) )//查找失败 printf("cant unscramble the following word:%s",temp);; return -1; ;
填空题如下的SQL语句是用于查询“每个学生的选修课程数、总成绩、平均成绩”的不完整语句,请在空缺处填入正确的内容。 SELECT Student.SNo, (1) ,SUM(Grade),AVG(Grade) FROM Student,Grade WHERE Student.SNo=Grade.SNo, GROUP BY (2) ;
填空题阅读下列函数说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [说明] HufTman树又称最优二叉树,是一类带权路径长度最短的树,在编码中应用比较广泛。 构造最优二叉树的Huffman算法如下: ①根据给定的n各权值W1,w2,…,wn)构成n棵二叉树的集合F=T1,T2,…,Tn,其中每棵树Ti中只有一个带权为wi的根节点,其左右子树均空。 ②在F中选取两棵根节点的权值较小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根节点的权值为其左右予树根节点的权值之和。 ③从F中删除这两棵树,同时将新得到的二叉树加入到F中。 重复②③,直到F中只剩一棵树为止。 函数中使用的预定义符号如下: #define INT MAX 10000 #define ENCODING LENGTH 1000 typedef enum(none,left_child,right_child) Which; /*标记是左孩子还足右孩子*/ typedef char Elemtype; typedef struct TNode//Huffman树节点 Elemtype letter; int weight; //权值 int parent; //父节点 Which sigh; char *code; //节点对应编码 HTNode,*HuffmanTree; int n; char coding[50];//储存代码 [函数] void Select(HuffmanTree HT,int end,int *sl,int *s2) /*在0~END之间,找出最小和次小的两个节点序号,返吲S1、S2*/ int i; int min 1=INT_MAX; int min 2=INT_MAX; for(i=0;i<=end;i++)/*找最小的节点序号*/ if(( (1) )&&(HT[i].weight<minl)) *s1=i; min 1=HT[i].weight; for(i=0;i<=end;i++)/*找次小节点的序号*/ if((HT[i].parent==0)&&( (2) ) &&(min 2>HT[i].weight)) *s2=i; min 2=HT[i].weight; void HuffmanTreeCreat(HuffmanTree&HT)/*建立HUFFMAN树*/ int i; int m=2*n-1; int s1,s2; for(i=n;i<m;i++) Select( (3) ); HT[s1].parent=i; HT[s2].parent=i; HT[s1].sigh=left child; HT[s2].sigh=right child; HT[i].weight= (4) ; void HuffmanTreeEncoding(char sen[],HuffmanTree HT) /*将句子进行编码*/ int i=0; int j; while(sen[i] !='\0') for(j=0;j<n;j++) if(HT[j].letter==sen[i])(/*字母吻合则用代码取代*/ strcat(coding, (5) ); break; i++; if (Sen [1]==32) i++; printf("/n%s",coding);
填空题[说明] 假设二叉树采用连接存储结构进行存储,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;
({{U}} (1) {{/U}})
}
if (top >0)
{
({{U}} (2) {{/U}})
if (tag[top] = =1)
{
if({{U}} (3) {{/U}})
{
for (i=1; i< =top; i+ + printf ("%d" ,stack[i]- >data);
find=1;
}
else top - -;
}
if({{U}} (4) {{/U}})
{
p=p- >right;
({{U}} (5) {{/U}})
}
}
} while (find || (s! = NULL
}
填空题[说明]现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图显示了各个类间的关系。这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是C++语言实现,能够正确编译通过。[C++代码]classDP1public:staticvoiddraw_a_line(doublex1,doubley1,doublex2,doubley2)//省略具体实现;classDP2public:staticvoiddrawline(doublex1,doublex2,doubley1,doubley2)//省略具体实现;classDrawingpublic:______voiddrawLine(doublex1,doubley1,doublex2,doubley2)=0;classViDrawing:publicDrawingpublic:voiddrawLine(doublex1,doubley1,doublex2,doubley2)DP1∷draw_a_line(x1,y1,x2,y2);;classV2Drawing:publicDrawingpublic:voiddrawLine(doublex1,doubley1,doublex2,doubley2)______;;classShapeprivate:_______dp;public:Shape(Drawing*dp);virtualvoiddraw()=0;voiddrawLine(doublex1,doubley1,doublex2,doubley2);;Shape∷Shape(Drawing*dp)_dp:dp;voidShape∷drawLine(doublex1,doubley1,doublex2,doubley2)//画一条直线______;classRectangle:publicShapeprivate:double_x1,_y1,_x2,_y2;public:Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2);voiddraw();;Rectangle∷Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2):_______x1=x1;_y1=y1;_x2=x2;_y2=y2voidRectangle∷draw()//省略具体实现
填空题[说明]某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式的类图如下图所示。Command模式的类图[java代码]classLight{publicLight(){};publicLight(stringname){/*代码省略*/}publicvoidon(){/*代码省略*/}//开灯publicvoidoff(){/*代码省略*/}//关灯}:________{publicvoidexecute();}classLightonCommandimplementsCommand{//开灯命令Lightlight;publicLightonCommand(Lightlight){this.light=light;}publicVoidexecute(){________;}}classLightoffCommandimplementsCommand{//关灯命令Lightlight;publicLightoffCommand(Lightlight){this,light=ight;}publicVoidexecute(){________;}}classRemoteControl{//遥控器Command[]onCommands[7];Command[]offCommands[7];PublicRemoteControl(){/*代码省略*/}PublicvoidsetCommand(intslotCommandonCommand,CommandoffCommand){________=onCommand;________=offCommand;}PublicvoidonButtonWasPushed(intslot){________;}PublicvoidoffButtonWasPushed(intslot){________;})classremoteLoader{publicstaticvoidmain(string[]args){RemoteControlremoteControl=newRemoteControl();LightlivingRoomLight=newLight("LivingRoom");LightkitchenLight=newLight("kitchen");LightonCommandlivingRoomLighton=newLightonCommand(livingRoomLight);LightoffCommandlivingRoomLightoff=newLightoffCommand(livingRoomLight);LightonCommandkitchenLighton=newLightonCommand(kitchenLight);LightoffCommandkitchenLightoff=newLightoffCommand(kitchenLight);remoteControl.setCommand(0,livingRoomLighton,livingRoomLightoff);remoteControl.setCommand(1,kitchenLighton,kitchenLightoff);remoteControl.onButtonWasPushed(0);remoteControl.offButtonWasPushed(0);remoteControl.onButtonWasPushed(1);remoteControl.offButtonWasPushed(1);}}
填空题[说明] 从键盘输入一个字符ch,输出该字符在文本文件input.txt 的每一行中出现的次数。(必须调用函数鳋统计ch的出现次数,函数ff (str,ch)的功能是统计并返回字符ch在字符串str 中出现的次数。)。例如:如果文件input. txt 中存放了下列数据: every 121 I am a student运行程序,并输入e后,输出: 2 0 1 int ff( char * str, char ch) int count =0; while ( (1) ) if( *str= =ch) count++; str ++; return count; # include < stdio. h > # include < stdlib. h > void main( ) char ch, c, s [80]; int k; FILE *fp; if( (2) ) printf( “打不开文件!n”); return; ch = getchar( ); k=0; while( ! feof(fp) ) c = fgete(fp); if (3) s[k++ ] =c; else s[k]= "; printf ( "%dn" ,ff(s, ch) ); k=0; (4) printf( "% dn", ff( s, ch ) );
填空题[说明] 编写一个学生类Student,要求:
(1) 学生类Student 属性有:
id: long 型,代表学号
name: String类对象,代表姓名
age: int 型,代表年龄
sex: boolen 型,代表性别(其中:true 表示男,false 表示女)
phone: String 类对象,代表联系电话
(2) 学生类Student 的方法有:
Student (long i,String n,int a,boolean s,String p)
:有参构造函数,形参表中的参数分别初始化学号、姓名、
年龄、性别和联系电话。
int getAge ():获取年龄作为方法的返回值。
boolean getSex ():获取性别作为方法的返回值。
String getPhone ():获取联系电话作为方法的返回值。
public String to String ():以姓名:性别:学号:联系电话的形式作为方法的返
import java. applet. Applet;
import java. awt.* ;
public class Student extends Applet {
long id;
String name, phone;
int age;
boolean sex;
Student(long i, String n, int a, boolean s, String p)
{
id=i;
name = n;
age = a;
sex= s;
phone = p;
{
public void paint( Graphics g)
{
Student x= new Student (5000," xiaoliu" , 89, true, " 8989898" );
{{U}} (1) {{/U}};
{{U}} (2) {{/U}}
g. drawstring( x. getPhone( ), 140,140);
}
int getAge( )
{ return age; }
boolean getsex ( )
{ return sex; }
String getPhone( )
{ return phone; }
String ToString( )
{
{{U}} (3) {{/U}}
}
}
填空题阅读以下说明和Jrdva代码,将应填入(n)处的字句写在对应栏内。[说明]在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据。图6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。[图6-1][Java代码]//Component.java文件public(1)classComponentabstractpublicvoidprtTicket();//salesTicket.java文件publicclassSalesTicketextendsComponentpublicvoidprtTicket()//SalesticketprintingcodehereSystem.out.printin("SalesTicket");//Decorator.java文件publicabstractclassDecoratorextendsComponentpublicvoidprtTicket()if(myComp!=null)myComp.prtTicket();private(2)myComp;publicDecorator(ComponentmyC)myComp=myC;//Footer.java文件publicclassFooterextendsDecoratorpublicFooter(ComponentmyC)(3);publicvoidprtTicket()(4);prtFooter();publicvoidprtFooter()//placeprintingfootercodehereSystem.out.println("Footer");//salesorder.java文件publicclassSalesOrdervoidprtTicket()ComponentmyST;myST=newFooter((5));//PrintTicketwithfootersasneededmyST.prtTicket();
填空题[说明]一般的树结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩予节点和下一个兄弟节点。例如,图4-1(a)所示的树的孩子-兄弟表示如图4-1fb)所示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对图4-1所示的树进行层序遍历时,节点的访问次序为:DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示。Bool、Status类型定义如下:typedefenumFALSE=0,TRUE=1Bool;typedefenumOVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1Status;树的二叉链表节点定义如下:typedefstructNodechardata;;structNode*fimrstchiid,*nextbrother;Node,*TreeNode;[函数]StatusLevelTraverse(TreeNoderoot)/*层序遍历树,树采用孩子-兄弟表示法,root是树根节点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue(&tempQ);(1);brotherptr=root->nextbrother;while(brotherptr)EnQueue((2);/*end-while*/while((3))(4);printf("%c\t",ptr->data);if((5))continue;(6);brotherptr=ptr->firstchild->nextbrother;while(brotherptr)EnQueue((7);/*end-while*//*end-while*/returnOK;)/*LevelTraverse*/
填空题[说明] 打印输出10行杨晖三角形。形式如下:杨晖三角形:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 11 7 21 35 35 21 7 11 8 28 56 70 56 28 8 11 9 36 84 126 126 84 36 9 1 class yanghui public static void main (String args [] ) int i, j; (1) int yanghui [] []; System. out. println( “杨晖三角形:” ); yanghui = new int [ yhleve1] []; for(i =0;i < yanghui, length; i + + ) yanghui[i] = new int [i + 1]; (2) for( (3) ) yanghui [i] [0] = 1; for(j = 1 ;j < yanghui[i], length - 1 ;j + + ) yanghui[i] [j] = yanghui[i - 1] [j - 1] + yanghui[i - 1] [j]; yanghui[i] [yanghui[i]. length - 1 ] = 1; for ( i=0; i < yanghui. length; i + + ) for(j =0;j < yanghui[i]. length; j + + ) (4) System. out. println( );
填空题阅读以下说明和程序流程图,将应填入(n)处的字句写在对应栏内。[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数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比较。
填空题[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+...+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。注:数组下标从0开始。流程图用于计算长整数的加(减)法。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注,此处不考虑溢出情况,即数组足够大。这样在程序中引进两个指针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比较。
填空题阅读下列函数说明和C代码, [说明] 所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。 应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。 函数中使用的预定义符号如下: #define M 100 typedef struct/*x为两端点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 tl[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],tl l[M]);/*从端点关系表r中得出回路轨迹表*/ void exchange(tdr a[M],int m,int b); /*调整表排序表,b表示是否可调,即是否有长度相同的边存在*/ void travling(tpd pd [M],int n,float dist,tl 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= (1) ; dr[k].pl=i; dr[k].p2=j; m=k; sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/ do b=1; dist=0; k=h=0: do k++; i=dr[k].p1; j=dr[k].p2; if((r(i].n<=1)(r[j].n<=1))/*度数不能大于2*/ if (2) /*若边(i,j)加入r后形成回路,则不能加入*/ (3) ; h++; dist+=dr[k].x; else if (4) /*最后一边选入r成回路,则该边必须加入且得到解*/ selected(r,i,j); h++: dist+=dr[k].x; while((k !=n) (h !=n)); if(h==n)/*最后一边选入构成回路,完成输出结果*/ course(r,locus); else(/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/ (5) ; while(!b);
填空题阅读以下说明和程序流程图,将应填入(n)处的字句写在对应栏内。[说明]当一元多项式中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指受和对应系数。为了便于进行运算,用带头节点的单链表存储,头节点中存储多项式中的非零项数,且各节点按指数递减顺序存储。例如:多项式8x5-2x2+7的存储结构为:流程图图3-1用于将pC(Node结构体指针)节点按指数降序插入到多项式C(多项式POLY指针)中。流程图中使用的符号说明如下:(1)数据结构定义如下:#defineEPSI1e-6structNode/*多项式中的一项*/doublec;/*系数*/inte;/*指数*/StructNode*next;;typedefstruct/*多项式头节点*/intn;/*多项式不为零的项数*/structNode*head;POLY;(2)Del(POLY*C,structNode*p)函数,若p是空指针则删除头节点,否则删除p节点的后继。(3)fabs(doublec)函数返回实数C的绝对值。[图3-1]
填空题Private Sub Command1_ Click( )
If List1. ListIndex > ={{U}} (1) {{/U}}Then List1. RemoveItem{{U}} (2) {{/U}}Label1. Caption ={{U}} (3) {{/U}}
Else
MsgBox “请选择要删除的项目”
End If
End Sub
填空题[说明]以下函数完成求表达式的值,请填空使之完成此功能。floatsum(floatx)floats=0.0;intsign=1;(1);for(inti=1;(2);i++)t=t*x;s=s+(3);sign=-sign;(4);
填空题
阅读以下说明和Jrdva代码,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。
[说明]
在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据。图6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。
[图6-1] [Java代码]
//Component.java文件 public{{U}} (1) {{/U}}class
Component { abstract publ ic void prtTicket();
} //salesTicket.java文件 public class
SalesTicket extends Component{ public void prtTicket(){
//Sales ticket printing code here
System.out.printin("SalesTicket"); } }
//Decorator.java文件 publ ic abstract class
Decorator extends Component{ public void prtTicket(){
if(myComp!=null)myComp.prtTicket(); }
private{{U}} (2) {{/U}}myComp; public
Decorator(Component myC){ myComp=myC; }
} //Footer.java文件 public
class Footer extends Decorator { public Footer(Component myC){
{{U}} (3) {{/U}}; }
public void prtTicket(){ {{U}} (4) {{/U}};
prtFooter(); } publ ic void
prtFooter(){ //place printing footer code here
System.out.println("Footer"); } }
//salesorder.java文件 public class SalesOrder{
void prtTicket(){ Component myST;
myST=new Footer({{U}} (5) {{/U}}); //Print Ticket
with footers as needed myST.prtTicket(); }
}
填空题
阅读下列函数说明和C代码,将应填入{{U}} (n) {{/U}}外的字句写在对应栏内。
[说明]
为网球比赛的选手安排比赛日程。设有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 ({{U}} (1) {{/U}}){
m++; twoml+=twoml;
twom=twoml*2;/*为2^m位选手安排比赛日程*/ /*填日程表的左下角*/
for(i=twoml+1;{{U}} (2) {{/U}};i++){ for(j=1;
j a[i][j]=a[i-twoml][j]+twoml;
} } /*填日程表的右上角*/
a[1][twoml]={{U}} (3) {{/U}};/+填日程表右上角的第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]={{U}} (4) {{/U}}; }
a[twoml][j]=a[1][j-1]; } /*填日程表的右下角*/
for(j=twoml; j for(i=1;i a[{{U}} (5) {{/U}}[j]=i; }
} /*输出日程表*/ for(i=1;
i for(j=1;j
printf("%4d",a[i][j]); } printf("/n");
} printf("/n"); }
}