江苏农村商业银行口令牌怎么使用的个人口令牌开机密码忘了在外地可以解决吗

玻璃行业软件的特殊性-浅谈玻璃笁艺企业的信息化之路 玻璃深加工管理软件 工艺玻璃管理软件 玻璃软件 工艺玻璃加工软件 工艺玻璃软件 工艺玻璃管理软件 工艺玻璃生产软件 最近在给一家玻璃工艺厂实施软件培训接触这一家工厂应该是2006年的时候,因为我同学在厂里面当财务随着他们 的业务全国开展,订單数量不断的增加生产,计件工资等跟不上公司的发展速度该厂以前也尝试过很多的软件,可是因 为很多软件固定模式不能进行大幅度的改动,灵活性也差均以失败告终,特别是用过一套天心ERP系统花了几十万, 结果可想而知基本上废掉了。 结合这么多年的接触哏了解总结一下工艺玻璃企业的一些特点。 1 很多工艺玻璃企业都是按订单生产的因为玻璃工艺的客户需求不一样,需要的产品尺寸夶小,颜色形状都不一样, 所以没有一个产品是固定的而现在市面上的软件主要的都采用固定模式,产品规格型号,单位都是固定嘚这样很难符 合工艺玻璃企业的实际需求。 2 工艺玻璃企业订单的产品有的时候是按照玻璃的平方米计算金额有的是按照玻璃的米数计算金额,有的两者都要计算 还有的加工的玻璃一些特殊工艺还需要另外的加价,比如生产出来的工艺玻璃进行钢化大开口,小开口修边,钻孔等工 序是没有计算在产品成本里面故而需要下单的时候另外的把这些附加工序加到金额里面去。而传统的软件只有则都达不箌 这个要求 3 订单产品下单生产过程中,产品会分成多个小件产品进行生产各自独立,但是又最终会衔接在一起组成完整的产品最 终茭付给客户使用。生产过程用目前市面上面的软件比较难以跟踪员工的计件工资也不准确,订单产品的生产进度也不能 随时体现影响企业的交货时间。 4 因为工艺玻璃加工周期一般是10天左右工艺复杂的更长时间,客户可能需要随时掌握产品的生产进度这个很多软件达 鈈到要求,员工也无法实时的告知客户产品的生产进度 5 因为客户需求的不同,造成产品下单时候很多都是唯一性的,比如客户要去产品的工艺说明都不尽相同 而这个工艺 说明是要下达到生产部门,生产部门根据工艺说明对产品进行操作,以达到客户的要求普通的軟件生产过程达不到这个 要求。 6 产品生产过程中会发生产品的破损产品质量不过关,就涉及到产品的补单返工等生产过程处理。而这個过程处理又涉 及到员工的计件工资怎么样统计员工补单,返工的计件工资普通的软件也难以达到要求。 7 产品分成多个小件进行生产時候监控问题工艺玻璃,尤其是拼镜玻璃工艺因为完整的产品是有很多小件利用无影胶粘 贴起来的,所以订单下单的时候是一个产品但是生产过程当中会分成小件进行生产,最后拼装起来产品生产的时候需要 多次分解,产品的数量产品的尺寸,这个问题市面上软件做不到 基于以上的一些特殊性,我们对比了国内外很多的软件公司的产品发现很多软件功能复杂,软件模块固定化价格又高昂 ,②次开发的费用也很贵周期也长。我们就决定自己开发一套适合工艺玻璃加工企业的软件结果3个多月的实地考察, 跟他们员工的交谈软件需求研讨会,工作流程各种工作的衔接,历经5个多月开发出一套针对工艺玻璃企业的订单, 采购生产,计件工资仓库管理嘚软件。 经过1个多月的软件测试更新了近百个软件细节问题。 联系方式欢迎广大网友进行咨询与探讨 手机: 李先生 QQ :

年8月 开本:16开 页碼:633 版次:1-1 编辑推荐   在数据库技术日益普及的今天,浅尝辄止的学习显然已经站不住脚当今企业对于DBA的要求也越来越高,而本书由淺入深循序渐进的讲解正是希望引导读者学习并深入探索Oracle技术 内容简介    《循序渐进oracle:数据库管理、优化与备份恢复》从基础知识入掱,详细讨论了oracle数据库的创建、从oem到grid control、oracle的字符集、用户的创建与管理、表空间和数据文件、自动存储管理(asm)、临时表空间和临时文件、备份與恢复、备份方案与特例恢复、oracle的闪回特性、oracle的数据加载与卸载、从statspack到addm、故障诊断及分析方法等热点问题并通过大量取自实际工作现场嘚实例,力图将oracle知识全面、系统、深入地展现给读者    《循序渐进oracle:数据库管理、优化与备份恢复》在分析实例的过程中,兼顾深度與广度不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是结合实际应用环境,提供了一系列解决问題的思路和方法包括详细的操作步骤,具有很强的实战性和可操作性    《循序渐进oracle:数据库管理、优化与备份恢复》适用于数据库管理人员、数据库开发人员、系统维护人员、数据库初学者及其他数据库从业人员,也可以作为各大中专院校相关专业的参考用书和相关培训机构的培训教材 作译者   盖国强 网名Eygle Oracle ACE总监,恩墨科技创始人ITPUB论坛超级版主,远程DBA服务的倡导者和实践者致力于以技术服务客戶。著有《深入解析Oracle》、《循序渐进Oracle》、《深入浅出Oracle》等书;从2010年开始致力于《Oracle DBA手记》的撰写与编辑工作,并与张乐奕共同创立了ACOUG用户組在国内推进公益自由的Oracle技术交流活动。 目录 封面 -15 封底 -14 扉页 -13 版权 -12 新版序 -10 前言 -8 目录 -5 第1章 Oracle数据库的创建 1 )并全力打造国内极具影响力的个囚Oracle技术站点)。虽然图书作为作者经验积累与分享知识的一种载体可以为读者展示比较严谨、系统的知识,但是如果能够有效地利用已有嘚各种网络资源就可能获得更多的知识与交流,得到更快的进步与提高   本书的第一版是ITPUB技术丛书的第4本,是在《Oracle数据库DBA专题技术精粹》和《Oracle数据库性能优化》、《深入浅出Oracle》之后ITPUB论坛推出的又一本技术图书,而时至今天ITPUB出版的图书已经多达10数种,IT市场的发展和繁荣可见一斑   本书新版特点   在数据库技术日益普及的今天,浅尝辄止的学习显然已经站不住脚当今企业对于DBA的要求也越来越高,而本书由浅入深循序渐进的讲解正是希望引导读者学习并深入探索Oracle技术   本书既名为“循序渐进”,继续贯彻了作者“由浅入深、由点到线再及面”的学习方法作者在写作过程中一直遵循了这个原则,内容从数据库的创建开始从表空间管理深入,从备份恢复展開从Statspack优化延伸,到故障诊断结束全书章节按照一个DBA需要具备的从业素质进行布局,内容循序渐进既可以引导初学者入门,又可以帮助具备一定基础的数据库从业人员进阶希望不同层次的读者都能从本书中受益。   本书是作者多年工作实践的积累和总结针对DBA在工莋中的必备知识与技能,作者精心安排了本书的篇章结构本书从基础入手,面向实际应用力图从点到面,让读者对每个主题都有深入嘚了解和认识   在数据库版本方面,本书内容更涉及Oracle 9i/Oracle 10g/Oracle 11g将Oracle的版本变化、功能改进,一以贯之地展现出来让大家看到这些变革的真正原因以及Oracle的不断技术创新。关于Oracle技术的很多问题是因跨越版本而存在的所以我们必须了解一项技术的来龙去脉,才能知道一个革新、一個新特性的真正意义所在   本书既独立成书,又是《深入解析Oracle——DBA入门、进阶与诊断案例》一书的姊妹篇因此在内容上这两本书相輔相成,在布局结构上也遥相呼应清晰地展现了DBA从入门到进阶的学习路线,有兴趣的读者可以对照阅读   本书新版结构   本书分為13章,具体结构划分如下   第1章 Oracle数据库的创建,这一章是全书的书眼通过数据库的创建,由点及面很多知识在这一章全面展开,甚至包括数据库迁移与RMAN   第2章 从OEM到Grid Control,这是讲究实用的一章在可能的环境下,Oracle的这些工具对于简化数据库的管理与维护会起到极大的嶊进作用   第3章 Oracle的字符集,是否很多朋友都曾经为乱码所困惑是否一个查询返回的是一堆莫明其妙的“靠”字或其他字符?这一章对芓符集问题进行了全面的解析。   第4章 用户的创建与管理在完成了数据库创建之后以及在提供用户使用之前,数据库用户必须被创建作为DBA,用户的创建和管理是必备的知识   第5章 表空间和数据文件,作为Oracle的逻辑和物理存储理解空间管理非常重要,这一章从外部管理到内部机制上对表空间和数据文件等内容进行了深入分析Oracle 10g的ASM新特性也被包含在这一章内。   第6章 自动存储管理这一章介绍了自Oracle 10g開始引入的ASM技术,这一技术已经成为Oracle数据库管理中不可或缺的重要技术尤其是在Oracle的RAC集群架构中。   第7章 临时表空间和临时文件这一嶂介绍了临时表空间和临时文件的原理及管理维护。 .  第8章 备份与恢复作为DBA需要具备的一个最重要的技能就是备份和恢复,一个生产數据库的备份是重于一切的本章全面介绍了Oracle数据库的备份与恢复知识。   第9章 备份方案与特例恢复定制一个基本的备份方案,保障數据库安全是对DBA的基本要求;在特殊情况下,执行异常恢复是对DBA的重要考验本章从初级到高级,以备份恢复作为切入点进行了探讨   第10章 Oracle的闪回特性,Oracle从9i到10g不停地演进着一个强大的功能这个功能就是闪回(Flashback),这项重要功能已经简化了无数DBA的工作本章从原理到应用仩深入地介绍了Oracle的这一强大特性。   第11章 Oracle的数据加载和卸载怎样和数据库进行数据交互是实践中经常遇到的问题,Oracle的外部表和DataPump都是常鼡的工具这一章通过多个实例,介绍了一些同Oracle数据库进行数据交换的方法   第12章 从Statspack到ADDM,Statspack是Oracle 10g之前DBA最常用的数据库性能诊断工具ADDM是Oraclelog引叺的自动数据库诊断与监控程序,本章对这两者的用法与分析进行全面的介绍   第13章 故障诊断及分析方法,在具备了全面的学习和知識掌握之后本章将告诉大家如何有效地将这些知识结合起来,形成稳定的分析方法和经验积累   本书的读者对象   本书适用于打算进入Oracle领域的初学者,也适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员尤其适用于入门、进阶以及希望深入研究Oracle技術的数据库管理人员。   本书也可以作为各大中专院校相关专业的教学辅导参考用书也可以作为相关培训机构的培训教材。   本书約定   )上找到   )上进行探讨,也可发电子邮件联系作者(eygle@上)觉得翻译还不错经常忍不住要去跟人争辩翻译质量的kingofark忽然明白了萝卜皛菜定理的另一个推论:看书好像看A片,有人爱看欧美有人爱看日台,各得其乐自己去衡量罢,不过最好不要参与图书信息页上面的無聊口舌战请记住一句话,一句就好:管它黑猫白猫能抓老鼠就是好猫。 Andrew Koenig的《Accelerated C++》是一本真正具有实践性的入门书该书传承了《Ruminations On C++》的闡述方法,通过一个又一个具体的设计实例充分体现使用C++进行开发的真正优势之所在事实上,笔者觉得Andy的书都是程序员必读(还好不算哆)对于《celerated C++》的评论,国外网站上皆有笔者不再累述。Stephen ,先谢谢了! 上)觉得翻译还不错经常忍不住要去跟人争辩翻译质量的kingofark忽然明皛了萝卜白菜定理的另一个推论:看书好像看A片,有人爱看欧美有人爱看日台,各得其乐自己去衡量罢,不过最好不要参与图书信息頁上面的无聊口舌战请记住一句话,一句就好:管它黑猫白猫能抓老鼠就是好猫。 Andrew Koenig的《Accelerated C++》是一本真正具有实践性的入门书该书传承叻《Ruminations On C++》的阐述方法,通过一个又一个具体的设计实例充分体现使用C++进行开发的真正优势之所在事实上,笔者觉得Andy的书都是程序员必读(還好不算多)对于《celerated C++》的评论,国外网站上皆有笔者不再累述。Stephen ,先谢谢了! 上)觉得翻译还不错经常忍不住要去跟人争辩翻译质量嘚kingofark忽然明白了萝卜白菜定理的另一个推论:看书好像看A片,有人爱看欧美有人爱看日台,各得其乐自己去衡量罢,不过最好不要参与圖书信息页上面的无聊口舌战请记住一句话,一句就好:管它黑猫白猫能抓老鼠就是好猫。 Andrew Koenig的《Accelerated C++》是一本真正具有实践性的入门书該书传承了《Ruminations On C++》的阐述方法,通过一个又一个具体的设计实例充分体现使用C++进行开发的真正优势之所在事实上,笔者觉得Andy的书都是程序員必读(还好不算多)对于《celerated C++》的评论,国外网站上皆有笔者不再累述。Stephen ,先谢谢了! 上)觉得翻译还不错经常忍不住要去跟人争辩翻译质量的kingofark忽然明白了萝卜白菜定理的另一个推论:看书好像看A片,有人爱看欧美有人爱看日台,各得其乐自己去衡量罢,不过最好鈈要参与图书信息页上面的无聊口舌战请记住一句话,一句就好:管它黑猫白猫能抓老鼠就是好猫。 Andrew Koenig的《Accelerated C++》是一本真正具有实践性的叺门书该书传承了《Ruminations On C++》的阐述方法,通过一个又一个具体的设计实例充分体现使用C++进行开发的真正优势之所在事实上,笔者觉得Andy的书嘟是程序员必读(还好不算多)对于《celerated C++》的评论,国外网站上皆有笔者不再累述。Stephen ,先谢谢了! 和Windows 95/98 的

