第一篇:软件测试实验(Eclemma)
软件测试实验报告
专 业 : 学 号 : 姓 名 :
任课老师 :
代码覆盖工具使用(Eclemam)
1、开发工具
Eclipse、JUnit、Eclemma开源工具
2、实验目的
1)安装Eclemma插件
2)熟练掌握Eclemma的插件用法
3、实验要求
查阅Triangle类的覆盖率是否达到100%,若未达到100%,通过添加测试用例,使之达到100%。
4、实验结果
5、心得体会
在测试实验前,我以为不会难做。就像以前的物理实验一样,做做实验,做过之后交一份实验报告就好了。直到做实验的时候我才知道其实并不容易做,但是学到的知识与实验的难度成正比,这使我受益匪浅。
在做实验之前一定要将课本上的知识吃透,因为这是实验的基础,否则,在老师讲解实验的时候就会听不懂,这将增加实验的难度,浪费时间。同时在做实验时老师还会给我们讲一些自己的亲身体会和老师们在做的时候遇到的问题以及会将一些课本上没有的知识告诉我们使我们对这门课的了解更加深入。
通过这次实验,我学到不少实用的知识,更重要的是,做实验的过程,思考问题的方法与其他实验的方法是相通的,真正使我受益匪浅。
第二篇:软件测试实验一
软件测试实验报告--实验一
班级:软件1603
一、实验题目
软件测试实验环境搭建
二、实验内容
搭建开发环境 导入目标源码 成功编译并运行
三、实验步骤
1.下载安装jdk和netbean 2.安装mysql数据库和客户端navicat(机器已安装)登createtables.sql添加数据库 机房mysql的密码:111111 root@localhost在schadmin上有所有权限 3.导入工程文件
1解压myapp到一个非中文路径,如解压到D:myapp.2运行netbean.3导入程序myapp, “新建工程”->javaWeb,基于已有源代码,然后下一步选择服务器,选择Glassfish v3+,点击“下一步”,然后点击 安装位置后的“浏览”按钮,选择“c:Program Filesglassfish-3.1.2.2”,点击下一步,点击完成。4修改数据库连接配置.连接请修改;web/WEB-INF/classes/config.properties com.ustc.util.config_en.properties
陆确并
参
考保
学号:201616040305
姓名:赵亮
指导老师:王雪涛
4.编译运行并通过浏览器访问,用户名:admin 密码:pass111登陆,实验各项功能使得均能正常使用
四、实验结果
五、实验的心得体会
以前就挺喜欢接触这类知识,感觉挺好玩,前期确实有很多地方就卡死了,经过讨论询问顺利解决。
第三篇:软件测试与质量保证实验指导
实验一.NET软件调试及测试计划
一、实验目的
通过本实验,熟悉.NET软件调试环境与技巧及测试计划的内容,并掌握测试计划的制定过程,能够针对具体项目完成测试策略的制定、测试人员的安排、测试进度安排、测试资源组织等工作。
二、实验内容
1.掌握.NET软件调试环境与调试技巧。基本内容如下:
一、学习附件一的内容,掌握调试技巧;
二、学习c# 中跟踪和调试的技巧-------如何使用 Debug
2.研究给定项目的需求规格说明书,提取测试需求,按照小组的人员情况,安排测试进度,为每一阶段的测试选定测试方法,最后按照给定的测试计划书模版生成完整的测试计划书。
项目需求规格说明书及测试计划模版由教师给出(见相关附件)。
(http://blog.csdn.net/zhouhuozhi/archive/2009/05/14/4180605.aspx)
三、实验要求
1、做好实验预习,掌握,并熟悉本实验中所使用的测试环境及相应的测试软件。
2、写出实验报告,内容是:
(1)实验日期(2)实验题目(3)实验内容
(4)实验结果,包括测试用例,代码清单、测试结果分析和心得体会。
3、本实验以小组为单位,每组上交一篇报告,报告的名称要包括组内人员的姓名。
四、实验学时
本实验需要2学时。
注:实验二与实验三任选一个做;实验四与实验五任选一个做
实验二 单元测试
一、实验目的
通过本实验,熟悉单元测试的目的、内容,并掌握黑盒单元测试的基本方法,能够按照具体要求对指定的程序设计测试用例并进行单元测试。
二、实验内容
1、黑盒单元测试(二选一)
(1)等价类划分法
三角形问题的需求规格描述如下:
输入三个整数a、b、c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形、等腰三角形、一般三角形(特殊的还有直角三角形),以及构不成三角形。
现在要求输入三个整数a、b、c,必须满足以下条件:
条件1 1≤a≤100 条件2 1≤b≤100 条件3 1≤c≤100 条件4 a
1、条件2和条件3,程序给出“边的取值超出允许范围”的信息。
如果输入值a、b、c 满足条件
1、条件2和条件3,则输出下列四种情况之一:(1)如果不满足条件
4、条件5和条件6中的一个,则程序输出为“非三角形”。(2)如果三条边相等,则程序输出为“等边三角形”。(3)如果恰好有两条边相等,则程序输出为“等腰三角形”。(4)如果三条边都不相等,则程序输出为“一般三角形”。针对此需求:
1、自己编写程序实现,程序语言不限,并要求在实验前完成;
2、分析该程序的输入,建立等价类划分表,并根据等价类表设计测试用例;
3、根据边界值条件设计不少于10组的测试用例;
4、用所有测试用例对程序进行测试,记录每组测试用例对应的输出结果,并对结果进行分析;
5、确定是否存在bug,如果存在bug,分析其原因并调试修复。(2)因果图法
有一个饮料的自动售货机,其规格说明如下:投入相应的钱数,然后按下相应饮料的按钮,如果钱数不够,则给出信息“投入钱数不够!请继续投入!”,如果金额够,就给出饮料,并找零。如果机器内该饮料已经售完,则提示“该饮料已经售完!”,如果不再买其它的饮料则退钱。如果光投入钱没有选择饮料,则给出提示“请选择饮料!”,如果没有投钱就选择饮料,也会给出提示。(本程序由教师给出)分析该需求中的原因和结果,列出来; 画出因果图;
根据因果图生成判定表(决策表); 根据判定表设计测试用例;
运用测试用例对程序进行测试,并记录测试结果;
6、提交实验报告,报告内容如下:实验题目、实验目的、实验内容、程序清单、测试用例、测试结果、结果分析、心得体会。
三、实验要求
1、做好实验预习,提前编写相关程序,并设计测试用例。
2、写出实验报告,内容是:
(1)实验日期(2)实验题目(3)实验内容
(4)实验结果,包括测试用例,代码清单、测试结果分析和心得体会。
3、本实验以小组为单位,每组上交一篇报告,报告的名称要包括组内人员的姓名。
四、实验学时
本实验需要4学时。
实验三 单元测试
一、实验目的
通过本实验,熟悉单元测试的目的、内容,并掌握白盒单元测试及面向对象的单元测试的基本方法,能够按照具体要求对指定的程序设计测试用例并进行单元测试。
二、实验内容
1、白盒单元测试(二选一)
(1)对实验二中编写的三角形程序,画出其程序流程图;分析程序流程图,确定程序分支;
(2)设计分别满足语句覆盖、路径覆盖、条件覆盖及条件组合覆盖和路径覆盖的测试用例;
(3)用测试用例对程序进行测试,记录测试结果,并对结果进行分析,如果存在缺陷则修改程序,继续测试;
2、面向对象的单元测试
对给定的类设计桩程序或驱动程序,设计测试用例,对其进行单元测试。
三、实验要求
1、做好实验预习,提前编写相关程序,并设计测试用例。
2、写出实验报告,内容是:
① 实验目的
② 实验内容
③ 实验结果,包括测试用例,代码清单、测试结果分析和心得体会。
3、上报实验源代码(或测试脚本、测试结果文件、测试报告),本实验以小组为单位,每组上交一篇报告,报告的名称要包括组内人员的姓名。
四、实验学时
本实验需要4学时。
实验四 集成测试
一、实验目的
通过本实验,熟悉集成测试的目的、内容,并掌握自底向上和自顶向下集成测试的基本方法,能够按照具体要求对指定的程序设计测试用例并按要求进行集成测试。
二、实验内容
自选一个包含多个模块的程序,完成以下工作: *
1、编写辅助程序
2、自底向上集成
三、实验要求
1、做好实验预习,提前编写相关程序,并设计测试用例。
2、写出实验报告,内容是:
① 实验目的。② 实验内容
③ 实验结果,包括测试用例,代码清单、测试结果分析和心得体会。
3、上报实验源代码(或测试脚本、测试结果文件、测试报告),本实验以小组为单位,每组上交一篇报告,报告的名称要包括组内人员的姓名。
四、实验学时
本实验需要4学时。
实验五 系统功能测试
一、实验目的
通过本实验,熟悉系统功能测试的目的、内容,并掌握功能测试基本方法,能够功能规格说明对指定的系统设计测试用例并进行测试。
二、实验内容
对指定的系统,参照系统功能设计测试用例,并进行功能测试,记录测试结果。计算器程序功能测试
给定简单四则运算计算器系统由两个窗体构成,一个是计算窗体,一个是帮助信息窗体。该系统的主要功能是进行十进制的二元加、减、乘、除运算。
系统需求描述如下:四则运算计算器计算用户输入的两个数字的计算结果,要求既能用鼠标点击文本框和命令按钮,也可以脱离鼠标,完全用键盘操作。当用户输入的内容不是合法的数字时,要求程序能给出提示。当用户进行除法运算,并且输入“0“作为分母时,要求程序能给出相应的错误提示。当用户以任何顺序输入数据时,要求程序都能计算出正确结果。当用户完成一次计算后,即可以不清除就再次输入数据,也可以按“清除”键后再输入运算数。要为用户提供帮助功能,用户可以通过点击计算窗体中的帮助按钮进入帮助窗体。在计算窗体中,按返回按钮应退出系统。
三、实验要求
1、做好实验预习,提前编写相关程序,并设计测试用例。
2、写出实验报告,内容是:
① 实验目的② 实验内容
③ 实验结果,包括测试用例,代码清单、测试结果分析和心得体会。
3、上报实验源代码(或测试脚本、测试结果文件、测试报告),本实验以小组为单位,每组上交一篇报告,报告的名称要包括组内人员的姓名。
四、实验学时
本实验需要4学时。
第四篇:软件测试(推荐)
一、简答5*6’
1.为什么不让时间有余的人做测试工作
表面上看这体现了管理的效率和灵活性,但实际上也体现了管理者对测试的轻视。测试和测试的人有很大关系。测试工作人员应该是勤奋并富有耐心,善于学习、思考和发现问题,细心有条理,总结问题,如果具备这样的优点,做其它工作同样也会很出色,因此这里还有一个要求,就是要喜欢测试这项工作。2.软件测试风险主要体现在哪里
我们没有对软件进行完全测试,实际就是选择了风险,因为缺陷极有可能存在没有进行测试的部分。因此,我们要尽可能的选择最合适的测试量,把风险降低到最小 3.所有软件测试缺陷都需要修复吗
从技术上讲,所有的软件缺陷都是能够修复的,但是没有必要修复所有的软件缺陷。测试人员要做的是能够正确判断什么时候不能追求软件的完美。对于整个项目团队,要做的是对每一个软件缺陷进行取舍,根据风险决定那些缺陷要修复。发生这种现象的主要原因如下:-没有足够的时间资源。在任何一个项目中,通常情况下开发人员和测试人员都是不够用的,而且在项目中没有预算足够的回归测试时间,修改缺陷可能引入新的缺陷。
-有些缺陷只是特殊情况下出现,这种缺陷处于商业利益考虑,可以在以后升级中进行修复。-不是缺陷的缺陷。我们经常会碰到某些功能方面的问题被当成缺陷来处理,这类问题可以以后有时间时考虑再处理。缺陷是否修改要由软件测试人员、项目经理、程序员共同讨论来决定是否修复,不同角色的人员从不同的角度来思考,以做出正确的决定。4.如何减少测试人员跳槽带来的损失 建议我们从以下两个方面做起:
-加强部门内员工之间的互相学习,互相学习是建立学习型组织的基本要求,是知识互相转移的过程。在此基础上,可以把个人拥有的技术以知识的形式沉积下来,也就完成了隐性知识到显性知识的转化。
-管理者就应该把员工的个人成长和企业的发展联系起来,为员工设定合理发展规划并付诸实现。
5.验收测试的注意点有哪些 测试要注意下面的事项:
(1)用户现场测试不可能测试全部功能,因此要测试核心功能。这需要提前做好准备,这些核心功能一定要预先经过测试,证明没有问题才可以和用户共同进行测试。测试核心模块的目的是建立用户对软件的信心。当然如果这些模块如果问题较多,不应该进行演示。(2)如果某些模块确实有问题,我们可以演示其它重要的业务功能模块,必要时要向用户做成合理的解释。争得时间后,及时修改缺陷来弥补。(3)永远不能欺骗用户,蒙混过关。6.完全测试程序是可能的吗
实际上完全测试是不可能的。主要有以下原因:-完全测试比较耗时,时间上不允许;
-完全测试通常意味着较多资源投入,这在现实中往往是行不通的;-输入量太大,不能一一进行测试;-输出结果太多,只能分类进行验证;-软件实现途径太多;
-软件产品说明书没有客观标准,从不同的角度看,软件缺陷的标准不同;因此测试的程度要根据实际情况确定 7.是不是发现的缺陷越多就说明软件缺陷越多 其中的原因主要如下:
-代码复用、拷贝代码导致程序员容易犯相同的错误。类的继承导致所有的子类会包含基类的错误,反复拷贝同一代码意味可能也复制了缺陷。-程序员比较劳累是可以导致某些连续编写的功能缺陷较多。
“缺陷一个连着一个”不是一个客观规律,只是一个常见的现象。如果软件编写的比较好,这种现象就不常见了。测试人员只要严肃认真的测试程序就可以了。8.软件测试就是QA吗
软件测试人员的职责是尽可能早的找出软件缺陷,确保得以修复。而质量保证人员(QA)主要职责是创建或者制定标准和方法,提高促进软件开发能力和减少软件缺陷。测试人员的主要工作是测试,质量保证人员日常工作重要内容是检查与评审,测试工作也是测试保证人员的工作对象。软件测试和质量是相辅相成的关系,都是为了提高软件质量而工作。9.测试产品和测试项目区别
习惯上把开发完成后进行商业化、几乎不进行代码修改就可以售给用户使用的软件成为软件产品,也就是可以买“卖拷贝”的软件,软件项目是一种个性化的产品,可以是按照用户要求全部重新开发,也可以修改已有的软件产品来满足特定的用户需求。项目和产品的不同特点,决定我们测试产品和测试项目仍然会有很多不同的地方:
-质量要求不同。通常产品的质量要高一些,修复发布后产品的缺陷成本较高,甚至会带来很多负面的影响。而做项目通常面向某一用户,虽然质量越高越好,但是一般只要满足用户要求就可以了。测试资源投入多少不同。做软件产品通常是研发中心来开发,进度压力要小些。同时由于质量要求高,因此会投入较多的人力、物力资源。项目最后要和用户共同验收测试,这是产品测试不具有的特点。此外,测试产品与测试项目在缺陷管理方面、测试策略制定都会有很大不同,测试管理者应该结合具体的环境,恰如其分的完成工作 10.如何编写提交给用户的测试报告
测试报告一般分为内部测试报告和外部测试报告。内部报告是我们在测试工作中的项目文档,反映了测试工作的实施情况,一般外部测试报告要满足下面几个要求:
根据内部测试报告进行编写,一般可以摘录;不可以向客户报告严重缺陷,即使是已经修改的缺陷,开发中的缺陷也没有必要让客户知道;报告上可以列出一些缺陷,但必须是中级的缺陷,而且这些缺陷必须是修复的;报告上面的内容尽量要真实可靠;整个测试报告要仔细审阅,力争不给项目带来负面作用,尤其是性能测试报告。总之,外部测试报告要小心谨慎的编写。
二、论述2*12’
1.请论述为什么要进行软件测试,并列举历史上2~3个著名软件测试(缺陷)案例,说明测试重要性
软件测试的目的,第一是确认软件的质量,其一方面是确认软件做了你所期望做的事情(,另一方面是确认软件以正确的方式来做了这个事情。第二是提供信息,比如提供给开发人员或程序经理的回馈信息,为风险评估所准备的信息。第三软件测试不仅是在测试软件软件产品本身,而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题,这说明此软件开发过程很可能是有缺陷的。因此,软件测试的第三个目的是保证整个软件开发过程是高质量的。
爱国者导弹防御系统把“枪口”对准了自己人 美国迪斯尼公司的狮子王游戏软件的兼容性问题 售票系统性能问题
2.论述软件测试科学的发展历程 1957年之前-调试为主 20世纪50年代,计算机刚诞生不久,只有科学家级别的人才会去编程,需求和程序本身也远远没有现在这么复杂多变,相当于开发人员一人承担需求分析,设计,开发,测试等所有工作,当然也不会有人去区分调试和测试。
1957–1978-证明为主 当时计算机应用的数量,成本和复杂性都大幅度提升,随之而来的经济风险也大大增加,测试就显得很有必要了,这个时期测试的主要目就是确认软件是满足需求的,也就是我们常说的“做了该做的事情”。
1979–1982-破坏为主 我们不仅要证明软件做了该做的事情,也要保证它没做不该做的事情,这会使测试更加全面,更容易发现问题。
1983–1987-评估为主 人们提出了在软件生命周期中使用分析,评审,测试来评估产品的理论。软件测试工程在这个时期得到了快速的发展.1988–至今-预防为主 预防为主是当下软件测试的主流思想之一。测试不是在编码完成后才开始介入,而是贯穿于整个软件生命周期。3.论述软件缺陷的由来
软件缺陷的产生主要是由软件产品的特点和开发过程决定的。
软件本身:①需求不清晰,导致设计目标偏离客户的需求,从而引起功能或产品特征上的缺陷。②系统结构非常复杂,而又无法设计成一个很好的层次结构或组件结构,结果导致意想不到的问题或系统维护、扩充上的困难;即使设计成良好的面向对象的系统,由于对象、类太多,很难完成对各种对象、类相互作用的组合测试,而隐藏着一些参数传递、方法调用、对象状态变化等方面问题。③对程序逻辑路径或数据范围的边界考虑不够周全,漏掉某些边界条件,造成容量或边界错误。④对一些实时应用,要进行精心设计和技术处理,保证精确的时间同步,否则容易引起时间上不协调,不一致性带来的问题。⑤没有考虑系统崩溃后的自我恢复或数据的异地备份、灾难性恢复等问题,从而存在系统安全性、可靠性的隐患。⑥系统运行环境的复杂,不仅用户使用的计算机环境千变万化,包括用户的各种操作方式或各种不同的输入数据,容易引起一些特定用户环境下的问题;在系统实际应用中,数据量很大。从而会引起强度或负载问题。⑦由于通信端口多、存取和加密手段的矛盾性等,会造成系统的安全性或适用性等问题。⑧新技术的采用,可能涉及技术或系统兼容的问题,事先没有考虑到。
团队工作:系统需求分析时对客户的需求理解不清楚,或者和用户的沟通存在一些困难。不同阶段的开发人员相互理解不一致。对于设计或编程上的一些假定或依赖性,相关人员没有充分沟通。项目组成员技术水平参差不齐技术问题。算法错误:在给定条件下没能给出正确或准确的结果。语法错误:对于编译性语言程序,编译器可以发现这类问题;但对于解释性语言程序,只能在测试运行时发现。计算和精度问题:计算的结果没有满足所需要的精度。系统结构不合理、算法选择不科学,造成系统性能低下。接口参数传递不匹配,导致模块集成出现问题。
项目管理的问题:缺乏质量文化,不重视质量计划,对质量、资源、任务、成本等的平衡性把握不好,容易挤掉需求分析、评审、测试、等时间,遗留的缺陷会比较多。系统分析时对客户的需求不是十分清楚,或者和用户的沟通存在一些困难。开发周期短,需求分析、设计、编程、测试等各项工作不能完全按照定义好的流程来进行,工作不够充分,结果也就不完整、不准确,错误较多;周期短,还给各类开发人员造成太大的压力,引起一些人为的错误。开发流程不够完善,存在太多的随机性和缺乏严谨的内审或评审机制,容易产生问题。文档不完善,风险估计不足等。4.软件测试V模型
①绘制示意图
②阐述每个步骤是做什么 需求分析
即首先要明确客户需要的是什么,需要软件作成什么样子,需要有那几项功能
概要设计
主要是架构的实现,指搭建架构、表述各模块功能、模块接口连接和数据传递的实现等项事务。详细设计
对概要设计中表述的各模块进行深入分析,对各模块组合进行分析等。软件编码
按照详细设计好的模块功能表,编程人员编写出实际的代码。单元测试
按照设定好的最小测试单元进行按单元测试,主要是测试程序代码,为的是确保各单元模块被正确的编译,单元的具体划分按不同的单位与不同的软件有不同。集成测试
经过了单元测试后,将各单元组合成完整的体系,主要测试各模块间组合后的功能实现情况,以及模块接口连接的成功与否,数据传递的正确性等,其主要目的是检查软件单位之间的接口是否正确。根据集成测试计划,一边将模块或其他软件单位组合成系统,一边运行该系统,以分析所组成的系统是否正确,各组成部分是否合拍。系统测试
经过了单元测试和集成测试以后,我们要把软件系统搭建起来,按照软件规格说明书中所要求,测试软件其性能功能等是否和用户需求相符合,在系统中运行是否存在漏洞,等。验收测试
主要就是用户在拿到软件的时候,在使用现场,会根据前边所提到的需求,以及规格说明书来做相应测试,以确定软件达到符合效果的。
第五篇:软件实验
《软件技术基础》实验报告
实验一:
顺序表的操作
班 级
0801210 学 号
2012212982 姓 名
蒲米
栈,然后编写进栈和出栈的操作,读取栈顶元素。这里栈有顺序栈和链式栈两种,顺序栈是利用一种动态存储的数组定义,而链式栈是一个无头节点,只是在头部插入和删除元素的单链表。使用顺序栈要先为存储元素的数组申请一个空间,然后编写进栈和出栈取栈顶元素的操作。#include
printf(“此栈表已满”);pst->top++;pst->st[pst->top]=x;} void pop(struct stack *pt,int *p){ if(pt->top==-1)
printf(“此栈表为空”);*p=pt->st[pt->top];pt->top--;} void main(){ struct stack T;struct stack *t=&T;int a[n];int i;printf(“请输入数组的值:”);for(i=0;i<5;i++){
scanf(“%d”,&a[i]);} T.top=-1;for(i=0;i<5;i++)
push(t,a[i]);for(i=0;i<5;i++){
pop(t,&a[i]);
printf(“%dn”,a[i]);
}
}
四、算法。
顺序栈的算法:
1、顺序栈的初始化。
2、进栈操作
3、出栈操作
4、取栈顶元素。链式栈的算法:
1、进栈操作
若栈不满,则在栈顶插入元素x作为新的栈顶。
2、出栈操作
若栈不空,则删除栈顶的元素,用e返回其值。
五、实验心得体会:
通过本次实验我学习了栈这种特殊形式的线性表,就是只能从一端进行操作,逻辑和一般的线性表相同,只是元素的操作方式不同。
实验五:
队列的操作
一、实验目的:
掌握队列的定义及其运算,了解队列的应用。
二、实验内容:
1、掌握队列的特点及常见算法。
2、队列测试和应用。要求:
设计一个主函数对循环队列代码进行测试。测试方法为:依次把数据元 素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。
三、实验思路:
使用队列的时候要创建一个空队列,这里队列可以分为两种存储方式,顺序存储和链式存储,顺序存储顾名思义它的存储数据方式是连续存储的,而链式存储则是不连续的,队头和队尾定义两个指针,通过指针来操作队列。先创建一个含有头结点的空的链队列,建立头结点,在队尾插入结点后建立好队尾指针,判断队列是否为空,然后编写出队列的功能函数。
#include
{ if(rst->len==n)
printf(“此队列已满”);else {
rst->rear=(rst->rear+1)%n;
rst->data[rst->rear]=x;} } int out(struct nobe *rst){ int x;if(rst->len==0)
printf(“此队列为空”);else {
rst->front=(rst->front+1)%n;
x=rst->data[rst->front];} return x;}
首先建立一个结构体包含数据域与指针域,然后编写队列的入队与出队操作,最后编写主函数,在主函数调用入队与出队操作,实现程序的编程。
四、算法。队列的算法:
1、入队操作。
若队列不满,则在队尾插入元素x作为新的队尾。
2、出队操作。
3、若队列不空,则删除队头元素的值。链队列的算法
1、链队列初始化
建立一个含有头结点的空的链队列。
2、求队列的长度
返回队列的元素个数,即队列的长度。
3、入队列操作
插入元素x作为队列新的队尾元素。
4、出队列操作
若队列不空,则删除队头元素,用e返回其值。
五、实验心得体会:
队列和栈一样是一种特殊形式的线性表,队列不同与栈的是它可以在一端插入,另一端删除。
实验六: 二叉树的生成与遍历
一、实验目的:
1、熟悉二叉树节点的定义和生成方式;
2、熟悉二叉树链式结构的生成方式;
3、掌握二叉树遍历算法的实现。
二、实验内容:
1.设计实现二叉树的建立及遍历算法,要求:
(1)编写创建二叉链式存储结构的二叉树程序并输出。
(2)编写递归实现二叉树的先序、中序、后序遍历算法。(3)编写主函数测试以上二叉树的创建和遍历函数。
2.假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子
结点的统计并输出统计个数。
三、实验思路:
首先建立一个结构体包含数据域,左右子树的指针三个数据元素,这里左子树和右子树分别为某一结点指向其左子树和右子树的指针。对于叶子结点或者新生成的结点,它的左子树和右子树的指针都是空值。定义二叉树结构体变量,然后编写二叉树的输入和先序、中序、后序遍历算法,最后编写主函数,在主函数中初始化二叉树长度为零,输入二叉树的各个元素,再调用二叉树的先序、中序、后序遍历操作,输出二叉树,实现程序的编程。
四、算法。
1.二叉树的建立:
二叉树的遍历算法需要先建立二叉树,二叉树的建立需要建立栈和数组
栈和数组的建立:
typedef struct node
/*结点定义*/ {
char
data;
struct node * lchild, * rchild;} BinTreeNode;
typedef struct{ //栈的定义
BinTreeNode * ptr;int tag;}StackNode;
二叉树的建立:
BinTreeNode * CreateBinTree(BinTreeNode * Tree)/*,按先序序列建立二叉树,输入并建立一棵二叉树Tree*/ {
char c;scanf(“%c”,&c);if(c=='&')Tree = NULL;else {
Tree=(BinTreeNode *)malloc(sizeof(BinTreeNode));
Tree->data=c;
Tree->lchild= CreateBinTree(Tree->lchild);
Tree->rchild= CreateBinTree(Tree->rchild);
}
return(Tree);}
2.先序遍历
先序遍历的递归算法:
/*二叉树的先序遍历*/ void PreOrder(BinTreeNode *T){ if(T!= NULL)
{
printf(“%c”,T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
} } 先序遍历的非递归算法:
/*二叉树的先序遍历的非递归算法*/ void PreOrderTwo(BinTreeNode *T){
BinTreeNode *p,*S[Max];
int top=-1;
p=T;
/*初始化*/
do
{
while(p!= NULL)
{
printf(“%c”,p->data);
top++;S[top]=p;
p=p->lchild;
}
if(top >-1)/*栈非空*/
{
p=S[top];top--;/*取栈顶元素,出栈*/
p = p->rchild;
}
}while((p!= NULL)||(top>-1));
}
3、中序遍历:
void InOrder(BinTreeNode*t){
if(t){
InOrder(t—>leftchild);
Visit(t);
InOrder(t—>rightchild);
} }
4、后序遍历:
void PostOrder(BinTreeNode*t){
if(t){
PostOrder(t—>leftchild);
PostOrder(t—>rightchild);
visit(t);
} }
五、实验心得体会:
二叉树是一种非线性的数据存储结构,描述的是结点一对多的关系,这种结构最常用,最适合的描述方法是用链表的形式。每个结点都包含一个数据域和两个指针域。
实验七: 查找算法的实现
一、实验目的:
掌握各种查找算法的特点,测试并验证查找常见算法。
二、实验内容:
1.建立有序表,采用折半查找实现某一已知的关键字的查找。
2.利用折半查找算法在一个有序表中插入一个元素,并保持表的有序性。
三、实验思路:
#include
int search(int x,int data[],int n){ int low,high,mid;low=0;high=n-1;while(low<=high){
mid=(low+high)/2;
if(data[mid]=x)
return(mid+1);
else
if(data[mid]>x)
high=mid-1;
else
low=mid+1;} return 0;}折半查找法首先定义一个一维数组表示有序表,查找的思路是将给定的数据与有序表中间位置的元素做比较,若两者相等则查找成功,若前者小于后者,则在中间位置左边的元素中继续查找;若前者大于后者,则在中间位置右边的元素中继续查找。重复这个步骤直到查找成功。然后编写折半查找法的算法和利用折半查找法插入元素的算法,最后编写主函数,在主函数中输入有序表的元素,再调用折半查找法的查找和插入操作,保持有序表的有序性并输出,实现程序的编程。
四、算法。
1、设置查找区间初值,设下界low=0,设上界high=length—1。
2、若low<=high,则计算中间位置mid=(low+high)/2.3、若key 若key>data[mid],则设low=mid+1并继续执行步骤2; 若key=data[mid]则查找成功,返回目标元素位置mid+1(位置从1计数)。 4、若当low=high时,key!=data[mid]则查找失败,返回0.四、实验心得体会: 折半查找法是对一个有序表进行折中查找,首先对表进行排序,则查找起来就会事半功倍。这种查找的算法直观,形象,便于使用。 实验八: 排序综合实验 一、实验目的: 参照各种排序算法程序样例,验证给出的排序常见算法。 二、实验内容: 输入一组关键字序列分别实现下列排序,并将上述几种排序的算法编写成菜 单,根据输入的数字不同执行对应的排序算法(任选两种排序方法实现)。 1、直接插入排序。 2、冒泡排序。 3、直接选择排序。 4、快速排序。 三、实验思路: 首先编写直接插入排序法和冒泡排序法,然后编写主函数,在主函数中定义一个一维数组用来记录数据,再编写一个菜单用来选择排序方法,最后调用直接插入排序法和冒泡排序法等操作,使用循环结构实现程序的反复执行直到退出为止。 四、算法。 直接插入排序算法void insort(int p[],int n){ int i,j,temp;for(i=1;i temp=p[i]; j=i; while(j>0&&temp { p[j]=p[j-1]; j--; } p[j]=temp;} } 冒泡排序算法void bublesort(int v[],int n){ int i,j,temp;for(i=1;i for(j=0;j { if(v[j]>v[j+1]) { temp=v[j]; v[j]=v[j+1]; v[j+1]=temp; } } } } 简单选择排序法void Select_Sort(datatype R[ ],intn){ /*对排序表R[1].....R[n]进行冒泡排法,n是记录个数*/ for(i=1;i