程序设计基础(二)题库_第1页
程序设计基础(二)题库_第2页
程序设计基础(二)题库_第3页
程序设计基础(二)题库_第4页
程序设计基础(二)题库_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

从面向过程到面向对象―、单项选择题在面向对象方法中,实现信息隐蔽是依靠()。对象的继承B.对象的多态C.对象的封装D.对象的分类下列对对象概念描述错误的是()。任何对象都必须有继承性B.对象是属性和方法的封装体C.对象间的通信靠消息传递D.操作是对象的动态性属性在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送()。A.调用语句B.命令C.口令D.消息下列概念中,不属于面向对象方法的是()。A.封装B.继承C.多态D.过程调用下列关于类和对象的叙述中,错误的是()。—个类只能有一个对象对象是类的具体实例类是对某一类对象的抽象类和对象的关系是一种数据类型与变量的关系所谓多态性是指()。A.—个对象调用不同名称的对象B.不同的对象调用相同名称的函数C.一个对象调用不同名称的函数D.不同的对象调用不同名称的函数在C++语言中,用于实现运行时多态性的是()。A.内联函数B.重载函数C.模板函数D.虚函数8•在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送()。A.调用语句 B.命令C.口令 D.消息下面说法正确的是()。成员函数的代码段不占用对象的存储空间在类内定义的成员函数的代码段占用对象的存储空间对象所占用的存储空间包括该对象的数据成员空间和成员函数空间同一类的多个不同对象的成员函数对应不同的函数代码段下面对于友元函数描述正确的是()。友元函数的实现必须在类的内部定义友元函数是类的成员友元函数破坏了类的封装性和隐藏性友元函数不能访问类的私有成员关于new运算符的下列描述中,()是错的。它可以用来动态创建对象和对象数组使用它创建的对象或对象数组可以使用运算符delete删除c.使用它创建对象时要调用构造函数使用它创建对象数组时必须指定初始值运算符重载函数不能是()。A.成员函数 B.友元函数C.内联函数 D.带默认值参数的函数二、 简答题面向对象程序设计语言有哪些特征?答:面向对象程序设计有三个基本特性:封装、继承和多态。所谓封装,就是通过定义类并且给类的属性和方法加上访问控制权限来抽象事物的本质特性。所谓继承,就是在定义一个新的类时,可以先把一个或多个已有类的功能全部包含进来,然后再给出新功能的定义或对已有类的功能重新定义,它是代码重用的一种机制。所谓多态性,就是不同对象收到相同的消息时,产生不同的动作,它是实现“一个接口,多种方法”的一种机制。试比较面向过程程序设计方法和面向对象程序设计方法的区别。答:面向过程程序设计是一种以功能为中心、基于功能分解的程序设计方法。一个过程式程序由一些子过程(函数)构成,每个子程序对应一个子功能,它实现了功能抽象。子程序描述了一系列的操作,它是操作的封装体。过程式程序的执行过程体现为一系列的子程序(函数)调用。在过程式程序中,数据处于附属地位,它独立于子程序,在子程序调用时作为参数传给子程序使用。面向过程程序设计的特征可以描述为:程序二算法+数据结构面向对象程序设计是一种以数据为中心、基于数据抽象的程序设计方法。一个面向对象程序由一些对象构成,对象是由一组数据及可以作用于其上的一组操作所构成的封装体。对象的特征由相应的类来描述,一个类可以从其他类继承。面向对象程序的执行过程体现为各个对象之间相互发送和处理消息。面向对象程序设计的特征可以描述为:程序二对象/类+对象/类+„+对象/类对象/类二数据+操作三、 程序填充题请将下列程序横线处缺少的部分补上,使其能正确运行。1、每个考生的考号及10道试题得分依次在一行内输入。约定未选做的试题得分用负数(一1)标识。选答试题多于5道题,按前5道题得分评定成绩。如有不合理的得分或输入错误,程序要求重新输入。程序以输入的考生考号为负数表示输入结束。程序输出各考生的考号、总分和成绩等级。其中成绩等级按如下所示规则评定:总分等级90〜100A80〜89B70〜79C60〜69D0〜59 E程序还对实考人数、各等级得分人数及各试题解答人数与平均得分(保留小数两位)进行统计和输出。include<iostream>9include<iomanip>usingnamespacestd;intmain(){constintMAXSCORE=20;constintQUESTION=10;constintORDERS=5;intp[QUESTION]={0,0,0,0,0,0,0,0,0,0};//p[数组用于存放考生10道题的得分intn[QUESTION]={0,0,0,0,0,0,0,0,0,0};//n[i]数组元素表示第i题的解答人数ints[QUESTION]={0,0,0,0,0,0,0,0,0,0};//s[数组元素表示第i题的总得分intf[0RDERS]={0,0,0,0,0}; //f[]数组用于存放各成绩等级的人数inti,score,c,number,pn=0;//pn表示实考人数charflag,ch[120];char*title[]={"90—100A”,”80-89”,”70—79C”,”60--69D”,”0--59E”};while⑴{cout«nEnternumber&&scorel scorelO\nn;cin»number;if(number==0)gets(ch);cout《"Number=0.Error!Inputagain!n«endl;continue;} ;〃⑴for(c=0,i=0;i<QUESTION&&c==i;i++){cin»p[i];if(p[i]<=MAXSCORE) ;〃⑵-}if( {gets(ch);cout«"Score:"«p[c]«">20.Error!Inputagain!',《endl;continue;}for(c=0,score=0,i=0;i<QUESTION;i++)if( ) //(4){C++;score+=p[i];n[i]++;s[i]+=p[i];}flag=(score==100)?'Ai:(score<60)? ; //(5)f[ ]++; //(6)pn++;cout«mNumber=m«number«"Score=m«score«"Mark=n«flag«endl;}cout《"STUDENTS=n«pn«endl;for(i=0;i<ORDERS;i++)cout«title]i]«f[i]«endl;cout«"\nQuestionStudentsAverage、n";for(i=0;i<QUESTION;i++)if(n[i])cout«setw(6)«i+1«setw(10)«n[i];cout«setw(10)«setprecision(4)« «endl;//(7)elsecout«setw(6)«i+1«setw(10)«n[i]«setw(10)«" --”《endl;return0;}2.下列程序是一个简单的计算器模拟程序。对任意给定的正确四则运算表达式,程序计算结果值并输出。程序无查错功能,假定所输入的都是正确的四则运算表达式,并且表达式中运算分量为无正负号整数,运算符为“+、一、*、/”,圆括号按常规配对,表达式以字符“二”结束。程序中,函数指针数组func□是为了统一加减乘除计算而设置的。函数getach()的功能是获取表达式的一个合法字符,并将字符存入变量curch,函数getid()的功能是判断刚才输人的字符是操作数还是运算符。若读入的字符不是数字,要判断一下是哪个运算符,不同的运算符返回不同的值。函数calO使用了递归算法。它的功能是:首先判断已经输入的字符,若是则根据括号优先的原则,先递归调用自己,求出括号里的表达式的值,否则肯定是操作数(假定所输入的都是正确的四则运算表达式,这样一个表达式的开头不是括号就肯定是操作数),将其值从全局变量mim赋给xl。接着读入一个运算符,若运算符是“)”或"=",则完成一级运算,返回结果xl。读入第2个操作数,词上,若读人的字符是“(”,则根据括号优先的原则,先递归调用自己,求出括号里的表达式的值,否则将其值赋给操作数x2。然后读入第2个运算符。下一步的操作应当是先读人第3个操作数,再根据opl和op2的优先级决定进行运算opl还是叩2,并将计算结果作为操作数xl或x2,继续后续计算。循环的结束条件是遇到“)”或“=”,说明一对括号内的计算完成或整个计算结束。include<iostream>include<string.h>usingnamespacestd;intmyadd(intx,inty){returnx+y;}intmysub(intx,inty){returnx-y;}intmymul(intx,inty){returnx*y;}intmydiv(intx,inty){returnx/y;}int(*func[])(intx,inty)二{myadd,mysub,mymul,mydiv};intnum,curch};charchtbl[]=n+-*/()=n;charcorch[]="+-*/()=0123456789";intgetach(){inti;while(l)<='91;getach())(i<=5)getach();returni;}int{intxl,x2,x3,opl,op2,i;i=getid();ifcal();cal()(i==4)xlelse<='91;getach())(i<=5)getach();returni;}int{intxl,x2,x3,opl,op2,i;i=getid();ifcal();cal()(i==4)xlelsexl

opl==num;getid();5)returnxl;getid();if(opl>=i二if(i==4)cal();x2elsex2op2=while=num;getid();(( curch=getchar();if(curch==EOF)return-1;for(i=0;corch[i]&&curch!=corch[i];i++);if(i<strlen(corch))break;}returncurch;}getid()intgetid(){inti;if(curch>='0*&&curch<='9'){for(num=0;curch>='01&&curchnum二 ; //(1)return—1;}else{for(i=0;chtbl[i];i++)if(chtbl[i]==curch)break;ifi=getid();if(i==4)x3=cal();elsex3=num;if((opl/2==0)&&(op2/2==1))x2=(*func[op2])(x2,x3);else{xl= ; "(3)x2=x3; ;//(4)}op2=getid();}return( (xl,x2); //(5)}intmain(){intvalue;cout"MPleaseinputanexpression:\n;getach();while(curch!=‘二'){value=cal();cout<<”Theresultis" <<value<<endl;cout<〈"Pleaseinputanexpression:\n,";getach();}return0;}对于正整数n,输出其和等于n且满足以下限制条件的所有正整数的和式,即组成和式的数字自左至右构成一个非递增的序列。如n=4,程序输出为4=44=3+14=2+24=2+1+14=1+1+1+1程序中给出了分别采用递归和非递归解法的两个函数nl()和nd()。函数rd()采用递归解法,它有两个参数n和k。意义分别是被分解和式的数n,及当前第k深度分解。算法思想是对n的所有合理的和式分解,将分解出的数(称为和数)存于数组a[]中。当其中一个分解不再需要进一步分解时,即找到一个解,将存于数组a[]中的一个完整和式的和数输出。当还需要进一步分解时,以要进一步分解的数及分解深度为参数,递归调整甩分解和式函数。函数nd()以要分解的数为参数,另幵设一个数组r□,用于存储当前还未分解的余数。在求一个解的第k步时,a[k]为第k个和数,r[k]为相应的余数。当找到一个分解后(此步r[k]等于0),输出解,并作回溯处理,从当前k退回到第一个不为1的和数,将其减1,并将其余数加1,准备去找另一个解;否则,生成下一步的分解和数与余数。#include<iostream>usingnamespacestd;constintMAXN=100;inta[MAXN],r[MAXN];voidrd(intn,intk);voidnd(intn);intmain(){intn;cout〈〈"Pleaseinputaunsignedinteger(>0)cin>>n;a[0]=n;rd(n,1);cout<<"\n \n\n";nd(n);cout<<"\n \n\n,!;return0;}voidrd(intn,intk){intj,i;for(j= ;j>=1;j--//)(1){a[k]=j;if( )//(2)cout<<a[0]<<"="<<a[1];for(i=2;i<=k;i++)cout<<"+"<<a[i];cout<<endl;}else //(3)}}voidnd(intn){inti,k;k=0;r[0]=n;doif( //(4){cout<<a[0]<<"="<<a[1];for(i=2;i<=k;i++)cout<<"+"<<a[i];cout<<endl;while(k>0&& )k-;//(5)if(k>0){a[k]—;r[k]++;}}else{a[k+1]= //(6)r[k+l]=r[k]-a[k+l];k++;}}while(k>0);}打保龄球是用一个滚球去打击10个站立的瓶子,将瓶子击倒。1局分10轮,每轮可滚球一次或多次,以击倒的瓶子数量为依据计分。1局得分为10轮得分之和,而每轮得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的瓶子数量不仅要计入本轮得分,还可能会计入前一两轮得分。具体规则和计分方法如下:若某一轮的第一次滚球就击倒全部10个瓶子,则本轮不再滚球(若是第10轮则还需另加两次滚球〉。该轮得分为本次击倒瓶子10与另加两次滚球所击倒瓶子数量之和。若某一轮的第一次滚球未击倒10个瓶子,则可对剩下未倒的瓶子再滚球一次。知果这两次滚球击倒全部10个瓶子,则本轮不再滚球(若是第10轮则还需另加一次滚球),该轮得分为本次击倒瓶子数量10与另加一次滚球所击倒瓶子数量之和。若某一轮的两次滚球未击倒全部10个瓶子,则本轮不再继续滚球,该轮得分为这两次滚球击倒的瓶子数量之和。实例说明如下轮次Lc2—n3—hr\5—n6—7o8—hr\9—W-各轮第一次89101098810898得分第二次1'/rx/1rc2/2rr\1rc/得分得分20cr\29LC2018r\r*20201918rc累计总分929587896501214i61下面程序是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次输入一次滚球击倒的瓶子数量,计算该轮得分和累计总分。为记录因一轮内击倒10瓶子,还暂不能计算该轮得分和累计总分的情况,程序引入变量ok,用来记录当前已完成完整计算的轮次。程序每输人一次滚球击倒瓶子数量,就检查还未完成完整计算的轮次,并计算。#include<iostream>#include<iomanip>usingnamespacestd;structBowlingRoundintn;//一轮内滚球次数intf;//第一次击倒瓶子数量ints;//第二次击倒瓶子数量intscore;//本轮得分inttotal;//至本轮累计总分intm;//完成本轮得分计算,还需滚球次数};intok=0; //已完成完整计算的轮次数intball(BowlingRound*a,inti,intn,intmax)/完成一次滚球,输入正确击倒瓶子数量{intd,j;staticintc=1;while(l){if(i<=10)cout<〈"输入第n<<i<〈"轮的第"<<n<〈"次滚球击倒柱数.(〈二"<<max<<")<<endl"elsecout<<"输人附加的第"<<c++<〈"次滚球击倒柱数.(<="<<max<<")<<endl";cin>>d;if(d>=0&&d<=max)break;cout<<"不合理的击倒瓶子数量,请重新输入!"<<endl;}if(ok< ) //(1){//对以前未完成计算的轮次分别计算得分与累计总分for(j=ok+1; ;j++) //(2){a[j].score+=d;if(--a[j].m==0){a[j].total=( )+a[j].score;"(3)ok= ; //(4)}}}returnd;}intmain()BowlingRounda[13];inti,first,second,k;for(i=1;ok<10;i++){//处理第一次滚球a[i].score=a[i].f=first二ball(a,i,1,10);if(first二二10)a[i].m=2;a[i].n=1;if(first<10&&(i<=10||i==11&&ok<10)){//处理第二次滚球 =second二ball(a,i,2,10-first);"(5)if(first+second==10)a[i].m=1; ;//(6)}if(i<=10&&first<10&&first+second<10){a[i].total=(i>1?a[i-1].total:0)+a[i].score; ;//(7)}cout〃〃各轮第一次得分:〃;for(k=1;k<=i;k++)cout〃setw(4)〃a[k].f;cout<<〃\n各轮第二次得分:〃;for(k=1-k<=i;k++)if(a[k].n<2)cout〃setw(4)〃n/";elsecout<<setw(4)<<a[k].s;cout<<〃\n各轮得分:〃;for(k=1;k<=ok;k++)cout〃setw(4)"a[k].score;cout〃〃\n累计总分:〃;for(k=1;k<=ok;k++)cout<<setw(4)<<a[k].total;cout<<endl<<endl;}}下列程序实现两个多项式相乘。多项式用链表表示,链表上的各结点按多项式的幂指数降序链接。例如,设f(x)=3.5x8+6.4x4-4.8x3+5x-10,链表表示如图7-1所示。#include<iostream>usingnamespacestd;structPolyNode{intindex;doublecoef;structPolyNode*next;};PolyNode*inpolyO;PolyNode*polymul(PolyNode*f,PolyNode*g);voidwrite(PolyNode*g);PolyNode*reverse(PolyNode*g);intmain()PolyNode*f,*g,*s;cout<<"请输入多项式f"<<endl;f=inpolyO;cout<<"多项式f二";write(f);cout<<"请输入多项式g"<<endl;g=inpolyO;cout<<"多项式g二";write(g);s=polymul(f,g);cout<<"多项式f*g=";write(s);return0;}PolyNode*reverse(PolyNode*g){PolyNode*u二NULL,*v二g,*w;while(v){w=v—>next;v—>next二u;u=v;v=w;}returnu;}PolyNode*polymul(PolyNode*f,PolyNode*g){PolyNode*fp,*gp,*tail,*p二NULL,*q;inti,maxindex;doubletemp;maxindex=f—>index+g—>index;g=reverse(g);for(i=maxindex;i>=0;i—){fp=f;gp=g;while(fp!=NULL&&fp—>index>i)fp=fp—>next;while(gp!=NULL&&gp—>index<i—fp—>index)gp=gp—>next;temp=0.0;while(fp&&gp)if(fp—>index+gp—>index==i){temp+=fp—>coef*gp—>coef;fp二fp—>next;gp二gp->next;}elseif( ) //⑴fp=fp->next;elsegp=gp->next;if(temp!=0.0){q=(PolyNode*)malloc(sizeof(PolyNode));q->index=i;q->coef=temp;q->next二NULL;if( )P=q;//(2)else ; //(3)tail=q;}}g=reverse(g);returnp;}PolyNode*inpolyO{PolyNode*u,*v,*p,*h=NULL;intindex;doublecoef;cout<<"输人指数(指数小于0结束输入)";cin>>index;while(index>=0){cout<<"输入系数";cin>>coef;p=newPolyNode;p—>index=index;p—>coef=coef;v=h;while(v!=NULL&&index<v—>index){u=v;v=v—>next;}if(v==NULL||index>v—>index){p—>next二v;if(v==h) ; //(4)else ; //(5)}elsev—>coef+=coef;cout<<"输入指数(指数小于0结束输人)";cin>>index;}Returnh;}voidwrite(PolyNode*g){PolyNode*p=g;while(p!=NULL){cout“p->coef;if(p->index)cout〈〈〃*x"p->index;if(p->next&&p->next->coef>0)cout+p=p->next;}cout〈〈endl;}二、程序分析题分析下列程序,写出程序的运行结果。#include<iostream>usingnamespacestd;classFoo{public:Foo(intx){(*this).x二x;cout<<'A'; }Foo(){x=0;cout<<'Z';}private:intx;};intmain(){Foof[3],g(3);return0;}#include<iostream>usingnamespacestd;classA{public:A(){cout<<""A〃;}~A(){cout<<""~A〃;}};classB{A*p;public:B(){cout<<""B〃;p=newA();}~B(){cout<<〃~B〃;deletep;)};intmain(){Bobj;return0;}#include<iostream>usingnamespacestd;classmyClass{public:myClass(inti=0):n(i){cout<<'A';}myClass(myClass&c):n(c.getValue()){cout<<'C';}intgetValue()const{returnn;}~myClass(){cout<<'D';}private:intn;};voidshow(myClassc){cout<<c.getValue();}intmain(){myClasscl;show(cl);myClassc2(2);show(c2);return0;}#include<iostream>usingnamespacestd;classB{public:B(){cout<<"defaultconstruetor"<<endl;}~B(){cout""destruetedn"endl;}B(inti):data(i){cout<<"construetedbyparameter"<<data<<endl;}private:intdata;};BPlay(Bb){returnb;}intmain(){Btemp=Play(5);return0;}#include<iostream>usingnamespacestd;classTest{private:staticintval;inta;public:staticintfunc();staticvoidsfunc(Test&r);};intTest::val=20;intTest::func(){val+=val;returnval;}voidTest::sfunc(Test&r){r.a=25;cout<<"Result3二"<<r.a<<endl;}intmain(){cout<<Resultl二"<<Test::func()<<endl;Testa;cout<<"Result2="<<a.func()<<endl;Test::sfunc(a);return0;}#include<iostream>usingnamespacestd;classClassOne{public:ClassOne(){i=0;cout<<"A";}ClassOne(intvalue):i(value){cout<<"B";}~ClassOne(){cout<<"C";}voidPrint(){cout<<i;}private:inti;};classClassTwo{public:ClassTwo(){i=0;cout<<"D";}ClassTwo(intvalue):i{value){cout<<"E";}~ClassTwo(){cout<<"F";}voidPrint(){cout<<i;}private:ClassOnemyobj;inti;intmain(){ClassTwomyclass{5};myclass.Print();return0;}#include<iostream>usingnamespacestd;classPoint{public:Point(intxx=0,intyy二0){X二xx;Y=yy;countP++;}Point(Point&p){X=p.X;Y=p.Y;countP++;}intGetX(){returnX;}intGetY(){returnY;}staticvoidGetC(){cout<<"Objectid="<<countP<<endl;}private:intX,Y;staticintcountP;};intPoint::countP二0;intmain(){Point::GetC();PointA(10,20);cout<〈PointA:("<<A.GetX()<<","<<A.GetY()<<")"<<endl;A.GetC();PointB(A);cout<<"PointB:("<<B.GetX()<<","<<B.GetY()<<")"<<endl;Point::GetC();return0;}#include<iostream>usingnamespacestd;classMyClass{public:MyClass(intx=0):i(x){cout<<"C"<<i;}~MyClass(){cout<<"D"<<i;}voidSetValue(intval){i=val;}intGetVal(){returni;}private:inti;};intmain(){MyClass*p[3];inti;for(i=0;i<3;i++){p[i]=newMyClass(i);p[i]->SetValue(p[i]->GetVal()*2);}for(i=0;i<3;i++)deletep[i];cout<<endl;return0;}#include<iostream>usingnamespacestd;classCSample{private:inti;staticintk;public:CSample();voidDisplay();};CSample::CSample(){i=0;k++;}voidCsample::Display(){cout<<”i二”<<i<<”,k二”<<k<<endl;}intCsample::k=0;intmain(){CSamplea,b;DisplayO;DisplayO;}#include<iostream>usingnamespacestd;classDemo{intid;public:Demo(inti){id=i;cout<<"id二"<<id<<",Con"<<endl;}};Demod1(4);voidfun(){staticDemod2(2);}intmain(){cout<<"main"<<endl;fun();cout<<"endmain"<<endl;fun();Demo*p=newDemo(8);}三、程序填充题请将下列程序横线处缺少的部分补上,使其能正确运行。1•计算两点之间的距离。#include<iostream>#include<cmath>usingnamespacestd;classPoint{public: Line; //(1)Point(doublex=0,doubley=0){X=x;Y=y;}//⑵Point(Point&p): {}//⑵private:doubleX,Y;};classLine{private:Pointpi,p2;public:Line(Point&xpl,Point&xp2): {}//(3)doubleGetLength();};doubleLine::GetLength(){doubledx-p2.X-pi.X;doubledy=p2.Y-pi.Y;returnsqrt(dx*dx+dy*dy);}intraain(){Pointpl,p2(3,4);LineL1(pl,p2);cout<<L1.GetLength()<<endl;return0;}传输门是传输系统中的重要装置。传输门具有 Open(打开)、ClOsed(关闭)、Dpening(正在打开)、StayOpen(保持打开)、CloSing(正在关闭)五种状态。触发传输门状态转换的事件有click、complete和timeout三种。事件与其相应的状态转换如图8-1所示。#include<iostream>usingnamespacestd;//定义状态变量,用不AA同整数表示不同状态constintCLOSED=1;constintOPENING=2;constintOPEN=3;constintCLOSING=4;constintSTAYOPEN=5;classDoor{public:Door():state(CLOSED){};voidgetState(){//根据当前状态输出相应的字符串switch(state){caseOPENING:cout<<〃OPENING〃<<endl;break;caseCLOSED:cout<<"CLOSED"<<endl;break;caseOPEN:cout<<"OPEN"<<endl;break;caseCLOSING:cout<<"CLOSING"<<endl;break;caseSTAYOPEN:cout<<〃STAYOPEN〃<<endl;break;}}voidclick(){ //发生click事件时进行状态转换if( )setState(OPENING);//(l)elseif( )setState(CLOSING);//(2)elseif( )setState(STAYOPEN);//(3)}voidtimeout(){//发生timeout事件时进行状态转换if( )setState(CLOSING); //(4)voidcomplete(){ //发生complete事件时进行状态转换if( )setState(OPEN);//(5)elseif( )setState(CLOSED);//(6)}private:intstate;//传输门当前状态voidsetState(intstate){ //设置当前状态this—>state=state;}};intmain(){DooraDoor;aDoor.getState();//CLOSEDaDoor.click();aDoor.getState(); //OPENINGaDplete();aDoor.getState(); //OPENaDoor.click();aDoor.getState(); //STAYOPENaDoor.click();aDoor.getState();//CLOSINGreturn0;}一个自定义字符串类String的实现。#include<iostream>usingnamespacestd;classString{public:String();//默认构造函数String(constchar*ch);String(constString&str);~String();intsize(); //字符串大小char*c_str(); //访问字符串intcount(charch)const;//返回字符串中出现某个字符的个数voidassign(constchar*ch);//为字符串赋值private:int_size;//字符串大小char*_string; //字符串};//默认构造函数String::String(){_size=0;_string=0;}String::String(constchar*ch){if(!ch){_size=0;_string=0;}else{-size= ;//(1)_string= ;//(2)strcpy(_string,ch);}}String::String(constStringSstr){if(!str._string){-size=0;—string=0;}else{—size= ; //(3)_string= ; //(4)strcpy(_string,str._string);}}String::~String(){delete[]_string;intString::size(){return ; //(5)}char*String::c_str(){return ; //(6)}intString::count(charch)const{intent二0;for(inti=0; ;++i)//(7){if(_string[i]==ch){++ent;}}returnent;}voidString::assign(constchar*ch){if(_string){String::-String();}if(!ch){_size=0;_string=0;}else{_size= ;//(8)_string= ;//(9)strcpy(_string,ch);}}intmain(){Stringa;//默认构造函数Stringb("Youareagoodman!");//char*构造函数Stringc(b); //拷贝构造函数a.assign( "good boy!");cout<<"a= "<<a. c_str()<<"The length is "<<a. size()<<endl;cout<<"b= "<<b. c_str()<<"The length is "<<b. size()<<endl;cout<<"c= "<<c. c_str()<<"The length is "<<c. size()<<endl;cout<<b.count('o')<<endl;return0;下列程序中用静态数据成员coimtP记录Point对象的个数。程序运行结果为Objectcount二0Objectcount二5Objectcount二2#include<iostream>usingnamespacestd;classPoint{public:Point(intxx=0,intyy二0):X(xx),Y(yy}{ ;//(1)Point( :X(p.X),Y(p.Y){//(2) ;//(3)} {countP--;} //(4)intGetX(){returnX;}intGetY(){returnY;}staticvoidGetC(){cout<<"Objectcount二"<<countP<<endl;}private:intX,Y; countP;//(5)}; countP=0;//(6)intmain(){Point::GetC();PointA(10,20);PointB(A);Point*p[3];for(inti=0;i<3;i++)p[i]=newPoint(i,i);Point::GetC();for(i=0;i<3;i++)deletep[i];Point::GetC();return0;}5•下面的程序通过重载减法运算符完成指定操作,且输出结果是:4,1。请写出被隐藏的部分代码。#include<iostream>usingnamespacestd;classMylnt{intnVal;public:Mylnt(intn){nVal=n;}intReturnVal(){returnnVal;}MyInt(1)(intx){nVal-二(2) ;return*this;}};intmain(){MyIntobjlnt(10);objlnt-2-1-3;cout<<objlnt.ReturnVal();cout<<",";(3) ;cout<<objlnt.ReturnVal();return0;}继承派生多态―、单项选择题下列有关派生类的叙述中,错误的是()。一个派生类至少有一个基类派生类的默认继承方式是private一个派生类可以作为另一个派生类的基类派生类只继承了基类的公有成员和保护成员下列有关继承和派生的叙述中,正确的是()。作为虚基类的类不能被实例化派生类不能访问基类的保护成员虚函数必须在派生类中重新实现派生类应当向基类的构造函数传递参数下列有关类继承的叙述中,错误的是()。继承可以实现软件复用派生类没有继承基类的私有成员虚基类可以解决由多继承产生的二义性问题派生类构造函数要负责调用基类的构造函数有如下类定义:classXX{intxdata;public:XX(intn二0):xdata(n){}};classYY:publicXX{intydata;public:YY(intm=0,intn二0):XX(m),ydata(n){}};YY类的对象包含的数据成员的个数为()。1B.2C.3D.4设类的定义如下,且int型数据在内存中用4个字节存储,则类B的对象占据内存空间的字节数为()。classA{intb;protected:inta;};classB:publicA{intc;public:intgetC(){returnc;}};4B.8C.12D.16如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问权限分别是()。private和publicB.private和protectedC.protected和publicD.protected和protected可以用p.a的形式访问派生类对象p的基类成员a,则a是()。私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员有如下类定义:classBase{intk;public:voidset(intn){k=n;}intget()const{returnk;}};classDerived:protectedBase{protected:intj;public:voidset(intm,intn){Base::set(m);j=n;}intget()const{returnBase::get()+j;}};则类Derived中保护的数据成员和成员函数的个数是()。1B.2C.3D.4设有如下类定义:classBase]protected:voidfun(){}//...};classDerived:Base{//„};则Base类中的成员函数fun(),在Derived类中的访问权限是()。publicB.protectedC.privateD.friend有如下类定义:classB{voidfunl(){}protected:doublevarl;public:voidfun2(){}};classD:publicB{protected:voidfun3(){}};已知obj是类D的对象,下列语句中不违反类成员访问控制权限的是()。obj.funlO;B.obj.varl;C.obj.fun2();D.obj.fun3();派生类的构造函数的成员初始化列表中,不能包含()。A.基类的构造函数B.派生类中子对象的初始化C.基类中子对象的初始化D.派生类中一般数据成员的初始化下列关于派生类构造函数和析构函数的叙述中,错误的是()。派生类的构造函数会隐含调用基类的构造函数如果基类中没有默认构造函数,那么派生类必须定义构造函数在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数设classY:publicX,即类Y是类X的派生类,则创建一个Y类的对象和删除一个Y类对象时,调用构造函数和析构函数的次序分别为()。X、Y;Y、X B.X、Y;X,YC.Y、X;X、Y D.Y、X;Y、X创建包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为0。派生类、对象成员所属类、基类的构造函数对象成员所属类、基类、派生类的构造函数基类、对象成员所属类、派生类的构造函数基类、派生类、对象成员所属类的构造函数有如下类声明:classA{public:A(intn){x=n;}private:intx;};.classB:publicA{public:B(inta,intb);Private:inty;};将类A说明是类B的虚基类,下列叙述正确的是()。A.classvirtualB:publicAB.classB:virtualpublicAC.virtualclassB:publicAD.classB:publicAvirtual设置虚基类的目的是()。A.简化程序 B.消除二义性C.提高运行效率 D.减少目标代码下列关于虚基类的叙述中,错误的是()。使用虚基类可以消除由多继承产生的二义性构造派生类对象时,虚基类的构造函数只被调用一次声明“classB:virtualpublicA"说明类B为虚基类建立派生类对象时,首先调用虚基类的构造函数关于多继承二义性的叙述中,错误的是()。解决二义性的最常用方法是对成员名的限定法基类和派生类中同时出现的同名函数,也存在二义性问题一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性D.—个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性下列关于虚基类的叙述中,错误的是()。设置虚基类的目的是消除二义性虚基类子对象的初始化由派生类完成虚基类子对象的初始化次数与虚基类下面的派生类个数有关带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函数的调用下列关于赋值兼容规则的叙述,不正确的是()。、派生类的对象可以赋值给基类的对象基类的对象可以赋值给派生类的对象派生类的对象可以初始化基类的引用派生类的对象的地址可以赋值给指向基类的指针下列程序中,编译时不会出错的语句是()。#include<iostream>usingnamespacestd;classBase{public:Base(){}Base(inti){data=i;}private:intdata;};classDerived:publicBase{public:Derived。:Base(O){}Derived(intx):Base(x){}};intmain(){Deriveddl(1);Base*pb,bl;pb=&d1;//(1)d1=bl; //(2)BaseSrefB=d1;*Derivedd2=*pb;//(3)Derived&refD=refB;//(4)return0;}A.(1)B.(2)C.(3)D.(4)有如下程序:#include<iostream>usingnamespacestd;classBase{protected:Base(){cout<<'A';}Base(charc){cout<<c;}};classDerived:publicBase{public:Derived(charc){cout<<c;}};intmain(){Deriveddl('B');return0;}执行程序后,输出结果为()。A.BB.ABC.BAD.BB有如下程序:#include<iostream>usingnamespacestd;classBase{intx;public:Base(intn二0):x(n){cout<<n;}intgetX()const{returnx;}};classDerived:publicBase{inty;public:Derived(intm,intn):y(m),Base(n){cout<<m;}Derived(intm):y(m){cout<<m;}};intmain(){Deriveddl(1),d2(2,3);return0;}程序执行后,输出结果为()。A.123B.132C.0132D.102325•有如下程序:#include<iostream>usingnamespacestd;classBase{private:voidfuni()const{cout<<"funl";}protected:voidfun2()const{cout<<"fun2";}public:voidfun3()const{cout<<"fun3";}};classDerived:protectedBase{public:voidfun4()const{cout<<"fun4";}};intmain(){Derivedobj;obj.funi();//(l)0bj.fun2();//(2)obj.fun3();//(3)obj.fun4();//(4)return0;}其中有语法错误的语句是()。A.(1)B.(1)和(2)C.(1)和(3)D.⑴、(2)和(3)派生类的对象对它的基类成员中()是可以访问的。A.公有继承的公有成员 B.公有继承的私有成员C.私有继承的保护成员 D.私有继承的公有成员在多继承中,对于基类成员在派生类中的可访问性与单继承的规则()。A.完全相同B.完全不同C.部分相同,部分不同D.以上都不对C++类体系中,不能被派生类继承的有()。A.构造函数 B.虚函数C.静态成员函数 D.赋值操作函数下列对派生类的描述中,错误的是()。—个派生类可以作另一个派生类的基类派生类至少有一个基类派生类的成员除了它自己的成员外,还包含了它的基类的成员D•派生类中继承的基类成员的访问权限到派生类保持不变下列虚基类的声明中,正确的是()。A.classvirtualB:publicA B.virtualclassB:publicAC.classB:publicAvirtual D.classB:virtualpublicA关于虚函数的描述中,正确的是()。虚函数是一个静态成员函数虚函数是一个非成员函数虚函数即可以在函数说明时定义,也可以在函数实现时定义派生类与基类的虚函数具有相同的参数个数和类型下列运算符中,()运算符在C++中不能重载。A.?: B.+ C.<< D.++33•在下列选项中,不能作为选择调用重载函数依据的是()。A.参数个数 B.参数的类型C.函数名称D.函数的类型要实现动态联编,必须通过()调用虚函数。A.基类对象指针 B.成员名限定 C.对象名 D.派生类名在C++中,打开一个文件,就是将这个文件与一个()建立关联;关闭一个文件,就取消这种关联。A.类 B.流 C.对象 D.结构有如下类定义:classA{virtualvoidfunc()=0;};类B继承类A,则下面说法错误的是()。类A中包含有纯虚函数,它是一个抽象类。可以用类A来定义对象。可以定义类A的引用,也可以定义指向类A的指针。类B可以对成员函数func()重载,也可以不重载。派生类的构造函数的成员初始化列中,不能包含()。A.基类的构造函数; B.派生类中子对象的初始化;C.基类的子对象初始化; D.派生类中一般数据成员的初始化二、程序分析题分析下列程序,写出程序的运行结果。1.#include<iostream>usingnamespacestd;classPARENT{public:PARENT。{cout<<〃PARENT〃<<endl;}};classSON:publicPARENT{public:SON(){cout<<〃SON〃endl;}};intmain(){SONson;PARENT*p;p二&son;return0;}#include<iostream>usingnamespacestd;classA{public:A(){cout<<〃A〃}~A(){cout<<〃~A〃;}};classB:publicA{A*p;public:B(){cout<<〃B〃;p二newA();}~B(){cout<<〃~B〃;deletep;}};intmain(){Bobj;return0;}#include<iostream>usingnamespacestd;classB{public:B(intx=0){X=x;cout<<〃B(〃<<x<<〃)\n〃;}~B(){cout<<〃~B()\n〃;}voidprint(){cout<<X<<〃";}private:intX;};classD:publicB{public:D(intx,inty):B(x){Y=y;cout<<"D("<<x<<","<<y<<")\n";}~D(){cout<<"~D()\n";}voidprint(){B::print();cout<<Y<<endl;}private:intY;};intmain(){Dd(ll,22);d.print();return0;}#include<iostream>usingnamespacestd;classA{public:A(){a=0;}A(inti){a=i;}voidprint(){cout<<a<<"";}private:inta;};classB:publicA{public:B(){b=0;}B(inti,intj,intk):A(i),aa(j){b=k;}voidprint(){A::print();aa.print();cout<<b<<endl;}private:intb;Aaa;};intmain(){Btest[2];test[0]=B(l,4,7);test[l]=B(2,5,8);for(inti=0;i<2;i++)test[i].print();return0;#include<iostream>usingnamespacestd;classData{public:Data(inti):x(i){cout<<〃A〃;}~Data(){cout<<〃B〃;}private:intx;};classBase{public:Base(inti):bl(i){cout<<〃C〃;}~Base(){cout<<〃D〃;}private:intbl;};classDerived:publicBase{public:Derived(inti,intj):Base(i),dl(j){cout<<〃E〃;}~Derived(){cout<<〃F〃;}private:Datad1;};intmain(){Derivedobj(1,2);return0;}#include<iostream>usingnamespacestd;classBase{public:Base(chari){cout<〈"Baseconstruetor.—"<<i<<endl;}};classDerivedl:virtualpublicBase{public:Derivedl(chari,charj):Base(i){cout<〈"Derivedlconstruetor.--"<<j<<endl;};classDerived2:virtualpublicBase{public:Derived2(chari,charj):Base(i){cout<<"Derived2construetor.--"<<j<<endl;}};classMyDerived:publicDerivedl,publicDerived2{public:MyDerived(chari,charj,chark,charl,charm,charn,charx):Derived2(i,j),Derivedl(k,l),Base(m),d(n){cout<<"MyDerivedconstruetor.—"<<x<<endl;}private:Based;};intmain(){MyDerivedobj('A','B','C','D,,'E','F','G');return0;}#include<iostream>usingnamespacestd;classA{public:intn;};classB:publicA{};//classB:virtualpublicA{};classC:publicA{};//classC:virtualpublicA{};classD:publicB,publicC{public:intgetn(){returnB::n;}};intmain()Dd;d.B::n=10;d.C::n=20;cout<<d.getn()<<endl;Return0;}执行程序后,运行结果是多少?将程序中有注释的两条语句修改为注释的内容,即将“classB:publicA{};”修改为“classB:virtualpublicA{};”“classC:publicA{};"修改为“classC:virtualpublicA{};重新编译运行程序,程序的运行结果是多少?#include<iostream>usingnamespacestd;classBl{public:Bl(inti){cout<<"ConBl〃<<i<<endl;}};classB2{public:B2(intj){cout<<"ConB2"<<j<<endl;}};classB3{public:B3(){cout<<"ConB3*"<<endl;}};classC:publicB2,publicBl,publicB3{public:C(inta,intb,intc,intd):Bl(a),memberB2(c),B2(b){ }private:B2memberB2;};intmain(){Cobj(l,2,3,4);}#include<iostream>usingnamespacestd;classA{public:virtual~A(){cout<<"DestruetA"<<endl;}};classB:publicA{public:virtual~B(){eout<<"DestruetB"<<endl;}};classC:publicB{public:~C(){cout<<"DestruetC"<<endl;}};intmain(){A*pa=newC;deletepa;Bb;}#include<iostream>usingnamespacestd;classa{public:virtualvoidf(){cout<<"基类f函数"<<endl;}};classaa:publica{public:voidf(){cout<〈"派生类f函数"<<endl;}};intmain(){a*pa,mya;aamyaa;pa=&mya;pa->f();pa=&myaa;pa->f();}三、程序填充题请

温馨提示

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

最新文档

评论

0/150

提交评论