数据结构课实训报告报告
数据结构课程实训报告

数据结构课程实训报告设计题目:( 1 )基础题:5. 统计顺序串S中每一种字符出现的次数。
( 2 )综合题:1. 内部排序演示2. 校园导游咨询专业:班级:学生:学号:指导教师:起止时间:********学院2010 年 6 月第一章需求分析1.1 输入/输出形式和输出值的范围(1)字符串S可为任意英文字符,长度限定在99999以内。
最多输入128种不同的字符。
(2)内部排序问题中,输入的待排序数据,必须都是为整形数。
此程序中设定了待排序数据为10个。
如要修改,可在主函数(main)中将m.length改成你所需要的数据个数即可。
主菜单选择对应功能时,可以输入任意数字,会有不同的结果。
(3)校园导游咨询程序。
其才主菜单中只能输入整形数据,并且只能是1~4之间的数,否则将无法实现其对应的功能。
在景点信息查询以及路经查询中也只能输入数字0~9;1.2 程序功能(1)基础题:5、编写程序,统计顺序串S中每一种字符出现的次数。
在在这个问题中,可由操作者自己输入字符串。
系统会对输入的数据进行判断,将其字符串进行排序,把相同的字符放在一起。
并且以ASCII码的顺序进行排序。
能让我们很直观地验证结果的正确性,系统最后会输出每一种字符出现的次数。
(2)内部排序演示。
这个程序编写了多个函数,去实现对应的功能,分别是那六种排序方法,以及统计其在排序过程中,关键字所比较的次数,以及移动的次数。
在此程序中,提供了操作人员自我选择的空间,可以自行选择所要的排序方法。
也能选择重新输入待排序的数据,或者退出。
当输入错误的时候,程序会提醒操作人员进行重新输入。
(3)校园导游咨询。
编写此程序,让我们能够通过此程序查询到校园景点的相关信息,为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
1.3 测试数据1.3.1正确的输入及输出结果。
(1)字符串S问题;1.首先输入待统计的字符串,并对输入的数据进行排序。
数据结构实验实训报告范文

一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。
2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。
3. 培养动手实践能力,提高编程水平。
二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。
数据机构实训总结报告

一、引言随着计算机科学技术的不断发展,数据结构作为计算机科学的核心基础课程,对于提高计算机程序设计能力和算法优化具有重要意义。
为了提高我们的数据结构理论知识和实际应用能力,我们进行了为期一个月的数据结构实训。
本次实训内容丰富,形式多样,通过实践操作,我们掌握了各种数据结构的特点、实现方法及应用场景,现将实训总结如下。
二、实训内容1. 数据结构理论学习实训期间,我们重点学习了以下数据结构:(1)线性结构:线性表、栈、队列、双端队列。
(2)非线性结构:树、二叉树、图。
(3)高级数据结构:哈希表、散列表、字典树、并查集。
2. 数据结构实现与算法分析实训中,我们运用C++、Java等编程语言实现了上述数据结构,并对关键算法进行了分析,包括:(1)线性结构:插入、删除、查找、排序等。
(2)非线性结构:遍历、查找、插入、删除、路径查找等。
(3)高级数据结构:查找、插入、删除、合并等。
3. 数据结构应用案例分析实训过程中,我们结合实际案例,分析了数据结构在计算机科学、人工智能、数据库、网络通信等领域的应用,如:(1)线性结构在操作系统进程管理中的应用。
(2)树和图在社交网络、网络拓扑结构中的应用。
(3)哈希表在数据库索引、缓存中的应用。
三、实训成果1. 提高数据结构理论水平通过本次实训,我们对数据结构的基本概念、特点、实现方法有了更加深入的了解,为今后的学习和工作打下了坚实的基础。
2. 增强编程能力在实训过程中,我们动手实现了各种数据结构,提高了编程能力,学会了如何将理论知识应用于实际编程。
3. 提升算法分析能力通过对关键算法的分析,我们学会了如何分析算法的时间复杂度和空间复杂度,为今后的算法优化提供了理论依据。
4. 培养团队协作精神在实训过程中,我们分组合作,共同完成了实训任务,培养了团队协作精神。
四、实训心得1. 理论与实践相结合在实训过程中,我们深刻体会到理论联系实际的重要性。
只有将理论知识与实际编程相结合,才能真正掌握数据结构。
数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实习总结报告

