C++程序设计(第二版吴乃陵况迎辉)课后答案_第1页
C++程序设计(第二版吴乃陵况迎辉)课后答案_第2页
C++程序设计(第二版吴乃陵况迎辉)课后答案_第3页
C++程序设计(第二版吴乃陵况迎辉)课后答案_第4页
C++程序设计(第二版吴乃陵况迎辉)课后答案_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、第一章C+用础知识习题1第一章C+础知识习题判断下列标识符的合法性。sin book 5arry _name main$1 class_cpp a3 x*y my name答:合法的: sin book _name main class_cpp a3非法的: 5arry $1 x*y my name假定有下列变量:int a=3,b=5,c=0;float x=,y=,z=;char ch1= a ,ch2= 5 ,ch3= 0 ,ch4;求下列表达式的值,以及运算后表达式所涉及的各变量的值。x+(int)y%a x=z*b+,b=b*x,b+ ch4=ch3-ch2+ch1int(y/z)+

2、(int)y/(int)z !(ab)&c&(x*=y)&b+ch3|(b+=a*c)|c+ z=(a1)答:x+(int)y%a表达式值为:,运算后x、y、a的值不变,仍分别为、3。提示:运算时取出y变量的数值强制转化为整型数放入寄存器参加运算,但内存中y本身的数值不变化。只有赋值运算和自增、自减运算才改变变量本身的值x=z*b+,b=b*x,b+表达式值为:42,运算后x为,b为43。提示:逗号表达式,依次运算,表达式的值是最后一次运算的值。后+是变量先参加运算然后变量自身加1,所以第1步x等于*5,即,然后b增为6;第2步b赋值为42;第3步,表达式的值是上一步后b的值42,但随后b的伯

3、;自增1,成为43。ch4=ch3-ch2+ch1表达式值为:,字符外斜杠。运算后ch1、ch2、ch3值不变。提示:字符型的变量实质是范围很小的整型量。int(y/z)+(int)y/(int)z 表达式值为:13。y和z自身的值不变。提示:int(y是完成实数除法后,商强制转化为整型,(int)y/(int)z则是数值先转换,完成的是整除。!(ab)&c&(x*=y)&b+表达式值为:0。运算后x仍为,b仍为5提示:只要出现一个false右边的不再做,因为c为0,即false,所以其右的所有运算不再做。ch3|(b+=a*c)|c+ 表达式值为:1。运算后b为5, c为0,均不变。提八:只

4、要出现一个true,右边不再做。ch3的值为48。z=(a1)表达式值为:6。运算后a与b的值不变仍为3和5。提示:a的数值为(00000011)2,左移2位为(00001100)2即12,相当整数2两次,而b的数值为(00000101)2,右移1位为 (00000010)2,即 2,相当于整除2。判断下列哪些是常量,哪些是变量。China const int n=10; int m=5; a char ch=aint array5=1,2,3,4,5; char s=Hello;答: China 文字常量const int n=10; 常变量int m=5; 变量a 文字常量 1第一章C+础

5、知识习题2char ch=a 变量int array5=1,2,3,4,5; 变量char s=Hello; 变量将下列算式或叙述用C+S达式描述。22)(arcsin2cx(x+y)/(x-y)*ay)(3)位j原点为的心,a, b为半径的圆环中的点坐标。 cba(5)并且字符ch不为0。20k答: pi/2+sqrt(asin(x)*asin(x)+c*c)(x+y)/(x-y)*pow(a,y)(x*x+y*y)=a*a)&(x*x+y*y)=b*b)(a!=b)&(a!=c)&(b!=c)(kabxych1;ch2=();cinch3;若从键盘输入 :3 2 7 a b c执行后各变量

6、取值如何注意abce字符两两间有空格。答:a是3,b是2, x是,y是7, chi是a , ch2是空格,ch3是b。设有语句:int a,b,c,d;cinoctabhexcdecd;若从键盘输入:23 23 23 23执行后各变量的信用十进制表示各是多少答:a: 19, b: 19, c: 35, d: 23对于习题,若执行:coutvvavv,t,vvhexvvb t,octc5) if(b-a25) a+;else b/=a;解答: 本题检查学生整除的概念。跟踪:abb/a循环次数b-a31003319741002529651002039515100613851610061484171

