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

下载本文档

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

文档简介

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+ch1 int(y/

2、z)+(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

3、,但随后b的值自增1,成为43。ch4=ch3-ch2+ch1表达式值为:,字符外斜杠。运算后ch1、ch2、ch3值不变。提示:字符型的变量实质是范围很小的整型量。int(y/z)+(int)y/(int)z表达式值为:13。y和z自身的值不变。提示: int(y/z) 是完成实数除法后, 商强制转化为整型, (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

4、,c为0,均不变。提示:只要出现一个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; 变量

5、a 文字常量 1第一章C+基础知识习题2char ch=a 变量int array5=1,2,3,4,5;变量char s=Hello; 变量将下列算式或叙述用C+表达式描述。(1) 22)(arcsin2cx(2) (x+y)/(x-y)*ay)(3) 位于原点为圆心, a, b 为半径的圆环中的点坐标。(4) 。 cba并且字符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)(k abxych1;ch2=();ci

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

7、71005停(1) 14(2) 173) 100设有说明:int n,x,k,y;下面程序段的功能是备选答案中的(1) ,当n=10,x=10打印结果是(2)Qcin x n;k=0;do x/=2;k+;while(k n);y=1+x; k=0;do y=y*y;k+;while(k n);coutvvyvve ndl;备选答案:A.y = (i +B.x)n(1 +y = 2Xn)2 C-(1 +D.(1 +尹+1)2第二章 基本控制结构程序设计习题2解答:r ; y成为:1+ ;第一个循环使y成为:X ) 2;第一个循环使x成x (1 +2为:X2n2n(1) B考虑整除,连除4次以后

8、为零,所以:x2 “(2) 1请看如下程序段:if(num=1)cout ” Alpha”;else if(num=2)cout v” Bata ” ;else if(num=3)cout ” Gama”;else cout =10)break; if(m%2=0)m+=5;con ti nue;m-=3;解答:注意 continue语句的使用初值m=1第1次循环后m=5第2次循环m=2第3次循环m=7第4次循环m=4第5次循环m=9第6次循环m=6第7次循环(1) 11(2) 6m=11二编程与综合练习题编程求兀一次方程ax2+bx+c=0for(k=1,m=0;k=50k=0k=1k=2k

9、=3k=4k=5k=6结束,k+未 做的根。包括以下判断和结果:若输入a=0,给出提示;若少0,输出两个不等实根;若 ZU,输出两个相等实根;若 乍0,输出两个 复数根。解:本题以一个绝对值极小的数作为实数0。#in elude #in elude #in elude void main() double a,b,e;double delta,x1,x2;放在内存,之后对临时文件进行编译生成目标文件.obj,编译后临时文件撤销。所有的目标文件经连接器连接最终生成一个完整的可执行文件.exe。const double zero=1 和源程序文件.epp。头文件中定义用户自定义的数据 类型,所有的

10、程序实现则放在不同的源程序文件屮。编译时每个源程序文件单独编 _ 译,如果源程序文件中有编译预处理指令,则首先经过编译预处理生成临时文件存 多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修 改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行 合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文 件中,这样形成一系列按照功能分类的文件,便于为其他程序文件使用。宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同 答:完全不同。不带参宏定义与const说明符定义常量从效果上看是一样的,但它们示错误。二编程与综合练习题设计函数,

11、将小写英文字符变为对应的大写字符。解:小写字母比大写字母 ASCII码值大32,或写作ch=ch- a + A的机制不同。首先宏定义是在预处理阶段完成,而 const定义则是在编译阶段实现。 其次宏定义只是一种简单的字符串替代,不会为字符串分配内存单元,替代过程也 不作语法检查,即使指令中的常量字符串不符合常量要求,预处理的替代过程也照 样按指令给出的格式进行。而const定义则是象定义一个变量一样定义一个常量标识 符,系统要按照类型要求为该标识符分配内存单元,同时在将常量放入单元时进行 类型检查,如果类型不匹配,类型相容的会进行系统的类型转换,不相容的则要提#in clude using n

12、 amespace std;char capitalize(char ch)if(ch=a&ch=z) return ch-a+A;else retur n ch;第三章函数习题6int mai n()int i=0;char cp30;cout请输入包含小写字母的句子:endl;(cp,30);while(cpi!=0) coutcapitalize(cpi+);coute ndl;return 0;设计两个函数,分别求两个数的最大公约数和最小公倍数。解:可用穷举法求最大公约数(从大到小找到的第1个公约数)和最小公倍数(从小 到大找到的第1个公倍数)。#in cludeusing n ame

13、space std;MaxCom mon Devisor(i nt n ,i nt 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 最大公约数: MaxCommonDevisor(i,j)t 最小公倍数: MinCommonMultiple(i,j)endl;return 0;

14、设计函数digit(num,k),返回整数nun从右边开始的第k位数字的值。例如:digit(4647,3)=6digit(23523,7)=0解:把整数转换为数串,放在一个整型数组中。#includeusing nanespace std;digit(int nun,int k)int s10=0,0,0,0,0,0,0,0,0,0;第三章 函数习题 7int i=0;do0n0,n )1,(,1( 0n 11 0n 1),(nnAcnnAcn),Acn(n-nnnAcn第三章 函数习题 9其中m n为正整数。设计程序求Acm(2,1) , Acm(3,2)。解:递归函数实现非常简单,按公式

15、写即可。#includeusing 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在主函数中求 P4。解:把勒让德多项式的阶和自变量都作为参数。#includeusing namespace

16、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语句等,以及无法内联展开的递 归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。#includeusing namespace

17、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 来判断。#in cludeusing n amespace std;inline bool lfDigitChar(char ch)if(ch=O&ch=9) return 1;else return 0;int mai n()char chcoutvv请输入一个字符(输入“!”停止) ch;while(ch!=!)if(lfDigitChar(ch)

18、 coutch is a digit chare ndl;else coutch is not a digit chare ndl;coutvv请输入一个字符(输入“!”停止) ch;return 0;设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。两个实数 求余定义为实数四舍五入取整后相除的余数。解:实数四舍五入取整,正数是+取整,负数是取整。#in clude#in cludeusing n amespace std;mod(i nt n ,i nt m)return n %m;round(double x)基木 概念与基础 知识 自 测题 -填空题引入类定义的关键字是(

19、1) O类的成员函数通常指定为(2),类的数据成员通常指定为(3)。指疋为(4)的类成员可以在类对象所在域 中的任何位置访问它们O通常用类的(5)成员表示类的属性,用类的(6)成员表示类的操作。答案:(1)class(2)公有的public(3)私有的private(4)公有的public(5)数据(6)函数类的访问限定符包括(1)、(2) 和(3)。私有数据通常由(4) 函数来访问(读和写)。这些函数统称为_5)o 答案:(1)public (公有的)(2)private (私有的)(3)protected (保护的)(4)公有的成员函数(5)类的接口通常在逻辑上,同一类的每个对象都有 (1

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

21、 scope)(3)类域(class scope )(4)局部域(5)名字空间域(6)n amespace(7)名字空间名(8)(9)可以直接被使用 域引用通常用作函数的(1)和(2)。对数组只能引用 (3)不能引用(4) o答案:(1)参数(2)返回值(3)数组兀素(4)数组名本身构造函数的任务是 (1)0 构造 函数无(2)。类中可以有(3)个构造函数,它们由(4)区分0如果类说明中没有给出构造函数,贝忆+编译器会(5 )0拷贝构造函数的参数是(6),当程序没有给出复制构造函 数时,系统会自动提供(7)支持,这样的复制构造函数中每个类成员(8)。答案:(1)初始化数据成员(2)函数返回类型

