2021年内蒙古自治区赤峰市全国计算机等级考试C++语言程序设计真题(含答案).docx
2021年内蒙古自治区赤峰市全国计算机等级考试C+语言程序设计真题(含答案)学校:班级:姓名:考号:一、L选择题(10题)1 .执行下列语句段后,输出字符“*”的个数是for(inti=50;i>1;-i)coutA.48B.49C.50D.512 .软件维护指的是()。A.对软件的改正、适应和完善B.维护正常运行C.配置新软件D.软件开发期的一个阶段3 .有以下程序,其输出结果是()。#include<iostream>usingnamespacestd;intmain()chara10=,1,2','3','45,'6,7',8,9,0,*p;inti=8;p=a+i;cout<<p-3<<endl;return0;A.6789B.6C.789D.,6'4 .已知:intm=10:在下列定义引用的语句中,正确的是A.int&x=m;B.inty=&m;C.int&z;D.int&t=&m;5.关于类型转换的说法中,错误的是()。A.如果a为血型变量,b为Char型变量,则a+b的值为血型B.如果a为float型变量,b为int型变量,贝Ja-b的值为float型C.如果a为double型变量,b为float型变量,则a*b的值为double型D.如果a为血型变量,b为血型变量,则a/(double)b的值为int型6.C+语言中的基本数据类型是()。A.整型、浮点型、逻辑型、无值型和类类型B.整型、字符型、浮点型、无值型和逻辑型C.整型、浮点型、字符型、逻辑型和枚举型D.整型、浮点型、逻辑型、无值型和指针型7 .有如下函数模板的定义:template<classT>Tfunc(Tx,Ty)returnx*x+y*y;在下列对func()的调用中,不正确的是()。A.func(3,5);8 .func<>(3,5);C.func(3,5.5);D.func<int>(3,5.5);8 .下列程序的执行结果为#include<iostream.h>voidmain()inta=3,b=0;int*p=&a;b=+a+;cout<<*p<<<<b<<endl;A.3,4B.4,3C.3,4D.4,49 .阅读下面的程序:#include<iostream.h>voidmain()intx;cin>>x;if(x+>5)cout<<x<<endl;elsecout<<x<<endl;如果两次执行上述程序,且键盘输入分别为4和6,则输出结果分别是()。A.4,6B.3,6C.417D.5,710 .关于关键字class和typename,下列表述正确的是A.程序中所有的typename都可以替换为classB.程序中所有的class都可以替换为typenameC.A)和B)都正确D.A)和B)都不正确二、单选题(13题)11 .有如下数组声明:intnum10;,下标值引用错误的是()oA.num10B.num5C.num3D.num012 .有如下类定义和变量定义:classParentspublic:intpublicuata;private:intprivateData;);classChildArpublicParents*类体略*;classChildBzprivateParents*类体略*/);ChildAa;ChildBb;下列语句中正确的是A.cout<<B.cout<<C.cout<<D.cout<<13 .假定MyQaSS为一个类,那么下列的函数说明中,()为该类的析构函数。A.voidMyCIassO;B.MyClass(int);C.MyClass();D.MyCIassO;14 .待排序的关键码序列为(33,18,9,25,67,82153,95,12,70),要按关键码值递增的顺序排序,采取以第一个关键码为基准元素的快速排序法,第一趟排序后关键码33被放到第()个位置。A.3B.5C.7D.915 .设有Intx=Il;",则表达式(x+*2/3)的值是()。A.7B.8C.llD.1216 .下面程序的运行结果为()°#include<iostreamh>voidswap(int&a,intb)inttemp;temp=a+;a=b:b=temp:Jvoidmain()inta=2,b=3;swap(a,b);cout<<a<<"1"<<b<<endl;A.2,3B.3t2C.2,2D.3t317 .有如下程序:ftinclude<iostream>usingnamespacestd;inti=l;classFunpublic:staticinti;intvaluereturni1;intvalueconstreturni+1;);intFun:i=2;int intmain i=3;Funfunl;constFunfun2:return0;若程序的输出结果是:123则程序中下画线处遗漏的语句是()。Acout<<funl.value<<Fun:i<<fu2.value;B.tout<<Fun:i<<funl.value<<fu2.value;C.cout<<funl.value<<full2.value<<Fun:i:D.eout<<fu2.value<<Fun:i<<funl.value;18 .程序设计方法要求在程序设计过程中A先编制出程序,经调试使程序运行结果正确后再画出程序的流程图B.先编制出程序,经调试使程序运行结果正确后再在程序中的适当位置处加注释C先画出流程图,再根据流程图编制出程序,最后经调试使程序运行结果正确后再在程序中的适当位置处加注释D.以上三种说法都不对19 .有类定义如下:classTypepublic:TyPe(inti=0);Typeoperator-(int);friendTypeoperator+(Type,Type);private:intval;);若有对象定义TyPecl;则下列语句序列中,错误的是A.Type(3)+cl;B,cl+Type(3);C.3-cl;D.cl-3;20 .已知n是一个int型变量,下列语句中错误的是()。A.long*p=newlongn;B.ongpn;C.long*p=newlong(n);D.longp10;21 .有如下函数定义:VOidfUnC(inta,int&B.a+;b+;)若执行代码段:intx=O,Y=1;fuC(X,Y);则变量X和y的值分别是()。A.0和1B.1和Ico和2D.1和222 .已知表达式+a中的”+”是作为成员函数重载的运算符,则与+a等效的运算符函数调用形式为OA.operator+(1)B.operator+(a)C.operator+(a,l).operator+()23 .下列关于类和对象的叙述中,错误的是()oA.一个类只能有一个对象B.对象是类的具体实例C类是对某一类对象的抽象D.类和对象的关系是一种数据类型与变量的关系三、2.填空题(12题)24 .阅读下面程序:#include<iostream>usingnamespacestd;intfun(inta,intb)(intc;c=a*b;returnc;)intmain()(inta=3,b=5,c=4,x=0;x=fu(fun(a,b),c);cout<<x<<endl;return0;)其运行结果是【25 .下列程序运行后的输出结果是o#include<iostream.h>voidmain()(ints=0,kfor(k=7;k>=0;k-)(switch(k)(case1:case4:case7:s+;break:case 2 :case 3 :case6:break;case0:case5:s+=2;break;)26 .软件结构是以【】为基础而组成的一种控制层次结构。27 .有以下程序段:#include<iostream.h>#defineMIN(x,y)(x)<(y)?(x):(y)voidmain()(iti,j,k;i=10;j=15;k=10*MIN(itj);cout<<k<<endl;)程序执行后的输出结果是【】。28 .下列程序在构造函数和析构函数中申请和释放类的数据成员int*a,申请时使用形参b初始化a,请填空。classA(public:A(intb);A();private:int*a;);A:A(intb)(1;)A:A()(1;)29 .在面向对象方法中,描述的是具有相似属性与操作的一组对象。30 .派生类构造函数的执行顺序是先执行【】的构造函数,然后执行成员对象的构造函数,最后执行【】的构造函数。31 .在一个C+程序中,每个变量都必须遵循【】的原则。32 .以下程序段的输出结果是【】。intXti;for(i=l;i<=100;i+)x=i;if(+÷x%2=0)if(+x%3=0)if(+x%7=0)cout<<i<<,t')33 .在下面横线上填上适当的语句,完成程序。#include<iostream>usingnamespacestd;classBase(intx;public:Base(inti)x=i;Base()Q;classDerived:publicBase(public:完成类DeriVe构造函数的定义);intmain()(DerivedObj;return0;)在横线处应填入的语句是【34 .在面向对象方法中,类的实例称为35 .下面程序的输出是:*5.235.23*请将下划线上遗漏的部分补充完整。#include<iostream>#include<iomanip>usingnamespacestd;voidmain()doublei=5.23;cout<<<<setw(14)<<icout<<endl<<<<setw(14)<<i;)四、程序改错题(10题)36 .使用VC+6.0打开考生文件夹下的源程序文件Lcpp,该程序运行有问题,请改正main函数中的错误,使程序的输出结果为:number=1number=10number=100注意:不要改动main函数,不能增加或删除行。也不能更改程序的结构,错误的语句在/*crror*的下面。试题程序:ftinclude<iostream,h>classTC(public:TC(inti)(number=i;)VoidSetNumber(intm)(number=m;)intGetNumberconst(returnnumber;)VoidPrintconst(cout«/number=z"«number«endl;)private:intnumber;:voidmain/*error*TCobjl;objl.Print;TCobj2(3);/*error*objl.number=10;/*error*%o*TC.SetNumber(100);objl.Print;obj2.Print;'37 .使用VC+6.0打开考生文件夹下的源程序文件l.cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果为:sizeof(Sl)=5sizeof(s2)=10sizeof(s3)=l注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。不能删除assert()语句。只能修改后面的数字。提示:assert函数如果为假,则会产生一个中断异常。试题程序:#include<iostream.h>#include<assert.h>Voidmain()(char*sl=,abc":/*pQ*assert(sizeof(sl)=3):cout<<,sizeof(sl)=5"<<endl;chars210=,ab":/*pQ*assert(sizeof(s2)=2);cout<<"sizeof(s2)=10"<<endl;chars3=23:/*pQ*assert(sizeof(s3)=4);cout<<,sizeof(s3)=l"<<endl;return;)38 .使用VC+6O打开考生文件夹下的源程序文件1.cpp,该程序运行时有错误,请改正程序中的错误。本程序要求实现的功能为从键盘输入一个字符串,并将结果保存到文件1txt中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。试题程序:#include<iostream>#include<fstream>/*fPQf*usingstd;voidWriteFile(char*s)(Ofstreamoutl;/*pQ*Outl.open("l.txt",binaryapp);for(inti=0;si!=0;i+)/*pQ*Outl.puts(si);)Outl.close;)VoidCIearFiIe(Ofstreamoutl;outl.open("l.txt");outl.close;)intmain(chars1024;CIearFiIe;cout<<"pleaseinputastri9:"<<endl;ci.getline(s,1024);WriteFiIe(三);return;)39 .使用VC+6.0打开考生文件夹下的源程序文件Lcpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个CatCh必须抛出执行的任何异常。程序异常,输出信息为errorOERROR注意:不要改动IIIain函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。试题程序:ttinclude<iostream,h)intmain(try(throw(,errorz*);)/*error*catch(chars)(cout<<s<<endl;try(throw(int)0);/*error*catch(cout<<i<<endl;)try(throw(0);throw("error");)/*error*catch(cout<<z,ERROR,z<<endl;)returnO;)40 .使用VC+6.0打开考生文件夹下的源程序文件Lcpp。本程序要求输入一个字符串,然后将其中的小写字母改成大写字母,字符可能输入多行,当输入字符“?”时,默认字符输入结束,最后把结果输出到屏幕中。注意:不要改动ITIain函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。试题程序:ftinclude<iostream,h>voidmain(inti=O;charstr120;cout<<z,Enterastringendwith?.zz<<endl;/*error*cin.getline(str,120);/*error*while(str)(/*error*if(stri)=a)stri=stri-a+A;i+;)cout<<str<<endl;return;41 .使用VC+6.0打开考生文件夹下的源程序文件l.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<<"number="<<number<<endl;)private:intnumber;);Voidmain(/*fQf*TCobjI;objl.Print;TCobj2(3);/*fQ*objl.number=10;/*Qf*%Q*TC.SetNumber(100);objl.Print;obj2.Print;)42 .使用VC+6.O打开考生文件夹下的源程序文件Lcpp,该程序运行时有错误,请改正错误,使程序正常运行,并且要求最后一个CatCh必须抛出执行的任何异常。程序异常,输出信息为error0ERROR注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。试题程序:ftinclude<iostream,h)intmain(trythrow("error");/*error*catch(chars)(cout<<s<<endl;try(throw(int)0);/*error*catch(cout<<i<<endl;)try(throw(0);throw("error");)/*error*catch(cout<<z,ERROR,z<<endl;)returnO;)43 .使用VC+60打开考生文件夹下的源程序文件1cpp°本程序要求输入一个字符串,然后将其中的小写字母改成大写字母,字符可能输入多行,当输入字符时,默认字符输入结束,最后把结果输出到屏幕中。注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。试题程序:#include<iostream.h>Voidmain(inti=O;charstr120;cout<<"Enterastringendwith?."<<endl;/*Qf*cin.getline(str,120);/*(fQ*while(str)/*pQ*if(stri)=a)stri=stri-a+A;i+;)cout<<str<<endl;return;)44 .使用VC+6.0打开考生文件夹下的源程序文件Lcpp,该程序运行时有错,请改正其中的错误,使程序正常运行,输出的结果为Constructor,i=0,Destructor注意:错误的语句在/*Crror*的下面,修改该语句即可。试题程序:include(iostream,h)classTC(inti;public:TC;voiddisplay;TC;);/*crro*TC:TC(COUt“Constructor"。",";i=0;)/*erro*TC:display(tout<<z4=,z<<i<<,zz<<endl;/*erro*TC:TC(COUI<<zzDestructorzz<<endl:voidmainTCa;a.display;45 .使用VC+6.O打开考生文件夹下的源程序文件Lcpp,但该程序运行有问题,请改正main函数中的错误,使该程序的输出结果正确。程序输出:88注意:错误的语句在/*crror*/的下面。修改该语句即可,其他的语句不能修改。试题程序:#include(iostream,h>classCO(public:/*crror*/Staticintn=O:CO(n+:C0(n一:/*error*/intCO:n;voidmain(COobj;COobj27;CO*C=NULL:c=&obj:/*°rror*/eout<<C.n<<endl;cout<<CO::n<<endl;五、综合应用题(2题)46 .使用VC+6.O打开考生文件夹下的源程序文件3cpp。其中定义的类不完整,按要求完成下列操作,将类的定义补充完整。每卖出一个水果,则计算水果的重量,还要计算所有卖出水果的总重量以及总个数,同时允许退货,请按照以下的操作,把类补充完整。(1)定义类TCFruit的私有静态数据成员float型变量Anweight和int型变量AllNO,请在注释1后添加适当的语句。(2)完成类TCFruit的带一个float型变量W的构造函数,并把这个w加到AlIWeight中,并且AnN。自加。请在注释2后添加适当的语句。(3)在析构函数中,在AnWeight中减去Weight,然后AIINO自减,请在注释3后添加适当的语句。(4)完成静态成员变量的初始化为0,请在注释4后添加适当的语句。注意:增加或者修改代码的位置己经用符号表示出来,请不要修改其他的程序代码。试题程序:include(iostream,h>ClassTCFruit(private:floatWeight;StaticintAllNo;public:TCFruit(floatw)(/亭*亭*2*亭*亭亭Al!Weight÷=w:AllNo+:)TCFruit(/*3*AllWeight-=Weight:voiddisplay(cout«/?SelIaFruitwithz,<<Weight<<,k9zz<<endl;cout<<wAllsellnumber:,<AllNo<<endl;cout<<z,AlIsel!weight:,<<A1lWeight<<,zk9,z<<endl<<endl;/*4*floatTCFruit:AllWeight=O.0;intmainTCFruitFruitl(1.2);Fruitl.display;TCFruitFruit2(2.3);Fruit2.display;returnO;47 .应添加*BA(intm)a=m;"o(2)应添加,PAI(itm,intn):BA()b=m;"o应添力IluPA2(intm,intn,intk):PAI(n,k)C=m;)"。应添加"cout<<geta<<""<<getb<<""<<C<<endl;"0【解析】根据第1处要求,构造函数的函数名和类名一致,显然BA构造函数的名称为BA1在BA中通过参数m完成对成员变量a的赋值,因此构造函数的名称为BA(intm),在函数内部对成员a赋值,故第1处的语句应添加"BA(intm)a=m;)”。根据第2处的要求,构造函数的形式为,PAI(intm,intn)",m赋值给PAl类成员b,将n作为基类BA构造函数的参数值传入,故第2处应添加"PAl(intm,intn):BA(n)b=m;"。根据第3处的要求,函数形式为PA2(intm,intn,intk),在构造函数中将m赋值给数据成员c,将n和k分别赋值给基类PAI构造函数的参数m和n,因此第3处应添加“PA2(intm,intn,intk):PAl(n,kXC=m;"。根据第4处的要求,PA2类公有派生于PAL而PAI公有派生于BA,因此在PA2类中可以调用基类的geta和getb来获得基类私有成员a和b,再输出PA2的私有成员C即满足要求,因此第4处应添加“cout<<geta<<""<<getb<<""<<C<<endl;"。六、3.综合应用题(2题)48 .使用VC6打开考生文件夹下的工程test34_3。此工程包含一个test34_3,cpp,其中定义了表示栈的类StaCk。源程序中StaCk类的定义并不完整,请按要求完成下列操作,将程序补充完整。定义类stack的私有数据成员sp和SiZe,它们分别为整型的指针和变量,其中sP指向存放栈的数据元素的数组,size为栈中存放最后一个元素的下标值。请在注释7*1-之后添加适当的语句。完成类stack的构造函数,该函数首先从动态存储空间分配含有100个元素的int型数组,并把该数组的首元素地址赋给指针sp,然后将该数组的所有元素赋值为0,并将size赋值为-I(SiZe等于-1表示栈为空)。请在注释7*2*n之后添加适当的语句。完成类stack的成员函数push的定义。该函数将传入的整型参数X压入栈中,即在size小于数组的最大下标情况下,SiZe自力口L再给X赋值。请在注释"*3*”之后添加适当的语句。完成类StaCk的成员函数PoP的定义,该函数返回栈顶元素的值,即在SiZe不等于-1的情况下,返回数组中下标为SiZe的元素的值,并将SiZe减1。请在注释“*4*"之后添加适当的语句。程序输出结果如下:thetopelem:1thepopelem:1thestackisempty注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。源程序文件test34_3.cpp清单如下:#include<iostream.h>classstack(/*public:stack();boolempty()retursize=-1;boolfull()returnsize=99;)voidpush(intx);voidpop();voidtop(););stack:stack()(/*2*for(inti=0;i<100;i+)*(sp+i)=0;size=-l;)voidstack:push(intx)(/*3*cout<<"thestackisfull"<<edl;else(size+;*(sp+size)=x;)voidstack:pop()(/*4*cout<<"thestackisempty"<<endl;else(cout<<"thepopelem:"<<*(sp+size)<<endl;size-;)voidstack:top()(ifiempty()cout<<"thestackisempty"<<endl;else(cout<<"thetopelem:"<<*(sp+size)<<endl;)voidmain()(stacks;s.push(l);s.top();spop();s.top();)49 .使用VC6打开考生文件夹下的工程testl3_3。此工程包含一个testl3-CPp,其中定义了类VeCtor,但类的定义并不完整。请按要求完成下列操作,将程序补充完整。完成构造函数的定义,把数据成员SiZe初始化为参数S的值,数据成员buffer指向动态申请的im型SiZe大小的空间。请在注释“*"*”之后添加适当的语句。完成拷贝构造函数的定义,注意解决多次删除的问题。请在注释“*2*"之后添加适当的语句。完成成员函数eem的定义,该函数返回buffer的第nd×个元素的值,注意如果d×超界,请输出uerrorinindex*10请在注释7*3*n之后添加适当的语句。完成析构函数的定义,要求先将字符d打印在屏幕上,再释放buffer指向的空间。请在注释之后添加适当的语句。输出结果如下:1234567891012345678910dd注意:除在指定的位置添加语句外,请不要改动程序中的其他语句。源程序文件testl3.3清单如下:#include<iostream.h>#include<stdlib.h>classVector(public:Vector(ints=100);Vector(Vector&v);int&elem(intndx);voiddisplay();voidset();Vector();protected:intsize;int*buffer;);Vector:Vector(ints)(|/*)Vector:Vector(Vector&v)(/*2*for(inti=0;i<size;i+)(*(buffer+i)=*(v.buffer÷i);)int&Vector:elem(intndx)(/*3*(cout<<"errorinindex"<<endl;exit(l);)returnbufferndx;)voidVector:display()(for(intj=0;j<size;j+)cout<<elem(i)<<endl;)voidVector:set()(for(intj=0;i<size;j+)elem(j)=j+l;)Vector:Vector()(/*4*)voidmain()(Vectora(10);Vectorb(a);a. set();b. set();a. display();b. display();)参考答案1.B解析:for(inti=50;i>l;-i),i为502,故打印49个*。2 .A3 .A解析:没有下标的数组名是一个指向该数组首元素的指针,本程序实现的功能是将字符“6”及其以后的字符按字符串形式输出。4 .A解析:本题考核引用的定义。C+的引用是一种赋值、发送和返回复杂数据结构的方法,应用这种方法,系统不需要负担额外的开销,节省内存空间。建立引用的格式为:类型u3000&引用名=已定义的变量名;。所以只有A选项是符合要求的。5 .D解析:C+中数据类型转换有两类,即隐式类型转换和显式类型转换。隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算。赋值时,会把所赋值的类型转换为与被赋值变量类型一样。隐式类型转换按从低到高的顺序进行。显式类型转换是由程序员显式指出的类型转换,使用显式类型转换的好处是,编译器不必自动进行两次转换,而由程序员负责类型转换的正确性。由此可知选项D中a/(double)b的值应为double型。6 .B7C解析:本题考核函数模板的使用。对于C)选项,编译系统从3获得的信息是“T对应于int”,从5.5处获得的信息是“T对应于double”,二者相互矛盾,在编译时会产生错误。对于D)选项中紧跟在函数名后的<int>就是模板实参表,通过它通知编译系统在调用过程中,d。UbIe型的参数5.5将被自动换成int型。8.B解析:*p为所指对象a的值,语句-b=+a+;”等价于,b=b+a;a=a+l;"。9 .D解析:此题首先读入数值4赋给变量X,因为x+>5不成立,因为“+”后缀,之后X的值变为5,执行语句CoUt<<x-<<endl;输出:5,之后X的值变为4。当读入的数值是6时,因为X+>5成立,所以执行语句Collt<<x<<endl;输出7。10 .A解析:本题考核模板的概念。C+中,模板形参具有三种形式:(Dtypename<参数名>.(2)CIaSs<参数名>,(3)<类型修饰符><参数名>,前两种形式是等价的,在声明模板参数时,关键字typename和class可以互换。但是在定义类的程序中,关键字CIaSS代表的含义是类,此时不能用typename代替。ILAA。【解析】数组定义中的数字指的是数组的大小,而下标是从。开始的,所以数组的最后一个元素是num9o12.A13 .D解析:本题考核类的析构函数。在C+中,析构函数名为符号加类名,析构函数没有参数和返回值。根据以上知识可知,MyCIass类的正确析构函数的说明为MyClass()o14.BB.【解析】快速排序的基本思想是:从表中选取一个元素(如本题中的33),将表中小于此元素的移到前面,大于此元素的移到后面,结果把线性表分割成两部分(两个子表),此元素插入到其分界线的位置处。然后分别对两个子表再次分割本题中33作为分割的中界线,第一趟排序后排在比它小的18、9、25、12后面。15.A