7、005停(1) 1417(3) 1003.1.2设有说明:int n,x,k,y;下面程序段的功能是备选答案中的(1),当n=10,x=10打印结果是(2)。cinxn;k=0;do x/=2;k+;while(kn);y=1+x;k=0;do y=y*y;k+;while(kn);coutyendl;备选答案:A, y = (1+x)n B y =(1+:)2C.y =(1 + x)nd.2n,y = (1+ x 22n +1 )n2解答:第一个循环使x成为:上;y成为:1+上;第一个循环使V成为:(1+ xL22; 2n2n2”,(1) B考虑整除连除4次以后为零,所以:心、,2n1请看如

8、下程序段:if(num=1) cout Alph;else if(num=2) cout“Bata;else if(num=3)coutGamma”;else cout Def ;当num的值分别为1、2、3时,上面程序段的输出分别为、 、(3)。解答:检查条件语句与字符串输出概念:AlphaBataGamma执行下面程序段后,m和k的值分别为(1)、(2)。int m,k;for(k=1,m=0;k=10) break;if(m%2=0)m+=5;continue;m-=3;解答:注意continue语句的使用初值m=1k=0第1次循环后m=5k=1第2次循环m=2k=2第3次循环m=7k=

9、3第4次循环m=4k=4第5次循环m=9k=5第6次循环m=6k=6第7次循环m=11结束,k+未做(1) 116二.编程与综合练习题编程求一元二次方程 ax2+bx+c=0的根。包括以下判断和结果:若输入 a=0,给出提示;若A 0,输出两个不等实根;若A=0,输出两个相等实根;若A 0,输出两个复数根。解:本题以一个绝对值极小的数作为实数0。#include #include #include void main()double a,b,c; double delta,x1,x2;const double zero=ie-9;和源程序文件.cpp。头文件中定义用户自定义的数据类型,所 有的

10、程序实现则放在不同的源程序文件中。编译时每个源程序文件单独编译,如果一 源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存放在内存, 之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。所有的目标文件 经连隹器近接最终小版一个完整的可兼行文祢.exe。多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修 改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行 合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文 件中,这样形成一系列按照功能分类的文件,便于为其他程序文件使用。宏定义与常量定义从作用及效果上看是一

11、样的,二者是否完全相同答:完全不同。不带参宏定义与const说明符定义常量从效果上看是一样的,但它们 的机制不同。首先宏定义是在预处理阶段完成,而cons证义则是在编译阶段实现。其次宏定义只是一种笥单的字符串替代,不会为字符串分配内存单元,替代过程也 不作语法检查,即使指令中的常量字符串不符合常量要求,预处理的替代过程也照 样按指令给出的格式进行。而const定义则是象定义一个变量一样定义一个常量标识 符,系统要按照类型要求为该标识符分配内存单元,同时在将常量放入单元时进行 类型检查,如果类型不匹配,类型相容的会进行系统的类型转换,不相容的则要提 示错误。二.编程与综合练习题设计函数,将小写英

12、文字符变为对应的大写字符。解:小写字母比大写字母 ASCIB值大32,或写作ch=ch- a + A;#includeusing namespace std;char capitalize(char ch)if(ch=a&ch=z) return ch-a+A;else return ch;%三章函数习题6int main()int i=0;char cp30;cout”请输入包含小写字母的句子:endl;(cp,30);while(cpi!=0) coutcapitalize(cpi+);coutendl;return 0;设计两个函数,分别求两个数的最大公约数和最小公倍数。解:可用穷举法求

13、最大公约数(从大到小找到的第1个公约数)和最小公倍数(从小 到大找到的第1个公倍数)。#includeusing namespace std;MaxCommonDevisor(int n,int m) int i;for( i=n;i=1;i-)if(n%i=0 & m%i=0) break;return i;MinCommonMultiple(int n,int m)int i;for(i=n;i=n*m;i+)if(i%n=0 & i%m=0) break;return i;int main()int i,j;cout请输入两个整数:ij;cout最大公约数:MaxCommonDeviso

14、r(i,j)t 最小公倍数: MinCommonMultiple(i,j)endl;return 0;,设计函数digit(num,k),返回整数num从右边开始的第k位数字的值。例如: digit(4647,3)=6digit(23523,7)=0解:把整数转换为数串,放在一个整型数组中。#include using namespace std;digit(int num,int k)int s10=0,0,0,0,0,0,0,0,0,0;第三章 函数习题 7int i=0;do0m0,n )1,(,1( 0n 11 0m 1),(nmAcmmAcm),Acm(m-nnmAcm第三章 函数习

15、题 9其中m、n为正整数。设计程序求Acm(2,1), Acm(3,2)。解:递归函数实现非常简单,按公式写即可。#include using namespace std;Acm(int m,int n)if(m=0) return n+1;if(n=0) return Acm(m-1,1);return Acm(m-1,Acm(m,n-1);int main()coutAcm(2,1)=Acm(2,1)endl;coutAcm(3,2)=Acm(3,2)endl;return 0;用递归函数实现勒让德多项式:1n /)()1()()12(1n 0n 1)(21nxPnxxPnxxPnnn在主

16、函数中求P4。解:把勒让德多项式的阶和自变量都作为参数。#includeusing namespace std;double P(int n,double x)if(n=0) return 1;if(n=1) return x;return (2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x)/n;int main()coutP(4,=P(4,endl;return 0;定义内联函数实现求三个实数中的最大值。解:内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法内联展开的递归 函数,都不能

17、定义为内联函数,即使定义,系统也将作为一般函数处理。#include using namespace std;inline max(int a,int b,int c)if(ab&ac) return a;if(ba&bc) return b;return c;第三章函数习题 10int main()coutmax(3,7,4)=0&ch二9来判断#includeusing namespace std;inline bool IfDigitChar(char ch)if(ch=0&ch=9) return 1;else return 0;int main()char ch;cout”请输入一个

18、字符(输入“! 停止)ch;while(ch!=!)if(IfDigitChar(ch) coutch is a digit charendl;else coutch is not a digit charendl;cout”请输入一个字符(输入“! 停止)ch;return 0;设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。两个实数 求余定义为实数四舍五入取整后相除的余数。解:实数四舍五入取整,正数是+取整,负数是取整。#include#includeusing namespace std;mod(int n,int m)return n%m;round(double x)

19、 基木概念与基础知识 自 测题 -填空题5.1.1引入类定义的关键字是。类的成员函数通常指定为(2).类的数据成员通常指定为(3)。指定为 (4)的类成员可以在类对象所在域中的任何位置访问它们。通常用类的成员表示类的属性,用类的 (6)成员表示类的操作。答案:class公有的public私有的 private公有的public 数据(6) 函数4.1.2 类的访问限定符包括(1)、(2)和 (3)。私有数据通常由(4) 函数来访问(读和写)。这些函数统称为(5)。答案:public (公有的)private (私有的)protected (保护的)公有的成员函数类的接口通常在逻辑上,同一类的每

20、个对象都有 CU代码区,用以存储成员函数。而在物理上通常只有(2)代码区。只有在(3)定义,并 (4) 的函数和加了关键字的函数例外。答案:独立的共用的在类说明中不包括循环等复杂结构 inlineC+用支持三种域: 、。函数域被包括在中,全局域被包括在 中。using指示符以关键字 using开头,后面是关键字(6)最后是 (7)这样表示以后在该名字空间中所有成员都 (8)。如不使用using指示符则在使用时要加::,称为(9 )运算符。答案:局部域 l local scope )(2 )名字空间域(namespace scope)(3 )类域(class scope)(4 )局部域(5 )名

21、字空间域(6 )namespace(7 )名字空间名可以直接被使用域4.1.5引用通常用作函数的(1)和(2)。对数组只能引用(3)不能引用(4)。答案:(1) 参数 返回值数组元素数组名本身构造函数的任务是(1)。构造函数无(2)。类中可以有(3)个构造函数,它们由(4)区分。如果类说明中没有给出构造函数,则C+编译 器会 。拷贝构造函数的参数是(6),当程序没有给出复制构造函数时,系统会自动提供 支持,这样的复制构造函数中每个类成员(8)O答案:初始化数据成员函数返回类型说明 多不同的参数表自动给出一个默认的构造函数同一类对象的引用默认的的复制构造函,称为默认的按成员语义支持。被依次复制一

22、个类有(1) 个析构函数。(2)时,系统会自动调用析构函数。答案:一对象注销时4.1.8运算符重载时,其函数名由 (1) 构成。成员函数重载双目运算符时,左操作数是(2),右操作数是 (3)。答案:关键字operator和该运算符 对象该函数的参数4.1.9 面向过程的程序设计中程序模型描述为(1),面向对象程序设计的程序模型可描述为 (2)。答案:(1)程序=M法+数据结构0其数据与数据处理是分离的。(2)程序=(对象+对象+对象)+消息;对象=(算法+数据结构)。面向对象设计将数据和对数据的操作方法放在一起,形成一个相对独立的整体 对象(Object)并通 过简单的接口与外部联系。对象之间

23、通过消息(Message)进行通讯。简答题简单解释什么是面向对象程序设计的封装性。答:对象是一个封装体,在其中封装了该对象所具有的属性和操作。对象作为独立的基本单元,实现了将数据和数据处理相结合的思想。此外,封装特性还体现在可以限制对象中数据和操作的访问权限,从而将属性 隐藏”在对象内部,对外只呈现一定的外部特性和功能。封装性增加了对象的独立性,C+通过建立数据类型一一类,来支持封装和数据隐藏。 一 个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道 这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠 性保护 类中的数据不被类以外的程序

24、随意使用。 这两个优点十分有利于程序的调试和维护。C+魏译器怎样对标识符进行解析 答:编译器对标识符的解析分两步, 第一步查找在 声明中用到的标识符,特别是函数成员声明中用到的参数类型,第二步是函数成员体内的标 识符。4.2.3为什么说类与对象的概念是客观世界的反映 行为(或操作),具有相同属性和行为的事物可以归 物的效率。C+中定义的类则是通过抽象的方法将答:客观世界的事物都具有某些属性和 属于一类,用分类的方法可以提高认识事 某一类事物共有的静态特征(属性)和动态特征(行为)概括出来并加以描述, 而对象是类的具体实现,所以说类与对象的概念是客观世界的反映。什么叫类域为什么说类域是抽象的答:

25、类域是类体所包括的范围。每个类定义都引入了一个独立的类域,在类域中说明的标识 符仅在该类的类域中有效。由于类只是一个说明,看上去有数据,有函数,有类型定义,但 是它并非实体,不分配内存,当然也不能运行。所 以说类域是抽象的。引用作为函数参数时为什么能实现两个实参之间的数据交换为什么对应实参不能 为引用为什么返回值为引用的函数可以作为左值答:引用变量是其关联变量的别名,二者在内存中占据同一个存储单元。在一个以引用作为 参数的函数中,交换两个参数的值,实际上就是交换两个实参的值。如果函数的参数是引用,调用时需要取得实参的地址,而实参如果已经是一个地址,再进行引用将产生错误, 故对应 实参不能为引用

26、。函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为引用的函数实 际上是将关联变量作为左值参与运算。答:如果在类定义中不显式 不过该函数不做具体的初始C+编译器都认为是缺省的什么是缺省的构造函数缺省的构造函数最多可以有多少个 地定义构造函数,C+副译器会自动产生一个缺省的构造函数, 化工作。只要构造函数是无参的或者只要各参数均有缺省值的, 构造函数。缺省的构造函数只能有一个。拷贝构造函数用于哪三个方面答:用类的一个对象去初始化该类的另一个对象时使用。当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。当函数的返回值是类对象,函数执行结束返回调用者时使用。写出含有对象成员

27、的类的构造函数的格式,并做简单说明。答:C+中对含对象成员的类对象的构造函数有固定的格式:类名二构造函数名(参数总表):对象成员1(参数名表1),对象成员2(参数名表2), 对象成员n(参数名表n)冒号后用逗号隔开的是要初始化的对象成员,附在后面的参数名表1,,参数名表n依次 为调用相应对象成员所属的构造函数时的实参表。这些表中的参数通常来自冒号前的参数总表,但没有类型名。所有类对象未重载的赋值运算符 是怎样工作的为什么它可以进行连续赋值 答:对 所有的类对象,未重载的赋值运算符 “=”称作缺省的按成员拷贝赋值操作符, 同类 对象之间 可以用“木接拷贝。因为缺省的赋值操作返回一个对象的引用,

28、所以它可以进 行连续赋值。24.2.11重载复数运算符+时,采用下面友元函数声明:friend Complex1 operator +(Complex &c1,Complex &c2);为什么不能用于 实数 + 复0数”怎样改进才能适用为什么答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为夏数,编译时无法通过。添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则停以实现 实数+复数”运算。修改后的说明为:么 friend Complex operator +(const Complex &c1, const Complex &c2);42.12类的静

29、态数据成员与函数中的 静态成员有何异同 答:类的静态成员为其所有对象共享, 忝管有多少对象,静态成员只有一份存于公用内存中,为该类所有对象公用。函数中的静态变量也位于公用内存中,不随函数调用而重新分配,所 以总是保留上次进入并执行该函数后留策的信息。的4.2.13 C+中结构、联合与类三者间有何异同酸:在C+中结构(structure )与类几乎是完全一样的类型, 差别仅仅在于缺省情况下结构 的 球员为公有的。联合(union)是C+的导出数据类型,在语法与功能上类似于结构,二 者 阳区别是:结构变量的各成员同时被分配了各自独立的内存区,而联合变量的各个成员的 存镑开始地址都相同,所以在任一时

30、刻联合变量只能存储一个成员。问412.14对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的 嘉效联系面向对象程序的组织与面向过程有什么不同答:因为对象的操作主要用来响应外来谈息并为其他对象提供服务,所以面向对象的程序利用消息传递机制来建立各对象之间的有贫联系,协调各对象的运行。一个对象可以向其他对象发送消息以请求服务,也可以响应其他时象传来的消息,完成自身固有的某些操作,从而 服务于其他对象。面向过程的程序是模块化的,模块的组织具有分层结构特点,层与层之间是调用关系。他向对象程序是由一个个封装的对象组成,而对象是由紧密结合在一起的算法和数据结构组*。对象之间是相互请求和

31、相互协作的关系。用对象名 加 运 算加对 象成员名 答:友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对 象名加运算符 加对象成员名。这一点和一般函数一样。4.2.15简叙Windows下应用程序的运行方式。答:Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。它的运 Windows系统使用事件驱动的编程模式。所谓事件的含义非常广泛。输入设备的动作,如 敲打键盘、按鼠标等会产生一系列的事件(注意不是一个事件)。操作系统所作的一举一动也 极当作某种类型的事件,应用程序也会产生各种事件。事件用来标识发生的某件事情。制 Windows 系统对于应用程序环境

32、中发生的每一个事件都会以对应的某种消息的形式标 谡,并放入相应的 Windows建立的消息队列中,然后由对应的应用程序或窗口函数去处理。窗口函数处理是分层的,前面处理不了的送到后面, 最后处理不了剩下的全由缺省的窗口函数处So 息42.16类的成员函数在什么情况下应该定义为私有的这样做的目的是什么答:除接口函数和例建本类对象的构造函数和撤消该对象的析构函数外。其余成员函数应该定义为私有的,这是和发类时故意对外隐蔽起来的操作,而这些往往是最复杂最关键的部分。类中故意的隐藏也为事后的升级扩展留下了余地,只要接口不变,内部再变,也不必修改原来的程序,就象MFC(微 殊基础类)升级后,由MFC底层类所

33、编的程序完全不必修改,自 动升级。驱新.编程与综合练习题(构造一个日期时间类 (Timedate)数据成员包括年、月、日和时、分、秒,函数成员 包m 括设置日期时间和输出时间,其中年、月请用枚举类型,并完成测试。(包括用成员 函e 数和用普通函数) e娜:本题要求仅是定义类的练习,并非实用的提供日期时间的程序。实用的日期时间程序 见q 附录二的日期时间函数。 s#include #include esing namespace std; enum -b YRY2000,Y2001,Y2002a ,丫2003,Y2004,Y2005;s Circumference=2*r*3.; e Circl

34、e:Circle(Circle & cl)r=; Area=; Circumference=; a ndoid Circle:SetR(doubleR) r=R; Area=r*r*3.; en int td r ivCircumference=2*r*3.;main()Circle cl1(2),cl2,cl3=cl1;cout圆半径:()t圆周长:()t圆面积:()endl; (4); cout圆半径:()t圆周 长:()t圆面积:()endl;return 0;,生日(Birthday)和家庭住址(HomeAddress)成员函数包括人员信息的录入 和显示。还包 括构造函数与拷贝构造函数

35、。设计一个合适的初始值。解:本题为指出构造函数等的调用,加了一些提示语句。#include #includeusing namespace std;enum Tsexmid,man,woman;ccasId PersO堤19; 1986 年8 月 18 日 1986 年 8月 18 日word00 x6dmksi0word10 x6foword20 x72rksi1本概念与基础知识自测题 -填充题5.1.1数组定义时有三个要素:数组名,数组元素的(1)和数组元素的(2)。按元 素在数组中的位置进行访问,是通过(3)进行的,称为 (4)或(5)访问。 为了使数组声明中数组的大小修改更为方便,总是

36、将 (6)用于声明数组长度。答案:(1)类型(2)数量(3)下标运算符(4)下标(5)索引(6)常变量C/C+中的多维数组用的是一个(1)的定义,即多维数组的基本定义是(2)构成的数组,三维数组的元素是(3)。答案:(1)嵌套(2)以数组作为元素(3)二维数组计算机内存是一维编址的,多维数组在内存中的存储(1) . C/C+多维在内存中 的排列是 (2)方式,即越 (3)的下标变化(4)。设数组a有m行n列,每个 元存u个字节,则aij的首地址为(5) + (6)。答案:(1)必须要转化为一维方式,按行方式右越快a数组的首地址(i*n+j)*u对于多维数组,(1)的大小是确定的.所谓不检查数组

37、边界 只是不检查(2) 的边界,而(3)的边界是在控制之中的,所以多维数组名作为函数的参数只可以(4) 缺省。答案:(1)较低各维的(2)最高维(第一维)(3)较低各维(4)最高维5.1.5指针变量保存了另一变量的 -C1L值,不可以任意给指针变量赋一个地址值,只能赋 给它(2) 和 (3) 的地址。使用变量名来访问变量,是按 来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。答案:(1)地址NULL(3)已经分配了内存的变量的地址(4)按变量的地址(5)直接访问(6)间接访问5.1.6固定指向一个对象的指针,称为(1),即,定义时const放在(3)。

38、而指 向常量”的指针称为(4),指针本身可以指向别的对象,但(5),定义时const放在 (6)。答案:(1)指针常量(2)指针本身是常量const放在类型说明之后,变量名之前(4)常量指针(5)不能通过该指针修改对象(6) const放在类型说明之前数组名在表达式中被自动转换为指向(1)的指针常量,数组名是地址,但数组名 中放的地址是 (2),所以数组名 (3)。这样数组名可以由(4)来代替,C+这样做使用时十分方便, 但丢失了数组的另一要素 ,数组名是指向数组(6)的指针,而不是指向数组(7)的。编译器按数组定义的大小分配内存,但运行时 对(8)不加检测,这会带来无法预知的严重错误。答案:

39、(1)数组第一个元素(2)不可改变的(3)称指针常量(4)指针(5)数组元素的数量(6)元素(7)整体(8)对数组的边界不加检测有一个三维数组:int z3d234;给出指向三维数组第i行第j列第k页元素的指针的三种表达方式(1),,(3)。再给出这些元素的三种表达方式(4).(5),(6)。答案:(1) z3dij+k 或 &z3di皿k*(z3di+j)+k*(*(z3d+i)+j)+kz3di皿k或*(z3dij+k)*(*(z3di+j)+k)*(*(*(z3d+i)+j)+k)简答题物理上,C+隹怎样访问数组元素的请对访问方法作简单介绍。答:物理上,C+语言的下标运算符是以指针作为操

40、作数的,ai被编译系统解释为*(a+i),即表示为a所指(固定不 可变)元素向后第i个元素。无论我们是以下标方式或指针方式存取数组元素时,系统都是转换为指针方法实现。这样做对多维数组尤其方便。什么是回溯算法答:回溯法是对枚举法的一种改进。回溯法的基本思想是,通过对问题 的分析找出解决问题 的线索,先在一个局部上找出满足问题条件的局部的解,然后逐步由局部解向整个问题的解 的方向试探,若试探成功就得到问题的解,试探失败逐步向后退,改变局 部解再向前试探。回溯法能避免枚举法的许多不必要的搜索,使问题比较快地得到解决。用数组名作为函数的参数时,可否加上数组的长度如果需要加则怎样加为什么答:被调函数中作

41、为形式参数的一维数组不需要说明长度,即使说明了大小也不起作用,因为C+只传递数组首地址,而对数组边界不加检查。需要编写一个对多维数组通用的算法 (即各维的大小未定),怎样才能把实参多维数 组 的信息全部传递到函数中去 答:最佳方法是用函数模板, 多维数组用模板类型参数传递, 各 维的大小作为参数传递。 也 可以用一维数组加各维的大小都作为参数传递。2 运算符和-”是成员访问运算符(Member Access Oprator)。在对象或结构外部去访问公有的数据成员或函数成员时,是在对象名后加 (点操作符),再加成员函数名或函数名就可以了。但是这些成员必须是公有的成员,只有公有成员才能在对象的外面

42、对它进行访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在指针变量名后加-”解箭头操作符),再加公有成员名就可以了。释52.6什么是this指针简述它的作用。答:当我们在对象的外部访问该对象的公有成员时,馨须指明是哪一个对象。但是当我们用 对象的成员函数来访问本对象的成员时,在成员函数中猱要给出成员名就可以实现对该对象 员函数的拷贝。既然是同一份拷贝, 据呢其实每一个对象有一个隐藏的成员的访问。但同一个类创建的多个对象共用同一份成那么成员函数又怎么知道是取哪一个对象的成员数 this指针,它始终指向该对象,并将该指针作为一个参数成员操作符总是要使用的,只不过在对象内是隐式的,1动传递

43、给该成员函数。这就是说, 第口在对象内省略了 this指针。&2.7指针变量与整型量的加减运算代表什么意义 针,以指向当前目标前面或后面的若干个位置的目 Hi*sizeof(目标类型)积的加减,得出新的地址。答:指针变量与整型量的加减表示移动指标。指针与整型量i的加减等于指针值(地址)作52.8 非法。 运52.9符答:设a为数组名,那么a+是否合法为什么 因为a是指针常量。指针作为函数的参数时,它传递的是什么实参要用什么而使用引用时实参要用什的 作 用么何时只能用指针而不能用引用答:是地址,是指针所指向的变量或对象的内存首地址,在物理上讲我们传的是指针的值,与传其它变量是没有差异的,函数获得

44、的是另一个变量的地址,在逻辑上讲我们是把另一个变量的地址传过去了,可以看作传地址。实参要用变量或对象的地址。 而使用引用时实参要 用而不能用引用,因为数组的引用不存在。fi*n卜指针作为函数的返回值时,勺函数入中,函数消亡后,数据仍同启伟5.2应该注意什么_答:指针指向的数据的生命期必须不仅仅如果返 回的指计,它所指的变量或对象已消亡,则不褥回值无意义,这点必须十产w一金之直号使用指计不户是作?参数还曷返回值I,cha*ps= 世 a book.”立了一个字符串,并把*ps=IX _,/S a car ;这I茁代表什么是否讦确C答:(没有建立字符串,只是让ctrino isjbo?。作为其初值

45、随后,有语句:ps指向一个放在代码区中的特殊字符串,而该字符串所在内存是不可写的。后一条语句要求把字符串赋给不可写的字符串空间是错的。二、编程与综合练习题打印杨辉三角形(10行)使用二维数组并利用每个系数等于其肩上两系数之和。解:好的算法无特例,二维数组共用11列,第1列全0,方便计算#includeintusing namespace std; int main()9.3.3;9.3.3;木概念与基础知识自测题 -填充题模板是为了实现代码的(1).它把数据类型改为一个(2).称为 (3)程序设计。模板包括(4) 和 (5)。答案:(1)重用(2)设计参数(3)参数化(parameterize

46、)(4)函数模板(function template)(5)类模板(class template)调用函数模板时,可以显式指定模板参数类型,也可以隐式进行,称为(1),这是根据 (2) 来决定的。答案:(1)模板实参推演(template argument deduction)一组实际类型或(和)值顺序查找可以用于11)线性表,而对半查找可以用于(2)线性表。答案:(1)无序的(所有)(2)有序的最常见的排序方式有(1) 、(2)和 (3)。如果现有一个已排好序的线 性表,在表尾添加了一个元素,而)排序法使它重新成为有序的所需工作 量最小。答案:(1)选择(2)插入(3)交换(4)交换(可利用

47、原来的有序性)给出以下指针的说明方式:指向一个4元素整型数组的指针为(1) ;指向一个返 回整型数,参数为两个整型数的函数的指针(2);指向一个数组的指针,而该数组元素都是指向一个返回整型指针的无参函数(3)。答案:(1) int(*p)4int(*p)( int,int)(3)以指向6元素数组为例:int*(*)() (*p)6简答题需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也 可以用一维数组加各维的大小都作为参数传递。什么叫函数模板什么叫模板函数什么叫类模

