全国计算机等级考试二级C++上机考试指导.doc
1.二级C+语言次第方案上机检验包括全然把持、庞杂应用跟综合应用。2.C+上机把持要紧是恳求考生可以阅读跟分析C+次第,可以采用面向东西的办法编写次第,能熟练应用VisualC+6.0集成开拓状况编写跟调试次第。3.上机检验总时辰为90分钟,总分值100分,共有3种类型的考题:全然把持题、庞杂应用题、综合应用题。4.全然把持题要紧以改作题的办法出现,其出题范围要紧是C+中有关类与东西的把持,如调查查象的定义、东西成员的访征询办法等;庞杂应用题要紧是调查考生编写应用次第的才能,如题目恳求的功能完成某个函数的定义,或调查某种算法的C+完成等;综合应用题的出题范围要紧汇合在类跟东西以及类的承袭与派生这些知识点上。出题办法素日是恳求考生按照题目恳求将次第补偿残缺,并调试次第使之输出精确的结果。例1应用VC6打开考生文件夹下的工程proj1,此工程包括一个源次第文件main.cpp,但该次第运行有征询题,请改正main函数中的差错。源次第文件main.cpp清单如下:#includeclassMyClasspublic:MyClass(intm)member=m;MyClass()intGetMember()returnmember;private:intmember;MyClassMakeobject(intm)MyClass*pMyClass=newMyClass(m);return*pMyClass;intmain()intx=7;/*found*/MyClass*myobj=Makeobject(x);/*found*/cout<<Myobjecthasmember<<&NBSP;return0;分析:此题调查查象指针的应用,属于改错题。次第中出现了2个出错标识符,阐明此次第有2处差错。第1处差错:MyClass*myobj=Makeobject(x);,myobj是东西指针,而函数Makeobject的前去值是类MyClass的东西,因此应改为:MyClass*my0bj=&Make0bject(x);。第2处差错是:cout<<Myobjecthasmember<<&NBSP;成员名;跟(*东西指针名).成员名;,显然上述语句的东西指针的应用办法是差错的。答案:应改为:cout<<Myobjecthasmember<GetMember()<<&NBSP;<<(*myobj).GetMember()<例2请编写一个函数intfind(chars,chart),该函数在字符串s中查寻字符串t,假定寻到,那么前去字符串t在字符串s中的位置(整数值):否那么前去-1。留心:用数组办法及两重循环来完成该函数。留心:部分源次第已存在文件PROC2.cpp中。请勿修改主函数main跟其他函数中的任何内容,仅在函数find的花括号中填写假定干语句。文件PROC2.cpp的内容如下:#includeintfind(chars,chart);constintMAXLINE=256;intmain()charsourceMAXLINE,targetMAXLINE;cout<<pleaseinputastringforsearching:n;cin.getline(source,MAXLINE;cout<<pleaseinputastringyouwanttofind:n;cin.getline(target,MAXLINE);intintpos=find(source,target);if(intpos>=0)cout<<Findingit,Thetargetstringisatindex<<&NBSP;elsecout<<Notfindingitn;return0;intfind(chars,chart)分析:此题是一道庞杂应用题。函数intfind(chars,chart的功能是在字符串s中查寻字符串t,假定寻到,那么前去字符串t在字符串s中的位置(整数值);否那么前去-1。同时用数组办法及两重循环来完成该函数。答案:intfind(chars,chart)inti=0,j=0;for(i=0;si!=0;i+)if(t0=si)while(tj!=0&&si+j!=0)j+;if(tj!=si+j)break;if(tj=0)returni;return-1;例3请编写一个函数voidfun(intaa,intn,intx),其中n表示数组aa中元素的个数,函数的功能是:打算前x为的跟并放在aax中,aa数组中的元素值跟x的值由主函数通过键盘读入。部分源次第如下:#include#defineMAX100voidmain()voidfun(intaa,intn,intx);intbbMAX,i,x,n;cout<<pleaseenterthecounterofthenumber:n;cin>>n;cout<<pleaseenterthenumber:n;for(i=0;icin>>bbi;cout<<Inputthex:n;cin>>x;fun(bb,n,x);cout<<Thedataaftertotal:<<&NBSP;voidfun(intaa,intn,intx)分析:此题是一道庞杂应用题。按照题意分析可得:此题恳求考生统计一个数组中前x项的跟。此题要紧调查考生对数组作为形参的应用才能。答案:打算数组aa中前x项的跟可以用循环语句for来完成。次第如下:voidfun(intaa,intn,intx)inti=0,sum=0;for(i=0;isum=sum+aai;aax=sum;例4编写一个函数,用该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。比如,假定输出字符中“theabcthetheyhavetheren,子字符串为“the,那么应输出4。留心:部分源次第在文件PRDE1.CPP中。请勿修改主函数main跟其他函数中的任何内容,仅在fun的花括号中填入编写的假定干语句。部分源次第如下:#include#defineMAX100intfun(char*str,char*substr);intmain()charstrMAX,substr4;intn;cout<<pleaseInputthesourcestringn;cin>>str;cout<<pleaseInputthesubstringn;cin>>substr;n=fun(str,substr);cout<<Thecounteris:<<&NBSP;return0;intfun(char*str,char*substr)/分析:此题是一道庞杂应用题。(1)此题要紧调查考生对字符串指针或字符串数组的应用才能。函数fun的形参为两个字符串的首所在。(2)函数fun的功能是统计一个长度为3的字符串在另一个字符串中出现的次数。(3)此函数可用一个循环体跟if语句来完成,依次揣摸字符串substr中的值,寻到第一个字符时,设一个计数器k,将k+1赋给k,假定substr中下一个元素是str中的第2个元素那么将k自增,假定有连续3个字符与str中一样那么将计数器n自增。答案:完成此函数功能的办法有多种,下面给出其中一种答案。intfun(char*str,char*substr)intn,z;n=0;for(z=0;strz!=0;z+)if(strz=substr0&&(strz+1=substr1)&&(strz+2=substr2)nm+;return(n);例5应用VC6打开考生文件夹下的工程proj1,此工程包括一个源次第文件main.cpp,但该次第运行有征询题,请改正main函数中的差错,使次第的输出结果是:member=0member=5member=10源次第文件main.cpp清单如下:#includeclassMyClasspublic:MyClass(inti)member=i;voidSetMember(intm)member=m;intGetMember()constreturnmember;voidprint()constcout<<member=<<&NBSP;private:intmember;voidmain()/*found*/MyClassobj1;obj1.print();MyClassobj2(3);/*found*/obj1.member=5;/*found*/MyClass.SetMember(10);obj1.print();obj2.print();分析:此题要紧调查类与东西的应用。次第中出现了3个出错标识符,阐明此次第有3处差错。第1处差错:MyClassobj1;obj1.Print();,现在东西obj1不给出初始化值,因此该当改为MyClassobj1(0);obj1.print();。第2处差错:obj1.member=5;,由于类MyClass中,数据成员member是私有成员不克不迭通过类的东西obj1访征询。因此该当改为:obj1.SetMember(5);。第3处差错:MyClass.SteMember(10);,此处MyClass是一个类名,如斯的访征询办法不合法,该当改为:obj2.SteMember(10);。答案:修改后的main()函数该当为:voidmain()MyClassobj1(0);obj1.print();MyClassobj2(3);obj1.SetMember(5);obj2.SetMember(10);obj1.print();obj2.print();例6应用VC6打开考生文件夹下的工程proj3。此工程包括一个源次第文件main.cpp,其中定义的类并不残缺,按恳务完成以下把持,将类的定义补偿残缺。(1)定义类Planet的保护数据成员distance跟revolve,它们分不表示行星距太阳的距离跟行星的公转周期。其中,distance为double型,revolve为int型。请在注释“/*1*之后添加适当的语句。(2)定义类Earth的构造函数Earth(doubled,intr),并在其中打算地球绕态阳公转的轨道周长。假定:circumference=2*d*3.1416。请在注释“/*2*之后添加适当的语句。(3)定义类Earth的成员show(),用于表示所有信息。包括地球距太阳的距离,地球的公转周期,以及地球绕太阳公转的轨道周长。请在注释“/*3*之后添加适当的语句。源次第如下:#includeclassplanetprotected:/*1*public:planet(doubled,intr)distance=d;revolve=r;classEarth:publicplanetdoublecircumference;public:/*2*/*3*;voidmain()Earthobj(9300000,365);obj.show;答案:(1)第1处是完成类Planet的保护数据成员distance跟revolve的定义,按照题意可填入:doubledistance;intrevolve;。(2)第2处是定义类Earth的构造函数Earth(doubled,intr),并在其中打算地球绕太阳公转的轨道周长。由此可填入:Earth(doubled,intr):planet(d,r)circumference=2*d*3.1416;。(3)第3处是定义类Earth的成员show(),用于表示所有信息。按照恳求可填入:voidshow()cout<<&NBSP;<&NBSP;<&NBSP;<&NBSP;<&NBSP;例7应用VC6打开考生文件夹下的工程proj3。此工程包括一个源次第文件main.cpp,此次第的运行结果为:Derivelsprint()called.Derive2sprint()called.其中定义的类并不残缺,按恳务完成以下把持,将类的定义补偿残缺。(1)定义函数print()为无值型纯虚函数。请在注释“/*1*之后添加适当的语句。(2)树破类Derive1的构造函数,请在注释“/*2*之后添加适当的语句。(3)完成类Derive2成员函数Print()的定义。请在注释“/*3*之后添加适当的语句。(4)定义类Derive1的东西指针d1,类Derive2的东西指针d2。其初始化值分不为1跟2。#includeclassBasepublic:Base(inti)b=i;/*1*protected:intb;classDerivel:publicBasepublic:/*2*voidprint()cout<<Derivelsprint()called.<classDerive2:publicBasepublic:Derive2(inti):Base(i)/*3*;voidfun(Base*obj)obj->print();voidmain()/*4*fun(d1);fun(d2);答案:此题是一道综合应用题,调查承袭与派生,以及纯虚函数。(1)在第1处定义函数print()为无值型纯虚函数。因此应填入:virtualvoidprint()=0;。(2)在第2处树破类Derive1的构造函数,因此应填入:Derivel(inti):Base(i)。(3)在第3处完成类Derive2成员函数print()的定义,按照次第的输出可知,此处应填入:voidprint()cout<<Derive2sPrint()called.<(4)在第4处定义类Derive1的东西指针d1,类Derive2的东西指针d2,其初始化值分不为1跟2。因此应填入:Derive1*d=newDerive1(1);Derive2*d2=newDerive2(2)。例8应用VC6打开考生文件夹下的工程proj3。此工程包括一个源次第文件main.cpp,其中定义了用于表示日期的类Date,但类Date的定义并不残缺。请按恳务完成以下把持,将类Date的定义补偿完成:(1)定义私有数据成员year、month跟day分不必于表示年、月、日,它们全然上int型的数据。请在注释:“/*1*之后添加适当的语句。(2)完成默认构造函数Date的定义,使Date东西的默认值为:year=1,month=1,day=1,请在注释“/*2*之后添加适当的语句。(3)完成重载构造函数Date(inty,intm,intd)的定义,把数据成员year、month跟day分不初始化为参数y、m跟d的值,请在注释“/*3*之后添加适当的语句。(4)完成成员函数print的类外定义,使其以“年-月-日的格式将Date东西的值输出到屏幕上。请在注释“/*4*之后添加适当的语句。留心:除在指定位置添加语句之外,请不要修改次第中的其他内容。源次第文件main.cpp清单如下:/main.cpp#includeclassDatepublic:/*2*Date(inty,intm,intd)/*3*voidprint()const;private:/datamember/*1*;voidDate:print()const/*4*intmain()Datenationalday(1949,10,1);nationalday.print();return0;答案:此题是综合应用题。(1)定义私有数据成员year、month跟day分不必于表示年、月、日,它们全然上int型的数据。因此在1处填入:intyear,month,day;(2)完成默认构造函数Date的定义,使Date东西的默认值为:year=1,month=1,day=1。按照以上恳求可知类Date的默认构造函数(2处)为:Date()year=1;month=1;day=1。(3)完成重载构造函数Date(inty,intm,intd)的定义,把数据成员year、month跟day分不初始化为参数y、m跟d的值。现实上也的确是给私有成员year、month跟day赋值。因此在3处应填入:year=y;month=m;day=d;(4)完成成员函数print的类外定义,使其以“年-月-日的格式将Date东西的值输出到屏幕上。函数print的功能是输出Date东西的值,此处要紧调查C+的格式化输出。因此在4处该当填入:cout<<&NBSP;<&NBSP;<&NBSP;<&NBSP;<&NBSP;分析次第中的差错,并改之。#include#includeclassstringprivate:char*str;public:string(char*s)str=newcharstrlen(s)+1;strcpy(str,s);voidpring()cout<<&NBSP;string()cout<<DELETE<voidmain()strints1=hello!;strints2=s1;s1.print();s2.print();分析下面次第中的差错,并改之。classaresintn;public:ares();ares(intn1);ares()cout<<Destructing<ares:ares()cout<<Intializingdefault<n=0;ares:ares(intn1)cout<<Intializing<n=n1;voidmain()aresx=1;aresy=x;分析下面次第中的差错,并改之。classaresconstinta:int&b;public:ares(inta1,intb1)ares()cout<<Destructing<ares:ares(inta1,intb1)a=a1;b=b1;voidmain()aresx(1,2);寻出下面次第中的差错并阐明因由。#classbaseprotected:intp;voidfun()baseb;intx=b.p;指出以下次第段中差错的语句,并阐明缘故。classXprivate:inta;staticints;public:voidfun()s=10;staticvoidsfun(X&);voidX:sfun(X&r)a=10;r.a=10;寻出以下次第中差错的语句,并阐明差错的缘故。templateTmax(Tx,Ty)return(x>y)?x:y;voidfun(inti,charc)max(i,i);max(c,c);max(i,c);max(c,i);仔细阅读下面的次第,谁人次第是想通过包括一个从filename到ifstream&的自动典范转换运算,使得在任何应用ifstream的所在都可以应用filename东西。假定是main()中cout<<#include#include#includeclssfilenameifstreamFile;charbuf100;ostrstreamName;intnameset;public:filename(void):Name(ubf,100),nameset(0)filename(ocnstchar*Filename):File(Filename),Name(ubf,100)Name<<&NBSP;nameset=1;constchar*name(void)constreturnbuf;voidname(constchar*newname)if(nameset)return;Name<<&NBSP;nameset=1;operatorifstream&(void)returnFile;voidmain(void)filenamefile(ygefilename.txt);cout<<&NBSP;cout<<&NBSP;仔细阅读下面的次第,寻出构造ttt中的差错,改正其中的差错并阐明因由。#includestructtttintx;inty;intz;ttt(int,int,int)vioddisplay(void);ttt:ttt(inta,intb,intc)x=a;y=b;z=c;voidttt:display(void)cout<<x=<<&NBSP;<&NBSP;<&NBSP;<&NBSP;<&NBSP;<&NBSP;<&NBSP;voidmain(void)intaray5;for(inti=0;i<5;i+)cout<<&NBSP;cout<intaray25=0;for(intj=0;j<5;j+)ocut<<&NBSP;cout<intaray3=1,2,3,4,5;for(intk=0;kcout<<&NBSP;cout<tttttt45=ttt(1,2,3),ttt(4,5,6),ttt(7,8,9),ttt(10,11,12);fot(ints=0;s<5;s+)ttt4s.display();按照题目的意思,不才划线处填写精确的语句,恳求至少写出4种办法。#includestructbaseintx;inty;intz;voidmain(void)baseB=10,20,30;base*pB;pB=&B;intsum;sum=/用sum表示东西B中x、y、z的跟cout<<sum=<<&NBSP;以下次第先接收假定干用户的姓名跟号码,按姓名的字典次第摆设后,再输出用户的姓名跟号码。#include#inclued#includeconstintN=5;/设有5个用户classpersoncharname10;charnum10;public:voidgetdata(1)strcpy(name,na);strcpy(num,nu);friendvoidgetsort(personpnN);friendvoidoutdata(personpnN);voidgetsort(personpnN);/对东西数组停顿选择法排序inti,j,k;persontemp;for(i=0;ik=1;for(j=i+1;jif(strcmp(2)>0)k=j;temp=pnk;pnk=pni;pni=temp;voidoutdata(personpnN)/输出姓名跟号码inti;cout<<姓名号码n;cout<<-n;cout.setf(ios:left);for(i=0;icout.width(10);cout<cout.width(10);cout<<&NBSP;voidmain()char*na5=Li,Zhang,Ma,Chen,Gao;char*nu5=8765781,5583901,8688080,8079500,9855321;personobj5;for(inti=0;i<5;i+)(3);person(4);getsort(pt);outdata(pt);以下次第是一个含有比较运算符跟赋值运算符重载的次第。请填空完成次第并上机运行验证。#includeclasspointprivate:floatx,y;public:point(floatxx=0,floatyy=0x=xx;y=yy;point(point&);point()booloperator=(point);booloperator!=(point);pointoperator+=(point);pointoperator-=(point);floatgetx()returnx;floatgety()returny;point:point(point&p)(1);boolpoint:perator=(pointp)if(2)return1;elsereturn0;boolpoint:perator!=(pointp)if(x!=p.getx()&&y!=p.gety()return1;elsereturn0;pointpoint:perator+=(pointp)this->x+=p.getx();this->y+=p.gety();return(3);pointpoint:operator-=(pointp)this->x-=p.getx();this->y-=p.gety();return*this;voidmain()pointp1(1,2),p2(3,4),p3(5,6);cout<<p1=p2?<<(p1=p2)<cout<<p1!=p2?<<(p1!=p2)<p3+=p1;cout<<p3+=p1,p3:<<&NBSP;<&NBSP;<&NBSP;p3-=p1;cout<<p3+=p1,p3:<<&NBSP;<&NBSP;<&NBSP;运行结果为:p1=p2?0p1!=p2?1p3+=p1,p3:6,8p3+=p1,p3:5,6以下次第中声明一个哺乳动物Mammal类,再由此派生出Dog类,二者都定义Spesk()成员函数,基类中定义Spesk()为虚函数。主次第中分不声明一个Mammal类跟Dog类的东西,再分不必“东西名.函数名跟指针的办法调用Spesk()函数。请填空完成次第并上机运行验证。#includeclassMammalpublic:(1)voidSpeak()cout<<ThisisaMammal!<classDog:publicMammalpublic:voidSpeak()cout<<Thisisadog!<voidmain()Mammalm,(2);Dogd;m.Speak();d.Speak(0;ptr=&m;ptr->Speak();(3);ptr->Speak();次第不克不迭运行。应在类的定义中加上下段。string:string(string&a)str=newcharstrlen(a.str)+1;strcpy(str,a.str);次第才能掉掉落精确结果。庞杂地说的确是缺少拷贝初始化构造函数。此题的差错在于不定义类之间的赋值函数。此题的差错在于初始化const跟引用成员时,必须通过成员初始化列表停顿。intx=b.p语句差错,x不克不迭开门见山访征询类体内的保护成员。a=10;错。静态成员函数只能通过东西名(或指向东西的指针)访征询该东西的非静态成员。max(i,c)跟max(c,i)语句是差错的。出现差错的缘故是由于不隐含的典范转换的功能,实例化T的各模板之间必须保持残缺不合的典范。如对语句max(i,c);编译器将先按变量i将T阐明为int典范,此后出现的模板实参c不克不迭阐明为int典范时,便发生差错,在此不隐含的典范转换的功能。承袭办法的完成如下:#include#include#includeclassfilename:publicifstreamcharbuf100;ostrstreamNane;intnameset;public:filename(void):Name(buf,100),nameset(0)filename(constchar*Filename):ifstream(Filename),Name(buf,100)Name<<&NBSP;nameset=1;constchar*name(void)constreturnbuf;voidname(constchar*newname)if(nameset)return;Name<<&NBSP;nameset=1;在不构造函数时编译器会自动创破一个缺省构造函数,但如量有了构造函数就不会自动创破一个缺省构造函数了。语句tttttt4(5)调用4次构造函数(有参数)创破4个数组东西,但第5个数组那么要调用无参数构造函数,因此次第的差错是构造ttt中不定义无参数构造函数,可以在ttt构造体内加上如下语句:ttt()精确语句的4种填法为:B.x+B.y+B.z;PB->x+pB->y+pB->z;(&B)->x+(&B)->y+(&B)->z;(*pB).x+(*pB).y+(*pB).z;(1)char*na,char*nu或charna,charnu(2)pnk.name,pnj.name(3)obji.getdata(nai,nui)(4)*pt=obj分析:(1)空位于类成员函数getdata()的形参表中,按照其后的函数体内容跟数据成员的典范,易知(1)处应填char*na,char*nu或charna,charnu。(2)空位于停顿排序的友元函数getsort(personpnN的比较语句中,按照函数的参数跟意恳求,可知此处是对东西数组pnN的name成员停顿比较,故填pnk.name,pnj.name。在主函数中,留心到定义了东西数组objN,但不被赋值,因此(3)处要填obji.getdata(nai,nui),完成对各东西元素的赋值。空(4)处应留心到下两函数调用中的实参为pt,而pt又不被定义且应为指向类东西数组的指针,故此处填*pt=obj。(1)x=p,x;y=p.y(2)x=p.getx()&&y=p.gety()(3)*this分析:这是一个含有比较运算符跟赋值运算重载的次第。从次第可以看出,这两种运算符的重载特别随便完成,其中(1)处是point类的拷贝构造函数定义;(2)处是比较两个点是否相当,故可知(2)处应填x=p.getx()&&y=p.gety(),表示x值跟y值都相当时,前去1,否那么前去0;(3)处是前去this指针的内容。(1)virtual(2)*ptr(3)ptr=&d分析:这是一个含有虚函数的次第。起重要留心的是虚函数必须在基类中定义,因此(1)处应填virtual;其次在用指针对基类跟派生类东西把持时,指针应定义为基类的指针,假定定义为派生类的指针,那么该指针只能指向派生类的东西,而不克不迭指向基类东西,因此(2)处应填*ptr,定义一个基类指针;(3)处填入ptr=&d,是让指针指向派生类东西。