数据结构实习总结【篇一:数据结构实训总结】这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
从刚开始得觉得很难,到最后把这个做出来,付出了很多,也得到了很多,以前总以为自己对编程的地方还不行,现在,才发现只要认真做,没有什么不可能。
编程时要认真仔细,出现错误要及时找出并改正,(其中对英语的要求也体现出来了,因为它说明错误的时候都是英语)遇到问题要去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听其对你的程序的建议,在他们不知道程序怎么写的时候完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当局者迷旁观者清,把各个注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,要注意符号的使用,注意对字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意指针的初始化不管它怎么用以免不必要麻烦。
通过近两周的学习与实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论的很好的连接。
特别是本组所做的题目都是课堂上所讲的例子,在实行之的过程中并不是那么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知此事要躬行。
实训过程中让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人做事风格。
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计,通过用for 的多重循环,舍弃多余的循环,提高了程序的运行效率。
数据结构的实训报告结果

一、实训目的本次数据结构实训旨在通过实践操作,加深对数据结构理论知识的理解,提高解决实际问题的能力。
通过实训,使学生能够熟练掌握各种基本数据结构及其操作方法,并能够将这些知识应用于解决实际问题。
二、实训环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。
1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。
通过编写代码,实现了链表的插入、删除和查找操作。
在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。
通过查阅资料和与同学讨论,我们逐步解决了这些问题。
2. 栈接着,我们学习了栈的基本概念和操作方法。
通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。
在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。
此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。
3. 队列然后,我们学习了队列的基本概念和操作方法。
通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。
在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。
数据结构实训报告总结

