欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    c++程序设计实践教程答案及辅导.pdf

    • 资源ID:90594513       资源大小:14.25MB        全文页数:136页
    • 资源格式: PDF        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c++程序设计实践教程答案及辅导.pdf

    第1章引 论一、基本内容机器语言?汇编语言?高级语言?元语言?编译连接?早期绑定?晚期绑定?面向对象的设计步骤?封装?重载?多态?继承?抽象?程序结构与组织?本章对面向对象的有关概念不要求完全掌握?二、学习要点机器语言是一种计算机自身可以识别的语言?机器语言程序是由机器指令和数据形成的二进制文档?机器语言指令通常由操作码和地址码构成?机器语言程序难于理解?编程繁琐?不易维护?汇编语言是一种符号化的能直接将汇编指令翻译为机器指令的程序设计语言?汇编语言和机器语言同为低级语言?汇编语言更易理解和用于编程?但它仍然是一种面向机器的低级程序设计语言?高级语言程序是一种以类似于自然语言形式描述指令及数据的程序设计语言?高级语言程序经编译可生成低级语言程序?高级语言通常指是面向过程的程序设计语言?即描述的是问题求解的过程?算法或方法?问题求解的常用手段是功能分解?面向对象的程序设计语言是一种能对新类型描述其属性和操作的高级语言?同时为新类型的定义提供了重载?封装?多态?继承?组成等描述机制?元语言是一种用来描述其他语言的语言?其特点是描述准确严格?抽象程度高?常用的描述程序设计语言的元语言是BNF语言?编译程序是用来将高级语言翻译为低级语言的程序?反编译程序是用来将低级语言翻译为高级语言的程序?程序设计语言的翻译方式通常有两种?即解释方式和编译方式?C+一般采用编译方式?高级语言程序通常要经过预处理?词法分析?语法分析?代码生成和模块连接等环节?才能被编译成可被计算机执行的程序?绑定(binding)就是将函数的入口地址同函数调用指令的地址码相联系的过程?绑定就是要计算被调用函数的入口地址?并将该地址存放到函数调用指令的地址码部分?绑定分为静态绑定和动态绑定两种形式?通常又叫早期绑定和晚期绑定?静态绑定在程序执行前完成?由编译程序或操作系统的装入程序计算函数的入口地址?动态绑定则在程序执行过程中完成?由应用程序自身计算函数的入口地址?面向对象的技术八十年代初开始出现?SMALLTALK?C+?JAVA?C#等是较为著名的C+程序设计实践 教 程 254面向对象的程序设计语言?C+在20世纪80年代初出现?直到1983年C+的名字才正式确定下来?1986年?Bjarne Stroustrup在美国AT&T的贝尔实验室开发了C+?面向对象的设计要经历系统分析?系统设计?对象设计与对象实现等四个阶段?每个阶段之间的界限不是十分明显?这种早期模型和晚期模型的一致性?使面向对象的技术能更好地支持快速原型法?封装是将对象的“属性”和 方法”包装在一起?并对外部提供不同权限的访问接口的机制?重载是指用同名的操作针对不同的类型完成不同的功能?重载是多态的一种特例?重载又称为编译时多态?多态则特指运行时多态?多态是指同名的操作针对不同的类型表现出不同的行为?继承是指一种类型接受并利用另一种类型的属性和操作的机制?继承可以分为取代继承?包含继承?受限继承和异化继承等多种方式?抽象是指一种从事物实例得到事物的共同属性和操作从而形成事物类型描述的过程?或从若干低级的事物类型不但提炼形成高级或更具普遍意义事物类型描述的过程?C+程序是一种由变量?过程或函数以及类型描述构成的混和结构的程序织?因此?从这个意义上说?C+不是一种纯的面向对象的程序设计语言?三、习题答案1.1 高级语言程序经过哪些阶段才能成为可执行程序?解:高级语言程序通常要经过预处理?词法分析?语法分析?代码生成和模块连接等阶段?才能被编译成可被计算机执行的程序?1.2 什么叫静态连接?什么叫动态连接?它们有什么区别?解:静态连接是由编译程序完成的?编译程序将编译生成的目标语言连接成可执行程序文件的过程?动态连接是由操作系统完成的?在应用程序执的行过程中?操作系统根据被调用的函数名连接内存中的动态连接库函数?若相关动态连接库被移出内存?则重新装入动态连接库并重新连接?静态连接是在程序执行之前完成的?动态连接是在程序的执行过程中完成的?静态连接程序在执行时不需要再次装入程序文件?动态连接程序在执行时一般需要重新装入程序文件?因此?静态连接程序一般来说比动态连接程序执行速度快?静态连接程序需要将程序文件全部装入内存?如果不同的程序包含了同样的函数代码?就会在内存装入这些函数的多个副本?动态连接程序总是共用同一个函数副本?因此?静态连接程序一般要比动态连接程序占用更多的内存?1.3 什么叫静态绑定?什么叫动态绑定?它们有什么区别?解:静态绑定是在程序运行之前进行的?编译程序或操作系统在装入程序后?计算函数的习 题 答 案 255入口地址?并将该地址填写到相应的函数调用处?动态绑定是程序运行之中完成的?应用程序在执行过程中?激活由编译程序生成的?通过静态或动态方式连接的一段代码?计算函数的入口地址并填写到相应的函数调用处?两者的区别在于:静态绑定在程序执行之前完成?由编译程序或操作系统计算函数的入口地址?动态绑定在程序运行之中完成?由应用程序自己计算函数的入口地址?1.4 什么叫封装?提供封装机制有什么好处?解:封装是将对象的“属性”和“方法”包装在一起?并对外部提供不同权限的访问接口的机制?提供封装机制的好处在于:?1?通过封装对象的“属性”和 方法”?为对象定义了系统边界?2?在保持封装接口不变的情况下?可以改变对象的内部结构?而不会影响对象的外部特性?从而为对象进化提供了方便?3?由于封装屏蔽了对象“方法”的细节?从而保证核心算法不被泄露?有助于保护软件开发机构的知识产权?1.5 什么叫包含继承?什么叫受限继承?解:包含继承是一种派生类对象完整继承所有基类“属性”和“操作”?并且增加自己的“属性”和“操作”的继承方法?受限继承是一种派生类对象部分继承基类“属性”和“操作”?并且不增加新的“属性”和“操作”的继承方法?1.6?+语言有何特点?解:?1?C+是?语言的超集?继承了?语言的代码质量高?运行速度快?可移植性好等特点?2?+是一种强类型的语言?这使得开发人员在编译阶段就能发现?+程序的潜在错误?3?+的表达能力由于多继承特性?丰富的运算符及运算符重载机制而远远强于其他面向对象的语言?4?C+通过函数模板和类模板提供了更高级别的抽象能力?从而进一步提高了C+的表达效率?5?C+提供了面向对象的异常处理机制?从而使程序更加易于理解和维护?并为局部对象提供了自动析构等有效手段?从而可避免因局部对象未析够而造成的资源泄露?包括内存泄露?6?C+的名字空间解决了不同机构的软件模块的标示符同名冲突问题?从而为大型软件的开发和软件容错提供了有效手段?7?在对象的内存管理方面?C+提供了自动回收和人工回收两种方式?这是开发高效率的系统软件所必需的?但另一方面却容易出错且难于掌握?8?C+程序是由类?变量和模块混合构成?不象JAVA那样完全由类构成?1.7 应当怎样组织?+的程序?解:一个程序由包含文件?类程序文件?函数程序文件等多种文件构成?根据程序所用的库函数?收集要包含的标准头文件?将其加入到自己定义的包含文件中?自定义的包含文件供所有程序文件使用?该文件包含类型?变量?函数的说明信息而非C+程序设计实践教程256定义信息?类程序文件是指包含了成员函数函数体定义的文件?而不是仅包含成员函数原型的说明信息文件?函数程序文件是指包含了函数头及其函数体定义的文件?而不是仅包含函数原型的说明信息文件?如果变量?函数不为整个程序所共享?则将它们定义为局部变量和函数?习 题 答 案,257 第2章C+的变量、类型及函数一?基本内容声明?定义?左值?右值?变量定义?匿名变量?只读变量?挥发变量?类型解释?枚举类型?引用类型?函数原型?函数重载?编译换名?缺省参数?省略参数?调用开销?函数内联?二?学习要点声明是指对变量?函数和类型的不完整描述?定义是指对变量?函数和类型的完整描述?一个变量?函数和类型标识通常可以声明多次?但只能定义一次?变量声明通常只描述变量的类型和名称?但不分配内存或进行初始化?函数声明只说明函数的函数名?参数类型和返回类型?不说明函数的函数体?类型声明通常只说明类型名不描述类型体?主要指class?struct?union等类类型?例如?类名的前向引用声明?C+的变量定义比C 自由?C 的变量定义必须出现在函数前或语句前等固定位置?而变量定义的初始化很少能用任意表达式?C+的变量定义位置几乎没有限制?变量定义的初始化时可以用任意表达式?任意表达式指左值或右值表达式?左值表达式是指能出现在等号左边的表达式?大部分变量都能出现在等号左边?因而单个变量通常可以做左值表达式?函数调用如果返回值引用类型?则通常也可以出现在等号左边?因此?返回引用类型的函数调用也可作左值表达式?此外?C+的前置+和一运算和赋值运算表达式也是左值表达式?当然?运用运算符重载技术?几乎任何包含对象运算的表达式都可定义为左值表达式?例如?对象加法运算表达式是右值表达式?但可以重载为左值表达式?只是习惯上不能这样做?右值表达式是指能出现在等号右边的表达式?所有的表达式都是右值表达式?包括单个变量?函数调用和由运算符构成的任何表达式?因此?左值表达式也是右值表达式?即出现在等号左边的表达式一定能出现在等号右边?反之?右值表达式不一定是左值表达式?C+的变量定义虽然比C 自由?但在定义自动变量时尤其自动数组变量时?最好按照C的定义方法定义?否则可能付出较大的空间代价?全局变量的初始化通常由开工函数完成?C 程序没有开工函数和收工函数?一个C+程序编译通常由三个部分构成:开工函数?main函数?收工函数?因此?即使main函数函数体为空?开工函数或收工函数也可能运行并产生输出结果?开工函数和收工函数是由编译程序生成的匿名函数?因而是不可访问或调用的?当应用程序开始运行时?首先执行开工C+程序设计实践教程258函数?然后执行main函数?最后执行收工函数?开工函数主要完成全局变量的初始化和全局对象的构造?收工函数主要负责全局对象的析构?在对变量进行初始化时?如果初始化表达式的类型与变量的类型不符?则编译程序通常会产生匿名变量?匿名变量由于没有变量名?其值当然是不可访问的?只读变量用const说明?必须在定义的同时立即初始化?之后不能改变只读变量的值?函数的参数和返回类型也可以是只读的?只读参数的初始化在函数调用时传递值?如果实参的类型和形参类型不同?同样也可能产生匿名变量?在一般情况下?函数的返回类型缺省是只读的?例如int f()就相当于const int f()?需要注意的是?int&g不等价于const int&g()?前者的函数调用是一个左值?即可以出现这样的表达式g(4?而后者的函数调用是一个右值?挥发变量用volatile说明?多用在多任务环境做信号灯?以便进行P-V操作之类的协同处理?挥发变量是指本程序?本进程或本线程没有修改其值但其值在自主变化的变量?出现这样的情况显然是因为另外的程序?进程或线程在操作?在进行类型解释时?必须按照运算符的优先级和结合性解释?即首先解释优先级较高的运算符?在优先级相同时按结合性规定的顺序解释?在定义类型时?用到的运算符包括星号*?括号()?数组下标口以及以后还要介绍的成员指针运算符?显然?函数原型int(char)等价于函数原型intf(char)?枚举类型用enum说明?在编译后通常翻译为整型?因此?枚举类型也是简单类型?在缺省情况下?枚举元素的整型值通常从零开始?下一个元素依次增1?枚举元素不能重复?其整型值也可以设定?且整型值可以重复?例如?enum WEEKDAY Sun,Mon=l,Tue,Wed,Thu,Fri,Sat?引用类型用&说明?在编译后翻译为指针?逻辑上?引用变量并不分配存储单元存储变量的值?每次对引用变量的操作都转化为被引用变量的操作?引用变量在定义时必须立即初始化?左值引用变量必须用左值表达式初始化?右值引用变量可用左值或右值表达式初始化?如果初始化表达式的类型和引用变量不符?则可能先产生类型相符的匿名变量?然后用初始化表达式初始化匿名变量?并用匿名变量初始化引用变量?函数参数和返回类型都可以定义为引用类型?函数调用传递实参初始化引用参数时也可能产生匿名变量?右值引用变量是指const类型的引用变量?例如?const int&x=3?函数原型用于描述函数名?函数参数及其类型以及函数的返回类型?C+不允许出现函数名及参数类型一一对应相同而仅返回类型不同的函数原型?函数名相同而函数原型不同的函数称为重载函数?C+编译程序允许使用overload定义重载函数?但现在的编译程序一般都能自动识别重载函数?不需要使用overload定义重载函数?编译程序在将变量名和函数名编译为低级语习 题 答 案259言标识符时?采用了与C编译程序不同的名称转换策略?因此?如果不采用extern C”int x形式的说明?就无法和C程序连接并访问其变量或函数?根据C+编译程序的换名策略?函数名在转换为低级语言函数名时?是由C+函数名外加参数类型等信息构成的?这种策略巧妙地解决函数重载及重载函数的调用问题?传递不同类型的实参将导致直接调用低级语言相应的函数?函数可以定义缺省参数?即调用时若不传递实参?将使用参数缺省值作为实参?函数也可以定义省略参数?省 略 参 数 用”表示?表示0至任意个任意类型的参数?在stdio.h中?定义了两个典型的省略参数的函数?其中printf的函数原型为:intprintf(constchar*,)?表示printf可以打印任意个数的值?在调用一个函数?通常要通过压栈来传递参数的值?调用完毕要清除栈顶的内容以保持栈指针在调用前后是相同的?因此?除非调用嵌套的层次无比深?或者出现了无穷递归调用?否则?用高级语言编写的程序是不会轻易出现栈溢出的?其实?用汇编语言编写程序?也可采用这种保持调用前后栈平衡的策略?调用时的压栈出栈不是函数体所定义的有效计算?这些有效计算之外的额外指令称为调用开销?当函数体很小时?调用开销就显得非常之大?函数内联可以消除调用开销?提高程序的执行效率?通过直接将函数体所定义的计算指令插入到函数调用处?函数内联避免了函数调用从而消除了调用开销?由此可见?当函数体较长时?内联将会大大增加程序的长度?反而不会有什么好处?函数内联用inline说明?但并是加上inline就能内联成功?内联成功的前提是:(1)内联函数的定义必须出现在函数定义之前?2?函数体不能出现if?switch?for?while?do?:和函数调用等分枝转移类型的语句?(3)不能出现取内联函数地址之类的指令?内联使函数的作用域局限于当前程序文件?因此全局的即非static的main函数是不能内联的?另一方面?操作系统必须通过函数调用调用main函数?三?习题答案2.1 若给出声明:char c,*pqconst char cc=a;const char*pcc;char*const cpc=&c;const char*const cpcc=&cc;char*const*ppc;则下面的赋值哪些是合法的?哪些是非法的?为什么?(1)U C C;(1 0)*PG=ABCD2;C+程序设计实践教程260(2)(c=c;(11)(c=a;(3)pcc=&c;(12)*cpc=*pc;(4)pcc=&cc;(13)pc=*pcpc;(5)pc=&c;(14)*pcpc=*pc;(6)pc=&cc,(15)*pc=*pcpc;(7)pc=pcc;(16)*pcc=rb*;(8)pc=cpcc;(17)*pcpc=c,;(9)cpc=pc;(18)*cpcc=,d;解:(1)合法?c不是const类型的变量?可以赋值?(2)非法?cc是const类型的变量?不能赋值?(3)合法?pcc不是const类型的指针变量?可以指向非const类型的字符变量?(4)合法?pcc不是const类型的变量?赋值后指向的cc的类型为const char?同其要求指向的类型一致?(5)合法?pc不是const类型的指针变量?赋值后指向的c的类型为char?同其要求指向的类型一致?(6)非法?pc要求指向char类型的变量?不能用const char*类型的&c赋值?(7)非法?pc要求指向char类型的变量?不能用指向const char*类型的pcc赋值?(8)非法?pc要求指向char类型的变量?不能用指向const char*类型的cpcc赋值?(9)非法?cpc是const类型的变量?不能赋值?(10)合法?pc指向的是非const类型的变量?可以赋值?等价于*pcC?(11)非法?cc是const类型的变量?不能赋值?(12)合法?cpc指向的是非const类型的变量?可以赋值?(13)合法?pc是非const类型的指针变量?可以用char*类型的值*pcpc赋值?(14)合法?*pcpc代表的是非const类型的字符变量?可以任何字符类型的值赋值?(15)合法?*pc代表的是非const类型的字符变量?可以任何字符类型的值赋值?(16)非法?*pcc代表的字符是const类型的字符变量?不能赋值?(17)非法?*pcpc代表的是const类型的指针变量?不能赋值?(18)非法?*cpcc代表的是const类型的只读变量?不能赋值?2.2 头文件string.h定义了函数原型char*strcat(char*dest,const char*src)?定义函数strcat的函数体?使其将src指示的字符串添加到dest指示的字符串的后面?并将调用时dest的值作为函数的返回值?解:注意strcat的返回值和传入第一个参数的值相同?char*strcat(char*dest,const char*src)char*temp=dest;习 题 答 案-261 while(*lemp)temp+;whi le(*(temp+)=*(src+);return dest;)2.3 C按优先级和结合性解释类型?下述声明是什么意思?(1)typedef void VF_PC_RI(char*,int&)(2)ypedef VF_PC_RI*P_VF_PC_RI;(3)typedef int&RIFFII(int,int);(4)extern VF_PC_RI funca;(5)ectern P_VF_PC_RI ptra;(6)extern void fund(P_VF_PC_RI*);(7)ectern P_VF_PC_RI func2(int c);(8)P VF_PC_RI func3 p_VF_PC_RI a);(9)typedef void(*(*VF_PA_P_PF_V(void)(const int);解:(1)定义一个名为VF_PC_RI的类型?该类型定义了一个参数为(char*,int&)没有返回值的函数?(2)定义一个名为P_VF_PC_RI的类型?该类型定义了一个指向VF_PC_RI类型的指针?(3)定义一个名为RIFFU的类型,该类型定义了一个参数为(int,int)返回一个引用的函数?该引用引用一个整型量?(4)说明一个类型为VF_PC_RI的函数funca?(5)说明一个类型为P_VF_PC_RI的指针变量ptra?(6)说明一个没有返回值的函数funcl?该函数的参数是一个指向P_VF_PC_RI类型的指针?(7)说明一个参数为int类型的函数func2?该函数的返回值是一个P_VF_PC_RI类型的指针?(8)说明一个参数为P_VF_PC_RI类型的函数func3?该函数的返回值是一个P_ VF_PC_RI类型的指针?(9)定义一个名为VF_PA_P_PF_V的类型?该类型定义了一个没有参数的函数?该函数返回一个指针?该指针又指向另一个指针?被指向的指针指向一个数组?数组的每个元素存放一个函数指针?该函数指针指向一个参数为const int类型没有返回值的函数?2.4 运行如下程序?打印结果ri和gi相等吗?为什么?删除printf语句中的8?结果有什么变化?再删除printf语句中的7?结果又有什么变化?#include int&f()int i=10;int&j=i;return j;C+程序设计实践教程262int g()int j=20;return j;void main(void)int&ri=f();int rj=g()printf(,ri=%d trj=%d nH,ri,rj,1,2,3,4,5,6,7,8);int&gi=f();int gj=g();printf(Mgi=%d tgj=%d nn,gi,gj);)解:(1)打印结果ri和gi不等?(2)这是因为主调函数main的变量引用了被调函数f()的局部自动变量i?该变量的内存是位于栈上的某个固定位置?该位置的值会被其他函数调用传递参数改变?例如被调用ij=g()和调用printf(”ri=%d trj=%d n”,ri,rj,1,2,3,4,5,6,7,8)改变?因为值参传递也是通过栈完成的?(3)删除printf语句中的8?ri的输出结果由原来的6变为5?(4)再删除printf语句中的7?ri的输出结果由原来的5变为4?即ri的值总是打印其值的printf函数调用的倒数第三个参数?2.5 如下声明和定义是否会导致编译错误?float g(int);int g(int);int g(int,int y=3);int g(int,1);int i=g(8);解:(1)不能定义返回类型仅和float g(int)不同的函数int g(int)?(2)g(8)在调用时出现二义性?无法确定是调用int g(inl,int y=3)还是int g(int,L)?2.6 定义函数求1个以上的整数中的最大值int max(int c,.)?整数个数由参数c指定?解:由于参数个数没有固定?因此要应用省略参数?int max(int q.)int m,k,*p=&c+l;m=p0;for(k=l;kc;k+)if(mdelete和使用mallocofree没有区别?甚至两种可以混杂着使用?简单类型也可以被看作简单的类?至此?面向对象的思想在所有类型上得到统一?例如?int类型可以用用构造函数的形式初始化?可以以此类形式int x(3)定义并初始化变量x=3?同理?对于复杂的类?当其构造函数除this外只有一个参数时?可采用简单类型的初始化形式初始化?类的存储空间既同编译程序有关?也同计算机的字长有关?在不同的系统环境下编译时?相同的类所占用的内存大小可能不同?即使在相同的系统环境下编译?若编译程序采用的对齐方式不同?则同样的类所占用的内存大小也可能不一样?编译程序采用的对齐方式有两种:紧凑方式和松散方式?如果采用紧凑方式编译?则数据成员之间不会留下任何空闲字节?这种方式编译的程序所占用的内存较少?但访问数据成员时需要的时间较长?如果采用松散方式编译?则程序执行时需要的空间较多?而程序的执行时间较短?在松散方式下?编译程序根据数据成员的类型进行对齐?如果数据成员的类型为字符等单字节类型?则数据成员可以存放在开始地址能被1整除的内存单元?如果数据成员的类型为整型等双字节类型?则数据成员可以存放在开始地址能被2整除的内存单元?如果数C+程序设计实践教程266据成员的类型为长整型等四字节类型?则数据成员可以存放在开始地址能被4整除的内存单元?以此类推?三.习题答案3.1 集合类的头文件Set.h如下?请定义其中的函数成员?class SETint*set;set用于存放集合元素int card;/card为能够存放的元素个数int used;/used为已经存放的元素个数public:SET(int card);/card为能够存放的元素个数SET()?int size()返回集合已经存放的元素个数int insert(int v);插入v成功时返回1?否则返回0int remove(int v);删除v成功时返回1?否则返回0int has(int v);元素v存在时返回1?否则返回0?解:省略类型说明后?程序如下:在此引用上述类型说明SET:SET(int card)if(set=new intcard)SET:card=card;used=O;)SET:SET()if(set)delete set;set=O;card=used=O;int SET:size()return used;)int SET:insert(int v)if(used0)习 题 答 案267for(x=0;xused;x+)if(setx=v)used;for(;xused;x+)setx=setx+l;return 1;)return 0;return 0;)int SET:has(int v)int x;for(x=0;xused;x+)if(setx=v)return 1;return 0;)3.2 二叉树类的头文件node.h如下?请定义其中的函数成员?class NODEchar*data;NODE*left,*nght;public:NODE(char*);NODE(char*data?NODE*left,NODE*right);NODE(););解:以下程序构造函数申请了内存?必须在析购函数释放?#include 在此引用上述类型说明NODE:NODE(char*)if(NODE:data=new charstrlen(data)+1 )strcpy(NODE:data,data);left=right=O;)NODE:NODE(char*data,NODE*left,NODE*right)if(NODE:data=new charstrlen(data)+1)strcpy(NODE:data,data);NODE:left=left;NODE:right=right;C+程序设计实践教程268)NODE:NODE()if(left)left-NODE();if(right)right-NODE();if(data)delete data;data=O;)3.3 队列(queue)就是一种先进先出表?队列通常有插入?删除?测空和清除四种操作?“插入唧将一个元素插到队列尾部?“删除”就是从队列首部取走一个元素?“测空”就是要检查队列是否为空?当队列为空时返回1?否则返回0?“清除”就是将队列清空?用链表定义一个字符队列?并定义完成上述操作的公有成员函数?解:以下程序没有使用循环对列?其出入队列操作次数有限?class QUEUE char*queue;int size,front,rear;public:int insert(char elem);int remove(char&elem);QUEUE(int size);-QUEUE(void););QUEUE:QUEUE(int sz)(queue=new charsize=sz;front=0rear=0;)QUEUE:QUEUE(void)(if(queue)delete queue;queue=0;front=0;rear=0;)int QUEUE:insert(char elem)习 题 答 案269if(rear=size)return 0;queue rear+=e le m;return 1;)int QUEUE:remove(char&elem)(if(front=rear)return 0;elem=q ue ue fro nt=fro nt+1;return 1;)void main(void)QUEUE queue(20);3.4 改用数组定义习题3.3中的字符队列?并将该队列定义为循环队列?使队列的“插入”?“删除”操作能并发进行?其他公有函数成员的原型不变?解:注意?函数成员insert和remove的尾部带有*volatile?表示函数的隐含参数this的类型为volatile*const this?即this指向的当前对象是挥发易变的?挥发性通常可以用来修饰并行操作的对象?即当前队列是可以同时进行插入和删除操作的?构造函数和析构函数不能用volatile?因为构造和析构时对象必须是稳定的?以下程序使用字符数组作为循环队列?class QUEUE char*queue;int size,front,rear;public:int insert(char elem)volatile;int remove(char&elem)volatile;QUEUE(int size);-QUE UE(void););QUEUE:QUEUE(int sz)(queue=new charsize=sz;front=rear=0;)QUEUE:QUEUE(void)(if(queue)delete queue;queue=0;C+程序设计实践教程270front=0;rear=O;)int QUEUE:insert(char elem)volatile(if(rear+1 )%size=front)Eturn 0;queuerear=(rear+l)%size=elem;return 1;)int QUEUE:remove(char&elem)volatile(if(rear=front)Eturn 0;eleni=queuefront=(front+l)%size;return 1;)void main(void)(QUEUE queue(20);)3.5 利用C的文件类型FILE?定义新的文件类DOCU?DOCU用构造函数打开文件?用析构函数关闭文件?并提供同fread?fwrite?ftell?fseek类似的函数成员read?write?tell?seek?类DOCU的声明如下?请定义其中的函数成员?class DOCUchar*name;FILE*file;public:int read(void*ptr,int size,int n);int seek(long offset,int whence);int write(const void*ptr,int size,int n);long tell();DOCU(const char filename,const char*mode);DOCU(););解:构造函数申请了内存及文件句柄资源?必须在析构函数释放?注意?文件句柄不能反复释放?#include#include 习 题 答 案-271 在此引用上述类型说明DOCU:DOCU(const char filename,const char*mode)name=new charstrlen(filename)+l;strcpy(name,filename);file=fopen(name,mode);)int DOCU:read(void*ptr,int size,int n)return fread(ptr,size,n,file););int DOCU:write(const void*ptr,int size,int n)return fwrite(ptr,size,n,file);)int DOCU:seek(long offset,int whence)return fseek(file,offset,whence);)long DOCU:tell()return ftell(file);)3.6 线性表通常提供元素查找?插入和删除等功能?以下线性表是一个整型线性表?表元素存放在动态申请的内存中?请编程定义整型线性表的函数成员?class INTLISTint*list;/动态申请的内存的指针int size;线性表能够存放的元素个数int used;线性表已经存放的元素个数public:INTLIST(int s);/s为线性表能够存放的元素个数int insert(int v);插入元素v成功时返回1?否则返回0int Emove(int v);删除元素v成功时返回1?否则返回0int fnd(int v);查找元素v成功时返回1?否则返回0int gd(int k);取表的第k个元素的值作为返回值-INTLIST(void););解:构造函数申请了内存资源?必须在析构函数释放?在此引用上述类型说明lNTLIST:INTLIST(int s)if(list=new ints)C+程序设计实践教程272size=s;used=O;)INTLIST:-INTLIST(void)if(list)delete list;list=O;size=used=O;int INTLIST:insert(int v)if(usedsize)listused+=v;return 1;)return 0;)int INTLIST:remove(int v)for(int i=0;iused;i+)if(listi=v)used;for(;iused;i+)listi=listi+l;return 1;)return 0;)int INTLIST:find(int v)for(int i=0;iused;i+)if(listi=v)return 1;return 0;习 题 答 案273第4章 作用域及成员指针一.基本内容单目运算符?双目运算符?作用域运算符?词法单位?作用域?面向过程的作用域?面向对象的作用域?名字空间?成员指针?mutable?二.学习要点C+的大部分运算符为单目运算符和双目运算符?单目运算符是指只有一个操作数的运算符?同理?双目运算符是指有两个操作数的运算符?作用域运算符:既是单目运算符?又是双目运算符?作用域运算符的优先级为最高级即第十六级?其结合性是按照自左向右的顺序结合?单目:用于限定全局的类型名?变量名以及常量名等?双目:用于限定类的枚举元素?数据成员?成员函数以及类型成员等?此外?双目运算符:还用于限定名字空间成员?以及恢复自基类继承的成员的访问权限?在类的体外定义数据和成员函数时?必须用双目:限定类的数据和成员函数?一个词法单位是指编译程序能够识别的一个单词?一个标识符?一个运算符?一个分隔符或一个常量均是一个词法单位?一个标识符通常又可分为常量标识符?变量标识符?函数标识符和类型标识符?一个词法单位的作用域是指该词法单位能够被访问的范围?访问是指取值?赋值?调用?取地址等操作?根据作用域是否同类相关?C+的作用域可以分为两类;面向过程的作用域和面向对象的作用域?面向过程的作用域即C传统的作用域?词法单位的作用范围从小到大可以分为四级:作用于表达式内?作用于函数内?作用于程序文件内?作用于整个程序?具有第3 种和第4 种作用域的标识符可用单目:限定?在面向对象的作用域内?词法单位的作用范围从小到大可以分为五级:作用于表达式内?作用于成员函数内?作用于类或派生类内?作用于基类内?作用于虚基类内?常量对象的作用域属于第1 级?即常量对象在表达式内构造和析构?标识符和匿名变量的作用域属于第2 级到第5 级?标识符的作用域越小?访问的优先级别就越高?在成员函数内?当函数参数?局部变量同类的数据成员名称相同时?优先访问的是成员函数的函数参数和局部变量?如果此时希望访问同名的数据成员?就必须用类名和作用域运算符加以限定?单目运算符:可以限定存储类为static和extern的全局变量?函数?类型以及枚举元素C+程序设计实践 教 程274等?当成员函数调用同其同名的全局函数时?必须用单目:限定同名函数为全局函数?名字空间是C+引入的一种新的作用域?用于减少软件项目中的命名冲突?同一名字空间中的标识符名必须唯一?不同名字空间中的标识符名可以相同?当一个程序引用多个名字空间而出现成员同名时?可以用名字空间加作用域运算符限定被引用的成员?保留字namespace用于定义名字空间?名字空间必须在程序的全局作用域内定义?不能在函数及成员函数内定义?名字空间可以嵌套定义?最外层名字空间的名称必须在程序的全局作用域唯一?名字空间也可分多次定义?即可先在初始定义中定义一部分成员?然后在扩展定义中再定义另一部分成员?或者定义初始定义中声明的函数原型?初始定义和扩展定义的语

    注意事项

    本文(c++程序设计实践教程答案及辅导.pdf)为本站会员(奔***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开