2022年甘肃省兰州市全国计算机等级考试C++语言程序设计模拟考试(含答案).docx
2022年甘肃省兰州市全国计算机等级考试C+语言程序设计模拟考试(含答案)学校:班级:姓名:考号:一、1.选择题(10题)1 .有如下程序:#include < iostream.h > using namespace std ; Class Base public : Base()cout < < "BB" ;f() ; void()cout < < "BF" ; ; class Derived : public Base public : Derived()cout < < "DD" ; void f()cout < < "Df' ; ) ) ; int mainA.BBBfDD B.BBDfDDDfC.DD D.DDBBBf2 .数据库管理系统DBMS中用来定义模式、内模式和外模式的语言是 OA.DML B.C C.DDL D.Pascal3 .()是给对象取一个别名,它引入了对象的同义词。A.指针B.引用C.故举D.结构4 .检查软件产品是否符合需求定义的过程称为 oA.确认测试B.集成测试C.验证测试D.验收测试5 .下列关于C+函数的叙述中,正确的是A.每个函数至少要具有一个参数B.每个函数都必须返回一个值C.函数在被调用之前必须先声明D.函数不能自己调用自己35 .请在下列程序中的空格处填写正确的语句:class Samplepublic :Sample() Sample() void SetData(int datA) 将Sample类成员变量data设置成形参的值private :int data ;);四、程序改错题(10题)36 .使用VC+6.。打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个catch必须抛出执行的任何异常。程序异常,输出信息为errorOERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *error*的下面。试题程序:#include<iostream h) intmaintry throw(nerrorn);vl* vl*>J> *1> *J> *1> vl* *J> *1>个个个个个个个个rror个个*个个个个个catch(chars) (cout«s«endl;) try (throw(int)0);)/不不不小不不不不error"、小不个不不不不catch(cout«i«endl ; try (throw(O);throw(nerrorn);k1*J> *1> vl* vl* *1*个个个个个个个个nor个个个个个个个个catch (cout«nERRORn«endl;)returnO ;37 .使用VC+ +6.0打开考生文件夹下的源程序文件1 .cpp。本程序要 求输入一个字符串,然后将其中的小写字母改成大写字母,字符可能输 入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出到屏幕 中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *error*的下面。试题程序:#include<iostream . h>voidmain(inti=O ;charstr120;cout«nEnterastringendwith? . n«endl ;I I *error*cin . getline(str, 120);/ I *error*while(str)(/ I * error* *if(stri)=a)stri=stri-a + A ;i + + ;)cout«str«endl ;return ;38 .使用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 ;)intGetNumberconst(returnnumber ;)voidPrintconst (cout«" number=1 f «number«endl ;)private :intnumber ;voidmainerrorTCobjl ;objl . Print ;TCobj2(3);vl*si>*J> *J> *J> *1> vi* *A>个个个个个个个个nor个个个个个个个个objl . number= 10 ;! 1* ej*or* * *TC . SetNumber(lOO);objl . Print ;obj2 . Print ; )39 .使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,但该程序运行有问题,请改正main函数中的错误,使该程序的输出结果正确。程序输出:88注意:错误的语句在/ *error* /的下面。修改该语句即可,其他的语句不能修改。试题程序:#include(iostream. h> classCO public:7,7,7,小不不不不小不不enor不不不不不不不不staticintn=O :CO (n+ + :)CO(n:):vL*kJ> k!> k|> vt*不、不不不不不不en*or3小不不不小不intCO:n;voidmain(COobj ;COobj27;COCNULL:c= & obj :errork1> k1>k1> sl>ryw ryw rj*eout«C . n«endl ;cout«C0: n«endl; )40 .使用VC+6. 0打开考生文件夹下的源程序文件1.cpp,该程序运行有问题,请改正main函数中的错误,使程序的输出结果为:number= 1 number= 10 number=100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结构,错误的语句在/ / *errc)r*的下面。试题程序:#include<iostream. h>classTC (public:TC(inti) ( number=i;) voidSetNumber(intm) (number=m ;) intGetNumberconst (returnnumber;) voidPrintconst (cout«n number=n «number«endl ;private:intnumber;);voidmain个个个个个个个个rror个个个个个小个个TCobjl;objl. Print;TCobj2(3);个个个个个个个个nor个个个个个个个个objl. number= 10;! 1 * eno* 0 * *TC. SetNumber(l 00);objl. Print;obj2. Print;41 .使用VC+6. 0打开考生文件夹下的源程序文件1. cpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个catch必须抛出执行的任何异常。程序异常,输出信息为errorOERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *eirc)r*的下面。试题程序:#include<iostream. h) intmain( try(throw(nerrorn);* prrcr* *catch(chars)(cout«s«endl;) try (throw(int)0);* * *catchcout«i«endl;) try (throw(O);throw(nerrorn);)*5rcr*catchcout«n ERROR1 f «endl ;returnO ;42 .使用VC+6.。打开考生文件夹下的源程序文件1.cpp,该程序 运行时有错。请改正程序中的错误,使程序输出的结果为1003732注意:错误的语句在/ / *error*的下面,修改该语句即可。试题程序:#include<iostream. h>不不不不不不error不不不不不不voidmainvl* vl*kL*不不下不不不error不不下个不不intm=0142:不不不不不不erpor不不不不不不intn=0X27 :intq=32;cout< <m< <endl;cout< <n< <endl;6 .两个变量定义不能同名,是因为()。A.这两个变量定义在同一文件中B.这两个变量定义在同一作用域中C.一个定义在main函数中,一个定义在子函数中D.以上说法均不正确7 .下列关于C+语言类的描述中错误的是A.类用于描述事物的属性和对事物的操作8 .类与类之间通过封装而具有明确的独立性C.类与类之间必须是平等的关系,而不能组成层次结构D.类与类之间可以通过一些方法进行通信和联络8 .如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是A.一元运算符B.二元运算符C.选项A)和选项B)都可能D.重载错、口 味9 .下列对模板的声明中,正确的是()。A.template < T >10 template < class T1.T2 >C. tempi ate < class TLclass T2 >D.template < class Tl;class T2 >cout <<q<< endl ;return ; )43 .使用VC+6.。打开考生文件夹下的源程序文件1. cpp。本程序 要求输入一个字符串,然后将其中的小写字母改成大写字母,字符可 能输入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出 到屏幕中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在/ / *errc)r*的下面。试题程序:#include<iostream. h> voidmain(inti=0;charstr120;cout«nEnterastringendwith?n«endl ;/不不不不不不不不error不小小不不不不不cm.getline(str, 120);个个个个个个个个个个个个个个个个while(str)vl* vl*vl*个个个个个个个个个个个*个个个个if(stri)=a)stri=stri-a+A;i+ + ;)cout«str«endl ;return ;)44 .使用VC+ + 6 . 0打开考生文件夹下的源程序文件1 . cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实现 的功能为从键盘输入一个字符串,并将结果保存到文件1 . txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结 构,错误的语句在kL*kL*error的下面。试题程序:#include<iostream>#include<fstream>7,7,K.t>7< 7,个个个个个个个个个个个个个个个个usingstd ;voidWriteFile(char*s) (ofstreamoutl ;vi*error 不不不个不不不outl . open(nl . txt", binary|app);for(inti=0 ; si!=0 ; i + +)error!> !> vi> kJ> k1> *i> kL* «、«、q. rj>"、outl . puts(si);)outl . close ;)voidClearFile (ofstreamoutl ;outl . open(nl . txt");outl . close ;) intmain(chars1024;ClearFile ;cout«npleaseinputastrin9 :n«endl ;cin . getline(s, 1024);WriteFile(s);returnO ;)45 .使用VC + +6 .0打开考生文件夹下的源程序文件1 .cpp,该程序运 行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果 为:sizeof(Sl)=5 sizeof(s2)=10sizeof(s3)=l注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/ / *err()r*的下面。不能删除assert ()语句。(2)只能修改后面的数字。提示:assert函数如果为假,则会产生一个中断异常。试题程序:#include<iostream . h> #include<assert . h> voidmain () chartsl=nabcn:assert(sizeof(s 1 )=3):cout«nsizeof(sl)=5n«endl ;chars210=nabn:assert(sizeof(s2)=2);cout«nsizeof(s2)=10n«endl ;chars3=23 :assert(sizeof(s3)=4);cout«nsizeof(s3)=ln«endl ;return ; )五、综合应用题(2题)46 .使用VC+6. 0打开考生文件夹下的源程序文件3. cpp。类 People包括姓名和年龄两个字段。函数fun获得年龄比较大的人的姓 名,然后输出这个姓名到屏幕。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完 整。完成类的构造函数功能,请在注释1后添加适当的语句。完成构造函数对姓名的赋值,请在注释2后添加适当的语句。定义类的友元函数fun,请在注释3后添加适当的语句。(4)补充函数fun的年龄比较功能,请在注释4后添加适当的语句。注意:增加或者修改代码的位置已经用符号表示出来,请不要修改其 他的程序代码。试题程序:#include<iostream. h>classPeople (public:/ vl* vl*1* vL* kL* vt*/I(inti;for(i=0; sUserNamei! =0; i+ +) m_UserNamei=sUserNamei;/7> 1* 7* 1>/"、«、rj、<J、«、 Jrj、"、rj、r7>m_01d=n01d;private:charm_U serN ame 32;intm_01d;/si* *1*1/?、J>-卜 «、*y*;voidfun(char*s, People & personl, People & person2/ I *4* if for(inti=O; personl. m_UserNamei!=0; i + si=personl. m_UserNamei;si+l=0;)else for(inti=0 ; person2 m_UserNamei!=0; i+ si+l=O; ) ) )voidmain (chars32;Peoplepl(nabc% 20);Peoplep2(ndef 30):fun(S, pl, p2);cout«s«endl:return ; )47 .请使用VC6或使用【答题】菜单打开考生文件夹proj3下的工程 proj3,其中包含了类IntegerSet和主函数main的定义。一个IntegerSet 对象就是一个整数的集合,其中包含。个或多个无重复的整数;为了 便于进行集合操作,这些整数按升序存放在成员数组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 31 66 753 45 6 19 27 28 31 66 75要求: 补充编制 的 内 容写在“* *3 3 3 *与 “*666*”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件out. dat中。输出函数writeToFile已经编译为。bj文件,并且在本程序中调用。/IntegorSet. h#ifndef INTEGERSET#define INTEGERSET#include<iostream>using namespace std;const int MAXELEMENTS=100;集合最多可拥有的元素个数class IntegerSetint elemMAXELEMENTS;用于存放集合元素的数组int counter;用于记录集合中元素个数的计数器puhlic:Integerset: counter(O) 创建一个空集合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#includeIntegerSet. 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>=elemj - l)break;/如果找到的是等于element的元素,说明要添加的元素已经存在,直接返回if(j>0)if(element=elem j-l)return ;/如果找到的是小于element的元素,j就是要添加的位置/该元素及其后面的元素依次后移,腾出插入位置for(int k=counter ;k>j ;k 一)elemk=elemk 一 1;elemj=element;将 element 插入到该位置counter+;计数器加1 void Integerset: remove(int element) 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 ; )10 .有如下程序: #include < lostreanl > using namespace std ; elass MyClass public : MyClass( )+count ; MyClass()count ; static int getCount( ) return count ; ) private : static int count ; ; intMyClass:count=0 ; int main() MyClass obj ; cout < < obj . getCount(); MyClass*ptr=new MyClass ; cout < < MyClass:getCount() ; delete ptr ; cout < < MyCiass:getCount() ; return 0 ; )程序的输出结果是 A.121 B.232 C.221 D.122二、单选题(13题)11 .下面关于C+流的叙述中,正确的是A.cin是一个输入流对象B.可以用ifstream定义一个输出流对象C.执行语句序列char*y="PQMN" ; cout < < y;将输出字符串“PQMN”的 地址D.执行语句序列 char x80;cin.getline(x,80); ,若键入 Happy new year则x中的字符串是"Happy"12.第21题以下有关类与结构体关系的叙述不正确的是()。A.结构体中只包含数据;类中封装了数据和操作B.结构体的成员对外界通常是开放的;类的成员可以被隐蔽C.用struct不能声明一个类型名;而class可以声明一个类名D.结构体成员默认为public ;类成员默认为private六、3.综合应用题(2题)48.使用VC6打开考生文什夹下的工程testl_3o此工程包含一个 testl_3.cpp,其中定义了类 circle 和 column,其中 column 类由 circle 类 protected派生,但两个类的定义并不完整。请按要求完成下列操作,将 程序补充完整。定义类circle的保护数据成员r和area,它们都是double型的数据。 请在注释“/*1*''之后添加适当的语句。添加类circle的无参数的构造函数,使circle对象的r默认值为0,请 在汁释“*2*,之后添加适当的语句。(3)添加派生类column构造函数的定义,传入的参数为double型的height 和radius,并将具分别赋值给数描成员h和基类的r,请在注释“*3*” 之后添加适当的语句。(4)完成派生类column的成员函数print的定义,使其以格式“r=_area=_" 先输出半径r和底面积area,再以格式“h=_vol=_”输出高h和体积vol 的值,请在注释“*4*”之后添加适当的语句。输山结果如下:r=l area=3.1416 h=2 vol=6.2832注意:除在指定的位置添加语句外,请不要改动程序中的其他语句。源程序文件testl_3.cpp清单如下:#include < iostream.h >const double pi=3.1416; class circle protected:*public:circle(double radius) r=radius;) void print() area=r*r*pi;cout < < nr=n <<r<<nn<< narea=n < < ared < < endl;);class column: protected circle protected: double h; public:* 3 *void print() * 4 *);void main() column col(l.0,2.0);Col.print();)49.使用VC6打开考生文件夹下的工程test38_30此工程包含一个 test38_3.cpp,其中定义了类complex,但类的定义并不完整。请按要求 完成下列操作,将程序补充完整。(1)添加类complex的无参数的构造函数的定义,将私有成员real和imag 都初始化为0o请在注释“*1*”之后添加适当的语句。添加类complex的带两个参数的重载构造函数,两个参数r和i都是 double类型,要求将r赋值给私有成员real, i赋值给私有成员imag, 同时允许调用时参数i可是省略,请在注释“*2*”之后添加适当的语 句。完成类complex重载加法函数的定义,该函数直接返回一个类 complex的对象,同时把参数对象c的实部real和虚部imag分别与当前 对象对应部分分别相加,请在注释“*3*之后添加适当的语句。(4)完成类complex的友元函数print的定义,使其以格式“real+imagi”输 出,请在注释“*4*”之后添加适当的语句。源程序文件test38_3.cpp清单如下;#include < iostream.h >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 < << < endl;)void main() complex cl(2.0,3.0),c2(4.0,-2.0),c3; c3=cl+c2;print(c3);c3=c3+complex(3.5);print(c3);)参考答案LA解析:本趣考查的是类的继承和派生。派生类执行构造函数的一般 次序为;首先调用基类构造函数,然后调用成员对象的构造函数,最后 是派生类构造函数中的内容。题目中定义派生类对象d时,先调用基类 Base的构造函数,输出BBBf,然后调用派生类Derived的构造函数, 输出DD。2.C3.B4 .A本题主要考查软件测试的基本知识。软件测试的步骤可分为单元测 试(模块测试)、集成测试、确认测试和系统测试。(1)单元测试是针对每个模块进行的测试,它可从程序的内部结构出 发设计测试用例,多个模块可以平行、对立地测试。单元测试主要用于 发现详细设计和编程时犯下的错误。单元测试多采用白盒测试,辅之以 黑盒测试。(2)集成测试是在单元测试的基础上,根据模块结构图将各个模块连 接起来,必须精心计划,应提交集成测试计划、集成测试规格说明和集 成测试分析报告。主要目标是发现与接口有关的问题。集成测试可以发 现概要设计时犯的错误。(3)确认测试用于验证软件的功能和性能及其他特性是否与用户的要 求一致。确认测试主要用于发现需求分析时犯下的错误,一般使用黑盒 法测试,以表明软件符合需求说明书的要求,应该仔细设计测试用例和 测试过程。确认测试必须有用户参加,或以用户为主,用户应参与设计 测试用例,通常情况下,主要使用生产中的实际数据进行测试,测试数 据通过用户接口输入。(4)系统测试是将已经通过确认测试的软件,作为整个计算机系统的 元素与计算机硬件、外设和网络等其他因素结合在一起,进行一系列的 组装测试和确认测试。系统测试的目的是通过与系统的需求定义做比较, 发现软件与系统的定义不符合的地方。系统测试可以发现问题定义时犯 下的错误。5 .C解析:本题考核函数的声明和调用。定义一个函数就是为了以后的 调用,但如果函数定义在后面而调用在前,就会产生编译错误。为此, 必须将函数定义在前或在调用前进行“函数的说明”。函数说明消除了函 数定义的位置影响。C选项的描述是正确的。函数可以没有参数,可以 没有返回值。递归函数就是自己调用自己。所以A、B和D选项的描述 都是错误的。6.B7 .C解析:C+语言中的类是可以组成层次结构的,类是用于描述事物 的属性和对事物的操作,类与类之间有相对的独立性,但其可以通过一 些方法进行信息的通信。8 .D解析:C+中用友元函数重载运算符至少有一个参数,重载一目运 算符要有一个参数,重载二目运算符要有两个参数。9 .C解析:本题考核模板的定义。模板定义的 < 类型参数表 > 中包含一 个或多个由逗号分隔的类型参数项,每一项由关键词class后跟一个用 户命名的标识符,此标识符为类型参数,它不是一种数据类型,但可以 同一般数据类型一样使用。在使用类模板时,必须将其实例化,即用实 际的数据类型代替它。10 .A11 .A解析:本题考核C+流的概念和I/O的格式化。cin是istream类的 对象,即输入流对象。ifstream是输入文件流类不能定义个输出流对象。 C选项中执行语句序列char *y='PQMN' ;cout< <y ;后将输出字符串 'PQMN'o getline函数功能是允许从输入流中读取多个字符,并且允许指 定输入终止字符(默认是换行字符),在读取完成后,从读取的内容中删 除该终止字符,所以D选项中的语句序列后x中字符串应该是Happy new year'。12 .C类和结构体有着密切的血缘关系。类可以看做是将动作和数据都封装 的结构体,当然结构体本身是没有动作的。另外,结构体中的成员对 外界访问是没有限制的,而类的成员却是有不同的访问级别限制。13 .C解析:本题考核函数的声明和调用。定义一个函数就是为了以后的 调用,但如果函数定义在后面而调用在前,就会产生编译错误。为此, 必须将函数定义在前或在调用前进行“函数的说明”。函数说明消除了函 数定义的位置影响。C选项的描述是正确的。函数可以没有参数,可以 没有返回值。递归函数就是自己调用自己。所以A、B和D选项的描述 都是错误的。14 .DDo【解析】物理设计阶段主要解决选择文件存储结构和确定文件存取 方法的问题。物理设计阶段包括:选择存储结构、确定存取方法、选 择存取路径、确定数据的存放位置。15 .D解析:因为getType是虚函数,所以p. getType()执行继承类的 getType函数,输出“书”;p. getName()执行基类的getName-函数,输 出“精彩人生”。总共输出“书:精彩人生”,故选D)。16 .DD。【解析】本题考查虚函数的概念。虚函数是非静态的成员函数, 它不能是友元函数,但可以在另一个类中被声明为友元函数。虚函数必 须是类的成员函数,虚函数声明只能出现在类定义的函数原型声明中, 而不能在成员函数的函数体实现的地方,一般要求基类中说明了虚函数 后,派生类说明的虚函数应该与基类中虚函数的参数个数相等,对应参 数的类型相同。如果不相同,则将派生类虚函数的参数类型强制转换为 基类中虚函数的参数类型。17 .C数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶 段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强 物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位, 所以选择C)。18 .DD。【解析】在各种排序方法中,快速排序法和堆排序法的平均速度是最快的,因为它们的时间复杂度都是O(nlog2n),其他的排序算法的时间复杂度大都是O(n2)o19 .CCo【解析】编译时的多态性是通过函数重载和模板体现的,运行时的 多态性是通过虚函数体现的。20 .C21 .DDo【解析】本题中第二个for循环语句的后面有一个分号,所以两个 for循环语句的执行语句为空。当两个for循环语句执行完后,再执行 printf语句输出一个星号。所以正确答案为选项D。1 2.B解析:当调用函数时,实参是一个数组名,则向函数传送的是数组 的首地址,函数中的形参可定义成以下三种形式:形参定义成数组;形参定义成可变长数组:形参定义为指针变量。23 .D解析:选项A插入和选项C删除因为有数据变更,因此会改变数 据元素之间的结构关系,而排序则因为顺序的改变会改变数据元素之间 的结构关系。24 .this- > data=data ; this- > data=data ; 解析:this- > data=data ;25.6060解析:本题主要考察C+中函数的调用和变量作用域的问题。 主函数中嵌套调用fun()函数,并将计算结果赋给变量X。而对于嵌套内 fun。函数,其实参与形参名称相同,函数体内部的局部变量c也与主函 数内的变量c名称相同,但由于形参与实参在存储区域里分别占有不同 的内存空间,因此互相之间没有任何干扰。函数fun()的作用是返回形参 a和b的乘积。由此可以得到函数嵌套调用的计算结果为:x=fun(fun(a, B) , C) =(a*B) *c=3*4*5=60o即程序输出为 60。26 .私有私有解析:通过在