22、说明(3)多(4)不同的参数表(5)自动给出一个默认的构造函数(6)同一类对象的引用(7)默认的的复制构造函,称为默认的按成员语义支持。(8)被依次复制一个类有 (1) 个析构函数。(2)时,系统会自动调用析构函数。答案:(1)一(2)对象注销时运算符重载时,其函数名由(1)构成。成员函数重载双目运算符时,左操作数是(2),右操作数是(3)0答案:(1)关键字operator和该运算符(2)对象(3)该函数的参数面向过程的程序设计中程序模型描述为 (1),面向对象程序设计的程序模型可描述为(2) o答案:(1)“程序二算法+数据结构”其数据与数据处理是分离的。(2)程序-(对象+对象+对象)+

23、消息;对象-(算法+数据结构)面向对象设计将数 据和对数据的操作方法放在一起,形成一个相对独立的 整体对象(Object ),并通 过简单的接口与外部联系。对象之间通过消息(Message)进行通讯。简答题简单解释什么是面向对象程序设计的封装性。答:对象是一个封装体,在其中封装了该对象所具有的属性和操作。对象作 为独立的基本单 元,实现了将数据和数据处理相结合的思想。此外,封装 特性还体现在可以限制对象中数据和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外 部特性和功能。封装性增加了对象的独立性,C+通过建立数据类型类,来支持封装 和数据隐藏。一个定义完好的类一旦建立,就可看

