面向对象程序设计专升本模拟题及参考答案.doc

上传人:wux****ua 文档编号:9030532 上传时间:2020-04-02 格式:DOC 页数:25 大小:107KB
返回 下载 相关 举报
面向对象程序设计专升本模拟题及参考答案.doc_第1页
第1页 / 共25页
面向对象程序设计专升本模拟题及参考答案.doc_第2页
第2页 / 共25页
面向对象程序设计专升本模拟题及参考答案.doc_第3页
第3页 / 共25页
点击查看更多>>
资源描述
东北农业大学网络教育学院面向对象程序设计专升本作业题 作业题(一)1 述什么是类,并举例说明。2 简述什么是对象,并举例说明。3 简述C+中类的成员函数的三种访问方法。4阅读程序,简洁回答有关问题:程序:# include /(1)# include /(2)class point /(3) private: /(4) float X,Y; /(5) public: /(6) point (float xi, float yi ) X=xi ,Y=yi; /(7) float GetX() return X / (8) float GetY() return Y / (9) friend float distance (point & a ,point & b); / (10); /(11)void main () /(12) point pl (3.5,5.5), p2 (4.5,6.5); /(13) float d = distance (p1, p2); /(14) cout “The distance is ” d; /(15)float distance (point & a ,point & b) /(16) float dx = a.X b.X; /(17) float dy = a.Y b.Y; / (18) return sqrt ( dx * dx + dy * dy ); / (19)问题:1) 第(10)行的作用,有什么特点?2) 如果把它改写成这个类的成员函数,应该怎样改?4 创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。把表示构造函数、ChangeName() 、Display()的函数原型放在类定义中,构造函数初始化每个成员,Display()函数把完整的对象数据打印出来。其中的数据成员是保护的,函数是公共的。(教材C+程序设计教程(钱能 著) 第289页 第12.2题) 作业题(二)1 文件包含预编译指令#include ,有那两种格式,它们有什么区别?2 类的派生方式共有几种,基类成员权限在派生类中的权限怎样变化?3 述面向对象程序设计方法相对于面向过程的程序设计方法的优越性。4 阅读程序,简洁回答有关问题:程序: # include / (1) class Clock public: Clock (int H=0,int M=0, int S=0) / (2) Hour=H ;Minute=M ;Second=S; / (3) Clock ( Clock & c) / (4) Hour=c.Hour;Minute=c.Minute;Second=c.Second;/ (5) void SetTime (int H=0,int M=0,int S=0) / (6) Hour=H ;Minute=M ;Second=S; / (7) void ShowTime () / (8) cout Hour “:” Minute “:” Second endl; / (9) Clock () / (10)private: int Hour , Minute , Second; / (11);void main( void ) Clock meClock (8,30,0); / (12) MeClock.ShowTime ( ); / (13) Clock yourClock (meClock); / (14) yourClock.SetTime ( ); / (15) yourClock.ShowTime( ); / (16)问题:1) 指出Clock类的外部接口的行号。2) 指出Clock类的构造函数和拷贝构造函数以及析构函数所在行号。3) 执行那行语句时系统自动调用了构造函数并写出被初始化的对象名。4) 执行那行语句时系统调用了拷贝构造函数并写出被初始化的对象名。写出程序的运行结果。5 修改练习12.2种的类,将姓名构成类Name,其名和姓在该类中为保护数据成员,其构造函数为接收一个指向完整姓名字符串的指针,其Display()函数输出姓名。然后将Employee类中的姓名成员(字符数组)换成Name类对象。将所有原型化的函数加上成员函数定义,作为类的内部实现文件。构成完整的类库定义,要求类定义与类的成员函数定义分开。(教材C+程序设计教程(钱能 著) 第289页 第12.3题。) 作业题(三)1简述C中结构与C+中类的区别。2简述C+中类的成员函数的三种访问方法。3简述类和对象的区别与联系并举例说明。4 阅读程序,简洁回答有关问题:程序: #include #include class Pointpublic: void Set(double ix,double iy) /设置坐标 x=ix; y=iy; double xOffset() /取y轴坐标分量 return x; double yOffset() /取x轴坐标分量 return y; double angle() /取点的极坐标 return (180/3.14159)*atan2(y,x); double radius() /取点的极坐标半径 return sqrt(x*x+y*y); protected: double x; /x轴分量 double y; /y轴分量;void main() Point p; double x,y; for(;) /重复输入x和y轴分量,直到x分量值小于0 cout x y; if(x0) break; p.Set(x,y); cout angle= p.angle() ,radius= p.radius() ,x offset= p.xOffset() ,y offset= p.yOffset() endl; 问题:根据类的封装性,不改变该类的公有接口,不改写主函数的情况下,只改变该点类的定义与实现,要求把原有点类的私有成员x,y改写成另外两个私有数据成员a,r分别代表该点在极坐标系下的弧度值和半径值。请写出修改后的类的定义与实现。5写出下面程序的运行结果,请用增加拷贝构造函数的方法避免存在的问题。#include class Vectorpublic: Vector(int s=100); int& Elem(int ndx); void Display(); void Set(); Vector();protected: int size; int* buffer;Vector:Vector(int s) buffer=new intsize=s; for(int i=0; isize; i+) bufferi=i*i;int& Vector:Elem(int ndx) if(ndx=size) cout error in index endl; exit(1); return bufferndx;void Vector:Display() for(int j=0; jsize; j+) cout bufferj endl;void Vector:Set() for(int j=0; jsize; j+) bufferj=j+1;Vector:Vector() deletebuffer; void main() Vector a(10); Vector b(a); a.Set(); b.Display();教材C+程序设计教程(钱能 著) 第329页 第14.2题。 作业题(四)1.简述C+程序在内存中的分配格局。2.简述 C和C+动态内存的使用。3.简述什么是浅拷贝和深拷贝。4.阅读程序,简洁回答有关问题:程序:#include class complex private: int real ; int imag ; public: complex(float r=0,float i=0);complex operator + (complex& c);complex operator - (complex& c);complex operator - ( ); void print( );complex:complex(float r=0,float i=0)real=r; imag=i complex complex:operator + (complex& c)float r= real + c.real ;float i= imag + c.imag ;return complex(r ,i );complex complex:operator - (complex& c)float r= real - c.real ;float i= imag - c.imag ;return complex(r ,i );complex operator - ( )return complex(-real,-img);void complex:print( )cout(real,imag)endl;void main()complex x(2.5,3.8),y(4.7,5.4),z;z=x+y; z.print();z=x-y; z.print();z=-x; z.print();问题:本例是使用类的成员函数来实现复数类的运算符重载,请在不改变主函数的情况下,采用友元的形式来实现复数类的运算符重载。写出相应的程序。5重新编写下述程序,使函数Leisure()成为类Car和类Boat的函数。作为重新变成,在类Car和类Boat中,增加函数get() #include class Boat;class Carpublic: Car(int j) size =j; Friend int Leisure(int time,car&aobj,Boat&bobj);Protected: int size;int Leisure(int time, Car& aobj, Boat& bobj) return time * aobj.size*bobj.size; void main() Car c1(2); Boat b1(3); int time =4; cout Leisure(time,c1,b1);教材C+程序设计教程(钱能 著) 第348页 第15.3题。 作业题(五)1.简述静态成员函数与一般成员函数的主要差别。2.简述什么是先期联编,什么是迟后联编。3.简述多继承中构造函数被调用顺序。4. 阅读程序,简洁回答有关问题:下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生梯形类(trapezoid)、圆形类(circle),并给出具体的求面积函数 class shape public: virtual float area( )=0 ; float total(shape *s ,int n) float sum=0.0; for(int i=0;iarea( ); return sum; 5根据16.12(类的分解) 节中所定义的Account类、Savings类和Checking类,编写一个应用程序,它取出一系列账号的存款,直到碰到一个标志结束的符号。要求程序用多态的方法实现,并输出取出的账号和金额数。(教材C+程序设计教程(钱能 著) 第380页 第16.2题。)东北农业大学网络教育学院面向对象程序设计作业题参考答案作业题一参考答案1. 答:类实际上是对某种类型的对象定义变量和方法的原型。我们可以利用相同种类的对象是相似的事实来为这些对象创建一个蓝图。对对象的软件蓝图叫做类。就象自行车制造商人,自行车的类需要定义一些实例变量来包括当前档位、当前速度等等。这个类需要定义实例方法来提供实施方法,如允许骑车者改变档位、刹车以及改变脚踏板的节奏等。2. 答:对象是一些相关的变量和方法的软件集。软件对象经常用于模仿现实世界中我们身边的一些真实对象。对象是理解面向对象技术的关键。你可以发现现实世界中的对象有两个共同特征:它们都有状态和行为。比如某条狗有自己的状态(比如名字、颜色、生育以及饥饿等等)和行为(比如摇尾巴等等)。同样某辆自行车也有自己的状态(比如当前档位、两个轮子等等)和行为(比如刹车、加速、减速以及改变档位等等)。3答:假设有如下类class Tdatepublic: void Set(int,int,int); int IsLeapYear(); void Print(); private: int month; int day; int year;/” . 运算符”直接访问:Tdate oneday; oneday.Set(2,15,1998);/通过指针访问: Tdate oneday; Tdate *sptr ; sptr=&oneday; sptr- Set(2,15,1998);/通过引用访问: Tdate oneday; Tdate &srel =oneday; srel. Set(2,15,1998);4答:这是个类的友元函数,不属于这个类,但可以访问该类的所有成员,无论这个成 员是私有的还是共有的。(10)行,去掉关键字 friend ;(16)行及其后,改为 float point:distance ( point & a) float dx =X a.X; float dy =Y b.Y; return sqrt (dx * dx +dy * dy);5参考程序/employee.h#ifndef EMPLOYEE#define EMPLOYEEclass Employeepublic: Employee(char* n,char* a,char* c,char* s,char* z); void ChangeName(char* n); void Display();protected: char name20; char addr40; char city20; char state20; char zip10;#endif/employee.cpp#include employee.h#include Employee:Employee(char* n,char* a, char* c, char* s, char* z) strncpy(name,n,20); name19=0; strncpy(addr,a,40); addr39=0; strncpy(city,c,20); city19=0; strncpy(state,s,20); state19=0; strncpy(zip,z,10); zip9=0;void Employee:ChangeName(char* n) strncpy(name,n,20); name19=0;void Employee:Display() cout name endl addr city endl state zip endl; char name20; char addr40; char city20; char state20; char zip10;作业题二参考答案1答:# include #include “文件名.扩展名” 两种格式。第一种:编译器根据目录出现的顺序分别查找各路径。第二种:编译器首先在当前目录中查找,然后象前一种方式那样在标准路径下查找。2答:分共有派生、私有派生和保护派生。共有派生中public protected 权限不变,private 变inaccessible .私有派生中 public 变 private ,protected private 变 inaccessible. 保护派生中 public protected 变 protected ,private 变 inaccessible .3. 答: 面向过程的程序设计方法的基本思想是:功能分解、逐步求精。当一些任务十分复杂以至无法描述时,可以将它拆分为一系列较小的功能部件,直到这些自完备的子任务小到易于理解的程度。结构化程序设计成功地为处理复杂问题提供了有力的手段。但是当数据量增大时,数据与处理这些数据的方法之间的分离使程序变得越来越难以理解。而且对数据处理能力的需求越强,这种分离所造成的负作用越显著。面向对象程序设计的本质是把数据和处理数据的过程当成一个整体对象。面向对象程序设计的实现了封装和数据隐藏技术,继承和多态性。使得我可以直接映射问题空间,映射现实世界的层次结构(抽象概念和客观事物等),是程序更易编写和维护,代码的可复用性更强。4答:(2) - (10) (2),(4),(10) (12), meClock (14),yourClock 8:30:00 00:00:005参考程序/employ.h#ifndef EMPLOY#define EMPLOYclass Namepublic: Name(char* n); void Display(); void ChangeName(char* n);protected: char firstName20; char lastName20;class Employpublic: Employ(char* n,char* a,char* c,char* s,char* z); void ChangeName(char* n); void Display();protected: Name name; char addr40; char city20; char state20; char zip10;#endif/employ.cpp#include #include employ.hName:Name(char* n) ChangeName(n);void Name:Display() cout firstName lastName endl;void Name:ChangeName(char* n) char* p=n; int i; for(i=0; i19; i+) if(*p= |*p=0) break; firstNamei=*p+; firstNamei=0; if(*p=0) lastName0=0; return; while(*p= ) p+; for(i=0; i19; i+) if(*p= |*p=0) break; lastNamei=*p+; lastNamei=0;Employ:Employ(char* n,char* a,char* c,char* s,char* z) :name(n) strncpy(addr,a,40); addr39=0; strncpy(city,c,20); city19=0; strncpy(state,s,20); state19=0; strncpy(zip,z,10); zip9=0;void Employ:ChangeName(char* n) name.ChangeName(n);void Employ:Display() name.Display(); cout addr city endl state zip Set(2,15,1998);/通过引用访问: Tdate oneday; Tdate &srel =oneday; srel. Set(2,15,1998);3答:类用来描述一类事物,描述这些事物所应具有的属性。类的实例化,即对象。一个类可以有无数个对象。对象可以被创建和销毁,但类是无所不在的。 例如:人是类,你、我、他都是类的实例。 桌子是类,具体的桌子是类的实例。4答:#include class Pointpublic: void Set(double ix,double iy) a=atan2(iy,ix); /接口 r=sqrt(ix*ix+iy*iy; double xOffset() /接口 return r*cos(a); double yOffset() /接口 return r*sin(a); double angle() /接口 return (180/3.14159)*a; double radius() /接口 return r; protected: double a; double r;5参考程序#include #include class Vectorpublic: Vector(int s=100); Vector(const Vector& v); int& Elem(int ndx); void Display(); void Set(); Vector();protected: int size; int* buffer;Vector:Vector(int s) buffer=new intsize=s; for(int i=0; isize; i+) bufferi=i*i;Vector:Vector(const Vector& v):size(v.size) buffer = new intsize; for(int i=0; isize; i+) bufferi = v.bufferi;int& Vector:Elem(int ndx) if(ndx=size) cout error in index endl; exit(1); return bufferndx;void Vector:Display() for(int j=0; jsize; j+) cout bufferj endl;void Vector:Set() for(int j=0; jsize; j+) bufferj=j+1;Vector:Vector() deletebuffer; void main() Vector a(10); Vector b(a); a.Set(); b.Display();/运行结果为:12345678910/增加拷贝构造函数后的运行结果为:0149162536496481作业题四参考答案1答:C+程序的内存格局通常分为四个区: *全局数据区(data area) *代码区(code area) *栈区(stack area) *堆区(heap area) 全局变量、静态数据、常量存放在全局数据区,所有类成员函数和非成员函数存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间被作为堆区。2 答:在C语言中,获得和释放内存的函数是: void *malloc(size _t size); / size_t 即 unsigned long void free(void *); /这两个函数在alloc.h头文件中声明. 在 C+语言中,获得和释放内存的操作符是: new 和 delete /它们不用头文件声明,可以带初始 值表和单元个数. malloc()函数只负责分配指定大小的空间,而不知这块空间用来存放什么类型的变量;而 new不但知道要分配空间的大小,还知道待分配对象的数据类型是什么,因此,如果分配的空间给指定类的对象实例,它能够自动调用该类的构造函数初始化该对象。3答:在默认的拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,这种被称为浅拷贝。但是,一个类可能拥有资源,当其构造函数分配了一个资源(例如某个堆内存地址)的时候,会发生什么?如果拷贝构造函数简单地制作了一个该资源的引用的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源。当对象析构时,该资源将经历两次资源返还。这个时候,我们在执行拷贝时,最好同时对资源本身进行复制,这种拷贝方法,我们称之为深拷贝。4答:#include class complexprivate: float real ; float imag ; public: complex(float r=0,float i=0);void print( );friend complex operator + (complex& c1,complex& c2);friend complex operator - (complex& c1,complex& c2);friend complex operator - (complex& c );complex:complex(float r=0,float i=0)real=r; imag=i complex complex:operator + (complex& c1,complex& c2)float r= c1.real + c2.real ;float i= c1.imag + c2.imag ;return complex(r ,i );complex complex:operator - (complex& c1,complex& c2)float r= c1.real - c2.real ;float i= c1.imag - c2.imag ;return complex(r ,i );complex operator - (complex& c )return complex(-c.real,-c.img);void complex:print( )cout(real,imag)endl;void main()complex x(2.5,3.8),y(4.7,5.4),z;z=x+y; z.print();z=x-y; z.print();z=-x; z.print();5参考程序#include class Boat;class Carpublic: Car(int j) size =j; int Get() return size; protected: int size;class Boatpublic: Boat(int j) size =j; int Get() return size; protected: int size;int Leisure(int time, Car& aobj, Boat& bobj) return time * aobj.Get() * bobj.Get();void main() Car c1(2); Boat b1(3); int time =4; cout Leisure(time,c1,b1);作业题五参考答案1答:一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认的访问。 一个静态成员函数与非静态成员函数的根本区别在于,静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。例如: class Sc public: void nsfn(int a); static void sfn(int a);/ void f (Sc& s) s.nsfn(10);/转化为Sc:nsfn(&s,10) s.sfn(10);/转化为Sc:sfn(10) 2答:编译时就能确定哪个重载函数被调用的,称为先期联编。而在运行时,才能确认调用那个重载函数,称为迟后联编(滞后联编)。 C+中继承机制中用多态性的技术来实现迟后联编。为指明某个成员函数具有多态性,用关键字virtual来标志其为虚函数。3答:构造函数按照下列的顺序被调用: 1.任何虚拟基类的构造函数按照它们被继承的顺序构造. 2.任何非虚拟基类的构造函数按照它们被继承的顺序构造. 3.任何成员函数的构造函数按照它们声明的顺序调用. 4.类自己的构造函数.4答:class Circle:public Shapepublic:Circle(double r)radius=r;double Area() constreturn 3.1416*radius*radius;private:double radius;class Trapezoid:public Shapepublic:Trapezoid(double top,double bottom,double high)T=top;B=bottom;H=high;double Area() constreturn (T+B)*H*0.5;private:double T,B,H;5参考程序#include #include account.h#include savings.h#include checking.hvoid main() unsigned aN; float val; cout aN val; while(aN) new Savings(aN,val); cout aN val; cout aN val; while(aN) new Checking(aN,val); cout aN val; for(Account* p=Account:First(); p; p=p-Next() cout AccountNo() AcntBalan() Next(); delete t; Account:First()=NULL;
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!