江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
2011春江苏省计算机二级VC++试题

第二部分  C++语言程序设计

选择题(用答题卡答题,答案依次填在2l”30答题号内)

21.下列关于switch语句的描述中,不正确的是___(21)___

A.switch语句中的default子句可以没有,也可以有一个

B.switch语句中的每一个case子句中必须有一个break语句

C.switch语句中的default子句可放在switch语句中的任何位置

D.switch语句中的case子句后面的表达式只能是整型、字符或枚举类型常量

22.设有说明语句:int a=1,b=2;float x=3,y:4:以下赋值中存在语法错误的是___(22)___

    A.  a=++x;    B.  y=++b;    C.  b++=x++;    D. b+=x++ + y++

23.设有说明语句:char ss[]={“I am a student.”};static float x[20];

下列选项中,存在语法错误的是___(23)___

  A.cout<<ss;    B.cin>>ss;    C.cout<<x;   D.cin>>x;

24.设有说明语句:float  f(int &a,int b):int  x,y;以下对函数f的调用语句中,正确的是(24)

A.f(x,y) ;  B.f(&x,y);    C.f(15,20);    D.f(*x,y);

25.设有说明:int a=1O,b=15,c;执行语句:c=a ||(a+=b)||(++b);abc的值分别为___(25)___

A.10,15,1   B.25,16,1    C.10,15,10   D.25,15,1

26.下列关于函数重载的描述中,不正确的是___(26)___   

A.两个或两个以上的函数取相同的函数名,但形参的个数不同

B.两个或两个以上的函数取相同的函数名,各函数的返回值的类型必须不同

C.两个或两个以上的函数取相同的函数名,形参的个数相同但类型不同

D.两个或两个以上的函数取相同的函数名,形参的个数不同或类型不同

27.C++的集成环境中,系统约定c++源程序文件缺省的扩展名为___(27)___

A.vc   B.c++    C.vc++   D.cpp

28.用友元函数进行双目运算符重载时, 该友元函数的参数表中应定义___(28)___个参数

    A.O    B.  1    C.2   D.3

29.以下有关抽象类的叙述中,正确的是___(29)___

  A.抽象类不能含有纯虚函数

  B.可以定义抽象类的对象

C.在抽象类中至少含有一个没有函数体的虚函数

D.抽象类不能作为基类派生出新的类

30.以下有关this指针的叙述中,不正确的是___(30)___

  A.当调用对象的非静态成员时,总存在一个this指针

  B.非静态成员函数调用类中的成员时,可直接使用this指针

  C.this指针隐含地指向要用到的当前对象

  D.静态成员函数也存在this指针

二、填空题(请将答案填写在答题纸的相应答题号内,每个答案只占一行)

●基本概念题,5

1.成员函数实现双目运算符重载时, 该运算符的左操作数是___(1)___ , 其右操作数是___(2)___ 

2.C++,类的继承方式有三种:保护继承,私有继承和___(3)___   

3.在定义全局变量和静态变量时,若没有设置其初值,则这两种变量的初值为___(4)___ 

4.c++,标识符是以___(5)___或下划线开头的,由字母、数字和下划线组成的字符序列.

●阅读程序题,13

5.[程序](2)

  #include <iostream.h>    t

  int a=1O;

  void fun(void)

  {

    int a=15;

    ::a-=--a;

    cout<<::a<<’\t’<<a<<’\n’;

  }

  void main(void)

  {

    int a=15;

    for(int i=-10;i<a+::a;i++) fun();

  }

    执行程序后输出的第一行是___(6)___,第二行是___(7)___

6.[程序](2)

  #include <iostream.h>

  void main(void)

  {

    int i=1,j=1;

    for(:j<10;j++){

      if(j>5){i+=2;break;}

      if(j%2!=0){

         j+=2;

         continue;

     }

     cout<<i<<’\t’<<j<<’\n’;

    }

    cout<<i<<’\t’<<j<<’\n’;

 }

  执行程序后输出的第一行是___(8)___ ,第二行是___(9)___  .

