您的位置:首页 > 职场人生

2006年上半年程序员下午试题

2013-05-31 22:36 218 查看
2006年上半年程序员下午试题试题一(共15分)
  阅读以下说明和流程图,回答问题1至问题3,将解答填入答题纸的对应栏内。
[说明]
信息处理过程中经常需要将图片或汉字点阵做旋转处理。一个矩阵以顺时针方向旋转90°后可以形成另一个矩阵,如下图所示:
ABCD
EFGH
1JKL
MNOP
───→
MIEA
NJFB
OKGC
PLHD
  流程图1-1描述了对n*n矩阵的某种处理。流程图1-2是将矩阵A顺时针旋转90°形成矩阵B的具体算法。
[流程图1-1][流程图1-2]


[问题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中的空缺。
试题二(共15分)
  阅读以下说明和C语言函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
[说明]
函数chanse(int num)的功能是对四位以内(含四位)的十进制正整数num进行如下的变换:将num的每一位数字重复一次,并返回变换结果。例如,若num=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 > O) {
d = m % 10;
m = __(3)__;
result = result + (__(4)__) * mul;
mul = __(5)__;
}
return result;
}
试题三(共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;
}
   从下列的2道试题(试题四至试题五)中任选1道解答。
   如果解答的试题数超过1道,则题号小的1道解答有效。
试题四(共15分)
  阅读以下说明和C语言函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
[说明]
  某工厂A负责为某大型企业B加工零件,A每天必须为B提供一定数量的零件。由于某种客观原因,A每天生产的零件的单价都不相同。若A某天生产的零件数多于B需要的数目,则多余的零件可以放到第二天及以后再使用,但需要收取每个零件的保管费 (产品单价之外附加的费用),每个零件在不同日期收取的保管费也不相同。
  例如,在5天的生产中,B要求的零件需求量及A核算出的零件单价和保管费用如表1所示:
表1
第一天第二天第三天第四天第五天
需求量(个)
25 15 30 35 30
零件的单价(元)
20 30 32 25 35
单个零件的保管费用(元)
4.5 8.0 6.8 5.5 6.1
A可以制订多种生产计划,但费用可能不同。例如,表2所示为生产计划及其费用。表2
计划产量(个) 总费用
(元)
第一天第二天第三天第四天第五天
计划1 25 15 30 35 39 3835
计划2 40 0 30 50 15 3685
计划3 70 0 0 65 0 3632.5
计划4 35 10 20 40 35 /
  注:(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
  从下列的3道试题(试题六至试题八)中任选1道解答。
  如果解答的试题数超过1道,则题号小的1道解答有效。
试题六(共15分)
  阅读以下说明和C++代码,将解答写在答题纸的对应栏内。
[说明]
已知类SubClass的getSum方法返回其父类成员与类SubClass成员j的和,类SuperClass中的getSum为纯虚拟函数‘程序中的第23行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,分析程序运行到第15行且尚未执行第15行的语句时成员变量j的值,最后给出程序运行后的输出结果。
[C++代码]
行号  代码
O1#include <iostream>
02using namespace std;
03class SuperClass {
04private:
05int i;
06public:
07SuperClass(){ i = 5;}
08virtual iht getValueO {return i; }
09virtual int getSum()=0;
lO};
11class SubClass:publicSuperClass{
12int j;
13public:
14SubClass(int j) :j(0){
15___(1)___ =j;//用参数j的值更新数据成员
16};
17int getValue(){returnj;}
18int getSum(){
19return ___(2)___getValue() + j;
20}
21};
22void main(void) {
23SuperClass s = newSubClass(-3);
24cout <<s->getValue() << " ";
25cout <<s->getSum() << endl;
26delete 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(关闭状态)。
  为使该应用程序运行时能播放声音文件,在开发时应利用菜单“工程-部件”,选择加载组件“MicrosoftMultimedia 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代码]
行号 代码
01public classUainJava{
02public static voidmain(String[]args){
03SuperClass s=newSubClass();
04System.out.println(s.getValue());
05System.out.println(S.getSum());
06}
07}
08abstract classSuperClass{
09private int i;
10public SuperClass(){i=5;}
11public int getValue(){
12return i;
13}
14public final abstractint getSum();
15}
16class SubClass extendsSuperClass{
17int j;
18public SubClass(){
19this(-3);
20}
21public SubClass(int j){
22___(1)___.j=j;
23}
24public intgetValue(){return j;}
25public int getSum(){
26return___(2)___.getValue()+j;
27}
28}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: