image

编辑人: 长安花落尽

calendar2025-06-01

message8

visits496

2013年11月 程序员 下午题参考答案

一、问答题

1、阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
[说明]
两个包含有限个元素的非空集合A、B的相似度定义为|A∩B|/|A∪B|,即它们的交集大小(元素个数)与并集大小之比。
以下的流程图计算两个非空整数集合(以数组表示)的交集和并集,并计算其相似度。已知整数组A[1:m]和B[1:n]分别存储了集合A和B的元素(每个集合中包含的元素各不相同),其交集存放于数组C[1:s],并集存放于数组D[1:t],集合A和B的相似度存放于SIM。
例如,假设A={1,2,3,4},B={1,4,5,6},则C={1,4),D={1,2,3,4,5,6},A与B的相似度SIM=1/3。
[流程图]

参考答案:

 

 

s
t
C[s]
D[t]
s/t

 



2、 

阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。

[说明]
下面的函数sort(int n,int a[])对保存在数组a中的整数序列进行非递减排序。由于该序列中的元素在一定范围内重复取值,因此排序方法是先计算出每个元素出现的次数并记录在数组b中,再从小到大顺序地排列各元素即可得到一个非递减有序序列。例如,对于序列6,5,6,9,6,4,8,6,5,其元素在整数区间[4,9]内取值,因此使数组元素b[0]~b[5]的下标0~5分别对应数值4~9,顺序地扫描序列的每一个元素并累计其出现的次数,即将4的个数记入b[0],5的个数记入b[1],依此类推,9的个数记入b[5]。最后依次判断数组b的每个元素值,并将相应个数的数值顺序地写入结果序列即可。
对于上例,所得数组b的各个元素值如下:

那么在输出序列中写入1个4、2个5、4个6、1个8、1个9,即得4,5,5,6,6,6,6,8,9,从而完成排序处理。

[C函数] 
    void sort(int n,int a[]) 
    {  int *b; 
    int i, k, number; 
    int minimum=a[0],maximum=a[0]; 
    /*minimum和maximum分别表示数组a的最小、最大元素值*/ 
    for(i=1; i<n; i++){ 
    if(______) minimum=a[i]; 
    eiSe 
    if (______) maximum=a[i]; 
    } 
    number=maximum-minimum+1; 
    if(number<=i)return; 
    b=(int*)calloc(number,sizeof(int)); 
    if(!b)  return; 
    for(i=0;i<n; i++){/*计算数组a的每个元素值出现的次数并记入数组b */ 
    k=a[i]-minimum;  ++b[k]; 
    } 
    /*按次序在数组a中写入排好的序列*/ 
    i=______; 
    for(k=0; k<number; k++) 
    for(; ______; --b[k] ) 
    a[i++]=minimum+______; 
    }


参考答案:

a[i]<minimum,或a[i]<=minimum,或其等价形式
a[i]>maximum,或a[i]>=maximum,或其等价形式
0
b[k],或b[k]>0,或b[k]!=0,或其等价形式
k



3、 


阅读以下说明和C代码,填充代码中的空缺,将解答填入答题纸的对应栏内。
[说明1]
下面的函数countChar(char*text)统计字符串text中不同的英文字母数和每个英文字母出现的次数(英文字母不区分大小写)。

[C代码1]
    int  countChar(char *text)
    {
    int i,sum=0;    /*sum保存不同的英文字母数*/
    char *ptr;
    int c[26]={0);    /*数组C保存每个英文字母出现的次数*/
    /*c[0]己录字母A或a的次数,c[1]记录字母B或b的次数,依此类推*/
    ptr=______;     /*ptr初始时指向字符串的首字符*/
    while (*ptr) {
    if (isupper(*ptr) )
    c [*ptr-'A']++;
    else
    if (islower(*ptr))
    c[*ptr-'a']++;
    ______;   /*指向下一个字符*/
    }
    for(i=0;i<26; i++)
    if(______)sum++;
    return sum;
    }
[说明2]
将下面C代码2中的空缺补全后运行,使其产生以下输出。
f2:f2:f2:2
    f3:f3:1
    [C代码2]
    #include<stdio.h>
    int f1(int(*f)(int));
    int f2(int);
    int f3(int);
    int main()
    {
    printf("%d\n",f1(______));
    printf("%d\n",f1(______));
    return 0;
    }
    int f1(int(*f)(int))
    {
    int n=0;
    /*通过函数指针实现函数调用,以返回值作为循环条件*/
    while  (______)  n++;
    return n;
    }
    int f2(int n)
    {
    printf("f2:");
    return n*n-4;
    }
    int f3(int n)
    {
    printf("f3:");
    return n-1;
    }


参考答案:

text,或&text[0],或其等价形式
ptr++,或++ptr,或ptr=ptr+1,或ptr+=1
c[i],或*(c+i)
f2
f3
f(n),或(*f)(n)



4、 

阅读以下说明和C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。

[说明]
正整数n若是其平方数的尾部,则称n为同构数。例如,6是其平方数36的尾部,76是其平方数5776的尾部,6与76都是同构数。下面的程序求解不超过10000的所有同构数。
已知一位的同构数有三个:1,5,6,因此二位同构数的个位数字只可能是1,5,6这三个数字。依此类推,更高位数同构数的个位数字也只可能是1,5,6这三个数字。
下面程序的处理思路是:对不超过10000的每一个整数a,判断其个位数字,若为1、5或6,则将a转换为字符串as,然后对a进行平方运算,并截取其尾部与as长度相等的若干字符形成字符串后与as比较,根据它们相等与否来断定a是否为同构数。

[C程序]
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int myitoa(int,char*);    /*将整数转换为字符串*/
    /*right取得指定字符串尾部长度为length的子串,返回所得孔串的首字符指针*/
    char*right(char*,int length);
    int main()
    {
    int a,t;    int fen;
    char as[10],rs[20];
    printf("[1,10000]内的同构数:\n");
    for(a=1; a<=10000;a++)    {
    t=______;   /*取整数a的个位数字*/
    if(t!=1&&t!=5&&t!=6)continue;
    len=myitoa(a,as);    /*数a转换为字符串,存入as*/
    myitoa(a*a,rs);    /*数a的平方转换为字符串,存入rs*/
    /*比较字符串as与rs末尾长度为len的子串是否相等*/
    if(strcmp(as,______)==0)    /*若相同则是同构数并输出*/
    printf("%s的平方为%s\n",as,rs);
    }
    return 0;
    }
    int myitoa(int num,char*s)    /*将整数num转换为字符串存入s*/
    {
    int i,n=0;
    char ch;
    /*从个位数开始,取num的每一位数字转换为字符后放入s[]*/
    while(num){
    s[n++]=______+'0';
    num=num/10;
    }
    s[n]='\0';
    for(i=0; i<n/2;i++){    /*将S中的字符串逆置*/
    ______;s[i]=s[n-i-1]; s[n-i-1]=ch;
    }
    return n;    /*返回输入参数num的位数*/
    }
    char*right(char*ms,int length)
    /*取字符串ms尾部长度为length的孔串,返回所得孔串的首字符指针*/
    {
    int i;
    for(;*ms;ms++);    /*使ms到达原字符串的尾部*/
    for(i=0;i<length;______);    /*使ms指向所得孔串的首部字符*/
    return ms;
    }


参考答案:

 

 

a%10,或其等价形式
right(rs,len)
num%10,或其等价形式
ch=s[i],或ch=*(s+i)
i++,ms--,或ms--,i++,或其等价形式

 



5、 

阅读以下说明和C++代码,填充代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
某应急交通控制系统(TraficControlSystem)在红灯时控制各类车辆(Vehicle)的通行,其类图如下图所示,在紧急状态下应急车辆红灯时也可通行,其余车辆按正常规则通行。

类图
下面的C++代码实现以上设计,请完善其中的空缺。

[C++代码]
#include<typeinfo>
#include<iostream>
using namespace std;
class Vehicle {/*抽象基类,车辆*/
public:
virtual void run()=0;
};
class Emergency {  /*抽象基类,可在红灯时通行的接口,函数均为纯虚函数*/
public:
______=0;    //isEmergent()函数接口
______=0;    //runRedLight()函数接口
};
clasS Car:public Vehicle{
public:
~Car(){}
void run(){/*代码略*/  )
);
class Truck:public Vehicle{
public:
~Truck(){}
void run(){  /*代码略*/  }
);
class PoliceCar:______ {
private:
bool isEmergency;
public:
PoliceCar():Car(),Emergency() { this->isEmergency=false;
}
PoliceCar(bool b):Car(),Emergency()  {this->isEmergency=b;}
~P0liceCar(){    }
bool isEmergent(){    return ______}
void runRedLight()  {    /*代码略*/    }
);
/*类Ambulance、FireEngine实现代码略*/
class TraficControlsystem {  /*交通控制类*/
private:
Vehicle*v[24];    int numVehicles;/*在构造函数中设置初始值为0*/
public:
void control(){  //控制在紧急情况下应急车辆红灯通行,其他情况按常规通行
for(int i=0;i<numVehicles; i++){
Emergency *ev=dynamic_cast<Emergency*>(v[i]);
if(ev !=0)  ______->runRedLight();
else ______->run();
}
}
void add(Vehicle*vehicle) { v[numVehicles++] =vehicle; }
/*添加车辆*/
void shutDown() {for(int i=0;  i<numVehicles; i++) { delete v[i];}  }
};
int main(){
TraficControlSystem*tcs=new  TraficControlSystem;
tcs->add(new Car());  tcs->add(new PoliceCar());
tcs->add(new Ambulance()); tcs->add(new Ambulance(true));
tcs->add(new FireEngine(true));tcs->add(new FireEngine());
tcs->add(new Truck());
tcs->contr01();tcs->ShutDown();
delete tcs;
}

 

参考答案:

 

 

virtual bool isEmergent()
virtual void nmRedLight()
public Car, public Emergency
this->isEmergency
ev
v[i]

 


6、 

阅读以下说明和Java代码,填充程序中的空缺,将解答填入答题纸的对应栏内。

[说明]
某应急交通控制系统(TraficControlSystem)在红灯时控制各类车辆(Vehicle)的通行,其类图如下图所示,在紧急状态下应急车辆在红灯时可通行,其余车辆按正常规则通行。

类图
下面的Java代码实现以上设计,请完善其中的空缺。

[Java代码]
abstract class Vehicle{
public Vehicle(){  }
abstract void run();
};
interface Emergency{
   ______;
   ______;
};
class Car extends Vehicle{
public Car(){  }
void run(){ /*代码略*/  }
};
Class Truck extends Vehicle{
public Truck(){  }
void run() {  /*代码略*/  }
};
class PoliceCar ______ {
boolean isEmergency= false;
public PoliceCar(){  }
public PoliceCar(boolean b) {this.isEmergency=b;    }
public boolean isEmergent(){  return ______   }
public void runRedLight(){    /*代码略*/  }
};
/*类Ambulance、FireEngine实现代码略*/
public class TraficControlsystem  {  /*交通控制类*/
private Vehicle[]V=new Vehicle[24];
int numVehicles;
public void control(){
for {int i=0;  i<numVehicles; i++){
if(V[i]instanceof Emergency&&((Emergency)v[i]).
isEmergent()){
(______).runRedLight();
}else
______. run();
}
}
void add(Vehicle vehicle){  v[numVehicles++]=vehicle;}/*添加车辆*/
void shutDown(){/*代码略*/}
public static void main(String[]args){
TraficC0ntrolSystem tcs=new TraficControlSystem();
tcs.add(new Car());
tcs.add(new PoliceCar());
tcs.add(new Ambulance());
tcs.add(new Ambulance(true));
tcs.add(new FireEngine(true));
tcs.add(new Truck());
tcs.add(new FireEngine());
tcs.control();
tcs.shutDown();
}
}

参考答案:

 

 

boolean isEmergent()
void runRedLight()
extends Car implements Emergency
this.isEmergency
(Emergency)v[i]
v[i]


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2013年11月 程序员 下午题参考答案

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share