2008年秋~2010年春VC++笔试试卷
2008秋江苏计算机c++试题试卷
一、选择题(用答题卡答题,答案依次填在21-30答题号内)
21. 以下关于逻辑运算的描述中,正确的是_______。
A. 所有的逻辑运算都是双目运算,其优先级相同
B. 逻辑运算中存在双目运算和单目运算,其优先级相同
C. 所有的逻辑运算都是双目运算,其优先级各不相同
D. 逻辑运算中存在双目运算和单目运算,其优先级各不相同
22. 对于while和do…while循环语句,以下描述正确的是_______。
A. do…while语句中的循环体至少执行一次
B. 两个语句中的循环体可能都不执行
C. while语句中的循环体至少执行一次
D. 两个语句中的循环体至少执行一次
23. 以下说明语句中,不存在语法错误的是_______。
A. char sl[4]={"a","b","c"};
B. char s2[4]={'a','b'};
C. char s3[]={'I am a student'};
D. char s4[14]={"I am a student"};
24. 设变量a,b,c为整型变量,以下选项中存在语法错误的是。
A. c=a+++b;
B. c=a+b++;
C. c=b++=c++;
D. c=++a=b++;
25. 设有程序段:
x=-1;
if(a!=0){if(a>0)x=1;}
else x=0;
该程序段表示的数学函数关系是_______。
26. 以下关于两个同类型指针变量的叙述中,在一定条件下,运算结果没有实际意义的是_______。
A. 两个指针变量可以互相赋值
B. 两个指针变量进行比较运算
C. 两个指针变量进行减法运算
D. 两个指针变量进行加法运算
27. 下列有关构造函数的叙述中正确的是_______。
A. 类的构造函数不能重载
B. 任何一个类必定有构造函数
C. 可以定义没有构造函数的类
D. 任何一个类必定有一个缺省的构造函数
28. C++中运算符重载可以改变_______。
A. 运算符的优先级
B. 运算符的结合性
C. 运算符实现的功能
D. 运算符的操作数的个数
29. 以下关于基类指针和派生类指针的叙述中不正确的是_______。.
A. 基类指针可以指向它的公有派生类的对象
B. 基类指针可以指向它的多次派生后的派生类的对象
C. 派生类的指针不能指向基类的对象
D. 若基类指针指向派生类的对象,通过该基类指针可以访问派生类对象的所有成员
30. 以下关于友元函数的叙述中,正确的是_______。
A. 友元函数不能访问类的私有成员
B. 友元函数破坏了类的封装性和隐藏性
C. 友元函数的使用与类的成员函数相同
D. 友元函数的实现必须在类的说明中定义
二、填空题(请将答案填写在答题纸的相应答题号内,每个答案只占一行)
●基本概念题(共5分)
1. 设有语句:
int a=5,b=6,c;c=!a&&b++;
执行以上语句后,变量b的值为___(1)____。
2. 在定义派生类时,如果没有指定基类的派生(继承)方式,则缺省(默认)的继承方式是___(2)____。
3. c++中编译预处理包括:文件包含、宏和___(3)____。
4. 要将一个函数定义为内联函数时,通常在定义函数时使用关键字___(4)____。
5. c++中表达式"I am a student"的值为该字符串的___(5)____。
●阅读程序题(共13分)
6. [程序](2分)
#include
void f(int a[])
{ int t=a[0];
a[0]=a[1];a[1]=t;
cout< } void main(void ) { int b[2]={300,500}; f(b);cout< } 程序输出的第一行是___(6)____,第二行是___(7)____。 7. [程序](2分) #include int fa(int a) { static int m=1;m=a*m;return m;} void main(void ) { for(int i=2;i<=4;i++)cout< 程序输出的第一行是___(8)____,第三行是___(9)____。 8. [程序](2分) #include int f1(int a[3][3]) { int sum=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++){ if(a[i][j]>0)continue; sum+=a[i][j]; } return sum; } int f2(int a[3][3]) { int sum=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++){ if(a[i][j]<0)break; sum+=a[i][j]; } return sum; } void main(void ) { int b[3][3]={{1,2,3},{7,-12,-13},{-20,9,-5}}; int s1,s2; s1=f1(b);s2=f2(b); cout< } 程序输出的第一行为___(10)____,第二行为___(11)____。 9. [程序](3分) #include int f(int x[],int n) { if(n==1)x[n]=3; else x[n]=n+f(x,n-1); cout< return x[n]; } void main(void ) { int b[5]={3,4,5,6,0}; f(b,3); for(int i=0;i<5;i++)cout< cout< } 程序输出的第一行是___(12)____,第二行是___(13)____,第三行是___(14)____。 10. [程序](2分) #include class A{ int x; public: A(int a){x=++a;} ~A(){cout< int get(){return x;} }; class B:publicA{ int y; public: B(int b):A(b){y=get()+b;} B():A(5){y=6;} ~B(){cout< }; void main(void ) { B b(5);} 程序输出的第一行是___(15)____,第二行是___(16)____。 11. [程序](2分) #include class A{ int x; public: A(int x=0){this->x=x;} virtual void f(){cout< }; class B:publicA{ int y; public: B(int x,int y=1):A(x) {this->y=y;} void f(int a){cout< }; void main(void ) { A al(10),*pa; B bl(20,30); a1. f(); pa=&a1;pa->f(); pa=&b1;pa->f(); } 程序输出的第二行是___(17)____,输出的第三行是___(18)____。 ●完善程序题(共12分) 12. 以下程序的功能是:将两个字符串分别输入到sl和s2中,并使s2中的字符按升序排列(用函数sort()实现排序)。然后,依次从sl中取一个字符插入到s2中,并使s2中的字符保持升序。函数insert(char *p,char c)的功能是将字符c插入到p所指向的字符串中,使p所指向的字符串保持升序。函数merge(char *pl,char *p2)依次从p2所指向的字符串中取出一个字符,并插入到p1所指向的字符串中。 [程序](4分) #include #include char *sort(char s[]) { int len=strlen(s); for(int i=0;i for(int j=i+1;j if(___(19)____){ char c=s[i]; s[i]=s[j];s[j]=c; } return s; } void insert(char *p,char c) { char *p1=p; int len=strlen(p); while(*p1 char *p2=p+len; while(p2>=p1){ ___(20)____; p2--; } ___(21)____; } char *merge(char *p1,char *p2) { while(*p2){ ___(22)____; p2++; } return p1; } void main(void ) { char sl[100],s2[200]; cout<<"输入第一行字符串:";cin. getline(s1,100); cout<<"输入第二行字符串:";cin. getline(s2,100); cout< sort(s2);merge(s2,s1); cout< } 13. 以下程序中的功能是:通过重载运算符+,-和=,分别实现一维数组(向量)的加法(对应元素相加)、减法(对应元素相减)和向量对象之间的赋值,例如;设a,b,c是类Arr的对象,a的成员x[]={1,1,1,1,1,1},b的成员x[]={2,2,2,2,2,2},执行c=a+b后,c的成员x[]={3,3,3,3,3,3} [程序](4分) #include class Art{ float x[20]; int size; public: Arr(float a[],int n) { for(int i=0;i size=n; } Arr() { for(int i=0;i<20;i++)x[i]=0; size=0; } Arr operator+(Arr); Arr operator-(Arr); Arr& operator=(Arr&); int GetArr(float y[]) { for(int i=0;i return size; } void print () { for(int i=0;i cout<<'\n'<<"size="< } }; Arr Arr::operator+(Arr a) { Arr tem; for(int i=0;i tem. size=size; return tem; } Arr Arr::operator-(Arra) { Arr tem; for(int i=0;i tem. size=size; return tem; } Arr& Arr::operator=___(25)____ { for(int i=0;i x[i]=a. x[i]; size=a. size; return ___(26)____; } void main(void ) { float b1[6]={10,20,30,40,50,60}; float b2[6]={100,200,300,400,500,600},b3[6],b4[6]; Arr al(b1,6),a2(b2,6),a3,a4; a3=al+a2;a4=a2-al; a3. print ();a4. print (); int n=a1. GetArr(b3); for(int i=0;i cout<<'\n'< } 14. 下面程序的功能是:首先建立一条链表,顺序从链表中找到data为最大值的结点,从链表中删除该结点,并将其值返回,最终删除整个链表,同时得到按降序排序的数组x。其中,函数Insert(int a,node *head)的功能是:用参数a产生一个新结点,将其插入链首,并返回链首指针。DeleteMax(node ,*&head)的功能是:从head所指向的链表中找到data值为最大的结点,从链表中删除该结点并将其结点值返回。 算法提示:当链表为空时,返回-1。在查找的过程中,始终让pmax指向当前data 值为最大的结点,并让pmax1指向pmax的前一个结点。找到data值为最大的结点后,将其从链表中删除,并返回其data值。 [程序](4分) #include struct node { int data; node *next; }; node *Insert(int x,node *head) { node *p=new node ; p->data=x;___(27)____;head=p; return head; } int DeleteMax(node :I:&head) { node *pl,*p2,*pmax,*pmax1; int max; p1=p2=head: if(!head)return -1; max=p1->data;pmax=p1; while(p1){ if(max max=p1->data; pmax=pl;pmax1=p2; } p2=p1; ___(28)____; } if(pmax==head)head=head->next; else___(29)____; delete pmax; return max; } void main(void ) { int a; int x[200],count=0; node *head=0; cin>>a; while(a!=-1){ head=Insert(a,head); cin>>a; } while(head){ x[count]= ___(30)____; count++; } for(int i=0;i cout< } 2009年春江苏计算机c++试题试卷 一、选择题(用答题卡答题,答案依次填在21-30答题号内) 21. 下列关于"for(e1;e2;e3)s1;"的描述中不正确的是______。 A. 存在"for(;;)s1;"的情况 B. 表达式e1和e3可为空,但e2不能为空 C. 表达式e2的值可增可减 D. 循环体s1可以为空,但分号(;)必须有 22. 下列函数定义中存在语法错误的是______。 A. void f5();f6(){f5;cout<<200;}void f5(){cout<<100;} B. void f3(){cout<<100;}void f4(){tout<<200;} C. void f7(int a){if(a)f7(--a);cout<””;} D. void f1(){cout<<100;void f2(){tout<<200;}} 23. 设有说明语句; int a=7,b=12,e; 以下表达式选项中,e值为2的是_______。 A. e=b%=(a-a%5) B. e=b%=(a%=5) C. e=b%=b+1-a%5 D. e=(b%=a)-(a%=5) 24. 以下叙述中不正确的是_____。 A. 一个函数中可以有多个return 语句 B. 一个函数中可以没有return 语句 C. 一个return 语句可返回多个值 D. 一个return 语句可不返回值 25. 以下双目运算符中要求两个操作数均为整型的运算符是______。 A. || B. && C. / D. % 26. 以下对break语句的描述中,不正确的是______。 A. break语句可用在循环语句中,其作用是结束本层循环的执行 B. break语句可用在switch语句中,其作用是结束该switch语句的执行 C. break语句可用在if语句中,其作用是结束该if语句的执行 D. break语句在同一循环体中可以多处使用 27. 以下对类的析构函数的叙述中,正确的是______。 A. 析构函数完成类的初始化 B. 析构函数完成对象的初始化 C. 析构函数完成撤销对象的相关处理 D. 析构函数和成员函数一样可以显式地调用 28. 以下有关多态性的叙述中不正确的是________。 A. C++语言的多态性分为编译时的多态性和运行时的多态性 B. 编译时的多态性通过重载函数来实现 C. 运行时的多态性通过虚函数来实现 D. 函数重载和虚函数均可实现编译时的多态性和运行时的多态性 29. 设已定义了一个类名为MyClass 的类: MyClass sl,*s2,**s3,*s4E2]; 当该语句执行后,调用该类的构造函数的次数是_______。 A. 1 B. 2 C. 3 D. 5 30. 在公有派生的情况下,派生类中定义的成员函数能访问其基类的_________。 A. 公有成员和保护成员 B. 公有成员和私有成员 C. 保护成员和私有成员 D. 公有成员、保护成员和私有成员 二、填空题(请将答案填写在答题纸的相应答题号内,每个答案只占一行) ●基本概念题(共5分) 1. 以下循环语句的循环体的执行次数为__(1)__。 for(int s=0,j=1;j<=10;s+=j);j++; 2. void 类型的指针是其指向变量的数据类型是不固定的,对该类型指针进行操作时,通常应进行__(2)__。 3. C++变量的存储类型有自动类型、静态类型、__(3)__和__(4)__。 4. c++函数的参数传递方式有三种:__(5)__、指针传递和引用传递。 ●阅读程序题(共13分) 5. [程序](2分) #include void fa(int &a,int &b) { int t=a; a=b; b=t; } void fb(int a,int b) { int t=a; a=b; b=t;} void main(void ) { int c[2]={100,200},d[2]={300,400}; fa(c[0],c[1]);cout<< c[0]<<’\t’< rb(d[0],d[1]);cout< } 程序输出的第一行是__(6)__,第二行是__(7)__。 6. [程序](2分) #include void main(void ) { int n=0,m=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(j>=i)n++; m++; cout< }. 程序输出的第一行是__(8)__,第二行是__(9)__。 7. [程序](2分) #include int a=10; void main(void ) { int a=20,b=30; { int a=0,b=0; for(int i=1;i<4;i++){ a=a+b;b=::a+b; } cout< }