文档库 最新最全的文档下载
当前位置:文档库 › 2006年上半年程序员考试下午试题及答案

2006年上半年程序员考试下午试题及答案

2006年上半年程序员考试下午试题及答案
2006年上半年程序员考试下午试题及答案

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

试题一(共15分)

阅读以下说明和流程图,回答问题1至问题3,将解答填入答题纸的对应栏内。 [说明]

信息处理过程中经常需要将图片或汉字点阵做旋转处理。一个矩阵以顺时针方向旋转90°后可以形成另一个矩阵,如下图所示:

───→

流程图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;

}

试题四(共15分)

阅读以下说明和C语言函数,将应填入__(n)__处的字句写在答题纸的对应栏内。

[说明]

某工厂A负责为某大型企业B加工零件,A每天必须为B提供一定数量的零件。由于某种客观原因,A每天生产的零件的单价都不相同。若A某天生产的零件数多于B需要的数目,则多余的零件可以放到第二天及以后再使用,但需要收取每个零件的保管费 (产品单价之外附加的费用),每个零件在不同日期收取的保管费也不相同。

例如,在5天的生产中,B要求的零件需求量及A核算出的零件单价和保管费用如表1所示:

表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个)。

函数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

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" '确定声音文件名

https://www.wendangku.net/doc/9c16612607.html,mand = "Open" '打开多媒体设备

https://www.wendangku.net/doc/9c16612607.html,mand = "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 }

试题一

[问题1]

0 0 1

0 1 0

1 0 0

[问题2]

a b a

b c b

a b a

[问题3]

(1) B(j,n-i+1)

(2) C(n-i+1,n-j+1)

(3) A(n-j+1,i)

试题二

(1) num/10000 > 0

(2) result = 0

(3) m/10

(4) d * 10 + d

(5) mul * 100

试题三

(1) InitStack(&s_bak)

(2) Top(*s)

(3) Push(&s_bak,ch)

(4) !IsEmpty(s_bak)

(5) Pop(&s_bak)

试题四

(1) acc_qty = 0

(2) P_num[i] * data[i].Price

(3) acc_qty - acc_req[i]

(4) tag

(5) cost_Produce + cost_Keep < mincost

试题五

(1) List1.Text

(2) List1.ListCount - 1

(3) List1.List(i)

(4) List2.ListIndex

(5) List2.Clear

试题六

(1) this->j

(2) SuperClass

错误更正结果:SuperClass * s = new SubClass(-3) 变量j的值:0

运行结果: -3 2

试题七

(1) True

(2) x As Single

(3) 2 + Sin(x)

(4) 2 + Cos(x)

(5) Timer1.Enabled = False

试题八

(1) this

(2) super

错误更正结果:public abstract int getSum ()

变量i的值:5

运行结果: -3

2

相关文档