2022年甘肃省天水市全国计算机等级考试C++语言程序设计真题(含答案).docx
2022年甘肃省天水市全国计算机等级考试C+语言程序设计真题(含答案)学校:班级:姓名:考号:一、1.选择题(10题)1.对于while、do.while循环结果说法正确的是 。A.只是表达形式不同B.do.while结构中的语句至少执行一坎C.while结构中的语句至少执行一次D.条件成立时,他们有可能一次也不执行2 .磁盘文件操作中,打开磁盘文件的访问模式常量时,()是以追加方式 打开文件的。A.in B.out C.app D.ate3 .软件调试的目的是A.发现错误B.改正错误C.改善程序的性能D.验证软件的正确性4 .与语句cout < < endl ;不等价的是A.cout < < ' n' ; B.cout < < ' 12' ; C.cout < < ' xA' ; D.cout < <'0';5 .为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能 把该成员的访问权限定义为()。31 .用树型结构表示实体类型及实体间联系的数据模型称为【】。32 .以随机访问方式读取文件中的数据通常使用istream的成员函数33 .软件结构是以【】为基础而组成的一种控制层次结构。34 .内联函数是通过【】来实现的,因此内联函数是真正的函数。35 .在面向对象方法中,描述的是具有相似属性与操作的一组对 象。四、程序改错题(10题)36 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序 运行有问题,请改正main函数中的错误,使程序的输出结果为: number=l number=10 number= 100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结 构,错误的语句在/ / *enx)r*的下面。试题程序:#include<iostream . h>classTCpublic:TC(inti) number=i ;voidSetNumber(intm) number=m ;intGetNumberconst returnnumber;voidPrintconst cout«n number=n «number«endl ;private:intnumber;voidmainvl* vl* vt*vt*1# k£*不不不不不不不不不不不不不不不不TCobjl;objl. Print;TCobj2(3);7, 7,*1,7,7" 7,objl. number= 10;/ * enor* * *TC. SetNumber(lOO);objl. Print;obj2. Print; )37 .使用VC + +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运行有问题,请改正main函数中的错误,使程序的输出结果为: number=lnumber=10number= 100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结构,错误的语句在/ / *error*的下面。试题程序:#include<iostream . h>classTC (public :TC(inti) (number=i ;)voidSetNumber(intm) (number=m ; intGetNumberconst returnnumber ;voidPrintconst cout«Hnumber=H«number«endl ; private :intnumber ;voidmainst*kL*kL*1>个下个不不不个个nor个个*个个个个个TCobjl ;objl . Print ;TCobj2(3);kL* kL* vL* vL* kL# vl#vt* 1* *1*1 kT* *1*不不不不不不不不nc)r个个个个个个个个objl . number=10 ;I !*eiror*/)o*TC . SetNumber(lOO);objl . Print ;obj2 . Print ; 38 .使用VC+ + 6 .。打开考生文件夹下的源程序文件1 . cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实现 的功能为从键盘输入一个字符串,并将结果保存到文件1 . txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在rrwk1> k!> *1> kI> kJ> *1> error不不不不不不的下面。试题程序:#include<iostream>#include<fstream>kJ> 7,k1* *T*error*J> sl> kJ> <J> kI>*yw rr*T* rrusingstd ;voidWriteFile(char*s) (ofstreamoutl ;vl* 卜 q,error*1 *4 «1>« «J>4 vL*、,j、q、,j、,卜outl . open(ul . txt", binary|app);for(inti=0 ; si!=0 ; i + +)k!> kJ> *1> kL* kL* k|>errorKt* kJ> sl> kJ> Kt* k|> kJ><Y* *T* *T* »T* *T* *T* rT*outl . puts(si); )outl . close ;)voidClearFile(ofstreamoutl ;outl . open(ul . txt");outl . close ;)intmain chars1024;ClearFile ;cout«npleaseinputastrin9 :n«endl ;cin . getline(s, 1024);WriteFile(s);returnO ; )39.使用VC + +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运 行时有错误,请改正程序中的错误,使得程序输出:9, 8, 7, 6, 5注意:错误的语句在/ *error* /的下面,修改该语句即 可。其他的语句不能修改。试题程序:#include(iostream . h>classTC ( /7,7,7,7,7,/小不不不小小个不enor不不不不不不不不/TC(inti) ( m_i=i ;) voidprint(cout«m_i«,;)public :intm i ;);intmain7,不不不不不不不不个个不不不小不不inti ;TC04(10);while(i>5)I * * /i+ + :04 . print ; ) cout«endl ;returnO ;40.使用VC + +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运 行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果 为:sizeof(Sl)=5sizeof(s2)=10sizeof(s3)=l注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *error*的下面。不能删除assert ()语句。(2)只能修改后面的数字。提示:assert函数如果为假,则会产生一个中断异常。试题程序:#include<iostream . h> #include<assert . h> voidmain () chartsl=nabcn:errorassert(sizeof(s 1 )=3): cout«nsizeof(sl)=5n«endl ;chars210=nabn:errorK,t> K.t>K.t>*7* rr* *r* rT*assert(sizeof(s2)=2);cout«nsizeof(s2)=10n«endl ;chars3=23 :errorassert(sizeof(s3)=4);cout«nsizeof(s3)=ln«endl ;return ; )41 .使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个catch必须抛出执行的任何异常。程序异常,输出信息为error0ERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *error*的下面。试题程序:#include<iostream. h) intmain( try(throw(nerrorn);catch(chars) cout«s«endl ;try throw(int)0);个下个干不个不下enr个个个个个个个不catch cout«i«endl ;try throw(O);throw(nerrorn);7,7,7,7, 不不不不不不*r*个个个小个个个个catch cout«nERRORn«endl ;returnO ;42.使用VC+6.。打开考生文件夹下的源程序文件1. cpp。本程序要求输入一个字符串,然后将其中的小写字母改成大写字母,字符可 能输入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出 到屏幕中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *errc)r*的下面。试题程序:#include<iostream. h> voidmain inti=O;charstr120;cout«nEnterastringendwith?n«endl ;7, 7,*1,7,7" 7,cin. getline(str, 120);个个个个个个个个个个个个"个个个A.public B.protected C.private D.static 6.类 MyClas 定义如下:Class MyClas public: MyClas()value=0; setVariable(int i)value=I; private: int value; 则以下对语句序列 MyClas *p,my;p=&my;的描述正确的是()。A.语句 p- > setVariable(5)与语句 my.setVariable(5)等价B.对语句*p. set Variable。)的调用是正确的C.语句MyClas *p,my;会调用两次类MyClas的构造函数D.语句p=&my;是把对象my赋值给指针变量p7 .下面是一个模板声明的开始部分:Template < typename T>double.由此可知A.这可能是一个函数模板的声明8 .这可能是一个类模板的声明C.这既可能是一个函数模板的声明,也可能是一个类模板的声明D.这肯定是一个错误的模板声明8.下列有关拷贝构造函数的描述中错误的是()0A.拷贝构造函数是一种构造函数B.拷贝构造函数与一般的构造函数一样,可以设置多个形参C.每一个类中都必须有一个拷贝构造函数D.拷贝构造函数的功能是用一个已知对象去初始化一个正在创建的对 象while(str)(/7> 7,7> 7> 7> 7,/不不不小个不不不error不不小不不不不不if(stri)=a)stri=stri-a+A;i+ +;)cout«str«endl ;return ; )43.使用VC + +6.0打开考生文件夹下的源程序文件1 .cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,输出的结果为Constructor, i=0,Destructor注意:错误的语句在/ / *error*的下面,修改该语句即可。试题程序:#include(iostream . h)classTC (inti ;public :TC ;voiddisplay ;TC ;1、errork£* *I> *1 1* *1> *1*-j、.j、.卜.,、j、TC : TC cout«nConstructorn«H, i=0;7* 7* 7* 7 7*7*、L* 7* 7* 7* 7*不不不不不不en*or不不不不不不TC : display(tout«ni=n«i«n, n«endl ;<1>*1 k£>«J> k!>eno不不不不不不TC : TCCOUI«nDestructorn«endl :)voidmain(TCa ;a . display ; )44 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实 现的功能为从键盘输入一个字符串,并将结果保存到文件1. txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在* error* * 白勺 卜 | H jo试题程序:#include<iostream>#include<fstream>*1*vl*个个个个个个个个rror个个个个个个个个usingstd;voidWriteFile(char*s) ofstreamoutl ;个个个个个个个个rror个个个个个个个个outl. open(Hl. txtn, binary|app);for(inti=0; si!=0; i + +)个个个个个个个个noi*个个个个个个个个outl. puts(si);outl. close;)voidClearFile ofstreamoutl ;outl. open(nl. txt”);outl. close;) intmainchars 1024;ClearFile;cout«npleaseinputastrin9 :n«endl;cin. getline(s, 1024);WriteFile(s);returnO ; 45 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序 运行时有错,请改正其中的错误,使程序正常运行,输出的结果为Constructor, i=0,Destructor注意:错误的语句在/ / *error*的下面,修改该语句即可。试题程序:#include(iostream. h)classTC (inti;public:TC;voiddisplay;TC;;error7> 7> 7> 7> kJ> kJ> W、q. <J、rj、TC: TC(cout«nConstructorn«n,” ;i=0;不不不不不不enor个个不不不个TC: display(tout<<ni=n«i«n, n«endl;<T>ri> 7vl* vT* *f> error不个个个不不TC:TCCOUI«nDestructorn«endl :voidmain (TCa;a. display; )五、综合应用题(2题)46 .请使用VC6或使用【答题】菜单打开考生文件夹proj3下的工程proj3,其中包含了类IntegerSet和主函数main的定义。一个IntegerSet 对象就是一个整数的集合,其中包含0个或多个无重复的整数;为了 便于进行集合操作,这些整数按升序存放在成员数组elem的前若干单 元中。成员函数add的作用是将一个元素添加到集合中(如果集合中不 存在该元素),成员函数remove从集合中删除指定的元素(如果集合中 存在该元素)。请编写成员函数remove。在main函数中给出了一组测 试数据,此时程序的正确输出结果应为:2 3 45 27 28 31 66 752 3 45 62728 31 56 752 3 45 6 192728 31 66 753 45 6 19 27 28 31 66 753 45 6 19 27 28 31 66 75要求:补充编制 的 内 容写;j“* *333 * 与“*666*”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件out. dat中。输出函数writeToFile 已经编译为。bj文件,并且在本程序中调用。/IntegorSet. h#ifndef INTEGERSET#define INTEGERSET#include<iostream>using namespace std;const int MAXELEMENTS= 100 ;集合最多可拥有的元素个数class IntegerSetint elem MAXELEMENTS ;用于存放集合元素的数组int counter;用于记录集合中元素个数的计数器puhlic:Integerset: counter(0)创建一个空集合IntegerSet(int data, int size);/利用数组提供的数据创建一个整数集合void add(int element);添加一个元素到集合中void remeve(int element);删除集合中指定的元素int getCountconst return counter ;)返回集合中元素的个数int getElement(int i)constreturn elemi; 返回集合中指定的元素void showconst;);void WriteToFile(char*);#endif/main. cpp#include,IntegerSet. h"#include<inmanip>IntegerSet: IntegerSet(int data, int size): counter(O)for(int i=0; i<size ; i+) add(datai);void IntegerSet: add(int element)( intj;从后往前寻找第一个小于等于element的元素for(j=counter; j>0; j-)if(element>=elem j 一 l)break;如果找到的是等于element的元素,说明要添加的元素已经存在,直接返回if(element=elemj-1 )return ;如果找到的是小于element的元素,j就是要添加的位置该元素及其后面的元素依次后移,腾出插入位置for(int k=counter; k>j ;k 一)elemk=elemk 1;elemj=element;将 element 插入到该位置counter+;计数器加1 )void IntegerSet: remove(int element)(/ /vL* vt# vl* kL* vL* V* vL*kL* kL#vL* vX* *1*vi* vt# vl* kL* vL* vL*/ / 卜/ /1* L* *1> kJ* *1*,rsi>/ / 、void IntegerSet: showconst for(int i=0; i<getCount; i+)cout«setw(4)«getElement(i);cout«endl :int main intd=5, 28, 2, 4, 5, 3, 2, 75, 27, 66, 31;Integerset S(d, 11); S. show;S. add(6); s. show;S. add(19); S. show;S. remove(2); s. show;S. add(4); S. show;writeToFile(,);return 0 ; )47.使用VC+6. 0打开考生文件夹下的源程序文件3. cpp,其中定 义了用于表示矩形的CRect类,但类CRect的定义并不完整。请按要 求完成下列操作,将类CRect的定义补充完整。(1)定义私有数据成员 leftPoint> topPoint、rightPoint> bottomPoint,分 别用于表示矩形左上角及右下角的点的坐标,它们都是double型的数 据。请在注释1之后添加适当的语句。(2)完成默认构造函数CRect的定义,指定默认实参为0,它们都是 double型的数据。请在注释2之后添加适当的语句。定义函数体为空的析构函数。请在注释3之后添加适当的语句。(4)在main函数中定义GReet类的实例rect2,并把recti 的值赋给rect2。请在注释4之后添加适当的语句。注意:除在指定位置添加语句之外,不要改动程序中的其他内容。试题程序:#include<iostream. h>classCRect (private:/ 7,7. 7, 7,/«,«,I <7> ,、/、r7> -j、public:/*1*kT> k1> k1>7" T" 7,k£>k?> 7,7,/*T* *T* rT* rT rT* rr* J «*T*<T* *T*<*T* r7* rj.voidSetPoints(double, double, double,double);voidSetLeftPoint(doublem) leftPoint=m ; voidSetRightPoint(doublem) rightPoint=m ; voidSetTopPoint(doublem) topPoint=m ; voidSetBottomPoint(doublem) bottomPoint=m ; voidDisplay (););CReet: CRect(doublel, doublet, doubler, doubleb) (leftPoint= 1; topPoint=t ;rightPoint=r ; bottomPoint=b ; )voidCRect: Setpoints(doublel, doublet, doubler, doubleb) (leftPoint=l ; topPoint=t;rightPoint=n ; bottomPoint=b ;9.线性表L=(al, a2, a3, .ai, .an),下列说法正确的是()A.每个元素都有一个直接前件和直接后件B.线性表中至少要有一个元素C.表中诸元素的排列顺序必须是由小到大或由大到小D.除第一个元素和最后一个元素外,其余每个元素都有一个且只有一个 直接前件和直接后件10.下面对于友元函数描述正确的是()A.友元函数的实现必须在类的内部定义B.友元函数是类的成员函数C.友元函数破坏了类的封装性和隐藏性D.友元函数不能访问类的私有成员二、单选题(13题)11 .下列函数的运行结果是()。#include<iostream. h>intadd(inta, intb); voidmain ()(externintX, y ;cout«add(X,y)«endl ;voidCRect: Display () cout«nleft-toppointis(n«leftPoint«n, n«top-Point«n)n«n;cout«nright-bottompointis(n«rightPoint«n, n<<bottomPoint«n)n« n;) voidmain ()(CRectrectO;rectO. Display ();rectO. SetPoints(20, 20. 6, 30, 40);rectO. Display ();CRectrectl(O, 0, 150, 150);recti. SetTopPoint(10. 5);recti. SetLeftPoint(10. 5);I I *4* rect2 Display (六、3.综合应用题(2题)48.使用VC6打开考生文件夹下的工程test23_3,此工程包含一个源程 序文件test23_3.cpp,其中定义了类X和它的友元类Y,但它们的定义并 不完整。请按要求完成下列操作,将程序补充完整。(1)将类X的静态数据成员y初始化为1。请在注释“*1*”之后添加适 当的语句。完成类Y的构造函数Y(inti, intj)的定义,将参数i赋值给类Y的数 据成员,X的对象a中的数据成员x,并且把参数j赋值给类X的数据 成员y,请在注释“*2*之后添加适当的语句。完成类Y的成员函数void Display。的定义,将Y的数据成员,X的 对象a中的数据成员x和类X的数据成员y按照“x=_,y=_”的形式显示 出来代表一个数字),请在注释“*3*”之后添加适当的语句。输出结果如下:x=5, y=lx=6, y=9x=5, y=9注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件test23_3.cpp清单如下:include < iostream.h >class X (friend class Y ;public :void Set(int i) x=i ; void DisplayO (cout < < nx=n < <x< < n, n ;cout < < "y=" < < y < < endl;) private: int x; static int y; );class Y public:Y(int i, int j) void DisplayO; private:Xa;); *Y:Y(int i, intj) )void Y:Display() void main ()Xb;b.Set(5);b.DisplayO;Y c(6,9);c.Display(); b.DisplayO; )49.使用VC6打开考生文件夹下的工程MyProj5。此工程包含一个源程 序文件MyMain5.cpp,其中定义了用于表示日期的类Date,但类Date 的定义并不完整。请按要求完成下列操作,将类Date的定义补充完成: 定义私有数据成员lengths width和label,其中lengths width是int 型,label是类point的对象。它们分别表示长方形的长、宽以及坐标点。 请在注释“* 1 * ”之后添加适当的语句。完成构造函数square的定义,使square对象的默认值为: length=O,width=O, label(O, 0),请在注释“*2*”之后添加适当的语句。 完成重载构造函数square(int l,int w,int x,int y)的定义,把数据成员 lengths width和对象label分别初始化为参数1、w、x和y的值,请在 注释“*3*,之后添加适当的语句。完成成员函数get_area()的类外定义,此函数的功能是返回此长方形 的面积,及返回length*width的值。请在注释“*4*”之后添加适当的 语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件MyMain5.cpp清单如下:/MyMain5.cpp#include < iostream >using namespace std; class point (private:int x,y;public:void set (int i,int j)(x二i;y 二j;)int get_y ()(return y;);class square(*public:* * 2 * *square(int l,int w, int x, int y)* * B * *)void set(int l,int w)(length= 1;width= w;)int get_area() const(return length*width;);int square:get area() const(* * 4 * *)int main()(square small(2,4,l,35);cout < < small.get_area() < < endl;return 0;)参考答案l.B2.C3.B解析:软件测试与软件调试是两个不同的概念:软件测试的目的是 发现错误,而软件调试的目的是发现错误导致程序失效的原因,并修改 程序以修正错误,调试是测试之后的活动。4 .D解析:题干表示的是回车换行,选项A,选项B和选项C都表示回 车换行。而选项D是字符串的结尾标志。5 .A解析:本题考查点为类成员的访问权限,public关键字修饰的类成 员可以被类的对象通过成员操作符直接访问,protected和private 则不能,而static不能单独修饰类的成员。6 .A解析:选项A中,p是对象指针,所以调用p的成员要用符号“- ”, 而my是一般的类对象,所以调用my的成员用;选项B中正确的调 用方式应该是(*p).set Variable选项C中仅调用一次类对象的构造函数; 选项D是把对象my的地址赋值给指针变量p,而不是对象本身。7 .A解析:类模板说明的一般形式是:template类型形参表class V 类名 类说明体??);函数模板的一般说明形式如下template V模板形参表返回值类型 函数名(模板函数形参表)函数定义体8.B解析:本题考核拷贝构造函数的概念。拷贝初始化构造函数实际上 也是构造函数,它是在初始化时被调用,将一个已知对象的数据成员的 值拷贝给正在创建的另一个同类的对象。拷贝构造函数具有的特点是: 拷贝构造函数也是一种构造函数,因此函数名与类相同,并且不能指定 函数返回类型;只有一个参数,是对同类的某个对象的引用;每一个类 中都必须有一个拷贝构造函数。如果类中没有声明拷贝构造函数,编译 器会自动生成一个具有上述形式的公有的拷贝构造函数。9 .D解析:线性表可以为空表,排除选项B。第一个元素没有直接前件, 最后一个元素没有直接后件,故排除选项A。线性表的定义中,元素的 排列没有规定大小顺序,故选项C也有误,只有D项是正确的。10 .C解析友元函数的定义既可以在类内部进行,也可以在类外部进行。 它提高了程序的运行效率,但破坏了类的封装性和隐藏性,使得类的非 成员函数可以访问类的私有成员。11 .AAo【解析】由主函数main入手,定义外部变量x和y,调用函数 addo因为x, y为外部变量,所以“intx(20), y(5);”的赋值在add也是 有效的,即add函数的运算结果为25。12 .D13 .A解析:顺序存储结构就是用一组地址连续的存储单元依次存储该线性 表中的各个元素,链式存储结构中各数据结点的存储序号是不连续 的,并且各结点在存储空间中的位置关系与逻辑关系也不一致,所以 选项A是正确的。两者都可以存储线性的、有序的逻辑结构,所以选 项B、C不正确。顺序结构使用的是连续物理空间,链式结构可以使 用零散的物理空间存储,链式结构更灵活,不存在谁节约空间的说 法,所以选项D不正确。14.A解析:字符数组不能直接赋值,所以选项A)错误。15.CCo【解析】基类中说明的虚函数,在派生类中自然就是虚函数,所以 类B中fund是虚函数;而类A中的func2没有被关键字virtual修 饰;所以不是虚函数。16.C数据结构概念一般包括3个方面的内容,数据的逻辑结构、存储结构 (物理结构)及数据上的运算集合。数据的逻辑结构只抽象地反映数据元 素之间的逻辑关系,即数据元素之间的前后件关系,而不管它在计算 机中的存储表示形式。17.CCo【解析】E一R(Entity-Relationship)图为实体一联系图,提供了表 示实体型、属性和联系的方法,用来描述现实世界的概念模型。18.D继承是面向对象的方法的一个主要特征,是使用已有的类的定义作 为基础建立新类的定义技术。广义的说,继承是指能够直接获得已有的 性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和 操作的机制。19.B本题主要考查了派生类对象对基类成员的访问。类BB公有继承类AA,类AA的公有成员函数setN()成为类BB的公有成员,类AA的 保护数据成员n和保护成员函数setK()成为类BB的保护成员,通过派 生类对象只能访问派生类的公有成员,因此选项B正确,不能访问派 生类的私有成员和保护成员,因此选项A和选项D错误;无论哪种继承 方式,派生类BB的对象都不能访问基类AA中的私有成员,因此选 项C错误。20.C21.Bn本题考查for循环语句,-i表示用之前先减1,那么这个for循环 语句只有50到2时才会输出“针,所以总共输出49次。n22.C“+”是右结合的,所以先赋值为3,最后输出3+1;常成员函数只有常 对象才能调用,所以输出2。23.AAo【解析】C+语言中,setfill的意思是在空格的地方填上setfill函 数中的参数字符,setw的意思是设置整个输出字符串的字符个数,本 题中用*来代替空格。24 .m-n m m/=1025 .运行时的多态性运行时的多态性26 .时间复杂度和空间复杂度时间复杂度和空间复杂度27 .软件工具软件工具解析:软件开发环境或称软件工程环境是全而支 持软件开发全过程的软件工