




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
国家二级C++机试(操作题)模拟试卷5(共9套)(共27题)国家二级C++机试(操作题)模拟试卷第1套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,其中有点类Point和线段类Line和主函数main的定义,程序中位于每个“//ERROR*******found*******”之后的一行语句有错误,请加以改正。改正后程序的输出应为:p1=(8,4)p2=(3,5)注意:只修改两个“//ERROR*******found*******”下的那一行,不要改动程序中的其他内容。#include<iostream>#include<cmath>usingnamespacestd;classPoint{doubleX,y;public:Point(doublex=0.0,doubley=0.0)//ERROR*******found*******{x=x,y=y;)doublegetX()const{returnx;)doublegetY()const{returny;)//ERROR*******found*******voidshow()const{cout;<<’(’<<x<<’,’<<y<<’)’}};classLine{Point;pl,p2;public:Line(Pointpt1,Pointpt2)//ERROR*******found*******{pt1=p1;pt2=p2;}Pointgetp1()const{returnp1;)PointgetP2()const{returnp2;}};intmain(){Lineline(Point:(8,4),Point(3,5));cout<<”p1=”;line.getp1().show();cout<<”p2=”;line.getp2().show();tout<<endl;return0;}标准答案:(1):x(x),y(y){}或{this->x=x;this->y=y;}(2)voidshow()const{cout<<’(<<x<<’,<<y<<’)’;}(3):p1(pt1):p2(pt2){}或{p1=pt1;p2=p2}知识点解析:(1)主要考查考生对构造函数的掌握,因为形参名和私有成员名称一样因此不能直接赋值,在这里使用成员列表初始化,也可以使用this指针赋值。(2)主要考查考生对语句基本语法的掌握,根据语句:voidshow()const{cout<<’(’<<x<<’,<<y<<)’}。可看出函数体内并没有;作为cout语句的结束符,因此程序错误。(3)主要考查考生对构造函数的掌握,形参是pt1和pt2,这里写反了,也可以使用成员列表初始化法,可以避免这种错误。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,其中有整数栈类IntList、顺序栈类SeqList和链接栈类LinkList的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为:4631846318注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动//“*******found*******”.#include<iostEeain>usingnamespacestd;classIntStack{//整数栈类public:virtualvoidpush(int)=0;//入栈virtualintpop()=0;//出栈并返回出栈元素virtualint.topElement()const=0;//返回栈顶元素,但不出栈virtualbool~sErapty()const=0;//判断是否栈空};classSeqStack:publicIntStack{intdata[100],//存放栈元素的数组int:top;//栈顶元素的下标public://*******found*******SeqStack():____________{}//把top初始化为-1表示栈空voidpush(intn){data[++top]=n;)//*******found*******intpop()freturn________;)inttopElement()const{returndata[top];}boolisEmpty()const{returntop=-1;}};structNode{intdata;Node*next;};classLinkStack:publicIntStack{Node*top;public://*******found*******LinkStack():_____________{}//把top初始化为NULL表示栈空voidpush(intn){Node*P=newNode;P一>data=n://*******found*******________________;top=P;}intpop(){intd=top一>data;;top=top一>next;returnd;}inttopElement()const(returntop一>data;}boolisEmpty()const{returntop==NULL,)};voidpushData(IntStack&st){st.push(8);st.push(1);st.push(3);st.push(6);st.push(4);}voidpopData(IntStack&st)fwhile(!st.isEmpty())cout<<st.pop()<<¨;}intmain(){SeqStackstl,pushData(stl);popData(stl);cout<<endl;LinkStackst2;pushData(st2);popData(st2);cout<<endl;return0;}标准答案:(1)top(-1)(2)data[top--](3)top(NULL)(4)p->next=top;知识点解析:(1)主要考查考生对构造函数的掌握情况,先看语句注释:把top初始化为-1表示栈空,即要把top赋值为-1即可。(2)主要考查考生对纯虚函数的掌握,先看纯虚函数在基类的注释:出栈并返回出栈元素。要返回栈顶元素可以通过data[top]得到,出栈同时要使得top往下移动,即top--。(3)主要考查考生对构造函数的掌握情况,先看语句注释:把top初始化为NULL表示栈空,因此使用成员列表初始化直接把top赋值为NULL即可。(4)主要考查考生对栈的掌握,push为入栈函数,top指向栈顶元素,因此新添加的指针的next要指向top,即:p->next=top;。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,其中声明IntSet是一个用于表示正整数集合的类。IntSet的成员函数Intersection的功能是求当前集合与另一个集合的交集。请完成成员函数Intersection。在main函数中给出了一组测试数据,此时程序的输出应该是:求交集前:123581028911305667求交集后:12358102891130566728要求:补充编制的内容写在“//*******333*******”与“//*******666*******”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。//Intset.h#include<iostream>usingnamespacestd;constintMax=100;classIntSet{public:IntSet()//构造一个空集合{end=-1;}IntSet(inta[],intsize)//构造一个包含数组a中size个元素的集合{if(size>=Max)end=Max-1;elseend=size-1;for(inti=0;i<=end;i++)element[i]=a[i];}boolIsMemberOf(inta)//判断a是否为集合中的一个元素{for(inti=0;i<=end;i++)if(element[i]=a)returntrue;returnfalse;}intGetEnd(){returnend;}//返回最后一个元素的下标intGetElement(inti){returnelement[i];}//返回下标为i的元素IntSetIntersection(IntSet&set),//求当前集合与集合set的交voidPrint()//输出集合中的所有元素{for(inti=0;i<=end;i++)if((i+1)%20=0)cout(<element[i]<<endl;elsecout<<element[i](<”;cout<<endl:}private:intelement[Max];intend;};voidwriteToFile(constchar*);//main.cpp#include”IntSet.h”IntSetIntSet::Intersection(IntSet&set){inta[Max],size=0;//*******333*******//*******666*******returnIntSet(a,size);}intmain(){inta[]={1,2,3,5,8,i0);intb[]=(2,8,9,ii,30,56,67);IntSetsetl(a,6),set2(b,7),set3;cout<<·-求交集前:”<<endl;setl.Print();set2.Print();set3.Print();set3=setl.Intersection(set2);cout<<endl<<-’求交集后:”<<endl;setl.Print();set2.Print();set3.Print();writeToFile(””);return0;}标准答案:for(inti=0;i<=set.GetEnd0;i++)//遍历对象set数组if(IsMemberOf(set.GetElement(1)))a[size++]=set.GetElement(i);知识点解析:主要考查考生对数组的掌握,根据IntSet类的构造函数:IntSet(inta[],intsize)//构造一个包含数组a中size个元素的集合{if(size>=Max)end=Max-1;elseend=size-1;for(inti=0;i<=end;i++)element[i]=a[i];}可知数组element用来装载集合,end表示数组长度,因此调用函数IsMember0来判断set中的元素是否存在于集合中.如果存在则放入数组a中。国家二级C++机试(操作题)模拟试卷第2套一、基本操作题(本题共1题,每题1.0分,共1分。)1、使用VC6打开考生文件夹下的源程序文件modi1.cpp,该程序运行时有错,请改正其中的错误,使程序正常运行,并使程序输出的结果为:Maxis7提示:max()函数实现找出两个数中的最大值,并作为函数值返回。注意:错误的语句在//******error******的下面,修改该语句即可。1#include<iostream>2usingnamespacestd;3//********error********4intmax(inta,intb)5{6if(a<b)7{8intt=a;9a=b;10b=t;11}12returnb;13}14intmain()15{16intm=-3;17intn=7;18//******error******19max(-3,n);20cout<<’’Maxis’’<<m<<ena1;21return0;22}标准答案:(1)intmax(int&a,int&b)(2)max(m,n);知识点解析:函数参数传递形式有多种:将变量名作为实参和形参、传递变量的指针和传送引用方式,将变量名作为实参和形参方式,传递是单向的,在函数执行过程中形参的值发生变化不会传回实参,而指针和引用方式在函数执行过程中形参会影响实参。函数max返回最大值,而在主函数内并没有使用其返回值,而是输出m值,可知在max函数类已将最大值存放在m里,因此max函数采用的是传递引用方式。(1)由审题分析可知max函数采用的是传送引用方式传递参数,因此第1个标识下应该为intmax(int&a,int&b)。(2)调用max时,传递引用时直接使用变量名即可,第2个标识下应改为“max(m,n)”。二、简单应用题(本题共1题,每题1.0分,共1分。)2、使用VC6打开考生文件夹下的源程序文件modi2.cpp。阅读下列函数说明和代码,完成空出部门的程序。实现函数sort(intA[],intn),用冒泡法将数组排序。提示:所谓冒泡法,就是每次把相邻的两个数交换,较大的数交换到后面。这样下标从0到n-1的数与其后面相邻的数交换,可以把最大的数交换到数组的末端。进行n次下标从0到n-1的交换,则数组则会变成有序的,而且是由大到小的顺序。注意:不能修改程序的其他部分,并且不能删除其他的部分,也不能修改程序的结构。1#include<iostream.h>2#defineN103voidsort(intA[N],intn)4{56}7intmain()8{9intA[N]={5,7,4,6,10,13,78,-4,9,20};10sort(A,10);11for(inti=0;i<sizeof(A)/sizeof(int);i++)12{13cout<<A[i]<<’’;14}15cout<<end1;16return0;17}标准答案:1inti,j,k,t;2for(i=0;i<n-1;i++)3{4for(k=i,j=i+1;j<n;j++)5if(A[k]<A[j])//如果前面的比后面的小则需要交换5k=j;7if(k!=i)//交换8{9t=A[i];10A[i]=A[k];11A[k]=k;12}13}知识点解析:函数sort(intA[],intn)用冒泡排序法把数组进行从大到小的排序,冒泡法排序利用了求数组中最小值及其位置的算法,首先从n个数中找出最大值,放在第一个元素位置上,再从剩下的n-1个数中找出最大值,放在第二个元素位置上,这样不断重复下去,直到剩下最后一个数。(1)以数组“A[]={3,8,7,6,5,0,1,2,9,4}”为例来说明具体的排序过程,第一次选择:第一步从A[0]-A[9]中找最大值max及下标k,max=9,k=8;第二步交换a[0]与最大值a[8]的值;第一次结束后a[0]已存放了最大值,下一次比较就不必再经过它了,而从a[1]开始,如此循环。从例中可以看出10个元素要进行九次比较,n个元素要进行n-1次比较。设置两层循环,外层循环变量i从0到n-1,内层循环变量从i开始到n-1,在内层循环中找最大值,如果最大值的下标k和i不同,则交换,实现选择法排序。(2)在内层循环体内,如果最大值的下标k和i不同,则用一个临时变量记录第i个元素,然后将第k个元素赋值给第i个元素,临时变量值赋给第k个元素,如此完成两个元素的交换。三、综合应用题(本题共1题,每题1.0分,共1分。)3、使用VC6打开考生文件夹下的源程序文件modi3.cpp。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。完成以下功能:(1)利用define定义常量TRUE为1,定义常量FALSE为0,请在注释//********1********后添加适当的语句。(2)在类A2前增加A1的声明,请在注释//********2********后添加适当的语句。(3)在类C1中声明友元函数boolfunc(A2aa,A1&b),请在注释//********3********后添加适当韵语句。(4)实现函数boolfunc(A2&obj1,A1&obj2)功能,检查两个类的值都为TRUE,则返回TRUE,请在注释//********4********后添加适当的语句。注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。1#include<iostream.h>2//********1********34#defineFALSE05//********2********67classA28{9private:10boolm_A2;11friendboolfunc(A2&obj1,A1&obj2);12public:13A2()14{15m_A2=FALSE;16}17public:18voidsetA2(booln)19{20m_A2=n;21}22};23classA124{25private:26booim_A1;27//********3********2829public:30A1()31{32m_A1=TRUE;33}34public:35voidsetA1(booln)36{37m_A1=n;38}39};40boolfunc(A2&obj1,A1&obj2)41{42//********4********43return44}45intmain()46{47A2obj0;48A1obj1;49cout<<func(obj0,obj1)<<end1;50obj0.setA2(TRUE);51obj1.setA1(TRUE);52cout<<func(obj0,obj1)<<end1;53return0;54}标准答案:(1)添加语句:#defineTRUE1(2)添加语句:classA1;(3)添加语句:friendboolfunc(A2&obj1,A1&obj2);(4)将“return”补充完整为:returnobj1.m_A2==TRUE&&obj2.m_A1==TRUE;知识点解析:程序当中定义了两个类,每个类中具有一个bool型成员变量,函数func(A2&obi1,Al&obj2)功能是检查这两个类的成员变量值是否都为TRUE,如果均为TRUE返回真,否则返回FALSE,相当于一个逻辑与运算。(1)#define命令一般将一个指定的标识符(即宏名)来代表一个字符串,其定义形式一般为:#define宏名(参数表)字符串,因此第1个标识下应添加#defineTRUE1。(2)类声明格式为:“class<类名>;”,故第2个标识下应添加“classA1:”。(3)友元不是本类的成员函数,在它的函数体内部可以通过对象名来访问类的私有成员和保护成员。友元函数是在类声明中由关键字friend修饰的非成员函数,3出添加语句:“friendboolfunc(A2&obj1,A1&obj2);”。函数func返回变量m_A2和m_A1的逻辑与运算结果,因此第4标识下应改为“returnobj1.m_A2==TRUE&&obj2.m_A1=TRUE;”。国家二级C++机试(操作题)模拟试卷第3套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,程序中位于每个“//ERROR*******found*******”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为:value=63number=1注意:只修改每个“//ERROR****found****”下的那一行,不要改动程序中的其他内容。#include<iostream>usingnamespacestd;classMyClass{int*P;constintN;public://ERROR*******found*******MyClass(intval):N=1{P=newint;*P=val;}//ERROR*******found*******~MyClass(){delete*P;)friendvoidprint(MyClass&obj);};//ERROR*******found*******voidMyClass::print(MyClass&obj){cout(<”value=”<<*(obj.P)(<endl;cout<<”number=”<<obj.N<<endl:}intmain(){MyClassobj(63);print(obj);return0;}标准答案:(1)MyClass(intval):N(1)(2)~MyClass(){deletep;}(3)voidprint(MyClass&obj)知识点解析:(1)主要考查考生对构造函数的掌握,在这里不能使用赋值语句。(2)主要考查考生对析构函数的掌握,p是通过newint进行动态内存分配的,分配的是单个int的内存,而不是数组。根据析构函数的delete语句,即deletep;。(3)主要考查考生对友元函数的掌握,友元函数并不属于类,因此定义时前面不用加类名和作用域符号。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,其中定义了Component类、Composite类和Leaf类。Component是抽象基类,Composite和Leaf是Component的公有派生类。请在横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为:LeafNode注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//*******found*******”。#include<iostream>usingnamespacestd;classComponent{public://声明纯虚函数print()//*******found*******};classComposite:publicComponent{public://*******found*******voidsetChiid(________){mchiid=chiid;}virtualvoidprint()const{mchild一>print();}private:Component*mchiid;};classLeaf:publicComponent{public:virtualvoidprint()const{//*******found*******)};intmain(){Leafnode;Compositecomp;comp.setChild(&node);Component*P=&comp:P一>print();return0;}标准答案:(1)virtualvoidprint()const=0;(2)Component*child(3)cout<<"LeafNode"<<endl;知识点解析:(1)主要考查考生对纯虚函数的掌握,题目要求声明纯虚函数print()。在其派生类中print(函数的定义为virtualvoidprint)const,由此可知纯虚函数为virtualvoidprint()const=0。(2)主要考查考生对成员函数的掌握,题题要求填写函数voidsetChild的形参,由setChild的函数体。可知形参为child,再看类的私有成员m_child的定义:Component*m_child;。由此可知形参为:Component*child。(3)主要考查考生对纯虚函数的掌握,先看主函数的程序:Leafnode;Compositecomp;comp.setChild(&node);Component*p=&comp;p->print();第一条和第二条语句都是定义语句,第三条语句调用函数setChild,由setChild函数的定义可知,comp中的m_child等于node,第四条语句定义了个指针p指向comp的地址,也就是node,最后一条语句通过指针p调用函数print,也就是调用类Leaf的函数print,因为题目要求输出:LeafNode,因此在这里添加语句:cout<<"LeafNode"<<endl;。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,其中定义的Matrix是一个用于表示矩阵的类。成员函数max_value的功能是求出所有矩阵元素中的最大值。例如,若有3×3矩阵则调用max_value函数,返回值为3。请编写成员函数max_value。要求:补充编制的内容写在“//*******333*******”与“//*******666*******”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件out.dat中。输出函数wfiteToFile已经编译为obj文件,并且在本程序中调用。//Matrix.h#include<iostream>#include<iomanip>usingnamespacestd;constintM=18;constintN=18;classMatrix{intarray[M][N];public:Matrix(){}intgetElement(inti,intj)const(returnarray[i][j];}voidsetElement(inti,intj,intvalue){array[i][j]=value;}intmaxvalue()const;voidshow(constchar*S)const{cout<<endl<<S:for(inti=0;i<M;i++){cout<<endl:for(intj=0;j<N;j++)cout<<setw(4)<<array[i][j];)}};voidreadFromFile(constchar},Matrix&);voidwriteToFile(char{,constMatrix&);//main.cpp#include”Matrix.h”#include<fstream>voidreadFromFile(constchar*f,Matrix&m){ifstreaminfile(f);if(infile.fail()){cerr<<”打开输入文件失败!”;return;}intk;for(inti=0;i<M;i++)for(intj=0;j<N;j++)(infile>>k:m.setElement(i,j,k);}}intMatrix::maxvalue()const{//*******333*******//*******666*******}intmain(){Matrixm;readFromFile(””,m);m.show(”Matrix:”);cout<<endl<<·,最大元素:”<<m.maxvalue()<<endl;writeToFile(””,m);return0;}标准答案:inttemp=0;//定义整数变量temp,并赋值为零for(inti=0;i<M;i++)//遍历矩阵的行for(intj=0;j<N;j++)//遍历矩阵的列if(temp<array[i][i])temp=array[i][i];//赋值returntemp;//返回temp知识点解析:主要考查考生对二维数组的掌握.题目要求成员函数maxvalue的功能是求出所有矩阵元素中的最大值。因此只要逐个元素比较即可,下标i和j作为矩阵行和列的标记,使用双层for循环来遍历数组中所有元素。国家二级C++机试(操作题)模拟试卷第4套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,该工程中包含程序文件main.cpp,其中有类Clock(“时钟”)的定义和主函数main的定义。程序中位于每个“//ERROR****found****”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为:Initialtimesare0d:0h:0m:59sAfteronesecondtimesare0d:0h:1m:0S注意:只修改每个“//ERROR****found****”下的那一行,不要改动程序中的其他内容。#includeusingnamespacestd;ClassClock{public:Clock(mRsignedlongi=0);voidset(unsignedlongi=0);voidprint()const;voidtick();//时间前进一秒Clockoperator++();private:unsignedlongtotalsec,seconds,minutes,hours,days;};Clock::C1ock(unsignedlongi):totalsec(i),seconds(i%60),minutes((i/60)%60),hours((i/3600)%24),days(i/86400){}voidClock::set(uns~gnedlongi){totalsec=i;seconds=i%60;minutes=(i/60)%60;hours=(i/3600)%60;days=i/86400;}//ERROR*********found*********voidClock::print(){tout<标准答案:(1)voidClock::print()const(2)set(++total_sec);(3)return*this;知识点解析:(1)主要考查考生对成员函数的掌握,由Clock类中对函数print的声明voidprint()const;可知,在定义print函数时少了const。(2)主要考查考生对++操作的掌握,根据函数要求,时间要先前进一秒,再调用函数set,因此total_sec++应改为++total_sec。(3)主要考查考生对this指针的掌握,函数要求返回值Clock,即返回一个类,而不是指针,因此使用*this。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,该工程中含有一个源程序文件proj2.cpp,其中定义了CharShape类、Triangle类和Rectangle类。CharShape是一个抽象基类,它表示由字符组成的图形(简称字符图形),纯虚函数Show用于显示不同字符图形的相同操作接口。Triangle和Rectangle是CharShape的派生类,它们分别用于表示字符三角形和字符矩形,并且都定义了成员函数Show,用于实现各自的显示操作。程序的正确输出结果应为:****************########################请阅读程序,分析输出结果,然后根据以下要求在横线处填写适当的代码并删除横线。(1)将Triangle类的成员函数Show补充完整,使字符三角形的显示符合输出结果。(2)将Rectangle类的成员函数Show补充完整,使字符矩形的显示符合输出结果。(3)为类外函数fun添加合适的形参。注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。//proj2.cpp#includeusingnamespacestd;classCharShape{public:CharShape(charch):ch(ch){};virtualvoidShow()=0;protected:charch;//组成图形的字符};classTriangle:publicChar-Shape{public:Triangle(charch,intr):CharShape(ch),rows(r){}voidShow();private:introws;//行数};classRectangle:publicChar-Shape{public:Rectangle(charch,intr,intc):CharShape(ch),rows(r),cols(c){)voidShow();private:introws,cols;//行数和列数};voidTriangle::Show()//输出字符组成的三角形{for(inti=1;i<=rows;i++){//********found********for(intj=1;j<=___________;j++)cout<<ch;cout<标准答案:(1)i*2-1(2)_nows(3)_cols(4)CharShape&cs知识点解析:(1)考查for循环语句,该语句所在的函数的功能是输出字符组成的三角形。从外层循环中可以看出下标i代表行数,那么下标j就代表每一行字符的个数,因为要输出的是三角形,所以每一行的个数与该行的行数相关,即i<=i*2一1:。(2)考查for循环语句,该语句所在的函数的功能是输出字符组成的矩形。回到Rectangle类中可以知道矩形的长和宽就是类中私有成员的行数和列数,因此在这里只要要求下标i不大于行数即可。(3)考查for循环语句,该语句所在的函数的功能是输出字符组成的矩形。回到Rectangle类中可以知道矩形的长和宽就是类中私有成员的行数和列数,因此在这里只要要求下标j不大于列数即可。(4)主要考查考生对虚函数的掌握,该语句所在的函数是普通函数fun,题目要求为fun函数添加形参。从函数体中可以知道形参名为cs,那么形参的类型是什么呢?就是抽象类CharShape,因此要使用CharShape&cs才可以实现题目要求输出的内容。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,其中定义了Mystring类,一个用于表示字符串的类。成员函数reverse的功能是将字符串进行“反转”。例如,将字符串ABCDEF“反转”后,得到字符串FEDCBA;将字符串ABCDEFG“反转”后,得到字符串GFEDCBA。请编写成员函数reverse。在main函数中给出了一组测试数据,此时程序运行中应显示:读取输入文件…---反转前---STR1=ABCDEFSTR2=ABCDEFG---反转后---STR1=FEDCBASTR2=GFEDCBA要求:补充编制的内容写在“//*********33*********”与“//*********666*********”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件out.dat中,输出函数WriteToFile已经编译为obj文件,并且在本程序中调用。//mgsering.h#include#includeusingnamespacestd;classMystring{public:Mystring(constchar*s){str=newchar[strlen(s)+1];strcpy(str,s);}~Mystring(){delete[]str;)voidreverse();friendOstream&operator<<(Ostream&os,constMystring&mystr){OS<voidMystring::reverse(){//*********333*********//*********666*********}intmain(){charinname[128],pathname[80];strcpy(pathname,"");sprintf(inname,"in.dat",pathname);cout<<"读取输入文件…\n\n";iEstreaminfile(inname);if(infile.fail()){cerr<<"打开输入文件失败!";exit(1);}charbur[4096];infile.getline(bur,4096);Nystringstrl("ABCDEF"),str2("ABCDEFG"),str3(buf);cout<<"---反转前---\n";cout<<"STR1="<标准答案:intlength=strlen(str);//把字符串str的长度赋值给lenthfor(inti=0,j=length-1;i知识点解析:主要考查考生对动态数组的掌握,先看题目要求:成员函数reverse的功能是将字符串进行“反转”。再由类的定义可知,字符串存放在动态数组str中,由strlen函数得出字符串的长度,最后一个字符的下标为length-1,第一个字符的下标为0,将这两个字符交换,然后j依次减1同时i依次加1,继续交换,直到i大于j时停止循环即可。国家二级C++机试(操作题)模拟试卷第5套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,此工程中含有一个源程序文件proj1.cpp。其中位于每个注释“//ERROR********found********”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为:NUM=0Value=1注意:只修改注释“//ERROR****found****”的下一行语句,不要改动程序中的其他内容。1//proj1.cpp2#include3usingnamespacestd;4classMyClass{5int_i;6friendvoidTncrement(MyClass&f);7public:8constint;NUM;9//ERROR********found********10MyClass(inti=0){NUH=0;11_i=i;12}13intGetValue()const{returni;}14};15//ERROR********found********16voidIncrement;(){f.i++;}17intmain()1819MyClassobj;20//ERROR********found********21MyClass::Increment(obj);22cout<<"NUH="<标准答案:(1)MyClass(inti=0):NUM(O){(2)voidIncrement(MyClass&f){f.一i4-+;}(3)Increment(obj):知识点解析:(1)主要考查考生对常量数据成员初始化方法的掌握,常量数据成员的初始化只能通过构造函数的成员初始化列表进行,并且要使用关键字const修饰。该题的前一条语句constintNUM;,说明NUM是常量数据成员。(2)主要考查考生对友元函数的掌握,友元函数的定义与声明要一致,先看该友元函数的声明部分:friendvoidIncrement(MyClass&f);,返回类型为wild,函数参数为MyClass&f;再比较出错的语句:voidIncrement(){f._i++;},错误在于该函数没有参数,心把MyClass&t填住括号内。(3)主要考查友兀函数的凋用,友元函数并不属于类,因此调用友元函数时不需要添加类名及作用域,只需要像调用普通函数一样即可。二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,其中在编辑窗口内显示的主程序文件中定义有类Base和Derived,以及主函数main。程序文本中位于每行“//****found****”下面的一行内有一处或多处下画线标记,请在每个下画线标记处填写合适的内容,并删除下画线标记。经修改后运行程序,得到的输出应为:sum=55。注意:只在横线处填写适当的代码,不要改动程序中的其他内容。#includeusingnamespacestd;classBase{public:Base(intm1,intm2){metal=m1;mem2=m2;}intsum()(returnmem1+mere2;)private:intmem1,mem2;//基类的数据成员};//派生类Derived从基类Base公有继承//*******found*******classDerired:{public://构造函数声明Derived(intm1,intm2,intm3);//sum函数定义,要求返回meta1、mem2和mem3之和//*******found*******intsum(){return____________+mem3;}private:intmem3;//派生类本身的数据成员};//构造函数的类外定义,要求由m1和m2分别初始化mem1和mem2,由m3初始化mem3//*******found*******__________Derived(intm1,intm2,intm3)://*******found*******_________,mem3(m3){}intmain(){Basea(4,6);Derivedb(10,15,20);intsum=a.sum()+b.sum();Cout<<"sum="<标准答案:(1)publicBase(2)Base::sum()(3)Denved::(4)Base(m1,m2)知识点解析:(1)主要考查考生对公有继承的掌握情况,根据题目要求:派生类Derived从基类Base公有继承,因此这里使用public来公有继承。(2)主要考查考生对成员函数的掌握情况,根据题目对sum函数的要求:sum函数定义,要求返回mem1、mem2和mem3之和,因此这里直接调用基类的sum函数,再加上mem3就满足题目要求。(3)主要考查考生对构造函数的掌握情况,由于Derived的构造函数在类外定义,因此要加上类名和作用域符,即Derived::。(4)主要考查考生对构造函数的掌握情况,因为Denved是Base类的派生类,所以其构造函数要使用成员列表初始化先给Base初始化。三、综合应用题(本题共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#includeusingnamespacestd;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*newname);boolisMale()const{returnis-male;}};classStaff:publicPerson{char*department;doublesalary;public:Staff(constchar*id_card_no,constchar*p_name,boolismale,constchar:Icdept,doublesal);~Staff(){delete[]department;)constchar*getDepartment()const{returndepartment;}voidsetDepartment(constchar*d);doublegetSalary()const{returnsalary;}voidsetSalary(doubleS){salary=s;}};Person::Pemson(constchar*idcardno,constchar*pname,boolismale):ismale(is_male){idcardno=newchar[strlen(idcardno)+1];strcpy(idcazdno,id_card_no);name=newchar[strlen(pname)+1];strcpy(name,p_name);}voidPerson::rename(constchar*new_name){delete[]name;//**1*********found*******____________;strcpy(name,new_name);}Staff::Staff(conStchar*idcardno,constchar*P_name,boolismale,//**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<标准答案:(1)delete[]idcardno,name(2)name=newchar[strlen(new_name)+1](3)Person(id_eard_no,p_name,is_male)知识点解析:(1)主要考查考生对析构函数的掌握,题目要求释放两个指针成员所指向的动态空间。释放动态空间应使用delete语句,因为要释放两个指针,使用语句:delete[]idcardno,name;实现。注意当释放多个指针时,中间用逗号隔开。(2)考查动态数组分配空间,题目要求指针name指向申请到的足够容纳字符串new_name的空间。使用strlen(new_name)得到字符串new_nanle的长度,但是这里要注意加1。(3)主要考查考生对派生类构造函数的掌握,题目要求利用参数表中前几个参数对基类Person进行初始化。派生类的构造函数要使用成员列表初始化法对基类初始化,因此为constchar*dept,doublesal):Person(id_card_no,p_name,is_male)。国家二级C++机试(操作题)模拟试卷第6套一、基本操作题(本题共1题,每题1.0分,共1分。)1、请打开考生文件夹下的解决方案文件proj1,其中在编辑窗口内显示的主程序文件中定义有Xabe类和主函数main。在程序文本中位于每行”//ERROR**********found**********下面的一行有错误,请加以更正。更正后程序的输出为:57注意:只允许修改每个”//ERROR**********found**********下面的一行语句,不允许改动程序中的其他任何内容。#include<iostream>usingnamespacestd;classXabc{int*a;intn;public:xabc(intaa[],intnn):n(nn){a=newint[n];for(inti=0;i<n;i++)//ERROR*******found*******aa[i]=a[i];}intGetA(inti)const{returna[i];}intSumA(intn);~Xabc(){delete[]a;}};intXabc::SumA(intn){ints=0:for(intj=0;j<n;j++)s+=a[j];returns;}intmain(){inta[6]=={2,5,8,3,6,9};Xabcx(a,6);a[3]=19;intd=0;for(inti=0;i<6;i++)//ERROR*******found*******d+=x.a[i];//ERROR*******found*******intf=SumA(5);cout<<d+f<<endl;return0;}标准答案:(1)a[i]=aa[i];(2)d+=x.GetA(j);(3)intf=x.SumA(5);知识点解析:(1)Xabc的构造函数需要使用形参aa为成员指针a赋值,函数体中,首先动态分配n个连续的整型变量的内存空间,并将内存空间的首地址赋给a,然后通过for循环,使用数组aa为a的n个元素的赋值(2)x是类Xabc的对象,成员a在定义时没有指定访问标号,默认为private成员,所以这里不能通过x对象直接访问a,应该通过公有成员函数GetA()来访问(3)SumA()函数是类Xabc的公有成员函数,需要通过对象来引用,而不能直接引用二、简单应用题(本题共1题,每题1.0分,共1分。)2、请打开考生文件夹下的解决方案文件proj2,该工程中包含一个程序文件main.cpp,其中有类Quadritic、类Root及主函数main的定义。一个Quadritic对象表示一个ax2+bx+c的一元二次多项式。一个Root对象用于表示方程ax2+bx+c=0的一组根,它的数据成员num_of_roots有3种可能的值,即0、1和2,分别表示根的3种情况:无实根、有两个相同的实根和有两个不同的实根。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为(注:输出中的X^2表示x2):3X^2+4X+5=0.0无实根4.5X^2+6X+2=0.0有两个相同的实根:-0.666667和-0.6666671.5X^2+2X-3=0.0有两个不同的实根:0.896805和-2.23014注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;classRoot{//一元二次方程的根public:constdoublex1;//第一个根constdoublex2;//第二个根constintnum_of_roots;//不同根的数量:0、1或2//创建一个“无实根”的Root对象Root():x1(0.0),x2(0.0),num_of_rootS(0){}//创建一个“有两个相同的实根”的Root对象Root(doubleroot)//*******found*******:_______{}//创建一个“有两个不同的实根”的Root对象Root(doubleroot1,doubleroot2):x1(root1),x2(root2),mum_of_roots(2){}voidshow()const{//显示根的信息cout<<"\t\t";switch(num_of_roots){case0:*******found*******case1:cout<<"有两个相同的实根:"<<x1<<"和"<<x2;break;default:cout<<"有两个不同的实根:"<<x1<<"和"<<x2;break;}}},classQuadratic{//二次多项式public:constdoublea,b,c;//分别表示二次项、一次项和常数项等3个系数Quadratic(doublea,doubleb,doublec)//构造函数//*******found*******:_______{}Quadratic(Quadratic&x)//复制构造函数:a(x.a),b(x.b),c(x.c){)Quadraticadd(Quadraticx)const{//求两个多项式的和returnQuadratic(a+x.a,b+x.b,c+x.c);}Quadraticsub(Quadraticx)const{//求两个多项式的差//*******found*******_______}doublevalue(doublex)const{//求二次多项式的值returna*x*x+b*x+c;}Rootroot()const{//求一元二次方程的根doubledelta=b*b-4*a*c;//计算判别式if(delta<0.0)returnRoot{};if(deita==0.0)returnRoot(-b/(2*a));doublesq=sqrt(delta);returnRoot((-b+sq)/(2*a),(-b-sq)/(2*a));}voidshow()const{//显示多项式cout<<endl<<a<<"X^2"<<showpos<<b<<"X"<<C<<noshowpos;}voidshowFunction(){//显示一元二次方程show();cout<<"=0.0";}};intmain()(Quadraticq1(3.0,4.0,5.0),q2(4.5,6.0,2.0),q3(q2.sub(q1));q1.showFunction();q1.root().show();q2.showFunction();q2.root().show();q3.showFunction();q3.root().show();cout<<endl;return0;}标准答案:(1)x1(root),x2(root),num_of_roots(1)(2)cout<<"无实根";break;(3)a(a),b(b),c(C)(4)returnQuadratic(a-x.a,b-x.b,c-x.c);知识点解析:(1)主要考查考生对构造函数的掌握,题目要求创建一个“有两个相同的实根”的Root对象。说明两个根x1和x2相等,根的数量为1,因此可以得出语句:x1(root),x2(root),num_of_roots(1){}。(2)主要考查考生对switch语句的掌握,在语句switch(num_of_roots){中,num_of_roots代表根的数量,当为0时,表示没有根,因此输出无实根,注意要在句尾加break。(3)主要考查考生对构造函数的掌握,本题使用成员初始化列表来构造函数。(4)主要考查考生对成员函数的掌握,题目要求求两个多项式的差。两个多项式的差就是各个次方的系数相减,因此得出语句:returnQuadratic(a-x.a,b-x.b,c-x.c);。三、综合应用题(本题共1题,每题1.0分,共1分。)3、请打开考生文件夹下的解决方案文件proj3,此工程中包含一个源程序文件proj3.cpp,补充编制C++程序proj3.cpp,其功能是读取文本文件in.dat中的全部内容,将文本存放到doc类的对象myDoc中。然后将myDoc中的字符序列反转,并输出到文件out.dat中。文件in.dat的长度不大于1000字节。要求:补充编制的内容写在“//**********333**********”与“//**********666**********”两行之间。实现将myDoc中的字符序列反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。注意:程序最后已将结果输出到文件out.dat中,输出函数writeToFile已经给出并且调用。//proj3.cpp#include<iostream>#include<fstream>#include<cstring>usingnamespacestd;ClassdoC{private:char*str;//文本字符串首地址intlength;//文本字符个数public://构造函数,读取文件内容,用于初始化新对象,filename是文件名字符串首地址doc(char*filename);voidreverse();//将字符序列反转~doc();voidwriteToFile(char*filename);};doc::doc(char*filename){ifstreammyFile(filename);intlen=1001,tmp;str=newchar[len];length=0;while((tmp=myFile.get())!=EOF){str[length++]=tmp;}str[length]=’\0’;myFiie.close();}voiddoc::reverse(){//将数组str中的length个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个//字符交换……//***********333***********//***********666***********}doc::~doc(){delete[]str;}voiddoc::writeToFile(char*filename){ofstreamoutFile(filename);outFile<<str;outFile.close();}voidmain(){docmyDoc("in.dat");myDoc.reverse();myDoc.writeToFile("out.dat");}标准答案:inti,j;//定义两个整数临时变量i.j.for(i=0,j=length-1;i<j;i++,j--){chartemp=str[i];//把Str[i]中的值保存在临时变量tempstr[i]=str[j];//把Str[j]值赋给Str[i],实现字符前后替换str[j]=temp;//把保存在临时变量temp中的值再赋值给Str[j]}知识点解析:题目要求将myDoc中的字符序列反转,在main函数中我们看到mvDoc是doc类,根据doc类的定义可以知道它是把读取文件的字符串存到str动态数组中。reverse函数实现将数组str中的length个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,依次类推。使用变量i和j,分别表示第一个字符和最后一个字符的下标,定义temp作为中间变量进行交换。国家二级C++机试(操作题)模拟试卷第7套一、基本操作题(本题共1题,每题1.0分,共1分。)1、使用VC6打开考生文件夹下的源程序文件modi1.cpp,该程序运行时有错误,请改正程序中的错误,使得程序运行后没有内存遗漏。可以在修改处增加或者删除一条语句。本程序完成输入两个字符串,分别存储到s1,s2中。注意:不要改动main函数,不能增行或删行,也不能更改程序的结构,错误的语句在//******error********的下面。1#include<iostream.h>2voidmain()3{4char*s1;5chars2[1024];6cout<<’’pleaseinputastring:’’<<end1;7//********error********8cin.getlinne(s1,1024);9cout<<’’plesaeinputastring:’’<<end1;10cin.getline(s2,1024);11//********error********12deletes1;13//********error********14deletes2;15return,16}标准答案:(1)s1=newchar[1024];(2)delete[]s1;(3)删除“deletes2;”语句知识点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论