问答题阅读以下说明和C++代码,填补C++代码中的空缺(1)~(6),将解答写在答题纸的对应栏内。[说明]已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算);另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。下面是实现该工资系统的C++代码,其中定义了四个类:工资系统类PayRoll,员工类Employee,正式工类Salaried和计时工类Hourly,Salaried和Hourly是Employee的子类。
问答题【说明】 本程序的功能是实现任意两个大整数的乘法运算,例如: 输入整数1:8934793850094505800243958034985058 输入整数2:234584950989689084095803583095820923 二者之积: 209596817742739508050978890737675662366433464256830959194834854876 8534 【C++代码】 #include<iostream.h> const int MAXINPUTBIT=100; const int MAXRESULTBIT=500; class LargeNumber int i,j; int temp; int one[MAXINPUTBIT+1]; int onebit; //one的位数 int two[MAXINPUTBIT+1]; int twobit; //two的位数 int result[MAXRESULTBIT+1]; public: LargeNumber(); ~LargeNumber(); int inputone(); //出错返叫0,否则返回1 int inputtwo(); //同上 void multiplication(); //乘 void clearresult(); //清零 void showresult(); //显示 ; LargeNumber∷LargeNumber() for(i=0;i<=MAXINPUTBIT;i++) one[i]=0; two[i]=0; onebit=0; twobit=0; inputone(); inputtwo(); LargeNumber∷~LargeNumber() int LargeNumber∷inputone() char Number[MAXINPUTBIT+1]; cout<<"Please enter one:"; cin>>Number; i=0; j=MAXINPUTBIT; while(Number[i]!='/0') i++; onebit=i; for(i--;i>=0;i--,j--) if(int(Number[i])>=48 //由字符转换为数字 else return 0; return 1; int LargeNumber∷inputtwo() char Number[MAXINPUTBIT+1]; cout<<"Please enter two:"; cin>>Number; i=0; j=MAXINPUTBIT; while(Number[i]!='/0') i++; twobit=i; for(i--;i>=0;i--,j--) if(int(Number[i])>=48 //由字符转换为数字 else return 0; return 1; void LargeNumber∷multiplication() //乘法 clearresult(); int m; for(i=MAXINPUTBIT;i>=0;i--) temp=two[i]; for(j= (2) ,m=MAXINPUTBIT;m>=0;m--,j--) result[j]+=temp*one[m]; if(result[j]>9) result[j-1]+=result[j]/10; (3) ; cout<<"one*two="; showresult(); void LargeNumber∷showresult() i=0; while(result[i]==0 if(i>MAXRESULTBIT) cout<<"0"; //输出0 for(;i<=MAXRESULTBIT;i++) cout<< (4) ; cout<<endl; void LargeNumber∷clearresult() for(i=0;i<=MAXRESULTBIT;i++) (5) ; void main() LargeNumber a; a.multiplication();
问答题试题六
阅读下列函数说明和C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[函数6 说明]
函数DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)的功能是:将线性表A 中关键码为key1 的结点开始的len 个结点,按原顺序移至线性表B 中关键码为key2的结点之前,若移动成功,则返回0;否则返回-1。线性表的存储结构为带头结点的单链表,La 为表A 的头指针,Lb 为表B 的头指针。单链表结点的类型定义为:
typedef struct node {
int key;
struct node *next;
}*LinkedList;
[函数6]
int DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)
{ LinkedList p,q,s,prep,pres;
int k;
if (!La->next||!Lb->next||len next; prep = La;
while ( p p = p->next;
}
if (!p) return -1; /*表A 中不存在键值为key1 的结点*/
q = p; k = 1;
while (q k++;
}
if (!q) return -1; /*表A 中不存在要被删除的len 个结点*/
s = Lb->next; (3) ;
while (s s = s->next;
}
if (!s) return -1; /*表B 中不存在键值为key2 的结点*/
(4) = q->next; /*将表A 中的len 个结点删除*/
q->next = (5) ;
pres->next = p; /*将len 个结点移至表B*/
return 0;
}
问答题【说明】
下面代码里,instr是一个抽象类,它被两个子类wind和rain分别实现,而brass又继承了wind类,并覆盖了play方法。
【程序】
{{U}} (1) {{/U}}class instr{
{{U}} (2) {{/U}}Void play();
}
class wind{{U}} (3) {{/U}}instr{
void play(){System.out.println("wind play!");}
}
class rain extends instr {
void play(){System.out.println("rain play!");}
}
class brass extends{{U}} (4) {{/U}}{
void play(){System.out.println("brass play!"));}
}
public class music{
static void tuneAll(instr e[]){
for(int i=0;i<e.length;i++)
e[i].play();
}
public{{U}} (5) {{/U}}void main(String[]args){
instr orch[]=new instr[3];
int i=0;
orch[i++]=new wind();
orch[i++]=new rain();
orch[i++]=new brass();
tuneAll(orch);
}
}
问答题阅读以下算法说明和C程序,根据要求回答问题1和问题2。【说明】【算法4-1】的功能是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号而没有对应的左括号或者右括号,则给出相应的提示信息,如图1-18所示。在【算法4-1】中,slack为一整数栈。算法中各函数的说明如表1-11所示。{{B}}表1-11各函数的功能说明表{{/B}}{{B}}函数名{{/B}}{{B}}函数功能{{/B}}push(inti)将整数i压入栈stack中Pop()stack的栈顶元素出栈Empty()判断stack栈是否为空。若为空,函数返回1,否则函数返回0Nextch()读取文本文件中的下一个字符,并返回该字符的ASCII值,将字符所在的行号及字符在行中的位置分别存储到变量row和col中,若遇到文件结束符,则将变量EOF置为trueKind(charch)判断字符ch是左括号还是右括号,若是左括号,函数返回1:若是右括号,函数返回2;若两者都不是,函数返回0【算法4-1】将栈stack置空,置EOF为falseCh<-nextch();while(notEOF) k←kind(ch); if(k=={{U}} (1) {{/U}}){ push({{U}} (2) {{/U}}); push({{U}} (3) {{/U}});} elseif(k=={{U}} (4) {{/U}}) if(notempty()){ pop(); pop();) else{ 显示错误信息(缺少对应左括号或右括号): 显示行号row:显示列号col:) Endif Endif Ch<-nextch();endwhileif(notempty()) 显示错误信息(缺少对应左括号或右括号): While(notempty()){ row<-pop(); col<-pop(): 显示行号row:显示列号col;) EndwhileEndif 为了识别更多种类的括号,对【算法4-1】加以改进后得到【算法4-2】。【算法4-2】能够识别圆括号、方括号和花括号(不同类型的括号不能互相匹配)。改进后,函数kind(charch)的参数及其对应的返回值如表1-12所示。 {{B}}表1-12函数kind(charch)的参数及其对应的返回值{{/B}}ch(){}[]其他返回值1234567【算法4-2】将栈stack置空,置EOF为falseCh<-nextch();while(notEOF){k<-kind(ch);if(k>0)if(判断条件1){push({{U}}(5){{/U}});push({{U}}(6){{/U}});push({{U}}(7){{/U}});}elseif(判断条件2and判断条件3){pop();pop();pop();}else{显示错误信息(缺少对应左括号或右括号);显示行号row;显示列号col;)endifendifch<-nextch();)endwhileif(notempty()){显示错误信息(缺少对应左括号或右括号);While(notempty()){Pop();row<-pop():col<-pop();显示行号row;显示列号col;))endwhileendif
问答题【说明】
本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。
【代码】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*replace(char *s1, char *s2,char *s3)
{ char *p, *q, *r, *s; int |2,|3, i=0;
|2=strlen(s2);
|3=strlen(s3);
p=s1;
while((p=strstr(p,s2))!=NULL)
{ i++; /* 统计s2串出现的次数*/
{{U}} (1) {{/U}};
}
i={{U}} (2) {{/U}};
s=r=(char*)malloc(i); /*分配动态内存存放新字符串*/
p=s1;
while(1)
{ q=strstr(p, s2); /* s2串是否在s1中出现,q是首次出现的位置*/
if(q!=NULL)
{ i=q-p;
{{U}}(3) {{/U}};
r+=i;
{{U}}(4) {{/U}};
r+=|3;
p=q+|2; /*将指向s1串的指针移到s2子串出现的位置后,
为下一次循环做好准备*/
}
else /*q为空,表示剩余的s1串中已经没有s2*/
{ {{U}}(5) {{/U}};
break; /*终止循环*/
}
}
return(s); /*返回指向所形成的新串的指针*/
}
void main()
{ char *a="sabcababde", *b="ab", *c="efg", *d;
d=replace(a, b, c); printf("result=%s/n", d); free(d);
}
问答题【说明】 对20个数进行排序,可以利用选择法,即从后19个比较过程中,选择一个最小的与第一个元素交换,依次类推,即用第二个元素与后18个进行比较,并进行交换。 【函数】 #define N 20 main() int i,j,min,tem,a[N]; printf("please input twenty num:/n"); for(i=0;i<N;i) printf("a[%d]=",i); scanf("%d", printf("/n"); for(i=0;i<N;i) printf(",",a[i]); printf("/n"); for(i=0; (1) ;i) min= (2) ; for(j= (3) ;j<N;j++) if( (4) ) min=j; tem=a[i]; (5) ; a[min]=tem; printf("After sorted /n"); for(i=0;i<N;i++) printf(",",a[i]);
问答题【说明】 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。 【函数】 main() int number[20],n,m,i; printf("the total numbers is:"); scanf("%d", printf("back m:"); scanf("%d", for(i=0;i<=n-1;i) scanf("%d,", (1) ; for(i=0;i<=n-1;i) printf("%d,",number[i]); move(array,n,m) int n,m,array[20]; int *p,array_end; array_end= (2) ; for(p=array[n-1]; (3) ;p--) *p= (4) ; *array=array_end; m--; if(m>0) (5) ;
问答题【说明】
下面待修改的C程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。
下面给出的C程序代码中有五个错误,请指出所有的错误。
【C程序代码】
01 #include <stdio.h>
02
03 int main()
04 {
05 long n, num;
06 int i;
07
08 do {
09 printf("请输入一个正整数:");
10 scanf("%ld", n);
11 }while(n <= 0);
12 k = 1;
13 for (i = 1; n >= 0; i++) {
14 if (i % 2 = 1) {
15 num= num+ (n % 10) * k;
16 k = k * 10;
17 }
18 n = n / 10;
19 }
20 printf("新数据为: %d /n",num);
21 return 0;
22 }
问答题【说明】该应用程序是用来修改文本框中的字体属性,其运行窗口如图4所示。窗口由1个标签(Labell)、1个文本框(txtPassage)和4个选择框(chkFont,chkltalic,chkSize,chkColor)组成。程序运行后,用户在文本框内输入一段文字,然后按需要单击各选择框,用以改变文本的字体、字型、颜色及大小。文本框的Mulitine属性已经设为True。当不选择“黑体”时,文字应是“宋体”。当不选择“大小16”时,字号为9。当不选择“紫色”时,字色为黑色。当不选择“斜体”时,文字采用正常字型。【程序代码】PrivateSubchkFontClick()If{{U}}(1){{/U}}ThentxtPassage.FontName="黑体"ElsetxtPassage.FontName="宋体"EndIfEndSubPrivateSub{{U}}(2){{/U}}()IfchkColor.Value=1ThentxtPassage.ForeColor=QBColor(13)ElsetxtPassage.ForeColor=QBColor(0)EndIfEndSubPrivateSubchkltalic_Click()Ifchkltalic.Value=1ThentxtPassage.Fontltalic={{U}}(3){{/U}}ElsetxtPassage.Fontltalic={{U}}(4){{/U}}EndIfEndSubPrivateSubchkSizeClick()If{{U}}(5){{/U}}ThentxtPassage.Font.Size=16ElsetxtPassage.Font.Size=9EndIfEndSub
问答题【说明】 该程序运行后,输出下面的数字金字塔 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 ...... 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 【程序】 #include < stdio. h > main ( ) char max, next; int i; for( max = '1'; max <= '9'; max + +) for(i=1;i<=20- (1) ;++i) printf(" "); for(next = (2) ;next <= (3) ;next ++) printf(" %c" ,next); for(next= (4) ;next>= (5) ;next--) printf(" %c" ,next); printf(" /n" );
问答题【说明】对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。{{B}}表6-14结构数组Ht{{/B}}{{B}}数组下标{{/B}}chweightparentlchildrchild1 a 2 5 0 02 b 7 7 0 03 c 4 5 0 04 e 5 6 0 05 6 6 1 36 11 7 4 57 18 0 2 6结构数组Ht的类型定义如下:#defineMAXLEAFNUM20structnode{charch;/*扫当前节点表示的字符,对于非叶子节点,此域不用*/Intweight;/*当前节点的权值*/intparent;/*当前节点的父节点的下标,为0时表示无父节点*/intlchild,rchild;/*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/)Ht[2*MAXLEAFNUM];用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数voidLeafCode(introot,intn)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。函数voidDecode(char*buff,introot)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。【函数4.1】char**HC;voidLeafCode(introot,intn){/*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/intI,p=root,cdlen=0;charcode[20];Hc=(char**)malloc((n+1)*sizeof(char*));/*申请字符指针数组*/For(i=1;i<=p;++I)Ht[i].weight=0;/*遍历最优二叉树时用做被遍历节点的状态标志*/While(p){/*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/If(Ht[p].weight==0){/*向左*/Ht[p].weight=1;If(Ht[p].lchild!=0){p=Ht[p].lchild;code[cdlen++]='0';}elseif(Ht[p].rchild==0){/*若是叶子节点,则保存其前缀编码*/Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));{{U}}(1){{/U}};strcpy(Hc[p],code);}}elseif(Ht[p].weight==1){/*向右*/Ht[p].weight=2;If(Ht[p].rchild!=0){p=Ht[p].rchild;code[cdlen++]='1';}}else{/*Ht[p].weight==2,回退/Ht[p].weight=0;p={{U}}(2){{/U}};{{U}}(3){{/U}};/*退回父节点*/}}/*while.结束*/}【函数4.2】voidDecode(char*buff,introot){intpre=root,p;while(*buff!='/0'){p=root;while(p!=0){/*存在下标为p的节点*/pre=p;if({{U}}(4){{/U}})p=Ht[p].lchild;/*进入左子树*/elsep=Ht[p].rchild;/*进入右子树*/elsebuff++;/*指向前缀编码序列的下一个字符*/}{{U}}(5){{/U}};printf("%c",Hr[pre].ch);}}
问答题【说明】 著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。以下C程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。该程序中用1~4分别表示4种颜色。要着色的N个区域用0~-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域了相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i,所着颜色。 【C程序】 #include <stdio.h> #define N 10 void output(int color[]) /*输出一种着色方案*/ int i ; for ( i = 0 ; i < N ; i++ ) printf( "%4d" , color[i] ) ; printf ("/n") ; int back(int *ip ,int color[] ) /*回溯*/ intc = 4 ; while ( c == 4 ) if ( *ip <= 0 ) return 0 ; -- (*ip) ; c = (1) ; color[*ip] =-1 ; return c ; /*检查区域i,对c种颜色的可用性*/ int colorOk(int i , intc , int [] [N] ,int color[ ] ) int j ; for (j = 0 ; j < i ; j++ ) if ( (2) ) return 0 ; return 1 ; /*为区域i选一种可着色的颜色*/ int select (int i ,int c ,int adj [] [N] ,int color[ ] ) int k ; for(k = c ; k <= 4 ; k++ ) if( colorOK( (3) )) return k ; return 0 ; int coloring(int adj [] [N]) /*寻找各种着色方案*/ int color[N] , i , c , cnt ; for(i = 0 ; i < N ; i++) color[i] =-1 ; i = c = 0 ; cnt = 0 ; while(1) if((c = (4) ) == 0 c = back( if( c == 0 ) return cnt; else (5) ; i++ ; if i == N) output(color); ++cnt ; c = back( else c = 0 ; void main()( int adj[N] [N] = 0,1,0,1,1,1,1,1,1,1, 1,0,1,1,0,1,1,1,1,0, 0,1,0,1,0,1,1,0,1,1, 1,1,1,0,1,1,0,0,1,1, 1,0,0,1,0,1,0,0,0,0, 1,1,1,1,1,0,1,0,0,1, 1,1,1,0,0,1,0,0,1,0, 1,1,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,1,1,0,1, 1,0,1,1,0,1,0,1,1,0, ; printf("共有%d组解./n",coloring(adj));
问答题[函数2.1说明]
函数strcpy的功能是将字符串str2的内容复制到字符申str1。
[函数2.1]
{{U}}(1) {{/U}}strcpy (char *slr1, const char *str2)
{ char * temp;
while( * str2!='/0') *cp++ ={{U}} (2) {{/U}};
{{U}}(3) {{/U}}='/0';
return str1;
}
[函数2.2说明]
函数int strcmp(const char *str1, const char *str2)的功能是按字典序比较两个字符串str1和str2的大小。当str1<str2时返回-1,当str1>str2时返回1,否则返回0。
[函数2.2]
int strcmp(const char *str1, const char *str2)
{ while( *str1= =* str2) {
if(* s1= = {{U}}(4) {{/U}} ) return 0;
s1++;
{{U}}(5) {{/U}};
}
if( *str1<*str2) return -1;
return 1;
}
问答题[说明]
二叉树的二叉链表存储结构描述如下:
lypedef struct BiTNode
{ datatype data;
street BiTNode *lchiht, *rchild; /*左右孩子指针*/ } BiTNode, *BiTree;
下列函数基于上述存储结构,实现了二叉树的几项基本操作:
(1) BiTree Creale(elemtype x, BiTree lbt, BiTree rbt):建立并返回生成一棵以x为根结点的数据域值,以lbt和rbt为左右子树的二叉树;
(2) BiTree InsertL(BiTree bt, elemtype x, BiTree parent):在二叉树bt中结点parent的左子树插入结点数据元素x;
(3) BiTree DeleteL(BiTree bt, BiTree parent):在二叉树bt中删除结点parent的左子树,删除成功时返回根结点指针,否则返回空指针;
(4) frceAll(BiTree p):释放二叉树全体结点空间。
[函数]
BiTree Create(elemtype x, BiTree lbt, BiTree rbt) { BiTree p;
if ((p = (BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL;
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
{{U}} (1) {{/U}};
}
BiTree InsertL(BiTree bt, elemtype x,BiTree parent)
{ BiTree p;
if (parent= =NULL) return NULL;
if ((p=(BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL;
p->data=x;
p->lchild={{U}} (2) {{/U}};
p->rchild={{U}} (2) {{/U}};
if(parent->lchild= =NULL) {{U}}(3) {{/U}};
else{
p->lchild={{U}} (4) {{/U}};
parent->lchild=p;
}
return bt;
}
BiTree DeleteL(BiTree bt, BiTree parent)
{ BiTree p;
if (parent= =NULL||parent->lchild= =NULL) return NULL;
p= parent->lchild;
parent->lchild=NULL;
freeAll({{U}} (5) {{/U}});
return bt;
}
问答题【说明】本程序通过移动滑动条修改颜色RGB值,从而控制颜色。程序中有一个面板、3个标签和3个滑动条,标签和滑动条一一对应,分别对应三原色红、绿、蓝,任意拖动其中的一个滑动条,所对应的颜色值就会发生变化,面板的颜色也会发生对应的变化,如下图所示,滑动条值的范围是0~255。【Java代码】importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclasssimpleextendsJFrameimplementsAdjustmentListener{publicsimple(){setTitle("simple");setSize(300,200);addWindowListener(newWindowAdapter(){publicvoidwindowClosing({{U}}(1){{/U}}){System.exit(0);}});ContainercontentPane=getContentPane();JPanelp={{U}}(2){{/U}};p.setLayout(newGridLayout(3,2));p.add(redLabel=newJLabel("Red0"));p.add(red=newJScrollBar(Adjustable.HORIZONTAL,0,0,0,255));red.setBlocklncrement(16);red.addAdjustmentListener(this);p.add(greenLabel={{U}}(3){{/U}}("Green0"));p.add(green=newJScrollBar(Adjustable.HORIZONTAL0,0,0,255));greensetBIocklncrement(16);green.addAdjustmentListener(this);p.add(blueLabel=newJLabel("Blue0"));p.add(btue=newJScrollBar(Adjustable.HORIZONTAL,0,0,0,255));blue,setBIocklncrement(16);blue.addAdjustmentListener(this);contentPane.add(p,"South");colorPanet=newJPanel();colorPanet.setBackground(newColor(0,0,0));contentPane.add({{U}}(4){{/U}},"Center");}publicvoidadjustmentValueChanged(AdjustmentEventevt){redLabel.setText("Red"+red.getValue());greenLabel.setText("Green"+green.getValue());blueLabel.setText("Blue"+blue.getValue());coiorPanel.setBackground(newColor(red.getValue(),green.getValue(),blue.getValue()));colorPanel.repaint();}publicstaticvoidmain(String[]args){JFramef={{U}}(5){{/U}};f.show();}privateJLabelredLabel;privateJLabelgreenLabel;privateJLabelblueLabel;privateJScrollBarred;privateJScroilBargreen;privateJScrollBarblue;privateJPanelcolorPanel;
问答题【说明】
本程序利用非递归算法实现二叉树后序遍历。
【函数】
#include<stdio.h>
#include<stdlib.h>
typedef struct node{/*二叉树的结点数据结构类型*/
char data;
struct node *left;
struct node *right;
}BTREE;
void SortTreelnsert(BTREE **tree, BTREE *s)
{
if(*tree==NULL)*tree=s;
else
if(s->data<(*tree)->data)
SortTreelnsert({{U}} (1) {{/U}},s);
else if(s->data>=(*tree)->data)
SortTreelnsert({{U}} (2) {{/U}},s);
}
void TraversalTree(BTREE *tree)
{
BTREE *stack[1 000],*p;
int tag[1000],top=0;
p=tree;
do{
while(p !=NULL)
{
stack[++top]=p;
{{U}} (3) {{/U}};
tag[top]=0; /*标记栈顶结点的左子树已进行过后序遍历*/
}
while(top>0
putchar(p->data);
}
if(top>0)/*对栈顶结点的右子树进行后序遍历*/
{
{{U}} (5) {{/U}};
tag[top]=1;
}
}while(top>0);
}
void PrintSortTree(BTREE *tree)
{
if(tree !=NULL)
{
printSortTree(tree->left);
putchar(tree->data);
pdntSortTree(tree->right);
}
}
main()
{
BTREE *root=NULL, *node;
char ch;
ch=getchar();
while(ch !='#')
{
node=(BTREE*)malloc(sizeof(BTREE));
node->data=ch;
node->left=node->right=NULL;
SortTreelnsert(
ch=getchar();
}
PrintSortTree(root);
putchar('/n');
TraversalTree(root);
}
问答题阅读下列说明、图和C++代码,回答问题1至问题3。【说明】已知四个类之间的关系如图2-2所示,分别对每个类的方法进行编号,例如Shape的perimeter()方法为1号,表示为1:perimeter(),Rectangle类的perimeter()为2号,表示为2:perimeter(),依此类推,其中,每个类的perimeter方法都为虚函数且方法签名相同。【C++代码】Triangle*tr=newTriangle();Square*sq=newSquare();Shape*sh=tr;
问答题阅读以下说明和C++代码,填充代码中的空缺,将解答填入答题纸的对应栏内。[说明]某应急交通控制系统(TraficControlSystem)在红灯时控制各类车辆(Vehicle)的通行,其类图如下图所示,在紧急状态下应急车辆红灯时也可通行,其余车辆按正常规则通行。类图下面的C++代码实现以上设计,请完善其中的空缺。[C++代码]#include<typeinfo>#include<iostream>usingnamespacestd;classVehicle{/*抽象基类,车辆*/public:virtualvoidrun()=0;};classEmergency{/*抽象基类,可在红灯时通行的接口,函数均为纯虚函数*/public:______=0;//isEmergent()函数接口______=0;//runRedLight()函数接口};classCar:publicVehicle{public:~Car(){}voidrun(){/*代码略*/));classTruck:publicVehicle{public:~Truck(){}voidrun(){/*代码略*/});classPoliceCar:______{private:boolisEmergency;public:PoliceCar():Car(),Emergency(){this->isEmergency=false;}PoliceCar(boolb):Car(),Emergency(){this->isEmergency=b;}~P0liceCar(){}boolisEmergent(){return______}voidrunRedLight(){/*代码略*/});/*类Ambulance、FireEngine实现代码略*/classTraficControlsystem{/*交通控制类*/private:Vehicle*v[24];intnumVehicles;/*在构造函数中设置初始值为0*/public:voidcontrol(){//控制在紧急情况下应急车辆红灯通行,其他情况按常规通行for(inti=0;i<numVehicles;i++){Emergency*ev=dynamic_cast<Emergency*>(v[i]);if(ev!=0)______->runRedLight();else______->run();}}voidadd(Vehicle*vehicle){v[numVehicles++]=vehicle;}/*添加车辆*/voidshutDown(){for(inti=0;i<numVehicles;i++){deletev[i];}}};intmain(){TraficControlSystem*tcs=newTraficControlSystem;tcs->add(newCar());tcs->add(newPoliceCar());tcs->add(newAmbulance());tcs->add(newAmbulance(true));tcs->add(newFireEngine(true));tcs->add(newFireEngine());tcs->add(newTruck());tcs->contr01();tcs->ShutDown();deletetcs;}
问答题阅读以下说明和Java程序,填充代码中的空缺,将解答填入答题纸的对应档内。
【说明】
某学校在学生毕业时要求对其成绩进行综合评定,学生的综合成绩(GPA)由其课程加权平均成绩(Wg)与附加分(Ag)构成,即GPA=Wg+Ag。
设一个学生共修了n门课程,则其加权平均成绩(Wg)定义如下:
其中,gradei、Ci分别表示该学生第i门课程的百分制成绩及学分。
学生可以通过参加社会活动或学科竞赛获得附加分(Ag)。学生参加社会活动所得的活动分(Apoints)是直接给出的,而竞赛分(Awards)则由下式计算(一个学生最多可参加m项学科竞赛):
其中,li和Si分别表示学生所参加学科竞赛的级别和成绩。
对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为0计算。
下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类Student描述,包括学号(stuNo)、姓名(name)、课程成绩学分(grades)和综合成绩(GPA)等,参加社会活动的学生由类ActStudent描述,其活动分由Apoints表示,参加学科竞赛的学生由类CmpStudent描述,其各项竞赛的成绩信息由awards表示。
[Java代码】
abstract class Student{
protected String name;
protected int stuNo;
protected double GPA; /*综合成绩*/
protected int[][]grades; /*各门课程成绩和学分*/
//其他信息略
public Student(int stuNo,String name,int[][]grades){
this.stuNo=stuNo;this.name=name;this.grades=grades;
}
____(1)____;
double computeWg(){
int totalGrades=0,totalCredits=0:
for(int i=0;i<grades.length;i++){
totalGrades+=grades[i][0]*grades[i][1];
totalCredits+=grades[i][1];
}
return(double)totalGrades/totalCredits;
}
}
class ActStudent extends Student{
private int Apoints;
ActStudent(int stuNo,String name,int[][]grades,int Apoints){
____(2)____;
this.Apoints=Apoints;
}
public double getGPA(){
return GPA=____(3)____;
}
}
Class CmpStudent extends Student{
Private int[][]Awards;
CmpStudent(int stuNo,String name,int[][]grades,int[][]awards){
____(4)____;
this.Awards=awards;
}
publ ic double getGPA(){
int totalAwards=0;
for(int I=0;i<Awards.length;i++){
totalAwards+=Awards[i][0]*Awards[i][1];
}
return GPA=____(5)____;
}
}
public class GPASystem{//以计算3个学生的综合成绩为例进行测试
public static void main(String[]args){
int g1[][2]={{80,3),{90,2},{95,3},{85,4},{86,3)),
g2[][2]={{60,3),{60,2},{60,3},{60,4},{65,3)),
g3[][2]={{80,3},{90,2},(70,3},{65,4},{75,3));//课程成绩
int[][]e1={{2,3},{1,2)},e2={{1,3});//竞赛成绩
Student student[]={
new ActStudent(i01,”John”,g1,3),//3为活动分
new ActStudent(102,”Zhang”,g2,0),
new ActStudent(103,”Li”,g3,e2),
};
//输出每个学生的综合成绩
for(int i=0;i<student.length;i++){
System.out.println(____(6)____);
}
}
}
