二级C++上机考试说明1.二级C++语言程序设计上机考试包括基本操作、简单应用和综合应用。2.C++上机操作主要是要求考生能够阅读和分析C++程序,能够采用面向对象的方法编写程序,能熟练使用VisualC++6.0集成开发环境编写和调试程序。3.上机考试总时间为90分钟,满分100分,共有3种类型的考题:基本操作题、简单应用题、综合应用题。4.基本操作题主要以改作题的形式出现,其出题范围主要是C++中有关类与对象的操作,如考核对象的定义、对象成员的访问方式等;简单应用题主要是考察考生编写应用程序的能力,如题目要求的功能实现某个函数的定义,或考核某种算法的C++实现等;综合应用题的出题范围主要集中在类和对象以及类的继承与派生这些知识点上。出题形式通常是要求考生按照题目要求将程序补充完整,并调试程序使之输出正确的结果。经典例题解析例1使用VC6打开考生文件夹下的工程proj1,此工程包含一个源程序文件main.cpp,但该程序运行有问题,请改正main函数中的错误。源程序文件main.cpp清单如下:#includeclassMyClass{public: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″ return0;分析:本题考核对象指针的应用,属于改错题。程序中出现了2个出错标识符,说明此程序有2处错误。第1处错误:MyClass*myobj=Makeobject(x);,myobj是对象指针,而函数Makeobject的返回值是类MyClass的对象,所以应改为:MyClass*my0bj=&Make0bject(x);。第2处错误是:cout″Myobjecthasmember″ 成员名;和(*对象指针名).成员名;,显然上述语句的对象指针的使用方式是错误的。答案:应改为:cout″Myobjecthasmember″GetMember() (*myobj).GetMember()例2请编写一个函数intfind(chars[],chart[]),该函数在字符串s中查找字符串t,如果找到,则返回字符串t在字符串s中的位置(整数值):否则返回-1。注意:用数组方式及两重循环来实现该函数。注意:部分源程序已存在文件PROC2.cpp中。请勿修改主函数main和其他函数中的任何内容,仅在函数find的花括号中填写若干语句。文件PROC2.cpp的内容如下:#includeintfind(chars[],chart[]);constintMAXLINE=256;intmain(){charsource[MAXLINE],target[MAXLINE];cout″pleaseinputastringforsearching:\n″;cin.getline(source,[MAXLINE]);cout″pleaseinputastringyouwanttofind:\n″;cin.getline(target,MAXLINE);intintpos=find(source,target);if(intpos=0)cout″Findingit,Thetargetstringisatindex″ elsecout″Notfindingit\n″;return0;}intfind(chars[],chart[]){}分析:本题是一道简单应用题。函数intfind(chars[],chart[])的功能是在字符串s中查找字符串t,如果找到,则返回字符串t在字符串s中的位置(整数值);否则返回-1。而且用数组方式及两重循环来实现该函数。答案:intfind(chars[],chart[]){inti=0,j=0;for(i=0;s[i]!=′\0′;i++){if(t[0]==s[i]){while(t[j]!=′\0′&&s[i+j]!=′\0′){j++;if(t[j]!=s[i+j])break;}}if(t[j]==′\0′)returni;}return-1;}例3请编写一个函数voidfun(intaa[],intn,intx),其中n表示数组aa中元素的个数,函数的功能是:计算前x为的和并放在aa[x]中,aa数组中的元素值和x的值由主函数通过键盘读入。部分源程序如下:#include#defineMAX100voidmain(){voidfun(intaa[],intn,intx);intbb[MAX],i,x,n;cout″pleaseenterthecounterofthenumber:\n″;cinn;cout″pleaseenterthenumber:\n″;for(i=0;icinbb[i];cout″Inputthex:\n″;cinx;fun(bb,n,x);cout″Thedataaftertotal:″ }voidfun(intaa[],intn,intx){}分析:本题是一道简单应用题。根据题意分析可得:本题要求考生统计一个数组中前x项的和。本题主要考查考生对数组作为形参的应用能力。答案:计算数组aa[]中前x项的和可以用循环语句for来实现。程序如下:voidfun(intaa[],intn,intx){inti=0,sum=0;for(i=0;isum=sum+aa[i];aa[x]=sum;}例4编写一个函数,用该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。例如,假定输入字符中“theabcthetheyhavetheren”,子字符串为“the”,则应输出4。注意:部分源程序在文件PRDE1.CPP中。请勿改动主函数main和其他函数中的任何内容,仅在fun的花括号中填入编写的若干语句。部分源程序如下:#include#defineMAX100intfun(char*str,char*substr);intmain(){charstr[MAX],substr[4];intn;cout″pleaseInputthesourcestring\n″;cinstr;cout″pleaseInputthesubstring\n″;cinsubstr;n=fun(str,substr);cout″Thecounteris:″ 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;str[z]!=′\0′;z++){if((str[z]==substr[0]&&(str[z+1]==substr[1])&&(str[z+2]==substr[2]))nm++;}return(n);}例5使用VC6打开考生文件夹下的工程proj1,此工程包含一个源程序文件main.cpp,但该程序运行有问题,请改正main函数中的错误,使程序的输出结果是:member=0member=5member=10源程序文件main.cpp清单如下:#includeclassMyClass{public:MyClass(inti){member=i;}voidSetMember(intm){member=m;}intGetMember()const{returnmember;}voidprint()const{cout″member= }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**”之后添加适当的语句。源程序如下:#includeclassplanet{protected://**1**public:planet(doubled,intr){distance=d;revolve=r;}};classEarth:publicplanet{doublecircumference;public://**2**//**3**};voidmain(){Earthobj(9300000,365);obj.show;}答案:(1)第1处是完成类Planet的保护数据成员distance和revolve的定义,根据题意可填入:doubledistance;intrevolve;。(2)第2处是定义类Earth的构造函数Earth(doubled,intr),并在其中计算地球绕太阳公转的