国家二级C++机试(操作题)模拟试卷6(共26题)_第1页
国家二级C++机试(操作题)模拟试卷6(共26题)_第2页
国家二级C++机试(操作题)模拟试卷6(共26题)_第3页
国家二级C++机试(操作题)模拟试卷6(共26题)_第4页
国家二级C++机试(操作题)模拟试卷6(共26题)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C++机试(操作题)模拟试卷6(共9套)(共26题)国家二级C++机试(操作题)模拟试卷第1套一、基本操作题(本题共1题,每题1.0分,共1分。)1、使用VC6打开考生文件夹下的源程序文件modi1.cpp,该程序运行时有错误,请改正其中的错误,使程序正常运行,并且输出以下结果:(4,5)7,8(4,8)注意:错误的语句在//******error******的下面,修改该语句即可。1#include<iostream.h>2classCObj03{4public:5CObj0(inti,intj)6{7x=i;8y=j;9}10//********error********11virtualvoidmove(inta;intb)12{13x+=a;14y+=b;15}16voidprint()17{18tout<<’’(’’<<x<<’’,’’<<y<<’’)’’<<end1;19}20public:21intx,y;22};23classCObj1:publicCObj024{25public:26//******error******27CObj1(inti,intj,intk):(i,j)28{29m=k;30n=1;31}32voidprint()33{34cout<<m<<’’,’’<<n<<end1;35}36voidfunc()37{38move(3,5);39}40voiddisplay()41{42//******error******43print();44}45private:46intm,n;47};48voidmain()49{50CObj0obj(4,5);51obj.print();52CObj1obj1(1,3,7,8);53obj1.func()j54obj1.print();55obj1.display();56}标准答案:(1)virtualvoidmove(inta,intb)(2)CObj1(inti,intj,intk,int1):CObj0(i,j)(3)CObj0::print();知识点解析:程序中定义了CObj0和CObj1两个类,CObj1公有派生于CObj0,CObj0有两个public成员变量x和y,CObj1有2个private成员变量m和n,CObj0的print函数打印x和y的值,CObj1的print函数打印m和n的值,display函数调用基类的print函数打印CObj1的x和y的值。(1)编译程序可知第1标识下有错误,此处是声明虚函数,虚函数的声明方式为:virtual<类型说明符><函数名>(<参数表>),参数表中各参数之间应该用“,”隔开,因此第1个标识下应改为“virtualvoidmove(inta,intb)”。(2)在主函数里“CObj1obj1(1,3,7,8);”,可知构造函数CObjl()有四个参数,完成变量m、n、x和y的初始化,k和1赋值给m和n,i和i赋值给x和y,x和y的初始化可通过基类构造函数来完成对x和y的初始化,第2个标识下应改为CObj1(inti,inti,intk,int1):CObj0(i,j)。(3)由程序运行结果可知标识3下调用的是基类的print()函数,而“print();”:是调用的派生类的print()函数,因此此时只能通过类名来直接调用print()函数,即第3个标识下应改为“CObj0::print0;”。二、简单应用题(本题共1题,每题1.0分,共1分。)2、使用VC6打开考生文件夹下的源程序文件modi2.cpp。阅读下列函数说明和代码。函数sort(int&m,int&n,int&1)实现将三个整数in、n、1由大到小输出。in最大,1最小。程序分析:程序实现时,可以把最大的数放到m上,先将m与n进行比较,如果m<n则将m与n的值进行交换,然后再用m与1进行比较,如果m<1则将in与1的值进行交换,这样能使m最大。然后再将n与1进行比较,若n<1则将n与1的值互换,互换后则1最小。将函数sort(int&m,int&n,int&1)补充完整,实现三个数的排序。注意:请勿改动主函数。1#include<iostream.h>2voidsort(int&m,int&n,int&1)3{45}6intmain()7{8intx=9;9inty=13;10intx=-3;11sort(x,y,Z);12cout<<x<<’,’<<y<<’,’<<z<<end1;13return0;14}标准答案:1intt;2if(m<n)3{t=m;m=n;n=t;)/*交换x,y的值*/4if(m<1)5{t=m;m=l;l=t;)/*交换v,z的值*/6if(n<1)7{t=n;n=1;1=t;}/*交换z,y的值*/知识点解析:sort函数实现3个参数的从大到小的排序,可以采用很多方法来排序,比如选择法排序、冒泡法排序等,这里要求采用比较的方法来实现排序,由于需要排序的数据较少,只有3个,逐个比较就可以找到最大最值小进行排序。(1)由审题分析可知,三次比较便可将m、n、1排序。(2)在实现时,先将m与n进行比较,如果m<n则将m与n的值进行交换,然后再用m与1进行比较,如果m<1则将m与1的值进行交换,这样能使m最大。然后再将n与1进行比较,若n<1则将n与1的值互换,互换后则1最小,这样就得到m最大,1最小的排序结果。(3)在sort函数内用三个if比较即可,条件成立则进行交换。三、综合应用题(本题共1题,每题1.0分,共1分。)3、使用VC6打开考生文件夹下的源程序文件modi3.cpp。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。完成以下功能:(1)定义类CPoint的带有两个参数的构造函数,两个变量为x、y都为int型,且缺省值为0。请在注释//********1********后添加适当的语句。(2)完成类CRectangle的构造函数,给point1和point2进行赋值。请在注释//********2********后添加适当的语句。(3)完成类CRectangle的函数GetArea(),用来计算矩形面积。请在注释//********3********后添加适当的语句。(4)定义CRectangle类,拥有两个私有对象point1和point2,类型为Point,请在注释//********4********后添加适当的语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。1#include<iostream.h>2#include<cmath>3C1assCPoint4{5public:6//********1********78{9x=i;10y=j;11}12intGetX()13{14returnx;15}16intGetY()17{18returnY;19}20private:21intx,y;22};23classCRectangle24{25public:26//********2********2728{29}30intGetArea()31{32//********3********3334intheight=point1.GetY()-point2.GetY();35return(width*height)?width*height:-width*height;36}37intGetGirth()38{39intwidth=abs(point1.GetX()-point2.GetX());40intheight=abs(point1.GetY()-point2.GetY());41return(2*(width+height));42}43private:44//********4********4546CPointpoint2;47};48intmain()49{50CRectanglerect(5,2,13,18);51cout<<rect.GetArea()<<end1,52cout<<rect.GetGirth()<<end1,53return0;54}标准答案:(1)添加语句:CPoint(inti=0,intj=0)(2)添加语句:CRectangle(inttop,intlefttintrightfintbottom):point1(top,left),point2(right,bottom)(3)添加语句:intwidth=point1.GetX()-point2.GetX();(4)添加语句:CPointpoint1;知识点解析:程序中定义了CPoint和CRectangle两个类,分别表示点坐标类和矩形类,点坐标类有2个私有成员变量x和y表示坐标值,矩形类有2个CPoint成员。函数GetArea()用来计算矩形面积,可由矩形的长和宽计算得到,同样GetGirth()函数返回矩形的周长也可由长和宽得到。主函数内定义一个CRectangle对象,分别调用GetArea()和GetGirth()计算面积和周长,然后打印计算结果。(1)在第1个标识下添加构造函数定义,该构造带有两个参数x和y的构造函数,x、y都为int型,缺省值为0,因此第1个标识下应添加CPoint(inti=0,intj=0)。(2)第2个标识下通过Cpoint类的构造函数来完成Crectangle类成员的初始化,在函数体内没有任何函数语句,因此其初始化过程是在初始化列表里完成的,通过调用基类的构造函数来实现两个私有对象point1和point2的初始化,故第2个标识下应添加CRectangle(inttop,intleft,intright,intbottom):point1(top,left),point2(right,bottom)。(3)面积为矩形的长宽之积,因此先计算矩形的长和宽,可由两个Cpoint对象的x坐标相减计算得到,CPoint对象的x坐标为私有成员,只能通过公有接口函数调用获得,因此第3个标识下为“intwidth=point1.GetX()-point2.GetX();”。(4)Crectangle类的成员变量为两个Cpoint对象成员point1和point2,第4个标识下补充point1的定义,故第4个标识下应添加“CPointpoint1:”。国家二级C++机试(操作题)模拟试卷第2套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,此工程中包含了类Pets(“宠物”)和主函数main的定义。程序中位于每个“//ERROR****found****”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为:Name:sonnyType:dogName:JohnType:dogName:DannyType:catName:JohnType:dog注意:只修改每个“//ERROR****found****”下的那一行,不要改动程序中的其他内容。#include<iostream>usingnamespacestd;enumPets_type{dog,cat,bird,fish};classPets{private:char*name;Pets_typetype;public:Pets(constchar*name="sonny",Pets_typetype=dog);Pets&operator=(constPets&s);~Pets();voidshow()const;};Pets::Pets(constchar*name,Pets_typetype)//构造函数{this一>name=newchar[strlen(name)+1];strcpy(this一>name,name);//ERROR*******found*******type=type;}Pets::~Pets()//析构函数,释放name所指向的字符串{//ERROR*******found*******name=’/0’;}Pets&Pets::operator=(constPets&s){if(&s==this)//确保不要向自身赋值return*this;delete[]name;name=newchar[strlen(s.name)+1];//ERROR*******found*******strcpy(this一>name,name);type=s.type;return*this;}voidPets::show()const{cout<<"Name:"<<name<<"Type:";switch(type){casedog:cout<<"dog";break;casecat:cout<<"cat";break;casebird:cout<<"bird";break;casefish:cout<<"fish";break;}cout<<endl;}intmain(){Petsmypet1,mypet2("John",dog);Petsyoupet("Danny",cat);mypet1.show();mypet2.show();youpet.show();youpet=mypet2;youpet.show();return0;}标准答案:(1)this一>type=type;(2)delete[]name;(3)strcpy(t.his一>name,s.name);知识点解析:(1)主要考查考生对构造函数的掌握情况,因为形参名和类的私有成员名称都是type,为了避免混淆,所以规定类的私有成员使用this指针调用,即:this一>type=type;。(2)主要考查考生对析构函数的掌握情况,题目中要求,释放name所指向的字符串。要释放name指针用delete语句,即delete[]name;。(3)主要考查考生对strcpy函数的掌握情况,strcpy函数的形参为两个字符串,而name为指向字符串的指针,因此使用语句:strcpy(this—>name,s.name);。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,此工程中包含一个头文件shape.h,其中包含了类Shape、Point和Triangle的声明;包含程序文件shape.cpp,其中包含了类Triangle的成员函数和其他函数的定义;还包含程序文件proj2.cpp,其中包含测试类Shape、Point和Triangle的程序语句。请在程序中的横线处填写适当的代码并删除横线,以实现上述功能。此程序的正确输出结果应为:此图形是一个抽象图形,周长=0,面积=0此图形是一个三角形,周长=6.82843,面积=2注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。//shape.hclasSShape{public:virtualdoubleperimeter()const{return0;}//返回形状的周长virtualdoublearea()const{return0;}//返回形状的面积virtualconstchar*name()const{return"抽象图形";}//返回形状的名称};classPoint{//表示平面坐标系中的点的类doublex;doubley;public://**********found**********Point(doublex0,doubley0):_________{}//用x0、y0初始化数据成员x、ydoublegetX()const{returnx;}doublegetY()const{returny;}};classTriangle:publicShape{//**********found**********______________;//定义3个私有数据成员public:Triangle(Pointp1,Pointp2,Pointp3):point1(p1),point2(p2),point3(p3){)doubleperimeter()const;doublearea()const;constchar*name()const{return"三角形";}};//shape,cpp#include"shape.h"#include<cmath>doublelength(Pointp1,Pointp2){returnsqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));}doubleTriangle::perimeter()const{//一个return语句,它利用length函数计算并返回三角形的周长//**********found**********__________;}doubleTriangle::area()const{doubleS=perimeter()/2.0;returnsqrt(S*(s—length(pointl,point2))*(s—length(point2,point3))*(s—length(point3,pointl)));}//proj2.cpp#include"shape.h"#include<iostream>usingnamespacestd;//*********found**********___________//show函数的函数头(函数体以前的部分){cout<<"此图形是一个"<<shape.name()<<",周长="<<shape.perimeter()<<",面积="<<shape.area()<<endl;}intmain(){Shapes;Triangletri(Point(0,2),Point(2,0),Point(0,0));show(s);show(tri);return0;}标准答案:(1)x(x0),y(),0)(2)P0intpoint1,point2,point3(3)returnlength(point1,point2)+length(point1,point3)+length(point2,point3)(4)voidshow(Shape&shape)知识点解析:(1)主要考查考生对构造函数的掌握,题目要求用X0、y0初始化数据成员x、y,因此在这里使用成员列表初始化,即:Point(doublex0,doubley0):x(x0),y(y0){}。(2)主要考查考生对构造函数的掌握,题目要求定义3个私有数据成员。由构造函数可知3个私有数据成员的类型都是Point,名称分别为point1、point2和point3,因此空格处填写:Pointpoint1,point2,point3。(3)主要考查考生对成员函数的掌握,题目要求使用return语句,利用length函数计算并返回三角形的周长。length函数返回的是两点间的距离,因此return语句只要返回三角形三条边的距离和,即为三角形的周长。(4)主要考查考生对成员函数的掌握,这里要定义show函数的函数头(函数体以前的部分)。由主函数main中show函数的使用情况show(s)和show(tri)可知,s是Shape类,tri是Triangle类,因为Triangle是Shape类的派生类,所以可知show函数的参数是Shape类型,无返回值,得出语句voidshow(Shape&shape)。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,该文件中定义了用于表示日期的类Date、表示人员的类Person和表示职员的类Staff;程序应当显示:张小丽123456789012345但程序中有缺失部分,请按以下提示把缺失部分补充完整:(1)在“//**1******found****”的下方是析构函数定义中的语句,它释放两个指针成员所指向的动态空间。(2)在“//**2******found****”的下方是rename函数中的一个语句,它使指针name指向申请到的足够容纳字符串new_name的空间。(3)在“//**3******found****”的下方是构造函数定义的一个组成部分,其作用是利用参数表中前几个参数对基类Person进行初始化。注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“****found****”。填写的内容必须在一行中完成,否则评分将产生错误。//proj3.cpp{}include<iostream>usingnamespacestd;classPerson{char*idcardno;//用动态空间存储的身份证号char*name;//用动态空间存储的姓名boolismale;//性别:true为男,false为女public:Person(constchar*pid,constchar*pname,boolpmale);~Person(){//**1*********found*******_______;}constchar*getIDCardNO()const{returnidcardno;)constchar*getName()const{returnname;)voidrename(constchar*new_name);boolisMale()const{returnismale;}};classstaff:publicPerson{char*department;doublesalary;public:staff(constchar*id_card_no,constchar*p_name,boolis_male,constchar*dept,doublesal);~staff(){delete[]department;)constchar*getDepartment()const{returndepartment;}voidsetDepartment(constchar*d);doublegetSalary()const{returnsalary;}voidsetSalary(doubles){salary=s;}};Person::Person(constchar*id_card_no,constchar*p_name,boolis_male):ismale(is_male){idcardno=newchar[strlen(id_card_no)+1];strcpy(idcardno,id_card_no);name=newchar[strlen(p_name)+1];strcpy(name,p_name);}voidPerson::rename(constchar*new_name){delete[]name;//**2*********found*******_________;strcpy(name,new_name);}Staff::Staff(constchar*id_card_no,constchar*p_name,boolis_male,//**3*********found*******constchar*dept,doublesal):______{department=newchar[strlen(dept)+1];strcpy(department,dept);salary=sal;}voidStaff::setDepartment(constchar*dept){delete[]department;department=newchar[strlen(dept)+1];strcpy(department,dept);}intmain(){StaffZhangsan("123456789012345","张三",false,"人事部",1234.56);Zhangsan.rename("张小丽");cout<<Zhangsan.getName()<<Zhangsan.getIDCardNO()<<endl;return0;}标准答案:(1)delete[]idcardno,name(2)nalxle=newchar[strlen(new_name)+1](3)Person(id_card_no,p_name,is_male)知识点解析:(1)主要考查考生对析构函数的掌握,题目要求释放两个指针成员所指向的动态空间。释放动态空间应使用delete语句,因为要释放两个指针,使用语句:delete[]idcardno,name;实现。注意当释放多个指针时,中间用逗号隔开。(2)考查动态数组分配空间,题目要求指针name指向申请到的足够容纳字符串new_name的空间。使用strlen(new_name)得到字符串new_name的长度,但是这里要注意加1。(3)主要考查考生对派生类构造函数的掌握,题目要求利用参数表中前几个参数对基类Person进行初始化。派生类的构造函数要使用成员列表初始化法对基类初始化,因此为constchin*dept,doublesal):Person(id_card_no,p_name,is_male)。国家二级C++机试(操作题)模拟试卷第3套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,该工程中包含程序文件main.cpp,其中有类Foo和主函数main的定义。程序中位于每个“//ERROR****found****”之后的一行语句有错误,请加以改正。改正后程序的输出结果应该是:X=aY=42注意:只修改每个“//********found********”下的那一行,不要改动程序中的其他内容。#include<iostream>usingnamespacestd;classFoo{public:Foo(charx){x_=x;}chargetX()const{returnx_;}public:staticinty_;private:charx_;};//ERROR*******found*******intFoo.y_=42;intmain(intargc,char*argv[]){//ERROR*******found*******Foof;//ERROR*******found*******cout<<"X="<<f.x_<<endl;cout<<"Y="<<f.y_<<endl;return0;}标准答案:(1)intFoo::y_=42;(2)Foof(’a’);(3)cout<<"X="<<f.getX()<<endl;知识点解析:主要考查考生对静态成员的掌握,因为静态整型变量y_是Foo类的公有成员,所以给y_赋值时要加上“Foo::”,即intFoo::y_=42;。(2)主要考查考生对构造函数的掌握,题目要求程序输出:X=aY=42可以知道,在给Foo类的f声明时要同时初始化为字符a,即语句Foof(’a’);。(3)主要考查考生对成员函数的掌握,因为x是类Foo的私有成员,所以不能在main函数中直接调用,要通过公有成员函数getX()调用。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,该工程中包含程序文件main.cpp,其中有类Mammal(“哺乳动物”)、类Elephant(“大象”)、类Mouse(“老鼠”)的定义和主函数main的定义。请在横线处填写适当的代码并删除横线,以实现上述定义。此程序的正确输出结果应为:ELEPHANTMOUSE注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。#include<iostream>usingnamespacestd;enumcategory{ENPTY,ELEPHANT,NOUSE);char*output[]={"ENPTY","ELEPHANT","NOUSE"};classMammal{public:Mammal(char*str){//**********found**********name=new__________strcpy(name,str);}virtualchar*WhoAmI()=0;Virtual~Hammal(){delete[]name;}voidPrLnt(){cout<<WhoAmI()<<endl;}private:char*name;};classElephant:publicNammal{public://**********found**********Elephant(char*str):_____________{}char*NhoAmI(){returnoutput[ELEPHANT];}};classNouse:publicNammal{public:Mouse(char*str):Mammal(str){}//**********found**********char*WhoAmI(){__________)};intmain(){//**********found**********Mammal*pm=new_________("Huanhuan");pm->Print();deletepm;pm=newNouse("Nicky");pm->Print();deletepm;return0;}标准答案:(1)char[strlen(str)+1];(2)Mammal(str)(3)returnoutput[MOUSE];(4)Elephant知识点解析:(1)主要考查分配空间,程序要给name分配空间,由下一条语句中strcpy(name,str)可知程序要把字符串str复制给name,因此要分配的空间大小为strlen(str)+1。(2)主要考查考生对构造函数的掌握,因为Elephant类是Mammal类的派生类,所以其构造函数要使用成员列表先对Mammal类初始化。(3)主要考查考生对枚举类型的掌握,先看程序:enumcategory{EMPTY,ELEPHANT,MOUSE}。再参考Elephant类中的WhoAmI函数:chal*WhoA-mI(){returnoutput[ELEPHANT];}。可知这里要填写的返回语句为:returnoutput[MOUSE];。(4)主要考查考生对派生类的掌握,题目要求输出:ELEPHANTMOUSE可知,要先调用Elephant类的WhoAmI函数,因此给指针pm分配Elephant类空间。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,本题创建一个小型字符串类,字符串长度不超过100。程序文件包括proj3.h、proj3.cpp、writeToFile.obj。补充完成重载赋值运算符函数,完成深复制功能。屏幕上输出的正确结果应该是:Hello!Happynewyear!要求:补充编制的内容写在“//**********333**********水料”与“**********666**********”两行之间。不得修改程序的其他部分。注意:程序最后调用writeToFile函数,使用另一组不同的测试数据,将不同的运行结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件。//proj3.h#include<iostream>#include<iomanip>usingnamespacestd;classMiniString{public:friendostream&operator<<(ostream&output,constMiniString&s)//重载流插入运算符{output<<s.sPtr;returnoutput;}friendistream&operator>>(istream&input,MiniString&s)//重载流提取运算符{chartemp[100];//用于输入的临时数组temp[0]=’\0’;//初始为空字符串input>>setw(100)>>temp;intinLen=strlen(temp);//输入字符串长度if(inLen!=0){s.length=inLen;//赋长度if(s.sPtr!=0)delete[]s.sPtr;//避免内存泄漏s.sPtr=newchar[s.length+1];strcpy(s.sPtr,temp);//如果s不是空指针,则复制内容}elses.sPtr[0]=’\0’;//如果s是空指针,则为空字符串returninput;}voidmodString(constchar*string2)//更改字符串内容{if(string2!=0)//如果string2不是空指针,则复制内容{if(strlen(string2)!=length){length=strlen(string2);delete[]sPtr;sPtr=newchar[length+1];//分配内存}strcpy(sPtr,string2);}elsesPtr[0]=’\0’;//如果string2是空指针,则为空字符串}MiniString&operator=(constMiniString&otherString);MiniString(constchar*s=""):length((s!=0)?strlen(s):0)//构造函数{sptr=0;if(length!=0)setString(s);}~MiniString()//析构函数{delete[]sPtr;)private:intlength;//字符串长度char*sPtr;//指向字符串起始位置voidsetString(constchar*string2)//辅助函数{sPtr=newchar[strlen(string2)+1];//分配内存if(string2!=0)strcpy(sptr,string2);//如果string2不是空指针,则复制内容elsesPtr[0]=’\0’;//如果string2是空指针,则为空字符串}},//proj3.cpp{}include<iostream>#include<iomanip>usingnamespacestd;#include"proj3.h"MiniString&MiniString::operator=(constMiniString&otherString){//重载赋值运算符函数。提示:可以调用辅助函数setString//************333*********//*************666**********}intmsin(){MiniStringstrl("Hello!"),str2;voidwriteToFile(constchar*);str2=strl;//使用重载的赋值运算符str2.modString("Happynewyear!");cout<<strl<<’\n’;cout<<str2<<’\n’;writeToFile("");return0;}标准答案:1ength=otherStrlng.length;//把对象字符串otherstrinq的长度赋值给变量lenqthsetString(otherString.sPtr);//调用函数setstrinq,实现给类变量sptr分配空间,以及逐个把对象otherstring字符串的值复制到sptr中return*this;//返回被赋值的对象知识点解析:主要考查考生对运算符重载的掌握,题目要求重载赋值运算符函数。要重载的运算符是“=”,即赋值的意思。提示:可以调用辅助函数setString。该函数的功能是复制形参的字符串到sPtr中,因此,首先复制:length,其次通过函数setString复制sPtr,最后按要求返回*this;。国家二级C++机试(操作题)模拟试卷第4套一、基本操作题(本题共1题,每题1.0分,共1分。)1、使用VC6打开考生文件夹下的源程序文件modi1.cpp,该程序运行时有错,请改正其中的错误,使程序正确运行,并且使程序输出的结果为:30130注意:错误的语句在//******error******的下面,修改该语句即可。1#include<iostream.h>2inta=10;3classCObj4{5public:6CObj()7{8a=b=0;9}10voiddisplay()11{12//******error********13cout<<a<<b<end1;14}15voidfunc(inta)16{17//******error******18a+=a;19}20voidfunc2()21{22//******error******23a+=a;24}25private:26inta,b;27};28voidmain()29{30CObjobj;31obj.func(3);32obj.display();33obj.func2();34obj.display();35}标准答案:(1)cout<<a<<b<<end1;(2)this->a+=a;(3)a+=::a;知识点解析:程序当中定义了全局变量a和类CObj,类CObj含有成员变量a和b,类CObj的变量a和全局变量a均为整型变量,名字完全一样,使用时需要注意区分。类CObj成员函数display()打印变量a和b的值,func(inta)函数和func2()均使类成员变量a增加,但是增加方式不同。(1)成员函数display()打印变量a和b的值,即cout输出a和b的值,cout流中的数据是用流插入运算符“<<”顺序加入的,因此“<”不正确,因此第1个标识下应改成cout<<a<<b<<end1。(2)在func(inta)中,参数a传递进来,其和成员变量a名字一样,因此第2个标识下的“a+=a”有歧义,从程序的运行结果来分析,CObjobj声明对象obj,初始化类成员变量a和b均为0,调用func函数后输出30,说明a为3,b:为0,因此这里应该是成员变量与参数a的和赋给成员变量a,正确的写法是“this->a+=a;”。(3)func2()函数虽然没有参数,但是成员变量a和全局变量a重名,第3个标识下“a、+=a”也会有歧义,分不清楚是全局变量加倍还是类成员变量加倍或者其他情况,调用func2()函数后,输出“130”,说明a为13,b为0,因此是成员变量与全局变量a的和赋给成员变量a,正确的写法是“a+=::a;”,“::a”表示是全局变量a。二、简单应用题(本题共1题,每题1.0分,共1分。)2、使用VC6打开考生文件夹下的源程序文件modi2.cpp。阅读下列函数说明和代码。函数num(char*str)实现返回字符串中非数字的个数。例如:abc123abc45返回输出:6将函数num()补充完整。注意:请勿改动主函数。1#include<iostream.h>2intnum(char*str)3{45}6intmain()7{8charstr[1024];9cout<<’’pleaseinputastrfng:’’<<end1;10cin.getline(str,1024);11cout<<’’charnumberis’’<<num(str)<<end1;12return0;13}标准答案:1intnumber=0;2for(inti=0;str[i]!=0;i++)3if(str[i]>’9’||str[i]<’0’)//非数字字符4number++;5returnnumber;知识点解析:函数num(char*str)实现返回字符串中非数字的个数,数字从0开始到9结束,共有10个,因此判断数组字符比较简单,即“’0’<=str[i]<=’9’”,除数字字符外其余的都是非数字字符,利用这个关系可迅速判断该字符是否是非数字字符。(1)利用循环搜索数组str中的元素,循环变量从0开始,直到str[i]=0(到了字符数组的尾),不断地读取str中读取元素。(2)每读到一个元素判断是否是非数字字符,即满足条件“str[i]>’9’||str[i]<’0’的字符为非数字字符,非数字字符个数加1,循环结束就得到了非数字字符的个数。三、综合应用题(本题共1题,每题1.0分,共1分。)3、使用VC6打开考生文件夹下的源程序文件modi3.cpp。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。完成以下功能:(1)完成构造函数,设置数组元素的个数为0,请在注释//********1********之后添加语句。(2)完成函数AddMember(intn),如果参数n包含在类的数据成员数组中,则返回0,否则把数据写入数组,然后返回1,请在注释//********2********之后添加语句。(3)完成函数DelMember(intn),如果变量在数据中,则删除该变量,并且返回1,如果不存在则返回0,请在注释//********3********之后添加语句。(4)完成成员函数islnclude(intn)的定义,该函数检查参数n是否在类的数据成员数组elems中,如果在返回1,否则返回0。请在注释//********4********之后添加语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。1#include<iostream.h>2#defineMAXLENGTH5003classCArray4{5public:6CArray()7{8//********1********910}11intAddMember(intn)12{13for(inti=0;i<length;i++)14{15//********2********16if(Array[i]=n)17return0;18}19Array[1ength++]=n;20return1;21}22intDelMember(intn)23{24inti;25for(i=0;i<length;i++)26{27if(Array[i]==n)28{29break;30}31}32//********3********33if()34{35for(;i<length-1;i++)36{37Array[i]=Array[i+1];38}39length--;40return1;41}42return0;43}44intisInclude(intn)45{46for(inti=0;i<length;i++)47{48//********4********49if()50{51return1;52}53}54return0;55}56private:57intArray[MAXLENGTH];58intlength;//用来记录数组的个数59};60intmain()61{62CArrayobj;63obj.AddMember(1);64obj.AddMember(3);65obj.AddMember(8);66obj.AddMember(23);67cout<<obj.isInclude(8)<<end1;68cout<<obj.isInclude(11)<<end1:69obj.DelMember(3);70obj.DelMember(8);71cout<<obj.isInclude(2)<<end1;72cout<<obj.isInclude(1)<<end1;73return0;74}标准答案:(1)添加语句:length=0;(2)将“if(Array[i]=n)”补充完整为:if(Array[i]==n)或if(n==Array[i])(3)将“if()”补充完整为:if(i<lenqth)或if(i!=lenqth)(4)将“if()”补充完整为:if(Array[i]==n)或if(n==Array[i])知识点解析:程序中定义了类CArray,有两个数据成员和多个成员函数。变量为length用来记录数组元素的个数,数组Array[MAX_LNGTH]用来存放数组元素。成员函数AddMember()和DelMember()分别表示添加和删除元素,函数isInclude(intn)检查数组当中是否存在值为n的元素。(1)使length的初始化为0,因此添加语句:“length=0;”。(2)第2个标识下是检查n是否已经在数组当中存在,用if语句来判断,即if(Array[i]==n)或if(n==Array[i])。(3)DelMember(intn)函数删除指定的元素,由于元素在数组当中的位置未知,因此必须先查找该元素的位置,在该函数的实现过程当中通过for循环来完成,即第一个for循环查找n在数组中的位置。如果n存在于数组中,那么if中的break语句就会执行跳出循环,此时循环变量i的值会小于length,即通过判断i的值是否小于length值可以知道n是否存在数组中,如果存在数组中接下来进行删除操作。即第3个标识下应改为if(i<length)或if(i!=length)。(4)islnclude(intn)成员函数用来判断n是否存在数组当中,可用if语句比较,即第4个标识下应改为“if(Array[i]==n)或if(n==Array[i])”。国家二级C++机试(操作题)模拟试卷第5套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,该工程中包含程序文件main.cpp,其中有类CDate(“日期”)和主函数main的定义。程序中位于每个“//EPdlOR****found****”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为:原日期:2005—9—25更薪后的日期:2006—4—1注意:只修改每个“//ERROR****found****”下的那一行,不要改动程序中的其他内容。#include<iostream>#include<cstdlib>usingnamespacestd;classCDate//日期类{//ERROR******found******proteerect:CDate(){};CDate(intd,intm,inty){//ERROR******found******Set;Date(intday=d,intmonth=m,intyear=Y);};voidDisplay();//显示日期voidSetDate(intClay,intmonth,intyear)//设置日期{m_nDay=day;m_nNonth=month;m_nYear=year;_}private:intm_nDay;//日intm_nMonth;//月intm_nYear;//年};voidCDate::Display()/,/显示日期{//ERROR******found******eout<<m_nDay<<"一"<<m_nNonth<<"一"<<m_nYear;cout<<endl;}intmain(){CDated(25,9,2005);//调用构造函数初始化日期cout<<"原日期:";d.Display();d.SetDate(1,4,2006);//调用成员函数重新设置日期tout<<“更新后的日期:”;d.Display();return0;}标准答案:(1)public:(2)SetDate(d,m,y);(3)cout<<m_nYear。<<”-”<<m_n.Month<<”-”<<m_nDay:知识点解析:(1)通过主函数中成员函数的调用可知这里应该为公有成员,而且构造函数必须为公有继承。(2)主要考查考生对成员函数的掌握,程序在这里调用成员函数SetDate,直接把形参代入即可。(3)题目要求输出原日期:2005-9-25。可以知道输出顺序为:先输出年,其次月,最后是日。二、综合应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj3,其中声明了SortedList类,是一个用于表示有序数据表的类。其成员函数insert的功能是将一个数据插入到一个有序表中,使得该数据表仍然保持有序。请编写这个insert函数。程序的正确输出应为:插入前:1,2,4,5,7,8,10插入6和3后:1,2,3,4,5,6,7,8,10要求:补充编制的内容写在“//********333********”与“//********666********”之间。不得修改程序的其他部分。注意:程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。//SortedList.h#include<iostream>usingnamespacestd;classSortedList{//有序数据表类intlen;double*d;public:SortedLiSt(intlen,doubledata[]=NULL);~SortedList(){delete[]d;}intlength()const{returnlen;}//有序数据表长度(即元素的个数)doublegetElement(inti)const{returnd[i];)voidinsert(doubledata);voidshow()const;//显示有序数据表};voidwriteToFile(char*,constSortedLiSt&);//main.cpp#include"SortedList.h"SortedList::SortedList(intlen,doubledata[]):len(len){d=newdouble[len];for(intk=0;k<len;k++)d[k]=(data==NULL?0.0:data[k]);for(inti=0;i<len一1;i++){intm=i;for(intj=i;j<fen;j++)if(d[j]<d[m])m=j;if(m>i){doublet=d[m];d[m]=d[i];d[i]=t;}}}voidSortedList::insert(doubledata){//********333********//********666********}voidSortedList::show()const{//显示有序数据表for(inti=0;i<len一1;i++)cout<<d[i]<<",";cout<<d[len—1]<<endl;}intmain(){doubles[]={5,8,1,2,i0,4,7};SortedListlist(7,s);cout<<"插入前:"<<endl;list.show();list.insert(6.0);list.insert(3.0);cout<<"插入6和3后:"<<endl;list.show();writeToFile("",list);return0;}标准答案:for(Inti=0;i<len;++1)//遍历数组dif(data<d[i])//如果data小于d[i]{len++;//数组d的长度自加1double*dd=newdouble[len];//分配长度为len空间for(intk=len;k>i;k--)//在数组d中从k等于len到i做遍历dd[k]=d[k一1];//把d[k一1]赋值给dd[k]dd[i]=data;//把data赋值给dd[i]for(intj=0;j<i;j++)//把数组d从0到i做遍历dd[j]=d[j];//把d[j]赋值给dd[j]delete[]d;//删d分酉芒的空间d=newdouble[len];//给d分配长度为len的空间for(intindex=0;index<len;++index)//遍历数组dd从0到lend[index]=dd[index];//地dd[index]赋值给d[index]delete[]dd;//删dd分配的空间break;//跳出循环}知识点解析:主要考查考生对插入算法的掌握,题目要求insert函数的功能是将一个数据插入到一个有序表中,使得该数据表仍保持有序。可以知道数据表d是一组有序的数组,那么就采取先比较再插入的步骤完成即可。要注意动态数组d的长度是确定的,要添加元素,就要重新分配空间。国家二级C++机试(操作题)模拟试卷第6套一、基本操作题(本题共1题,每题1.0分,共1分。)1、使用VC6打开考生文件夹下的源程序文件modi.epp,该程序运行时有错误,请改正错误,使得程序正常运行,并且要求最后一个catch()必须抛出执行的任何异常。程序通过抛出异常输出:error0ERROR注意:不要改动main函数,不能增行或删行,也不能更改程序的结构,错误的语句在//******error******的下面。1#include<iostream.h>2intmain()3{4try5{6throw(’’error’’);7}8//********error********9catch(chars)10{11cout<<s<<end1;12}13try14{15throw((int)0);16}17//********error********18catch()19{20cout<<i<<end1;21}22try23{24throw(0);25throw(’’error’’);26}27//********error********28catch()29{30cout<<’’ERROR’’<<end1;31}32return0;33}标准答案:(1)catch(char*s)(2)catch(inti)(3)catch(…)知识点解析:本程序是对各种异常信息的处理。try-cmch的结构中,catch子句用来捕捉异常的信息。(1)第1个标识前的异常抛出语句为“throw(’’error’’):”,其中的类型为字符串。所以对应的异常捕捉语句catch中应该符合这个类型,而程序中给出的语句“catch(chars)”是字符型的,所以第2个标识下的语句修改为“catch(char*s)”。(2)第2个标识前的异常抛出语句为“throw((int)0);”,其中的类型为int。所以对应的异常捕捉语句catch中应该符合这个类型,所以补充catch子句中的类型,否则找不到匹配的catch块,那么系统就会调用一个系统函数,使程序终止运行。即第1个标识下的语句修改为“catch(inti)”。(3)如果在catch子句中没有指定异常信息的类型,那么就用删节号“…”表示它可以捕捉任何类型的异常信息,即修改为“catch(…)”。二、简单应用题(本题共1题,每题1.0分,共1分。)2、使用VC6打开考生文件夹下的源程序文件modi2.cpp。请补充完整程序fun(inti),使程序完成以下功能:如果i=5,则输出如下5行井号。###############注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。1#include<iostream.h>2voidfun(inti)3{45}6intmain()7{8fun(5);9return0;10}标准答案:1for(intj=0;j<i;j++)//行循环2{3for(intk=0;k<=j;k++)//列循环4cout<<’’#’’;//输出“#”5cout<<end1;6}知识点解析:(1)该程序功能是输出5行井号。它的解题思路,两层循环,外循环为行,内循环为列。第一行为1列,第二行为两列,同理类推,第n行为n列。(2)从已给部分源程序的main主函数开始入手,核心函数fun(inti)中的i参数为i行≠≠。(3)首先,利用for循环进行外层循环,要输出的i行。(4)然后,利用for循环进行内层循环,输出对应i行的i列。三、综合应用题(本题共1题,每题1.0分,共1分。)3、使用VC6打开考生文件夹下的源程序文件modi3.cpp。程序通过继承关系,实现对姓名的控制。类TestClass1实现对名字访问的接口,TestClass2实现对名字的设置和输出。程序输出为:TestClass2NameMay其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。(1)在类TestClass1中定义接口函数GetName,为纯虚函数。请在注释//********1********后添加适当的语句。(2)函数GetName2()实现获得名字的缓存,但是只获得读允许操作这个缓存,请在注释//********2********后添加适当的语句。(3)实现TestClass2的构造函数,请在注释//********3********后添加适当的语句。(4)完成TestClass2的构造函数,实现对名字的处理。请在注释//********4********后添加适当的语句。注意:增加代码,或者修改代码的位置已经用符号表示出来。请不要修改其他的程序代码。1#include<iostream.h>2ClassTestClass13{4public:5//********1********67};7classTestClass2:publicTestClass18{10public:11voidGetName()12{13cout<<’’TeStClass2Name’’<<end1;14}15//********2********1617{18returnm_str;19}20//********3********2122{23inti;24for(i=0;str[i]!=0;i++)25m_str[i]=str[i];26//********4********2728}29private:30charm_str[32],31};32voidmain()33{34TestClass1*p;35TestClass2obj1(’’May’’),36pP=&obj1;37p一>GetName();38cout<<obj1.GetName2()<<end1;39return;40}标准答案:(1)添加语句:virtualvoidGetName()=0;(2)添加语句:constchar*GetName2()(3)添加语句:TestClass2(char*str)(4)添加语句:m_str[i]=0;知识点解析:在VC环境下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。从已定源程序的main主函数开始入手,可以看出程序通过调用类TestClass和接口函数Getname实现各种输出操作。(1)题目1要求“在类TestClass1中定义接口函数GetName,为纯虚函数”。在C++中,在基类中用virtual声明成员函数为虚函数。纯虚函数是在声明虚函数时被“初始化”为0的函数,即“virtualvoidGetName()=0;”。(2)题目2要求“函数GetName2()实现获得名字的缓存,但是只获得读允许操作这个缓存”。只能引用数据成员,而不能修改,那么使用常成员函数。一般形式为,const函数类型函数名,即“constchar*GetName2()”。(3)题目3要求“实现TestClass2的构造函数”。TestClass2的构造函数与类TestClass2名应该相同,而且第三个标识下的大括弧中是对字符数组str的操作,所以类TestClass2的构造函数中的参数为str,即这里补全为“TestClass2(char*str)”。(4)题目4要求“完成TestClass2的构造函数,实现对名字的处理”,补全类TestClass2的构造函数,构造函数中的名字变量str对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论