全国2008年10月C++程序设计试题
一、单项选择题(本大题共20小题,每小题1分,共20分)
1.对C++语言和C语言的兼容性,描述正确的是(A)
A.C++兼容C B.C++部分兼容C D.C兼容C++
2.在C++中使用流进行输入输出,其中用于屏幕输出的对象是( C )
A.cerr B.cin C.cout D.cfile
(cerr:标准错误输出(非缓冲方式);cin:标准输入; clog 标准错误输出(缓冲方式)) 3.对使用关键字new所开辟的动态存储空间,释放时必须使用( C )
A.free B.create C.delete D.realse
4.如没有使用private关键字定义类的数据成员,则默认为(A)
A.private B.public C.protected D.friend
5.使用值传递方式将实参传给形参,下列说法正确的是(A)
A.形参是实参的备份 B.实参是形参的备份C.形参和实参是同一对象D.形参和实参无联系
6.在函数调用时,如某一默认参数要指明一个特定值,则有(A)
A.其之前所有参数都必须赋值B.其之后所有参数都必须赋值C.其前、后所有参数都必须赋值
D.其前、后所有参数都不必赋值
7.设存在函数int max(int,int)返回两参数中较大值,若求22,59,70三者中最大值,下列表达式不正确的是( C )
A.int m = max(22,max(59,70));B.int m = max(max(22,59),70);
C.int m = max(22,59,70);D.int m = max(59,max(22,70));
8.下列哪个类型函数不适合声明为内联函数(A)
A.函数体语句较多B.函数体语句较少C.函数执行时间较短D.函数执行时间过长9.int Func(int,int);不可与下列哪个函数构成重载( B )
A.int Func(int,int,int);B.double Func(int,int);
C.double Func(double,double);D.double Func(int,double);
说明:不能以形参名来区分函数;不能以函数返回值来区分函数。
必须是形参的个数或者类型不同才能构成函数重载。
10.对类中声明的变量,下列描述中正确的是( C )
A.属于全局变量B.只属于该类
C.属于该类,某些情况下也可被该类不同实例所共享D.任何情况下都可被该类所有实例共享
11.类的私有成员可在何处访问( D )
A.通过子类的对象访问
B.本类及子类的成员函数中
C.通过该类对象访问D.本类的成员函数中
12.如果没有为一个类定义任何构造函数的情况下,下列描述正确的是(A)A.编译器总是自动创建一个不带参数的构造函数
B.这个类没有构造函数C.这个类不需要构造函数D.该类不能通过编译13.一个类可包含析构函数的个数是( B )
A.0个B.1个C.至少一个D.0个或多个
14.this指针存在的目的是( B )
A.保证基类公有成员在子类中可以被访问B.保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码C.保证基类保护成员在子类中可以被访问D.保证基类私有成员在子类中可以被访问
15.下列关于类的权限的描述错误的是(A)
A.类本身的成员函数只能访问自身的私有成员B.类的对象只能访问该类的公有成员C.普通函数不能直接访问类的公有成员,必须通过对象访问D.一个类可以将另一个类的对象作为成员
16.在编译指令中,宏定义使用哪个指令( B )
A.#include B.#define C.#if D.#else
17.设类A将其它类对象作为成员,则建立A类对象时,下列描述正确的是( B )A.A类构造函数先执行B.成员构造函数先执行C.两者并行执行D.不能确定
类的组合,描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。在声明一个组合类的对象时,不仅它自身的构造函数将被调用,而且还将调用其内嵌对象的构造函数。这时构造函数的调用顺序是:
(1)按照内嵌对象在组合类的声明中出现的次序,依次调用内嵌对象的构造函数;
(2)执行本类构造函数的函数体析构函数的调用执行顺序与构造函数刚好相反。
18.下列描述错误的是(A)
A.在创建对象前,静态成员不存在B.静态成员是类的成员
C.静态成员不能是虚函数D.静态成员函数不能直接访问非静态成员
说明:静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。
19.对于友元描述正确的是( B )
A.友元是本类的成员函数B.友元不是本类的成员函数
C.友元不是函数D.友元不能访问本类私有成员
20.在哪种派生方式中,派生类可以访问基类中的protected成员( B )
A.public和private B.public和protected C.protected和private D.仅protected 二、填空题(本大题共20小题,每小题1分,共20分)
21.设要把一个文件输出流对象myFile与文件“f:\myText.txt相关联,所用的C++语句是:myFile.open(“f:\\myText.txt”);。
22.C++中ostream类的直接基类是ios 类。
23.运算符[ ]只能用成员运算符来重载,不能用友元运算符来重载。
24.定义虚函数所用的关键字是virtual。
25.vector类中用于返回向量中第1个对象的方法是front( )。
26.在C++中,利用向量类模板定义一个具有20个char的向量E,其元素均被置为字符‘t’,实现此操作的语句是vector
27.类的继承是指子类继承基类的数据成员和成员函数。
28.不同对象可以调用相同名称的函数,但可导致完全不同的行为的现象称为多态性或(类的多态性)。
29.#include指令指示编译器将一个源文件嵌入到带该指令的源文件之中。
30.设类A有成员函数void Fun(void);若要定义一个指向类成员函数的指针变量pafn来指向Fun,该指针变量的声明语句是:void(A::*pafn)(void);。
31.设在程序中使用如下语句申请了一个对象数组:Point * ptr = new Point[2];
则在需要释放ptr指向的动态数组对象时,所使用的语句是delete[ ]ptr;。
32.在保护派生中,基类权限为Private的成员在派生类中不可访问。
33.类A有如下成员函数
int A::fun(double x){return (int) x/2;}
int A::fun(int x){return x*2;}
设a为类A的对象,在主函数中有int s=a.fun(6.0)+a.fun(2),则执行该语句后,s的值为7 。
34.对象传送的消息一般由3部分组成:接收对象名、调用操作名和必要的参数。
35.将指向对象的指针作为函数参数,形参是对象指针,实参是对象的地址值。
36.在使用string类的find成员函数来检索主串中是否含有指定的子串时,若在主串中不含指定的子串,find函数的返回值是-1 。
37.在C++中,声明布尔类型变量所用的关键字是bool 。
38.执行下列代码
int a=29,b=100;
cout < 程序的输出结果是:__29,100 。 39.执行下列代码 cout <<″Hex:″<< hex << 255; 程序的输出结果为Hex:ff 。 40.C++语言中可以实现输出一个换行符并刷新流功能的操控符是_ endl _ 三、改错题(本大题共5小题,每小题2分,共10分) 下面的类定义中有一处错误,请用下横线标出错误所在行并给出修改意见。41.#include void main( ) { int x=5,y=6; const int * p=&x; *p=y; cout<<*p< } *p=y; 指针p所指向的为一个常量,不能进行左值操作 42.#include class f{ //类名f private://声明为私有访问权限 int x,y;//私有数据成员 public://声明为公有访问权限 f1( ){x=0;y=0;} print( ){cout< }; void main( ){ f a; a.f1(1,1); a.print( ); } a.f1(1,1); f1( )调用时实参与形参数量不一致 43.#include class f{ //类名f private:int x=0,y=0; public:void f1(int a,int b){x=a;y=b;} void get( ){cout< }; void main( ){ f a; a.f1(1,3); a.get ( ); } private:int x=0,y=0; 数据成员声明时不允许直接赋值 44.#include class point{private:float x; public:void f(float a){x=a;} void f( ){x=0;} friend float max(point& a,point& b); }; float max(point& a,point& b) {return(a.x>b.x)? a.x:b.x;} void main( ){ point a,b; a.f(2.2); b.f(3.3); cout< } cout< 45.#include template class f{ private:T x,y; public:void f1(T a,T b){x=a;y=b;} T max( ){retum(x>y)?x:y;} }; void main( ){ f a; a.f1(1.5,3.8);? cout< } cout< 四、完成程序题(本大题共5小题,每小题4分,共20分) 46.完成下面类中的成员函数的定义。 class point { private: int m,n; public: point(int,int); point(point&); }; point::point(int a,int b) { m=a; n =b; } point::point(point&t ) { m=t.m; n=t.n; } 47.下面是一个输入半径,输出其面积和周长的C++程序,在下划线处填上正确的语句。#include using namespace std; const double pi=3.14159; void main( ) { double r; cout<<″r=″; cin>>r; double l=2.0*pi*r; double s=pi*r*r; cout<<″\n The long is:″< cout<<″The area is:″< } 48.在下划线处填上缺少的部分。 #include #include using namespace std; class complex { public: int real; int imag; complex(int r=0,int i=0) { real=r; imag=i; } }; complex operator+(complex&a,complex& b) { int r=a.real+b.real; int i=a.imag+b.imag; return complex(r,i); } void main( ) { complex x(1,2),y(3,4),z; z=x+y; cout< } 49.程序的输出结果如下: 1,9 50,30 请根据输出数据在下面程序中的下划线处填写正确的语句。 源程序如下: #include using namespace std; class base { private: int m; public: base( ){ }; base(int a):m(a){} int get( ){return m;} void set(int a){m=a;} }; void main() { base*ptr=new base[2]; ptr- >set(30); ptr= ptr+1;; ptr- >set(50); base a[2]={1,9}; cout< cout< ptr=ptr-1; cout<< ptr->get( )< delete[ ]ptr; } 50.在下面横线处填上求两个浮点数之差的cha函数的原型声明、调用方法。#include using namespace std; void main( ) { float a,b; float cha(float,float);//函数cha的原型声明 a=12.5; b=6.5; float c= cha(a,b);//调用函数cha cout< } float cha(float x,float y) { float w; w=x-y; return w; } 五、程序分析题(本大题共4小题,每小题5分,共20分) 51.给出下面程序的输出结果。 #include template class Sample { T n; public: Sample(T i){n=i;} int operator==(Sample &); }; template int Sample { if(n==s.n) return 1; else return 0; } void main( ) { Sample cout<<″s1与s2的数据成员″<<(sl==s2 ?″相等″:″不相等″)< cout<<″s3与s4的数据成员″<<(s3==s4 ? ″相等″:″不相等″)< S1与S2的数据成员不相等 S3与S4数据成员相等 52.给出下面程序的输出结果。 #include using namespace std; template T max(T ml,T m2) {return(m1>m2)?ml:m2:} void main( ) { cout< cout< } 7 5 y a 53.给出下面程序的输出结果#include using namespace std; class A{ public: int x; A( ) { } A(int a){x=a;} int get(int a){return x+a;} };void main( ) { A a(8); int(A::*p)(int); p=A::get; cout<<(a.*p)(5)< A*pi=&a; cout<<(pi- >*P)(7)< 54.给出下面程序的输出结果。 include #include using namespace std; class Book { char*title;char*author; int numsold; public: Book( ){ } Book(const char*strl,const char*str2,const int num) { int len=strlen(strl); title=new char[len+1]; strcpy(title,str1); len=strlen(str2); author=new char[len+1]; strcpy(author,str2); numsold=num;} void setbook(const char*str1,const char*str2,const int num) { int len=strlen(str1); title=new char[len+1]; strcpy(title,str1); len=strlen(str2);author=new char[len+1]; strcpy(author,str2);numsold=num; } ~Book( ) { delete title;delete author; } void print(ostream&output) { output<<″书名:″< output<<″作者:″< output<<″月销售量:″< } . }; void main( ) { Book obj1(″数据结构″,″严蔚敏″,200),obj2; obj1.print(cout); obj2.setbook(″C++语言程序设计″,″李春葆″,210); obj2.print(cout); } 六、程序设计题(本大题共1小题,共10分) 55.在三角形类TRI实现两个函数,功能是输入三个顶点坐标判断是否构成三角形#include #include class point{ private:float x,y; public:point(float a,float b){x=a;y=b;} point( ){x=0;y=0;} , void set(float a,float b){x=a;y=b;} float getx( ){return x;} float gety( ){return y;} }; class tri{ point x,y,z;float s1,s2,s3; public;...settri(....);//用于输入三个顶点坐标 ....test(....);//用于判断是否构成三角形 };请写出两个函数的过程(如果需要形式参数,请给出形参类型和数量,以及返回值类型) 判断三条边能构成三角形的条件:任意两边之和大于第三边或任意两边之差小于第3边。void tri::settri(float x1,float y1,float x2,float y2,float x3,float y3) {x.set(x1,y1); y.set(x2,y2); z.set(x3,y3); } void tri::test(){ s1=sqrt((x.getx()-y.getx())*(x.getx()-y.getx())+(x.gety()-y.gety())*(x.gety()-y.gety())); s2=sqrt((x.getx()-z.getx())*(x.getx()-z.getx())+(x.gety()-z.gety())*(x.gety()-z.gety())); s3=sqrt((y.getx()-z.getx())*(y.getx()-z.getx())+(y.gety()-z.gety())*(y.gety()-z.gety())); 全国2009年1月C++程序设计试题 一、单项选择题(本大题共20小题,每小题1分,共20分) 1.C++源程序文件扩展名为( A) A..cpp B..h C..1ib D..obj 2.在C++中使用流进行输入输出,其中专用于从键盘进行输入的流是( B) A.cerr B.cin C.cout D.cfile 3.包含自定义头文件file.h的预处理指令是( D) A.#define B.#include file.h C.#define file.h D.#include"file.h" 4.用于标识十六进制前缀或后缀是( D) A.无 B.后缀L或e C.前缀零 D.前缀0x 5.设存在整型变量int x,则下列句与其它三项含义不同的是( A) A.int* p=&x; B.int& p=x; C.int & p=x; D.int &p=x; 6.在定义类成员时,为产生封装性,则需使用哪个关键字( D) A.public B.publish C.protected D.private 7.设函数void swap(int&,int&)将交换两形参的值,如两整型变量int a=10;int b=15;则执行swap(a,b)后,a、b值分别为( C) A.10,10 B.10,15 C.15,10 D.15,15 8.函数默认参数在函数原型中说明,默认参数必须放在参数序列的( C) A.前部 B.中部 C.后部 D.两端 9.设存在函数int min(int,int)返回两参数中较小值,若求15,26,47三者中最小值,下列表达式中错误的是( B) A.int m=min(min(15,26),min(15,47)); B.int m=min(15,26,47); C.int m=min(15,min(47,26)); D.int m =min(min(47,26),16); 10.下列函数不能和函数void print(char)构成重载的是( C ) A.int print(int); B.void print(char,char); C.int print(char); D.void print(int,int); 11.在下列成对的表达式中,运算结果类型相同的一对是( D) A.7/2和7.0/2.0 B.7/2.0和7/2 C.7.0/2和7/2 D.7.0/2.0和7.0/2 l2.内联函数的特点是( A) A.减少代码量,加快访问速度 B.减少代码量,减缓访问速度 C.增加代码量,减缓访问速度 D.增加代码量,加快访问速度 13.类的私有成员可在何处被访问( A ) A.本类的成员函数中 B.本类及子类的成员函数中 C.通过对象名在任何位置 D.不可访问 14.类的构造函数在以下什么情况下会被自动调用( B) A.定义成员函数时 B.定义对象时 C.定义数据成员时 D.定义友元函数时 15.下列关于析构函数描述正确的是( D) A.可以重载 B.函数体中必须有delete语句 C.返回类型必须是void类型 D.不能指定返回类型 16.设有函数T Sum(T x,T y){return x+y;},其中T为模板类型,则下列语句中对该函数错误的使用是( D) A.Sum(1,2); B.Sum(3.0,2.2); C.Sum(…A?,…C?); D.Sum("A","C"); 17.下列哪个编译指令属于条件编译指令( C) A.#include B.#define C.#else D.#pragma 18.关于类的静态成员函数描述错误的是( A) A.在创建对象前不存在 B.不能说明为虚函数 C.不能直接访问非静态函数 D.不是对象的成员 l9.如果类A被声明成类B的友元,则( D ) A.类A的成员即类B的成员 B.类B的成员即类A的成员 C.类A的成员函数不得访问类B的成员 D.类B不一定是类A的友元 20.派生类的对象可以访问以下那种情况继承的基类成员( D) A.私有继承的私有成员 B.公有继承的私有成员 C.私有继承的保护成员 D.公有继承的公有成员 二、填空题(本大题共20小题,每小题1分,共20分) 21.若使用标准输出流把整型变量a的值输出到屏幕上,实现此操作的C++语句是__cout< 22.C++将数据从一个对象流向另一个对象的流动抽象为“流”,从流中获取数据的操作称为__提取___。 23.执行下列代码 int b=100;cout<<"Hex:"< 程序的输出结果是__Hex:64____。 24.静态联编所支持的多态性称为_编译时_____的多态性。 25.C++程序必须有且只有一个主函数,其函数名为__main____。 26.写出声明一个复数对象的语句,并使该对象被初始化为2.2+1.3,此声明语句是__complex 27.若有函数定义为: int add(int ml=0,int m2=2,int m3=4) {return ml+m2+m3;} 在主函数中有int s=add(1)+add(0,1)+add(0,1,2); 则执行此语句后s的值为__15____。 28.C++中使用___inline___关键字说明函数为内联函数。 29.在源程序中有宏定义:#define PI 3.14,则若不想使该宏定义影响到程序的其它地方,可以使用_#undef PI_____删除该宏定义。 30.类和其它数据类型不同的是,组成这种类型的不仅可以有数据,还可以有对数据进行操作的__函数。 31.有下列代码int a=0;double b=0;cin>>a>>b;当用键盘输入1.25时,b=__0.25____。 32.对于类Point而言,其析构函数的定义原型为_~Point();_____。 33.对象成员构造函数的调用顺序取决于这些对象在类中说明的顺序,与它们在成员初始化列表中给出的顺序__无关____。 34.类的简单成员函数是指声明中不含_const_____、volatile、static关键字的函数。 35.与操作对象的数据类型相互独立的算法称为__范型算法____。 36.从一个或多个以前定义的类产生新类的过程称为_派生_____。 37.在vector类中向向量尾部插入一个对象的方法是__push_back()____。 38.C++中用于动态创建对象,并返回该对象的指针的关键字是__new____。 39.C++的流类库预定义的与标准输出设备相联接的流是__cout ____。 40.执行下列代码 cout< 程序输出结果是__123____。 三、改错题(本大题共5小题,每小题2分,共10分) 41.#include class f{ private:float x,y; public:f(float a,float b){x=a;y=b;} float max(){return(x } ; main( ){ f a(1.5,3.8);cout< } 42.#include class test{ private:int x; public:test(int a){x=a;} void set(int a){x=a;} void get(){cout< }//error缺少分号; main(){ const test a(3); a.set(5); a.get(); } 43.#include class point{ private:float x,y; public:f1(float a,float b){x=a;y=b;} point(){x=0;y=0;} void getx(){cout< void gety(){cout< }; void print(point a){cout< main(){ point a; a.f1(3.0,5.0); print(a); } 44.#include class f{ private:int x,y; public:fl(int a,int b){x=a;y=b;} void print(){cout< } ; main(){ f a; a.f1(1.5,1.8);//error:实际参数类型与f1函数的形参类型不一致,应修改为一致。 a.print(); } 45.#include main(){ int x=6; const int*p=x;//error:应改为const int*p=&x; cout<<*p< } 四、完成程序题(本大题共5小题,每小题4分,共20分) 46.完成下面程序,使其输出l0,并在退出运行时正确释放分配给指针的存储空间。 #include using namespace std; void main() { int *a,*p; a=new int(10); p= __a____; cout<<*p< ___delete p;(或delete a;)_______ } 47.#include using namespace std; class base { private:int x; public:base(int a){x=a;} int get(){return x;} void showbase() {cout<<"x="< }; class Derived:public base {private:int y; public:Derived(int a,int b):base(a){y=b;} void showderived() {cout<<"x="< }; void main() { base b(3); Derived d(6,7); b.showbase(); d.showderived(); b=d; b.showbase(); Derived b1(d);(或Derived b1(6,7);或base b1(6);或base b1(d);)b1.showbase(); base* pb=&b1; pb->showbase(); d.showderived(); b.showbase(); } 输出结果如下: x=3 x=6,y=7 x=6 x=6 x=6 x=6,y=7 x=6 48.下面程序的运行结果如下: B::display() C::display() 在下划线处填上缺少的部分。源程序如下: #include using namespace std; class B { public: virtual void display( ) {cout << "B::display( ) "< }; class C:public B { public: virtual void (或void)display(){cout<<"C::display()"< void fun(B*p) { p->display(); } void main() { B b,*pb; C c; pb=&b; fun(pb); pb=&c; fun(pb); } 49.下面程序的运行结果如下: This is line1 This is line2 This is line3 在下划线处填上缺少的部分。源程序如下: #include #include using namespace std; void main() { fstream fin, fout; fout.open("my.txt",ios::out); if(!fout.is_open()) return; for(int i=0;i<3;i=i+1) fout<<"This is line"< fout.close(); fin.open("my.txt",ios::in); if(! fin.is_open()) return; char str[100]; while(!fin.eof()(或等价答案)) { fin.getline(str,100); cout< } fin.close(); } 50.在下划线处填上缺少的部分。源程序如下: #include using namespace std; template T fun(T x) { __T___y; y=x*x-T(5); return y; } void main() { float a=2; cout< } 五、程序分析题(本大题共4小题,每小题5分,共20分) 51.请写出myTextl.txt文本文件中的内容 #include #include using namespace std; #include void main() { ofstream myFile1; myFile1.open("myTextl.txt"); cout<<"Enter the data in Chinese format(e.g. ,2008,May 25):"< string Year=Date.substr(0,4); int k=Date.find(","); int i=Date.find(" "); string Month=Date.substr(k+1,i-k-1); string Day=Date.substr(i+1,2); string NewDate=Day+" "+Month+" "+Year; myFile1<<"original date:"< myFile1<<"Converted date:"< myFile1.close(); } original date:2008,January 1 Converted date:1 January 2008 52.给出下面程序的输出结果 #include using namespace std; class Simple { int x,y; public: Simple(){x=y=0;} Simple(int i,int j){x=i;y=j;} void copy(Simple&s); void setxy(int i,int j){x=i;y=j;} void print(){cout<<"x="< }; void Simple::copy(Simple&s) { x=s.x;y=s.y; } void func(Simple s1,Simple&s2) { s1.setxy(30,40); s2.setxy(70,80); } void main() { Simple obj1(1,2),obj2; obj2.copy(obj1); func(obj1,obj2); obj1.print(); obj2.print(); } x=1,y=2 x=70,y=80 53.给出下面程序的输出结果 #include"iostream.h" int main() { int i=17; while(i>=10) if(--i%4==3)continue; else cout<<"i="< } i=16 i=14 i=12 i=10 54.给出下面程序的输出结果 #include using namespace std; void main() { int num=300; int &ref=num; cout< ref=ref-100;