数据结构实训报告总结在数据结构实训中,我们学习了各种常用的数据结构及其相关算法,并通过实践应用了这些知识。
本文将对实训内容进行总结,包括学习的主要内容、实践中遇到的问题以及所得到的收获和体会。
一、学习内容概述在实训中,我们学习了线性表、栈、队列、树、图等数据结构的基本概念和常用算法。
通过理论学习和实践编程,我们对这些数据结构的特点、操作和应用有了更深入的了解。
同时,我们还学习了算法的时间复杂度和空间复杂度的分析方法,能够对算法的效率进行评估和优化。
二、实践中遇到的问题及解决方案在实训过程中,我们遇到了一些问题,如如何选择合适的数据结构、如何设计高效的算法等。
针对这些问题,我们采取了以下解决方案:1. 选择合适的数据结构:根据问题的需求和特点,我们仔细分析了不同数据结构的优缺点,并选择了最合适的数据结构来解决问题。
例如,对于需要频繁插入和删除元素的场景,我们选择了链表作为数据结构。
2. 设计高效的算法:在解决问题时,我们注意算法的时间复杂度和空间复杂度,尽量选择高效的算法。
例如,在排序算法中,我们选择了快速排序算法,其时间复杂度为O(nlogn),比冒泡排序的O(n^2)要高效。
三、收获和体会通过这次实训,我们收获了以下几个方面的经验和体会:1. 理论联系实际:通过实践应用数据结构和算法,我们更加深入地理解了它们的实际应用。
我们发现,数据结构和算法是解决实际问题的重要工具,能够提高程序的效率和性能。
2. 团队合作能力:在实训过程中,我们需要与团队成员合作完成编程任务。
通过团队合作,我们学会了有效地分工合作、沟通协调,并通过相互学习和讨论提高了自己的编程能力。
3. 解决问题的能力:在实践中,我们遇到了各种问题,如代码bug、算法优化等。
通过不断思考和尝试,我们学会了独立解决问题的能力,并提高了自己的编程思维和调试技巧。
4. 抽象思维能力:在设计数据结构和算法时,我们需要进行抽象思维,将问题抽象为适合的数据结构和算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实训报告题目: 用C 实现外部流文件的引用一、课程设计题目:二、问题描述:1、外部流文件的引用。
2、输入,输出控件化。
三、问题分析以明确的无歧义的陈述说明课程设计的任务,强调的是程序要做什么?我们小组认为,本题的要求是在于用JAVA 实现对外部数据库的调用,更新,排序以及删除。
在一开始,我们打算用本学期所学习的数据结构方面的知识再结合上学期所学的JAVA 控件知识来实现这道题目(见图),但是在调试过程中遇到了很大的问题,不得不中途换别的方式进行算法实现。
并明确规定:1、输入的形式和输入值的范围;数据库表格的形式输入,并依照数据库表格字段值的规定来规定输入值。
2、输出的形式;用JAVA语言来进行窗口式的调用。
3、程序所能达到的功能;在JAVA界面进行对外部数据库的简单应用。
比如进行查询,更新,排序以及删除。
4、算法涉及的基本理论分析:窗口界面是基于事件的程序,用户对具体图形组件的选择和激活,产生事件。
在程序中创建监听器类并注册事件,并实例化。
5、题目研究和实现的价值。
我们小组认为,本题的研究价值在于,此题目设计多个程序的跨平台应用,通过JAVA程序对数据库的加载和调用,实现后台调用和操作数据库。
实现的价值是,通过这个简单的程序初步认识到编程这项工作在将来的程序开发中的作用和价值。
四、算法设计1、概要设计阐述说明本算法中用到的所有数据结构的定义及其含义、主程序的流程以及各程序模块之间的层次(调用)关系。
因为涉及到外部文件流的引用,所以我们小组进行的方式是用JAVA命令式的程序对数据库进行创建,删除,插入以及查找。
我们用了四个小程序来进行对数据库的调用,分别是见图。
2、详细设计(1)实现概要设计中定义的所有数据类型;货号(char),品名(char),进口(boolean),单价(integer),数量(integer),开单日期(date),生产单位(char)。
(2)所有函数的接口描述;ListSelectionListener,WindowListener,处理窗口时间的监听器类。
(3)所有函数的算法描述(只需要写出伪码算法);函数为调用数据库和对数据库操作以及构造用户图形界面。
(3)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序),可采用流程图、N –S 图或PAD图进行描述;操作数据库的主程序为两个类,其中try类是对数据库进行加载桥接以及创建,catch类是依照算法的健壮性,对错误情况的处理。
(4)画出函数的调用关系图。
无。
五、算法实现创建数据表程序J_AccessCreateTableimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessCreateTable{public static void main(String args[]){try{Class.forName("microsoft.jdbc.sqlserver.SQLServerDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象//创建数据库表:订单s.executeUpdate("Create table 订单("+"货号char(10) CONSTRAINT authIndex PRIMARY KEY, "+"品名char(10), "+"进口boolean, "+"单价integer, "+"数量integer, "+"开单日期char(12) "+"生产单位char(14))");s.close();c.close();System.out.println("创建数据库表:订单");}catch (Exception e){System.err.println("异常:"+e.getMessage());}}增加一个订单程序J_AccessInsertRecordimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessInsertRecord{public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象s.executeUpdate("insert into 订单valuse(LX,影碟机,FALSE,5900.00,5,1996-6-6,长虹集团)");s.close();c.close();System.out.println("给数据库表\"订单\"增加记录");}catch(Exception e){System.err.println("异常:"+e.getMessage());}}}删除数据表J_AccessDropTableimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessDropTable{public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象s.executeUpdate("drop table 订单");s.close();c.close();System.out.println("删除数据表:订单");}catch (Exception e){System.err.println("异常:"+e.getMessage());}}}数据表查询并且按指定字段名排序J_AccessShowRecordimport java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class J_AccessShowRecord{public static void mb_ShowRecord(ResultSet r){try{st();System.out.println("数据库表共有"+r.getRow()+"行记录");r.beforeFirst();while(r.next()){System.out.println("第"+r.getRow()+"行记录为:");}}catch(Exception e){System.err.println("异常"+e.getMessage());}}public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet r1=s.executeQuery("select 货号from 订单");ResultSet r2=s.executeQuery("select 品名from 订单");ResultSet r3=s.executeQuery("select 单价from 订单");mb_ShowRecord(r1);mb_ShowRecord(r2);mb_ShowRecord(r3);s.close();c.close();}catch (Exception e){System.err.println("异常:"+e.getMessage());}}}以下为交互式界面图形窗口以及SWING组件的程序import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;import java.io.*;public class OrderBookJFrame extends JFrame implements ListSelectionListener,WindowListener{public String filename; //文件名public TreeSet<Order> tbook; //订单public JList list; //列表框public DefaultListModel listModel; //默认列表框模型public JTable table; //表格组建public DefaultTableModel tableModel; //默认表格模型public String nam; //品名public String product; //货号public boolean imp; //是否为进口public String dat; //开单日期public String compan; //生产单位public double pric; //单价public double amoun;public OrderBookJFrame(String filename) //构造用户图形界面{super("订单");Dimension dim =getToolkit().getScreenSize(); //获得屏幕分辨率this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中this.addWindowListener(this);//注册窗口事件监听器this.filename=filename;tbook=new TreeSet<Order>(); //从指定文件中读取对象信息this.readFromFile();JSplitPane splitter_h=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); //分割窗格splitter_h.setDividerLocation(60); //设置分割条的位置this.getContentPane().add(splitter_h);JSplitPane splitter_v=new JSplitPane(JSplitPane.VERTICAL_SPLIT);//垂直分割splitter_v.setDividerLocation(dim.height/4);this.listModel=new DefaultListModel(); //默认列表框模式this.listModel.addElement("全部");this.getFamilyName(); //列表框中加电话薄中所有姓氏this.list=new JList(listModel); //创建列表框this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选模式this.list.addListSelectionListener(this); //列表框注册选择事件监听器splitter_h.add(new JScrollPane(this.list)); //添加在滚动窗格中splitter_h.add(splitter_v);String[] columnNames={"货号","品名","进口","单价","数量","开单日期","生产单位"}; //表格各列的中文标题this.tableModel=new DefaultTableModel(columnNames,0); //制定列标题,0行this.table=new JTable(tableModel); //创建空表格,有列标题this.list.setSelectedIndex(0); //列表框选中第一项splitter_v.add(new JScrollPane(table));splitter_v.add(new orderJPanel());this.setVisible(true);}public OrderBookJFrame(){this("friends.dat"); //指定默认文件名}public void valueChanged(ListSelectionEvent e) // 选择事件处理方法{if(e.getSource()==this.list) //选中列表框的数据项时触发{String selected=(String)list.getSelectedValue(); //返回列表框选中数据项对象this.searchByName(selected); //返回选中姓氏的对象并更新表格}}public void getFamilyName() // JList 订单中中的所有首字母{if(!tbook.isEmpty()){Iterator it=tbook.iterator(); //返回一个迭代器对象while(it.hasNext()) //使用迭代器遍历一个集合{Order f=(Order)it.next(); //返回后继元素String familyname = f.getName().charAt(0)+"" ; // 获得首字母if(!this.listModel.contains(familyname))this.listModel.addElement(familyname); //列表框模型添加数据项}}}private void searchByName(String familyname) //更新表格,参数指定姓氏{if(!tbook.isEmpty() && familyname!= null && familyname!=""){for(int i=this.tableModel.getRowCount()-1;i>=0;i--) //清空表格this.tableModel.removeRow(i);Iterator it=tbook.iterator();while(it.hasNext()){Order f =(Order)it.next();if(familyname=="全部" || f.getName().charAt(0)==familyname.charAt(0))this.tableModel.addRow(f.toArray()); //表格添加一行,参数数组指定各列值}}}//私有内部类,构造一个面板,包括两个文本行和添加,删除,查找等按钮private class FriendJPanel extends JPanel implements ActionListener{private JTextField text_name; //文本行,输入品名private JTextField text_code; //文本行,输入货号private JTextField text_impo;private JTextField text_price;private JTextField text_amount;private JTextField text_data;private JTextField text_company;public FriendJPanel(){this.setLayout(new GridLayout(3,1));JPanel p1=new JPanel();this.add(p1);p1.add(new JLabel("货号"));this.text_name=new JTextField("电视机",20);p1.add(text_name);JPanel p2=new JPanel();this.add(p2);p2.add(new JLabel("品名"));this.text_code=new JTextField("xy-730",20);p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p3=new JPanel();this.add(p3);p2.add(new JLabel("是否为进口"));this.text_code=new JTextField("true",20);p2.add(text_code);JPanel p4=new JPanel();this.add(p4);p2.add(new JLabel("单价"));this.text_code=new JTextField("3400",20);p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p5=new JPanel();this.add(p5);p2.add(new JLabel("数量"));this.text_code=new JTextField("1",20);p2.add(text_code);JPanel p6=new JPanel();this.add(p6);p2.add(new JLabel("开单日期"));this.text_code=new JTextField("2010-7-11",20); p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p7=new JPanel();this.add(p7);p2.add(new JLabel("生产单位"));this.text_code=new JTextField("松下集团",20); p2.add(text_code);JPanel p8=new JPanel();this.add(p8);JButton button_add=new JButton("添加");p3.add(button_add);button_add.addActionListener(this);JButton button_delete=new JButton("删除");p3.add(button_delete);button_delete.addActionListener(this);JButton button_search=new JButton ("按货号查找");p3.add(button_search);button_search.addActionListener(this);}public void actionPerformed(ActionEvent e) //单击事件处理程序{if(e.getActionCommand().equals("添加")) //单击添加按钮{String name=text_name.getText();String code=text_code.getText();String impo=text_impo.getText();String price=text_price.getText();String amount=text_amount.getText();String data=text_data.getText();String company=text_company.getText();if(name!=""){Order f=new Order(product,nam,imp,pric,amoun,dat,compan);if(!tbook.contains(f)) //订单不能插入重复对象{tbook.add(f); //添加对象String familyname=name.charAt(0)+""; //返回品名的第一个字符if(list.getSelectedValue().equals(familyname))tableModel.addRow(f.toArray());else{if(!listModel.contains(familyname))listModel.addElement(familyname);list.setSelectedValue(familyname,true); //设置列表框中选中项}}elseJOptionPane.showMessageDialog(null,"不能添加空对象或重复对象"+ f.toString(),"提示",JOptionPane.DEFAULT_OPTION);//使用标准对话框显示提示信息elseJOptionPane.showMessageDialog(null,"请输入姓名","提示",JOptionPane.DEFAULT_OPTION);}if(e.getActionCommand().equals("货号码查询"))searchByCode(text_code.getText()); //查找货号if(e.getActionCommand().equals("删除")) //表格当前选中行号{int i=table.getSelectedRow();int yes=JOptionPane.showConfirmDialog(null,"删除"+i+"行?", "询问",JOptionPane.YES_NO_OPTION); //询问对话框,包括yes和no按钮if(yes==0) //单击yes{String name=(String)table.getValueAt(i,0);String code =(String)table.getValueAt(i,0);tbook.remove(newOrder(product,nam,imp,pric,amoun,dat,compan)); //订单中删除对象tableModel.removeRow(i); //表格中删除一行listModel.removeElement(name.charAt(0)+"");//列表框中删除指定姓氏}}}} //OrderJPanel内部类结束private void readFromFile() //从指定文件中读取已有对象{try{FileInputStream fin =new FileInputStream(this.filename); //文件字节输入流ObjectInputStream objin=new ObjectInputStream(fin); //对象字节输入流while(true) //输入流未结束时try{Order f=(Order)objin.readObject(); //读取一个对象tbook.add(f); //添加到订单}catch(ClassNotFoundException e) //输入流结束时抛出该异常{break;}objin.close(); //先关闭对象流fin.close(); //再关闭文件流}catch(IOException e){} //若文件不存在,则不读取}public void writeToFile() //向指定文件写入订单中的所有对象{try{FileOutputStream fout =new FileOutputStream(this.filename);//文件字节输出流ObjectOutputStream objout=new ObjectOutputStream(fout); //对象字节输出流if(!tbook.isEmpty()){Iterator it=tbook.iterator();while(it.hasNext())objout.writeObject((Order)it.next()); //写入一个对象}objout.close();fout.close();}catch(IOException ex){}}public void windowClosing(WindowEvent e) //关闭窗口事件处理方法{//this.writeToFile(); //将订单所有对象写入指定文件System.exit(0); //应用程序终止执行}public void windowOpened(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public static void main(String args[] ) throws IOException{new OrderBookJFrame(); //默认文件名为“friends.dat”}}六、软件测试这里的测试主要是基于功能的黑盒测试,所以首先提出测试的功能点,然后给出测试数据(包括正确的输入及其输出结果和含有错误的输入及其输出结果。