24、成完全的封装体,作为一 个整体单元使用,用户不需要 知道这个类是如何工作的,而只需要知道如何 使用就行。另一方面,封装增加了数据的可靠 性,保护类中的数据不被类以 外的程序随意使用 这两个优点十分有利于程 序的调试和维护。C+编译器怎样对标识符进行解析 答:编译器对标识符的解析分 两步, 第一步查找在声明中用到的标识符,特别是函数成员声 明中用到的参数类 型,第二步是函 数成员体内的标识符。为什么说类与对象的概念是客观世界的反映 答:客观世界的事物都 具有某些属性和行为(或操作),具有相同属性和行为的事物可以归 属于 一类,用分类的方法可以提高 认识事物的效率。C+中定义的类则是通过抽 象的方

25、法将 某一类事物共有的静态特征(属性)和动态特征(行为)概括 出来并加以描述,而对象是类 的具体实现,所以说类与对象的概念是客观 世界的反映。什么叫类域为什么说类域是抽象的 答:类域是类体所包括的范围。每 个类定义都引入了一个独立的类域,在类域中说明的标识 符仅在该类的类 域中有效。由于类只是一个说明,看上去有数据,有函数,有类型定义,但 是它并非实体,不分配内存,当然也不能运行。所以说类域是抽象的。引用作为函数参数时为 什么能实现两个实参 之间的数据交换为什么 对应实参不能 为引用为什么返回值为引用的函数可以作为左值 答:引用变 量是其关联变量的别名,二者在内存中占据同一个存储单元。在一个以

26、引用 作为 参数的函数中,交换两个参数的值,实际上就是交换两个实参的值。如果 函数的参数是引用, 调用时需要取得实参的地址,而实参如果已经是一个 地址,再进行引用将产生错误,故对应 实参不能为引用。函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为 引用的函数实际上是将关联变量作为左值参与运算。什么是缺省的构造函数缺省的构造函数最多可以有多少 个 答:如果在 类定义中不显式地定义构造函数,C+编译器会自动产生一个缺省的构造函 数,不过该函数不做具体的初始化工作。只要 构造函数是无参的或者只要 各参数均有缺省值的,C+编译器都认为是缺省的构造函数。缺省的构造函 数只能有一个。拷贝构

27、造函数用于哪三个方面答:(1)用类的一个对象去初始化该类的另一个对象时使用。(2) 当函数的形参是类的对象,调用函数时,进行形参与实参结 合时使 用。(3) 当函数的返回值是类对象,函数执行结束返回调用者时使用。写出含有对象成员的类的构造函数的格式,并做简单说明。答:C+ 中对含对象成员的类对象的构造函数有固定的格式:类名:构造函数名(参数总表):对象成员1(参数名表1),对象成员2(参数名表2),对象成员n(参数名表一n)冒号后用逗号隔幵的是要初始化的 对象成员,附在后面的参数名表1,, 参数名表n依次 为调用相应对象成员所属的构造函数时的实参表。这些表 中的参数通常来自冒号前的参数总 表,

28、但没有类型名。所有类对象未重载的赋值运算符“=”是怎样工作的为什么它可以进 行连续赋值 答:对所有的类对象,未重载的赋值运算符“=”称作缺省的 按成员拷贝赋值操作符,同类 对象之间可以用“二”直接拷贝。因为缺省 的赋值操作返回一个对象的引用,所以它可以进 行连续赋值。为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算 符“ ”再加对 象成员名 答:友元函数不是类的成员函数,在函数体中访问 对象的成员,必须用对象名加运算符“ ”加对象成员名。这一点和一般函 数一样。重载复数运算符+时,采用下面友元函 数声明:friend Complex operator +(Complex &c1,C

29、omplex& c2);为什么不能用于“实数+复数”怎样改进才能 适用为什么答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实 参不能被转换为 复数,编译时无法通过。添加const说明,使实数到复数 的转换隐式地在一份拷贝上进行,则可以实现“实数+复数”运算。修改 后的说明为:friend Complex operator +(const Complex &c1, const Complex& c2);类的静态数据成员与函数中的静态成员有何异同 答:类的静态成员为 其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中,为 该类所有对象公用。函数中的静态变量也位于公用内

30、存中,不随函数调用而 重新分配,所 以总是保留上次 进入并执行该函数后留下的信息。C+中结构、联合与类三者间有何 异同 答:在C+中结构(structure )与类几乎是完全一样的类型,差别仅仅在 于缺省情况下结构 的成员为公有的。联合(union )是C+的导出数据类 型,在语法与功能上类似于结构,二 者的区别是:结构变量的各成员同时 被分配了各自独立的内存区,而联合变量的各个成员的 存储幵始地址都相 同,所以在任一时刻联合变量只能存储一个成员。对象的第一特征是封装,那 么由对象组成的面向对象的程序怎样建 立各对象之间的 有效联系面向对象程序的组织与面向过程有什么不同 答:因为对象的操作主要

31、用 来响应外来消息并为其他对象提供服务,所以面 向对象的程序利 用消息传递机制来建立各对象之间的有效联系,协调各对 象的运行。一个对象可以向其他 对 象发送消息以请求服务,也可以响应其 他对象传来的消息,完成自身固有的某些操作,从而 服务于其他对象。面向过程的程序是模 块化的,模块的组织具有分层结构特点,层与层之 间是调用关系。面向对象程序是由一个个封装的对象组成而对象是由紧密结合在一起的算 法和数据结构组 成。对象之间是相互请求和相互协作的关系。简叙Vindows 下应用程序的运行方式。答:Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个 窗口同时活动。它的运行机制是“消

32、息传递和事件驱动(message based and eve nt drive n )Windows系统使用事件驱动的编程模式。所谓事件的含义非常广泛。输 入设备的动作,如敲打键盘、按鼠标等会产生一系列的事件(注意不是一 个事件)。操作系统所作的一举一动也被当作某种类型的事件,应用程序也 会产生各种事件。事件用 来标识发生的某件事情。Windows系统对于应用程序环境中发生的每一个事件都会以对应的某 种消息的形式 标 识,并放入相应的Widows建立的消息 队列中,然后由对 应的应用程序或窗口函 数去处理。窗口函数处理是分层的,前面处理不了 的送到后面,最后处理不了剩下的全由缺省的窗口函 数处

33、理。类的成员函数在什么情况下应该定义为私有的这样做的目的是什 么 答:除接口函数和创建本类对象的构造函数和撤消该对象的析构函数外。其 余成员函数应该 定义为私有的这是幵发类时故意对外隐蔽起来的操作而 这些往往是最复杂最关键的部分。类中故意的隐藏也为以后的升级扩展留下了余地,只要接口不变,内部再变,也不必修改原 来的程序,就象MFC(微 软基础类)升级后,由MFC底层类所编的程序完全不必修改,自动升级。 二.编程与综合练习题构造一个日期时间类(Timedate ),数据成员包括年、月、日和时、分、 秒,函数成员 包括设置日期时间和输出时间,其中年、月 请用枚举类 型,并完成测试。(包括用成员函数

34、和用普通函数)解:本题要求仅是定义类的练习,并非实用的提供日期 时间的程序。实用 的日期时间程序见附录二的日期时间函数。#i nclude #i nclude using namespace std;enumYRY2000, Y2001,Y2002, Y2003, Y2004, Y2005;Circumfere nce=2*r*3.;Circle:Circle(Circle & cl)r=; Area二;Circumfere nee二;voidCircle:SetR( double R) r=R;Area=r*r*3.;Circumfere nce=2*r*3.;int mai n()Circ

