面向对象程序设计课后习题答案 联系客服

发布时间 : 星期一 文章面向对象程序设计课后习题答案更新完毕开始阅读

if(i%5==0) cout<

结果:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

[2_10] 建立一个被称为sroot()的函数,返回其参数的二次方根。重载sroot()三次, 让它返回整数、长整数与双精度数的二次方根(计算二次方根时,可以使用标准 库函数sqrt())

#include #include

int sroot(int );long sroot(long);double sroot(double); double sqrt();//声明开方函数sqrt() void main()

{ int i,x;long l,y;double d,z; cin>>i; cin>>l; cin>>d;

x=sroot(i); y=sroot(l); z=sroot(d); cout<

int sroot(int i)

{ return sqrt(i); } //i是整数 long sroot(long l)

{ return sqrt(l); } //l是长整型 double sroot(double d)

{ return sqrt(d); } //d是双精度 //敲进9 16 25 //输出3 4 5

习题[2_11] 编写C++风格的程序,解决百钱问题,将一元人民币兑换成1、2、5分的硬币,有多少种换法? #include void main()

{ int i,j,sum=0;

for(i=0;i<=20;i++) for(j=0;j<=50;j++) if(100-5*i-2*j>=0) { sum++;

cout<<100-5*i-2*j<<”\\t”<

cout<<”sum is “<

习题[2_12] 编写C++风格的程序,用二分法求解f(x)=0的根

#include #include inline float f(float x)

{ return 2*x*x*x-4*x*x+3*x-6; } void main()

{ float left,right,middle,ym,yl,yr;

cout<<”pleass two number:”<>left>>right; yl=f(left); yr=f(right); do

{ middle=(right+left)/2; ym=f(middle); if(yr*ym>0)

{ right=middle; Yr=ym; } else

{ left=middle; yl=ym; }

}while(fabs(ym)>=1e-6);

cout<<”\\nRoot is:”<

本例使用了内联函数f(x),因为在主函数中多次调用它,这样可以加快代码执行的速度。敲进两个数:-10 10 结果:Root is 2

[2_13]答:运行结果是:2 4 6 12 10 说明:本例使用的是返回引用的值,index(3)=12;语句的执行实际将a[3]赋值为12。

[2_14]答:运行结果为:101 说明:在语句::i=i+1;中赋值号左边::i的i单元是全 局变量,赋值号右边的i单元是局部变量i。所以执行该语句的结果是 将局部变量i的值+1(101)赋值给全局变量i

[2_15]答:结果是:10 10 说明:函数f(&a,b)中的第一个参数是引用,引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第二个参数是变量参数,对它的调用是通常的传值调用。所以运行后,a的值被改为10,b的值不变,仍为10 [2_16]答:D

说明:int *p=new int(10);表示分配1个整型空间,初值为10 int *p=new int[10];表示分配10个整型空间 int *p=new int;表示分配1个整型空间

int *p=new int[10](0)想给一个数组分配内存空间时,对整个数组进行初始化,这是不允许的。

[2_17]答:D 说明:name被定义为指向常量的常指针,所以它所指的内容和本 身的内容都不能修改,而name[3]=’a’;修改了name所指的 常量,name=’lin’;和name=new char[5];修改了常指针,只有 D输出一个字符是正确的。

[2_18]答:A 说明:name被定义指向常量的指针,这是一个不能移动的固定指针,它所指的内容不能改变,但指针所指的数据可以改变,而name[3]=’q’;修改了name所指的内容,是正确的。name=”lin”; name=new char[5]; name=new char(‘q’);以不同的方法修改了常指针,都是错误的。

[2_19]答:A 说明:name被定义指向常量的指针,不允许改变指针所指的常量,但指针本身的内容可以修改,而name[3]=’q’;修改了name所指的内容,是错误的。name==”lin” name=new char[5];和name=new char(‘q’)以不同的方法修改了常指针,都是正确的。

[2_20]答:D 说明:C++中不能建立引用数组和指向引用的指针,也不能建立引用的引用。所以A、B、C是错误的,D是正确的。

第三章:类和对象(一)

[3_1]答:类声明的一般格式如下: class 类名 { public:

公有数据成员; 公有成员函数; protected:

保护数据成员; 保护成员函数; private:

私有数据成员; 私有成员函数;

};其中:class是声明类的关键字;类名是要声明的类的名字;后面的花括号表示出类声明的范围;最后的分号表示类声明结束。

[3_2]答:构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数具有一些特殊的性质:

(1)构造函数的名字必须与类名相同

(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值在系统内部使用。

(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。

(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。 (5)构造函数被声明为公有函数,但它不能象其它成员函数那样被显示地调用,它是在定义对象的同时被调用的。

析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用 于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点: (1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~)

(2)析构函数没有参数,不能指定返回类型,而且不能重载。因此在一个类中只能有一个析构函数。

(3)当撤消对象时,编译系统会自动地调用析构函数。

[3_3]答:B 说明:C++中对构造函数有一些规定:不能带返回值;可以不带

参数;也可以缺省定义;但构造函数的名字与类名必须完全相同。

[3_4]答:C 说明:C++中没有限定private、public、protected的书写次序。但 是,不能在类的声明中给数据成员赋初值,数据成员的数据类型 也不能是register(寄存器类型),没有用private、public、protected 定义的数据成员是私有成员。

[3_5]答:C 说明:C++中对析构函数也有一些规定:没有参数;不能重载;析构函数的名字是在类名前加“~”;析构函数不能指定返回类型。

[3_6]答:B 说明:构造函数的工作是在创建对象时执行的。

[3_27]答:语句”p1.age=30;”出现错误。因为age是私有数据成员,不能直接访问。 [3_28]答:第1个错误:printStu、setSno两个成员函数没有用public定义,则不 允许外部函数对对象进行操作。

第2个错误:成员函数在类外定义,应加上类名“Student::”。

第3个错误:setAge应在类中说明,并且在类外定义时,应加上类名”Student::”。

[3_29]答:语句”Point cpoint;”是错误的,它试图用私有的构造函数Point访问公有数据成员x和y,这是不对的。

[3_10]答:语句Stack stt;”应该带参数,因为当类中没有定义构造函数时,编译器会自动生成一个缺省的不带参数的构造函数。但是,如果类中有自己定义的构造函数后,编译器将不再自动生成一个缺省的构造函数。例如:将上述语句改成“Stack stt(10);”就正确了。 [3_30]:下面是一个计数器的定义,请完成该类成员函数的实现 #include class counter { public:

counter(int number);//构造函数 void increment(); //给原值加1 void decrement(); ///给原值减1 int getvalue(); //取得计数器值 int print(); //显示计数 private: int value; };

counter::counter(int number)//构造函数定义 { value=number; }

void counter::increment()//给原值加1 { value++; }

void counter::decrement()//给原值减1 { value--; }

int counter::getvalue()//取得计数器值 { return value; }

int counter::print()//显示计数

{ cout<<\ return 0; }

main() { int i;