2006年下半年程序员下午试卷

考试总分:8分

考试类型:模拟试题

作答时间:60分钟

已答人数:967

试卷答案:有

试卷介绍: 2006年下半年程序员下午试卷

开始答题

试卷预览

  • 1. 试题五(共15分)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某班级有N名学生,他们可根据自己的情况选修名称和数量不尽相同的课程。设N等于6,学生信息、所选课程及成绩用链表结构存储,如图5-1所示。程序中相应的类型定义如下:#defineN6structnode{charcname[5];/*课程名*/intgrade;/*成绩*/structnode*next;/*指针,指示某学生选修的下一门课程及成绩*/};structstudent{charxh[5];/*学号*/charname[20];/*姓名*/structnode*link;/*指针,指示出选修的课程及成绩链表*/}stud_info[N];stud_info[]为一个全局数组。函数func(charkc[],int*num)的功能是统计选修了课程名为kc的学生的人数,并返回该课程的平均成绩(若无人选修该课程,则平均成绩为0),参数num带回选修课程kc的学生人数。[C函数]doublefunc(charkc[],int*num){inti,count=0,sum=0;/*count用于记录选修课程名为kc的学生的人数*/doubleavg=0.0;structnode*p;for(i=0;inext;}/*while*/}(4);if((5))avg=(double)sum/count;/*计算平均成绩*/returnavg;}/*func*/[15分]

    A(1);/*取第i个学生所修课程链表的头指针*/while(p){if(

    B(2)){sum=

    C(3);count++;break;}/*if*/p=p->next;}/*while*/}

    D(4);if(

    E(5))avg=(double)sum/count;/*计算平均成绩*/returnavg;}/*func*/[15分]

  • 2. 试题七(共15分)阅读以下应用说明以及用VisualBasic编写的程序代码,将应填入(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,…,再用直线段连接各相邻曲线点形成温度曲线。[VisualBasic程序代码]Dim(1)AsInteger'声明全局变量PrivateSubCmdStart_Click()TimT.Enabled=TrueShpT.Visible=TrueEndSubPrivateSubCmdStop_Click()TimT.Enabled=FalseEndSubPrivateSubForm_Load()Dimi,HAsIntegerPicCurve.Scale(0,0)-(50,180)'设置图片框坐标系:左上角-右下角H=30'H等于图片框高度的六分之一Fori=0To4'设置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'设置曲线坐标初值EndSubPrivateSubtimT_Timer()DimT,HAsInteger'T为即时温度,H为图片框中温度点显示高度T=Int(Rnd*181)+20'模拟随机产生设备温度(20~200度)'按当前温度显示水银柱H=ShpMeter.Height*(3)'算出水银柱的高度ShpT.Top=(4)-H'设置水银柱顶部位置ShpT.Height=H'设置水银柱的高度'绘制温度曲线y=(5)'算出曲线上当前点的纵坐标Ifx=51Then'当超出图片框时PicCurve.Cls'清除图片框内以前画的曲线x=0'设置重画曲线的初值ElseIfx>0Then'除左边点外PicCurve.Line(x-1,Lasty)-(x,y),vbRed'由前1点到当前点画红色线段EndIfx=x+1'准备下一点坐标Lasty=y'保存当前坐标供下次使用EndSub[15分]

    A(1)AsInteger'声明全局变量PrivateSubCmdStart_Click()TimT.Enabled=TrueShpT.Visible=TrueEndSubPrivateSubCmdStop_Click()TimT.Enabled=FalseEndSubPrivateSubForm_Load()Dimi,HAsIntegerPicCurve.Scale(0,0)-(50,180)'设置图片框坐标系:左上角-右下角H=30'H等于图片框高度的六分之一Fori=0To4'设置5条水平线Ls(i)的位置Ls(i).X1=0'Ls(i)起点横坐标Ls(i).Y1=H*

    B(2)'Ls(i)起点纵坐标Ls(i).X2=50'Ls(i)终点横坐标Ls(i).Y2=Ls(i).Y1'Ls(i)终点纵坐标Ls(i).BorderColor=&HC0C0C0'设置水平线颜色x=0'设置曲线坐标初值EndSubPrivateSubtimT_Timer()DimT,HAsInteger'T为即时温度,H为图片框中温度点显示高度T=Int(Rnd*181)+20'模拟随机产生设备温度(20~200度)'按当前温度显示水银柱H=ShpMeter.Height*

    C(3)'算出水银柱的高度ShpT.Top=

    D(4)-H'设置水银柱顶部位置ShpT.Height=H'设置水银柱的高度'绘制温度曲线y=

    E(5)'算出曲线上当前点的纵坐标Ifx=51Then'当超出图片框时PicCurve.Cls'清除图片框内以前画的曲线x=0'设置重画曲线的初值ElseIfx>0Then'除左边点外PicCurve.Line(x-1,Lasty)-(x,y),vbRed'由前1点到当前点画红色线段EndIfx=x+1'准备下一点坐标Lasty=y'保存当前坐标供下次使用EndSub[15分]

  • 3. 试题一(共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分]

    A(1);第二步:点(i0,j0)的颜色值→oldcolor;创建栈S,并将点坐标(i0,j0)入栈;第三步:若

    B(2),则转第七步;第四步:栈顶元素出栈→(x,y),并

    C(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;第六步:转

    D(4);第七步:算法结束。[问题]是否可以将算法中的栈换成队列?回答:

    E(5)。[15分]

  • 4. 试题二(共15分)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某单位准备进行一次选举,对指定的n名(n<80)候选人进行投票。为了简化选举工作,事先印制了写有这n名候选人姓名的选票,投票者只需将选中者名下的圆圈涂黑即可。规定每张选票上被涂黑的圆圈数不得超过3个,也不得少于1个,否则视为无效选票。投票结束后,所有选票经计算机扫描处理,形成了描述选票状态的文本文件。例如,n=8时所形成的文件如下:010110001001010010011000111111110000000000111000…其中,每行表示一张选票的数据,每列代表一位候选者的得票情况。第i行第j列为1,表示第i张选票上投了第j名候选人1票。函数statistic()的功能是读入选票数据,并统计每位候选者的得票数,函数返回有效选票数。[C函数]intstatistic(FILE*fp,intcandidate[],intn){/*从文件中读入选票数据,n为候选人数量(n<80),从有效选票中统计每位候选者的得票数并存入candidate[],函数返回有效选票数*/charstr[80];/*str保存读入的一张选票数据*/inti,tag=0;/*tag用于判断每张选票是否有效*/intq=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);}}returnq;}/*statistic*/[15分]

    A(1)){fgets(str,80,fp);/*读入一张选票数据*/for(tag=0,i=0;

    B(2);i++)if(str[i]=='1')tag++;if(

    C(3)){/*若是有效选票,则进行统计*/

    D(4);for(i=0;i<n;i++)if(str[i]=='1')

    E(5);}}returnq;}/*statistic*/[15分]

  • 5. 试题三(共15分)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示。为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示,其转置矩阵MT的三元组顺序表如表3-2所示。函数TransposeMatrix(MatrixM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置:cpot[0]=0cpot[j]=cpot[j-1]+num[j-1]/*j为列号*/类型ElemType、Triple和Matrix定义如下:typedefintElemType;typedefstruct{/*三元组类型*/intr,c;/*矩阵元素的行号、列号*/ElemTypee;/*矩阵元素的值*/}Triple;typedefstruct{/*矩阵的三元组顺序表存储结构*/introws,cols,elements;/*矩阵的行数、列数和非零元素数目*/Tripledata[MAXSIZE];}Matrix;[C函数]intTransposeMatrix(MatrixM){intj,q,t;int*num,*cpot;MatrixMT;/*MT是M的转置矩阵*/num=(int*)malloc(M.cols*sizeof(int));cpot=(int*)malloc(M.cols*sizeof(int));if(!num||!cpot)returnERROR;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);/*此处输出矩阵元素,代码省略*/returnOK;}/*TransposeMatrix*/[15分]

    A(1);/*设置转置矩阵MT行数、列数和非零元数目*/MT.cols=

    B(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中每列第一个非零元素在其转置矩阵三元组顺序表中的位置*/

    C(3);for(j=1;j<M.cols;j++)cpot[j]=

    D(4);/*以下代码完成转置矩阵MT三元组顺序表元素的设置*/for(t=0;t<M.elements;t++){j=

    E(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);/*此处输出矩阵元素,代码省略*/returnOK;}/*TransposeMatrix*/[15分]

  • 6. 试题四(共15分)阅读以下应用说明以及用VisualBasic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用4.1]设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框(chk1,chk2,chk3),各个复选框单击事件过程的程序代码如下:PrivateSubchk1_Click()Label.fontBold=chk1.ValueEndSubPrivateSubchk2_Click()Label.fontItalic=chk2.ValueEndSubPrivateSubchk3_Click()Label.fontUnderLine=chk3.ValueEndSub三个复选框chk1、chk2、chk3的功能分别是:(1)。[应用4.2]设应用程序的运行窗口内有两个文本框Txt1和Txt2,其初始内容为空。在Txt1文本框中输入一个数值,当光标离开此文本框(例如进入文本框Txt2)时,执行的程序代码如下:PrivateSubTxt1_LostFocus()dimxasdoublex=Val(Txt1.Text)Ifx100ThenTxt1.Text=""MsgBox$("请重新输入!")Txt1.SetFocusElseTxt2.Text=Txt1.TextEndIfEndSub该程序代码的功能是:若在文本框Txt1中输入的数值小于0或大于100,当光标离开此文本框时,(2);否则,将其值复制到文本框Txt2中。[应用4.3]在下面的应用中,当窗口内发生Click事件时,窗口内将显示如图4-1所示的杨辉三角形(每一行都是二项式展开的系数)。请完善程序代码PrivateSubForm_Click()Dimi,j,cAsInteger,StrTempAsStringDima(9)AsIntegera(0)=0:a(1)=1StrTemp=Str(a(1))+Space(3)CurrentX=(ScaleWidth-TextWidth(StrTemp))/2PrintStrTempForj=2To9a(j)=1Forc=j-1To2Step-1a(c)=(3)Next(4)=""Forc=1TojStrTemp=StrTemp&Str((5))&Space(5-Len(Str(a(c))))NextCurrentX=(ScaleWidth-TextWidth(StrTemp))/2PrintStrTempNextEndSub[15分]

    A(1)。[应用4.2]设应用程序的运行窗口内有两个文本框Txt1和Txt2,其初始内容为空。在Txt1文本框中输入一个数值,当光标离开此文本框(例如进入文本框Txt2)时,执行的程序代码如下:PrivateSubTxt1_LostFocus()dimxasdoublex=Val(Txt1.Text)Ifx100ThenTxt1.Text=""MsgBox$("请重新输入!")Txt1.SetFocusElseTxt2.Text=Txt1.TextEndIfEndSub该程序代码的功能是:若在文本框Txt1中输入的数值小于0或大于100,当光标离开此文本框时,

    B(2);否则,将其值复制到文本框Txt2中。[应用4.3]在下面的应用中,当窗口内发生Click事件时,窗口内将显示如图4-1所示的杨辉三角形(每一行都是二项式展开的系数)。请完善程序代码PrivateSubForm_Click()Dimi,j,cAsInteger,StrTempAsStringDima(9)AsIntegera(0)=0:a(1)=1StrTemp=Str(a(1))+Space

    C(3)CurrentX=(ScaleWidth-TextWidth(StrTemp))/2PrintStrTempForj=2To9a(j)=1Forc=j-1To2Step-1a(c)=(3)Next

    D(4)=""Forc=1TojStrTemp=StrTemp&Str(

    E(5))&Space(5-Len(Str(a(c))))NextCurrentX=(ScaleWidth-TextWidth(StrTemp))/2PrintStrTempNextEndSub[15分]

  • 7. 试题六(共15分)阅读以下说明和C++程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]在下面的C++代码中,类SalesTicket能够完成打印票据正文的功能,类HeadDecorator与FootDecorator分别完成打印票据的台头和脚注的功能。已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。这是票据的台头!这是票据正文!这是票据的脚注!------------------------这是票据的台头!这是票据的脚注![C++程序代码]#includeusingnamespacestd;classSalesTicket{public:(1)printTicket(){coutprintTicket();}};classHeadDecorator:publicDecorator{public:HeadDecorator(SalesTicket*t):(2){}voidprintTicket(){cout<<"这是票据的台头!"<<endl;Decorator::printTicket();}};classFootDecorator:publicDecorator{public:FootDecorator(SalesTicket*t):(3){}voidprintTicket(){Decorator::printTicket();cout<<"这是票据的脚注!"<<endl;}};voidmain(void){SalesTickett;FootDecoratorf(&t);HeadDecoratorh((4));h.printTicket();cout<<"------------------------"<<endl;FootDecoratora(NULL);HeadDecoratorb((5));b.printTicket();}[15分]

    A(1)printTicket(){coutprintTicket();}};classHeadDecorator:publicDecorator{public:HeadDecorator(SalesTicket*t):

    B(2){}voidprintTicket(){cout<<"这是票据的台头!"<<endl;Decorator::printTicket();}};classFootDecorator:publicDecorator{public:FootDecorator(SalesTicket*t):

    C(3){}voidprintTicket(){Decorator::printTicket();cout<<"这是票据的脚注!"<<endl;}};voidmain(void){SalesTickett;FootDecoratorf(&t);HeadDecoratorh(

    D(4));h.printTicket();cout<<"------------------------"<<endl;FootDecoratora(NULL);HeadDecoratorb(

    E(5));b.printTicket();}[15分]

  • 8. 试题八(共15分)阅读以下说明和Java程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]在下面的Java程序代码中,类SalesTicket能够完成打印票据正文的功能,类HeadDecorator与FootDecorator分别完成打印票据的台头和脚注的功能。已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。这是票据的台头!这是票据正文!这是票据的脚注!------------------------这是票据的台头!这是票据的脚注![Java程序代码]publicclassSalesTicket{publicvoidprintTicket(){System.out.println("这是票据正文!");}}publicclassDecoratorextendsSalesTicket{SalesTicketticket;publicDecorator(SalesTickett){ticket=t;}publicvoidprintTicket(){if(ticket!=null)ticket.printTicket();}}publicclassHeadDecoratorextendsDecorator{publicHeadDecorator(SalesTickett){(1);}publicvoidprintTicket(){System.out.println("这是票据的台头!");super.printTicket();}}publicclassFootDecoratorextendsDecorator{publicFootDecorator(SalesTickett){(2);}publicvoidprintTicket(){super.printTicket();System.out.println("这是票据的脚注!");}}publicclassMain{publicstaticvoidmain(String[]args){T=newHeadDecorator((3));T.(4);System.out.println("------------------------");T=newFootDecorator((5));T.printTicket();}}[15分]

    A(1);}publicvoidprintTicket(){System.out.println("这是票据的台头!");super.printTicket();}}publicclassFootDecoratorextendsDecorator{publicFootDecorator(SalesTickett){

    B(2);}publicvoidprintTicket(){super.printTicket();System.out.println("这是票据的脚注!");}}publicclassMain{publicstaticvoidmain(String[]args){T=newHeadDecorator(

    C(3));T.

    D(4);System.out.println("------------------------");T=newFootDecorator(

    E(5));T.printTicket();}}[15分]

相关试卷
相关题库