35、le cl1(2),cl2,cl3=cl1;coutvv圆半径:VV()VVtVV圆周长:()vvtvv圆面积:vv()vve ndl; (4); cout 圆半径:vv()vvtvv圆周长:()vvtvv圆面积:()e ndl;return 0;设计一个学校在册人员类(Person )。数据成员包括:身份证号(IdPerson ), 姓名(Nam)性别(Sex),生日(Birthday )和家庭住址(HomeAddresS。 成员函数包括人员信息的录入 和显示。还包括构造函数与拷贝构造函数。 设计一个合适的初始 值。解:本题为指出构造函数等的调用,加了一些提 示语句。#include #in

36、clude using namespace std;enum Tsexmid,ma n, woma n;class Pers onchar IdPerson19;word00x6dmksiword10x6foword20x72rksi1本概念与基础知识自测题 -填充题数组定义时有三个要素:数组名,数组元素的(1。和数组元素的(2) 。按元 素在数组中的位置进行访问,是通过(3)进行的,称为(4)或(5)访问。为了使数组声明中数组的大小修改更 为方便,总是将 (6)用于声明数组长度。答案:(1)类型(2) 数量(3) 下标运算符(4) 下标(5) 索引(6) 常变量C/C+中的多维数组用的是一个

37、 (1) 的定义,即多维数组的基本定 义是 (2)构成的数组,三维数组的元素是(3) Q答案:(1)嵌套(2) 以数组作为元素3) 二维数组计算机内存是一维编址的,多维数组在内存中的存储(1) , C/C+多维在内存中 的排列是(2)方式,即越(3)的下标变化(4)。 设数组a有m行n列,每个 元素占内存u个字节,则aij 的首地址为(5) +(6) q答案:(1)必须要转化为一维方式,(2) 按行方式(3) 右(4) 越快(5) a数组的首地址(6) (i*n+j)*u对于多维数组口) 的大小是确定的,所谓“不检查数组边界”只是 不检查 (2 的边界,而(3) 的边界是在控制之中的, 所以多

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

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

40、3) 称指针常量(4) 指针(5) 数组元素的数量(6) 元素(7) 整体(8) 对数组的边界不加检测有一个三维数组:intz3d234;给出指向三维数组第i行第j列第k页元素的指针的三种表达方式_(1) ,(2),(3) o再给出这些元素的三种表达方式(4),(5),(6) o 答案:(1) z3dij+k 或&z3dijk(2) *(z3di+j)+k(3) *(*(z3d+i)+j)+k(4) z3dijk 或*(z3dij+k)(5) *(*(z3di+j)+k)(6) *(*(*(z3d+i)+j)+k)简答题物理上,C+是怎样访问数组元素的请对访问方法作简单介绍。答:物理上,C+吾

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

42、样 加为什么 答:被调函数中作为形式参数的一维数组不需要说明长度,即使说明了大小也不起作用,因 为C+只传递数组首地址,而对数组边界不加 检查。需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数 组的信息全部传递到函数中去答:最佳方法是用函数模板,多维数组用模板类型参数传递, 各维的大小作为参数传递。 也 可以用一维 数组加各维的大小都作为参数传递。解释运算符“* ”和“&”的作用,运算符“.”和“- ”的作用。答: 在应用指针变量时,“* ”是间接引用(dereferenee )运算符,作用于一个指 针类型的变 量,访问该指针所指向的内存数据。因结果是内存中可寻址的

43、数据。“&”是取地址运算符,作用于内存中一个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是获得该 数据的地址。运算符“.”和“- ”是成员访问运算符(Member Access Oprator)。在 对象或结构外部去访问公有的数据成员或函数成员时,是在对象名后加“ ”(点操作符),再加成员函数名或 函数名就可以了。但是这些成员必须是公有的成员,只有公 有成员才能在对象的外面对它进行访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在指针变量名后加“- ”(箭头操作符),再加公有成员名就可以了。什么是this指针简述它的作用。答:当我们在对象的外部访问该对象的公有成员时,必须

44、指明是哪一个对象。但是当我们用 对象的成员函数来 访问本对象的成员时,在成员函数中只要给出成员名就可以实现对该对象 成员的访问。但同一个类创建的多个对象共用同一份成员函数的拷贝。既然是同一份拷贝,那么成员函数又怎么知道是取哪一个对象的成员数据呢其实每一个对象有一个隐藏的this指针,它始终指向该对象,并将该指针作为一个参数自动传递给该成员函数。 这就是说,成员操作符总是要使用 的,只不过在对象内是隐式的,即在对象内省略了this指针。指针变量与整型量的加减运算代表什么意义答:指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置的目标。指针与整型量i的加减等于指针值(地址)与

