image

编辑人: 沉寂于曾经

calendar2025-06-07

message3

visits439

2014年11月 程序员 下午题答案及解析

一、问答题

1、阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
[说明]
本流程图旨在统计一本电子书中各个关键词出现的次数。假设已经对该书从头到尾依次分离出各个关键词{A(i)|i=1,…,n}(n>1)},其中包含了很多重复项,经下面的流程处理后,从中挑选出所有不同的关键词共m个{K(j)|j=1,…,m},而每个关键词K(j)出现的次数为NK(j),j=1,…,m。
[流程图]

参考答案:

1
K(j)
NK(j)+1→NK(i)    或NK(j)++  或等价表示
m+1→m或m++    或等价表示
A(i)

解析:

本题的流程图旨在统计一本电子书中各个关键词出现的次数,其中涉及到初始化和关键词的比较计数过程。

  1. 初始化部分:第一个关键词作为选出的第一个关键词,其出现次数初始化为1,同时选出的关键词数目初始化为1。因此,1→NK(1)和A(1)→K(1)是对第一个关键词的初始处理。
  2. 第2框处理的是将关键词A(i)与已选出的关键词K(j)进行比较,所以空缺处应填写K(j)。
  3. 如果A(i)等于K(j),则对应的关键词计数NK(j)需要增加1。因此,NK(j)+1→NK(j)或NK(j)++表示计数增加的操作。
  4. 如果A(i)不等于所有的K(j),意味着这是一个新的关键词。此时,需要将其加入选出的关键词列表,并统计其出现次数。因此,需要先将计数器m增加1(表示新增一个关键词),然后执行A(i)→K(m)或将A(i)作为新的K(m+1)。所以,m+1→m或m++是增加选出的关键词数目的操作,而A(i)→K(m)或将A(i)作为新的K(m+1)是新增关键词的处理。

2、阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
函数removeDuplicates(chai *str)的功能是移除给定字符串中的重复字符,使每种字符仅保留一个,其方法是:对原字符串逐个字符进行扫描,遇到重复出现的字符时,设置标志,并将其后的非重复字符前移。例如,若str指向的字符串为"aaabbbbscbsss",则函数运行后该字符串为"absc"。

[C代码]

    void
removeDuplicates(char *str)

    {

    int
i,len=strlen(str);    /*求字符串长度*/

    if(______)return;
 /*空串或长度为1的字符串无需处理*/

    for(i=0;i<len;i++){

    int flag=0;  
 /*字符是否重复标志*/

    int m;

    for(m=______; m<len;m++){

  
 if(Str[i]==str[m]){

    ______;
 break;

    }

    }

    if (flag)  {

    int n,idx=m;

    /*将字符串第idx字符之后、与str[i]不同的字符向前移*/

    for(n=idx+1; n<len; n++)

  
 if(Str[n]!=str[i]){

    str[idx]=str[n];
______;

    }

    str[______]='\0';
   /*设置字符串结束标志*/

    }

    }

    }

参考答案:

len<2  或len<=1    或等价表示
i+1    或等价表示
flag=1  或给flag赋值为任何一个不是0的值
idx++  或idx=idx+1    或等价表示
idx    或等价表示

解析:

本题考查的是对字符串处理的C语言编程能力。根据题目描述和代码注释,我们需要完善一个名为removeDuplicates的函数,该函数的功能是移除给定字符串中的重复字符,使每种字符仅保留一个。

首先,对于空(1),由于函数需要处理的是长度大于1的字符串,所以当字符串长度小于等于1时,无需处理,直接返回。因此应填入的内容为len<=1 或等价表示。

其次,对于空(2),我们需要对字符串从当前位置开始扫描是否存在重复字符,所以应从当前位置的下一个字符开始扫描,即i+1。

然后,对于空(3),当我们找到一个重复字符时,需要设置标志位以便后续处理。这里可以简单地将flag设置为1或任何非零值。

接着,对于空(4),当我们找到一个与str[i]不同的字符时,需要将其前移以覆盖重复字符。前移操作完成后,我们需要更新idx的值以便处理下一个字符,所以应填入idx++ 或 idx=idx+1。

最后,对于空(5),在处理完所有字符并移动了部分字符后,字符串的结束标志应设置在新的字符串的末尾,由于之前已经将idx自增以处理下一个字符,所以这里应填入idx。

3、阅读以下说明和C函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
队列是一种常用的数据结构,其特点是先入先出,即元素的插入在表头、删除在表尾进行。下面采用顺序存储方式实现队列,即利用一组地址连续的存储单元存放队列元素,同时通过模运算将存储空间看作一个环状结构(称为循环队列)。
设循环队列的存储空间容量为MAXQSIZE,并在其类型定义中设置base、rear和length三个域变量,其中,base为队列空间的首地址,rear为队尾元素的指针,length表示队列的长度。

