《2023年甘肃省天水市全国计算机等级考试C++语言程序设计真题(含答案).docx》由会员分享,可在线阅读,更多相关《2023年甘肃省天水市全国计算机等级考试C++语言程序设计真题(含答案).docx(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023年甘肃省天水市全国计算机等级考试C+语言程序设计真题(含答案)学校:班级:姓名:考号:一、1.选择题(10题)1 .下面是关于派生类声明的开始部分,其中正确的是A.class virtual B:public AB. virtual class B:public AC.class B:public A virtualD.class B: virtual public A2.下面程序的运行结果为()。#include using namespace std ;void main() inta=l ;switch(a) case 1 :cout nln;case 2 : cout n2n;
2、break ;default : cout 0 ;A.12B.120 Cl D.10 3.若有以下程序:#include using namespace std; class A private: int a; public: A(im i) a=i; void disp() cout a J; ; class B private: int b; public: B(int j) b=j; void dispO cout b ; class C: public B,public A private: int c; public: C(int k):A(k- 2),B(k+2) c=k; voi
3、d dispO A:disp(); B:disp(); cout c endl; );intmainQ C obj(10); obj.disp(); return 0;)程序执行后的输出结果是()。 A.10J0J0 B.10,12,14 C.8,10,12 D.8,12,10void main() char a =nclanguagen, t ;inti, j, k ;k=strlen(a);for(i=0 ; i =k-2 ; i+=2)for(j=i+2 ; j =k ;if(【】)t=ai ; ai=aj ; aj=t ; cout a ;cout endl ;=四、程序改错题(1。题
4、)36 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行有问题,请改正main函数中的错误,使程序的输出结果为:number=l number= 10 number= 100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结 构,错误的语句在/ / *errc)r*的下面试题程序:#includeclassTC public:TC(inti)number=i ;voidSetNumber(intm)(number=m;)intGetNumberconst(returnnumber;voidPrintconst(coutHnumber=Hnumberendl
5、;)private:intnumber;voidmainsix si*si个个个个个个个*r,个个个个个个个个TCobjl;objl. Print;TCobj2(3);1*个个个个不不不个noie个个个不个个个个objl. number=10;/ ! *ej*jor*o*TC. SetNumber(lOO);objl. Print;obj2. Print; )37 .使用VC + +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运 行时有错误,请改正程序中的错误,使得程序输出:9, 8, 7, 6, 5注意:错误的语句在/ *error* /的下面,修改该语句即 可。其他的语句不能修
6、改。试题程序:#include(iostream . h classTC个个个个个个个个e j*i*or个个个个个个个个TC(inti)(m_i=i ;.voidprintcoutm_i,;)public : intmain下不不不不不不不enpor不不不不不不不不inti ;TC04(10);while(i5)! * * * !1+ + :04 . print ;coutendl ;returnO ;38 .使用VC + +6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个catch必须抛出执行的任何异常。程序异常,输出信息为e
7、rrorOERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *errc)r*的下面。试题程序:#includer*的下面。试题程序:#include voidmain inti=O ;charstr120;coutHEnterastringendwith?nendl ;个个个小小小个个nor个个个不个个个个cin. getline(str, 120);while(str)7,7,个个个个个个个个个个* *个个个个if(stri)=a)stri=stri-a+A;i+ + ;coutstrendl ;return ;40 .使用VC + + 6 .
8、 0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,输出的结果为Constructor, i=0,Destructor注意:错误的语句在/ / *errcr*的下面,修改该语句即可。试题程序:#include(iostream . h)classTC inti ;public :TC ;voiddisplay ;TC ;TC :TC coutnConstructornn, ni-0;TC :displaytoutr*的下面。试题程序:#includeiostream. h)intmain trythro w( error);*1* kL* 1* *1
9、vl*vl*kL*kL*个不个个不不不个个个不不不个个个catch(chars) coutsendl;throw(int)0);、! 7,7,7,kJ k! 7,7,k1 k! 7,!个不不不不不个不nor个个个不不不个不catch coutiendl;throw(O);thro w( error);*1# *1*个个不个不不不个nc)i*个个个不个个不不catch coutnERRORnendl ;returnO ;42 .使用VC + + 6 . 0打开考生文件夹下的源程序文件1 .cppo本程序要 求输入一个字符串,然后将其中的小写字母改成大写字母,字符可能输 入多行,当输入字符“?”时
10、,默认字符输入结束,最后把结果输出到屏幕 中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *error*的下面。试题程序:#includevoidmain(inti=O ;charstr120;coutnEnterastringendwith? . nendl ;I I *error* cin . getline(str, 120);1 I*仃01* while(str)I I *ei*i*or* if(stri)=a)stri=stri-a + A ;i + + ;coutstrendl ;return ;4 .下列各项中不符合函数重载必须满足的
11、条件的是 oA.必须有不同的参数个数B.对应的参数类型必须不相同C.A和B必须 同时满足D.A和B只要满足一个即可5 .面向对象程序设计将数据和()放在一起,作为一个相互依存、不可分 割的整体来处理。A.对数据的操作B.信息C.数据隐藏D.数据抽象6 .对于模板定义关键字class和typename说法不正确的是()。A.程序中的class并不能都替换为typenameB.class和typename都可互相替换C程序中的typename都能替换为classD.程序中的部分class可以替换为typename7 .设intx=(l, 3, 5, 7, 9, 11, 13), *p=x ;则不能
12、正确引用数组元素的表达式是 OA.*(p-) B.*(-p) C.*(p+) D.*(+p)下列叙述中正确的是A)软件测试的主要目的是发现程序中的错误B)软件测试的主要目的是确定程序中错误的位置0为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作8 . D)软件测试是证明软件没有错误9 .下列关于运行符重载的描述中,正确的是()0A.运算符重载可以改变操作数的个数43 .使用VC+6. 0打开考生文件夹下的源程序文件L cpp,但该程序运行有问题,请改正main函数中的错误,使该程序的输出结果正确。程序输出:88注意:错误的语句在/ *error* /的下面。修改该语句即可,其他
13、的语句不能修改。试题程序:#include(iostream. hclassCO (public:/ 个个个个不不不不erpor不不不不不不不不/staticintn=O:CO (n+ + :)CO): intCO :n ;voidmainCOobj ;COobj27;CO*C=NULL:c=&obj:vl* vt* vt*vL#个个个不小个个个不个个个个不小eoutC . nendl ;coutC0:nendl ;44 .使用VC + + 6 . 0打开考生文件夹下的源程序文件1.cpp,该程序运 行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果 为:sizeoRS 1)=5s
14、izeof(s2)=10sizeof(s3 尸 1注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/的下面。不能删除assert ()语句。(2)只能修改后面的数字。提示:assert函数如果为假,则会产生一个中断异常。试题程序:#include #includevoidmain () chartsl=nabcn:errorassert(sizeof(s 1 )=3): coutnsizeof(sl)=5nendl ;chars210 !abn:一, 个个个个个个个个error个个个个个个个个assert(sizeof(s2)=2);coutnsizeof(s2
15、)=10nendl ;chars3=23 :xkxkIx个个个个个个个个eno1个个个个个个个个assert(sizeof(s3)=4);coutnsizeof(s3)=lnendl ;return ;45 .使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错。请改正程序中的错误,使程序输出的结果为1003732注意:错误的语句在/ / *errc)r*的下面,修改该语句即可。试题程序:#includeerrorvoidmainkI、 k vt kk k! vf不不不不不不en*or不不下不不不intm=0142:intn=0X27 :kJ k! k| vf kJ kJ
16、 errork1 k.j 7,7” 7, rr%intq=32;cout mendl;cout n endl;cout qendl;return ;五、综合应用题(2题)46 .请使用【答题】菜单命令或直接用VC6打开考生文件夹下的工程prog3,其中声明了 ValArray类,该类在内部维护一个动态分配的整型数组。ValArray类的复制构造函数应实现对象的深层复制。请编写ValArray类的复制构造函数。在main函数中给出了一组测试数据,此 种情况下程序的输出应该是:“* *666* *,Vai Array vl= 1, 2, 3, 4, 5 Vai Array v2= 1, 2, 3,
17、 4, 5要求:不得修改程序的其他部分。注意:程序最后将结果输出到文件out. dat中。输出函数write To File 已经编译为boj文件,并且在本程序中调用。/VaiArray, h#include using namespace std; class ValArrayint*v: int size; public:Vai Array (const int * P, int n): size(n) v=new intsize;for(int i=0; isize; i+) vi=Pi;47 .请使用VC6或使用【答题】菜单打开考生文件夹proj3下的工程 proj3,其中包含了类In
18、tegerset和主函数main的定义。一个Integerset 对象就是一个整数的集合,其中包含0个或多个无重复的整数;为了 便于进行集合操作,这些整数按升序存放在成员数组elem的前若干单 元中。成员函数add的作用是将一个元素添加到集合中(如果集合中不 存在该元素),成员函数remove从集合中删除指定的元素(如果集合中 存在该元素)。请编写成员函数remove。在main函数中给出了一组测 试数据,此时程序的正确输出结果应为:2 3 45 27 28 31 66 752 3 45 627 28 31 56752 3 45 6 192728 31 66 753 45 6 19 27 28
19、 31 66 753 45 6 19 27 28 31 66 75要求: 补充编制 的 内 容写在“* *333 *与不得修改程序的其他部分。“*666* 间, 注意:程序最后将结果输出到文件out. dat中。输出函数writeToFile已经编译为。bj文件,并且在本程序中调用。/IntegorSet. h#ifndef INTEGERSET#define INTEGERSET#includeusing namespace std;const int M AXELEMENTS=100 ;集合最多可拥有的元素个数class Integersetint elemMAXELEMENTS;用于存放
20、集合元素的数组int counter;用于记录集合中元素个数的计数器puhlic:Integerset: counter(O) 创建一个空集合Integerset(int data口,int size);利用数组提供的数据创建一个整数集合void add(int element);添加一个元素到集合中void remeve(int element);删除集合中指定的元素int getCountconstreturn counter; 返回集合中元素的个数int getElement(int i)constreturn elemi;返回集合中指定的元素 void showconst;;void
21、WriteToFile(char*);#endif/main. cpp#include,IntegerSet. h#includeIntegerSet: IntegerSet(int data口,int size) : counter(O) for(int i=0; i0; j-) if(element=elemj 一 l)break;如果找到的是等于element的元素,说明要添加的元素已经存在,直 接返回if(j0)if(element=elemj-1 )return ;如果找到的是小于element的元素,j就是要添加的位置该元素及其后面的元素依次后移,腾出插入位置for(int k=c
22、ounter; kj ;k 一)elemk=elemk 一 1;elemj=element;将 element 插入到该位置counter+;计数器加1 )void IntegerSet:remove(int element)( / / / /q. -j. q.4 4 -j.-j.-j. -j.,j. / /kL* / / / / 、一、-j, ,-J、卜、T ,、void IntegerSet: showconstfor(int i=0; igetCount ; i+)coutsetw(4)getElement(i);coutendl : ) int main intd=5, 28, 2,
23、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 ;六、3.综合应用题(2题)48.使用VC6打开考生文件夹下的工程test38_3o此工程包含一个 test38_3.cpp,其中定义了类complex,但类的定义并不完整。请按要求 完成下列操作,将程序补充完整。(1)添加类complex的无参数的构造函数的定义,将私有成员
24、real和imag 都初始化为0o请在注释“*1*”之后添加适当的语句。(2)添加类complex的带两个参数的重载构造函数,两个参数r和i都是 double类型,要求将r赋值给私有成员real, i赋值给私有成员imag, 同时允许调用时参数i可是省略,请在注释“*2*”之后添加适当的语 句。完成类complex重载加法函数的定义,该函数直接返回一个类 complex的对象,同时把参数对象c的实部real和虚部imag分别与当前 对象对应部分分别相加,请在注释“*3*”之后添加适当的语句。(4)完成类complex的友元函数print的定义,使其以格式“real+imagi”输 出,请在注释
25、“*4*”之后添加适当的语句。源程序文件test38_3.cpp清单如下;#include class complex (public: * * * 2 * ( real=r;imag=i; complex operator+(complex & c); friend void print(complex &c); private:double real.imag;);complex complex: :operator+(complex & c) ( * 3 * )II * 4 *cout c.real c.imag nin endl;)void main() (complex cl(2.0
26、53.0)9c2(4.02.0)5c3;c3=cl+c2;print(c3);c3=c3+complex(3.5);print(c3); 49.使用VC6打开考生文件夹下的工程MyProj8o此工程包含一个源程 序文件MyMain8.cpp,该程序实现栈的入栈和出栈的操作。其中有两个 类:一个是节点类node,它包含节点值和指向上一个节点的指针prey ; 另一个类是栈类stack,它包含栈的头指针top。但类的定义并不完整。 请按要求完成下列操作,将类Sample的定义补充完成:定义私有节点值data,它是血型的数据,以及定义一个指向上一个节 点的指针prev。请在注释“* *1* *”之后
27、添加适当的语句。B.运算符重载可以改变操作数的优先级C.运算符重载可以改变运算符的结合性D.运算符重载可以使运算符实现特殊功能10 .在进行任何C+流的操作后,都可以用C+流的有关成员函数检测流的状态:其中只能用于检测输入流状态的操作函数名称是()。A.fail B.eof C.bad D.good二、单选题(13题)11 .按照“先进先出”组织数据的数据结构是()。A.队列B.栈C.双向链表D.二叉树12 .下列关于赋值运算符“=”重载的叙述中,正确的是A.赋值运算符只能作为类的成员函数重载B.默认的赋值运算符实现了“深层复制功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义
28、了复制(拷贝)构造函数,就不能重载赋值运算符13 .数据库管理系统是()。A.操作系统的一部分B.在操作系统支持下的系统软件C一种编译系统D.一种操作系统14 .若磁盘上已存在某个文本文件,其全路径文件名为d:shitites.txt, 完成构造函数node(intd,node*n)的定义,使得私有成员data和prev分 别初始化为d和no请在注释“/* *2* *”之后添加适当的语句。完成类stack的成员函数push(int i)的类体内的定义。函数push()实现 入栈这个操作,即把形参i压入栈中,那么此时应该创建一个新的节点, 并让这个节点的prev指针指向栈顶。请在注释“/* *3
29、 * *”之后添加适当 的语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件MyMain8.cpp清单如下:/MyMain 8.cpp#include using namespace std;class stack;class node(private:*public:node(int d5 node *n)(* * 2 * *)friend class stack;);class stack(node *top; 栈头public:stack()(top=0;void push(int i)(/* * 2 * *)int pop()(node*t=top ;if(t
30、op)(top=top- prev ;int c=t- data ;delete t ;return c ;return 0 ;);int main()(stack s ;s.push(6);s.push(3);s.push(l);return 0 ;参考答案1 .D解析:本题考核虚基类的声明。C+中,虚基类说明格式如下 class 类名 :virtual 。其中,virtual是虚基类的 关键词。虚基类的说明是用在定义派生类时,写在派生类名的后面。2 .A解析:switch语句检测到符合条件case执行后面语句不再判断。3 .D4 .A5 .A解析:面向对象语言包含3个要素,即对象、类和继承
31、。这3个要 素反映了面向对象的传统观念。面向对象程序设计的本质是把数据和对 数据的操作当成一个整体即对象。6 .BB。【解析】在C + +程序中的typename是都可以替换为class的,但 class不能都替换为typenameo7.B8 .A解析:就软件测试而言,它的目的是发现软件中的错误。但是,发 现错误并不是最终目的,最终目的是通过测试发现错误之后还必须诊断 并改正错误,这才是测试的目的。由于测试的目标是暴露程序中的错误, 所以从心理学角度看,由程序的编写者自己进行测试是不恰当的。因此, 在软件测试阶段通常由其他人员组成测试小组来完成测试工作。经过上 述分析可知,选项A的说法是正确的
32、,而选项B、C、D的说法是错误 的。9 .D解析:本题考核运算符重载的概念。C+把重载的运算符视为特殊 的函数,称为运算符函数,函数名就是在运算符前加上保留字operator。 运算符重载就是赋予已有的运算符多重含义。C+中通过重新定义运算 符,使它能够用于特定类的对象执行特定的功能。但是用户重新定义运 算符,不改变原运算符的操作符个数、优先级和结合性.同时运算符重 载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算 符,双目运算符只能重载为双目运算符。所以A, B, C选项的描述都 是错误的。10 .B解析:C+中可以用文件流对象的下列成员函数来判别文件流的当 前状态。函数is_
33、open():判定流对象是否与一个打开的文件相联系,若是,返 回true,否则返回false0函数good。:刚进行的操作成功时返回true,否则返回falseo函数fail():与good()相反,刚进行的操作失败时返回true,否则返回 false o函数bad():如果进行了非法操作返回true,否则返回falseo函数eof()进行输入操作时,若到达文件尾返回true,否则返回falseo 其中,eof函数只能用于输入流操作。11 .A队列是一种特殊的线性表,只允许在表的一端插八元素,在表的另一端 删除元素,插入元素的一端叫“队尾”,删除元素的一端叫“队头”。先插 入的元素先被删除,是
34、按“先进先出”的原则组织数据的。【知识拓展】“队列”和“栈”都是一种特殊的线性表。之所以称之为“队列”, 其形式如“排队”。要讲究“先来后到”,先进先出,后进后出。12 .A解析:二、小()、-以及所有的类型;转换运算符只能作为成员函数 重载,A项正确。默认的赋值运算符只实现了浅层复制,B项错误。赋值运算符只能作为成员函数重载,形参表中只有一个参数,对应于第二操作数,c项错误。一个类中如果需要重载运算符“=”,通常也就需要定义自己特有的复制构造函数,反之亦然,故D项错误。13.B数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操 纵、数据维护、控制及保护和数据服务等
35、,是一种在操作系统支持下的系统软件,因此本 题答案为B)o14 .A15 .CCo【解析】本题考查位操作,将4转化成二进制为0100,左移一位 后为1000,转成十进制为8,所以输出8。16.B解析:本题考查的是内联函数的定义,引入内联函数是为了解决 程序中函数调用的效率问题,是以目标代码的增加为代价换取时间的节 省;一般函数在运行时被调用,而调用的内联函数在编译时就被替代了, 如果不加inline关键字,则编译器会将在类说明部分定义的任何函数都 被认定为内联函数。17 .A解析:此题考查的是“+”运算符的重载。为了区分前缀和后缀运算 符,规定:重载后缀运算符时必须多一个虚拟参数:int。本题
36、中,A(2) 首先给n赋值2,语句A+,调用的是后缀运算符重载语句,使得n加 2变为4。B(2)首先给n赋值2,然后语句+B,调用前缀运算符重载函 数,使得n加1。因此最终的输出结果是n=4n=3。18 .D解析:C抖语言中析构函数为符号“ ”加类名,且析构函数没有 返回值和参数,故前不加void关键字。所以正确的形式应该是-MyClass()。 19.D20.B解析:本题考察C+中输入输出流对象的一些常用成员函数的用 法。其中get和getline的区别在于getline读取中以Nn作为输入结束符。 故本题中getline只能接收第一个换行符之前的字符,即firsto后面的字 符被丢弃。因此
37、正确答案应为B。21.ACo【解析】本题中类TestClass为基类,TestClassl为TestClass的派 生类。由main主函数入手,定义TestClassl类型的对象由,参数值为 yo TestClassl 类继承 TestClass,所以主函数中“TestClassldl(y);”语句 首先调用“TestClassl(charc) colllC;”然后调用基类中的 t4TestClassCOUtX;厂输出X,然后执行t4TestClass(charc)coutc; “输出 y,即答案为xy”。22 .C解析:外部变量i实际上记录的是调用构造函数的次数。23 .A24 .数据定义语
38、言数据定义语言25 .virtual void display()=0 ;virtualu3000voidu3000display()=0;解析:本题考查的知识点是:纯 虚函数。纯虚函数定义格式是在虚函数的后面加上“=0”。与虚函数不 同的是,纯虚函数允许没有函数体。故本题应该填入的内容是; virtualu3000voidu3000display()=0;。26 .循环结构循环结构解析:C+语言3种基本结构就是顺序结构,选 择结构,循环结构。27 .归并排序归并排序解析:只有归并排序要求待排序文件”部分排 序”(把待排序的文件分成若干个子文件,每个子文件内的记录是己排序的)。28.bool2
39、9 .m=aim=ai解析:此题考查的是函数模板、if语句、for循环等知 识点。函数模板max()的功能是返回数组a中最大元素的值,所以当ai 是最大值时,应将ai的值赋给m。30 .friend void fTun()31 l.Myhomeis H 32.1233 .关系关系解析:在关系模型中,把数据看成一个二维表,每一个二 维表称为一个关系。表中的每一列称为一个属性,相当于记录中的一个 数据项,对属性的命名称为属性名;表中的一行称为一个元组,相当于 记录值。34 .*q35 .j+=2 ai =aj或 ai a|jj+=2rnai =aj或 ai aj解析: strlen函数是测试字符串
40、长度的函数,函数的值为字符串中的实际长度, 不包括NO在内。36 .(1)应改为TCobjl;(2)应改为“Objl. SetNumber(lO);(3)应改为“0bj2. SelNumber(lOO);【解析】本题第1处的“TCobjl;”语句是声明TC类的对象Objl,根据 TC类构造函数的定义TC(inti),存在整型参数,并且题目要求第一个 输出结果两1,所以补全参数1,即第1处的“TCobjl(l);第2处处 的“objl. number=10;”应该是调用成员函数SetNumber赋值。在C+ +中成员函数的使用形式应该是:对象名.成员函数,所以修改为“objl. SetNumber(lO);。类是对象的抽象,而对象是类的具体实 例。第3处“TC. SetNumber(lOO);”语句中的TC为类,并不是对象, 这里应该使用定义的对象,即。bj2,所以将语句修改为 “obj2. SetNumber(lOO);37 .(1)应添加“public :n(2)“inti”应改为“inti(10);n(3)“i+ + ; ”应改为“i-;二n【解析】本题主要考查的是成员的访问属性。成员的访问属性有公有、 保护和私有3种,而默认的访问属性为私有,只有公有成员才能通过类 的对象被访问