45、i*sizeof(目标类型)积的加减,得出 新的地址。设a为数组名,那么a+是否合法为什么答:非法。因为a是指针常量。指针作为函数的参数时,它传递的是什么实参要用什么而使用引用时实 参要用什么何时只能用指针而不能用引用 答:是地址,是指针所指向的变量或对象的内存首地址,在物理上讲我们 传的是指针的值,与传其它变量是没有差异的,函数获得的是另一个变量的地址,在逻辑上讲我们是把另一个变量的地址传过去了,可以看作传地址。实参要用变量或对象的地址。而使用引用时实参要 用变量或对象本身。 实参为数组时,只能用指针而不能用引用,因为数组的引用不存在。指针作为函数的返回值时, 应该注意什么 答:指针指向的数

46、据的生 命期必须不仅仅在函数域中, 函数消亡后,数据仍然存在。如果返 回的指 针,它所指的变量或对象已消亡,则该返回值无意义,这一点必须十分小心。总之直 接使用指针不管是作为参数还是返回值,都要注意安全性。设有语句char *ps二” It s a book . ”;是否建立了一个字符串,并把” it s a book. ”作为其初值随后又有语句: *ps= It s a car ;这又代表什么是否正确。答:没有建立字符串,只是让 ps指向一个放在代码区中的特殊字符串, 而该字符串所在内 存是不可写的。后一条语句要求把字符串赋给不可写 的字符串空间是错的。二、编程与综合练习题打印杨辉三角形(1

47、0行)。使用二维数组并利用每个系数等于其肩 上两系数之和。解:好的算法无特例,二维数组共用11列,第1列全0,方便计算#include iostreamusingn amespacestd; int mai n()int a1011=0,1,i,j;本概念与基础知识自测题 -填充题模板是为了实现代码的 (1),它把数据类型改为一个(2).称为 程序设计。模板包括(4) 和 (5)。答案:(1)重用(2)设计参数(3)参数化(parameterize)(4)函数模板(function template)(5)类模板(class template)调用函数模板时,可以显式指定模板参数类型,也可以隐

48、式进行,称为(1),这是根据 (2) 来决定的。答案:(1)模板实参推演(template argument deduction)(2) 一组实际类型或(和)值顺序查找可以用于(1)线性表,而对半查找可以用于(2)线性表。答案:(1)无序的(所有)(2)有序的最常见的排序方式有(1) 、(2)和(3)。如果现有一个已排好序的线 性表,在表尾添加了一个元素,采用(4)排序法使它重新成为有序的所需工作量最小。答案:(1)选择(2) 插入(3) 交换(4) 交换(可利用原来的有序性)给出以下指针的说明方式:指向一个4元素整型数组的指针为(1);指向一个返 回整型数,参数为两个整型数的函数的指针(2)

49、;指向一个数组的指针,而该数组元素都是指向一个返回整型指针的无参函数 (3)。答案:(1) int (*p)4(2) int (*p)( int , int )(3) 以指向6元素数组为例:int *(*)() (*p)6简答题需要编写一个对多维数组通用的算法 (即各维的大小未定),怎样才能 把实参多维数组的信息全部传递到函数中去答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也 可以用一维数组加各维的大小都作为参数传递。什么叫函数模板什么叫模板函数什么叫类模板什么叫模板类答:不受数据类型限制的通用型的函数使代码的可重用性大大提高。把数据 类型改为第六章模板与数据

50、结构题2一个设计参数是一个可行的方案。这种程序设计类型称为参数化 -(Parameterize)程序设计。这样的软件模块由模板(Template) 构造。包括函数模板和类模板。函数模板定义如下:template 返回类型 函数名(形式参数表) ;程与综合练习题第六章模板与数据结构题3使用自定义字符串类,编写求数组元素中最大值的函数模板。 解:函数模板有三种应用方式:1类模板的成员函数,在模板类型参数中重载函数和运算符,直接访问私 有数据成员,实 现通用算法。这是标准的面向对象的方法。2. 函数模板处理模板类,以类模版为参数,用模板类型参数中重载的函数 或运算符,实现 通用算法。但调用类模板的接口函数间接访问私

温馨提示

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

评论

0/150

提交评论