#define  MAXQSIZE  100

    typedef
 struct    {

    QElemType *base;
   /*循环队列的存储空间首地址*/

    int  
 rear;    /*队尾元素索引*/

    int length;  
 /*队列的长度*/

    }SqQueue;
例如,容量为8的循环队列如下图所示,初始时创建的空队列如下图(a)所示,经过一系列的入队、出队操作后,队列的状态如下图(b)所示(队列长度为3)。

下面的C函数1、C函数2和c函数3用于实现队列的创建、插入和删除操作,请完善这些代码。
[C函数1]创建一个空的循环队列。
[C函数1]创建一个空的循环队列。

    int
InitQueue(SqQueue *Q)

    /*创建容量为MAXQSIZE的空队列,若成功则返回1;否则返回0*/

    {  Q->base=(QElemType *)malloc(MAXQSIZE* ______};

    if (!Q->baSe)return 0;

    Q->length=0;

    Q->rear=0;

    return 1;

    }/*InitQueue*/

    [<strong>[C函数2]</strong>]元素插入循环队列。

    int
EnQueue(SqQueue *Q,QElemType e)  /*元素e入队,若成功则返回1;否则返回0*/

    {  
 if(Q->length>=MAXQSIZE.return 0;

    Q->rear= ______;

    Q->base[Q->rear]=e;

    ______;

    return 1;

    }/*EnQueue*/

    [C函数3]元素出循环队列。

    int
DeQueue(SqQueue *Q,QElemType *e)

    /*若队列不空,则删除队头元素,由参数e带回其值并返回1;否则返回0*/

    {
 if(______)return 0;

    *e=Q->base[(Q->rear-Q->length+1+MAXQSIZE.%MAXQSIZE.;

    ______;

    return 1;

    }/*DeQueue*/

参考答案:

sizeof(QElemType)
(e->rear+1)%MAXQSIZE或等价表示
Q->length++    或Q->length=Q->length+1或等价表示
Q->length<=0    或Q->length==0或等价表示
e->length--    或Q->length=Q->length-1或等价表示

解析:

对于C函数1,创建一个空的循环队列。首先,需要为队列的存储空间分配内存,大小是队列元素的类型大小乘以最大队列大小,即sizeof(QElemType) * MAXQSIZE。然后初始化队列长度和队尾指针。在分配内存时需要注意检查是否成功分配了内存,如果没有成功则返回0。所以空处填入sizeof(QElemType)。入队操作时,需要将元素添加到队尾,并更新队尾指针和队列长度。队尾指针通过(Q->rear + 1) % MAXQSIZE进行更新以形成循环队列的效果,并增加队列长度。因此空处填入(Q->rear + 1) % MAXQSIZEQ->length++或等价表示。

4、阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
二叉树的宽度定义为含有结点数最多的那一层上的结点数。函数GetWidth()用于求二叉树的宽度。其思路是根据树的高度设置一个数组counter[],counterl[i]存放第i层上的结点数,并按照层次顺序来遍历二叉树中的结点,在此过程中可获得每个结点的层次值,最后从counter[]中取出最大的元素就是树的宽度。
按照层次顺序遍历二叉树的实现方法是借助一个队列,按访问结点的先后顺序来记录结点,离根结点越近的结点越先进入队列,具体处理过程为:先令根结点及其层次号(为1)进入初始为空的队列,然后在队列非空的情况下,取出队头所指示的结点及其层次号,然后将该结点的左子树根结点及层次号入队列(若左子树存在),其次将该结点的右子树根结点及层次号入队列(若右子树存在),然后再取队头,重复该过程直至完成遍历。
设二叉树采用二叉链表存储,结点类型定义如下:

typedef struct BTNode { 

    TElemType data; 

    struct BTNode
*left,*right;
队列元素的类型定义如下:
typedef  struct { 

    BTNode *ptr; 

    int LevelNumber; 

    )QElemType;
GetWidth()函数中用到的函数原型如下所述,队列的类型名为QUEUE:
[C函数] 

    int
GetWidth(BiTree root) 

    { 

    QUEUE  Q; 

    QElemType a,
 b; 

    int
width,height=GetHeight(root); 

    int
i,*counter=(int*)calloc(height+1,sizeof(int)); 

    if (______)  
 return-1;    /*申请空间失败*/ 

    if(!root)  
 return 0;    /*空树的宽度为0*/ 

    if(______)  
 return-1;    /*初始化队列失败时返回*/ 

    a.ptr=root;  
 a.LeveiNumber=1; 

  
 if(!EnQueue(&Q,a))return-1;    /*元素入队列操作失败时返回*/ 

  
 while(!isEmpty(Q)){ 

  
 if(______)return-1;    /*出队列操作失败时返回*/ 

  
 counter[b.LevelNumber]++;  /*对层号为b.LevelNumber的结点计数*/ 

    if(b.ptr->left)  { /*若左孔树存在,则左孔树根结点及其层次号入队*/ 

    a.ptr=b.ptr->left; 

    a.LevelNumber=
______; 

    if (
!EnQueue(&Q,a))return-1; 

    } 

    if (bptr->right) {/*若右孔树存在,则右孔树根结点及其层次号入队*/ 

    a.ptr=b.ptr->right; 

  
 a.LevelNumber=______; 

  
 if(!EnQueue(&Q,a))return-1; 

    } 

    } 

    width=counter[1]; 

    for(i=1;i<height+1;i++)    /*求counter[]中的最大值*/ 

    if(______)
width=counter[i]; 

    free(counter); 

    return width; 

    }

参考答案:

!counter 或0==counter 或NULL==counte r或等价表示
!InitQueue(&Q)  或0==InitQueue(&Q) 或等价表示
!DeQueue(&Q,&b)或0==DeQueue(&Q,&b)  或等价表示
b.LevelNumber+1    或等价表示
b.LevelNumber+1    或等价表示
counter[i]>width    或等价表示

解析:

本题考查了二叉树的宽度计算以及C语言的基本应用。首先,我们需要仔细阅读题目中的说明,了解函数处理逻辑并完成代码。对于每个空,我们可以根据题目的描述和函数的逻辑进行填充。对于空(1),我们需要检查内存分配是否成功,如果失败则返回-1,因此应填入表示错误的条件,如"!counter"或NULL == counter等。对于空(2),我们需要初始化队列,如果初始化失败则返回-1,因此应填入队列初始化失败的条件,如"!InitQueue(&Q)“等。对于空(3),我们需要进行出队列操作,如果操作失败则返回-1,因此应填入出队列操作失败的条件,如”!DeQueue(&Q, &b)“等。对于空(4)和空(5),我们需要计算子结点的层次号,根据二叉树的性质,子结点的层次号应该比父结点大1,因此应填入"b.LevelNumber + 1”。最后,对于空(6),我们需要找到counter数组中的最大值,即树的宽度,因此应填入表示当前元素大于当前最大宽度的条件,如"counter[i] > width"。

5、阅读下列说明、C++代码和运行结果,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
很多依托扑克牌进行的游戏都要先洗牌。下面的C++程序运行时先生成一副扑克牌,洗牌后再按顺序打印每张牌的点数和花色。

[C++代码]

    #include<iostream>

    #include<stdlib.h>

    #include<ctime>

    #include<algorithm>

    #include<string>

    USing namespace
std;

    const string
Rank[13]={"A","2","3","4","5","6","7","8","9","10","J",
"Q","K"};  //扑克牌点数

    const strinq
Suits[4]={"SPADES","HEARTS","DIAMONDS","CLUBS");
//扑克牌花色

    Class Card{

    private:

    int rank;

    int suit;

    public:

    Card(){}

    ~Card(){}

    Card(int rank,int
suit) {______ rank=rank;______ suit=suit;}

    int getRank(){

    return rank;

    }

    int getSuit(){

    return suit;

    }

    void printCard(){

    cout<<  '('<<Rank[rank]<<",
 "<<Suits[suit]<<")":

    }

    };

    Class
 DeckofCards{

    private:

    Card deck[52];

    public:

    DeckOfCards(){
      //初始化牌桌并进行洗牌

    for(int i=0; i<52;i++)  {    //用Card对象填充牌桌

    ______
=card(i%13,i%4);

    }

  
 Srand((unsigned)time(0));    //设置随机数种孔

    std::random
shuffle(&deck[0],&deck[51]);   //洗牌

    }

    ~DeckOfCards()  {

    }

    void printCards()
 {

    for(int i=0; i<52; i++){

    ______
printCard();

    if((i+1)%
4==0)cout<<endl;

    else cout<<"\t";

    }

    }

    };

    int main  (){

    DeckOfCards
 *d= ______;    //生成一个牌桌

    ______;  
 //打印一副扑克牌中每张牌的点数和花色

    delete d:

    return 0;

    }

参考答案:

this->
this->
deck[i]    或*(deck+i)  或等价表示
deck[i].    或*(deck+i).或等价表示
new DeckOfCards()
d->printCards()  或等价表示

解析:

本题考查了C++面向对象编程中的类、对象、构造函数以及数组的使用。根据题目描述和给出的代码片段,需要完成扑克牌和牌桌的相关操作。

  1. 在Card类的构造函数中,需要初始化成员变量rank和suit。由于参数名称与成员变量名称相同,为了避免混淆,需要使用"this->"来指明是访问类的成员变量。所以空(1)处应填写:this->rank = rank; this->suit = suit;

  2. 在DeckOfCards类的构造函数中,需要初始化牌桌并洗牌。初始化牌桌是通过创建Card对象并赋值给数组deck完成的。因此空(2)处需要表示创建Card对象并赋值给deck数组的元素,可以填写:deck[i] = Card(i%13, i%4);或者等效的写法,如*(deck+i) = Card(i%13, i%4); 另外,也可以直接对成员变量进行赋值,如:deck[i].rank = i%13;,deck[i].suit = i%4;。

  3. 在main函数中,首先需要创建一个DeckOfCards类的对象指针d,即生成一个牌桌。这可以通过new关键字来完成,所以空(3)处应填写:new DeckOfCards()。

  4. 接下来需要打印一副扑克牌中每张牌的点数和花色,这可以通过对象指针d调用其成员函数printCards()来完成。因此空(4)处应填写:DeckOfCards *d = new DeckOfCards(); d->printCards()或等价表示。

综上所述,根据题目的要求和给出的代码片段,以上答案正确地填补了代码中的空缺部分。

6、阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
很多依托扑克牌进行的游戏都要先洗牌。下面的Java代码运行时先生成一副扑克牌,洗牌后再按顺序打印每张牌的点数和花色。

[Java代码]

    import
java.util.List;

    import
java.util.Arrays;

    import
java.util.Collections;

    class Card { //扑克牌类

    public static enum
Face  { Ace,  Deuce,  Three,  Four,  Five,  Six,

    Seven,
 Eight, Nine,  Ten,  Jack, Queen, King };      
       //枚举牌点

    public static enum
Suit { Clubs,  Diamonds, Hearts, Spades };  //枚举花色

    private final Face
face;

    private final Suit
suit;

    public Card( Face
face, Suit suit )  {

    ______ face =
face;

    ______ suit =
suit;

     }

     public Face
getFace()  {  return face;     }

     public Suit
getSuit()   {  return suit;     }

    public String
getCard()  {      //返回String来表示一张牌

    return
String.format( "%s, %s",  face,  suit);

    }

    }

    //牌桌类

    class DeckOfCards
 {

    private List< Card > list;              //声明List以存储牌

    public DeckOfCards
()  {                //初始化牌桌并进行洗牌

    Card[]  deck
= new Card[ 52 ];

    int count = 0;
                     
   //牌数

    //用Card对象填充牌桌

    for  ( Card.
Suit suit : Card. Suit.values()  )  {

    for  ( Card.
Face face : Card. Face. values()  )  {

    ______ = new Card(
face,  suit );

    }

    }

    list =
Arrays.asList( deck );

    Collections.
shuffle( list );        //洗牌

    }

    public void
printCards()

    {

    //按4列显示52张牌

    for ( int i = 0; i
< list.size(); i++ )

    System.out.printf(
"%-19s%s",  list. ______,

    ( ( i+1 ) % 4 == 0
) ? "\n  );

    }

    }

    public class
Dealer {

    public static void
main( String[]  args )   {

    DeckOfCards player
= ______;

    ______ printCards
();

    }

    }

参考答案:

this.
this.
deck[count++]    或等价表示
get(i).getCard()
new DeckOfCards()
player.

解析:

这道题目是关于Java语言中的面向对象编程和集合框架的使用。题目要求创建一个扑克牌类的定义,包括牌面和花色的枚举类型,以及一个洗牌并打印扑克牌的类。具体的解析如下:

一、对于第一个空和第二个空,由于在构造方法中需要初始化类的属性,所以需要使用关键字"this"来区分参数和属性。因此,填空答案为"this"。

二、第三个空需要创建一个新的Card对象并将其添加到deck数组中。可以使用"deck[count++]“的方式创建一个新的Card对象并存储到数组中的下一个位置,或者使用List的add方法添加元素。因此,填空答案为"deck[count++] 或等价表示”。

三、第四个空需要获取牌对象并调用其getCard()方法获取牌的字符串表示。可以使用"list.get(i).getCard()“的方式获取并打印牌对象的字符串表示。因此,填空答案为"get(i).getCard() 或 list.get(i).getCard() 或其他获取牌对象并调用其getCard()方法的方式”。

四、第五个空需要创建一个新的DeckOfCards对象。可以使用"new DeckOfCards()“的方式创建新的DeckOfCards对象。因此,填空答案为"new DeckOfCards() 或 new DeckOfCards创建牌桌对象的方式(具体语法可能因IDE或编译器而异)”。

五、第六个空需要使用正确的对象引用调用printCards方法。可以使用"player.printCards()“的方式调用printCards方法。因此,填空答案为"player.printCards() 或使用正确的对象引用调用printCards方法的方式(具体语法可能因IDE或编译器而异)”。

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

创作类型:
原创

本文链接:2014年11月 程序员 下午题答案及解析

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