7.[程序](2)

  #include<iostream.h>

  int f(int &x,int &y)

  {

    x+=y;

y+=x;

return(x>y?x:y);

  }

void main(void)

{

    int x=20,y=30,z;

    z=f(x,y):

    cout<<x<<’t’<<y<<’t’<<z<<endl;

    z=f(y,x):

    cout<<x<<’t’<<y<<’t’<<z<<endl ;

  }

执行程序后输出的第一行是___(10)___,第二行是___(11)___.

8.[程序](2)

#include <iostream.h>

int f1(int n)

  

    if(n==1)return 1;

    else return n*n+f1(n-1);

}

int f2(int n)

{

    int mul=1;

    if(n==1) mul=1;

    else mul= n*f2(n-1);

    return mul;

}

void main(void)

{

    cout<<f1(3)<<endl;

    cout<<f2(4)<<endl;

}

执行程序后输出的第一行是___(12)___,第二行是___(13)___

9.[程序](3) 

#include <iostream.h>

char *str(char *p1,char*p2)

{

    char *p=p1;

    while(*p)p++;

    *p++=’’;

    while(*p++=*p2++);

    *p++=’’;

    return p1;

}

void main(void)

{

char s1[200]={“NanJin”};

char s2[200]={“is”};

char s3[]={“good”};

cout<<str(s2,s3)<<’\n’;

cout<<str(s1,s2)<<’\n’ ;

cout<<s1<<’ !’<<s2<<’ !’<<s3<<’\n’;

    执行程序后输出的第一行是___(14)___ ,第二行是___(15)____,第三行是___(16)___

1O.[程序](2)

  #include<iostream.h>

class A{

    int x,y;

public:

  A(int a,int b){x=a;y=b;}

  virtual void funl(){cout<<“x+y=“<<x+y<<“n”;}

;

class B:public A{

    int m,n;

public:

  B(int a,int b,int c,int d) :A(c,d){m=a ;n=b ;}

void fun1(){cout<<“m*n= ”<<m*n<< ”\n”;}

 };

void print(A &ra){ra.fun1();}

void main(void)

{

  A a(10,20),*pa;

  B *p;

  p=new B(20,30,40,50);

  p->fun1();

pa=&a; pa->fun1();

pa=p;  pa->fun1();

print(a);

delete p;

}

执行程序后输出的第二行是___(17)____,第三行是___(18)___

完善程序题,12

11.设有一条环形铁路,共有n个车站,现有检查组去检查每个车站的服务质量,从第i个车站开始检查,每隔m(已检查过的车站不计算在内)个车站作为下一个要检查的车站,直到所有车站都检查完为止。下面的程序功能是:按以上要求计算出依次检查的车站序号,并输出计算的序号序列和检查循环的圈数。例如,假设共有20个车站,车站的序号依次为:1,2,3,…,19,20;要求从第3个车站开始检查,间隔5个车站,则检查车站的顺序为:   

  3->8->13->18->4->10->16->2->11->19->7->17->9->1->15->14->20->6->12->5

  函数check()中的count记录检查完所有车站时要绕环形铁路的圈数。

  [程序](4)

  #include<iostream.h>

  #define N 100

  int check(int x[],int y[],int n,int i,int m) //x存放车站序号,y存放依次检查的车站

  {//n总车站数,i开始检查的车站号,m要间隔的车站数

    int k=O,k1,count=0; //k记录已检查车站的个数

    x[O]=n;    //初始化数组x,x[0]记录最后一个车站号

    for(int j=1;j<n;j++) x[j]=j;

    y[k++]=i:    //i为第一个检查的车站

    x[i]=-1:    //“i]为一1,表示该车站已检查

    j=i;

    while( ___(19)___){

      k1=O;    //k1累加间隔车站个数

      while(k1<m){  

         j++;

         if(j>=n){

    .      count++;

           j=___(20)___;

      }

      if(x[j]!=-1)k1++;

     }

     y[k++]= ___(21)___;

     x[j]=-1;

    }

    return count;

   }

  void main(void)

  {

    int A[N],B[N],n,m,i,j,k=O,k1,num;//A记录车站序号,B记录检查顺序

    cout<<”输入车站个数n,第一个开始检查的车站号i,间隔的车站数m:”;

    cin>>n>>i>>m;

    num=___(22)___ ;

    cout<<“检查顺序:”<<endl;    //输出依次检查车站的序号

    for(j=O;j<n-1;j++)

      cout<<B[j]<<“>“;

    cout<<B[j]<<endl:

    cout<<“全部检查完各个车站,共要循环的圈数为:”<<num<<endl;

  }

12.以下程序的功能是:求满足以下条件的所有三位数:(1)该三位数是某一个二位数的平方:(2)该三位数的个位数、十位数和百位数各不相同,l9这九个数字在该数中至多只允许出现一次.要求每行输出五个数。例如,满足以上条件的所有三位数有13,分别为:

    169    196    256    289    324

    361    529    576    625    729

    784    841    961

    [程序](4)

    #include <iostream.h>

    int f(int y)    //y若满足条件,返回1:否则返回O

    {

    int i,j,k;

    i=y%10;    //求个位数

    j=___(23)___ ;    //求十位数

    k=y100;

    if( ___(24)___)    //判是否有相同的数字

       return 0;

    for(i=11:i<=31:i++)    //32.32=1024,已超过三位数

      if(___(25)___) return 1;

    return 0;   

  }

  void main(void)

  {

    int x[22]={0},count=O;

    for(int i=102:i<987;i++){

      if(f(i)){

          ___(26)___ ;

         count++;

      }

    }

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

      cout<<x[i]<<’t’;

      if((i+1)%5==0)cout<<’\n’;

    }

    cout<<’n’<<“共有:”<<count<<“个三位数满足条件.n”;

  }

13.在以下程序中,函数create()根据键盘依次输入的整数建立一条单向无序链表,链表上的每一个结点包含一个整数;函数sort()根据链表结点的数据按从小到大的顺序将链表调整为一条有序链表;函数print()将链表上的整数依次输出;函数del()将链表删除。

    排序算法提示:(1)初始时,使P指向链表的首结点,(2)P之后的所有结点中找出data值最小的结点。(3)p1指向该结点,并将P指向结点的data值与pl指向结点的data值进行交换,P指向下一个结点,(4)重复步骤(2)(3),直至P指向链表的最后一个结点为止·

    [程序](4)

    #include<iostream.h>

    struct Node{

      int  data;

      Node *next;

    };

    Node *sort(Node *head)

    {

    Node *p=head,*p1,*p2;

    if(p==NULL)return head;

    while(p->next!=NULL){   

    p1=p;

    __________(27)___________;

    while(p2!=NULL){

      if(p2->data<p1->data) ___(28)___;

     p2=p2->next;

    }

    if(p!=p1){

       int t;

       t=p->data;

       p->data=p1->data;

       p1->data=t;

    }

    p=p->next;

   }

    return head;

 }

 Node *creat(void)

{

    Node *h=NULL,*p,*p1;

    int data=1;

    while(data){

       cout<<“输入一个整数,0表示输入结束:”;

       cin>>data;

       if(data){

           p=new Node:

           p->data=data;

           p->next=NULL;  

           if(h==NULL)

             h=p1=p;

           else{

             ___(29)___;

             p1=p;

        }

      }

    }

    return h;

}

void print(Node *p)

{

    while(p){

      cout<<p->data<<’t’;

      p=p->next;

    }

    cout<<’n’;

}

void del(Node *h)

{

    Node *p;

    while(h){

      p=h;

     ___(30)___

    delete p;

    )

}

void main(void)

(

    Node *head;

    head=creat();

    cout<<“链表上的数据为:”;

    print(head);

    head=sort(head);

    cout<<“排序后链表上的数据为:”;

    print(head);

    del(head);

    cout<<endl;

}