首页

软考 - 初级_程序员

类型:
选择方向:
选择考试:
题型:
为你找到 191 个题目。

阅读以下说明和C函数,填补C函数中的空缺(1)~(5),将解答写在答题纸的对应栏内。
【说明】
假设一个算术表达式中可以包含以下三种括号:“(”和“)”、"[”和“]”、“{”和“}”,并且这三种括号可以按照任意的次序嵌套使用。
下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。例如,表达式“[a.(b.5)】*c【{}】”中的括号是完全匹配的,而表达式“【a-(b-5]))*c”中的括号不是完全匹配的,因为“(”与“】”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。
函数ifmatched (char expr[])的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式存储在字符数组expr中。若表达式中的括号完全匹配,则该函数的返回值为Matched,否则返回值为Mismatched。
该函数的处理思路如下:
(1)设置一个初始为空的栈,从左至右扫描表达式。
(2)若遇上左括号,则令其入栈;若遇上右括号,则需要与栈顶的左括号进行匹配。
(3)若所遇到的右括号能与栈顶的左括号配对,则令栈顶的左括号出栈,然后继续匹配过程;否则返回Mismatched,结束判断过程。
(4)若表达式扫描结束,同时栈变为空,则说明表达式中的括号能完全匹配,返回Matched。
函数ifMatched中用到了两种用户自定义数据类型BOOL和STACK,其中,BOOL类型的定义如下:
typedef enum  {Mismatched, Matched}BOOL;
 
STACK(即栈类型)的定义省略,栈的基本操作的函数原型说明如下:
void InitStack(STACK *S):初始化一个空栈。
void Push(STACK *S,char e):将一个字符压栈,栈中元素数目增1。
void Pop(STACK *S):栈顶元素出栈,栈中元素数目减1。
char Top(STACK S):返回非空栈S的栈顶元素值,栈中元素数目不变。
int IsEmpty(STACK S):若S是空栈,则返回1,否则返回0。

【C 函数】
BOOL   ifMatched   (char  expr[ ])
{
char *cptr;                             /* cptr 指向表达式中的字符*/
STACK S;
char e;
 
InitStack(&S} ; /*构造一个空栈*/
for(cptr =  expr;  *cptr!= '\0' (1) {
if (  *cptr== ' (' || *cptr  ==' [' , ||   *cptr  ==' {'   )
(2);
else
                                     if    (   *cptr==')'    ||   *cptr==  ']'    ||    *cptr=='}'  )    {
                                                 if (IsEmpty (S) )
return Mismatched;
                                                 e =(3) ;  /*取栈顶的左括号*/
                                                 if   (   *cptr  ==')' ,&& e!=' ('  )      return  Mismatched;
                                                 if  (   *cptr ==']'  &&  e!=' [' )     return  Mismatched;
                                                 if  (  *cptr ==')' &&  e!='{'    )return  Mismatched;
(4) ;                           /*梭顶的左括号出校*/
                                    }
}
if ((5)) return Matched;
return Mismatched;
}

阅读以下说明和C函数,回答问题l和问题2,将解答填入答题纸的对应栏内。

【说明】

对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为0的数组元素,并将a中所有的非O元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1CompactArr v2来实现上述处理要求,函数的返回值为非零元素的个数。

函数CompactArr_vl(int a[]int n)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非O元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。

函数CompactArr_v2(int a[]int n)的处理思路是:利用下标i(初值为0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1


【问题1 (12)

请根据说明中函数CompactArr_v1的处理思路填补空缺(1)(3),根据CompactArr_v2的处理思路填补空缺(4)

【问题2】(3分)

请说明函数CompactArr vl存在的缺点。

阅读以下说明和C函数,回答问题l至问题3,将解答写在答题纸的对应栏内。
【说明1】
函数substring(const char str[],int index,int length)的功能是求出字符串str中指定序号index开始且长度为length的子串,并返回所取出的子串。以字符串“China today”为例,其第一个字符“C”的序号为1(而其在字符数组str中的下标为0),从序号5开始且长度为3的子串为“at”。


【问题1】(6分)
函数substring中有两处错误,请指出这些错误所在代码的行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行(有注释时,注释可省略)。


【说明2】
在C函数2中,reverse(unsigned intn的功能是求出并返回n的反序数。例如,1234
的反序数是4321,其求解过程如下:
(1)由1234除以10得到商123和余数4,0乘以10再加上4得到4;
(2)由123除以10得到商12和余数3,4乘以10再加上3得到43;
(3)由12除以10得到商1和余数2,43乘以10再加上2得到432;
(4)由1除以10得到商0和余数1,432乘以10再加上1得到4321。
【C函数2】
unsigned int reverse(unsigned int n)
{
unsigned int result=0;
while(  (1)  ){
result= result *10+ n%10,
n= (2)__
}
retun result,
}
【问题2] (6分)
请根据说明2,填充C函数2中的空缺(1)和(2)。
【问题3](3分)
用567,1234,56781234,62354879643分别作为实参调用函数reverse,对应的返回值分别为765,4321,43218765,1357400630。请说明以62354879643作为实参调用函数reverse时返回结果出错的原因。


阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。
【说明】
下面的流程图可在正文字符串T(1:L)中计算关键词字符串K(1:m)出现的次数(用n表示)。其中,L为字符串T的长度,m为字符串K的长度(m 在该流程图中,先从T中取出长度为m的子串存入A中,再将A与K进行逐个字符的比较(其中,K可以包含字符“?”)。注意:从正文字符串中取出的关键词字符串不允许交叉。例如,“aaaaaa”中有3个关键词字符串“aa”。

【流程图】

试题六(共15分) 

    阅读以下说明、图和Java代码,填补Java代码中的空缺(1)—(5),将解答写在答题纸的对应栏内。  

【说明】  

    已知某公司主要有两大类耗电资产(Asset):计算机(ComputerAsset)和建筑物(BuildingAsset)。为了节约能源,通过控制各种电源,将可关闭的房灯、计算机显示器等在夜间关闭。  

    为了实现上述需求,设计了如下图所示的类图,并用下面的Java代码加以实现。

    

【Java代码】
abstract class Asset{                        /*通用资产,基类*/     }
interface PowerSwitchable{                  /*可在夜间关闭的电源的物体实现该接口*/  
    public void  powerDown( );        
    public void powerUP( ); 
}   
abstract class BuildingAsset extends Asset{  /*建筑物资产*/  
    protected int room; 
    public BuildingAsset(int room){  this.room=room; } 
}  
abstract class BuildingLight extends BuildingAsset{    
//灯的通用信息:fluorescent / incandescent 等,略 
    BuildingLight(int room Number){  super(roomNumber); } 
}  
class EmergencyLight(1){          /*应急灯,永不关闭*/
    EmergencyLight(int roomNumber){
        super(roomNumber); 
    } 
}  
class RoomLights (2){  
    RoomLights(int roomNumber){ super(roomNumber);}  
    public void powerDown(){  /*关电源,代码略*/ } 
    public void powerUp(){   /*开电源,代码略*/ } 
}  
/*ComputerAsset、ComputerCPU和ComputerMonitor代码略*/ 
public class BuildingManagement{ 
    Asset things[]=new Asset[24];  
    int numItems=0;  
    public void goodNight(){    /*值班员定时“关闭”时调用,关闭可关闭的电源*/
        for(int i=0;i
            if(things[i] instanceof (3))
                ((PowerSwitchable)things[i]).powerDown(); 
    }  
    /*goodMorning( )与goodNight( )类似,依次调用powetUp( ),其实现细节此处略*/ 
    public void add(Asset thing){     /*为建筑添加资产*/
    things[(4)]=thing; 
    }  
    public static void main(String[ ]args)  { 
      BuildingManagement b1=(5) BuildingManagement( ); 
      b1.add(new RoomLights(101));            //101房间的控制灯
      b1.add(new EmergencyLight(101));         //101房间的应急灯
      b1.add(new ComputerCPU(10104));        //101房间4号桌上的计算机主机
      b1.add(new ComputerMonitor(10104));      //101房间4号桌上的计算机显示器
      b1.goodNight( ); 
      delete b1;    
    } 
}

试题五(共15分)

    阅读以下说明、图和C++代码,填补C++代码中的空缺(1)—(5),将解答写在答题纸的对应栏内。  

【说明】  

    已知某公司主要有两大类耗电资产(Asset):计算机(ComputerAsset)和建筑物(BuildingAsset)。为了节约能源,通过控制各种电源,将可关闭的房灯、计算机显示器等在夜间关闭。    

    为了实现上述需求,设计了如下图所示的类图,并用下面的C++代码加以实现。

    

【C++代码】  
#include 
#include 
using  namespace  std;  
class Asset{             /*通用资产,基类*/
public: virtual ~Asset( ){ }; 
};  
class PowerSwitchable{                  /*抽象基类,可在夜间关闭电源的物体接口*/
public: virtual void powerDown( )=0;      /*powerDown( )函数接口*/
    virtual void powerUP( )=0;        /*powerUp函数接口*/ 
};  
class computerAsset: public Asset{      /*计算机资产*/ 
protected: int deskNumber; 
public:
    ComputerAsset(int desNumber){   this->deskNumber= deskNumber;
};  
class ComputerCPU  (1)  {     /*计算机主机,永不关闭*/ 
public:  
      ComputerCPU(int desNumber): ComputerAsset (deskNumber){ } 
};  
class ComputerMonitor (2){    /*计算机显示器*/ 
public: 
    ComputerMonitor(int roomNumber):ComputerAsset(roomNumber),
    PowerSwitchable( ){ }
    ~ComputerMonitor ( ){ }  
    void powerDown( ) {        /*关电源,代码略*/         } 
    void powerUp( ) {             /*开电源,代码略*/        }  
};  
/*BuildingAsset、BuildingLight、EmergencyLight和RoomLights代码省*/ 
class BuldingManagement  { 
private:  
    Asset* things[24];   int numItems; 
public:   
    void goodNight( ){           /*值班员定时“关闭”时调用,关闭可关闭的电源*/ 
for(int i=0;i
(3)   ps=dynamic_cast(things[i]); 
if(ps!=0) 
    ps->powerDown(); 
  } 
}  
/*goodMorning( )与goodNight( )类似,依次调用powerUp( ),实现省*/  
    void add(Asset*thing){                /*为建筑添加资产*/  
    things[(4)]=thing; 
};  
int main(){  
    BuildingManagement* b1=(5) BuildingManagement( );  
    b1->add(new RoomLights(101));            //101房间的控制灯 
    b1->add(new EmergencyLight(101));         //101房间的应急灯  
    b1->add(new ComputerCPU(10104));        //101房间4号桌上的计算机  
    b1->add(new ComputerMonitor(10104));      //101房间4号桌上的计算机显示器 
    b1->goodNight( ); 
    delete b1; 
}

试题四(共15分)

    阅读以下说明和c函数,填补c函数中的空缺(1)—(5),将解答写在答题纸的对应栏内。  

【说明】  

    约瑟夫问题如下所述:有n个人(编号为1~n)围成一圈,从第一个人开始,按照顺时针方向从1开始计数到m(即数到第m个人),让其出圈,然后再从其顺时针方向的下一个人开始,依次计数到m并让其出圈,重复这个过程,直到所有人都出圈,试给出出圈者的顺序。  

    以n=5,m=3为例,其中圈顺序为3,1,5,2,4,过程如下图所示。

    

    下面的函数Joseph()在单向循环链表表示的基础上诉出圈的过程。 

    n为5时的单向循环链表结构如下图所示。

    

    链表的结合类型定义如下: 

    typedef struct Node  {

        int no;

        struct Node*next; 

    }Node,*LinkList;  

    函数Joseph(LinkList tail,int n,int m)的处理思路如下:  

    (1)用k计数,每次都从0开始,当计数到m-1时结束本次计数;  

    (2)通过指针p查找出圈者所对应的结点,当K的值等于是m-1时,P应指向出圈者对应结点的前驱结点;  

    (3)通过删除结点表示出圈处理;  

    (4)当m大于圈中剩余人数时,为了避免重复计数,用模运算修改m的值; 

    (5)计数和删除操作完成后再恢复m的原值;

【C函数】  
void Joseph(LinkList tail,int n,int m) 
{     /*单循环链表包含n个结点,tail为链表的尾指针,m为计数值*/
LinkList p,q; 
int k,i,old_m=m; 
 
p=tail;  
for(i=n;i>1;--i)  {                       /*i 表示圈中剩余人数*/ 
          m=m%i;                         /*避免重复计数*/ 
if(0==m)    m=(1); 
   k=0;  
       while(k<(2))   {
            (3);  
k++; 
       }  
       printf("%d\n",(4));    /*输出出圈者的编号*/ 
q=p->next;  
(5)=q->next;       /*删除出圈者对应的结点*/ 
free(q); 
          m=old_m; 
     }  
     printf(“%d\n”,p->No); 

试题三(共15分)  

    阅读以下说明和C代码,填补C代码中的空缺(1)~(5),将解答写在答题纸的对应栏内。  

【说明】  

    某市在进行市长选举,该市共分为M个选区(1

     

    现已将选票数据存入文本文件data.txt,该文件内容格式如下:共有M行,每行N+1个整数,第一个整数为选区编号,随后为N个候选者在该选区所得票数。  

    下面的程序先从文件中读入选票数据存入二维数组data,然后完成下列功能: 

    a.计算并显示每个竞选者获得的选票数及占总选票数的百分比;  

    b.如果任一竞选者获得的选票数超过总票数的50%,则显示竞选者获胜;  

    c.如果没有竞选者获得总选票数的50%以上,则显示两位得票最高的竞选者需再进行决选。  

    在下面的程序代码中,竞选者A的编号为1,竞选者B的编号为2,以此类推。 

【C代码】  
#include 
#include  
#define M 5      /*选区数*/  
#define N 4      /*竞选者人数 */ 
 
int main(int argc, char argv[ ] ) 
{
    FILE *fin;
    int data[M+1] [N+1];
                        /*data[ ][0]存放选区编号,data[M][J]存放j号竞选者得票总数*/
    int MAXP1,cdl;      /*MAXP1、cd1存放得票最多者的票数和竞选者编号*/
    int MAXP2,cd2;      /*MAXP2、cd2存放得票次多者的票数和竞选者编号*/
    int i,j, totalP;        /*tatalp存放总票数*/
 
    fin=fopen("data.txt","r");
    if(!fin)return -1;
    i=0;  j=0;  
    while(!feof(fin)){                       /* 从文件读入数据 */ 
          fscanf(fin,”%d”,&data[i][j]);
          (1); 
         if(j>N)  {j=0;i++;} 
fclose(fin);  
 
totalP =0;MAXP1=0;MAXP2=0;cd1=0;cd2=0; 
 
for(j=1;j
    data[M][j]=(2);                       /* 设置竞选者得票总数初始值 */
    for(i=0;i
        data[M][j] +=data[i][j];
    if(data[M][j]>MAXP1)    {
         (3); cd2=cd1;
          MAXP1=data[M][j]; cd1=j; 
    }
else
         if(data[M][j]> MAXP2){ MAXP2=data[M][j];cd2=j;}
        (4);                                       /* 计算总票数 */ 
}
 

上一页

第 9 页