C++语言程序设计课后答案(郑莉第版)5041.pdf
第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。解:迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C+语言是一种面向对象的编程语言,也属于高级语言。1-2 面向对象的编程语言有哪些特点?解:面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C+语言是目前应用最广的面向对象的编程语言。1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?解:结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点?解:从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体-对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。1-5 什么叫做封装?解:封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。1-6 面向对象的软件工程包括哪些主要内容?解:面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。1-7 简述计算机内部的信息可分为几类?解:计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。1-8 什么叫二进制?使用二进制有何优点和缺点?解:二进制是基数为 2,每位的权是以 2 为底的幂的进制,遵循逢二进一原则,基本符号为 0和 1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。1-9 请将以下十进制数值转换为二进制和十六进制补码:(1)2(2)9(3)93 (4)-32(5)65535(6)-1 解:(1)(2)10=(10)2=(2)16(2)(9)10=(1001)2=(9)16(3)(93)10=(1011101)2=(5D)16(4)(-32)10=(11100000)2=(E0)16(5)(65535)10=(11111111 11111111)2=(FFFF)16(6)(-1)10=(11111111 11111111)2=(FFFF)16 1-10 请将以下数值转换为十进制:(1)(1010)2(2)(10001111)2(3)(01011111 11000011)2 (4)(7F)16(5)(2D3E)16(6)(F10E)16 解:(1)(1010)2=(10)10(2)(10001111)2=(143)10(3)(01011111 11000011)2=(24515)10(4)(7F)16=(127)10(5)(2D3E)16=(11582)10(6)(F10E)16=(61710)10 1-11 简要比较原码、反码、补码等几种编码方法。解:原码:将符号位数字化为 0 或 1,数的绝对值与符号一起编码,即所谓符号绝对值表示的编码。正数的反码和补码与原码表示相同。负数的反码与原码有如下关系:符号位相同(仍用 1 表示),其余各位取反(0 变 1,1 变 0)。补码由该数反码的最末位加 1 求得。第 二 章 C+简单程序设计 2-1 C+语言有那些主要特点和优点?解:C+语言的主要特点表现在两个方面,一是全面兼容 C,二是支持面向对象的方法。C+是一个更好的 C,它保持了 C 的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对 C 的类型系统进行了改革和扩充,因此 C+比 C 更安全,C+的编译系统能检查出更多的类型错误。C+语言最重要的特点是支持面向对象。2-2 下列标识符哪些是合法的?Program,-page,_lock,test2,3in1,mail,A_B_C_D 解:Program,_lock,test2,A_B_C_D 是合法的标识符,其它的不是。2-3 例 2.1 中每条语句的作用是什么?#include void main(void)coutHello!n;coutWelcome to c+!n;解:#include /指示编译器将文件 iostream.h 中的代码/嵌入到该程序中该指令所在的地方 void main()/主函数名,void 表示函数没有返回值 /函数体标志 coutHello!n;/输出字符串 Hello!到标准输出设备(显示器)上。coutWelcome to c+!n;/输出字符串 Welcome to c+!在屏幕输出如下:Hello!Welcome to c+!2-4 使用关键字 const 而不是#define 语句的好处有哪些?解:const 定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。2-5 请写出 C+语句声明一个常量 PI,值为 3.1416;再声明一个浮点型变量 a,把 PI 的值赋给 a。解:const float PI=3.1416;float a=PI;2-6 在下面的枚举类型中,Blue 的值是多少?enum COLOR WHITE,BLACK=100,RED,BLUE,GREEN=300;解:Blue=102 2-7 注释有什么作用?C+中有哪几种注释的方法?他们之间有什么区别?解:注释在程序中的作用是对程序进行注解和说明,以便于阅读。编译系统在对源程序进行编译时不理会注释部分,因此注释对于程序的功能实现不起任何作用。而且由于编译时忽略注释部分,所以注释内容不会增加最终产生的可执行程序的大小。适当地使用注释,能够提高程序的可读性。在 C+中,有两种给出注释的方法:一种是延用 C 语言方法,使用/*和*/括起注释文字。另一种方法是使用/,从/开始,直到它所在行的行尾,所有字符都被作为注释处理。2-8 什么叫做表达式?x=5+7 是一个表达式吗?它的值是多少?解:任何一个用于计算值的公式都可称为表达式。x=5+7 是一个表达式,它的值为 12。2-9 下列表达式的值是多少?1.201/4 2.201%4 3.201/4.0 解:1 50 2 1 3 50.25 2-10 执行完下列语句后,a、b、c 三个变量的值为多少?a=30;b=a+;c=+a;解:a:32;b:30;c:32;2-11 在一个 for 循环中,可以初始化多个变量吗?如何实现?解:在 for 循环设置条件的第一个;前,用,分隔不同的赋值表达式。例如:for(x=0,y=10;x 100;x+,y+)2-12 执行完下列语句后,n 的值为多少?int n;for(n=0;n 100;n+)解:n 的值为 100 2-13 写一条 for 语句,计数条件为 n 从 100 到 200,步长为 2;然后用 while 和 dowhile语句完成同样的循环。解:for 循环:for(int n=100;n=200;n+=2);while 循环:int x=100;while(n=200)n+=2;dowhile 循环:int n=100;do n+=2;while(n y)x=y;else/y x|y=x y=x;2-17 修改下面这个程序中的错误,改正后它的运行结果是什么?#include void main()int i int j;i=10;/*给 i 赋值 j=20;/*给 j 赋值*/cout i+j=i+j;/*输出结果*/return 0;解:改正:#include int main()int i;int j;i=10;/给 i 赋值 j=20;/*给 j 赋值*/cout i+j=i+j;/*输出结果*/return 0;程序运行输出:i+j=30 2-18 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。解:源程序:#include int main()int i;cout i;cout 您输入一个数字是 i endl;return 0;程序运行输出:请输入一个数字:5 您输入一个数字是 5 2-19 C+有哪几种数据类型?简述其值域。编程显示你使用的计算机中的各种数据类型的字节数。解:源程序:#include int main()cout The size of an int is:tt sizeof(int)bytes.n;cout The size of a short int is:t sizeof(short)bytes.n;cout The size of a long int is:t sizeof(long)bytes.n;cout The size of a char is:tt sizeof(char)bytes.n;cout The size of a float is:tt sizeof(float)bytes.n;cout The size of a double is:t sizeof(double)bytes.n;return 0;程序运行输出:The size of an int is:4 bytes.The size of a short int is:2 bytes.The size of a long int is:4 bytes.The size of a char is:1 bytes.The size of a float is:4 bytes.The size of a double is:8 bytes.2-20 打印 ASCII 码为 32127 的字符。解:#include int main()for(int i=32;i128;i+)cout (char)i;return 0;程序运行输出:!#$%G()*+,./0123456789:;?ABCDEFGHIJKLMNOP_QRSTUVWXYZabcdefghijklmnopqrstuvwxyzs 2-21 运行下面的程序,观察其输出,与你的设想是否相同?#include int main()unsigned int x;unsigned int y=100;unsigned int z=50;x=y-z;cout Difference is:x;x=z-y;cout nNow difference is:x endl;return 0;解:程序运行输出:Difference is:50 Now difference is:4294967246 注意,第二行的输出并非-50,注意 x、y、z 的数据类型。2-22 运行下面的程序,观察其输出,体会 i+与+i 的差别。#include int main()int myAge=39;/initialize two integers int yourAge=39;cout I am:myAge years old.n;cout You are:yourAge years oldn;myAge+;/postfix increment+yourAge;/prefix increment cout One year passes.n;cout I am:myAge years old.n;cout You are:yourAge years oldn;cout Another year passesn;cout I am:myAge+years old.n;cout You are:+yourAge years oldn;cout Lets print it again.n;cout I am:myAge years old.n;cout You are:yourAge years oldn;return 0;解:程序运行输出:I am 39 years old You are 39 years old One year passes I am 40 years old You are 40 years old Another year passes I am 40 years old You are 41 years old Lets print it again I am 41 years old You are 41 years old 2-23 什么叫常量?什么叫变量?解:所谓常量是指在程序运行的整个过程中其值始终不可改变的量,除了用文字表示常量外,也可以为常量命名,这就是符号常量;在程序的执行过程中其值可以变化的量称为变量,变量是需要用名字来标识的。2-24 变量有哪几种存储类型?解:变量有以下几种存储类型:auto 存储类型:采用堆栈方式分配内存空间,属于一时性存储,其存储空间可以被若干变量多次覆盖使用;register 存储类型:存放在通用寄存器中;extern 存储类型:在所有函数和程序段中都可引用;static 存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。2-25 写出下列表达式的值:1.2 3&6 9 2.!(4 5)|(6 2 解:1 1 2-1 3 0 4 0 2-28 编写一个完整的程序,实现功能:向用户提问现在正在下雨吗?,提示用户输入 Y或 N。若输入为 Y,显示现在正在下雨。;若输入为 N,显示现在没有下雨。;否则继续提问现在正在下雨吗?解:源程序:#include#include void main()char flag;while(1)cout flag;if(toupper(flag)=Y)cout 现在正在下雨。;break;if(toupper(flag)=N)cout 现在没有下雨。;break;程序运行输出:现在正在下雨吗?(Yes or No):x 现在正在下雨吗?(Yes or No):l 现在正在下雨吗?(Yes or No):q 现在正在下雨吗?(Yes or No):n 现在没有下雨。或:现在正在下雨吗?(Yes or No):y 现在正在下雨。2-29 编写一个完整的程序,运行时向用户提问你考试考了多少分?(0100),接收输入后判断其等级,显示出来。规则如下:解:#include void main()int i,score;cout score;if(score100|score0)cout 分数值必须在 0 到 100 之间!;else i=score/10;switch(i)case 10:case 9:cout 你的成绩为优!;break;case 8:cout 你的成绩为良!;break;case 7:case 6:cout 你的成绩为中!;break;default:cout 你的成绩为差!;程序运行输出:你考试考了多少分?(0100):85 你的成绩为良!2-30(1)实现一个简单的菜单程序,运行时显示Menu:A(dd)D(elete)S(ort)Q(uit),Select one:提示用户输入,A 表示增加,D 表示删除,S 表示排序,Q 表示退出,输入为 A、D、S时分别提示数据已经增加、删除、排序。输入为 Q 时程序结束。要求使用 if else 语句进行判断,用 break、continue 控制程序流程。解:#include#include void main()char choice,c;while(1)cout c;choice=toupper(c);if(choice=A)cout 数据已经增加.endl;continue;else if(choice=D)cout 数据已经删除.endl;continue;else if(choice=S)cout 数据已经排序.endl;continue;else if(choice=Q)break;程序运行输出:Menu:A(dd)D(elete)S(ort)Q(uit),Select one:a 数据已经增加.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:d 数据已经删除.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:s 数据已经排序.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:q (2)实现一个简单的菜单程序,运行时显示Menu:A(dd)D(elete)S(ort)Q(uit),Select one:提示用户输入,A 表示增加,D 表示删除,S 表示排序,Q 表示退出,输入为 A、D、S 时分别提示数据已经增加、删除、排序。输入为 Q 时程序结束。要求使用 Switch 语句。解:源程序:#include#include void main()char choice;while(1)cout choice;switch(toupper(choice)case A:cout 数据已经增加.endl;break;case D:cout 数据已经删除.endl;break;case S:cout 数据已经排序.endl;break;case Q:exit(0);break;default:;程序运行输出:Menu:A(dd)D(elete)S(ort)Q(uit),Select one:a 数据已经增加.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:d 数据已经删除.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:s 数据已经排序.Menu:A(dd)D(elete)S(ort)Q(uit),Select one:q 2-31 用穷举法找出 1100 间的质数,显示出来。分别使用 while,do-while,for 循环语句实现。解:源程序:使用 while 循环语句:#include#include void main()int i,j,k,flag;i=2;while(i=100)flag=1;k=sqrt(i);j=2;while(j=k)if(i%j=0)flag=0;break;j+;if(flag)cout i 是质数.endl;i+;使用 dowhile 循环语句:#include#include void main()int i,j,k,flag;i=2;do flag=1;k=sqrt(i);j=2;do if(i%j=0)flag=0;break;j+;while(j=k);if(flag)cout i 是质数.endl;i+;while(i=100);使用 for 循环语句:#include#include void main()int i,j,k,flag;for(i=2;i=100;i+)flag=1;k=sqrt(i);for(j=2;j=k;j+)if(i%j=0)flag=0;break;if(flag)cout i 是质数.endl;程序运行输出:2 是质数.3 是质数.5 是质数.7 是质数.11 是质数.13 是质数.17 是质数.19 是质数.23 是质数.29 是质数.31 是质数.37 是质数.41 是质数.43 是质数.47 是质数.53 是质数.59 是质数.61 是质数.67 是质数.71 是质数.73 是质数.79 是质数.83 是质数.89 是质数.97 是质数.2-32 比较 Break 语句与 Continue 语句的不同用法。解:Break 使程序从循环体和 switch 语句内跳出,继续执行逻辑上的下一条语句,不能用在别处;continue 语句结束本次循环,接着开始判断决定是否继续执行下一次循环;2-33 定义一个表示时间的结构体,可以精确表示年、月、日、小时、分、秒;提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。解:源程序见实验指导部分实验二 2-34 在程序中定义一个整型变量,赋以 1100 的值,要求用户猜这个数,比较两个数的大小,把结果提示给用户,直到猜对为止。分别使用 while、dowhile 语句实现循环。解:/使用 while 语句#include void main()int n=18;int m=0;while(m!=n)cout m;if(n m)cout 你猜的值太小了!endl;else if(n m)cout 你猜的值太大了!endl;else cout 你猜对了!endl;/使用 dowhile 语句#include void main()int n=18;int m=0;do cout m;if(n m)cout 你猜的值太小了!endl;else if(n m)cout 你猜的值太大了!endl;else cout 你猜对了!endl;while(n!=m);程序运行输出:请猜这个数的值为多少?(0100):50 你猜的值太大了!请猜这个数的值为多少?(0100):25 你猜的值太大了!请猜这个数的值为多少?(0100):10 你猜的值太小了!请猜这个数的值为多少?(0100):15 你猜的值太小了!请猜这个数的值为多少?(0100):18 你猜对了!2-35 定义枚举类型 weekday,包括 Sunday 到 Saturday 七个元素在程序中定义 weekday 类型的变量,对其赋值,定义整型变量,看看能否对其赋 weekday 类型的值。解:#include enum weekday Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;void main()int i;weekday d=Thursday;cout d=d endl;i=d;cout i=i endl;d=(weekday)6;cout d=d endl;d=weekday(4);cout d=d endl;程序运行输出:d=4 i=4 d=6 d=4 第三章 函数 3-1 C+中的函数是什么?什么叫主调函数,什么叫被调函数,二者之间有什么关系?如何调用一个函数?解:一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C 和 C+语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。调用函数之前先要声明函数原型。按如下形式声明:类型标识符 被调函数名(含类型说明的形参表);声明了函数原型之后,便可以按如下形式调用子函数:函数名(实参列表)3-2 观察下面程序的运行输出,与你设想的有何不同?仔细体会引用的用法。源程序:#include int main()int intOne;int&rSomeRef=intOne;intOne=5;cout intOne:tt intOne endl;cout rSomeRef:t rSomeRef endl;int intTwo=8;rSomeRef=intTwo;/not what you think!cout nintOne:tt intOne endl;cout intTwo:tt intTwo endl;cout rSomeRef:t rSomeRef endl;return 0;程序运行输出:intOne:5 rSomeRef:5 intOne:8 intTwo:8 rSomeRef:8 3-3 比较值调用和引用调用的相同点与不同点。解:值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。3-4 什么叫内联函数?它有哪些特点?解:定义时使用关键字 inline 的函数叫做内联函数;编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;内联函数体内不能有循环语句和 switch 语句;内联函数的定义必须出现在内联函数第一次被调用之前;对内联函数不能进行异常接口声明;3-5 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?解:不必一致,所有的参数是根据位置和类型而不是名字来区分的。3-6 重载函数时通过什么来区分?解:重载的函数的函数名是相同的,但它们的参数的个数和数据类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。3-7 编写函数,参数为两个 unsigned short int 型数,返回值为第一个参数除以第二个参数的结果,数据类型为 short int;如果第二个参数为 0,则返回值为-1。在主程序中实现输入输出。解:源程序:#include short int Divider(unsigned short int a,unsigned short int b)if(b=0)return-1;else return a/b;typedef unsigned short int USHORT;typedef unsigned long int ULONG;int main()USHORT one,two;short int answer;cout one;cout two;answer=Divider(one,two);if(answer -1)cout Answer:answer;else cout Error,cant divide by zero!;return 0;程序运行输出:Enter two numbers.Number one:8 Number two:2 Answer:4 3-8 编写函数把华氏温度转换为摄氏温度,公式为:C=(F-32)*5/9;在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度。解:源程序见实验指导部分实验三 3-9 编写函数判断一个数是否是质数,在主程序中实现输入、输出。解:#include#include int prime(int i);/判一个数是否是质数的函数 void main()int i;cout i;if(prime(i)cout i 是质数.endl;else cout i 不是质数.endl;int prime(int i)int j,k,flag;flag=1;k=sqrt(i);for(j=2;j=k;j+)if(i%j=0)flag=0;break;if(flag)return 1;else return 0;程序运行输出:请输入一个整数:1151 1151 是质数.3-10 编写函数求两个整数的最大公约数和最小公倍数。解:源程序:#include#include int fn1(int i,int j);/求最大公约数的函数 void main()int i,j,x,y;cout i;cout j;x=fn1(i,j);y=i*j/x;cout i 和 j 的最大公约数是:x endl;cout i 和 j 的最小公倍数是:y endl;int fn1(int i,int j)int temp;if(i j)temp=i;i=j;j=i;while(j!=0)temp=i%j;i=j;j=temp;return i;程序运行输出:请输入一个正整数:120 请输入另一个正整数:72 120 和 72 的最大公约数是:24 120 和 72 的最小公倍数是:360 3-11 什么叫作嵌套调用?什么叫作递归调用?解:函数允许嵌套调用,如果函数 1 调用了函数 2,函数 2 再调用函数 3,便形成了函数的嵌套调用。函数可以直接或间接地调用自身,称为递归调用。3-12 在主程序中提示输入整数 n,编写函数用递归的方法求 1+2+n 的值。解:#include#include int fn1(int i);void main()int i;cout i;cout 从 1 累加到 i 的和为:fn1(i)endl;int fn1(int i)if(i=1)return 1;else return i+fn1(i-1);程序运行输出:请输入一个正整数:100 从 1 累加到 100 的和为:5050 3-13 编写递归函数 GetPower(int x,int y)计算 x 的 y 次幂,在主程序中实现输入输出。解:源程序:#include long GetPower(int x,int y);int main()int number,power;long answer;cout number;cout power;answer=GetPower(number,power);cout number to the power th power is answer 2;fib(1)=fib(2)=1;观察递归调用的过程。解:源程序见实验指导部分实验三 3-15 用递归的方法编写函数求 n 阶勒让德多项式的值,在主程序中实现输入、输出;解:#include float p(int n,int x);void main()int n,x;cout n;cout x;cout n=n endl;cout x=x endl;cout P n (x )=p(n,x)endl;float p(int n,int x)if(n=0)return 1;else if(n=1)return x;else return(2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n;程序运行输出:请输入正整数 n:1 请输入正整数 x:2 n=1 x=2 P1(2)=2 请输入正整数 n:3 请输入正整数 x:4 n=3 x=4 P3(4)=154 3-16 使用模板函数实现 Swap(x,y),函数功能为交换 x、y 的值。解:源程序:#include template void swap(T&x,T&y)T z;z=x;x=y;y=z;void main()int j=1,k=2;double v=3.0,w=4.0;cout j=j k=k endl;cout v=v w=w endl;swap(j,k);/int swap(v,w);/double cout After swap:endl;cout j=j k=k endl;cout v=v w=w endl;程序运行输出:j=1 k=2 v=3.14 w=4.35 After swap:j=2 k=1 v=4.35 w=3.14 第 四 章 类 4-1 解释 public 和 private 的作用,公有类型成员与私有类型成员有些什么区别?解:公有类型成员用 public 关键字声明,公有类型定义了类的外部接口;私有类型的成员用private 关键字声明,只允许本类的函数成员来访问,而类外部的任何访问都是非法的,这样,私有的成员就整个隐蔽在类中,在类的外部根本就无法看到,实现了访问权限的有效控制。4-2 protected 关键字有何作用?解:protected 用来声明保护类型的成员,保护类型的性质和私有类型的性质相似,其差别在于继承和派生时派生类的成员函数可以访问基类的保护成员。4-3 构造函数和析构函数有什么作用?解:构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于彼对象的特征,完成的就是是一个从一般到具体的过程,构造函数在对象创建的时候由系统自动调用。析构函数与构造函数的作用几乎正好相反,它是用来完成对象被删除前的一些清理工作,也就是专门作扫尾工作的。一般情况下,析构函数是在对象的生存期即将结束的时刻由系统自动调用的,它的调用完成之后,对象也就消失了,相应的内存空间也被释放。4-4 数据成员可以为公有的吗?成员函数可以为私有的吗?解:可以,二者都是合法的。数据成员和成员函数都可以为公有或私有的。但数据成员最好定义为私有的。4-5 已知 class A 中有数据成员 int a,如果定义了 A 的两个对象 A1、A2,它们各自的数据成员 a 的值可以不同吗?解:可以,类的每一个对象都有自己的数据成员。4-6 什么叫做拷贝构造函数?拷贝构造函数何时被调用?解:拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用,其作用是使用一个已经存在的对象,去初始化一个新的同类的对象。在以下三种情况下会被调用:在当用类的一个对象去初始化该类的另一个对象时;如果函数的形参是类对象,调用函数进行形参和实参结合时;如果函数的返回值是类对象,函数调用完成返回时;4-7 拷贝构造函数与赋值运算符(=)有何不同?解:赋值运算符(=)作用于一个已存在的对象;而拷贝构造函数会创建一个新的对象。4-8 定义一个 Dog 类,包含的 age、weight 等属性,以及对这些属性操作的方法。实现并测试这个类。解:源程序:#include class Dog public:Dog(int initialAge=0,int initialWeight=5);Dog();int GetAge()return itsAge;/inline!void SetAge(int age)itsAge=age;/inline!int GetWeight()return itsWeight;/inline!void SetWeight(int weight)itsAge=weight;/inline!private:int itsAge,itsWeight;Dog:Dog(int