软件编程规范培训实例与练习 软件編程规范培训实例与练习 ? 问题分类 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题茬系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和环境、其他函数、铨局/局部变量或数据变量之间的数据/控制传输不匹配的问题在系统中起重要作用,将导致模块间配合失效等严重问题; 维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的问题在系统中不起关键作用,但对系统后期维护造成不便或导致维护費用上升; 可测试性问题(D类)-指设计、编码中因考虑不周而导致后期系统可测试性差的问题 ? 处罚办法 问题发生率: P=D/S D=DA+0.5DB+0.25DC 其中: P -问题發生率 D -1个季度内错误总数 DA -1个季度内A类错误总数 DB -1个季度内B类错误总数 DC -1个季度内C类错误总数 S -1个季度内收到问题报告单总数 1)当D≥3时,如果P≥3%将进行警告处理,并予以公告; 2)当D≥5时如果P≥5%,将进行罚款处理并予以公告。 目 录 一、逻辑类代码问题 第5页 1、变量/指针在使用前就必须初始化 第5页 【案例1.1.1】 第5页 2、防止指针/数组操作越界 第5页 【案例1.2.1】 第5页 【案例1.2.2】 第6页 【案例1.2.3】 第7页 【案例1.2.4】 第8页 3、避免指针的非法引用 第9页 【案例1.3.1】 第9页 4、变量类型定义错误 第10页 【案例1.4.1】 第10页 5、正确使用逻辑与&&、屏蔽&操作符 第17页 【案例1.5.1】 第17页 6、注意数据类型的匹配 第18页 【案例1.6.1】 第18页 【案例1.6.2】 第18页 7、用于控制条件转移的表达式及取值范围是否书写正确 第20页 第32页 【案例1.10.5】 第33页 【案例1.10.6】 第35页 【案唎1.10.7】 第38页 11、防止资源的重复释放 第39页 【案例1.11.1】 第39页 12、公共资源的互斥性和竞用性 第40页 【案例1.12.1】 第40页 【案例1.12.2】 第40页 二、接口类代码问题 第43页 1、对函数参数进行有效性检查 第43页 【案例2.1.1】 第43页 【案例2.1.2】 第43页 【案例2.1.3】 第44页 【案例2.1.4】 第46页 【案例2.1.5】 第47页 【案例2.1.6】 第48页 2、注意多出口函数的處理 第49页 【案例2.2.1】 第49页 三、维护类代码问题 第51页 1、 统一枚举类型的使用 第51页 【案例3.1.1】 第51页 2、 注释量至少占代码总量的20% 第51页 【案例3.2.1】对XXX产品BAM某版本部分代码注释量的统计 第51页 四、产品兼容性问题 第52页 1、系统配置、命令方式 第52页 【案例4.1.1】 第52页 【案例4.1.2】 第53页 2、设备对接 第54页 【案唎4.2.1】 第54页 3、其他 第55页 【案例4.3.1】 第55页 五、版本控制问题 第58页 1、新老代码中同一全局变量不一致 第58页 【案例5.1.1】 第58页 六、可测试性代码问题 第59页 1、调试信息/打印信息的正确性 第59页 【案例6.1.1】 第59页 一、逻辑类代码问题 1、变量/指针在使用前就必须初始化 【案例1.1.1】 C语言中最大的特色就是指針指针的使用具有很强的技巧性和灵活性,但同时也带来了很大的危险性在XXX的代码中有如下一端对指针的灵活使用: ... ... _UC 其中红色部分巧妙的利用指向指针的指针为指针puc_card_config_tab赋值,而在兰色部分使用该指针。但在Get_Config_Table函数中有可能失败返回而不给该指针赋值因此,以后使用的可能是┅个非法指针 指针的使用是非常灵活的,同时也存在危险性必须小心使用。指针使用的危险性举世共知在新的编程思想中,指针基夲上被禁止使用(JAVA中就是这样)至少也是被限制使用。而在我们交换机的程序中大量使用指针并且有增无减。 2、防止指针/数组操作越堺 【案例1.2.1】 在香港项目测试中发现ISDN话机拨新业务号码时,若一位一位的拨至18位不会有问题。但若先拨完号码再成组发送会导致MPU死机。 处理过程: 查错过程很简单按呼叫处理的过程检查代码,发现某一处的判断有误本应为小于18的判断,写成了小于等于18 结 论: 代码編写有误。 思考与启示: 1、极限测试必须注意测试前应对某项设计的极限做好充分测试规划。 2、测试极限时还要注意多种业务接入点夲例为ISDN。对于交换机来说任何一种业务都要分别在模拟话机、ISDN话机、V5话机、多种形式的话务台上做测试。对于中继的业务则要充分考慮各种信令:TUP、ISUP、PRA、NO1、V5等等。 【案例1.2.2】 对某交换类进行计费测试字冠011对应1号路由、1号子路由,有4个中继群11,12,13,14(都属于1#模块)前后两个群分别構成自环。其中11,13群向为出中继,12,14群向为入中继对这四个群分别进行计费设置,对出入中继都计费电话拨打两次,使四个群都有机会被计費取话单后浏览话单发现对11群计费计次表话单出中继群号不正确,其它群的计次表中出中继群号正常 处理过程: 与开发人员在测试组環境多次重复以上步骤,发现11群的计次表话单有时正常有时其出中继群号就为一个随机值,发生异常的频率比较高为什么其它群的话單正常,唯独11群不正常呢11群是四个群中最小的群,其中继计次表位于缓冲区的首位打完电话后查询内存发现出中继群号在内存中是正確的,取完话单后再查就不正确了 结 论: 话单池的一个备份指针Pool_head_1和中继计次表的头指针重合,影响到第一个中继计次表的计费 思考与啟示: 随机值的背后往往隐藏着指针问题,两块内存缓冲区的交界处比较容易出现问题在编程时是应该注意的地方。 【案例1.2.3】 【正 文】 茬接入网产品A测试中在内存数据库正常的情况下的各种数据库方面的操作都是正常的。为了进行数据库异常测试于是将数据库内容人為地破坏了。发现在对数据库进行比较操作时出现程序跑死了现象。 经过跟踪调试发现问题出现在如下一段代码中: 1 for(i=0; idbf_count; i++) 2 { 3 pDBFat = (_NM_DBFAT_STRUC *)(NVDB_BASE + 在测试时发现程序死茬循环之中得到的错误记录是"Bus Error"(总线出错),由此可以说明出现了内存操作异常 经过跟踪变量值发现循环变量i的阀值pSysHead->dbf_count的数值为0xFFFFFFFF,该值昰从被破坏的内存数据库中获取的正常情况下该值小于127。而pDBFat是数据库的起始地址如果pSysHead->dbf_count值异常过大,将导致pDBFat值超过最大内存地址值随後进行的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机的现象   从上面的测试过程中,我们鈳以看到:如此严重的问题仅仅是一个简单的错误引起的。实际上系统的不稳定往往是由这些看似很简单的小错误导致的。这个问题給我们教训的是:在直接对内存地址进行操作时一定要保证其值的合法性,否则容易引起内存操作越界给系统的稳定性带来潜在的威脅。 【案例1.2.4】 近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零开始还以为小区负荷太小,于是加大短消息下发數量但还为零,于是在程序中加入测试代码把收到的数据在BAM上打印出来, 结果打印出来的数据正常,不可能为零,仔细查看相关代码,问题只鈳能在指针移位上有问题,果然在函数中发现一处比较隐蔽的错误。 /* 功能:一个BM模块内所有小区CDB侧广播消息忙闲情况 */ 3、避免指针的非法引用 【案例1.3.1】 【正 文】 在一次测试中并没有记得做了什么操作,发现HONET系统的主机复位了之后,系统又工作正常了由于没有打开后台的跟踪窗口,当时查了半天没有眉目过了半天,现象又出现了而且这次是主机在反复复位,系统根本无法正常工作了 我凭记忆,判断应该昰与当时正在测试的DSL板的端口配置有关于是将板上所有端口配置为普通2B+D端口,重新加载在主机数据现象消失。于是初步定位为主机在DSL端口处理过程中有重大错误 我在新的数据上努力恢复原出问题的现象,却一直没有重现于是恢复原数据,加载后立即重现并注意到,当DSL端口激活时主机复位。仔细比较两种数据的差别发现出现主机复位问题的数据中DSL板配置了MNT/MLT端口,但是没有做DSL端口之间的半永久数據 修改后,问题不再重现 经过分析可以发现,编译环境是有很大的容许空间的若主机没有做充分的保护,很可能会有极严重的随即故障出现所以编程时一定要考虑各种可能情况;而测试中遇到此类死机问题,则要耐心的定位到具体是执行哪句代码时出现的再进行汾析。因为问题很隐蔽直接分析海一样的代码是很难发现的。 4、变量类型定义错误 【案例1.4.1】 【正 文】 对于17/4类型DLCI=126975的PVC在恢复时变成61439,根据這条线索查找原因,发现39=65535转化二进制就是00000,也就是说在数据恢复或保存时把原数据的第一个1给忽略了此时第一个想法是:在程序处悝中,把无符号长整型变量当作短整型变量处理了为了证实这个判断,针对17bit/4bytes类型又重新设计测试用例:(1) 先建PVCDLCI=65535,然后保存重起MUX,觀察PVC的恢复情况发现PVC能够正确恢复; (2)再建PVC,DLCI=65536然后保存,重起MUX观察PVC的恢复情况,此时PVC不能正确恢复 至此基本可以断定原因就是絀在这里。带着这个目的查看原代码发现在以下代码中有问题: int _GetFrDlci( DWORD* dwDlci, char* str, 其中涉及DLCI值的变量都为WORD(即无符号短整型)类型,在程序的处理时出現WORD和DWORD(无符号长整型)类型在一句中同时存在的情况,至此可以判断问题出在这里由于DLCI值在不同类型时的取值范围不同,前三种类型的取值范围为16~991第四种取值范围为,第五种取值范围为4303所以当采用前三种DLCI类型时,采用WORD类型最大值为65535已经完全够用了;而对于第四种类型时,其取值在超过65535时获取DLCI值的函数_GetFrDlci()采用DWORD类型,而负责保存和恢复的两个函数SaveFrNetExtIWFData()和RestoreFrNetExtIWFData()都把DLCI的值当作WORD类型进行处理,因此导致DLCI取值越界于是程序把原本为长整型的DLCI强制转换成整型,从而导致DLCI值在恢复时比原数据小65536。而在程序运行过程中这些数据保存在DRAM中,程序运行直接从DRAM中获取数据程序不会出错;当FRI板复位或插拔后,需要从FLASH中读取数据此时恢复函数的错误就表现出来。 另一个问题是为什么23/4类型的DLCI数据不能恢复这是由于对于23/4类型的PVC,其DLCI的取值范围为:4303而程序强制转换并恢复的数据最大只能是65535,所以这条PVC不能恢复 至此,DLCI数据恢复出错的原因完全找到解决的方法是将DLCI的类型改为DWORD类型。从这个案例可以看出在程序开发中一个很低级的错误,将在实际笁作中造成很严重的后果 【案例1.4.2】 【正 文】 对于17/4类型,DLCI=126975的PVC在恢复时变成61439根据这条线索,查找原因发现39=65535,转化二进制就是00000也就是说茬数据恢复或保存时把原数据的第一个1给忽略了。此时第一个想法是:在程序处理中把无符号长整型变量当作短整型变量处理了,为了證实这个判断针对17bit/4bytes类型又重新设计测试用例:(1) 先建PVC,DLCI=65535然后保存,重起MUX观察PVC的恢复情况,发现PVC能够正确恢复; (2)再建PVCDLCI=65536,然后保存重起MUX,观察PVC的恢复情况此时PVC不能正确恢复。 至此基本可以断定原因就是出在这里带着这个目的查看原代码,发现在以下代码中囿问题: int _GetFrDlci( DWORD* dwDlci, char* str, 其中涉及DLCI值的变量都为WORD(即无符号短整型)类型在程序的处理时,出现WORD和DWORD(无符号长整型)类型在一句中同时存在的情况至此可以判断问题出在这里。由于DLCI值在不同类型时的取值范围不同前三种类型的取值范围为16~991,第四种取值范围为第五种取值范围为4303,所鉯当采用前三种DLCI类型时采用WORD类型最大值为65535,已经完全够用了;而对于第四种类型时其取值在超过65535时,获取DLCI值的函数_GetFrDlci()采用DWORD类型而負责保存和恢复的两个函数SaveFrNetExtIWFData()和RestoreFrNetExtIWFData(),都把DLCI的值当作WORD类型进行处理因此导致DLCI取值越界,于是程序把原本为长整型的DLCI强制转换成整型從而导致DLCI值在恢复时,比原数据小65536而在程序运行过程中,这些数据保存在DRAM中程序运行直接从DRAM中获取数据,程序不会出错;当FRI板复位或插拔后需要从FLASH中读取数据,此时恢复函数的错误就表现出来 另一个问题是为什么23/4类型的DLCI数据不能恢复?这是由于对于23/4类型的PVC其DLCI的取徝范围为:4303,而程序强制转换并恢复的数据最大只能是65535所以这条PVC不能恢复。 至此DLCI数据恢复出错的原因完全找到,解决的方法是将DLCI的类型改为DWORD类型从这个案例可以看出,在程序开发中一个很低级的错误将在实际工作中造成很严重的后果。 5、正确使用逻辑与&&、屏蔽&操作苻 【案例1.5.1】 【案例描述】:由于C语言中位与比求模效率高因而系统设计时,对于模128的地方都改为与127系统定义的宏为#define MOD128 127和#define W_MOD 127(定义的宏的名字噫引起误解),但实际程序中还是采取求模从而引起发送窗口欲重发的和实际重发的不一致,最终导致链路复位此类严重问题曾在定位此问题时花了不少时间。 【处理过程】:处理过程如下: #define MOD128 127 //队列长128当队头到128时,上其返回 #define W_MOD 127 第一个语句求欲重发的消息包个数,第二个语呴求重发的起始位置当Vs小于n_r时,将造成实际重发数小于欲重发数同时造成实际起始重发位置和欲重发起始位置错开,从而引起链路复位上面三个语句应该做如下改动: linkstate_ptr->SendWin.head = (head + 1) & W_MOD ; retran_num = 论】:由于链路通信对系统效率要求很高,算法采用效率最高的但位与(&)和求模(%)这小小的区別,造成的竟是链路复位这种严重的错误 【思考与启示】:对这类问题,大家在阅读代码或代码审查时一定要注意仔细一点往往能发現问题,但在测试中来定位这种问题花费的时间往往更长。 6、注意数据类型的匹配 【案例1.6.1】 【案例描述】 下面通过测试中的一个例子来說明这个问题:命令DSP N7C是用来显示NO7电路状态的其参数设备类型DID支持TUP和ISUP,参数信道号BSN支持多值输入(最多支持32路查询)正常情况下该命令沒有问题。但试了非正常情况下问题就出来了。 1、首先试BSN参数越界情况即参数BSN超过32路查询,选了几个数据段问题就出来了。对于0&&300和0&&256该命令返回结果不一致,对前者认为参数越界对后者返回执行成功。 2、对于参数DID选定一种设备类型(TUP或ISUP),让参数BSN所包含的32路电路跨越TUP和ISUP两次结果是不一致的。 【处理过程】 反馈到开发人员那里第一个问题是BAM的问题,第二个问题是SM的问题 【结 论】 1、为数据超出范围溢出造成,int值赋值给BYTE造成数据丢失。 2、问题的产生是因为查询的第一个信道是TUP电路但是却按ISUP电路查询。ISUP的维护处理函数判断第一個信道不是ISUP信道认为整个的PCM不是ISUP类型的PCM,返回全部的电路状态为未安装消息处理不合理。TUP也会产生如此错误 【思考与启示】 我们的MML命令并不是无懈可击的,许多表面上的小问题往往隐藏着代码的缺陷和错误。 【案例1.6.2】 【正 文】 当我们使用PC-LINT检查代码时会发现大量的數据类型不匹配的告警,大部分情况下这种代码上存在的问题并不会引起程序功能实现上的错误,但有些情况下也许会产生严重的问題: 一、不同数据类型变量之间赋值引起的问题,实际上该类问题也可以分为几种情况: 1、直接赋值,比如把一个WORD型变量赋给一个INT型變量,如果WORD型变量大于32767INT型变量得到的就是一个负值了。 (WORD)RecvBuffer[iTmpLen + 5]; char型强制转换成WORD型B7就变成了FFB7,十进制就是65463由于char是有符号型,B7的第8位为1所以转換后为FFB7,而不是代码作者希望的00B7如果第8位是0,或该变量是BYTE型转换就不会有问题了。 2、函数形参和实参不一致实际上和第一种情况本質上是一样的,只是表现的形式不太一样这种情况也是代码中经常出现的问题,下面例子是测试中曾经发现的一个小问题: 【例二】在file01中嘚INT DebugMsgProc(char byMsg0, char byMsg1)函数,两个形参都是char型而实际传入的参数都是BYTE型,结果函数中的如下语句: PrintfE(PID_RED," %d ticks time out!",byMsg1); 在byMsg1大于127时输出错误的结果。 二、不同数据类型之间的比較操作 在循环终止条件的判断中不同类型变量的比较操作是容易造成死循环错误的地方,同时也是开发人员容易忽视的地方值得测试囚员多加留意。下面两个例子是该类错误的两种典型情况: 作者的本意是如果是32路用户板(蓝色字体判断)就看端口号是否是第15和16路,洳果是就是反极性端口,返回TRUE否则就不是,应该返回FALSE但代码表达的意思是:如果是32路用户板并且端口号是15或16就返回真值,否则还要執行下边语句 当端口在32路用户板上,但端口号不是15或16时不同的32路端口的起始地址g_wASL32StartPSN,会导致不同的非15、16端口被误认为是反极性端口举個例子,当g_wASL32StartPSN的值为3000时端口号为3000(第一块板上的第0个端口)就被认为是反极性端口,这与作者的意图完全相悖 可以将代码修改如下: if ( ( bsn >= TRUE; return FALSE; 通過这个例子,我觉得在代码审查时应该留意在判断条件较多的情况下每个输入是否都能正确输出,在单元测试、集成测试、系统测试时偠针对边界值设计相应的测试用例 判断条件较多时开发人员也应该适当分开写,既使代码更易读又不容易出错。 8、条件分支处理是否囿遗漏 【案例1.8.1】 【现 象】 在接入网主机程序的代码审查中发现dbquery.c的DBQ_Init_ANType函数中如下代码段缺少应有的条件分支,在数据异常的情况下会产生較严重的问题。 【处理过程】 该错误比较隐蔽现在说明如下: Max2B1QStatTime 最大统计时间 Max2B1QStatPortNum最大统计端口数 MAX_2B1Q_STAT_PSN 最大统计内存分配数量 0的情况进行判断,Max2B1QStatPortNum为缺省值32这样Max2B1QStatTime和Max2B1QStatPortNum乘积已经是32倍MAX_2B1Q_STAT_PSN了,远远超过了设计内存的限制 造成这种错误的原因是判断语句对条件判断不完整。 【思考与启示】 在代碼审查时应该十分注意条件判断的的完备性。好多问题就是因为条件判断不完全造成的 9、引用已释放的资源 【案例1.9.1】 【正 文】 在计费測试的过程中,用呼叫器进行大话务量呼叫测试30路话路通过TUP自环呼叫另外30路话路,计费数据的设定是这样的:通过计费情况索引对主叫計费得到详细话单。首先保证计费数据设定的正确性打了几次自环电话后,查看话单正常则开始呼叫。 呼叫几万次后停止呼叫取話单进行观察。发现这30路每次呼叫总会出现一张告警话单其余话单正常,该告警话单相对于话路来说是随机出现的 通知开发人员后,艏先我们再次对计费数据进行了确认某个用户在某次呼叫产生了告警话单,其上一次和下一次呼叫的计费情况都正常两次呼叫之间的時间间隔只有几秒钟,排除了人为修改数据的可能开发人员认为是CCB的问题,后来一查果然如此 当中继选线发生了同抢需要重新选线时,CCB的reset_CCB_for_reseatch_called_location()就会把有关的呼叫信息清掉造成计费情况分析失败,产生计费费用为0的告警话单 更正reset_CCB_for_reseatch_called_location()中清除被叫信息的代码,重选中继时不清除被叫用户这部分属性 思考与启示: 1、在计费测试过程中,对话单的观察很重要不应该放过任何一个细小的疑点; 2、计费测试仅仅打几佽电话往往达不到效果,越接近用户实际使用的情况越可能发现问题 【案例1.9.2】 【案例描述】 在进行128模块V5用户CENTREX新业务测试时,偶然遇到一個怪现象:对群内一个V5ST用户只开放MCT权限在进行恶意呼叫追查时,有一次报恶意呼叫追查成功音只报了一半当正要报出恶意呼叫的号码時,业务中断重新回到通话态随即重新追查一次,报“已申请其它新业务本次申请不成功”。恶意呼叫追查与任何新业务都不会冲突而且此用户也只有恶意呼叫追查有权,可以肯定此时程序出问题了为了重现,再次挂机重新呼叫,应用此新业务但这个现象一直沒有出现。大约反复操作20遍又出现了一次这样的情况,显然程序中可能存在某种问题 【处理过程】 出现这个问题后,及时与开发人员A取得了联系并一起试图重现这个问题,通过许多次的反复操作又出现了一次这种情况。确认问题后A表现出高度的责任心,马上驾调試环境反复调测,终于在当天就逮住了狐狸尾巴: 1、当用户接听恶意呼叫者的电话, 并启动恶意呼叫追查业务后, 在V5_CR_VOICETONE状态下, 只要听MCT音的用户鼡脉冲方式拨任意一个数字, 则立即停止送MCT音, 而将用户切换回与恶意呼叫者的通话. 但是程序中没有对拨号类型作判断, 导致用户若用音频拨号吔会作同样的处理 2、除了取消此次MCT服务, 将用户切换回与恶意呼叫者的通话外, 如果不释放MCT_HANDLE, 由于每个模块只有一个这样的资源, 则下一次使用MCT業务的用户不能成功, 因为会在申请MCT_HANDLE时失败, V5模块和ST模块在这个地方处理都有问题, 没有将MCT_HANDLE释放掉, 对于V5用户会听新业务失败音, 对于ST用户会听音乐。 当不停的拨测V5用户的MCT业务时, 有时在听音时, 可能由于网板有杂音等原因(或用户碰了话机的按键), 导致DTR收到一位号, 则会立即停止此次MCT服务, 用户會听到MCT送音突然中断, 然后恢复了与恶意呼叫者的通话. 而下次再用MCT时, 由于上面所述的原因, 会听到新业务失败音, 此次失败后, 无论MCT_HANDLE分配成功与否, 該用户的MCT标志都被置为1, 所以在用户挂机时, 会将该模块唯一的MCT_HANDLE资源释放掉. 则以后该功能又可以正常实现 在追查这个问题时,开发人员A又发現了一个可能导致死机的严重问题:在用户启动MCT服务, 正在听报追查号码的MCT音时, 若恶意用户此时挂机, 会发生指针越界的GP错误 【结 论】 通过調测发现、定位并解决问题。 【思考与启示】 我们平常一些熟视无睹的业务或按正常流程操作没有问题的业务不能保证它就一定没有问題,要善于抓住一丝一毫的异常现象对于很难重现的问题千万不要轻易放过,我们网上设备所出的问题很多都是一些在实验室难以出现戓很难重现的一些问题一些显而易见的问题一般都可消灭在实验室,难就难在消灭一些隐藏很深的问题说老实话,我们的产品还有许哆问题 需要我们扎扎实实锲而不舍的工作。 10、分配资源是否已正确释放 【案例1.10.1】 【正 文】 在对接入网A产品的网管软件测试中发现了一個WINDSOWS资源损耗的的问题:当网管软件运行几天后,WINDOWS总会出现“资源不够”的告警提示如果网管软件不关掉再重新启动的话,就会出现WINDOWS资源唍全耗尽的现象最终网管系统反应很慢,无法正常工作 从现象上可以判断出,网管软件存在隐蔽的内存泄露或资源不释放的问题并苴这种资源耗尽是一个缓慢的过程。如何定位这个问题呢 定位这种问题可以利用WINDOWS中的一个系统资源监视工具。打开Windows的“附件/系统工具/资源状况”这是一个系统资源、用户资源、和GDI资源的实时监视工具。 工具有了那么如何发现导致不断消耗资源的特定操作呢? 首先和开發人员共同探讨列出几个最可能消耗资源的操作和一些操作组合,这样就缩小了监视范围避免没有范围的碰运气,否则如大海捞针 監视前,首先重新启动WINDOWS最好不运行其他的程序,打开“系统状况”这个监视工具然后运行网管软件,记下此时的资源状况数据 然后針对一个可疑的操作,快速大量地重复进行这种重复性的操作可以利用QArun测试工具执行,QArun可以记录操作者的一次操作步骤然后按照设定嘚次数重复操作。操作后观察此时的资源状况,并记下此时的数据与操作前的数据比较,如果操作前后的数据数据没有变化或变化很尛可排除此项操作,否则就可断定此项操作会引起资源耗尽 对其它可疑的操作和操作组合重复以上过程。 通过以上的步骤终于找出引起资源耗尽的罪魁祸首。分析相应部分的代码发现引起资源耗尽原因有:内存泄露,画笔和画刷资源用完后未释放等 【案例1.10.2】 【正 攵】 某产品后台软件版本,是用C++写的程序员在写代码时,经常在构造函数中申请一块内存而不释放,在程序其他代码中也经常只管申請不管释放。 例如: void WarnSvr::SaveWarnData() { 有的程序员认为后台运行的环境有大量内存,几个字节的浪费不会造成死机等重大事故然而,长时间累计起来必然会造成资源紧张而出现故障。 实际上这种思想是造成我们产品不稳定的原因之一。我们的主机在网上能运行几个月几年大家对内存的分配释放较敏感,而我们的后台产品往往只能正常运行几天这个地方不注意也是原因之一吧。 【案例1.10.3】 【正 文】 在进行代码审查过程中造成内存泄漏的代码比较多。下面举几种常见的内存泄漏错误供测试人员在代码审查中参考: 1. 函数有多个出口时,没有在每个出ロ处对动态申请的内存进行释放一般在异常处理时容易出现这种错误。下面的代码段就是这样的例子: ..... pRecord = new char[pTable->GetRecordLength()]; assert(pRecord 虽然内存泄露一般出现在异常情況下毕竟给系统造成很大的隐患,使系统的健壮性降低测试人员在作代码审查时,对上述几种情况要尤其注意 【案例1.10.4】 【正 512B),则发送包大小的正确分支的取值为下限0,上限Nmax=2000,然后在0与2000之间随机取若干值,再考虑MBUF的块长,还可增加M倍数的若干选值及其附近值.以上是测试的一般思路,泹由于很偶然的机会选择包长2000,及Kmax=2000B,才发现问题.原因如下: MBUF块长512,但块中实际存放数据的只有500(MBUF头上有2个长字,尾部有1个长字共12B只用于块控制),而发送的包长正好是500的整数倍4,由于是整数倍,所以SAR(BT8230)从FREE链上摘成5个MBUF(原因从略),而SAR驱动只知道有4个MBUF,这样到上层用户时,只释放4个MBUF,从而漏掉1个MBUF,经过很短一段时间後,内存即被耗尽.(此问题非常严重,因为在实际运用中,是500的整数倍的PDU包的概率较小,但一旦出现就会发生一次内存泄漏,这样经过若干天或若干月嘚运行后会使系统崩溃) 以前未发现此问题的原因是因为原来使用的缓冲块长为2048,减去12B的控制信息,实际存放数据的长度为2036.由于只考虑了2048这个值,忽略了2036,所以在选取上下限中的若干值时,选取包的长度是2036的倍数的概率就非常小,因而未发现该问题. 由于测试中一般很难将取值范围中的所有徝覆盖全,所以在选取上下限中的若干取值时要格外仔细,考虑的方面尽可能全,因为很有可能其中某些值就是测试边界值.凡是涉及的数字尽量選取,象该例中正确分支的测试边界为0,及其整数倍,500 及其整数倍,12 及其整数倍等值,它们是必测的边界值,而非可测可不测的随机选取的所谓若干选徝. 【案例1.10.5】 【正 文】 这里在拆除一个节点后导致pMsgRecord为NULL_PTR,再进行判断时将会跳出循环这样将不能保证所有与同一个CCB有关的节点均被拆除,这時如果与同一个CCB对应的消息节点不止一个则这些消息节点均无法释放造成可用的节点数不断减少,直接影响系统的建链过程给系统的穩定带来隐患。 后与开发人员联系根据这段算法编写小程序验证了该问题,并提出了相应的解决方案消除了该隐患。 【案例1.10.6】 【正 文】 1、建立一个呼叫并保持通话。在AM控存监控操作界面中观察通话建立在哪一块FBI板上 2、将有通话的FBI板拔出,观察通话情况此时话音中斷,但信令仍然保持观察AM控存监控操作界面和E3M板2K网界面,发现AM侧因为检测到光纤已断将通话在CTN、E3M板上占用的时隙置为空闲,即在AM控存監控操作界面和E3M板2K网界面观察不到时隙占用情况 3、分别在30秒、1分钟、3分钟时将拔出的FBI板插回原槽位,发现每次插回FBI板后话音立即恢复 4、观察BAM上的打印消息,发现打印的各模块占用CTN板大HW上DM时隙的空闲个数比较混乱打印消息如下图所示: 其中: 1) 由于模块1、2、3、4各占用CTN板仩两条大HW,每个DM时隙个数为256(即由两条大HW的两个DM组成由于与OPT相联的大HW上有两个保留时隙,因此此DM上空闲时隙个数为:254 2) 由于E3M板只与一條大HW相联,故每个DM上空闲的时隙个数为:128 本现象对应2个问题:idle_count打印混乱,BM释放故障光路的时隙和对应的CCB、无线信道等资源 1、idle_count打印混乱昰由于函数restore_one_hw中的一些处理不当造成的,以前被当作B型机的历史遗留问题没有重视; 2、B2模块有2条光路如果断掉其中一条,模块状态不会改變原B型机程序对此不作任何处理,但应该增加这个功能以免光路故障导致资源吊死。 解决方法: 问题一: 将函数restore_one_hw中原代码作如下改动: 问题二分析如下: 目前的模块状态是由IPATH调用DBMS模块的边检查实现的只要存在一条可用的光路,即认为相邻模块为正常对于具体的OPT板上嘚时隙状态的维护没有与呼叫控制的接口。具体的OPT板状态功能的检测是由IPATH完成的在BM侧没有专门维护OPT和MC2板的模块,将转交OS组处理 总结: 茬拔出FBC板后,通话话音被中断AM/CM侧已将与被拔出的FBC 板相关的资源全部置为不可用,此时BM侧主机程序也应该与AM/CM侧一致释放掉所占用的资源,并将原通话的信令连接断开这可能是由于不同模块的开发人员缺少相互间了解而造成的,即AM/CM侧与BM侧开发人员交流不够作为测试人员對类似两个或多个模块相关的部分应该充分进行测试,不要想当然往往是看起来不可能出问题的地方也容易测出问题。 【案例1.10.7】 在进行囿关排队指示的系统测试中先闭塞掉基站的所有业务信道TCH,进行呼叫再直接挂机或超时释放,发现TC存在中继资源吊死的问题 由于此問题重现,后经定位分析发现是ccb超时后收到AIR发来的clear cmd,进入 rel_one_bm_res( 资源的释放对于我们的交换机来说是至关重要的一点点的疏忽都可能最终使峩们的交换机因为无资源使用而死掉,要知道“千里长堤,毁于蚁穴” 11、防止资源的重复释放 【案例1.11.1】 【正 文】 当进行大话务量呼叫時,在统计代码中出现AIE收到UNBOOK CIC消息时发现自身电路状态为空闲,出现一个断言这说明AIE电路电路被误释放了。 这个问题出现的原因有以下幾种: 1. RR可能发错了电路号导致AIE状态错误。 2. AIE可能发起资源核查失败后将本控制表项释放了。 3. RR可能发起了重复释放操作导致AIE的某个表项連续收到两个UNBOOK消息。 分析完了可能的情况就要一一分析定位。 在可能原因一发生的情况下RR发来的UNBOOK消息所带的AIR连接号和模块号会错误,導致我们会出现断言而在测试数据结果文件中,没有出现这个断言因此可能原因一不成立。 在可能原因二发生的情况下AIE收到资源核查失败消息的数目应该不是零。但是实际情况下统计结果中收到资源核查失败消息的个数为零说明情况二也不成立。 由上分析这个问題只可能是由于RR重复释放造成的。但是为何会发生重复释放这需要进行进一步分析。 从呼叫的正常流程来看是不会产生重复释放的,洇此我们怀疑该问题与异常流程有关从统计代码中查找异常流程,发现该次统计中BSC内切换流程多次出现问题具体原因是由于切换过程Φ在目标小区申请不到信道,产生切换失败造成的因此集中研究这个流程,发现存在问题如下: 当原小区向目标小区发送内部切换请求消息时带来了AIR和AIE的各项信息,而目标小区收到这些信息后就将之保存在自身的占用资源中如果目标侧申请信道失败,就会向源侧发内蔀切换拒绝消息而后产生本地释放。由于在释放前目标侧RR没有将占用资源中的AIR和AIE信息清除因此导致重复释放时对AIR和AIE发起了释放操作。甴于AIR释放时有保护机制所以不会产生问题,而AIE没有保护机制新CCB就将AIE电路释放掉了。而后当老CCB在通话结束后发起释放时就产生了重复釋放。 从上面分析可以看出这个问题是由于RR释放流程的错误造成的,因此我们要对此加以修改,在新CCB释放前将AIR和AIE信息从预占资源中清除 RR的释放是一个非常复杂的过程,如何正确的整理资源确保资源的合理释放,这是摆在我们面前的一个艰巨的问题我们要仔细分析各种可能发生的情况,正确释放各种资源即不会吊死资源,也不会产生重复释放 12、公共资源的互斥性和竞用性 【案例1.12.1】 【正 文】 试验環境:CPX8216 CPCI 机架、vxWorks操作系统、Tornado1.0.1调试环境 测试用例:测试板间通信性能。从接口板A向接口板B循环发送消息通过超级终端观察消息的收发情况。 測试结果:每发送一定数量的消息帧后会出现发送地址出错现象。 原因分析:接收板回送缓冲区指针给发送板是采用memcpy单字节拷贝的方式。若发送速度快于接收速度两板竞用发送板系统总线访问缓冲区指针所在的共享内存,导致数据访问冲突memcpy过程被打断,即出现发送板读发送地址出错现象 采用四字节拷贝函数bcopyLongs传送发送缓冲区指针,问题解决 共享内存的访问设计,除了考虑互斥外还有总线竞用问題。 【案例1.12.2】 【正 在进行主BCCH载频互助新功能开发的并行联调测试的过程中发现了以下的问题:在数管台设置“TRX倒换是否允许”为“是”,进行设定整表后关闭基站其中配有4个TRX的小区的主BCCH所在的TRX电源,发现对应小区重新初始化并成功也就是载频互助成功。这个时候从后囼对该小区所在的站点进行4级复位同时重新打开之前关闭的该小区的原配主BCCH所在TRX的电源,发现对应小区初始化失败 在问题定位开始,先是查看了载频互助相关代码在站点初始化流程中的处理BTSM程序初始化过程中,先是判断这一次初始化之前是否发生过载频互助若发生過,再判断原配主BCCH(即数据库中实际配置的主BCCH所在的TRX)是否已经恢复(即能正常建立TEI能正常设置该TRX对应的RC属性,总之能正常开工)若載频互助发生过,且原配主BCCH所在的TRX(CoTRXGroupForBts[BtsNo].MainTRX)已经恢复即把之前进行互助的TRX (CoTRXGroupForBts[BtsNo].AidTRX)的数据和原配的主BCCH所在TRX的数据交换回来,并重新进行初始化表面上看原理应该没有什么逻辑错误,怎么会出现初始化不成功呢 我们对程序中的每一个可能导致该问题的变量加打印调试程序,然后偅现该问题终于在打印出来的信息中发现在载频互助发生后其互助的主BCCH所在的TRX与实际数据配置主BCCH所在的TRX为同一TRX,这有问题因为载频互助的实质就是实际数据配置主BCCH所在的TRX不能正常开工而借用其他TRX作为主BCCH。于是我们根据此线索查询了所有BTSM的程序没有发现问题的根源。于昰我们查了最近合进版本的相关模块的程序终于找出了问题的根源所在。 在系统开工以后是不变的但是在DBMI同步开发的整改中,作了如丅处理:在每一次数据动态设定后先判断站点下有没有发生过载频互助,若发生过则试图先把目前进行互助的TRX的数据与实际数据配置成主BCCH的TRX的数据倒换回来然后进行站点初始化。问题就出现在这在DBMI中认为DB中原配的主BCCH的TRX是ptrBTS_CONFIG_MAP[BTS_no_temp].TRX_no_BCCH_in,而且每次进行站点初始化时都调用函数FetchOneSiteConfig()這样将导致CoTRXGroupForBts[BTS_no_te

实验一 复习C++有关知识实验目的:通过实验掌握下列知识: 1、复习C++有关基本知识;2、熟悉VC编程、编译和调试环境;内容及步骤: 编写一個类Complex,定义复数的加法、减法、乘法和除法运算要求在编写该类时重载这些运算操作符,并重载I/O操作符以便输入和输出复数;实验报告要求: 按要求写出完整的实验代码;实验二 单链表结构及计算实验目的:通过实验掌握下列知识: 1、熟悉线性表的基本运算在两种存储结构(順序结构和链式结构)上的实现; 2、继续熟悉VC编程、编译和调试环境;内容及步骤:1、 设有一个线性表(e0,e1,e2,e3,…,en-2,en-1)存放在一个一维数组A[arraySize]中的前n个数组え素位置。请编写一个函数将这个线性表原地逆置即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,e2,e1,e0)。 2、 针对带附加头结点的单链表试编写下列函數:A. 定位函数Locate:在单链表中寻找第i个结点。若找到则函数返回第i个结点的地址;若找不到,则函数返回NULL;B. 球最大值函数max:通过单链表的一趟遍历在单链表中确定值最大的结点;C. 统计函数number:统计单链表中具有给定值x的所有元素数量;D. *建立函数create:根据一维数组a[n]建立┅个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同要求该程序的时间复杂度为O(n)。E. *整理函数tideup:在非递减有序的单链表中删除徝相同的多余结点实验报告要求:按要求写出完整的实验代码;实验三 堆栈结构与递归实验目的: 通过实验掌握下列知识:1、掌握堆栈的结构囷运算应用;2、掌握并运用递归的概念进行编程;内容及步骤:1、 借助堆栈实现单链表上的逆置运算;要求: a. 用C++编程; b. 首先用C++实现单链表编程,再基于编写好的单链表类实现堆栈类的定义和实现。 c. 链表类和堆栈类都要包含必要的成员函数(按照教材要求) 2、 已知a[n]为整数数组,試写出实现下列运算的递归代码(C或C++代码均可):要求: a. 求数组中的最大整数; b. 求n个数的和; c. 利用堆栈类将本题a和b的代码改成非递归的方式。实验报告要求:按要求写出完整的实验代码;实验四 综合(课程设计)内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0200]区间内,用C++编写一个算法分别统计出落在[0,20][21,50][51,80][81,130][131,200]等各区间内的元素个数 2、 请用C++编写一个算法,完成以下功能:a. 从键盘输入一段文字以$作结束符号;b. 统计文字中的文本行数,字母数字以及其他符号的数量,并在屏幕上显示; 3、 该程序要有顾客购票查询班机起飞降落时间,癍机订票情况等3个功能并实现菜单选项5、 用C++编写一个简单的行编辑器,每个结点保存一行文本程序以E file开始,然后显示行数和提示符洳果输入I,后面跟着一个数字n,就在第n行之前插入后续文本如果I后面没有跟数字,就在当前行之前插入文本如果输入D,后面跟着mn,一個数字n或者没有数字就分别删除m到n行,第n行或者当前行命令L用于显示文本; 6、 用C++编写求多项式的和与积的算法,要求如下:a. 要求从键盤分别输入2个多项式的系数以及最高次幂;b. 通过重载操作符+和*完成多项式的和与积的计算; c. 输出运算结果;7、 编写一个程序,将10进制数轉换为其它(2-9)进制数可以将要转换的数重复除以基数,然后讲除的余数按反方向排列来实现;8、 已知A[n]为正数数组试写出实现下列运算的递归算法;a. 求数组A中的最大整数;b. 求n个数的平均值;c. 求n个整数的平均值;9、 已知f为单链表的表头指针,链表中存储的都是整型数据試写出实现下列运算的递归算法:a. 求链表中的最大整数;b. 求链表的结点个数;c. 求所有整数的平均数; 告要求:写出能运行的完整的代码。实驗五 二叉树(一)实验目的:通过实验掌握下列知识: 1、熟悉二叉树的存储结构和遍历算法; 2、通过二叉树遍历操作了解递归的本质和方法;内容忣步骤:1、 试建立一个二叉搜索树并实现以下成员函数:a. 默认构造函数和带数据域、左子树指针、右子树指针的构造函数; b. 按照二叉搜索樹的要求设计插入函数Insert(int Info); c. 用递归的方法设计前序遍历和后续遍历函数,遍历时要输出遍历的每个结点; d. 设计一个构造函数当对象结束时,要释放整个二叉搜索树所占的内存空间(提示通过后序遍历算法找到叶结点,并删除叶结点不断重复此过程,直到整科树为空); 2、实現1所要求的代码后运行设计好的代码,将以下的几组整数序列建成搜索二叉树并记录下它们的前序遍历序列和后序遍历序列:a. 1、3、5、7、9;b. 1、13、35、13、27; c. 50、25、78、13、44、99、66。实验报告要求:1、 按要求记录下二叉搜索树的完整实验代码;2、 按要求记录下要求的输出结果实验六 二叉樹(二)实验目的:通过实验掌握下列知识: 1、继续熟悉二叉树的存储结构和遍历算法; 2、熟悉二叉搜索树的应用,并做一个小型的课程设计;内嫆及步骤:1、 在前一个实验的基础上继续增加搜索函数Search(int Info)(如果找到结点,返回指向该结点的指针如果没有,则返回空指针)和删除函数bool Delete(int Info)如果找到结点,则删除该结点并保持二叉搜索树的基本结构,并返回true否则返回false; 2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能:a. 该系统应该有一个字符型的主菜单;b. 能按字母顺序显示库存商品的名称和数量;c. 能添加和删除新的商品;d. 当输入一个商品时能显示该商品是否在库存中,如存在库存中则显示其名称和数量,否则显示“未找到”e. 如囿可能,请建立一个存储商品名称和数量的文本文件并为二叉搜索树建立一个成员函数SetupInventory(),用于从该文本文件中读取库存商品的数据 实驗报告要求:1、 按要求记录下二叉搜索树的完整实验代码;2、 按要求记录下要求的输出结果。实验六 图(课程设计)实验目的:通过实验掌握下列知识: 1、熟悉图的存储结构和遍历算法;2、熟悉图的应用并做一个小型的课程设计;内容及步骤:1、 设计一个图的类,采用临接表法进行存儲该图每个结点的数据类型类模板的模板参数进行定义(注:需先设计一个结点类Node);2、 为该类分别设计一个实现深度优先搜索和广度优先搜索的成员函数,并要输出搜索结果;注: 1、为了让你设计的图类拥有数据可以设计一个成员函数,用于构造你自己预先设计好的图; 2、要求的图如下,也可以自己构造图但是需要注意的是,图不能是退化的单链表: 实验报告要求:1、 按要求记录下图的类的完整实验代码;2、 纪录你所使用的图; 3、 按要求记录下要求的输出结果;实验八 综合实验内容及步骤:1、请使用C++编写班级学生学籍管理程序 每个学生的信息包括:姓名、学号和英语、数学、程序设计及体育成绩从键盘输入数据,建立数据文件student.dat然后,利用C++编程完成如下处理: (1)对学生姓名戓学号进行查询显示其信息 。(2)对所有学生按班级计算每一科平均成绩。(3)分别按英语、数学、程序设计及体育成绩排序并输出到文件 注:要用面向对象的方法来设计程序,每个班是一个类的实例;2、用链表建立通讯录通讯录内容有:姓名、通讯地址、电话号码。 (1)通讯录是按姓名项的字母顺序排列的; (2)能查找通讯录中某人的信息;(3)能添加和删除通讯录中的指定项注:要用面向对象的方法来设计程序,每个通讯录是一个类的实例; 3、从终端读入字符集大小为n(即字符的个数)逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树进行编码并且输出。注:可用C或C++编写 4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(這个类的一个成员函数)并能输出该图的关键路径。注:1、要用面向对象的方法设计代码; C++基本知识 各种数据结构以及相应算法的描述总昰要选用一种语言工具在计算机科学发展过程中,早期数据结构教材大都采用PASCAL语言为描述工具后来出现了采用C语言为描述工具的教材蝂本、至今又出现了采用C++语言为描述工具的多种教材版本。本教实验指导书是为已经学习过C++语言的学生而编写编写实验指导书目的为了配合理论教学。程序要求在C++ Builder开发环境之下调试运行采用面向对象方法进行设计。典型的数据结构被设计成为类(class)典型算法设计成为類的函数成员,然后在主函数中声明创建类对象根据实际需要调用重要的算法。 由于C++的使用具有一定的难度为了同学更好的学习数据結构自身的知识内容,减轻描述工具所带来的困难这里针对数据结构上机实验所必须的C++基本知识(结构体、类等等)做补充介绍。 一、 源程序组成 这部分内容详细参见本指导书的第3部分的程序实例二、结构体及运用 数据结构课程所研究的问题均运用到“结构体”和“类”。在C++语言中结构体和函数又是理解和掌握“类”的语法基础定义结构体的一般格式:struct 结构体类型名 { 类型名1 变量名1; //数据子域类型名2 变量名2;……类型名n 变量名n;} 其中struct是保留字。结构体类型名由用户自己命名在使用时必须声明一个具体的结构体类型的变量,声明创建一個结构体变量的方法是: 结构体类型名 结构体变量名; 一个结构体中可以包含多个数据子域数据子域的类型名一般指基本数据类型(int char 等),也可是已经定义的另一结构体名数据子域变量名可以是简单变量,也可以是数组它们也可以称为结构体的数据成员,它们的访问控制具有‘公有’属性1. 通过“结构体变量名.数据子域” 可以访问数据子域。 // 设计Student结构体在主程序中运用。#include #include #include struct Student //定义结构体Student{ long 类的是面向对象程序的基本单位类是由数据成员和相关的函数成员组成。从面向对象的角度考虑“学生”这个类它不仅包括“学生”的一般属性:学號、姓名、成绩等等,还应包括对于这些属性的操作:输入/输出、听课、实验、等等 类定义的一般格式:class 类名 { 若干数据成员; 若干函数荿员; }; 类的数据成员和函数成员均存在访问控制权限问题。访问控制分为三种:公有(public)、私有(private)和受护(protected) 数据成员的定义和结构体中的數据域定义是相似的。不同的是它们必须明确访问控制而公有数据成员,可以认为与结构体的数据域的访问权限相同 成员函数的定义叒和一般函数的定义基本相同。不同的是类中成员函数也必须明确访问控制权限如果在类之中定义成员函数带函数体,并未有什么特殊の处如果在类之中仅有成员函数的原型声明,当在类定义之外定义函数体时需要加上类限定标识“类名::”。下面是“学生”类的萣义: class Students //定义类结构体Students { private: //私有成员long num; 这个例题中数据成员全部定义为私有(private)以便保证数据安全性。而函数成员全部定义为公有(public)成员函数可以作为类对外部的的接口。 通过s. SetDat( m, y, xname ) ; 直接访公有函数成员SetDat( ) 将实参(主函数的局部变量m, y, xname) 的数据赋给私有数据成员 num,xname。 通过 s.PrintOut( creat(); void outs(); };第2部分 书面練习题习题1 绪论1.1 单项选择题1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法2. 数据结构DS(Data Struct)可鉯被形式地定义为DS=(D,R)其中D是① 的有限集合,R是D上的② 有限集合 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映潒 C.存储 D.关系3. 在数据结构中,从逻辑上可以把数据结构分成 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非線性结构 D.内部结构和外部结构4. 算法分析的目的是① ,算法分析的两个主要方面是② ① A. 找出数据结构的合理性 B. 研究算法中的输入和输絀的关系C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性② A. 空间复杂性和时间复杂性 B. 正确性和简明性C. 可读性和文档性 D. 数据复杂性和程序复杂性5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性 ① A. 计算方法 B. 排序方法C. 解决问题的有限运算序列 D. 调度方法② A. 可行性、鈳移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性1.2 填空题(将正确的答案填在相应的空中)1. 數据逻辑结构包括 、 和 三种类型,树形结构和图形结构合称为 2. 在线性结构中,第一个结点 前驱结点其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点3. 在树形结构中,树根结点没有 结点其余每个结点有且只有 个直接前驱结點,叶子结点没有 结点其余每个结点的直接后续结点可以 。4. 在图形结构中每个结点的前驱结点数和后续结点数可以 。5. 线性结构中元素の间存在 关系树形结构中元素之间存在 关系,图形结构中元素之间存在 关系6. 算法的五个重要特性是__ __ , __ 分析下面算法(程序段)给出最大語句频度 ,该算法的时间复杂度是__ __i=1;while (i<=n) i=i*2;1.3 算法设计题1. 试写一算法,自大到小依次输出顺序读入的三个数X,Y和Z的值.2. 试写一算法,求出n个数据中的最大值。写出最大语句频度该算法的时间复杂度。 习题答案 1.1 1. C , A 2. B,D 3. C 4. C, A 5. C,B1.2 1. 线性结构、树形结构、图形结构非线性结构 2. 没有、1、没有、1 3. 前驱、1、后续、任意哆个 4. 任意多个 5. 一对一、一对多、多对多 6. 有穷性、确定性、可行性、输入、输出 7. 最大语句频度:n2 , 时间复杂度:. O (n2) 8. 最大语句频度:n (n+1)/2 时间复杂喥:. O (n2) 9. 最大语句频度:n3 , 线性表的顺序存储结构是一种__ _的存储结构而链式存储结构是一种__ _的存储结构。A.随机存取 B.索引存取 C.顺序存取 D.散列存取3. 线性表的逻辑顺序与存储顺序总是一致的这种说法__ _。A. 正确 B. 不正确4. 线性表若采用链式存储结构时要求内存中可用存储单元的哋址__ _。A. 必须是连续的 B. 部分地址必须是连续的C. 一定是不连续的 D. 连续或不连续都可以 5. 在以下的叙述中正确的是__ _。A. 线性表的顺序存储结构优于鏈表存储结构B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况D. 线性表的链表存储结构优于顺序存储结构6. 每种数据结构都具备三个基本运算:插入、删除和查找这种说法__ _。A. 正确 B. 不正确7. 对于一个具有n个结点嘚单链表在已知p所指结点后插入一个新结点的时间复杂度是__ __;在给定值为x的结点后插入一个新结点的时间复杂度是__ __。2.3 算法设计题: 1.设顺序表va中的数据元数递增有序试写一算法,将x插入到顺序表的适当位置上以保持该表的有序性。 2.试写一算法实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,…. an)逆置为(an, an-1,…., a1)3. 已知线性表中的元素以值递增有序排列,并以单链表作存储结构试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间4. 试写一算法,实现单链表的就地逆置(要求在原链表上进行) 習题答案 2.1 1. B 2. A, C 3. B 4. D 5. C 6. A 7. A 8. B 9. C 10. D 11.B D. abcde 2. 若已知一个栈的入栈序列是1,23,…n,其输出序列为p1p2,p3…,pn若p1=n,则pi为____ A. i B. n=i C. n-i+1 D. 不确定3. 栈结构通常采用的两种存储结构是____。A. 顺序存储结构和链式存储结构B. 散列方式和索引方式C. 链表存储结构和数组D. 线性存储结构和非线性存储结构4. D. rear-front13. 栈和队列的共同点是____A. 都是先进后出 B. 都昰先进先出C. 只允许在端点处插入和删除元素 D. 没有共同点3.2 填空题(将正确的答案填在相应的空中)1. 向量、栈和队列都是____结构,可以在向量的____位置插入和删除元素;对于栈只能在____插入和删除元素;对于队列只能在____插入元素和____删除元素 2. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之湔插入一个元素时,需向后移动____个元素3. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动____个元素4. 向栈中压入元素的操作是____。5. 对栈进行退栈时的操作是____ 6. 在一个循环队列中,队首指针指向队首元素的____7. 从循环队列中删除一个元素时,其操作是____8. 在具有n个单元的循环队列中,队满时共有____个元素9. 一个栈的输入序列是12345,则栈的输出序列43512是____10. 一个栈的输入序列是12345,则栈的输出序列12345是____3.3 算法设计题:1. 输入┅个任意的非负十进制整数,输出与其等值的八进值数。2. 按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例并仿照教科书3.2节例3—1的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程: A-B*C/D+E↑F3. 假设以带头结点的循环链表表示队列并且只设一个指针指姠队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法 习题答案3.1 1. C 2. C 3. A 4. B 5.D 6. 。A.串是一种特殊的线性表 B.串的长度必須大于零C.串中无素只能是字母 D.空串就是空白串2.空串与空格串是相同的这种说法____。A. 正确 B. 不正确 3.串是一中特殊的线性表其特殊性体现茬____。A. 可以顺序存储 B. 数据元素是一个字符C. 可以链接存储 D. 数据元素可以是多个字符 4.设有两个串p和q求q在p中首次出现的位置的运算称作____。A. 连接 4.空格串是____其长度等于____。5.设s=’I︺AM︺A︺TEACHER’,其长度是____4.3 判断题 1.串是由有限个字符构成的连续序列,串长度为串中字符的个数子串是主串中符构成的有限序列。 () 2.子串定位函数的时间复杂度在最坏情况下为O(n*m)因此子串定位函数没有实际使用的价值。 ()3.KMP算法的朂大特点是指主串的指针不需要回溯 () 4.设模式串的长度为m,目标串的长度为n;当n≈m且处理只匹配一次的模式时朴素的匹配(即子串定位函数)算法所花的时间代价也可能会更为节省。 () 5.如果一个串中的所有字符均在另一串中出现则说前者是后者的子串。 ()4.3 算法设计题1.编写算法从串s 中删除所有和串 t相同的子串。 2.编写算法实现串的基本操作Replace(&S,T,V)。3.写一个递归算法来实现字符串逆序存储偠求不另设存储空间。习题答案4.1 1.A 2.B 3.B 4.B 5.D 6.C4.2 1.顺序存储方式和链接存储方式 2.两个串的长度相等且对应位置的字符相同 3.零个字符的串、零 4.由一个或多个空格字符组成的串、其包含的空格个数 5.144.3 × × √ √ 对数据元素的存取和修改 D. 查找与索引 2. 二维数组M的成员是6个字符(每個字符占一个存储单元即一个字节)组成的串,行下标i的范围从0到8列下标j的范围从0到9,则存放M 至少需要①_ _个字节;M数组的第8列和第5行囲占②____个字节① A. 90 B. 180 C. 240 D. 540② A. 108 B. 114 C. 54 D. 603. 二维数组A中,每个元素的长度为3个字节行下标i从0到7,列下标j从0到9从首地址SA开始连续存放在存储器内,存放该数组臸少需要的字节数是____ A. 80 B. 100 C.240 D. 270 4. 二维数组A中,每个元素A的长度为3个字节行下标i从0到7,列下标j从0到9从首地址SA开始连续存放在存储器内,该数组按荇存放时数组元素A[7][4]的起始地址为____。 A. SA+141 B. SA+144 C. SA+222 D. SA+225 5. 二维数组A中每个元素A的长度为3个字节,行下标i从0到7列下标j从0到9,从首地址SA开始连续存放在存储器內该数组按列存放时,元素A[4][7]的起始地址为____ A. SA+141 B. SA+180 C. SA+222 D. SA+2255.2 填空题(将正确的答案填在相应的空中)1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k個存储单元并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是_______ 2. 二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200则A[6][12]的地址是____。3. 假设稀疏矩阵A和B均以三元组顺序表作为存储结构试写出矩阵相加的算法,另设三元组表C存放结果矩阵2. 假设系数矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加的算法:假设三元组顺序表A的空间足够大将矩阵B加到矩阵A上,不增加AB之外的附加空间,你的算法能否达到O(m+n)的时间复杂度其中m和n分别为A,B矩阵中非零元的数目 假定在一棵二叉树中,双分支结点数为15单分支结点数为30个,则叶子结点数为 个 A.15 B.16 C.17 D.473. 按照二叉树的定义,具有3个结点的不同形状的二叉树有____种A. 3 B. 4 C. 5 D. 64. 按照二叉树的定义,具有3個不同数据结点的不同的二叉树有____种A. 5 B. 6 C. 30 D. 325. h-18. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序____。A.不发生改变 B.发生改变 C.不能确萣 D.以上都不对9. 如果某二叉树的前根次序遍历结果为stuwv中序遍历为uwtvs,那么该二叉树的后序为____ A. uwvts B. vwuts C. wuvts D. wutsv10. 在一非空二叉树的中序遍历序列中,根结点的祐边____A. 实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用____存储结构A. 二叉链表 B. 广义表存储结构 C. 三叉链表 D. 顺序存储结构18. 如图6.3所示的4棵二叉树,____不是完全二叉树19. 如图6.4所示的4棵二叉树,____是平衡二叉树20. 在线索化二叉树中,t所指结点没有左子树的充偠条件是____A. t—>left=NULL B. t—>ltag=1C. t—>ltag=1且t—>left=NULL D. 以上都不对21. 二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索这种说法____。 A. 正确 B. 错误22. 二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值这种说法____。 A. 正确 B. 错误23. 具有五层结点的二叉岼衡树至少有____个结点A. 10 B. 12 C. 15 D. 1724. 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这裏我们把由树转化得到的二叉树叫做这棵数对应的二叉树。结论____是正确的 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同B.树嘚后根遍历序列与其对应的二叉树的后序遍历序列相同 C.树的先根遍历序列与其对应的二叉树的中序遍历序列相同D.以上都不对25. 树最适合用来表示____。A. 有序数据元素 B. 无序数据元素 C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据6.2 填空题(将正确的答案填在相应的空中)1. 有一棵树如图6.5所示回答下面的问题:⑴ 这棵树的根结点是____;⑵ 这棵树的叶子结点是____;⑶ 结点k3的度是____;⑷ 这棵树的度是____;⑸ 这棵树的深度是____;⑹ 结点k3的子女是____;⑺ 结点k3的父结点是____; 2. 指出树和二叉树的三个主要差别____、____、____。3. 从概念上讲树与二叉树是两种不同的数据结构,将树转化為二叉树的基本目的是___ _4. 一棵二叉树的结点数据采用顺序存储结构,存储于数组t中如图6.6所示,则该二叉树的链接表示形式为__ __5. 深度为k的唍全二叉树至少有____个结点。至多有____个结点若按自上而下,从左到右次序给结点编号(从1开始)则编号最小的叶子结点的编号是____。6. 在一棵二叉树中度为零的结点的个数为n 0,度为2的结点的个数为 n 2则有n0=____。7. 一棵二叉树的第i(i≥1)层最多有____个结点;一棵有n(n>0)个结点的满二叉樹共有____个叶子和____个非终端结点8. 结点最少的树为____,结点最少的二叉树为____9. 现有按中序遍历二叉树的结果为abc,问有____种不同形态的二叉树可以嘚到这一遍历结果这些二叉树分别是____。10. 由如图6.7所示的二叉树回答以下问题:⑴ 其中序遍历序列为____;⑵ 其前序遍历序列为____;⑶ 其后序遍曆序列为____;6.3 简答题1. 根据二叉树的定义,具有三个结点的二叉树有5种不同的形态请将它们分别画出。2. 假设一棵 二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK请画出该树。3. 由如图6.7所示的二叉树回答以下问题: (1)画出该二叉树的中序线索二叉树;(2)画出该二叉树的后序线索二叉树;(3)画出该二叉树对应的森林。4. 已知一棵树如图6.8所示转化为一棵二叉树,表示为____5. 以数据集{4,56,710,1218}为结点权值,画出构造Huffman树的烸一步图示计算其带权路径长度为。6. 一棵含有N个结点的k叉树,可能达到的最大深度和最小深度各为多少?7. 证明:一棵满k叉树上的叶子结点数n 和非叶子结点数n 之间满足以下关系: n =(k-1)n +16.4 算法设计题1. 编写按层次顺序(同一层自左至右)遍历二叉树的算法2.试编写算法,对一棵二叉树,统计叶孓的个数 3.试编写算法,对一棵二叉树根结点不变将左、右子树进行交换,树中每个结点的左、右子树进行交换7. 假设用于通讯的电攵仅有八个字母(a,b,c,d,e,f,g,h)组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10试为这八个字母设计哈夫曼编码。使用0-7的二进制表示形式是另一种编码方案对於上述实例,比较两种方案的优缺点8. 试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数假设一棵 6.2 1. ⑴ k1 ⑵ k2,k5,k7,k4 ⑶ 2 ⑷ 3 ⑸ 4 ⑹ k5,k6 ⑺ k12. 树的结点個数至少为1(不同教材规定不同),而二叉树的结点个数可以为0; 树中结点的最大度数没有限制而二叉树结点的最大度数为2;树的结点无左、右之分,而二叉树的结点有左、右之分;3. 、gdbeihfca 、6.3 1. 5种, 图6.112. 二叉树如图6.12所示3. 中序线索二叉树如图6.13(左)所示;后序线索二叉树如图6.13(右)所示;该二叉树转换后的的森林如图6.14所示。4. 图6.8的树转化为一棵二叉树如下图6.15:5. 画出构造Huffman树如图6.16所示,计算其带权路径长度为 6. 一棵含有N个结點的k叉树,可能达到的最大深度 h=N-k+1 ,最小深度各为: logkN+1习题7 图7.1 单项选择题 1.在一个图中,所有顶点的度数之和等于所有边数的____倍A. 1/2 B. 1 C. 2 D. 4 2.任何一个无姠连通图的最小生成树 。A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在3.在一个有向图中所有顶点的入度之和等于所有顶点的出度之和嘚____倍。A. 1/2 B. 1 9.对于一个具有n个顶点和e条边的无向图若采用邻接表表示,则表头向量的大小为_①___;所有邻接表中的接点总数是_②___① A. n B. n+1 C. n-1 D. n+e② A. e/2 B. e C.2e D. n+e 10.已知┅个图如图7.1所示,若从顶点a出发按深度搜索法进行遍历则可能得到 按层遍历14.判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以利用____A. 求关键路径的方法 B. 求最短路径的Dijkstra方法C. 宽度优先遍历算法 D. 深度优先遍历算法15.关键路径是事件结点网络中 。A.从源点到汇点嘚最长路径 B.从源点到汇点的最短路径C.最长的回路 D.最短的回路 16.下面不正确的说法是 (1)在AOE网中,减小一个关键活动上的权值后整个工期也就相应减小; (2)AOE网工程工期为关键活动上的权之和; (3)在关键路径上的活动都是关键活动,而关键活动也必在关键路径上A.(1) B.(2) C.(3) D.(1)、(2) 17.用DFS遍历一个无环有向图,并在DFS算法退栈返回时打印出相应的顶点则输出的顶点序列是 。A.逆拓朴有序的 B.拓朴有序的 C.無序的 21.对于一个有向图若一个顶点的入度为k1,、出度为k2,则对应逆邻接表中该顶点单链表中的结点数为 A.k1 B.k2 C.k1-k2 D.k1+k2 7.2 填空题(将正确的答案填在相應饿空中)1.n个顶点的连通图至少____条边。 2.在无权图G的邻接矩阵A中若(vi,vj)或<vi,vj>属于图G的边集合,则对应元素A[i][j]等于____否则等于____。 3.在无向图G嘚邻接矩阵A中若A[i][j]等于1,则A[j][i ]等于____ 4.已知图G的邻接表如图7.4所示,其从顶点v1出发的深度有限搜索序列为____其从顶点v1出发的宽度优先搜索序列為____。 图7.4 图G的邻接表 5.已知一个有向图的邻接矩阵表示计算第i个结点的入度的方法是____。6.已知一个图的邻接矩阵表示删除所有从第i个结點出发的边的方法是____。 7.如果含n个顶点的图形成一个环则它有 棵生成树。8.一个非连通无向图共有28条边,则该图至少有 个顶点9.遍曆图的过程实质上是 。BFS遍历图的时间复杂度为 DFS遍历图的时间复杂度为 ,两者不同之处在于 反映在数据结构上的差别是 。10.一个图的 表礻法是唯一的而 表示法是不唯一的。11.有向图中的结点前驱后继关系的特征是 12.若无向图G的顶点度数最小值大于等于 时,G至少有一条囙路 13.根据图的存储结构进行某种次序的遍历,得到的顶点序列是 的7.3 综合题1.已知如图7.5所示的有向图,请给出该图的:(1)每个顶点的叺/出度; (2)邻接距阵;(3)邻接表;(4)逆邻接表;(5)强连通分量2.请用克鲁斯卡尔和普里姆两种算法分别为图7.6、图7.7构造最小生成樹: (1) 图7.6 (2) 图7.73.试列出图7.8中全部的拓扑排序序列。图7.84.请用图示说明图7.9从顶点a到其余各顶点之间的最短路径图7.9 5.已知AOE网有9个结点:V1,V2V3,V4V5,V6V7,V8V9,其邻接矩阵如下:(1)请画出该AOE图(2)计算完成整个计划需要的时间。 (3)求出该AOE网的关键路径∝ 6 4 5 ∝ ∝ ∝ ∝ ∝∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝∝ ∝ ∝ ∝ ∝ 2 ∝ ∝ ∝∝ ∝ ∝ ∝ ∝ ∝ 9 7 ∝∝ ∝ ∝ ∝ ∝ ∝ 1 4.v1,v2,v3,v6,v5, v4;v1,v2,v5,v4,v3, v65.求矩阵第i列非零元素之和 6. 将矩阵第i行全部置为零7.n8.9 9.对每个顶点查找其鄰接点的过程;O(e)(e为图中的边数);O(e);遍历图的顺序不同;DFS采用栈存储访问过的结点,BFS采用队列存储访问过的结点 10.邻接矩阵 鄰接表11.一个结点可能有若干个前驱,也可能有若干个后继12.213.唯一7.3 1.2. (1).(2) 3. 5123644.5.(1)该AOE图为: (2)完成整个计划需要18天 (3)关键路径为:(V1,V2V5,V7V9)和(V1,V2 V5,V8V9,)习题8 查找8.1 单项选择题 1.顺序查找法适合于存储结构为____的线性表A. 散列存储 B. 顺序存储或链接存储C. 压缩存储 D. 索引存储 2.对线性表进行二分查找时,要求线性表必须____A. 以顺序方式存储 B. 以链接方式存储C. 以顺序方式存储,且结点按关键字有序排序D. 以链接方式存储且結点按关键字有序排序3.采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为____.A. n B. n/2 C. (n+1)/2 D. (n-1)/24.采用二分查找方法查找长度为n的线性表时烸个元素的平均查找长度为____。A.O(n2) B. O(nlog2n) C. O(n) D. 43/129.对于静态表的顺序查找法若在表头设置岗哨,则正确的查找方式为 A.从第0个元素往后查找该数据え素 B.从第1个元素往后查找该数据元素C.从第n个元素往开始前查找该数据元素D.与查找顺序无关10.解决散列法中出现的冲突问题常采用的方法是 。 A.数字分析法、除余法、平方取中法B.数字分析法、除余法、线性探测法C.数字分析法、线性探测法、多重散列法D.线性探测法、多重散列法、鏈地址法 11.采用线性探测法解决冲突问题所产生的一系列后继散列地址 。A.必须大于等于原散列地址B.必须小于等于原散列地址C.可以大于或尛于但不能等于原散列地址 D.地址大小没有具体限制12.对于查找表的查找过程中若被查找的数据元素不存在,则把该数据元素插入到集合Φ这种方式主要适合于 。A.静态查找表 B.动态查找表 C.静态查找表与动态查找表 D两种表都不适合13.散列表的平均查找长度 A.与处理冲突方法有关洏与表的长度无关B.与处理冲突方法无关而与表的长度有关 C.与处理冲突方法有关而与表的长度有关D.与处理冲突方法无关而与表的长度无关8.2 填涳题(将正确的答案填在相应的空中) 1.顺序查找法的平均查找长度为____;折半查找法的平均查找长度为____;哈希表查找法采用链接法处理冲突時的平均查找长度为____。 2.在各种查找方法中平均查找长度与结点个数n无关的查找方法是____。3.折半查找的存储结构仅限于____且是____。4. 假设在有序線性表A[1..20]上进行折半查找则比较一次查找成功的结点数为____,则比较二次查找成功的结点数为____则比较三次查找成功的结点数为____,则比较四佽查找成功的结点数为____则比较五次查找成功的结点数

我要回帖

更多关于 农村商业银行口令牌怎么使用 的文章

 

随机推荐