48、板什么叫模板类答:不受数据类型限制的通用型的函数使代码的可重用性大大提高。把数据类型改为程序设计。一个设计参数是一个可行的方案。这种程序设计类型称为参数化(Parameterize)这样的软件模块由模板(Template)构造。包括函数模板和类模板。函数模板定义如下:template 返回类型函数名(形式参数表)6.2.36.2.46.2.5程与综合练习题使用自定义字符串类,编写求数组元素中最大值的函数模板。解:函数模板有三种应用方式:.类模板的成员函数,在模板类型参数中重载函数和运算符,直接访问私有数据成员,实 现通用算法。这是标准的面向对象的方法。.函数模板处理模板类,以类模版为参数,用模

49、板类型参数中重载的函数或运算符,实现通用算法。但调用类模板的接口函数间接访问私有数据成员,也是常见的。.函数模板处理普通数据,往往要用函数作为参数,实现通用算法。这是面向过程的方法。解:使用独立的函数模板,相对简单。#include using namespace std;const int n=256;class mystringhow(); cout按字典序 _查找校名:endl;(max(ms,6).show();return 0;将自定义字符串类用于对半查找的函数模板。解1:为简化,使用独立的函数模板#include using namespace std;const int n=256;class mystringhow(); _i=BinarySearch(ms,x,6);coutiendl;i=BinarySearch(ms,y,6);coutiendl;return 0;解2:函数模板使用成员函数()#include

温馨提示

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

评论

0/150

提交评论