课程设计报告案例
- 格式:doc
- 大小:120.00 KB
- 文档页数:16
武汉纺织大学《数字逻辑》课程设计报告题目:三裁判表决器院系:数学与计算机学院专业班级:计科094学号:0904681223学生姓名:李勤指导教师:朱勇2011年 5 月20 日2一、 引言通过对传统数字电路的设计,掌握对数字逻辑设计概念的熟悉。
二、系统介绍:主要仪器是TOS-2数字电路实验系统。
选用的芯片是74LS151 8-1数据选择器。
通过设计好的逻辑表达式,在TOS--2数字电路上选择好个个需要连入的拐脚,进行连线。
实现三人表决器的功能。
三、设计任务及设计原理:引脚图功能表设计有三个变量输入A ,B C ,二个输出 W ,F,其中F=W ,逻辑表达式: F=ABC C AB C B A BC A +++。
A,B,C 通过三个开关相接,把D0---D7设置好之后, 16 15 14 13 12 11 10 974LS1511 2 3 4 5 6 7 8V CC D 4 D 5 D 6 D 7 A 0 A 1 A 2D 3 D 2 D 1 D 0 Y Y S GND 输 入输 出D A 2 A 1 A 0 S Y Y × × × × 1D 0 0 0 0 0D 1 0 0 1 0D 2 0 1 0 0D 3 0 1 1 0D 4 1 0 0 0D 5 1 0 1 0D 6 1 1 0 0D 7 1 1 1 00 1D 0 0D D 1 1D D 2 2D D 3 3D D 4 4D D 5 5D D 6 6D D 7 7D数学与计算机学院硬件课程设计报告就可以通过调节开关来输入。
输出接到一个LED灯,如果通过,那么灯就亮,否则的话,灭。
74LS1510 GA AB BC CD0D1 Y Y0 D3D3 WD41 D5D6D7方法之一四、代码清单:(机房答辩,提交代码)只需要连线,无代码。
五、程序调试心得体会:第一次线连接好之后,首先试验的是逻辑功能的正确性。
灭火机器人课程设计报告灭火机器人课程设计报告一、引言随着技术的发展,人工智能机器人已经逐渐融入我们的日常生活,成为解决问题的重要工具。
在这个课程设计中,我们将开发一款基于机器学习技术的灭火机器人。
通过模拟真实的火灾救援场景,机器人需要学会识别火源、规划安全路径,并采取正确的灭火策略。
这个项目将综合运用机器学习、路径规划、机械设计等多方面的知识,旨在提高学生的创新思维和实践能力。
二、机器人硬件设计1、移动平台:为了能让机器人移动到指定的位置,我们选择使用轮式移动平台。
通过配置多个传感器,机器人可以感知周围环境,确保在复杂地形中稳定移动。
2、机械臂与灭火装置:为了实现抓取和操作灭火设备的功能,我们设计了一款具有多个自由度的机械臂。
在机械臂的末端,安装了一个可以喷射灭火剂的装置。
3、传感器系统:机器人配备了火焰传感器、温度传感器和烟雾传感器,以检测火灾位置和程度。
此外,还安装了红外摄像头,用于识别和避开障碍物。
三、机器学习算法我们采用深度学习算法来训练机器人的火灾识别模型。
首先,我们从大量火灾图片中提取出特征,然后使用卷积神经网络(CNN)进行训练。
通过训练,模型能够根据摄像头捕捉的图像,准确判断是否存在火源。
四、路径规划算法机器人需要从起点到达火灾地点,期间需要避开障碍物。
为此,我们采用了基于A算法的路径规划方法。
A算法是一种启发式搜索算法,能够根据当前状态和启发式信息,寻找最短路径。
通过定义每个节点的代价,算法能够计算出从起点到目标点的最短路径。
五、控制系统机器人的行为由嵌入式控制系统控制。
该系统包括一个主控制器和多个从控制器。
主控制器负责接收用户的指令和传感器数据,从控制器负责执行主控制器的命令,控制机器人的移动和机械臂的操作。
主控制器通过无线通信与从控制器进行数据交换。
六、实验与结果为了验证机器人的性能,我们在实验室环境下进行了一系列测试。
测试中,机器人成功识别了火源,并根据路径规划算法避开了障碍物,最终到达火灾地点,成功执行了灭火任务。
《数据结构与算法》课程设计报告王婧、龚丹、宋毅编写题目:航空订票管理系统学期:秋班号:学号:姓名:成绩:哈尔滨华德学院电子与信息工程学院年月一、实训设计的目的与要求(注:正文为宋体,五号字,为单倍行距)(一)课程设计目的(不少于字).数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(语言),自行实现一个较为完整的应用系统。
.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
具体的有:()熟练掌握链表存储结构及其建立过程和常用操作;()熟练掌握队列的建立过程和常用操作;()学会自己调试程序的方法并掌握一定的技巧。
(二)题目要求(不少于字).每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级,或)以及等候替补的客户名单(包括姓名和所需数量)。
.系统能实现的操作和功能如下:()查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行和余票额;()承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票量少余订票额,则需重新询问客户要求。
若需要,可登记排队候补;()承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
二、实训环境配置系统三、设计正文.需求分析。
课程设计(论文)院(系)名称航空科学与工程学院专业名称飞行器设计与工程题目名称襟翼结构初步设计学生姓名班级/学号指导教师王立峰成绩2012年9 月北京航空航天大学本科生课程设计(论文)任务书Ⅰ、课程设计(论文)题目:襟翼结构初步设计Ⅱ、课程设计(论文)使用的原始资料(数据)及设计技术要求:图11 机翼翼型参数(翼型,根弦长度br ,尖弦长度bt ,展长l ,后掠角A )2 襟翼基本参数(相对弦长b 襟翼/b 机翼,相对展长 l 襟翼/l 机翼,偏角 As) 襟翼离翼根均为30cm ;3 襟翼设计载荷(前缘气动载荷P ,载荷分布直线,最大载荷点距襟翼前缘5cm )Ⅲ、课程设计(论文)工作内容:2、分析和确定襟翼的运动方式,画出运动图3、根据给定的设计载荷设计襟翼结构。
4、选择3个以上关键部件进行强度分析。
重量估算。
5、根据设计结果,绘制襟翼的装配图。
选择3个以上的零件画出零件图。
图纸必须 6、符合规范。
序号翼型根弦长度br 尖弦长度bt 展长l 后掠角A (25度弦线) 相对弦长b 襟翼/b 机翼 相对展长 l 襟翼/l 机翼 偏转角 As 前缘气动载荷P (襟翼展向 根部) 前缘气动载荷P (襟翼展向 尖部) 8 230162.41.518100.300.2535850750襟翼型式及载荷分布示意图7、完成课程设计报告。
一、襟翼的常见结构和载荷情况:1.1 襟翼的常见结构:图2简单襟翼:简单襟翼与副翼形状相似,放下简单襟翼,相当于改变了机切面形状,使机翼更加弯曲。
这样,空气流过机翼上表面,流速加快,压力降低;而流过机翼下表面,流速减慢,压力提高。
因而机翼上、下压力差增大,升力增大。
可是,襟翼放下之后,机翼后缘涡流区扩大,机翼前后压力差增大,故阻力同时增大。
襟翼放下角度越大,升力和阻力也增大得越多。
分裂襟翼这种襟翼本身象一块薄板,紧贴于机翼后缘。
放下襟翼,在后缘和机翼之间,形成涡流区,压力降低,对机翼上表面的气流有吸引作用,使其流速增大,上下压差增大,既增大了升力,同时又延缓了气流分离。
摘要流水彩灯控制器在我门日常生活中有重要的运用,如广告牌的设计和节日彩灯的设计都能运用到它的原理。
本次设计的流水彩灯控制器是其中较简单的,但这是进行复杂设计的基础。
本次课程设计要设计一个流水彩灯控制器〔用8只发光二极管显示,至少三种工作方式〕。
首先要分析设计要求,从要实现至少三种工作方式入手推导出要使用的芯片。
可通过八位右移寄存器74LS164实现八个彩灯的向右移动,从它的右移输入端控制来实现它的流水彩灯的变化。
要控制流水彩灯的变化,可通过一个八位拨码开关,八选一数据选择器74LS151,模十六加法计数器74LS161来实现。
时钟信号由一个555产生,产生周期可由一个滑动变阻器控制。
而彩灯的变化可由拨码开关自行选择。
经实验验证,所设计的流水彩灯控制器能完成题目要求。
关键词 : 时钟脉冲;分频;移位寄存器;数据选择器;拨码开关;目录摘要 (1)1设计课题与要求 (3)1.1设计方案选择 (3)2 系统模块组成 (4)2.1系统组成框图 (4)2.2各模块的组成与功能分析 (4)3 单元电路设计与计算 (5)3.1时钟脉冲产生电路 (5)3.2单种码产生电路 (7)3.3拨码开关控制电路 (8)3.4输出电路设计 (10)4 整机电路设计 (12)整机电路工作原理 (10)5 组装调试 (13)5.1仿真过程 (15)6 总结 (15)结论 (16)参考文献 (16)附录1 流水彩灯控制器原理总图 (17)附录2 PCB总图 (17)附录 2 元器清单 (18)1 设计课题及要求〔一〕题目:流水彩灯控制器〔二〕基本要求:1、用8只发光二极管显示。
2、至少三种工作方式。
1.1 方案选择利用数字芯片实现。
用555做时钟信号,用模十六加法计数器74LS161的输出端的最高位Q3,模十六加法计数器74LS161的输出端的Q1Q2Q3接到八选一的数据选择器74LS151的选择控制端。
74LS151的八个输入端都接到八位拨码开关,由拨码开关和控制端控制输出端,输出端接到移位寄存器74LS164的输入端。
植物大战僵尸课程设计报告一、课程目标知识目标:1. 学生能理解并掌握植物的基本分类、特征及生长条件;2. 学生能了解并描述僵尸游戏中植物的选择和布局对胜负的影响;3. 学生掌握基本的数学运算,能够进行植物大战僵尸游戏中的数值计算。
技能目标:1. 学生能够运用所学知识,设计出合理的植物布局方案,提高游戏胜率;2. 学生通过观察、分析游戏过程,培养解决问题的能力和团队协作能力;3. 学生能够运用信息技术手段,收集、整理植物大战僵尸的相关资料。
情感态度价值观目标:1. 学生对自然界中的植物产生兴趣,激发对生物学的好奇心;2. 学生在游戏中体验到合作、竞争的乐趣,培养积极向上的心态;3. 学生认识到保护环境、关爱植物的重要性,树立绿色生活的观念。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程以植物大战僵尸游戏为载体,结合生物学、数学等学科知识,培养学生的综合素质;2. 学生特点:五年级学生具有较强的求知欲和动手操作能力,对游戏有浓厚兴趣;3. 教学要求:注重理论与实践相结合,培养学生的创新意识和实际操作能力。
二、教学内容1. 生物学知识:- 植物分类:种子植物、孢子植物;被子植物、裸子植物;- 植物特征:光合作用、生长发育、繁殖方式;- 植物生长条件:光照、水分、温度、土壤等。
2. 数学知识:- 数值计算:加减乘除、估算、比较大小;- 数据分析:整理、描述、分析数据,找出规律;- 逻辑推理:运用逻辑思维,解决问题。
3. 游戏策略:- 植物选择:根据僵尸特点,选择合适的植物进行防守;- 布局设计:利用植物特点,合理布局,提高游戏胜率;- 团队协作:分工合作,共同应对僵尸入侵。
教学大纲安排:1. 第一周:植物分类和特征学习,熟悉游戏界面和操作;2. 第二周:植物生长条件探究,学习数值计算和数据整理;3. 第三周:植物大战僵尸游戏策略分析,培养逻辑思维和团队协作能力;4. 第四周:总结与拓展,进行成果展示和评价。
课程设计报告抢答器一、课程目标知识目标:1. 学生能够理解抢答器的原理,掌握其基本组成部分及功能。
2. 学生能够运用所学知识,设计并制作一个简单的抢答器电路。
3. 学生了解抢答器在现实生活中的应用,并能够分析其优缺点。
技能目标:1. 学生能够运用电子元件进行电路搭建,提高动手实践能力。
2. 学生能够通过小组合作,提高团队协作能力和沟通能力。
3. 学生能够运用所学知识解决实际问题,提高创新能力。
情感态度价值观目标:1. 学生对电子技术产生兴趣,培养探究精神和科学态度。
2. 学生在小组合作中,学会尊重他人意见,培养团队精神。
3. 学生通过实际操作,体会科技改变生活的意义,增强社会责任感。
课程性质:本课程为电子技术实践课,旨在让学生通过动手实践,掌握电子技术基本知识和技能。
学生特点:五年级学生,具备一定的电子技术基础,好奇心强,喜欢动手实践。
教学要求:结合学生特点,注重理论与实践相结合,提高学生动手实践能力,培养创新精神。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容本章节教学内容以抢答器设计与制作为主线,结合以下章节和内容展开:1. 电子元件的认识:- 介绍常用电子元件(如电阻、电容、二极管、三极管等)及其功能。
- 分析抢答器中所需电子元件的作用。
2. 抢答器原理与电路设计:- 讲解抢答器的基本原理,包括触发器、时钟电路等。
- 介绍抢答器电路的设计方法,引导学生思考如何实现抢答功能。
3. 电路搭建与调试:- 指导学生运用所学知识,搭建抢答器电路。
- 教授调试方法,分析可能出现的故障及解决办法。
4. 小组合作与展示:- 分组进行抢答器制作,培养学生的团队协作能力。
- 各小组展示作品,分享制作过程中的经验与收获。
教学内容安排与进度:1. 第1课时:电子元件的认识,抢答器原理讲解。
2. 第2课时:抢答器电路设计,小组讨论制定设计方案。
3. 第3课时:电路搭建与调试,教师巡回指导。
4. 第4课时:小组展示与评价,总结课程收获。
课程设计报告课程设计报告书(优秀7篇)(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如合同协议、条据文书、策划方案、总结报告、党团资料、读书笔记、读后感、作文大全、教案资料、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays, such as contract agreements, documentary evidence, planning plans, summary reports, party and youth organization materials, reading notes, post reading reflections, essay encyclopedias, lesson plan materials, other sample essays, etc. If you want to learn about different formats and writing methods of sample essays, please stay tuned!课程设计报告课程设计报告书(优秀7篇)在不断进步的时代,需要使用报告的情况越来越多,报告中提到的所有信息应该是准确无误的。
嵌入式闹钟课程设计报告一、课程目标知识目标:1. 理解嵌入式闹钟的基本原理,掌握其核心组件的功能与作用。
2. 学会使用编程语言(如C语言)编写嵌入式闹钟程序,实现对时间的显示、设置和闹钟提醒功能。
3. 了解嵌入式系统的基本概念,掌握常见的输入输出接口及其应用。
技能目标:1. 能够运用所学知识设计和制作一个具有实际功能的嵌入式闹钟。
2. 培养学生的动手操作能力,学会使用相关工具和仪器进行硬件焊接、调试和程序下载。
3. 提高学生的团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对嵌入式系统的兴趣,激发学生学习编程和电子技术的热情。
2. 培养学生的创新精神和实践能力,鼓励学生勇于尝试、不断探索。
3. 增强学生的自信心和责任感,使学生在面对挑战时保持积极的态度。
课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生的动手能力和创新能力。
学生特点:初中生,具备一定的电子和编程基础,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:注重理论与实践相结合,强调学生的主动参与和动手实践,关注个体差异,提高学生的综合素质。
通过本课程的学习,使学生能够掌握嵌入式闹钟的制作方法,培养其创新意识和团队协作能力。
教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 嵌入式系统基本概念:介绍嵌入式系统的定义、组成及应用领域,使学生了解嵌入式系统的基本知识。
- 教材章节:第1章 嵌入式系统概述2. 嵌入式闹钟硬件设计:讲解闹钟所需的主要硬件组件,如微控制器、时钟芯片、显示屏、按键等,并介绍硬件电路的搭建方法。
- 教材章节:第2章 嵌入式系统硬件设计3. 嵌入式编程基础:教授C语言编程基础,包括变量、数据类型、运算符、控制语句等,为编写嵌入式闹钟程序打下基础。
- 教材章节:第3章 嵌入式编程基础4. 时间显示与设置:讲解时间的表示方法、时间设置与显示的实现,使学生掌握闹钟时间调整与显示功能的设计。
盲人报时钟课程设计报告一、课程目标知识目标:1. 学生理解时钟的基本构造和运行原理;2. 学生掌握时间的基本表达方式和转换方法;3. 学生了解盲人如何通过听觉和触觉感知时间。
技能目标:1. 学生能够运用所学知识,制作一个简单的盲人报时钟;2. 学生通过小组合作,提高沟通与协作能力;3. 学生能够运用创新思维,为盲人设计更具实用性和人性化的报时钟。
情感态度价值观目标:1. 学生培养关爱弱势群体的意识,增强社会责任感;2. 学生在课程学习中,体会团队合作的重要性,树立团队协作精神;3. 学生通过动手实践,培养勇于探索、克服困难的品质。
课程性质:本课程为跨学科综合实践活动课程,结合物理、数学和工程技术等学科知识。
学生特点:五年级学生对新鲜事物充满好奇心,动手能力强,具备一定的团队协作能力。
教学要求:注重实践操作,鼓励学生创新,关注学生个体差异,提高学生综合运用知识解决实际问题的能力。
将课程目标分解为具体的学习成果,以便于后续教学设计和评估。
二、教学内容1. 时钟的基本构造与原理:介绍时钟的主要组成部分,如齿轮、发条、指针等,讲解其运行原理,结合课本相关章节,让学生了解时间传递的基础知识。
2. 时间表达与转换:学习时分秒的表示方法,掌握60进制的基本运用,通过实例讲解,使学生能够进行时间加减和转换。
3. 盲人感知时间的方法:介绍盲人如何利用听觉和触觉识别时间,如使用报时器、触摸时钟等,结合教材内容,让学生了解并关注弱势群体的需求。
4. 制作盲人报时钟:根据所学知识,设计并制作一个简单的盲人报时钟,分解制作过程,明确各阶段的教学内容,如设计、选材、制作、调试等。
5. 创新设计与应用:鼓励学生发挥想象,为盲人设计更具人性化的报时钟,关注产品实用性、美观性和创新性。
教学大纲安排:第一课时:时钟的基本构造与原理,时间表达与转换;第二课时:盲人感知时间的方法,讨论制作盲人报时钟的初步方案;第三课时:制作盲人报时钟,小组合作,分工实施;第四课时:调试、展示盲人报时钟,评价与改进;第五课时:创新设计与应用,分享设计心得,总结课程收获。
题目:编制一个演示集合的并、交和差运算的程序班级:计算机95(1) 姓名:丁一 学号:954211 完成日期:1997.9.14一、需求分析1.本演示程序中,集合的元素限定为小写字母字符[…a ‟..‟z ‟],集合的大小n<27。
集合输入的形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动滤去。
输出的运算结果字符串中将不含重复字符或非法字符。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中非法字符)和运算结果显示在其后。
3.程序执行的命令包括:1)构造集合1;2)构造集合2;3)求并集;4)求交集;5)求差集;6)结束。
“构造集合1”和“构造集合2”时,需以字符串的形式键入集合元素。
4.测试数据(1)Set1=”magazine ”, Set2=”paper ”,Set1 Set2=”aegimnprz ”, Set1 Set2=”ae ”, Set1-Set2=”gimnz ”;(2)Set1=”012oper4a6tion89”, Set2=”error data ”,Set1 Set2=”adeinoprt ”, Set1 Set2=”aeort ”, Set1-Set2=”inp ”。
二、概要设计为实现上述程序功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:有序表和集合。
1.有序表的抽象数据类型定义为:ADT OrderedList{数据对象:D= {|,1,2,,,0i i a a CharSet i n n ∈=≥ }数据关系:R1={111,|,,,1,2,,i i i i i i a a a a D a a i n ---<>∈<= }基本操作:InitList(&L)操作结果:构造一个空的有序表L。
DestroyList(&L)初始条件:有序表L已存在。
操作结果:销毁有序表L。
ListLength(L)初始条件:有序表L已存在。
操作结果:返回有序表L的长度。
ListEmpty(L)初始条件:有序表L已存在。
操作结果:若有序表L为空表,则返回True,否则返回False。
GetElem(L,pos)初始条件:有序表L已存在。
操作结果:若1()≤≤,则返回表中第pos个数据元素。
pos Length LLocateElem(L,e,&q)初始条件:有序表L已存在。
操作结果:若有序表L中存在元素e,则q指示L中第一个值为e的元素的位置,并返回函数值True;否则q指示第一个大于e的元素的前驱的位置,并返回函数值False Append(&L,e)初始条件:有序表L已存在。
操作结果:在有序表L的末尾插入元素e。
InsertAfter(&L,q,e)初始条件:有序表L已存在,q指示L中一个元素。
操作结果:在有序表L中q指示的元素之后插入元素e。
ListTraverse(q,visit())初始条件:有序表L已存在,q指示L中一个元素。
操作结果:依次对L中q指示的元素开始的每个元素调用函数visit()。
}ADT OrderedList2.集合的抽象数据类型定义为:ADT Set{数据对象:D= {i a |i a 为小写英文字母且互不相同,1,2,,i n = ,026n ≤≤} 数据关系:R1={}基本操作:CreateSet(&T ,Str)初始条件:Str 为字符串。
操作结果:生成一个由Str 中小写字母构成的集合T 。
DestroySet(&T)初始条件:集合T 已存在。
操作结果:销毁集合T 的结构。
Union(&T ,S1,S2)初始条件:集合S1和S2存在。
操作结果:生成一个由S1和S2的并集构成的集合T 。
Intersection (&T ,S1,S2)初始条件:集合S1和S2存在。
操作结果:生成一个由S1和S2的交集构成的集合T 。
Difference (&T ,S1,S2)初始条件:集合S1和S2存在。
操作结果:生成一个由S1和S2的差集构成的集合T 。
PrintSet (T )初始条件:集合T 已存在。
操作结果:按字母次序顺序显示集合T 的全部元素。
}ADT Set3. 本程序包含四个模块:1) 主程序模块:void main( ) {初始化;do {接受命令;处理命令;} while (“命令”=”退出”);}2) 集合单元模块——实现集合的抽象数据类型;3)有序表单元模块——实现有序表的抽象数据类型;4)结点结构单元模块——定义有序表的结点结构。
各模块之间的调用关系如下:三、详细设计1.元素类型、结点类型和指针类型typedef char ElemType ;//元素类型typedef struct NodeType {ElemType data;NodeType *next;} NodeType, *LinkType;//结点类型,指针类型status MakeNode(LinkType &p,ElemType e){//分配由p指向的数据元素为e、后继为“空”的结点,并返回TRUE,// 若分配失败,则返回FALSEP = (LinkType)malloc(sizeof(NodeType));if (!p) return FALSE;p-> data = e;p->next = NULL;return TRUE;}void FreeNode(LinkType &p){ //释放p所指结点}LinkType Copy ( LinkType p){//复制生成和指针p所指结点有同值元素的新结点并返回,//若分配空间失败,则返回空指针。
新结点的指针域为NULLs = (LinkType)malloc(sizeof(NodeType));if (!s) return NULL;s->data = p -> data;s->next = NULL;return s;}ElemType Elem(LinkType p){//若指针p!=NULL,则返回p所指结点的数据元素,否则返回‘#’}LinkType SuccNode(LinkType p){//若指针p!=NULL,则返回指向p所指结点的后继元素的指针,//否则返回NULL}2.根据有序表的基本操作的特点,有序表采用有序链表实现。
链表设头、尾两个指针和表长数据域,并附设头结点,头结点的数据域没有实在意义。
typedef struct {LinkType head,tail;//分别指向线性链表的头结点和尾结点int size;// 指示链表当前的长度} Orderedlist;// 有序链表类型有序链表的基本操作设置如下:bool InitList(OrderedList &L);//构造一个带头结点的空的有序链表L,并返回TRUE;// 若分配空间失败,则令L.head为NULL,并返回FALSEvoid DestroyList(OrderedList &L);// 销毁有序链表Lbool ListEmpty(OrderedList L);//若L不存在或为“空表”,则返回TRUE,否则返回FALSEint ListLength(OrderedList L);//返回链表的长度LinkType GetElemPos(OrderedList L, int pos);// 若L存在且0<pos<L.size+1,则返回指向第pos个元素的指针,//否则返回NULLbool LocateElem (OrderedList L,ElemType e,LinkType &q);// 若有序链表L存在且表中存在元素e,则q指示L中第一个值为e的//结点的位置,并返回TRUE;否则q指示第一个大于e的元素的前驱的//位置,并返回FALSEvoid Append (OrderedList &L,LinkType s);// 在已存在的有序链表L的末尾插入指针s所指结点void InsertAfter(OrderList &L,LinkType q,LinkType s );// 在已存在的有序链表L中q所指示的结点之后插入指针s所指结点void ListTraverse(LinkType p, status(*visit)(LinkType q));//从p(p!=NULL )指示的结点开始,依次对每个结点调用函数visit其中部分操作的伪码算法如下:BOOL InitList(OrderedList &L){if(MakeNode(head,' ')){ // 头结点的虚设元素为空格符‘’L.tail = L.head;L.size = 0;return TRUE;}else {L.head =NULL;return FALSE;}}//InitListvoid DestroyList(OrderedList &L){p = L.head;while(p){q = p;p = SuccNode(p);FreeNode(q);}L.head = L.tail = NULL;} //DestroylistLinkType GetElemPos(OrderedList L,int pos){if(! L.head || pos<1 || pos>L.size) return NULL;else if ( pos = = L.size ) return L.tail ;else{p = L.head->next;k=1;while ( p && k<pos) { p=SuccNode(p);k++;}return p;}} //GetElemPosstatus LocateElem( OrderedList L,ElemType e,LinkType &p){if ( L.head ) {pre = L.head ;p =pre->next;//pre 指向*p的前驱,p指向第一个元素结点while ( p &&p->data<e ){pre = p;p = SuccNode(p);}if ( p&&p->data= =e) return TRUE;else { p=pre;return FALSE;}}else return FALSE;}//LocateElemvoid Append (OrderedList &L,LinkType s){if ( L.head && s) {if ( L.tail != L.head ) L.tail->next = s ;else L.head->next = s;L.tail=s;L.size++;}} //Appendvoid InsertAfter(OrderList &L,LinkType q,LinkType s ){if ( L.head && q && s ) {s->next = q->next;q-> next= s;if (L.tail= =q)L.tail = s;L.size++;}}//InsertAftervoid ListTraverse(Link Type p,status(*visit)(LinkType)){while(p){ visit(p);p=SuccNode(p);}}// ListTraverse3. 集合Set 利用有序链表类型OrderedList 来实现,定义为有序集OrderedSet:typedef OrderedList OrderedSet;集合类型的基本操作的类C伪码描述如下:void CreateSet( OrderedSet & T, char *s){//生成由串s中小写字母构成的集合T,IsLower是小写字母判别函数if(InitList(T))//构造空集Tfor (i=1;i<=length(s);i++)if (islower(s[i]) &&! LocateElem(T,s[i],p))// 过滤重复元素并按字母次序大小插入if(MakeNode(q,s[i]))InsertAfter(T,p,q);}// CreateSetvoid DestroySet (OrderedSet & T){//销毁集合T的结构DestroyList(T);}// DestroyListvoid Union(OrderedSet &T,OrderedSet S1,OrderedSet S2 ){//求已建成的集合S1和S2的并集T,即:S1.Head!=NULL且S2.head!= NULL if(InitList(T)){p1=GetElemPos(S1,1);P2=GetElemPos(S2,1);while(p1 &&p2){c1= Elem(p1);c2= Elem(p2);if(c1<=c2) {Append(T,Copy(p1));p1=SuccNode(p1);if(c1= =c2) p2=SuccNode(p2);}else {Append(T,Copy(p2));p2=SuccNode(p2);}}while (p1){ Append(T,Copy(p1));p1=SuccNode(p1);}while (p2){ Append(T,Copy(p2));p2=SuccNode(p2);}}}//Unionvoid Intersection(OrderedSet &T,OrderedSet S1,OrderedSet S2) {//求集合S1和S2的交集Tif (!InitList(T)) T.head=NULL;else {p1=GetElemPos(S1,1);p2=GetElemPos(S2,1);while (p1&&p2) {c1=Elem(p1);c2=Elem(p2);if (c1<c2) p1= SuccNode(p1);else if (c1>c2) p2=SuccNode(p2);else {//c1= =c2Append(T,Copy(p1));p1= SuccNode(p1);p2=SuccNode(p2);}//else}//while}//else}//Intersectionvoid Difference(OrderedSet &T,OrderedSet S1,OrderedSet S2 ) {//求集合S1和S2的差集Tif (!InitList(T)) T.head=NULL;else {p1=GetElemPos(S1,1);p1=GetElemPos(S2,1);while (p1&&p2) {c1=Elem(p1);c2=Elem(p2);if (c1<c2) {Append(T,Copy(p1));p1= SuccNode(p1);}else if (c1>c2) p2=SuccNode(p2);else // c1= =c2{ p1= SuccNode(p1);p2=SuccNode(p2);}}//whilewhile (p1){ Append(T,Copy(p1));p1= SuccNode(p1);}}//else}//Differencevoid WriteSetElem(LinkType p){//显示集合的一个元素printf(',');writeElem (Elem (p));}//WriteSetElemvoid PrintSet(OrderedSet T){//显示集合的全部元素p=GetElemPos(T,1);printf('[');if(p){WriteElem(Elem(p);p=SuccNode(p);}ListTraverse(p,WriteSetElem);printf(']');}//PrintSet4.主函数和其他函数的伪码算法void main(){//主函数Initialization();//初始化do {ReadCommand(cmd);//读入一个操作命令符Interpret(cmd);//解释执行操作命令符} while(cmd !='q'&&cmd !='Q');}//mainvoid Initialization(){//系统初始化Clrscr();//清屏在屏幕上方显示操作命令清单:MakeSet1--1 MakeSet2--2 Union--uIntersaction--i Difference--d Quit--q;在屏幕下方显示操作命令提示框;CreateSet(Set1,“”);PrintSet(Set1);//构造并显示空集Set1 CreateSet(Set2,“”);PrintSet(Set1);//构造并显示空集Set2 } //Initializationvoid ReadCommand(char crmd){//读入操作命令符显示键入操作命令符的提示信息;do {cmd=getche( );}while (cmd […1‟,‟2‟,‟u‟,‟U‟,‟i‟,‟I‟,‟d‟,‟D‟,‟q‟,‟Q‟]));}void Interpret( char cmd){//解释执行操作命令cmdswitch (cmd) {case…1‟:显示以串的形式键入集合元素的提示信息;scanf(v);//读入集合元素到串变量vCreateSet(Set1, v);PrintSet(Set1);//构造并显示有序集Set1break;case …2‟:显示以串的形式键入集合元素的提示信息;scanf(v);//读入集合元素到串变量vCreateSet(Set2, v);PrintSet(Set2);//构造并显示有序集Set2 case…u‟,‟U‟:Union(Set3, Set1, Set2);有序集Set1和Set2的并集Set3PrintSet(Set3);//显示并集Set3DestroyList(Set3);//销毁并集Set3break;case …i‟,‟I‟:Intersaction(Set3,Set1,Set2);//求有序集Set1和Set2的交集Set3PrintSet(Set3);DestroyList(Set3);break;case …d‟,‟D‟:Difference(Set3,Set1,Set2);//求有序集Set1和Set2的差集Set3PrintSet(Set3);DestroyList(Set3);}}//Interpret5. 函数的调用关系图反映了演示程序的层次结构:四、调试分析1.由于对集合的三种运算的算法推敲不足,在有序链表类型的早期版本未设置尾指针和Append操作,导致算法低效。