200605程序员下午真题
第 1 题
() (共15分)
阅读以下说明和流程图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
信息处理过程中经常需要将图片或汉字点阵做旋转处理。一个矩阵以顺时针方向旋转90°后可以形成另一个矩阵,如下图所示:
流程图1-1描述了对n*n矩阵的某种处理。流程图1-2是将矩阵A顺时针旋转90°形成矩阵B的具体算法。
【问题1】(3分)请写出以下3*3单位矩阵沿顺时针方向旋转90°后所形成的矩阵。
【问题2】(3分)如果以下3*3矩阵沿顺时针方向旋转90°后所形成的矩阵就是原来的
矩阵: 其中,位于*处的元素需要考生填写,请完整地写出该矩阵。
【问题3】(9分)在上述流程图1-1和1-2的算法中,
(1)矩阵A第i行第j列的元素A(i,j)被复制到矩阵B中的哪个位置?
(2)A(i,j)后来又被复制到矩阵C中的哪个位置?
(3)填补流程图1-2中的空缺。
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 2 题
() (共15分)
阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
函数change(int num)的功能是对四位以内(含四位)的十进制正整数num进行如下的变换:将num的每一位数字重复一次,并返回变换结果。例如,若nun = 5234,则函数的返回值为55223344,其变换过程可描述为:
(4*10+4)* 1 +(3*10+3)*100 + (2*10+2)*10000 + (5*10+5)*1000000 = 55223344
【C语言函数】
long change(int num)
{
int d, m = num;
long result,mul;
if(num <= 0 || (1) ) /*卡若num不大于0或num的位数大于4,则返回-1*/
return -1;
mul = 1;
(2) ;
while (m > 0) {
d = m % lO;
m = (3) ;
result = result + ( (4) ) * mul;
mul = (5) ;
}
return result;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 3 题
() 试题三(共15分)
阅读以下说明和C语言函数,将应填入 (n) 处的宇句写在答题纸的对应栏内。
【说明】
函数bool Del_elem(STACK *s,char para_ch)的功能是:删除栈*s中与para_ch之值相等且最接近栈项的元素(字符),若栈中不存在该元素,则函数返回FALSE,否则返回TRUE。其中,STACK是栈的类型名。
函数Del_elem实现上述功能的方法是:利用栈的基本操作,先将栈*s中所有比para_ch之值更接近栈顶的元素暂时存放在临时工作栈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_bak中*/
while(!IsEmpty(*S)) {
ch = (2) ; /*取栈顶元素*/
Pop(s);
if (ch == para_ch) {
tag = TRUE;
break;
}
(3) ;
}
/*将暂存于临时工作栈s_bak中的元素存回栈*S */
while ( (4) ) {
ch = Top(s_bak);
(5) ;
Push(s, ch);
}
return tag;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 4 题
()(共15分)
阅读以下说明和C语言函数,将应填入 (n) 处的字旬写在答题纸的对应栏内。
【说明】
某工厂A负责为某大型企业B加工零件,A每天必须为B提供一定数量的零件。由于某种客观原因,A每天生产的零件的单价都不相同。若A某天生产的零件数多于B需要的数目,则多余的零件可以放到第二天及以后再使用,但需要收取每个零件的保管费(产品单价之外附加的费用),每个零件在不同日期收取的保管费也不相同。
例如,在5天的生产中,B要求的零件需求量及A核算出的零件单价和保管费用如表l所示:表1
A可以制订多种生产计划,但费用可能不同。例如,表2所示为生产计划及其费用。
表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个)。
函数find_a_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];/*记录成本最小的生产计划,B_s[0]不用,DAYS定义为天数*/
double find_a_plan(FILE *inf)
{int P_num[DAYS+l],acc_req[DAYS+1];
int i,tag = 0,acc_qty = 0;
double mincost = 1.0e20,cost_Produce,cost_Keep;
for(i=l;i<=DAYS;i++){/*到第i天时的累计零件需求量存入acc_req[i]*/ acc_qty += 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 = l, (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 mlncost;
}
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 5 题
阅读以下应用说明以及用Visual Basic开发过程中所编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【应用说明】
某应用程序在运行过程中的一个界面如下图所示:
在“供选课程”列表框(名为List1)中选择某个课程后,再单击“>”按钮(名称为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 = List2.List(i)Then Exit Sub ‘不要重复选择
Next i
List2.AddItem (1) ‘在List2中增添List1中所选的项
End Sub
Private Sub CmdSelAll_Click()
List2.Clear ‘先删除List2中的己有项
For i=0 To (2) ‘对List1中所有各项做循环处理
List2.Addlte (3) ‘将该项增添到List2中
Next i
End Sub
Private Sub CmdDelete_Click()
If List2.ListIndex >= 0 Then ‘如果List2中有选中的项
List2.RemoveItem (4) ‘则删除所选的项
End If
End Sub
Private Sub CmdDelAll_Click()
(5)
End Sub
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 6 题
() (共15分)
阅读以下说明和C++代码,将解答写在答题纸的对应栏内。
【说明】
已知类SubClass的getSum方法返回其父类成员i与类SubClass成员j的和,类SuperClass中的getSum为纯虚拟函数。程序中的第23行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,分析程序运行到第15行且尚未执行第15行的语句时成员变量j的值,最后给出程序运行后的输出结果。
【C++ 代码】
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 7 题
阅读以下应用说明以及用Visual Basic开发过程中进行的属性设置和所编写的程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【应用说明】
启动某应用程序后,其运行窗口左边会出现两只蝴蝶,下边有“启动”和“停止”两个按钮。单击“启动”按钮后,伴随“两只蝴蝶”音乐,两只蝴蝶会分别沿两条互绞的曲线,自左至右翩翩飞行(见下图),而且飞出窗口右边后又会再从窗口左边飞入。单击“停止”按钮时,两只蝴蝶停止飞行,回到初始状态,音乐也同时停止。再单击“启动”按钮时,蝴蝶重新开始伴音飞行。
在开发该应用时,两只蝴蝶用两个图像框来表示,分别命名为Image1和Image2,其Picture属性分别设置为各个蝴蝶的图像文件名,其stretch属性都应设置为 (1),使图像能自动改变大小以适应图像框。再在窗体中建立“启动”按钮(名为CmdStart)和“停止”按钮(名为CmdStop)。
蝴蝶所飞行的路线分别用正弦和余弦曲线描述。为此,首先需要用Scal方法对窗体定义坐标系统。设左上角坐标为(0,0),右下角坐标为(20,6)。蝴蝶1的飞行曲线设为:y1=2+sin x,蝴蝶2的飞行曲线设为:y2=2+cos x。蝴蝶飞行的位置坐标(x,y)确定了蝴蝶图像框的位置(Left属性值和Top属性值)。
设置一个定时器(名为timer1),其定时时间间隔为0.1秒,所以其Interval属性值应设置为100。每隔0.1秒需要对两个图像框的位置进行一次调整。初始时,该定时器的Enabled属性应设为False(关闭状态)。
为使该应用程序运行时能播放声音文件,在开发时应利用菜单“工程-部件”,选择加载组件“Microsoft Multimedia Control 6.0”,并在窗体中设置多媒体控件(设命名为MMC)。由于不需要用户控制,其Visible属性可设置为False(不可见)。右击该控件,可选择该控件中各按钮的属性,应注意选择“播放”有效、“停止”有效。“两只蝴蝶”的音乐文件应提前准备好,并通过某种音频处理程序将其转换成WAV格式,存放在开发该应用的当前目录中。
【Visual Basic程序代码】
Dim (2) ‘声明全局变量
Private Sub Form_Load()
Scale(0,0)-(20,6) ‘定义窗体的坐标系统
End Sub
Private Sub CtndStart_Click()
X = 0
MMC.DeviceType = “WaveAudio” ‘设置多媒体设备类型
MMC.FileName = “两只蝴蝶.wav” ‘确定声音文件名
MMC.Command = ”Open” ‘打开多媒体设备
MMC.Command = ”Play” ‘启动声音的播放
Tirner1.Enabled = True ‘打开定时器
End Sub
Private Sub Tirner1_Timer()
If x>20 Then x = x-20 ‘蝴蝶飞到右边界后再回到左边界
Image1.Left = x ‘动态调整蝴蝶框的位置
Image1.Top = (3)
In;age2.Left = x
Image2.Top = (4)
x = x+0.l ‘确定蝴蝶下一步飞行位置
End Sub
Private Sub CmdStop_Click()
(5)
Itnage1.Left = 0 ‘蝴蝶位置初始化
Image1.Top = 2
Image2.Left = 0
Image2.Top = 3
MMC.Command = “Stop” ‘停止播放
MMC.Command = “Close″ ‘关闭多媒体设备
End Sub
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析:
第 8 题
() (共15分)
阅读以下说明和Java代码,将解答写在答题纸的对应栏内。
【说明】
已知类SubClass的getSum方法返回其父类成员i与类SubClass成员j的和,类SuperClass中的getSum为抽象函数,程序中的第14行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,当程序运行到第22行且尚未执行第22行语句时成员变量i的值,最后给出程序运行后的输出结果。
【Java 代码】
答案与解析
- 试题难度:较难
- 知识点:
- 试题答案:
- 试题解析: