200611程序员下午真题
第 1 题
() (共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+ I)入栈S;
3)若点(x-1, y)在图像中且G[x-1, y]等于oldcolor,则(x-1, y)入栈S;
4)若点(x+1, y)在图像中且G[x+l, y]等于oldcolor,则(x+1, y)入栈S;
第六步:转 (4) ;
第七步:算法结束。
【问题】
是否可以将算法中的栈换成队列?回答: (5) 。
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 2 题
()(共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 */
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 3 题
()(共15分)
阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵对丁tm行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示
图3-1稀疏矩阵M及其转置矩阵MT
为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元索宜、表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零三素也称为三元组顺序表)。例如,图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*/
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 4 题
() 〔共15分)
阅读以下应用说明以及用Visual Basic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【应用4.1】
设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框(chkl,chk2,chk3 ),各个复选框单击事件过程的程序代码如下:
Private Sub chkl Click()
Label.fontBold = chkl.Value
End Sub
Private Sub chk2 Click()
Label.fontItalic = chk2.Value
End Sub
Private Sub chk3 Click()
Label.fontUnderLine = chk3.Value
End Sub
三个复选框chkl、chk2、chk3的功能分别是:(l )
【应用4.2】
设应用程序的运行窗口内有两个文本框Txt 1和Txt2,其初始内容为空。在Txt 1文本框中输入一个数值,当光标离开此文本框(例如进入文本框Txt2 )时,执行的程序代码如下:
Private Sub Txtl_LostFocus()
dim x as double
x = Val(Txtl.Text)
If x<0 Or x>100 Then
Txtl.Text = “ ”
MsgBox$(“请重新输入!”)
Txtl.SetFocus
Else
Txt2.Text = Txtl.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分)
阅读以下应用说明以及用Visual Basic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【应用4.1】
设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框(chkl,chk2,chk3 ),各个复选框单击事件过程的程序代码如下:
Private Sub chkl Click()
Label.fontBold = chkl.Value
End Sub
Private Sub chk2 Click()
Label.fontItalic = chk2.Value
End Sub
Private Sub chk3 Click()
Label.fontUnderLine = chk3.Value
End Sub
三个复选框chkl、chk2、chk3的功能分别是:(l )
【应用4.2】
设应用程序的运行窗口内有两个文本框Txt 1和Txt2,其初始内容为空。在Txt 1文本框中输入一个数值,当光标离开此文本框(例如进入文本框Txt2 )时,执行的程序代码如下:
Private Sub Txtl_LostFocus()
dim x as double
x = Val(Txtl.Text)
If x<0 Or x>100 Then
Txtl.Text = “ ”
MsgBox$(“请重新输入!”)
Txtl.SetFocus
Else
Txt2.Text = Txtl.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
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 5 题
() (共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*/
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 6 题
() (共15分)
阅读以下说明和C++程序代码,将应填入一丛皿一处的字句写在答题纸的对应栏内。
【说明】
在下面的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();
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 7 题
阅读以下应用说明以及用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).Xl=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 ‘设置水平线颜色
Next i
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
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 8 题
() (共15分)
阅读以下说明和Java程序代码,将应填入(n)处的字句写在答题纸的对
【说明】
在下面的Java程序代码中,类SalesTicket能够完成打印票据正文的功能,类HeadDecorator与FootDecorator分别完成打印票据的台头和脚注的功能。
己知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。
这是票据的台头!
这是票据正文!
这是票据的脚注!
---------------------------------------------
这是票据的台头!
这是票据的脚注!
【Java程序代码】
public class SalesTicket{
public void printTicket(){
System. out. println(“这是票据正文!” );
}
}
public class Decorator extends SalesTicket{
SalesTicket ticket;
publi。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();
}
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析: