2023年江西省抚州市全国计算机等级考试C++语言程序设计真题(含答案).docx
2023年江西省抚州市全国计算机等级考试 C+语言程序设计真题(含答案)学校:班级:姓名:考号:一、1.选择题(10题)1 .类模板的使用实际上是将类模板实例化成一个具体的()。A.类B.对象C.函数D.模板类2 .有如下程序:#include < iostream > using namespace std;class Base private: void fun 1 () const cout < < nfunln; protected: void fun2() eonst cout < < “fun2"; public: voidtim3()const cout < < nfun3!f; ; class Derived: protected Base public: void fun4() const cout < < "fun4" ;int main()Derived obj;obj.funl();/ obj.fun2();obj.fun3();/obj.fun4();return 0;其中有语法错误的语句是()。A.B.C.D.3 .有以下程序; #include < iostream > using namespace std; class R public: R(int rl Jnt r2) Rl=rl; R2=r2; ) void print(); void print () const; private: intRl,R2; ; voidR:print() cout < < RI < < " J < < R2 < < endl; void R:print() const cout < < RI < < n, n < < R2 < < endl; int main () R a(5,4); const R b(20,52); b.print(); return 0; 执行后的输出结果是 A.5,4 B.20,52 C.0,0 D.4,54 .若有以下程序:#include < iostream > using namespace std; class A private: int a; public: A(int i) a=i; void disp() cout < < a < < "J; abort();char line80;int 1=0;while(!infile. eof()(I+;infile.getline(line, sizeof(line);cout < < I < < n:n < < line < < endl;)infile.close();)四、程序改错题(10题)36 .使用VC+ + 6 .0打开考生文件夹下的源程序文件1 .cpp。本程序要 求输入一个字符串,然后将其中的小写字母改成大写字母,字符可能输 入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出到屏幕 中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *error*的下面。试题程序:#include<iostream . h> voidmain(inti=0 ;charstr120;cout«nEnterastringendwith? . n«endl ;/ vl* vl* vt*vt*/不不不不不不不不error不不不不不不不不cin . getline(str, 120);while(str) if(stri)=a) stri=stri-a + A ;i+ + ; )cout«str«endl ;return ;37 .使用VC+ +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运 行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果 为:sizeof(Sl)=5 sizeof(s2)=10 sizeof(s3)=l注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *errc)r*的下面。不能删除assert ()语句。只能修改后面的数字。提示:assert函数如果为假,则会产生一个中断异常。试题程序:#include<iostream . h>#include<assert . h> voidmain () char*sl=nabcn:个个个个个个个个nor个个个个个个个个assert(sizeof(s 1 )=3): cout«nsizeof(sl)=5n«endl ;chars210=nabM:,、errorassert(sizeof(s2)=2);cout«nsizeof(s2)=10n«endl ;chars3=23 :si*r>errorassert(sizeof(s3)=4);cout«nsizeof(s3)=r,«endl ;return ;38 .使用VC + + 6 . 0打开考生文件夹下的源程序文件1 . cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实现 的功能为从键盘输入一个字符串,并将结果保存到文件1 . txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在* eno * * * * * * 白勺 试题程序:#include<iostream>#include<fstream>vl* vt*vt*k£*不不不不不不不不不不不不不不不不usingstd ;voidWriteFile(char*s) ofstreamoutl ;kI>个个个个个个个个nor个个个个个个个个outl . open(nl . txt", binary|app);for(inti=0 ; si!=0 ; i + +)个个个个个个个个nor个个个个个个个个outl.puts(si);outl.close ;)voidClearFile ofstreamoutl ;outl . open(Hl .txt");outl . close ;) intmain chars 1024;cout«npleaseinputastrin9 :n«endl ;cin . getline(s, 1024);WriteFile(s);returnO ;)39 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个catch必须抛出执行的任何异常。程序异常,输出信息为error O ERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *errc)r*的下面。试题程序:#include<iostream. h)intmain( try(throw(nerrorn);)/不不不小个不不不error小不小不不不不不catch(chars) try throw(int)0);7,7,7,7, 7,1>、!>、!> 7,个个个*t*不不个下nor个个个个个个个个catch cout«i«endl;) try throw(O);throw。error");个个个个个个个个rror个个个个个个个个catch cout«nERRORn«endl ;returnO;40 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实 现的功能为从键盘输入一个字符串,并将结果保存到文件1. txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在* error* *j 日 j。试题程序:#include<iostream>#include<fstream>7,7,7,7, 7,、!> 7,个个个*t*不不个下个个个个个个个个usingstd;voidWriteFile(char*s) ofstreamoutl ;kL* vL* *1*1* vl*不不不不不不个不nor不不不不不不不不outl. open(Hl. txt",binary|app);for(inti=0; si!=0; i+ +)7,7,个不不不不不个个nor个个个个个个个不outl. puts(si);outl. close;)voidClearFile ofstreamoutl ;outl. open(nl. txt");outl. close;) intmain chars 1024;cout«npleaseinputastrin9 :n«endl ;cin. getline(s, 1024);WriteFile(s);returnO;41 .使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错。请改正程序中的错误,使程序输出的结果为1003732注意:错误的语句在/ / *error*的下面,修改该语句即可。试题程序:#include<iostream . h> voidmain7,kJ>不不不小不不enor不不不不小不intm=0142:vl*不不不不不不enor不不个个不不intn=0X27:intq=32;cout< <m< <endl;cout <<n<< endl ;cout< <q< <endl; return ;)42 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp。本程序 要求输入一个字符串,然后将其中的小写字母改成大写字母,字符可 能输入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出 到屏幕中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *erT()r*的下面。试题程序:#include<iostream . h> voidmain(inti=0;charstr120;cout«nEnterastringendwith?. n«endl;/不不不不不不不不error不不不不、不不不cin. getline(str, 120);/不不不不不不不不error不不不不不不不不 while(str)(/不不不不不不不不error不小不不不不不不if(stri)=a)stri=stri-a+A;i+ +;)cout«str«endl ;return ; )43 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行有问题,请改正main函数中的错误,使程序的输出结果为:number= 1number=10number=100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结构,错误的语句在/ / *errc)r*的下面。试题程序:#include<iostream. h>classTC (public:TC(inti) ( number=i;voidSetNumber(intm)(number=m ;)class B private: int b; public: B(int j) b=j; ) void disp() cout < < b < < ; class C: public B,public A private: int c; public: C(int k):A(k- 2),B(k+2) c=k; void disp() A:disp(); B:disp(); cout < < c < < endl; ;int main() C obj (10); obj.disp(); return 0; 程序执行后的输出结果是 A.10,10,10 B.10, 12,14 C.8,10,12 D.8,12,105 .如果算符函数调用格式的表达式:x.operator-(operator+(y, 0)中的是作为成员函数重载的,“+”是作为友元函数重载的,那么该表达式还 可以表示为:()A.x-y+ B.x-(+y) C.(x+)-y D.+x-y6 .在面向对象的程序设计中,下列叙述中错误的是()。A.任何一个对象构成一个独立的模块B.一个对象不是独立存在的实体,各个对象之间有关联,相互依赖C.下一层次的对象可以继承上一层次对象的某些属性D.上述三种说法都正确7 .下列描述中正确的是A类中可以定义与类名相同的数据成员8 .直接于类中可以定义与父类名相同的数据成员C.孙子类中可以定义与爷爷类名相同的数据成员。D.类的所有子孙中都不可以定义与该类同名的数据成员。9 .下列关于构造函数和析构函数的描述,错误的是()。A.析构函数中调用虚函数采用静态联编intGetNumberconst returnnumber;voidPrintconst (cout«nnumber=n«number«endl;)private:intnumber;voidmain objl. number=10;rj*errorTCobjl;objl. Print;TCobj2(3);errork1* rj*! I * eno* 0 * *TC. SetNumber(l 00);objl. Print;obj2. Print;44.使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,该程序 运行时有错,请改正其中的错误,使程序正常运行,输出的结果为 Constructor, i=0,Destructor注意:错误的语句在/ / *error*的下面,修改该语句即 可。试题程序:#include(iostream. h) classTC ( inti;public:TC;voiddisplay;TC;cout«nConstructorn«n,";i=0;TC:TCTC: display tout«ni=n«i<<% n«endl; )/不不不不不不eiror不小小不小个TC: TC (COUI«"Destructor"«endl :) voidmain (TCa;a. display; )45 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,但该程序运行有问题,请改正main函数中的错误,使该程序的输出结果正 确。程序输出: 8 8注意:错误的语句在/ *error* /的下面。修改该语句 即可,其他的语句不能修改。试题程序:#include(iostream. h> classCO public:rrw T>*r> *r>k1> *1* *1* *1* *i* *J> *J> *J> enor个个个个个个个个staticintn=O:CO(n+ + :)CO(n:):eout«C . n«endl ;7" 7" k1> 7" 7" 7, kJ> 7, q. q. ««、errorintCO: : n;voidmain(COobj ;COobj27;CO*C=NULL:c= & obj :k1#*1rj>kIa>1enor不不不不不不不不cout«C0: n«endl;五、综合应用题(2题)46 .应添加“virtualvoidGetNamt!=0 ;"。(2)应添力"constchar*GetName2”。(3)应添加“TC2(char*str)”。(4)应添加“m_st巾=0 ;【解析】本题第1处要求“在类TC1中定义接口函数GetName,为纯虚 函数”。在C + +中,在基类中用virtual声明成员函数为虚函数。纯虚 函数是在声明虚函数时被"初始化为0的函数,即 “virtualvoidGetName=0 ; "。第2处要求“函数GetName2实现获得名字 的缓存,但只获得读允许操作这个缓存”。只能引用数据成员,而不能修 改,所以使用常成员函数,其一般形式为“const函数类型函数名”,即 “constchar*GetName2"。第3处要求“实现TC2的构造函数”。TC2的构 造函数与类TC2的名称应该相同,而且第3处的大括弧中是对字符数 组str的操作,所以类TC2的构造函数中的参数为str,即这里补全为 “TC2(char*str)”°第4处要求“完成TC2的构造函数,实现对名字的处 理”,补全类TC2的构造函数,构造函数中的名字变量str对应于类TC 中的成员变量m_str,所以这里补全变量赋值操作“m_stri=0 ; ”。47 .使用VC+6.。打开考生文件夹下的源程序文件3. cpp。其中定 义的类不完整,按要求完成下列操作,将类的定义补充完整。每卖出 一个水果,则计算水果的重量,还要计算所有卖出水果的总重量以及 总个数,同时允许退货,请按照以下的操作,把类补充完整。定义类TCFruit的私有静态数据成员float型变量AllWeight和int型 变量AHN0,请在注释1后添加适当的语句。(2)完成类TCFruit的带一个float型变量w的构造函数,并把这个w加 到AllWeight中,并且AHNo自加。请在注释2后添加适当的语句。(3)在析构函数中,在AUWeight中减去weight,然后A11N。自减,请 在注释3后添加适当的语句。(4)完成静态成员变量的初始化为0,请在注释4后添加适当的语句。注意:增加或者修改代码的位置已经用符号表示出来,请不要修改其 他的程序代码。试题程序:#include(iostream. h>classTCFruit(private :floatWeight;/kL*vt*kL*/ R/I、 I q, / 卜/staticintAHNo;public:TCFruit(floatw)/*1* *1* 1*si*>1> kL«/JAllWeight+=w:AllNo + + :TCFruit/k!>*J> k!> 1> kJ> kJ> sl>/ryw rT* rT* rj* rj* .X rT* rrw rj* rj* rT* rTwA11W eight-=W eight :)voiddisplay(cout«nSellaFruitwithn«Weight«nk9H<<endl;cout«Allsellnumber:n«AllNo«endl ;cout«nAllsellweight:n«AllWeight«nk9n<< endl«endl ;I I *4* floatTCFruit: AllWeight=O. 0;intmain (TCFruitFruitl( 1. 2);Fruitl. display;TCFruitFruit2(2. 3);Fruit2. display ;returnO ;六、3.综合应用题(2题)48,使用VC6打开考生文件夹下的工程test25_3,此工程包含一个源程 序文件test25_3.cpp,其中定义了用于表示堆的类Set,但它的定义并不完 整。请按要求完成下列操作,将程序补充完整。(1)完成成员函数int IsMemberOf(int n)的定义,该函数检查参数n是否 在类的数据成员数组elems中,如果在返回1,反之返回0。请在注释 “* 1 * ”之后添加适当的语句。(2)完成成员函数int Add(intn)的定义,如果参数n包含在类的数据成员 数组elems中则返回1如果数组超界则返回0,如果都不是,则将参数 n插入到elems中,下标大小为类的数据成员PC,之后PC自加一。请在 注释“*2*,之后添加适当的语句。完成拷贝初始化构造函数Set(Set&s)的定义,请在注释“*3*之后 添加适当的语句。输出结果如下:1()1, 2, 3, 4, 5, 6, 7, 8)注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件test25_3.cpp清单如下:#include < iostream.h >class Setpublic :Set() PC=O;Set(Set &s);void Empty() PC=O;int IsEmptyO return PC=O;int IsMemberOf(int n);int Add(int n);void Print();private:int elems 100;int PC;);int Set: :IsMemberOf(int n)* if(elemsi=n) return 1;return O;int Set:Add(int n) return 1;else if(PC > =100) return O; else elemsPC+=n;return 1;)Set:Set(Set &s) for(int i=O; i < PC; i+)elemsi=s.elemsi;)void Set:Print() cout < < for(int i=O; i < PC-1; i+) cout < < elemsi < < "J;if(PC > O)cout < < elemsPC-l;cout < < "" < < endl;void main()Set A;cout < < A.IsEmptyO < < endl;A.Print();Set B;for(int i=l; i < =8; i+)B.Add(i);B.Print(); )49.使用VC6打开考生文件夹下的工程test21_3,此工程包含一个源程 序文件test21_3.cpp,其中定义了用于表示长方形的类CRectangle,但类 CRectangle的定义并不完整。请按要求完成下列操作,将类CRectangle 的定义补充完整。定义CRectangle的构造函数,函数含参数dx, dy, da和db,它们都 是double型的数据,请将类数据成员X, y, a和b初始化,并输出 CRectangle Constructed."(另起一行输出该文字)。请在注释“*1*之后 添加适当的语句。(2)完成类CRectangle的成员函数getperimeter。的定义,将以a和b为 边的矩形周长的值返回,请在注释“*2*”之后添加适当的语句。(3)完成类CRectangle的成员函数getarea()的定义 将以a和b为边的矩 形面积的值返回,请在注释“*3*”之后添加适当的语句。(4)完成类 CRectangle 的友元函数 friend double dist(CRectangle& rt)的定 义,先定义两个double型的临时变量tx和ty,然后将参数对象rt的数 据成员x与a的一半相加,y与b的一半相加,分别赋值给tx和ty,最8 .对虚析构函数的调用可以采用动态联编C.当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数D.构造函数可以声明为虚函数9 .首先访问该结点,然后访问结点的左子树,最后访问结点的右子树, 这种遍历方式称为()oA.前序遍历B.中序遍历C.后序遍历D.顺序遍历10 .为用户与数据库系统提供接口的语言是A.高级语言B.数据描述语言(DDL) C数据操纵语言(DML) D.汇编语言二、单选题(13题)11 .有如下程序段int i =0, j=l;int & r=i; / r=j;/ int*p= & i ; / (3)*p= & r ; / 基中会产生编译错误的语句是A. B.C.D.12.下面程序的运行结果是()。#include<iostream. h>后求出tx与ty的平方和的值之后将它的平方根返回,将请在注释“*4* ”之后添加适当的语句。输出结果如下:CRectangle Constructed .Down_Left corner point is:(100, 50)a=1200, b=700Perimeter of this rectangle is:3800 Area of this rectangle is:840000 The Distance is:806.226CRectangle Constructed.Down_Left corner point is:(200, 150)a=2000, b=800Perimeter of this rectangle is:5600 Area of this rectangle is:1.6e+006 The Distance is: 1320.04CRectangle Destructed .CRectangle Destructed .注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件test21_3.cpp清单如下:#include < iostream.h > #include < math.h >class CRectangle(private:double x;double y;double a;double b;public:CRectangle() (cout < < nnCRectangle Constructed/ < < endl;)CRectangle(double dx, double dy, double da, double db) (a=da;b=db;cout < < nnCRectangle Constructed/ < < endl;CRectangle ()(cout < < "CRectangle Destructed.H < < endl;)void putxy(double dx, double dy) x=dx; y=dy; void putab(double da, double db)( a=da; b=db; double getx() return x; double gety() return y; double geta() return a; double getb() return b; double getperimeter() (*2*)double getarea() ()friend double dist(CRectangle& rt););double dist(CRectangle& rt) (ty=rt.y+rt.b/2.0;return sqrt(tx*tx+ty*ty);)void main() (CRectangle rect;rect.putxy( 100.0, 50.0);rect.putab( 1200.0, 700.0);cout < < nDown_Left corner point is: (" < < rect.getx() < < n < <rect.gety() < << < endl;cout < < "a= n < < rect.geta() < < = b=" < < rect.getb() < < endl;cout < < "Perimeter of this rectangle is: M < < rect.getperimeter() < < endl;cout < < "Area of this rectangle is:" < < rect.getarea() < < endl;cout < < ''参考答案LA解析:类模板就是把类中的数据分离出来,作为一个类的描述。C+ 编译器根据类模板和特定伪数据类型来产生一个类,类模板就是一个抽 象的类。2.B3.B解析:使用const关键字修饰的对象成为常对象,题中对象b被声 明为类R的常,对象。使用const关键字说明的成员函数称为常成员函 数,类R中用const重载了函数print。在使用常对象和常成员函数时 应注意的是:const是函数类型的一个组成部分,因此在常成员函数部分 也要带const关键字;常成员函数不能更新对象的数据成员,也不能调 用该类中没有用const修饰的成员函数;如果将一个对象说明为常对象, 则通过该常对象只能调用它的常成员函数,不能调用其他的成员函数; const关键字可以参与区分重载函数。本题中,b为类R的常对象,通过 b只能调用类R的常成员函数print。输出20,52。4 .D解析:本题考核派生类构造函数的使用。本题中,派生类C具有多 重继承关系,所以在派生类C的构造函数中应该包含基类A和B的成 员初始化列表。5 .A解析:本题考核运算符的重载。假定已经作为某个类的成员函数重 载了二元运算符+,且cl、c2都是该类的对象,则cl.operator+(c2)与 cl+c2含义相同。如果+作为该类的非成员函数重载,贝IJoperator+(cl, c2)与cl+c2含义相同。同时一元运算符“+”重载函数调用中采用了虚 拟参数,说明+为后缀的,所以其等价的表达式为“x-y+”。6 .B解析:在面向对象的程序设计中,一个对象是一个可以独立存在的 实体。各个对象之间相对独立,相互依赖性小。所以,选项B错误, 应为所选。7 .C解析:本题所有选项中均提到了同名数据成员的现象。是否允许同 名数据成员存在,关键要看这种同名现象编译器是否能够判断出采,如 果可以判断,则是允许的,否则则是禁止的。8 .DD。【解析】构造函数的主要作用是对数据成员初始化。构造函数不 能声明为虚函数,这是因为在执行构造函数时类对象还未完成建立过程, 当然谈不上函数与类对象的关联。9 .A解析:前序遍历序列的顺序是先根、再左子树、最后右子树;中序 遍历序列的顺序是先左子树、再根、最后右子树;后序遍历序列的顺序 是先左子树、再右子树、最后根。10 .C数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。u3000u3000 数据操作语言(DML),例如:INSERT (插入)、UPDATE (修改)、DELETE (删除)语句。u3OOOu3OOO数据查询语言(DQL),例如:SELECT语句。u3000u3000 数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句o11 .A12 .Cfor循环执行2次,所以第一次for循环为result=l*al=4,第二次for 循环为 result=4*a2=20 o13 .AAo【解析】本题考查C+ +当中函数的默认返回值类型,这种类型与 函数内部的局部变量的类型没有关系。如果不小心处理函数返回类 型,可能造成数据丢失。本题答案为A。14 .C解析:在类定义时没有定义任何构造函数时,则编译器自动生成一个 不带参数的缺省构造函数,其格式如下:类名 :缺省构造函数名()按构造函数的规定,缺省构造函数名同类名。缺省构造函数的这种格 式也可由程序员定义在类体中。在程序中定义一个对象而没有指明初 始化时,则编译器便按缺省构造函数来初始化该对象。用缺省构造函 数对对象初始化时,则将对象的所有数据成员都初始化为零或空。15 .C本题主要考查了成员对象。类TWO的数据成员是类ONE的对象onel 和one2, main。函数中首先创建类TWO的对象t并提供初始值4,先 执行成员对象onel的构造函数体,输出1;再执行成员对象one2的构 造函数体,输出2,最后执行类TWO的构造函数体,输出3。因此本 题程序运行时的输出结果是123016 .DDo【解析】只有公有继承的公有成员才能被派生类的对象直接访问, 其他的情况都会因为访问权限问题产生错误。17 .A解析:数据库是一个通用化的、综合性的数据集合,它可以为各种 用户所共享,具有最小的冗余度和较高的数据与程序的独立性,而且能 并发地为多个应用服务,同时具有安全性和完整性。即数据库系统减少 了数据冗余,但不能避免一切冗余。所以选项A正确,选项B错误。在 数据库管理阶段中,数据是结构化的,面向系统,数据冗余度小,从而 节省了数据的存储空间,也减少了对数据的存取时间,提高了访问效率, 避免了数据的不一致性。数据的不一致性,是指对数据的存取方式,选 项C错误。数据库系统比文件系统能管理更多的数据,并非是数据库 系统的特点,选项D错误。本题正确答案是A。18 .D解析:虚函数在运行阶段和类的对象绑定在一起,这样成为动态联 编。虚函数声明只能出现在类声明的虚函数原型中,而不能在成员的函 数体实现时。必须由成员函数来调用成员函数来调用或者通过指针、引 用来访问虚函数。如果通过对象名来访问虚函数,则联编在编译过程中 认为是静态联编。19 .D解析(y输出为不显示,只代表一个字符串的结束。注意:C+语 言中各种字符转义序列的意义和应用。20 .AAo【解析】本题考查移位运算符在程序中对5逻辑左移2位,其值扩 大4倍等于20,然后再进行按位运算,其值等于21。21 .Astreamoff定义于iostream. h中,定义有偏移量Offset所能取得的最大 值,seekdir表示移动的基准位置,是一个有以下值的枚举:ios:be9:(文件开头)、ios:cur:(文件当前位置)、ios:end:(文件结 尾)。22.BBo【解析】p表示的是变量a的地址,定义后*P表示的是变量