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);则a、b、c的值分别为___(25)___ A.10,15,1 B.25,16, 26.下列关于函数重载的描述中,不正确的是___(26)___ 。 A.两个或两个以上的函数取相同的函数名,但形参的个数不同 B.两个或两个以上的函数取相同的函数名,各函数的返回值的类型必须不同 C.两个或两个以上的函数取相同的函数名,形参的个数相同但类型不同 D.两个或两个以上的函数取相同的函数名,形参的个数不同或类型不同 27.在C++的集成环境中,系统约定c++源程序文件缺省的扩展名为___(27)___ A.vc B.c++ C.vc++ D.cpp 28.用友元函数进行双目运算符重载时, 该友元函数的参数表中应定义___(28)___个参数 A.O B. 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)该三位数的个位数、十位数和百位数各不相同,即l到9这九个数字在该数中至多只允许出现一次.要求每行输出五个数。例如,满足以上条件的所有三位数有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=y/100; 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 { 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); cout<<endl; } |