简答题 | 试题三(共15分) 阅读以下说明和C语言函数,将应填入__(n)__处的字句写在答题纸的对应栏内。 [说明] 函数bool Del_elem(STACK *S,char para_ch)的功能是:删除栈*s中与para_ch之值相等且最接近栈顶的元素(字符),若栈中不存在该元素,则函数返回FALSE,否则返回TRUE。其中,STACK是栈的类型名。 函数Del_lem实现上述功能的方法是c利用栈的基本操作,先将栈*s中所有比parlch之值更接近栈顶的元素暂时存放在临时工作栈s_bak中,使得与para_ch之值相等的元素成为栈顶元素,此时执行出栈操作,即从栈中删除与para_ch之值相等的元素,最后再将s_bak中的元素依次存回栈*s。 在函数Del_elem中必须使用栈的基本操作进行栈上的运算,实现栈的基本操作的 函数原型说明如下; void InitStack(STACK*S):初始化栈。 void Push(STACK*S,char e):将一个字符压栈,栈中元素数目增1。 void Pop(STACK*S);栈顶元素出栈,栈中元素数目减1。 char Top(STACK S):返回非空栈的栈顶元素值,栈中元素数目不变。 bool IsEmpty(STACK S);若S是空栈,则返回TRUE:否则返回FALSE。 bool类型定义如下: typedef enum{ FALSE=0,TRUE=1 } bool; [C语言函数] bool Del_elem(STACK *S,char para_ch) { STACK s_bak; /*定义临时工作栈s_bak */ char Ch; bool tag=FALSE; __(1)__; /*初始化临时工作栈s_bak*/ /*将栈*s中所有比para_ch更接近栈顶的元素暂时存放在临时工作栈s_bsk中*/ while(!IsEmpty(*s)){ ch=___(2)___; /*取栈顶元素:/ Pop(S); if(Ch=para_ch){ tag=TRUE: break; } ___(3)___; } /*将暂存于1临时工作栈s_bak中的元素存回栈*s*/ while (___(4)___){ Ch=Top(s_bak); ___(5)___; Push(s,ch); } return tag; } |
查看答案 |
简答题 | 试题四(共15分) 阅读以下说明和C语言函数,将应填入__(n)__处的字句写在答题纸的对应栏内。 [说明] 某工厂A负责为某大型企业B加工零件,A每天必须为B提供一定数量的零件。由于某种客观原因,A每天生产的零件的单价都不相同。若A某天生产的零件数多于B需要的数目,则多余的零件可以放到第二天及以后再使用,但需要收取每个零件的保管费 (产品单价之外附加的费用),每个零件在不同日期收取的保管费也不相同。 例如,在5天的生产中,B要求的零件需求量及A核算出的零件单价和保管费用如表1所示: A可以制订多种生产计划,但费用可能不同。例如,表2所示为生产计划及其费用。 注:(1)计划1的总费用:25*20+15*30+30*32+35*25+30*35=3835(元) (2)计划2的总费用:40*20+15*4.5+30*32+50*25+15*5.5+15*35=3685(元) (3)计划3的总费用:70*20+45*4.5+30*8+65*25+30*5.5=3632.5(元) (4)计划4不可行,虽然第一天和第二天生产的零件总数比需求量多5个,但加上第三天生产的20个零件(共25个),仍不能满足B第三天的需求量(30个)。 函数finla_plan(FILE*in)的功能是:从文件中读入若干个生产计划,从可行的计划中选出费用最小者,记录该生产计划并返回该最小费用。 全局结构体数组data[]用于保存表1所示的数据(data[0]不用),说明如下: data[i].Qty_req:int型,表示第i天的零件需求量。 data[i].Price:double型,表示第i天生产的零件单价(元)。 data[i].Keeping_fee:double型,表示第i天保管单个零件的费用(元)。 [C语言函数] int B_s[DAYS+1]; /*扫记录成本最小的生产计划,ls[0]不用,DAYS定义为天数*/ double find_a_plan(FILE *inf) { int P num[DAYS+1],acc_req[DAYS+1]: int i,tag=0,acc_qty=0; double mincost=1.0e20,costProduce,cost_Keep; for (i=1;i<=DAYS;i++){ /*到第i天时的累计零件需求量存入acc_req[i]*/ accjty += data[i].Qty_req; acc_req[i] = acc_qty; } while (!feof(inf)){ for(i=1;i<=DAYS;i**) /*读入一个生产计划,第i天的产量存入P_num[i]*/ if (!feof(inf)) fscanf(inf,*"%d",&P_num[i]); tag=0; cost_Produce=0; cost_Keep=0: for(i=1,___(1)___;i<=DAYS;i++){ /*考察当前的生产计划*/ acc_qty += P_num[i]); /*acc_qty计录到第i天时的累计零件生产量*/ if (acc_qty < acc_req[i]) { /*当前生产计划不能满足需求*/ tag=1; break; }/*if*/ cost_Produce += ___(2)___;/*计算当前生成计划的总零件价格*/ /*计算当前生成计划下的零件保管费*/ cost_Keep += (___(3)___) * data[i].Keeping_fee; }/*for*/ if(___(4)___) /*若当前生产计划不可行,则继续读取下一计划*/ continue; if(___(5)___){ /*记录成本更小的生产计划*/ mincost=cost_Produce+cost_Keep; for(i=1;i<=DAYS;i++) B_s[i]=P_num[i]; }/*if*/ }/*while*/ return mincost; } |
查看答案 |
简答题 | 试题五(共15分) 阅读以下应用说明以及用Visual Basic开发过程中所编写的程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内。 [应用说明] 某应用程序在运行过程中的一个界面如下图所示: 在“供选课程”列表框(名为Listl)中选择某个课程后,再单击“>*按钮(名称为cmdSelect),就能将该课程复制到“所选课程”列表框(名称为List2)中(但要注意不要出现重复项);如果单击“>>”按钮(名称为cmdSelAll),就能将全部供选课程名复制到列表框List2中(注意应先删除List2中的已选项);如果在“所选课程”列表框中选中某个课程,再单击“<”按钮(名称为cmdDelete),就会从List2中删除该课程(未选课程时应不做处理):如果单击“<<”按钮(名称为cmdDelAll),就会从List2中删除所有已选课程。 [Visual Basic程序代码] Private Sub CmdSelect_Click() For i=0 TO List2.ListCount-1 If List1.Text = Lsit2.List(i) Then Exit Sub ‘不要重复选择 Next i List2.Addltem ___(1)___ ‘在List2中增添List1中所选的项 End Sub Private Sub CmdSelAll_Click() List2.Clear ‘先删除List2中的已有项 For i = 0 To ___(2)___ ‘对List1中所有各项做循环处理 List2.Addltem ___(3)___ ‘将该项增添到List2中 Next i End Sub Private Sub CmdDelete_Click() If List2.ListIndex>=0 Then ‘如果List2中有选中的项 List2.Removeltem ___(4)___ ‘则删除所选的项 End If End Sub Private Sub CmdDelAll_Click() . ___(5)___ End Sub |
查看答案 |
简答题 | 试题六(共15分) 阅读以下说明和C++代码,将解答写在答题纸的对应栏内。 [说明] 已知类SubClass的getSum方法返回其父类成员与类SubClass成员j的和,类SuperClass中的getSum为纯虚拟函数‘程序中的第23行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,分析程序运行到第15行且尚未执行第15行的语句时成员变量j的值,最后给出程序运行后的输出结果。 [C++代码] 行号 代码 O1 #include <iostream> 02 using namespace std; 03 class SuperClass { 04 private: 05 int i; 06 public: 07 SuperClass(){ i = 5;} 08 virtual iht getValueO { return i; } 09 virtual int getSum()=0; lO }; 11 class SubClass:public SuperClass{ 12 int j; 13 public: 14 SubClass(int j) :j(0){ 15 ___(1)___ =j; //用参数j的值更新数据成员 16 }; 17 int getValue(){return j;} 18 int getSum(){ 19 return ___(2)___ getValue() + j; 20 } 21 }; 22 void main(void) { 23 SuperClass s = new SubClass(-3); 24 cout << s->getValue() << " "; 25 cout << s->getSum() << endl; 26 delete s; 27 } |
查看答案 |
简答题 | 试题七(共15分) 阅读以下应用说明以及用Visual Basic开发过程中进行的属性设置和所编写的程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内。 [应用说明] 启动某应用程序后,其运行窗口左边会出现两只蝴蝶,下边有“启动”和“停止’两个按钮。单击“启动”按钮后,伴随“两只蝴蝶”音乐,两只蝴蝶会分别沿两条互绞的曲线,自左至右翩翩飞行(见下图),而且飞出窗口右边后又会再从窗口左边飞入。 单击“停止”按钮时,两只蝴蝶停止飞行,回到初始状态,音乐也同时停止。再单击“启动”按钮时,蝴蝶重新开始伴音飞行。 在开发该应用时,两只蝴蝶用两个图像框来表示,分别命名为Imagel和Image2,其Picture属性分别设置为各个蝴蝶的图像文件名,其stretch属性都应设置为__(1)__,使图像能自动改变大小以适应图像框。再在窗体中建立“启动”按钮(名为CmdStart)和“停止”按钮(名为CmdStop)。 蝴蝶所飞行的路线分别用正弦和余弦曲线描述。为此,首先需要用Scal方法对窗体定义坐标系统。设左上角坐标为(0,0),右下角坐标为(20,6)。蝴蝶1的飞行曲线设为;yl=2+sinx,蝴蝶2的飞行曲线设为:y2=2+cos x。蝴蝶飞行的位置坐标(x,y)确定了蝴蝶图像框的位置(Left属性值和Top属性值)。 设置一个定时器(名为timerl),其定时时间间隔为0.1秒,所以其Interval属性值应设置为100。每隔 0.1秒需要对两个图像框的位置进行一次调整。初始时,该定时器的Enabled属性应设为False(关闭状态)。 为使该应用程序运行时能播放声音文件,在开发时应利用菜单“工程-部件”,选择加载组件“Microsoft Multimedia Control 6.0”,并在窗体中设置多媒体控件(设命名为MC)。由于不需要用户控制,其Visible属性可设置为False(不可见)。右击该控件,可选择该控件中各按钮的属性,应注意选择“播放”有效、“停止”有效。“两只蝴蝶”的音乐文件应提前准备好,并通过某种音频处理程序将其转换成WAV格式,存放在开发该应用的当前目录中。 [Visual Basic程序代码] Dim __(2)__ '声明全局变量 Private Sub Form_Load() Scale (0,0)-(20,6) '定义窗体的坐标系统 End Sub Private Sub CmdStart_Click() x = 0 MMC.DeviceType = "WaveAudio" '设置多媒体设备类型 MMC.FileName = "两只蝴蝶.way" '确定声音文件名 MMC.Command = "Open" '打开多媒体设备 MNC.Command = "Play" '启动声音的播放 Timerl.Enabled= True End Sub '打开定时器 Private Sub Timerl_Timer() If x > 20 Then x = x - 20 '蝴蝶飞到右边界后再回到左边界 Imagel.Left= x '动态调整蝴蝶框的位置 Imagel.Top= __(3)__ Image2.Left= x Image2.Top= __(4)__ x = x + 0.1 '确定蝴蝶下一步飞行位置 End Sub Private Sub CmdStop_Click() __(5)__ Imagel. Left= 0 '蝴蝶位置初始化 Imagel. Top= 2 Image2.Left= 0 Image2.Top= 3 MMC. Command= "Stop" '停止播放 MMC. Command= "Close" '关闭多媒体设备 End Sub |
查看答案 |
简答题 | 试题八(共15分) 阅读以下说明和Java代码,将解答写在答题纸的对应栏内。 [说明] 已知类SubClass的getSum方法返回其父类成员i与类SubClass成员j的和;类SuperClass中的getSum为抽象函数,程序中的第14行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,当程序运行到第22行且尚未执行第22行语句时成员变量i的值,最后给出程序运行后的输出结果。 [Java代码] 行号 代码 01 public class UainJava{ 02 public static void main(String[]args){ 03 SuperClass s=new SubClass(); 04 System.out.println(s.getValue()); 05 System.out.println(S.getSum()); 06 } 07 } 08 abstract class SuperClass{ 09 private int i; 10 public SuperClass(){i=5;} 11 public int getValue(){ 12 return i; 13 } 14 public final abstract int getSum(); 15 } 16 class SubClass extends SuperClass{ 17 int j; 18 public SubClass(){ 19 this(-3); 20 } 21 public SubClass(int j){ 22 ___(1)___.j=j; 23 } 24 public int getValue(){return j;} 25 public int getSum(){ 26 return ___(2)___.getValue()+j; 27 } 28 } |
查看答案 |
简答题 | 试题一(共 15 分) 阅读以下说明和算法,完善算法并回答问题,将解答写在答题纸的对应栏内。 [说明] 假设以二维数组 G[1..m,1..n]表示一幅图像各像素的颜色,则 G[i,j]表示区域中 点(i,j)处的颜色,颜色值为 0 到 k 的整数。 下面的算法将指定点(i0,j0)所在的同色邻接区域的颜色置换为给定的颜色值。约定 所有与点(i0,j0)同色的上、下、左、右可连通的点组成同色邻接区域。 例如,一幅 8×9 像素的图像如图 1-1 所示。设用户指定点(3,5),其颜色值为 0,此时其上方 (2,5)、下方 (4,5)、右方 (3,6)邻接点的颜色值都为 0,因此这些点属于 点(3,5)所在的同色邻接区域,再从上、下、左、右四个方向进行扩展,可得出该同色 邻接区域的其他点(见图 1-1 中的阴影部分)。将上述同色区域的颜色替换为颜色值 7 所得的新图像如图 1-2 所示。 [算法] 输入:矩阵 G,点的坐标(i0,j0),新颜色值 newcolor。 输出:点(i0,j0)所在同色邻接区域的颜色置换为 newcolor 之后的矩阵 G。 算法步骤(为规范算法,规定该算法只在第七步后结束): 第一步:若点(i0,j0)的颜色值与新颜色值 newcolor 相同,则 (1) ; 第二步:点(i0,j0)的颜色值→oldcolor;创建栈 S,并将点坐标(i0,j0)入栈; 第三步:若 (2) ,则转第七步; 第四步:栈顶元素出栈→(x,y),并 (3) ; 第五步:1) 若点(x,y-1)在图像中且 G[x,y-1]等于 oldcolor,则(x,y-1)入栈 S; 2) 若点(x,y+1)在图像中且 G[x,y+1]等于 oldcolor,则(x,y+1)入栈 S; 3) 若点(x-1,y)在图像中且 G[x-1,y]等于 oldcolor,则(x-1,y)入栈 S; 4) 若点(x+1,y)在图像中且 G[x+1,y]等于 oldcolor,则(x+1,y)入栈 S; 第六步:转 (4) ; 第七步:算法结束。 [问题] 是否可以将算法中的栈换成队列?回答: (5) 。 |
查看答案 |
简答题 | 试题二(共 15 分) 阅读以下说明和 C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 某单位准备进行一次选举,对指定的 n 名(n<80)候选人进行投票。为了简化选举工 作,事先印制了写有这 n 名候选人姓名的选票,投票者只需将选中者名下的圆圈涂黑即可。规定每张选票上被涂黑的圆圈数不得超过 3 个,也不得少于 1 个,否则视为无效选票。投票结束后,所有选票经计算机扫描处理,形成了描述选票状态的文本文件。例如,n=8 时所形成的文件如下: 01011000 10010100 10011000 11111111 00000000 00111000 … 其中,每行表示一张选票的数据,每列代表一位候选者的得票情况。第 i 行第 j 列 为 1,表示第 i 张选票上投了第 j 名候选人 1 票。 函数 statistic( )的功能是读入选票数据,并统计每位候选者的得票数,函数返回 有效选票数。 [C 函数] int statistic(FILE *fp,int candidate[],int n) { /* 从文件中读入选票数据,n 为候选人数量(n<80),从有效选票中统计每位候选者的得票数并存入 candidate[],函数返回有效选票数*/ char str[80]; /* str 保存读入的一张选票数据 */ int i,tag = 0; /* tag 用于判断每张选票是否有效 */ int q = 0; /* q 用于计算有效选票数 */ for(i = 0; i < n; i++) candidate[i] = 0; while ( (1) ) { fgets(str,80,fp); /* 读入一张选票数据 */ for(tag = 0,i = 0; (2) ; i++) if (str[i] == '1') tag++; if ( (3) ){ /* 若是有效选票,则进行统计 */ (4) ; for (i = 0; i < n; i++) if (str[i] == '1') (5) ; } } return q; } /* statistic */ |
查看答案 |
简答题 | 试题三(共 15 分) 阅读以下说明和 C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于 m 行n 列的稀疏矩阵 M,进行转置运算后得到 n 行 m 列的矩阵 MT,如图 3-1 所示。 为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图 3-1 所示的矩阵 M 相应的三元组顺序表如表 3-1 所示,其转置矩阵 MT 的三元组顺序表如表 3-2 所示。 函数 TransposeMatrix(Matrix M)的功能是对用三元组顺序表表示的稀疏矩阵 M 进行转置运算。 对 M 实施转置运算时,为了将 M 中的每个非零元素直接存入其转置矩阵 MT 三元组顺序表的相应位置,需先计算 M 中每一列非零元素的数目(即 MT 中每一行非零元素的 数目),并记录在向量 num 中;然后根据以下关系,计算出矩阵 M 中每列的第一个非零元素在转置矩阵 MT 三元组顺序表中的位置: cpot[0] = 0 cpot[j] = cpot[j-1] + num[j-1] /* j 为列号 */ 类型 ElemType、Triple 和 Matrix 定义如下: typedef int ElemType; typedef struct { /* 三元组类型 */ int r,c; /* 矩阵元素的行号、列号 */ ElemType e; /* 矩阵元素的值*/ }Triple; typedef struct { /* 矩阵的三元组顺序表存储结构 */ int rows,cols,elements; /* 矩阵的行数、列数和非零元素数目 */ Triple data[MAXSIZE]; } Matrix; [C 函数] int TransposeMatrix(Matrix M) { int j,q,t; int *num, *cpot; Matrix MT; /* MT 是 M 的转置矩阵 */ num = (int *)malloc(M.cols*sizeof(int)); cpot = (int *)malloc(M.cols*sizeof(int)); if (!num || !cpot) return ERROR; MT.rows = (1) ; /* 设置转置矩阵 MT 行数、列数和非零元数目 */ MT.cols = (2) ; MT.elements = M.elements; if (M.elements > 0) { for(q = 0; q < M.cols; q++) num[q] = 0; for(t = 0; t < M.elements; ++t) /* 计算矩阵 M 中每一列非零元素数目 */ num[M.data[t].c]++; /* 计算矩阵 M 中每列第一个非零元素在其转置矩阵三元组顺序表中的位置 */ (3) ; for(j = 1;j < M.cols; j++) cpot[j] = (4) ; /* 以下代码完成转置矩阵 MT 三元组顺序表元素的设置 */ for(t = 0; t < M.elements;t++){ j = (5) ; /* 取矩阵 M 的一个非零元素的列号存入 j */ /* q 为该非零元素在转置矩阵 MT 三元组顺序表中的位置(下标)*/ q = cpot[j]; MT.data[q].r = M.data[t].c; MT.data[q].c = M.data[t].r; MT.data[q].e = M.data[t].e; ++cpot[j]; /* 计算 M 中第 j 列的下一个非零元素的目的位置 */ } /* for */ } /* if */ free(num); free(cpot); /*此处输出矩阵元素,代码省略*/ return OK; } /* TransposeMatrix */ |
查看答案 |
简答题 | 试题四(共 15 分) 阅读以下应用说明以及用 Visual Basic 编写的程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [应用 4.1] 设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框(chk1,chk2,chk3),各个复选框单击事件过程的程序代码如下: Private Sub chk1_Click( ) Label.fontBold = chk1.Value End Sub Private Sub chk2_Click( ) Label.fontItalic = chk2.Value End Sub Private Sub chk3_Click( ) Label.fontUnderLine = chk3.Value End Sub 三个复选框 chk1、chk2、chk3 的功能分别是: (1) 。 [应用 4.2] 设应用程序的运行窗口内有两个文本框 Txt1 和 Txt2,其初始内容为空。在 Txt1 文本框中输入一个数值,当光标离开此文本框(例如进入文本框 Txt2)时,执行的程序代码如下: Private Sub Txt1_LostFocus() dim x as double x = Val(Txt1.Text) If x<0 Or x>100 Then Txt1.Text = "" MsgBox$ ("请重新输入!") Txt1.SetFocus Else Txt2.Text = Txt1.Text End If End Sub 该程序代码的功能是:若在文本框 Txt1 中输入的数值小于 0 或大于 100,当光标离 开此文本框时, (2) ;否则,将其值复制到文本框 Txt2 中。 [应用 4.3] 在下面的应用中,当窗口内发生 Click 事件时,窗口内将显示如图 4-1 所示的杨辉三角形(每一行都是二项式展开的系数)。请完善程序代码 Private Sub Form_Click() Dim i, j, c As Integer,StrTemp As String Dim a(9) As Integer a(0) = 0: a(1) = 1 StrTemp = Str(a(1)) + Space(3) CurrentX = (ScaleWidth - TextWidth(StrTemp)) / 2 Print StrTemp For j = 2 To 9 a(j) = 1 For c = j-1 To 2 Step -1 a(c) = (3) Next (4) = "" For c = 1 To j StrTemp = StrTemp & Str( (5) ) & Space(5 - Len(Str(a(c)))) Next CurrentX = (ScaleWidth - TextWidth(StrTemp)) / 2 Print StrTemp Next End Sub |
查看答案 |
简答题 | 试题五(共 15 分) 阅读以下说明和 C 函数,将应填入 (n)处的字句写在答题纸的对应栏内。 [说明] 某班级有 N 名学生,他们可根据自己的情况选修名称和数量不尽相同的课程。设 N等于 6,学生信息、所选课程及成绩用链表结构存储,如图 5-1 所示。 程序中相应的类型定义如下: #define N 6 struct node{ char cname[5]; /*课程名*/ int grade; /*成绩*/ struct node *next; /*指针,指示某学生选修的下一门课程及成绩*/ }; struct student{ char xh[5]; /*学号*/ char name[20]; /*姓名*/ struct node *link; /*指针,指示出选修的课程及成绩链表*/ }stud_info[N]; stud_info[]为一个全局数组。 函数 func (char kc[],int *num)的功能是统计选修了课程名为 kc 的学生的人数, 并返回该课程的平均成绩(若无人选修该课程,则平均成绩为 0),参数 num 带回选修课程 kc 的学生人数。 [C 函数] double func (char kc[],int *num) { int i,count = 0,sum = 0; /*count 用于记录选修课程名为 kc 的学生的人数*/ double avg = 0.0; struct node *p; for(i = 0; i < N; i++){ p = (1) ; /*取第 i 个学生所修课程链表的头指针*/ while (p) { if ( (2) ) { sum = (3) ; count++; break; } /*if*/ p = p->next; } /*while*/ } (4) ; if ( (5) ) avg = (double)sum / count; /* 计算平均成绩 */ return avg; } /*func*/ |
查看答案 |
简答题 | 试题六(共 15 分) 阅读以下说明和 C++程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 在下面的C++代码中,类 SalesTicket 能够完成打印票据正文的功能,类 HeadDecorator 与 FootDecorator 分别完成打印票据的台头和脚注的功能。 已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。 这是票据的台头! 这是票据正文! 这是票据的脚注! ------------------------ 这是票据的台头! 这是票据的脚注! [C++程序代码] #include <iostream> using namespace std; class SalesTicket { public: (1) printTicket() { cout << "这是票据正文!" << endl;} }; class Decorator : public SalesTicket{ SalesTicket *ticket; public: Decorator(SalesTicket *t){ ticket = t; } void printTicket(){ if(ticket != NULL) ticket->printTicket(); } }; class HeadDecorator : public Decorator{ public: HeadDecorator(SalesTicket *t): (2) { } void printTicket() { cout << "这是票据的台头!" << endl; Decorator::printTicket(); } }; class FootDecorator :public Decorator{ public: FootDecorator(SalesTicket *t): (3) { } void printTicket() { Decorator::printTicket(); cout << "这是票据的脚注!" << endl; } }; void main(void) { SalesTicket t; FootDecorator f(&t); HeadDecorator h( (4) ); h.printTicket(); cout << "------------------------"<< endl; FootDecorator a(NULL); HeadDecorator b( (5) ); b.printTicket(); } |
查看答案 |
简答题 | 试题七(共 15 分) 阅读以下应用说明以及用 Visual Basic 编写的程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [应用说明] 某应用程序用于监测某种设备的工作温度(20~200 度),其运行窗口中,包括一个 温度计(矩形形状 shpMeter)以及其中指示当前设备温度的水银柱(矩形形状 shpT), 文字标签标记了温度刻度;另有一个图片框 picCurve,用于动态描述检测到的温度曲线(用户见到的曲线与水银柱等高变化);命令按钮“开始检测”(cmdStart)用于启动温 度检测,命令按钮“暂停检测”(cmdStop)用于暂停检测。 矩形形状 shpT(水银柱)属性 visible 初始设置为不可见,属性 Filltype 设置为solid(实心),FillColor 设置为红色;图片框 picCurve 的属性 AutoRedraw 设置为 True;再创建一个定时器 TimT,属性 Enabled 初始设置为 False(不起作用),属性 Interval(定时间隔)设置为 500 毫秒。 为模拟设备温度的检测,程序中利用了(0,1)之间均匀分布的伪随机数获得[20,200] 之间的随机温度 T。为了便于在图片框 picCurve 中绘制曲线,程序中对该图片框建立了坐标系统,左上角为原点(0,0),水平向右方向为 X 轴,垂直向下方向为 Y 轴,右下角坐标为(50,180)。为了便于观察记录的温度值,图片框中从上到下创建了 5 条水平线 Ls(i),i=0,1,…4,并在程序中按等间隔排列进行位置设置。程序中每隔半秒算出曲线点(x,y),其中 x=0,1,2,…,再用直线段连接各相邻曲线点形成温度曲线。 [Visual Basic 程序代码] Dim (1) As Integer '声明全局变量 Private Sub CmdStart_Click( ) TimT.Enabled = True ShpT.Visible = True End Sub Private Sub CmdStop_Click( ) TimT.Enabled = False End Sub Private Sub Form_Load( ) Dim i, H As Integer PicCurve.Scale (0, 0)-(50, 180) '设置图片框坐标系:左上角-右下角H = 30 'H 等于图片框高度的六分之一 For i = 0 To 4 '设置 5 条水平线 Ls(i)的位置 Ls(i).X1 = 0 'Ls(i)起点横坐标 Ls(i).Y1 = H * (2) 'Ls(i)起点纵坐标 Ls(i).X2 = 50 'Ls(i)终点横坐标 Ls(i).Y2 = Ls(i).Y1 'Ls(i)终点纵坐标 Ls(i).BorderColor = &HC0C0C0 '设置水平线颜色 x = 0 '设置曲线坐标初值 End Sub Private Sub timT_Timer() Dim T, H As Integer 'T 为即时温度,H 为图片框中温度点显示高度 T = Int(Rnd * 181) + 20 '模拟随机产生设备温度(20~200 度) '按当前温度显示水银柱 H = ShpMeter.Height * (3) '算出水银柱的高度 ShpT.Top = (4) - H '设置水银柱顶部位置 ShpT.Height = H '设置水银柱的高度 '绘制温度曲线 y = (5) '算出曲线上当前点的纵坐标 If x = 51 Then '当超出图片框时 PicCurve.Cls '清除图片框内以前画的曲线 x = 0 '设置重画曲线的初值 ElseIf x > 0 Then '除左边点外 PicCurve.Line (x-1,Lasty)-(x,y),vbRed '由前 1 点到当前点画红色线段 End If x = x + 1 '准备下一点坐标 Lasty = y '保存当前坐标供下次使用 End Sub |
查看答案 |
简答题 | 试题八(共 15 分) 阅读以下说明和 Java 程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 在下面的 Java 程序代码中,类 SalesTicket 能够完成打印票据正文的功能,类 HeadDecorator 与 FootDecorator 分别完成打印票据的台头和脚注的功能。 已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。 这是票据的台头! 这是票据正文! 这是票据的脚注! ------------------------ 这是票据的台头! 这是票据的脚注! [Java 程序代码] public class SalesTicket { public void printTicket() { System.out.println("这是票据正文!"); } } public class Decorator extends SalesTicket{ SalesTicket ticket; public Decorator(SalesTicket t){ ticket = t; } public void printTicket(){ if(ticket != null) ticket.printTicket(); } } public class HeadDecorator extends Decorator{ public HeadDecorator(SalesTicket t) { (1) ; } public void printTicket() { System.out.println("这是票据的台头!"); super.printTicket(); } } public class FootDecorator extends Decorator{ public FootDecorator(SalesTicket t) { (2) ; } public void printTicket() { super.printTicket(); System.out.println("这是票据的脚注!"); } } public class Main { public static void main(String[] args) { T = new HeadDecorator( (3) ); T. (4) ; System.out.println("------------------------"); T = new FootDecorator( (5) ); T.printTicket(); } } |
查看答案 |
简答题 | 试题一(共15分) 阅读以下说明和流程图,回答问题 1 和问题 2,将解答填入答题纸的对应栏内。 [说明] 为便于管理,每本正式出版的图书都印有国际标准书号。标准书号由“ISBN”和10个数字组成,其格式为:ISBN 组号-出版者号-书名号-校验码。其中,校验码是根据前面 9 个数字计算得到的,用于计算机自动校验。假设标准书号的 10 个数字依次是a(1),a(2),…,a(10),则校验码 a(10)的设置应使 S=10*a(1)+9*a(2)+8*a(3)+…+1*a(10)能被11 整除。如果校验码 a(10)应设置成 10,则规定以“X”表示之。例如,信息处理技术员考试大纲的标准书号为:ISBN 7-302-11191-X。第 1 段上的数字“7”是国际 ISBN中心分配给中国 ISBN 中心管理的组号。第 2 段上的“302”表示清华大学出版社。标准书号的校验过程如图 1-1 所示,计算校验码的过程如图 1-2 所示,其中,Mod(S,11)表示S 除以 11 得到的余数。 [流程图] [问题1]请填补流程图中的空缺(1)~(4)。 [问题2]设“程序员考试大纲”标准书号前 9 个数字为 7-302-08493,请写出其校验码。 |
查看答案 |
简答题 | 试题二(共15 分) 阅读以下说明和C 语言函数,将解答填入答题纸的对应栏内。 [说明] 下面待修改的 C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的 C 程序代码中有五个错误,请指出所有的错误。 [C 程序代码] |
查看答案 |
简答题 | 试题三(共15 分) 阅读以下说明和 C 语言函数,将应填入(n)处的字句写在答题纸的对应栏内。 [说明] 函数 count_ months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。 该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。 规定两个相邻年份的同月同日之间的间隔为 1 年。例如,2007.5.30~2008.5.30的间隔为 1 年。若相邻两年中前一年是闰年,并且日期是 2 月 29 日,则到下一年的 2月 28 日为 1 年,即 2008.2.29~2009.2.28 的间隔为 1 年。 规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29~2007.2.28 的间隔为 1 个月,同理, 2007.1.30~2007.2.28、2007.1.~2007.2.28 的间隔都是 1 个月。 计算起止日期间隔不足一年的完整月份数时,分两种情况: 1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为 2008.3.31~2008.9.20,通过月号算出月份数为 6。修正时,通过调用函数 makevalid 将 2008.9.31 改为 2008.9.30,与终止日期2008.9.20 比较后,将月份数修正为 5。 2)起止日期跨年度。计算方法如下例所示:对于起止日期 2008.7.25~2009.3.31,先计算 2008.7.25~2008.12.25 的月份数为 5,再算出 2008.12.25~2009.3.25 的月份数为 3,因此 2008.7.25~2009.3.31 之间的完整月份数为 8。 日期数据类型定义如下: typedef struct { int year;int month;int day; /*日期的年号(4 位)、月和日号*/ }DATE; 程序中使用的函数 cmp_date()、isLeapYear()和 makevalid()说明如下: [C语言函数] int count_months(DATE start, DATE end) { int years = 0, months = 0; DATE r; if (cmp_date(start,end) > 0){ r = start; start = end; end = r; } years = end.year - start.year; /*计算年数*/ r = start; r.year = end.year; if (cmp_date(r,end) > 0) { /*修正年数*/ (1) ; r.year--; } if (r.year < end.year) { /*跨年度时,先计算到 12 月的月份数*/ months =(2); r.month = 12; } months += (end.month + 12 - r.month) % 12; r.year = end.year;r.month = end.month; makevalid( (3) ); /*将日期 r 修正为有效日期*/ if (cmp_date(r,end) > 0) /*修正月份数*/ (4) ; months +=(5) ; /*计算总月份数*/ return months; } |
查看答案 |
简答题 | 试题四(共15 分) 阅读以下说明和 C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 函数 sort(NODE *head)的功能是:用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻结点中的元素,若较小的元素在前面,则交换这两个结点中的元素值。其中,head 指向链表的头结点。排序时,为了避免每趟都扫描到链表的尾结点,设置一个指针 endptr,使其指向下趟扫描需要到达的最后一个结点。例如,对于图 4-1 (a)的链表进行一趟冒泡排序后,得到图 4-1 (b)所示的链表。 链表的结点类型定义如下: typedef struct Node { int data; struct Node *next; }NODE; [C 语言函数] void sort(NODE *head) { NODE *ptr,*preptr,*endptr; int tempdata; ptr = head -> next; while (1)/*查找表尾结点*/ ptr = ptr -> next; endptr = ptr;/*令 endptr 指向表尾结点*/ ptr =(2) ; while(ptr != endptr) { while((3) ) { if (ptr->data > ptr->next->data){ tempdata = ptr->data; /*交换相邻结点的数据*/ ptr->data = ptr->next->data; ptr->next->data = tempdata; } preptr =(4) ;ptr = ptr -> next; } endptr =(5) ;ptr = head->next; } } |
查看答案 |
简答题 | 试题五(共15 分) 阅读以下应用说明以及用 Visual Basic 开发过程中所编写的程序代码,将应填入_(n)处的字句写在答题纸的对应栏内。 [应用说明] 某应用的登录界面如下: 登录界面中的文本框 txtUserID 和 txtPassword 分别用于接受用户输入的用户名和口令,命令按钮为确定(cmdOk)和取消(cmdCancel) 。ADO 数据控件 Adodc1 与数据库EmployeeData 连接。在 EmployeeData 中,表“Users”的字段“UserID”和“Pswd”分别记录了所有的合法用户名和口令。 在登录界面中,输入正确的用户名和口令并单击“确定”按钮后,就会打开应用程序的主窗口 frmApp。用户名或密码输入错误时,给出提示信息并返回登录界面。 [Visual Basic 程序代码] Private Sub cmdOK_Click() Adodc1.C_dj="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\data\EmployeeData.mdb;Persist Security Info=False" Adodc1.RecordSource = "select *(1) " Adodc1.Refresh Do usrname =(2) pwd = Adodc1.Recordset("Pswd") Adodc1.Recordset.MoveNext Loop Until (usrname =(3) ) Or (Adodc1.Recordset.EOF) If usrname <> txtUserID.Text Then MsgBox "无效的用户 ID,请重新输入!", , "提示信息" Else If(4)Then MsgBox "欢迎进入系统主界面!", , "提示信息" Unload me (5)’打开应用程序的主窗口 Else MsgBox "无效的用户密码,请重新输入!", , "提示信息" End If End If End Sub |
查看答案 |
简答题 | 试题六(共15 分) 阅读下列说明和 C++代码,请回答问题 1 至问题 3,将解答写在答题纸的对应栏内。 [说明] 已知下列程序运行时的输出应为: 1:1 1:1 1:1 [问题1] 请补齐下述代码中的空缺 1 和 2。 [问题2] 类 Stock 的定义中有两处错误,请指出错误所在行号并给出该行修改后的完整结果。 [问题3] 指出该代码是否存在内存泄漏。 [C++ 程序] |
查看答案 |
简答题 | 试题七(共15分) 阅读以下应用说明、Visual Basic 开发说明以及程序代码,将应填入 (n) 的字句写在答题纸的对应栏内。 [应用说明] 某交通灯演示程序启动后,其运行窗口中包括红绿灯标志以及当前红绿灯状态剩余秒数的动态显示(如下图)。红灯与绿灯持续的时间分别为 30 秒与 40 秒。持续时间结束时,立即变更红绿灯,并重新显示剩余秒数。 [Visual Basic开发说明] 在开发过程中,先在窗体内制作形状“红绿灯框架”(长方形,透明),在该框架中,上部制作形状“红灯”(ShpRed,圆形),默认属性为透明;下部制作形状“绿灯”(ShpGreen,圆形),初始设置其填充方式属性 FillStyle 为实心,填充颜色属性 FillColor 为绿色。 再设置两个图像框(Image1 在左,Image2 在右),使其能分别装入数字图像文件,以显示当前红绿灯状态剩余的秒数。10 个数字图像文件 N0.bmp~N9.bmp 分别用于显示数字 0、1、…、9,这些文件存放在该应用程序所在目录中,以便在程序运行时按需要选择装入这两个图像框。为使图像文件装入图像框时能自动改变大小以适应图像框,这些图像框的 Stretch 属性都应设置成 (1) 。为使这些数字能每秒变化一次,开发窗体中设置了计时器 Timer1,其 Enable 属性设置成 True,其 Interval 属性设置成 1000。 程序中,全局变量 Light 用以标志当前红灯(0)或绿灯状态(1),RedT 和 GreenT分别表示红灯或绿灯状态剩余的秒数。 计时器 Timer1 的定时过程是在该程序启动 1 秒后首次执行的,以后每隔 1 秒执行1 次。开发者应考虑对以下四种情况的处理:绿灯持续、绿灯转红灯、红灯持续、红灯转绿灯。 过程 LoadNumber 的功能是:将红绿灯剩余秒数 N(2 位整数)分离出两个一位数 i与 j,再将其变换成字符,删除前面可能产生的空格,再将数字图像文件 Ni.bmp 与 Nj.bmp装入两个图像框(其中 i 与 j 应以相应的数字字符代替)。 [Visual Basic程序代码] Public Light As Integer, RedT As Integer, GreenT As Integer Private Sub Form_Load() Light = 1 : GreenT = 40 : RedT = 0 ’初始化设置 End Sub Private Sub Timer1_Timer() ’计时器定时过程 If Light = 1 Then ’绿灯状态时 (2) If GreenT > 0 Then ’绿灯持续时 Call LoadNumber(GreenT) ’调用过程,显示数字 GreenT Else ’绿灯转红灯时 ShpRed.FillStyle = 0 ’置红灯形状实心 ShpRed.FillColor = vbRed ’为红灯形状填充红色 ShpGreen.FillStyle = 1 ’置绿灯形状透明 Call LoadNumber(30) Light = 0 : RedT = 30 End If Else’红灯状态时 RedT = RedT - 1 If RedT > 0 Then ’红灯持续时 Call LoadNumber(RedT) Else ’红灯转绿灯时 ShpRed.FillStyle = 1 ShpGreen.FillStyle = 0 ShpGreen.FillColor = vbGreen (3) Light = 1 : GreenT = 40 End If End If End Sub Sub LoadNumber(N As Integer) ’根据剩余秒数 N 将数字图像装入图像框 Dim i As Integer, j As Integer i = Int( (4) ) j = (5) Image1.Picture = LoadPicture("N"&Trim(Str(i))&".bmp") ’显示十位上的数字 Image2.Picture = LoadPicture("N"&Trim(Str(j))&".bmp") ’显示个位上的数字 End Sub |
查看答案 |
简答题 | 试题八(共15 分) 阅读以下说明和 Java 代码,请回答问题 1 和问题 2,将解答写在答题纸的对应栏内。 [说明] 已知类 Stock 和类 cxyjava 都定义在 cxyjava.java 文件中,类 Stock 的定义中第14 行前共有四行出现了错误,将下面代码修改正确并完善后的输出结果为: 0:0 1:23 [问题1] 请指出错误所在行号并给出该行修改后的完整结果。 [问题2] 请补齐第 21 行代码中的空缺。 [Java 代码] |
查看答案 |
简答题 | 试题一(共15分) 阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。 [说明] 某单位动态收集的数据中常包含重复的数据,所以需要进行处理,使得重复的数据仅出现一次。下面流程图的功能是:在n(n≥1)个数据D1、D2、…、Dn中,选出其中所有不重复的k个数据,置于原来前k个数据的位置上。 该流程图的算法如下:第1个数据必然被选出,然后从第2个数据开始,逐个考察其余的数据。假设D1、D2、…、Dm(m≥1)是已经选出的、不重复的数据,则对于数据Di(m<i≤n),将其依次与Dm、Dm-1、…、D1进行比较,若没有发现与之相同者,则Di被选出并置于Dm+1的位置上;否则对Di不做处理。 例如,如下10个数据: 5,2,2,7,4,4,7,1,9,1 (n=10) 经过上述算法处理后的结果为: 5,2,7,4,1,9 (k=6) [流程图] 注:循环开始的说明按照“循环变量名:循环初值,循环终值,增量”格式描述。 |
查看答案 |
简答题 | 试题二(共15分) 阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。 函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。 程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)分别表示year是(或不是)闰年。 [C语言函数] int count_5_13(int year) { int date; /* date为0表示星期日,为1~6分别表示星期一至星期六 */ long days = 0; /* days记录天数 */ int m, y, c = 0; /* c用于表示黑色星期五的个数 */ if (year < 1900) return -1; /*计算从1900年1月1日起,至给定年份year的1月13日间隔的天数*/ days = 12; for (y = 1900; y < year; y++) { days += 365; if (isLeapYear(y)) (1) ; } date = ((days % 7) + 1) % 7; /* 算出给定年份year的1月13日是星期几 */ c = ( (2) ) ? 1 : 0; for(m = 1; (3) ; m++) { switch (m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: days = 28; if ( (4) ) days = 29; break; }/* end of switch*/ date =((days % 7) + (5) ) % 7; if (date == 5) c++; } /* end of for*/ return c; } |
查看答案 |
简答题 | 试题三(共15分) 阅读以下说明和C语言程序,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”,其数据格式如下: 拨入或拨出标记 通话开始时间 通话结束时间 对方号码 注1:数据字段以一个空格作为分隔符。 注2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。 注3:通话开始和结束时间的格式均为:HH:MM:SS。其中HH表示小时,取值00~23;MM表示分钟,取值00~59;SS表示秒,取值00~59。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为1秒,最长不超过24小时。 注4:跨月的通话记录计入下个月的通话数据文件。 例如“o 23:01:12 00:12:15 …”表示本次通话是本机呼叫其他用户,时间从23时01分12秒至次日的0时12分15秒,通话时间为71分03秒。 下面程序的功能是计算并输出该用户本月电话费(单位:元)。 通话计费规则为: 1. 月通话费按每次通话费累加; 2. 每次的通话费按通话时间每分钟0.08元计算,不足1分钟时按1分钟计费。 对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日0点0分0秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。 例如,若输入文件dial.txt的数据如下所示,则输出fee = 7.44。 o 14:05:23 14:11:25 82346789 i 15:10:00 16:01:15 13890000000 o 10:53:12 11:07:05 63000123 o 23:01:12 00:12:15 13356789001 [C程序代码] #include <stdio.h> FILE *fin; int main() { char str[80]; int h1,h2,m1,m2,s1,s2; long t_start,t_end, interval; int c; double fee = 0; fin = fopen("dial.txt","r"); if (!fin) return -1; while (!feof(fin)) { if (!fgets(str,80,fin)) break; if ( (1) ) continue; h1 = (str[2] - 48) * 10 + str[3] - 48; m1 = (str[5] - 48) * 10 + str[6] - 48; s1 = (str[8] - 48) * 10 + str[9] - 48; h2 = (str[11] - 48) * 10 + str[12] - 48; m2 = (str[14] - 48) * 10 + str[15] - 48; s2 = (str[17] - 48) * 10 + str[18] - 48; t_start = h1*60*60 + m1*60 + s1; /* 通话开始时间 */ t_end = h2*60*60 + m2*60 + s2; /* 通话结束时间 */ if ( (2) ) /* 若通话开始和结束时间跨日 */ interval = (3) - t_start + t_end; else interval = t_end - t_start; c = (4) ; /* 计算完整分钟数表示的通话时间 */ if (interval % 60) (5) ; fee += c * 0.08; } fclose(fin); printf("fee = %.2lf\n",fee); return 0; } |
查看答案 |
简答题 | 试题四(共15分) 阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE *head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。 处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。 图4-1(a)、(b)是经函数compress()处理前后的链表结构示例图。 链表的结点类型定义如下: typedef struct Node { int data; struct Node *next; }NODE; [C语言函数] void compress(NODE *head) { NODE *ptr,*q; ptr = (1) ; /* 取得第一个元素结点的指针 */ while ( (2) && ptr -> next) { q = ptr -> next; while(q && (3) ) { /* 处理重复元素 */ (4) = q -> next; free(q); q = ptr -> next; } (5) = ptr -> next; }/* end of while */ }/* end of compress */ |
查看答案 |
简答题 | 试题五(共15分) 阅读下列说明、图和C++代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 [说明] 已知四个类之间的关系如图5-1所示,分别对每个类的方法进行编号,例如Shape的perimeter()方法为1号,表示为“1:perimeter()”,Rectangle类的perimeter()为2号,表示为“2:perimeter()”,依此类推,其中,每个类的perimeter方法都为虚函数且方法签名相同。 [C++代码] Triangle *tr = new Triangle(); Square *sq = new Square(); Shape *sh = tr; [问题1] 关于上述C++代码中sh 和 tr的以下叙述中,哪两个是正确的(写出编号)。 ① sh 和 tr分别引用同一个对象; ② sh 和 tr分别引用同一类型的不同的对象; ③ sh 和 tr分别引用不同类型的不同对象; ④ sh 和 tr分别引用同一个对象的不同拷贝; ⑤ sh 和 tr所引用的内存空间是相同的。 [问题2] 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。 tr->height() (1) sh->perimeter() (2) sq->height() (3) sq->perimeter() (4) sh->height() (5) tr->perimeter() (6) [问题3] 不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。 ① sq = sh; ② sh = tr; ③ tr = sq; ④ sq = tr; ⑤ sh = sq; |
查看答案 |
简答题 | 试题六(共15分) 阅读以下应用说明以及Visual Basic程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [应用说明] 某电视台拟开发应用程序来显示戏曲大赛中1~4号四位选手决赛的现场投票情况。该程序从现场观众中(不超过2000人)每0.5秒收集一次对这四位选手的支持票数,并在屏幕上动态显示这四位选手的票柱(以高度反映票数)与累计得票数,如图6-1所示。投票过程限时30秒,每名观众最多为1名选手投票。投票结束后系统通过比较各位选手的累计得票数,显示决赛结果:“*号胜出”(如有单个冠军)或“继续进行PK”(如有多人获得相同的最高票数)。 图6-1 在开发该程序的过程中创建的主要控件及其初始属性值说明如下: 该程序中设置公共变量T动态记录投票时间。四个形状ShpM(1 to 4)动态增长的底线固定。 [Visual Basic程序代码] Dim T As Integer '声明全局变量 Private Sub Form_Load() For i = 1 To 4 ShpM(i).Top = 2000 : ShpM(i).Height = 0 ' 初始票柱高度为0 TxtM(i).Text = 0 Next i Tim1.Enabled = False : Tim1.Interval = 500 : T = 0 End Sub Private Sub CmdStart_Click() Tim1.Enabled = True '开始投票 CmdStart.Enabled = False End Sub Private Sub Tim1_Timer() Dim n(1 To 4) As Integer ' n(1 to 4)为每次收集的票数 Dim i As Integer, j As Integer Dim G As Integer ' G用于计算最高票数 Dim ng As Integer ' ng用于计算冠军个数 For i = 1 To 4 n(i) = … ' 收集i号选手的票数,此处省略 TxtM(i).Text = TxtM(i).Text + n(i) ' 累计票(VB能进行自动转换) ShpM(i).Top = ShpM(i).Top - n(i) ShpM(i).Height = ShpM(i).Height + (1) ' 算出票柱高度 Next i T = T + 1 ' 计时 If T = 60 Then ' 投票时间到 (2) ' 停止数据收集处理 ng = 1 G = TxtM(1).Text For i = 2 To 4 If G < TxtM(i).Text Then G = TxtM(i).Text ng = (3) j = i Else If G = TxtM(i).Text Then ng = (4) ' 计算冠军个数 End If Next i If ng = 1 Then txtResult.Text = (5) ' 单个冠军结果 Else txtResult.Text = "继续进行PK" End If End If End Sub |
查看答案 |
简答题 | 试题七(共15分) 阅读下列说明、图和Java代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 [说明] 已知四个类之间的关系如图7-1所示,分别对每个类的方法进行编号,例如Shape的perimeter()为1号,表示为“1:perimeter()”,Rectangle类的perimeter()为2号,表示为“2:perimeter()”,依此类推,其中,每个类的perimeter方法签名相同。 [Java 代码] Triangle tr = new Triangle(); Square sq = new Square(); Shape sh = tr; [问题1] 关于上述Java代码中sh 和 tr的以下叙述中,哪两个是正确的(写出编号)。 ① sh 和 tr分别引用同一个对象; ② sh 和 tr分别引用同一类型的不同的对象; ③ sh 和 tr分别引用不同类型的不同对象; ④ sh 和 tr分别引用同一个对象的不同拷贝; ⑤ sh 和 tr所引用的内存空间是相同的。 [问题2] 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。 tr.height() (1) sh.perimeter() (2) sq.height() (3) sq.perimeter() (4) sh.height() (5) tr.perimeter() (6) [问题3] 下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。 ① sq = sh; ② sh = tr; ③ tr = sq; ④ sq = tr; ⑤ sh = sq; |
查看答案 |
简答题 | 试题一(共15分) 阅读以下说明和流程图,填补流程图中的空缺(1)~(9),将解答填入答题纸的对应栏内。 [说明] 假设数组 A 中的各元素 A(1),A(2) ,…,A(M)已经按从小到大排序(M≥1);数组 B 中的各元素 B(1),B(2),…,B(N)也已经按从小到大排序(N≥1)。执行下面的流程图后,可以将数组A与数组B中所有的元素全都存入数组C中,且按从小到大排序 (注意:序列中相同的数全部保留并不计排列顺序)。例如,设数组A中有元素:2,5,6,7,9;数组B中有元素:2,3,4,7;则数组C中将有元素:2,2,3,4,5,6,7,7,9。 [流程图] |
查看答案 |
简答题 | 试题二(共15分) 阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 下面的程序按照以下规则输出给定名词的复数形式: a. 若名词以“y”结尾,则删除y并添加“ies”; b. 若名词以“s”、“ch”或“sh”结尾,则添加“es”; c. 其他所有情况,直接添加“s”。 [C程序] #include #include char *plural(char *word) { int n; char *pstr; n = strlen(word); /*求给定单词的长度*/ pstr = (char *)malloc(n+3); /*申请给定单词的复数形式存储空间*/ if (!pstr || n < 2) return NULL; strcpy(pstr,word); /*复制给定单词*/ if ( (1) ) { pstr[n-1] = 'i'; pstr[n] = 'e'; pstr[n+1] = 's'; (2) ; } else if(pstr[n-1]=='s'||pstr[n-1]== 'h' && ( (3) )) { pstr[n] = 'e'; pstr[n+1] = 's'; pstr[n+2] = '\0'; } else { pstr[n] = 's'; pstr[n+1] = '\0'; } (4) ; } main( ) { int i; char *ps; char wc[9][10] = {"chair","dairy","boss","circus","fly","dog","church","clue","dish"}; for(i = 0; i < 9; i++) { ps = (5) ; printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/ free(ps); /*释放空间*/ } system("pause"); } |
查看答案 |
简答题 | 试题三(共15分) 阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明] 下面的程序用Dole Rob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N为止:2 a. 在第一行的正中插入1; b. 新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新 位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个 位置; c. 若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。 例如,3阶魔方阵如下所示: 8 1 6 3 5 7 4 9 2 [C程序] #include <stdio.h> #include <stdlib.h> #define SIZE 50 main( ) { int row, col, n, value; int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/ printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=", SIZE); scanf("%d",&n); if (!(n % 2)||n < 1 || (1) ) { printf("输入数据有误!\n"); exit(0); } row = 1; col = (n+1)/2; value = 1; while(value <= (2) ) { a[row][col] = value; /*计算下一位置*/ if(value%n != 0){ row--; (3) ; if(row < 1) row = n; if(col > n) (4) ; } else row++; value = (5) ; } printf("\n%d 阶魔方阵如下所示:\n\n",n); for(row = 1; row <= n; row++){ for(col = 1; col <= n; col++) printf("%5d",a[row][col]); printf("\n"); } } |
查看答案 |
简答题 | 试题四(共15分) 阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明] 计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +”。 计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中,重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5 120 37 - * +”的计算过程为: a. 依次将46、5、120、37压入栈中; b. 遇到“-”,取出37、120,计算120–37,得83,将其压入栈中; c. 遇到“*”,取出83、5,计算5*83,得415,将其压入栈中; d. 遇到“+”,取出415、46,计算46+415,得461,将其压入栈中; e. 表达式结束,则计算过程完成。 函数computing(char expr[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。 函数computing中所用栈的基本操作的函数原型说明如下: void InitStack(STACK *s):初始化栈。 void Push(STACK *s, int e): 将一个整数压栈,栈中元素数目增1。 void Pop(STACK *s):栈顶元素出栈,栈中元素数目减1。 int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。 int IsEmpty(STACK s):若s是空栈,则返回1否则返回0。 [C函数] int computing(char expr[], int *result) { STACK s; int tnum, a,b; char *ptr; InitStack(&s); ptr = expr; /*字符指针指向后缀表达式串的第一个字符*/ while (*ptr!='\0') { if (*ptr==' ') { /*当前字符是空格*/ (1) ; /*字符指针指向下一字符*/ continue; } else if (isdigit(*ptr)) { /*当前字符是数字,则将该数字开始的数字串转换为数值*/ tnum = (2) ; while (*ptr>=’0’ && *ptr <=’9’) { tnum = tnum * 10 + (3) ; ptr++; } Push( (4) ); } else /*当前字符是运算符或其他符号*/ if (*ptr=='+'||*ptr=='-'||*ptr =='*'||*ptr =='/'){ if (!IsEmpty(s)) { a = Top(s); Pop(&s); /*取运算符的第二个运算数*/ if (!IsEmpty(s)) { b = Top(s); Pop(&s); /*取运算符的第一个运算数*/ } else return -1; } else return -1; switch (*ptr) { case '+': Push(&s,b+a); break; case '-': Push(&s,b-a); break; case '*': Push(&s,b*a); break; case '/': Push(&s,b/a); break; } } else return -1; ptr++; /*字符指针指向下一字符*/ } /* while */ if (IsEmpty(s)) return -1; else { (5) = Top(s); Pop(&s); /*取运算结果*/ if (!IsEmpty(s)) return -1; return 0; } } |
查看答案 |
简答题 | 试题五(共15分) 阅读下列说明、图和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 已知对某载客车辆(Car)进行类建模,如图5-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。 图 5-1 类图 [C++代码] const int (1) = 7; //定义最多载客数 const int MAX_WHEELS = 5; //定义最多轮胎数 class Body{ //此处代码省略 }; //车身类 class Passenger{ //此处代码省略 }; //乘客类 class Wheel{ //此处代码省略 }; //车轮类 class Driver{ //司机类 public: string name; //表示第几路公交车司机 Driver(string driverName):name( (2) ){}; //构造函数 }; class Engine{ //引擎类 public: string engineNo; //引擎编号 Engine(string engineNo){ (3) ->engineNo = engineNo; } //构造函数 }; class Car{ //汽车类 protected: Engine * engine; Driver * driver; Body body; Wheel * wheels[MAX_WHEELS]; Passenger * passengers[MAX_PASSENGERS]; public: Car(Driver *driver){ //构造函数 this->driver = driver; engine = new Engine("TX6536型号引擎"); for (int index = 0; index < MAX_WHEELS; index++){ wheels[index] = new Wheel(); } for (int index = 0; index < MAX_PASSENGERS; index++){ passengers[index] = NULL; } } virtual ~Car(){ //析构函数 for (int index=0; index < MAX_WHEELS; index++) delete wheels[index]; delete (4) ; } int getPassengerNumber(){ //获取车上乘客数量 //此处代码省略 } void getOnPassenger(Passenger * aPassenger ){ //乘客上车 //此处代码省略 } void run(){ //开车 if(driver == NULL){ cout << "司机尚未上车!"; return; } //此处代码省略 } }; void main(){ Driver driver("第五路公交车司机"); Car car( (5) ); Passenger passengers[MAX_PASSENGERS]; for (int index = 0 ; index < MAX_PASSENGERS; index ++) //乘客上车处理 car.getOnPassenger(&passengers[index]); car.run(); } |
查看答案 |
简答题 | 试题六(共15 分) 阅读以下应用说明以及Visual Basic程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [应用说明] 某应用程序可选择打开用户指定的文本文件,将其内容显示在指定的文本框内供用户编辑,并将编辑后的结果保存在用户指定的文件中。运行时的窗口如图6-1所示,其中有六个标签、一个驱动器列表框、一个目录列表框、一个文件列表框、一个文件类型组合框、一个文件编辑文本框、一个文件名文本框以及两个命令按钮。 图 6-1 该程序的开发要求如下: (1)通过驱动器列表框(Drive1)、目录列表框(Dir1)和文件列表框(File1),选择文件。 (2)文件类型组合框(Cmb_type)设置为下拉式列表框,其中有三个供选项,分别为“所有文件(*.*)”、“文本文件(*.txt)”和 “可执行文件(*.exe)”。在文件列表框中列出的文件类型会自动与文件类型组合框中选择的文件类型相匹配。 (3)在文件列表框中单击一个文件名时,该文件名会显示在文件名文本框(Txt_filename)中。 (4)在文件列表框中双击一个文件名时,若是文本文件,则在文件编辑文本框(Txt_file)中显示该文件的内容并可进行编辑;若不是文本文件,则弹出一个对话框,提示“请选择文本文件! ” (5)对于编辑后的文本文件,可在文件名文本框(Txt_filename)中输入新的文件名,并单击命令按钮(Cmd_save)进行保存。 [Visual Basic程序代码] Private Sub Form_Load() Cmb_type.AddItem "所有文件(*.*)" Cmb_type.AddItem "文本文件(*.txt)" Cmb_type.AddItem "可执行文件(*.exe)" Cmb_type.ListIndex = 0 File1.Pattern = "*.*": Txt_filename.Text = "" Txt_file.Text = "" End Sub Private Sub Dir1_Change() File1.Path = (1) End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Cmb_type_click() Select Case Cmb_type. (2) Case 0 File1.Pattern = "*.*" Case 1 File1.Pattern = "*.txt" Case 2 File1.Pattern = "*.exe" End Select End Sub Private Sub Cmd_save_Click() usrFile = GetFileName() ‘函数GetFileName获得要保存的文件名 Open usrFile For Output As #1 ‘定义usrFile为1号输出文件 Print #1, Txt_file.Text ‘输出到1号文件 Close #1 End Sub Private Sub File1_DblClick() If right(File1.FileName, 3) <> (3) Then MsgBox "请选择文本文件!" Exit Sub End If usrFile = GetFileName() ‘函数GetFileName获得要打开的文件名 Open usrFile For Input As #1‘定义usrFile为1号输入文件 Txt_file.Text = "" Do While (4) EOF(1) Line Input #1, fContext ‘从1号文件读入一行 Txt_file.Text = Txt_file.Text + (5) + vbCrLf Loop Close #1 End Sub ‘其他代码略 |
查看答案 |
简答题 | 试题七(共15分) 阅读下列说明、图和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 已知对某载客车辆(Car)进行类建模,如图7-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。 图 7-1 类图 [Java 代码] class Body{ //此处代码省略 }; //车身类 class Passenger{ //此处代码省略 }; //乘客类 class Wheel{ //此处代码省略 }; //车轮类 class Driver{ //司机类 public String name; //表示第几路公交车司机 public Driver(String driverName){name = driverName;} //构造函数 }; class Engine{ //引擎类 public String engineNo; //引擎编号 public Engine(String engineNo){ this.engineNo = engineNo; } //构造函数 }; public class Car{ //汽车类 static final int (1) = 7; //定义最多载客数 static final int MAX_WHEELS = 5; //定义最多轮胎数 protected Engine engine; protected Driver driver; protected Body body = new Body(); protected Wheel[] wheels; protected Passenger[] passengers; public Car(Driver driver){ //构造函数 (2) .driver = driver; engine = new Engine("TX6536型号引擎"); wheels = new Wheel[MAX_WHEELS]; passengers = new Passenger[MAX_PASSENGERS]; for (int index = 0; index < MAX_WHEELS; index++){ wheels[index] = new Wheel(); } for (int index = 0; index < MAX_PASSENGERS; index++){ passengers[index] = null; } } int getPassengerNumber(){ //获取车上乘客数量 //此处代码省略 } void getOnPassenger(Passenger aPassenger ){ //乘客上车 //此处代码省略 } void run(){ //开车 if( (3) ){ System.out.println("司机尚未上车!"); return;} //此处代码省略 } public static void main(String args[]){ Driver driver = new Driver("第五路公交车司机"); Car car = new Car( (4) ); for (int index = 0 ; index < MAX_PASSENGERS; index ++) car.getOnPassenger( (5) Passenger()); car.run(); } } |
查看答案 |
简答题 | 试题一(共15分) 阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。 [说明] 下面流程图的功能是:在已知字符串A中查找特定字符串B,如果存在,则输出B串首字符在A串中的位置,否则输出-1。设串A由n个字符A(0)、A(1)、…、A(n-1)组成,串B由m个字符B(0)、B(1)、…、B(m-1)组成,其中n≥m>0。在串A中查找串B的基本算法如下:从串A的首字符A(0)开始,取子串A(0)A(1)…A(m-1)与串B比较;若不同,则再取子串A(1)A(2)…A(m)与串B比较,依次类推。 例如,字符串“CABBRFFD”中存在字符子串“BRF”(输出3),不存在字符子串“RFD”(输出-1)。 在流程图中,i用于访问串A中的字符(i=0,1,…,n-1),j用于访问串B中的字符(j=0,1,…,m-1)。在比较 A(i)A(i+1)…A(i+m-1)与B(0)B(1)…B(m-1)时,需要对A(i)与B(0)、A(i+1)与B(1)、…、A(i+j)与B(j)、…逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,依此类推。 [流程图] |
查看答案 |
简答题 | 试题二(共 15 分) 阅读以下说明和 C 程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明] 下面 C 程序代码的功能是:对于输入的一个正整数 n(100≤n<1000),先判断其是 否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的 和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直 到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150 还不是回文数,再将 1150 与其反序数 511 相加,得到的 1661 是回文数。 函数 int isPalm(long m)的功能是:将正整数 m 的各位数字取出存入数组中,然后判 断其是否为回文数。若 m 是回文数则返回 1,否则返回 0。 [C 程序代码] #include <stdio.h> #include <stdlib.h> int isPalm(long m) { /*判断 m 是否为回文数*/ int i = 0, k = 0; char str[32]; while (m > 0) { /*从个位数开始逐个取出 m 的各位数字并存入字符数组 str*/ str[k++] = (1) + '0'; m = m / 10; } for(i = 0; i < k/2; i++) /*判断 str 中的 k 个数字字符序列是否是回文*/ if ( str[i] != str[ (2) ] ) return 0; return 1; } int main( ) { long n, a, t; printf("input a positive integer:"); scanf("%ld",&n); if (n < 100 || n > =1000) return -1 ; while( (3) ) { /*n 不是回文数时执行循环*/ printf("%ld -> ", n); for(a = 0, t = n; t > 0; ) { /*计算 n 的反序数并存入 a*/ a = (4) *10 + t % 10; t = t / 10; } /*end of for*/ n = (5) ; /*与反序数求和*/ } /*end of while*/ printf("%ld\n",n); system("pause"); return 0; } |
查看答案 |
简答题 | 试题三(共15分) 阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明] 已知某二叉树的非叶子结点都有两个孩子结点,现将该二叉树存储在结构数组 Ht中。结点结构及数组Ht的定义如下: #define MAXLEAFNUM 30 struct node{ char ch; /*当前结点表示的字符,对于非叶子结点,此域不用*/ char *pstr; /*当前结点的编码指针,非叶子结点不用*/ int parent; /*当前结点的父结点,为0时表示无父结点*/ int lchild,rchild; /*当前结点的左、右孩子结点,为0时表示无对应的孩子结点*/ }; struct node Ht[2*MAXLEAFNUM]; /*数组元素Ht[0]不用*/ 该二叉树的n个叶子结点存储在下标为1~n的Ht数组元素中。例如,某二叉树如图3-1所示,其存储结构如图3-2所示,其中,与叶子结点a对应的数组元素下标为1,a的父结点存储在Ht[5],表示为Ht[1].parent=5。Ht[7].parent=0表示7号结点是树根,Ht[7].lchild=3、Ht[7].rchild=6分别表示7号结点的左孩子是3号结点、右孩子是6号结点。 如果用“0”或“1”分别标识二叉树的左分支和右分支(如图 3-1 所示),从根结点开始到叶子结点为止,按所经过分支的次序将相应标识依次排列,可得到一个 0、1序列,称之为对应叶子结点的编码。例如,图 3-1 中 a、b、c、d 的编码分别是 100、101、 0、11。 函数LeafCode(Ht[],n)的功能是:求解存储在Ht中的二叉树中所有叶子结点(n个)的编 码,叶子结点存储在Ht[1]~Ht[n]中,求出的编码存储区由对应的数组元素pstr域指示。 函数LeafCode从叶子到根逆向求叶子结点的编码。例如,对图 3-1 中叶子结点a求编 码的过程如图 3-3 所示。 typedef enum Status {ERROR, OK} Status; [C函数] Status LeafCode(struct node Ht[], int n) { int pc, pf; /*pc 用于指出树中的结点,pf 则指出 pc 所对应结点的父结点*/ int i,start; char tstr[31] = {'\0'}; /*临时存储给定叶子结点的编码,从高下标开始存入*/ for(i = 1; (1) ; i++) { /*对所有叶子结点求编码,i 表示叶结点在 HT 数组中的下标*/ start = 29; pc = i; pf = Ht[i].parent; while (pf != (2) ) { /*没有到达树根时,继续求编码*/ if ( (3) .lchild == pc ) /*pc 所表示的结点是其父结点的左孩子*/ tstr[--start] = '0'; else tstr[--start] = '1'; pc = (4) ; pf = Ht[pf].parent; /*pc 和 pf 分别向根方向回退一层*/ }/* end of while */ Ht[i].pstr = (char *) malloc(31-start); if (!Ht[i].pstr) return ERROR; strcpy(Ht[i].pstr, (5) ); }/* end of for */ return OK; }/* end of LeafCode */ |
查看答案 |
简答题 | 试题四(共15分) 阅读以下说明和C函数代码,回答问题并将解答写在答题纸的对应栏内。[说明] 著名的菲波那契数列定义式为 f1 = 1 f2 = 1 fn = fn-1+ fn-2 (n= 3,4,…) 因此,从第1项开始的该数列为1,1,2,3,5,8,13,21,…。函数fib1和fib2分别用递归方式和迭代方式求解菲波那契数列的第n项(调用fib1、fib2时可确保参数n获得一个正整数)。 [C函数代码] [问题1](6分) 函数fib1和fib2存在错误,只需分别修改其中的一行代码即可改正错误。 (1)函数fib1不能通过编译,请写出fib1中错误所在行修改正确后的完整代码; (2)函数fib2在n≤2时不能获得正确结果,请写出fib2中错误所在行修改正确后的完整代码。 [问题2](3分) 将函数fib1和fib2改正后进行测试,发现前46项都正确,而第47项的值是一个负数,请说明原因。 [问题3](6分) 函数fib1、fib2求得菲波那契数列第n项(n>40)的速度并不相同,请指出速度慢的函数名,并简要说明原因。 |
查看答案 |
简答题 | 试题五(共15分) 阅读以下应用说明、属性设置以及Visual Basic程序代码,将解答写在答题纸的对应栏内。 [应用说明] 本应用运行时,由用户输入一个正整数n后自动产生n个正整数,然后按照用户的指定要求对该组数进行处理。该应用的运行界面如下图所示: 1. 窗体中有两个文本框(txtSrc,txtObj)、两个标签(lblSrc,lblObj)、三个命令按钮(cmdGendat,cmdProc,cmdQuit)和一个弹出式菜单(procMenu,初始时不可见)。 2.文本框txtSrc(由标签lblSrc提示)用于显示产生的数据,文本框txtObj(由标签lblObj提示)用于显示处理结果,要求每行显示一个整数。 3. 程序启动时,命令按钮cmdProc(运算要求)不可用。点击命令按钮cmdGendat(产生数据)后,提示用户输入一个n的值并生成n个正整数存入数组元素a(1)~a(n),然后将数据逐行显示在txtSrc中,并设置命令按钮cmdProc可用。 4. 点击命令按钮cmdProc(运算要求)后弹出菜单。选择菜单项并单击后,进行相应处理并将结果显示在txtObj中,同时将lblObj的标题改为该菜单项表示的处理命令。 弹出式菜单“运算要求”的结构如下表所示: 一个整数序列的中位数指对该序列进行非递减(增)排列后最中间位置上的元素。若序列长度为偶数,则取中间两个元素的平均值为其中位数。 [属性设置] 为实现单击命令按钮cmdProc 后弹出“运算要求”菜单(procMenu),设计时需将procMenu的 (1) 属性设置成false。 供(1)选择的属性: Default Enabled ScaleMode Style Visible [Visual Basic程序代码] Dim a() As Integer, n As Integer Private Sub Form_Load() txtSrc.Text = "": txtObj.Text = "": (2) = False End Sub Private Sub cmdGendat_Click() '生成正整数序列并存入数组a On Error GoTo Error_handler n = InputBox$("请输入数组元素个数:", "输入序列长度") If (n < 1) Then MsgBox "输入数据错误!", vbOKOnly, "提示:" GoTo Error_handler: End If ReDim a(n) As Integer s = "" For i = 1 To n '将生成的正整数存入a(1)~a(n)中 a(i) = Int(Rnd * 10000) : s = s & Str$(a(i)) & vbCrLf Next txtSrc.Text = s (3) '设置运算要求命令按钮可用 Error_handler: End Sub Private Sub cmdProc_Click() PopupMenu procMenu End Sub Private Sub MidNum_Click() '求中位数 lblObj.Caption = MidNum.Caption & ":" For i = 1 To round((n + 1)/2) '用选择排序法对数组a进行部分排序 a(0) = a(i):k = i ' a(0)用作临时变量,暂存第i次选出的最小元素 For j = i + 1 To n If a(j) < a(0) Then a(0) = a(j): k = (4) End If Next If k <> i Then a(k) = a(i): a(i) = a(0) End If Next If n / 2 - n \ 2 > 0 Then 'n为奇数时,取中间一个数 txtObj.Text = Str$(a( (5) )) Else 'n为偶数时,取中间两个数的平均值 txtObj.Text = Str$(Int((a(n \ 2) + a(n \ 2 + 1)) / 2)) End If End Sub '其他代码略 |
查看答案 |
简答题 | 试题六(共15分) 阅读以下说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明] C++标准模板库中提供了vector模板类,可作为动态数组使用,并可容纳任意数据类型,其所属的命名空间为std。vector模板类的部分方法说明如下表所示: [C++代码] #include <iostream> #include <vector> using namespace (1) ; typedef vector< (2) > INTVECTOR; const int ARRAY_SIZE = 6; void ShowVector(INTVECTOR &theVector); int main(){ INTVECTOR theVector; // 初始化theVector,将theVector的元素依次设置为0至5 for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++) theVector.push_back( (3) ); ShowVector(theVector); // 依次输出theVector中的元素 theVector.erase(theVector.begin() + 3); ShowVector(theVector); } void ShowVector(INTVECTOR &theVector) { if (theVector.empty()) { cout << "theVector is empty." << endl; return; } INTVECTOR::iterator (4) ; for (theIterator = theVector.begin(); theIterator != theVector.end(); theIterator++){ cout << *theIterator; if (theIterator != theVector.end()-1) cout << ", "; } cout << endl; } 该程序运行后的输出结果为: 0, 1, 2, 3, 4, 5 (5) |
查看答案 |
简答题 | 试题七(共15分) 阅读以下说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明] java.util库中提供了Vector模板类,可作为动态数组使用,并可容纳任意数据类型。该类的部分方法说明如下表所示: [Java代码] import (1) ; public class JavaMain { static private final int (2) = 6; public static void main(String[] args){ Vector<Integer> theVector = new Vector< (3) >(); // 初始化theVector,将theVector的元素设置为0至5 for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++) theVector.add( (4) ); showVector(theVector); // 依次输出theVector中的元素 theVector.removeElementAt(3); showVector(theVector); } public static void showVector(Vector<Integer> theVector){ if (theVector.isEmpty()) { System.out.println("theVector is empty."); return; } for (int loop = 0; loop < theVector.size(); loop++) { System.out.print(theVector.get(loop)); System.out.print(", "); } System.out.println(); } } 该程序运行后的输出结果为: 0, 1, 2, 3, 4, 5 (5) |
查看答案 |
简答题 | 试题一(共15分) 阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。 【说明】 【流程图】 |
查看答案 |
简答题 | 试题二(共15分) 阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】 C语言常用整型(int)或长整型(long)来说明需要处理的整数,在一般情况下可以满足表示及运算要求,而在某些情况下,需要表示及运算的整数比较大,即使采用更长的整型(例如,long long类型,某些C系统会提供)也无法正确表示,此时可用一维数组来表示一个整数。 假设下面要处理的大整数均为正数,将其从低位到高位每4位一组进行分组(最后一组可能不足4位),每组作为1个整数存入数组。例如,大整数2543698845679015847在数组A中的表示如下(特别引入-1表示分组结束): 在上述表示机制下,函数add_large_number(A,B,C)将保存在一维整型数组A和B中的两个大整数进行相加,结果(和数)保存在一维整型数组C中。 【C函数】 void add_large_number(int A[], int B[], int C[]) { int i, cf ; /*cf存放进位*/ int t, *p; /*t为临时变量,p为临时指针*/ cf = (1) ; for(i = 0; A[i]>-1 && B[i]>-1; i++) { /*将数组A、B对应分组中的两个整数进行相加*/ t = (2) ; C[i] = t % 10000; cf = (3) ; } if ( (4) ) p = B; else p = A; for( ; p[i]>-1; i++) { /*将分组多的其余各组整数带进位复制入数组C*/ C[i] = (p[i] + cf) %10000; cf = (p[i] + cf) /10000; } if ( cf > 0 ) C[i++] = cf; (5) = -1; /*标志"和数"的分组结束*/ } |
查看答案 |
简答题 | 试题三(共15分) 阅读以下说明、C函数和问题,将解答填入答题纸的对应栏内。 【说明】 二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树: ● 若它的左子树非空,则其左子树上所有结点的键值均小于根结点的键值; ● 若它的右子树非空,则其右子树上所有结点的键值均大于根结点的键值; ● 左、右子树本身就是二叉查找树。 设二叉查找树采用二叉链表存储结构,链表结点类型定义如下: typedef struct BiTnode{ int key_value; /*结点的键值,为非负整数*/ struct BiTnode *left,*right; /*结点的左、右子树指针*/ }*BSTree; 函数find_key(root, key)的功能是用递归方式在给定的二叉查找树(root指向根结点)中查找键值为key的结点并返回结点的指针;若找不到,则返回空指针。 【C函数】 BSTree find_key(BSTree root, int key) { if ( (1) ) return NULL; else if (key == root-> key_value) return (2) ; else if (key < root -> key_value) return (3) ; else return (4) ; } 【问题1】 请将函数find_key中应填入(1)~(4)处的字句写在答题纸的对应栏内。【问题2】 若某二叉查找树中有n个结点,则查找一个给定关键字时,需要比较的结点个数取决于 (5) 。 |
查看答案 |
简答题 | 试题四(共15分) 阅读以下两个说明、C函数和问题,将解答写入答题纸的对应栏内。 【说明1】 函数main()的功能旨在对输入的一个正整数n,计算 ,但是对该函数进行测试后没有得到期望的结果。 【C函数1】 1. 输入5测试上述main函数时,显示结果如下所示。 2. 将行号为7的代码修改为:printf("n = %d\nresult: %d\n", n, sum);并再次输入5测试main函数,显示结果如下所示。 【问题1】(9分) 请给出上述main函数中需要修改的代码行号,并给出修改后的整行代码。 【说明2】 函数test_f2()编译时系统报告有错,修改后得到函数f2_B()。对函数f2_B()进行编译时顺利通过,在某些C系统中执行时却由于发生异常而不能正确结束。 【C函数2】 【问题2】(6分) (1)请指出函数test_f2中不能通过编译的表达式; (2)请指出可能导致函数f2_B运行异常的表达式。 |
查看答案 |
简答题 | 试题五(共15分) 阅读以下说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】 C++标准模板库中提供了map模板类,该模板类可以表示多个“键-值”对的集合,其中键的作用与普通数组中的索引相当,而值用作待存储和检索的数据。此外,C++模板库还提供了pair模板类,该类可以表示一个“键-值”对。pair对象包含两个属性:first和second,其中first表示“键-值”中的“键”,而second表示“键-值”中的“值”。 map类提供了insert方法和find方法,用于插入和查找信息。应用时,将一个pair对象插入(insert)到map对象后,根据“键”在map对象中进行查找(find),即可获得一个指向pair对象的迭代器。 下面的C++代码中使用了map和pair模板类,将编号为1001、1002、1003的员工信息插入到map对象中,然后输入一个指定的员工编号,通过员工编号来获取员工的基本信息。员工编号为整型编码,员工的基本信息定义为类employee。 map对象与员工对象之间的关系及存储结构如图5-1所示。 【C++代码】 #include <iostream> #include <map> #include <string> using namespace std ; class employee{ (1) : employee(string name,string phoneNumber, string address){ this->name = name; this->phoneNumber = phoneNumber; this->address = address; } string name; string phoneNumber; string address; }; int main( ) { map <int, employee*> employeeMap; typedef pair <int, employee*> employeePair; for (int employIndex = 1001; employIndex <= 1003; employIndex++){ char temp[10] ; //临时存储空间 _itoa(employIndex,temp,10); //将employIndex转化为字符串存储在temp中 string tmp( (2) ); //通过temp构造string对象 employeeMap. (3) ( employeePair ( employIndex, new employee("employee-" + tmp, "85523927-"+tmp, "address-"+tmp) ) ); //将员工编号和员工信息插入到employeeMap对象中 } int employeeNo = 0; cout << "请输入员工编号:"; (4) >> employeeNo; //从标准输入获得员工编号 map<int,employee*>::const_iterator it; it = (5) .find(employeeNo); //根据员工编号查找员工信息 if (it == employeeMap.end()) { cout << "该员工编号不存在 !" << endl; return -1; } cout << "你所查询的员工编号为:" << it->first << endl; cout << "该员工姓名:" << it->second->name << endl; cout << "该员工电话:" << it->second->phoneNumber << endl; cout << "该员工地址:" << it->second->address << endl; return 0; } |
查看答案 |
简答题 | 试题六(共15分) 阅读以下说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 java.util包中提供了HashMap模板类,该模板类可以表示多个“键-值”对的集合,其中“键”的作用与普通数组中的索引相当,而“值”用作待存储和检索的数据。HashMap实现了Map接口。在Map接口中定义了put和get方法,put方法表示Map对象中加入一个“键-值”对,get方法则通过“键”来获取其对应的“值”。 下面的Java代码中使用了HashMap模板类,将编号为1001、1002、1003的员工信息插入到HashMap对象中,然后输入一个指定的员工编号,通过员工编号来获取员工的基本信息。员工编号为整型编码,而员工的基本信息定义为类employee。 HashMap对象与员工对象之间的关系及存储结构如图6-1所示。 【Java 代码】 import java.util.*; class employee{ employee(String name,String phoneNumber, String address){ this.name = name; this.phoneNumber = phoneNumber; this.address = address; } String name; String phoneNumber; String address; }; ublic class javaMain { public static void main(String[] args) { Map<Integer, employee> employeeMap = new HashMap<Integer, employee>(); for (Integer employIndex = 1001; employIndex <= 1003; employIndex++){ String tmp = employIndex. (1) (); employeeMap. (2) (employIndex, (3) ("employee-"+tmp, "85523927-"+tmp, "address-"+tmp ) ); //将员工编号和员工信息插入到employeeMap对象中 } int employeeNo = 0; System.out.print("请输入员工编号:"); Scanner s= new Scanner(System.in); employeeNo = s.nextInt(); //从标准输入获得员工编号 employee result = employeeMap. (4) (employeeNo); if ( (5) == null) { System.out.println("该员工编号不存在 !"); return; } System.out.println("你所查询的员工编号为:" + employeeNo); System.out.println("该员工姓名:" + result.name); System.out.println("该员工电话:" + result.phoneNumber); System.out.println("该员工地址:" + result.address ); } } |
查看答案 |
简答题 | 试题一(共15分)阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。 【说明】求连续函数f(x)的根(方程f(x)=0的解)的最简单方法是二分法。为此,首先需要在若干点上检查函数值的符号,如果发现f(a)与f(b)符号相反(a<b),则在区间(a, b)中必然存在f(x)的根。因为当x从a变到b时,连续函数的值将从正变到负(或从负变到正),必然要经过0。区间(a, b)就是根的初始范围。 取该区间的中点m,如果f(m)=0,则根就是m。如果f(a)与f(m)符号相反,则根一定在区间(a, m)中;如果f(m)与f(b)符号相反,则根一定在区间(m, b)中。因此,根的范围缩小了一半。 依此类推,将区间一半一半地分下去,当区间的长度很小(达到根的精度要求,例如0.001)时,或者当区间中点处的函数值几乎接近于0(即绝对值小于预先规定的微小量,例如0.001)时,近似计算就可以结束了。 以下流程图描述了用二分法近似计算区间(a, b)中f(x)的根的过程。 【流程图】 |
查看答案 |