沈 阳 工 程 学 院
课 程 设 计
设计题目:学生成绩管理、电文的编码和译码
系 别 信息工程系 班级 软件本094
学生姓名 孟月 李昊航 赵磊 吕东 王珩 学 号 06 17 19 20 21 指导教师 姜柳 、吕海华 职称 副教授、讲师 起止日期:2010年12月13日起——至2010年12月24日止
沈 阳 工 程 学 院
课程设计任务书
系 别 信息工程系 班级 软件本094 学生姓名 李昊航 吕东 王珩 学号 17 20 21 指导教师 姜柳 、吕海华 职称 副教授、讲师 课程设计进行地点: 实训F座
任 务 下 达 时 间: 2010年 12月 10日
起止日期:2010年12月13日起——至2010年12月24日止 教研室主任 张欣 2010年12月10日批准
课程设计题目:学生成绩管理系统
一、课程设计的原始资料及依据
在计算机技术的迅速发展的前提下,为了方便学校对学生成绩的管理,开发一个学生成绩管理系统迫在眉睫。为相应该社会需求,特开发一个以线性表结构存储的学生成绩管理系统。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计学习编写一个学生成绩管理系统。通过本设计可以加深理解利用程序设计思想开发一个系统的整个流程,提高分析问题、解决问题和实际动手的能力。
二、课程设计主要内容及要求
1.录入功能:输入学生的学号、数学成绩、英语成绩、语文成绩,并保存在文件中; 2.查询功能:输入一个学生的学号,能从已经保存的文件中查找到对应学生的考试成绩信息,并显示在屏幕上;
3.修改功能:学生成绩的插入,在已有的成绩管理系统中插入一个或多个学生的成绩;学生成绩的删除,在已有的成绩管理系统中删除一个或多个学生的成绩。
4.显示功能:将一个班级的所有同学的成绩显示在屏幕上。
三、对课程设计说明书撰写内容、格式、字数的要求
1.课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、设计小组评语、参考文献等。一般不应少于3000字。
2.在适当位置配合相应的实验原理图、数据通路图、微程序流程图、实验接线图、微指令代码表等图表进行说明。应做到文理通顺,内容正确完整,书写工整,装订整齐。
3.设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。设计小组评语处注明设计组编号、设计组组长、设计组成员,并由设计组组长给出评语。
4.课程设计说明书手写或打印均可。手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18磅。文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。
5.课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。
四、设计完成后应提交成果的种类、数量、质量等方面的要求
1.完成“任务书”中指定的操作功能,运行稳定。 2.课程设计说明书。
五、时间进度安排
顺序 1 第1天 (12月13日) 阶段日期 计 划 完 成 内 容 阅读资料 备注
2 3 4 5 第2—3天 (12月14日—12月15日) 第4—7天 (12月16日—12月21日) 第8—9天 (12月22日—12月23日) 第10天 (12月24日) 系统分析设计 程序编制、调试及运行 成绩评定 撰写课程设计说明书 六、主要参考资料(文献)
[1]严蔚敏 吴伟民.数据结构(C语言版). 北京:清华大学出版社.2007 [2]谭浩强.C程序设计.北京:清华大学出版社.1999.12
[3]滕国文.数据结构课程设计.北京:清华大学出版社.2010.09
[4]苏仕华 等编著. 数据结构课程设计. 北京:机械工业出版社.2005.05 [5]李春葆.数据结构(C语言版)习题与解析.北京:清华大学出版社.2002..04
沈 阳 工 程 学 院
课程设计任务书
课程设计题目: 电文的编码和译码
系 别 信息工程系 班级 软件本094 学生姓名 孟月 赵磊 学号 06 19 指导教师 姜柳 、吕海华 职称 副教授、讲师 课程设计进行地点: 实训F座
任 务 下 达 时 间: 2010年 12月 10日
起止日期:2010年12月13日起——至2010年12月24日止 教研室主任 张欣 2010年12月10日批准
一、课程设计的原始资料及依据
当今社会的一些领域,电文仍然被应用着,编写一个电文编码和译码系统还是有必要的,为相应该社会需求我组特开发该系统。该设计是对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计学习编写一个电文的编码和译码系统。通过本设计可以加深理解利用程序设计思想开发一个系统的整个流程,提高分析问题、解决问题和实际动手的能力。
二、课程设计主要内容及要求
1. 构造哈夫曼树:根据Huffman算法,若已知有n个叶节点,则构造的哈夫曼树有2n-1个节点。 2. 编码
3. 译码
三、对课程设计说明书撰写内容、格式、字数的要求
1. 课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、设计小组评语、参考文献等。一般不应少于3000字。
2.在适当位置配合相应的实验原理图、数据通路图、微程序流程图、实验接线图、微指令代码表等图表进行说明。应做到文理通顺,内容正确完整,书写工整,装订整齐。
3.设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。设计小组评语处注明设计组编号、设计组组长、设计组成员,并由设计组组长给出评语。
4.课程设计说明书手写或打印均可。手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18
磅。文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。
5.课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。
四、设计完成后应提交成果的种类、数量、质量等方面的要求
1.完成“任务书”中指定的操作功能,运行稳定。 2.课程设计说明书。
五、时间进度安排
顺序 1 2 3 第1天 (12月13日) 第2—3天 (12月14日—12月15日) 第4—7天 (12月16日—12月21日) 阶段日期 计 划 完 成 内 容 阅读资料 系统分析设计 程序编制、调试及运行 备注 4 5 第8—9天 (12月22日—12月23日) 第10天 (12月24日) 成绩评定 撰写课程设计说明书 六、主要参考资料(文献)
[1]严蔚敏 吴伟民.数据结构(C语言版). 北京:清华大学出版社.2007 [2]谭浩强.C程序设计.北京:清华大学出版社.1999.12
[3]滕国文.数据结构课程设计.北京:清华大学出版社.2010.09
[4]苏仕华 等编著. 数据结构课程设计. 北京:机械工业出版社.2005.05 [5]李春葆.数据结构(C语言版)习题与解析.北京:清华大学出版社.2002..04
沈 阳 工 程 学 院
程序设计基础课程设计成绩评定表
系(部): 信息工程系 班级: 软件本094 学生姓名: 孟 月
指 导 教 师 评 审 意 见 评价内容 调研 论证 具 体 要 求 能独立查阅文献,收集资料;能制定课程设计方案和日程安排。 权重 0.1 0.2 0.2 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 工作能力 工作态度认真,遵守纪律,出勤情况是否良好,态度 能够独立完成设计工作, 工作量 说明书的质量 按期圆满完成规定的设计任务,工作量饱满,难度适宜。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 0.5 5 4 3 2 指导教师评审成绩 (加权分合计乘以8) 指 导 教 师 签 名: 评价内容 查阅 文献 工作量 说明书的质量 分 加权分合计 年 月 日 权重 0.2 0.5 0.3 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 评 阅 教 师 评 审 意 见 具 体 要 求 查阅文献有一定广泛性;有综合归纳资料的能力 工作量饱满,难度适中。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 评阅教师评审成绩 (加权分合计乘以4) 评 阅 教 师 签 名: 分 加权分合计 年 月 日 答 辩 小 组 评 审 意 见 权重 0.5 5 评 分 4 3 2 加权分 评价内容 具 体 要 求 汇报准备充分,思路清晰;语言表达准确,概念学生汇报 清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。 答 辩 思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。 0.5 5 4 3 2 答辩小组评审成绩 (加权分合计乘以8) 答辩小组教师签名: 课 程 设 计 总 评 成 绩 分 加权分合计 年 月 日 分
沈 阳 工 程 学 院
程序设计基础课程设计成绩评定表
系(部): 信息工程系 班级: 软件本094 学生姓名: 李昊航
指 导 教 师 评 审 意 见 评价内容 调研 论证 具 体 要 求 能独立查阅文献,收集资料;能制定课程设计方案和日程安排。 权重 0.1 0.2 0.2 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 工作能力 工作态度认真,遵守纪律,出勤情况是否良好,态度 能够独立完成设计工作, 工作量 说明书的质量 按期圆满完成规定的设计任务,工作量饱满,难度适宜。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 0.5 5 4 3 2 指导教师评审成绩 (加权分合计乘以8) 指 导 教 师 签 名: 评价内容 查阅 文献 工作量 说明书的质量 分 加权分合计 年 月 日 权重 0.2 0.5 0.3 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 评 阅 教 师 评 审 意 见 具 体 要 求 查阅文献有一定广泛性;有综合归纳资料的能力 工作量饱满,难度适中。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 评阅教师评审成绩 (加权分合计乘以4) 评 阅 教 师 签 名: 分 加权分合计 年 月 日 答 辩 小 组 评 审 意 见 权重 0.5 5 评 分 4 3 2 加权分 评价内容 具 体 要 求 汇报准备充分,思路清晰;语言表达准确,概念学生汇报 清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。 答 辩 思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。 0.5 5 4 3 2 答辩小组评审成绩 (加权分合计乘以8) 答辩小组教师签名: 课 程 设 计 总 评 成 绩 分 加权分合计 年 月 日 分
沈 阳 工 程 学 院
程序设计基础课程设计成绩评定表
系(部): 信息工程系 班级: 软件本094 学生姓名: 赵磊
指 导 教 师 评 审 意 见 评价内容 调研 论证 具 体 要 求 能独立查阅文献,收集资料;能制定课程设计方案和日程安排。 权重 0.1 0.2 0.2 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 工作能力 工作态度认真,遵守纪律,出勤情况是否良好,态度 能够独立完成设计工作, 工作量 说明书的质量 按期圆满完成规定的设计任务,工作量饱满,难度适宜。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 0.5 5 4 3 2 指导教师评审成绩 (加权分合计乘以8) 指 导 教 师 签 名: 评价内容 查阅 文献 工作量 说明书的质量 分 加权分合计 年 月 日 权重 0.2 0.5 0.3 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 评 阅 教 师 评 审 意 见 具 体 要 求 查阅文献有一定广泛性;有综合归纳资料的能力 工作量饱满,难度适中。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 评阅教师评审成绩 (加权分合计乘以4) 评 阅 教 师 签 名: 分 加权分合计 年 月 日 答 辩 小 组 评 审 意 见 权重 0.5 5 评 分 4 3 2 加权分 评价内容 具 体 要 求 汇报准备充分,思路清晰;语言表达准确,概念学生汇报 清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。 答 辩 思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。 0.5 5 4 3 2 答辩小组评审成绩 (加权分合计乘以8) 答辩小组教师签名: 课 程 设 计 总 评 成 绩
分 加权分合计 年 月 日 分 沈 阳 工 程 学 院
程序设计基础课程设计成绩评定表
系(部): 信息工程系 班级: 软件本094 学生姓名: 吕东
指 导 教 师 评 审 意 见 评价内容 调研 论证 具 体 要 求 能独立查阅文献,收集资料;能制定课程设计方案和日程安排。 权重 0.1 0.2 0.2 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 工作能力 工作态度认真,遵守纪律,出勤情况是否良好,态度 能够独立完成设计工作, 工作量 说明书的质量 按期圆满完成规定的设计任务,工作量饱满,难度适宜。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 0.5 5 4 3 2 指导教师评审成绩 (加权分合计乘以8) 指 导 教 师 签 名: 评价内容 查阅 文献 工作量 说明书的质量 分 加权分合计 年 月 日 权重 0.2 0.5 0.3 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 评 阅 教 师 评 审 意 见 具 体 要 求 查阅文献有一定广泛性;有综合归纳资料的能力 工作量饱满,难度适中。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 评阅教师评审成绩 (加权分合计乘以4) 评 阅 教 师 签 名: 分 加权分合计 年 月 日 答 辩 小 组 评 审 意 见 权重 0.5 5 评 分 4 3 2 加权分 评价内容 具 体 要 求 汇报准备充分,思路清晰;语言表达准确,概念学生汇报 清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。 答 辩 思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。 0.5 5 4 3 2 答辩小组评审成绩 (加权分合计乘以8) 答辩小组教师签名: 课 程 设 计 总 评 成 绩 分 加权分合计 年 月 日 分
沈 阳 工 程 学 院
程序设计基础课程设计成绩评定表
系(部): 信息工程系 班级: 软件本094 学生姓名: 王珩
指 导 教 师 评 审 意 见 评价内容 调研 论证 具 体 要 求 能独立查阅文献,收集资料;能制定课程设计方案和日程安排。 权重 0.1 0.2 0.2 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 工作能力 工作态度认真,遵守纪律,出勤情况是否良好,态度 能够独立完成设计工作, 工作量 说明书的质量 按期圆满完成规定的设计任务,工作量饱满,难度适宜。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 0.5 5 4 3 2 指导教师评审成绩 (加权分合计乘以8) 指 导 教 师 签 名: 评价内容 查阅 文献 工作量 说明书的质量 分 加权分合计 年 月 日 权重 0.2 0.5 0.3 5 5 5 评 分 4 4 4 3 3 3 加权分 2 2 2 评 阅 教 师 评 审 意 见 具 体 要 求 查阅文献有一定广泛性;有综合归纳资料的能力 工作量饱满,难度适中。 说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。 评阅教师评审成绩 (加权分合计乘以4) 评 阅 教 师 签 名: 分 加权分合计 年 月 日 答 辩 小 组 评 审 意 见 权重 0.5 5 评 分 4 3 2 加权分 评价内容 具 体 要 求 汇报准备充分,思路清晰;语言表达准确,概念学生汇报 清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。 答 辩 思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。 0.5 5 4 3 2 答辩小组评审成绩 (加权分合计乘以8) 答辩小组教师签名: 课 程 设 计 总 评 成 绩
分 加权分合计 年 月 日 分 沈阳工程学院课程设计报告 摘要
摘 要
现代科学技术的飞速发展,改变了世界,也改变了人类的生活。作为新世纪的大学生,应当站在时代发展的前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求。新世纪需要具有丰富的现代科学知识,能够独立解决面临的任务,充满活力,又有创新意识的新型人才。随着各个领域的突飞猛进,计算机也有它卓越的进步。数据结构不仅为计算机专业工作者所使用,而且为广大计算机应用人员所喜爱和使用。数据结构是国际上广泛流行的计算机高级语言。它适合作为系统描述语言,既可以用来编写系统软件,也可以用来编写应用软件。许多高等学校,不仅在计算机专业开设数据结构课程,而且在非计算机专业也开设了数据结构课程。学习数据结构已经成为广大计算机应用人员和广大青年学生的迫切要求。
本次数据结构课程设计学生成绩管理这个题目,在存储方式上是运用了线性表的链式存储结构,同时在编写程序中使用的基本操作有建立链表、插入结点、删除结点和查询,在编写程序的过程中遇到了许多问题。例如:如何判断结点是否为空,结点相同时该如何处理等一系列问题,但经过讨论和改正,使程序达到预期的要求。
在电报通信中,电文是以二进制代码传送的。在发送时,需要将电文中的字符转换成二进制代码串,即编码;在接收时,要将收到的二进制代码串转化为对应的字符序列,即译码。因此,运用了哈夫曼树的建立和哈夫曼编码等知识来完成预期的要求。使人们在使用电报通信时变得更加方便和快捷。
在为期两周的数据结构课程设计学习中,先要学习数据结构课程的目的掌握数据结构存储的方法,学习会用计算机语言编写程序,以实现所需要处理的任务。要正确处理算法与语法的关系,算法结构存储是程序的核心、是灵魂,语法是外壳、是工具。不应把学习重点放在语法规则上,语法是重要的,不掌握语法规则就无法编写出正确的程序。一定要把重点放在解题的思路上和运用何种存储的方法,通过思考和大量的阅读,来构造一个完整的程序。数据结构存储的设计直接关系到程序的好坏。
最后,感谢老师在我们程序设计的过程中辛勤的指导和不倦的教诲。
关键词 线性表,哈夫曼树,查找,设计
I
沈阳工程学院课程设计报告 目录
目 录
摘 要 ................................................................. I 第一章 问题分析 ........................................................ 1 1.1 引言..................................................................... 1 1.2背景 ..................................................................... 1 1.3 分析..................................................................... 1 1.3.1 学生成绩管理系统....................................................... 1 1.3.2 电文的编码和译码....................................................... 2 第二章 原理与运行环境 .................................................. 3 2.1 数据结构理论............................................................. 3 2.1.1 学生成绩管理系统数据结构理论........................................... 3 2.1.2 电文的编码和译码数据结构理论........................................... 3 2.2 运行环境................................................................. 4 第三章 系统分析与设计 .................................................. 8 3.1 学生成绩管理系统分析与设计............................................... 8 3.1.1 系统的功能............................................................. 8 3.1.2 系统模块分析及其流程图................................................. 8 3.2 电文的编码和译码分析与设计.............................................. 13 3.2.1 系统的功能............................................................ 13 3.2.1系统模块分析及其流程图 ................................................ 13 第四章 系统功能实现 ....................................................18 4.1 学生成绩管理系统功能实现................................................ 18 4.1.1 定义主函数............................................................ 18 4.1.2 录入功能.............................................................. 19 4.1.3查找功能 .............................................................. 21 4.1.4插入功能 .............................................................. 21 4.1.5删除功能 .............................................................. 23 4.1.6 显示功能.............................................................. 24 4.2 电文的编码和译码功能实现................................................ 25 4.2.1 定义主函数............................................................ 25 4.2.2 定义存储结构.......................................................... 26 4.2.3 构造哈夫曼树.......................................................... 27 4.2.4 编码.................................................................. 29 4.2.5 译码.................................................................. 30 结论..................................................................32 致谢..................................................................33 参考文献 ..............................................................34
沈阳工程学院课程设计报告 第一章问题分析
第一章 问题分析
1.1 引言
数据结构的教学要求是:学会分析研究计算机加工的数据结构的特征,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。另一方面,本课程的学习过程也是复杂程序设计的训练过程,要求学生编写的程序结构清楚和正确易读,符合软件工程的规范。
在学习中,先要学习程序设计课程的目的掌握设计程序的思路,学习会用计算机语言编写程序,以实现所需要处理的任务。要正确处理算法与语法的关系,算法是程序的核心、是灵魂,语法是外壳、是工具。不应把学习重点放在语法规则上,语法是重要的,不掌握语法规则就无法编写出正确的程序。一定要把重点放在解题的思路上,通过思考,和大量的阅读,来构造一个完整的程序。请记住:重要的是学会编程,而不是背语法。
程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成需要自己平时积累的大量知识、并且需要勤于思考的能力和无限的激情。本次课程设计主要是学习程序设计的方法,进行程序设计的基本训练,大多数的学生应该把精力放在最基本,最常用的内容上,学好基本功。
通过本次课程设计,相信我们一定能加强对数据结构这门课程的学习,尤其在动手实践上会有很大的进步。
1.2背景
在学校日常的学生成绩管理中,有大量的数据和信息需要存储和处理,通常纸质的档案不容易保存和使用,在查询和修改上有很大的困难,浪费大量的时间和人力也不一定能够取得很好的效果,为了方便学校对于学生成绩的管理,开发一个学生成绩管理系统迫在眉睫 。
目前,进行快速远距离通信的主要手段是电文,即将需传送的文字转化成由二进制的字符组成的字符串。而这个过程真是电文的编码和译码过程,因此编写一个电文编码和译码系统是有非常必要的,为相应该社会需求特开发此电文的编码和译码系统。
1.3 分析
1.3.1 学生成绩管理系统
学生成绩管理系统运用的是线性表,线性表是多个数据元素的有限序列,至于每个数据
元素的具体含义,在不同的情况下各不相同,他可以是一个数或是一个符号等等。
管理学生的成绩适合用单链表,方便随时插入和删除学生记录,实现动态管理。一个学生作为一个节点,该节点类型为结构体,结构体中的域表示学生的属性。每个节点除了存放属性外,还存放指向后继结点的指针。
学生成绩管理系统分为五个大模块,分别为建立,插入,删除,显示函数模块。
录入功能,当输入的学号满足条件的情况时,创建新的结点,然后以尾差法建表,然后输入下一个学生的学号。重复该过程,直至输入的学号不满足条件时结束输入,单链表创建
1
沈阳工程学院课程设计报告 第一章问题分析
完毕。
插入功能,首先录入要插入的学生的各门功课的成绩到变量中,然后判断要插入的学好在学生表中是否出现过,若出现过就在原学号上插入该学生的各科成绩,否则就创建一个结点,插入到单链表的结尾。
删除功能,先判断链表是否为空,若为空,输出提示语;若不为空,依次比较要删除的学生学号是否与单链表内某一结点的学号信息相同,若没有相同信息,输出提示语,否则对该结点进行删除操作,删除操作是通过删除链表中结点来完成的。
显示功能,通过指针移动逐步访问各结点,并将其显示到屏幕上。
主函数,主函数是程序的入口,采用模块化设计。通过一定的入口可以进行录入功能、插入功能、删除功能、显示功能。 1.3.2 电文的编码和译码
电文的编码和译码运用的时哈夫曼树,采用结构体数组作为数据结构来存储哈夫曼树及其编码。
⑴ 构造哈夫曼树。根据Huffman算法:若已知有n个叶节点,则构造的哈夫曼树有2n-1个节点。
①先输入字符集中的字符(叶节点)和表示其概率分布的权值,存储在相应结构数组中。然后将结点数据初始化。
②在所有的结点中,选取双亲为0,且具有最小权值和次小权值的两个结点,用变量指示这两个节点在数组中的的位置。并将它们合并,使其成为新结点的左右孩子,新结点的权值为最小权值和次小权值之和;两者的双亲指向新结点。重复上述过程就够造了一棵Huffman树。
⑵ 编码。基本思想:从Huffman树的叶子结点出发,通过双亲找到其双亲结点,通过左右子树域,可知该结点是其父结点的左分支或是右分支,若是左分支,生成代码0;若是右分支,生成代码1,代码存放在指定数组中,然后把其父结点作为出发点,重复上述过程,直到找到树根为止。显然,这样生成的代码代码序列与要求的编码次序相反,为了得到正确的代码,把最先生成的代码存放在数组最后一个元素中,再次生成的代码放在数组倒数第二个元素中,依此类推。用变量指示编码在数组中的起始位置。这样编码过程就结束了。
⑶译码。基本思想:首先输入二进制代码串,存放在数组中,并输入一个结束标志。接下来,将代码与编码表比较,如果为0,转向左子树;若为1,转向右子树,直到叶结点结束,此时输出叶结点的数据域,即所对应的字符。继续译码,直到代码结束。
2
沈阳工程学院课程设计报告 第二章原理与运行环境
第二章 原理与运行环境
2.1 数据结构理论
2.1.1 学生成绩管理系统数据结构理论
链接方式存储的线性表简称为链表。 链表是一种动态存储结构,所占用的存储空间在程序的执行过程中得到,当线性表需要增加一个结点时,要为该结点向系统申请一个存储空间。当线性表删除一个结点时,要将已删除的结点的存储空间释放,归还给系统。 每个存储结点不仅包含有所存储元素本身的信息(称之为数据域),而且包含所有元素之间逻辑关系的信息,即前驱结点包含有后继结点的地址信息(这称为指针域),这样可以通过前驱结点的指针域方便地找到后继结点的位置,提高数据查找速度。
学生成绩管理系统应用的是链式线性表存储结构,线性表的链式存储结构的特点:是用一组任意的存储单元存储线性表的数据元素。数据元素的映象用一个结点来表示。结点的一个域表示元素本身,另一个是能指示其后继的指针,用来表示线性表数据元素的逻辑关系。但失去了顺序表的可随机存取特点。我们将任务分成多个最简化的模块,增强了可读性和简单性,同时为日后的编写,调试,维护提供了极大地方便。
在学生成绩管理系统中,我们把一个学生作为一个结点,该结点类型为结构体型,结构体中的域表示学生的属性。每个结点除了存放属性外,还存放指向后继结点的指针。
存储功能:存储是将一个学生信息作为一个结点以链式存储在文件中。
插入功能:将一个学生信息作为一个结点并链接到已有的学生成绩管理系统的尾部。 查找功能:在已有的学生成绩管理系统中按学号查找到学生信息,并将其显示在屏幕上。 删除功能:在原有的学生成绩管理系统中查找到要删除的学生信息,并将该学生所在的结点删除。
显示功能:将一个班级的所有学生的所有信息依次显示在屏幕上。 2.1.2 电文的编码和译码数据结构理论
哈夫曼树是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的
叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。
在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制,可分别用000、001、010、011、100、101对“A,E,R,T,F,D”进行编码发送,当对方接收报文时再按照三位一分进行译码。显然编码的长度取决报文中不同字符的个数。若报文中可能出现26
3
沈阳工程学院课程设计报告 第二章原理与运行环境
个不同字符,则固定编码长度为5。然而,传送报文时总是希望总长度尽可能短。在实际应用中,各个字符的出现频度或使用次数是不相同的,如A、B、C的使用频率远远高于X、Y、Z,自然会想到设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。
为使不等长编码为前缀编码,可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,求出此树的最小带权路径长度就等于求出了传送报文的最短长度。因此,求传送报文的最短长度问题转化为求由字符集中的所有字符作为叶子结点,由字符出现频率作为其权值所产生的哈夫曼树的问题。利用哈夫曼树来设计二进制的前缀编码,既满足前缀编码的条件,又保证报文编码总长最短。
实现哈夫曼编码的算法可分为两大部分,构造哈夫曼树和在哈夫曼树上求叶节点的编 码。在构造哈夫曼树的时候,可以设置一个结构数组huff_node来保存哈夫曼树中各节 点的信息,根据二叉树的性质可知,具有n个叶节点的哈夫曼树共有2n-1个节点,所以 数组huff_node的大小设置为2n-1 数组元素的结构如下:weight lchild rchild flag parent其中weight域保存节点的权值,lchild和rchild域分别保存该节点的左、右孩子节点在树组中的序号,从而建立起来节点之间的关系。为了判定一个节点是否已经加入了要建立的哈夫曼树中,设置了一个标志域 flag,当flag=0时,表示该节点未加入树中,反之,则表示该节点已经加入树中。在求各字符的编码时,要从叶子节点回退到根节点,因此要设置一个parent域,用来保存节点的双亲节点在huff_node 数组中的序号。
构造哈夫曼树时,首先将由n个字符形成的n个叶子节点存放到数组huff_node的前n 个分量中去,然后根据哈夫曼算法的基本思想,不断的将小子树合并为较大的子树,每次所构成的新子树的根节点顺序放到huff_node数组的前n 个分量的后面。求哈夫曼编码,实质上就是从叶节点开始,沿节点的双亲链回到根节点,每回退一步,就走过了哈夫曼树中的一个分支,从而得到了一位哈夫曼编码值,由于一个字符的哈夫曼编码是从根节点到相应叶节点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位 码,后得到的分支代码为所求编码的高位码。
在通信中,若将字符用哈夫曼编码形式发送出去,对方接收到编码后,将编码还原成字符的过程,称为哈夫曼译码。
哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。它是一种变长的编码。在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。)
此程序分为五个模块,分别如下:
⑴构造哈夫曼树 ⑵编码 ⑶译码 ⑷主函数
2.2 运行环境
在数据结构程序的运行环境为C与C++程序设计学习与实验系统 2009.3。 2.2.1打开方法
4
沈阳工程学院课程设计报告 第二章原理与运行环境
开始→程序→ C与C++程序设计学习与实验系统,如图2-1所示。
图2-1打开实验系统的的方法
2.2.2打开 C与C++程序设计学习与实验系统 2009.3
其工作环境如图2-2所示。
图 2-2 C与C++程序设计学习与实验系统 2009.3 的工作环境
C
与C++程序设计学习与实验系统 2009.3的材料如下:
⑴C与C++程序设计学习与实验系统 2009.3的工作环境可以划分为三块区域。最左边的区域是工作区,最下面的区域是输出区,最右边的区域是编辑区。
⑵编辑区用来对原文件进行编辑,现在的编辑区是天蓝色的,表示等待源文件进行编辑。 ⑶输出区的作用是对程序进行编译和链接后,如果程序有错误或警告,则显示在输出区。
⑷工作区的作用是用来管理各种源程序文件,在它的管理下,可以有条不紊的进行各种源文件的编辑。
总体来讲,C与C++程序设计学习与实验系统 2009.3运行环境方便快捷。 2.2.3源程序的建立与编辑、连接
5
沈阳工程学院课程设计报告 第二章原理与运行环境
⑴建立C语言源程序文件。建立方法:选择菜单命令“文件” →“新建”或直接点击对话框中的“新建”,如图2-3所示。
图2-3 建立C语言源程序文件
⑵程序的编辑与编译。编辑完成后,选择菜单栏中的“运行”→“调试程序”即可对程序进行编译。当输出区显示“0 errors, 0 warnings ”时表示没有错误和警告,反之,则会按序号列出错误和警告。双击错误或警告,编辑标志会出现在源文件可能出错的位置,当然有时提示位置不一定很准确。
⑶程序的执行。单击工具栏上的“深蓝色三角号”按钮,即可执行刚编写的程序,如图2-4所示。
图2-4 对源程序进行编写
6
沈阳工程学院课程设计报告 第二章原理与运行环境
使用C与C++程序设计学习与实验系统 2009.3开发环境,对源程序执行编译。如图2-5所示。
图2-5 执行编写的程序
7
沈阳工程学院课程设计报告 第三章系统分析与设计
第三章 系统分析与设计
3.1 学生成绩管理系统分析与设计
3.1.1 系统的功能
本任务要求实现学生成绩管理系统,输入学生基本信息以及个人成绩,并将其存入文件中。根据需要可以进行如下操作:插入、查找、删除、显示。其功能模块图如图3-1所示。
学生成绩管理系统 录入功能 插入功能 删除功能 显示功能
语文成绩 数学成绩 英语成绩 化学成绩 物理成绩 查 找 删 除
图3-1学生成绩管理系统功能模块图
3.1.2 系统模块分析及其流程图
⑴录入功能
录入功能是将学生基本信息及其成绩作为一个结点以链式线性表存储在文件中。其流程图如图3-2所示。
输入学生的学号。在循环中,如果学生的学号不为0的话,创建新结点并依次输入学生的各科成绩,该学生各科成绩输入完毕,以尾差法建表,然后输入下一个学生的学号,重复上述过程,直至输入学号为0时结束输入,单链表创建完毕。
8
沈阳工程学院课程设计报告 第三章系统分析与设计
开 始 定义变量 输出“请输入学号,输入0键盘输入学是 判断学号是否等于0? 否 开辟新的存储空间 输出提示语 键盘输入数据并将其赋值给变量 移动指针 输出“请输入学号,输入0结束:” 键盘输入学号 结 束
图3-2录入功能流程图
⑵插入功能
插入功能是将学生基本信息及其成绩作为一个结点并链接到已有的学生成绩管理系统的尾部。
9
沈阳工程学院课程设计报告 第三章系统分析与设计
首先录入要插入的学生们各门功课的成绩,暂存在变量中,然后判断要插入的学号在学生表中是否出现过,若出现过就在原学号上插入该学生的各科成绩,否则就创建一个结点,存入该学生信息,插入到单链表的结尾。其功能流程图如图3-3所示。
开 始 定义变量 将标志型变量赋值为0 输出提示语 键盘输入数否 移动指针查找文件,有学号与输入学号相同? 是 标志型变量赋值是 标志型变量是否为1? 否 开辟存储空间 将数据赋值给当前结点 将数据存储到所开辟的空间中 将新创建的结点链接到文件尾部 结 束
图3-3插入功能流程图
10
沈阳工程学院课程设计报告 第三章系统分析与设计
⑶查找功能
查找功能是在已有的学生成绩管理系统中按学号查找到学生信息,并将其显示在屏幕上。通过移动指针找到与输入相同的学号,并将该学号所对应的学生信息输出。其功能流程图如图3-4所示。
开 始 定义变量 输出提示语 键盘输入数据 否 移动指针查找文件,有学号与输入学号相同? 是 输出未找到信息的提示语 输出结点信息 结 束
图3-4查找功能流程图
⑷删除功能
删除功能是在原有的学生成绩管理系统中查找到要删除的学生信息,并将该学生所在的结点删除。
根据查找功能查找出所要删除学生的信息,利用指针删除结点从而达到删除该生信息。先判断链表是否为空,若为空,显示“没有任何记录”;若不为空,依次比较要删除的学生学号是否与单链表内某一结点的学号信息相同,若没有相同信息,显示“没有任何记录”,否则对该结点进行删除操作。其功能流程图如图3-5所示。
11
沈阳工程学院课程设计报告 第三章系统分析与设计
开 始 定义变量 是 文件是否为空? 否 用指针查找要删除学生的学否 找到该信息? 是 输出“未找到该生信息” 删除该结点的指针 结 束 图3-5删除功能流程图
输出出错信息
⑸显示功能
显示功能是将所有学生的所有信息依次显示在屏幕上。其功能流程图如图3-6所示。
开 始 定义变量 否 结点非空? 是 输出当前结点信息 指针后移 结 束 3-6显示功能流程图
12
沈阳工程学院课程设计报告 第三章系统分析与设计
3.2 电文的编码和译码分析与设计
3.2.1 系统的功能
本次任务要求实现电文的编码和译码系统,根据需要可以进行如下操作:构建哈夫曼树、编码、译码。其功能模块图如图3-1所示
电文的编码和译码 构建哈夫曼树 编 码 译 码
图3-7电文的编码和译码功能模块图
3.2.1系统模块分析及其流程图
⑴构建哈夫曼树
根据Huffman算法:若已知有n个叶子节点,则构造的哈夫曼树有2n-1个节点。
首先,将所有结点数据初始化,从n个结点中找出父结点为0,权重最小的结点作为第n+1个结点的左子树,权重第二小的结点作为其右子树,并将两者的权重相加作为其父结点的权重。循环该操作。其功能流程图如图3-8所示。其内部选择左右子树功能流程图如图3-9所示。
13
沈阳工程学院课程设计报告 第三章系统分析与设计
开 始 定义变量 输入数据 对数组进行初始化 计数器赋初值 否 有该结点? 是 选择左右子树 将左右子树的权重相加,作为父结点的权重。 输出操作成功提示结 束 图3-8 构建哈夫曼树功能流程图
开 始 比较所有结点 否 父结点为0? 是 结点权重最小,作为左子树 结点权重第二小,作为右子树 结 束 图3-9 选择左右子树功能流程图
14
沈阳工程学院课程设计报告 第三章系统分析与设计
⑵编码
从Huffman树的叶结点出发,找到其双亲,通过双亲的左右子树,可知当前结点是父结点的左子树或右子树,若是左子树,生成代码0;若是右子树,生成代码1,代码存放在数组中,然后把父结点作为出发点,重复上述过程,直到找到树根为止。将生成的代码倒序存储在数组中。 其功能流程图如图3-10所示。
开 始 定义变量 结点赋初值 否 是否为叶子结点? 是 该结点是否为其父结点的左子树? 是 将0倒序放入存放该结点编码的数组中 结点树增加 否 将1倒序放入存放该结点编码的数组中 依次输出各结点以及其结 束 图3-10 编码流程图
⑶译码
首先输入二进制代码串,存放在数组中。接下来,将代码与编码表比较,如果为0,转向左子树;若为1,转向右子树,直到叶结点结束,此时输出叶结点的数据域,即所对应的字符。继续译码,直到代码结束。其功能流程图如图3-11所示。
15
沈阳工程学院课程设计报告 第三章系统分析与设计
开 始 定义变量 输入电文,记录其中字符个数。 给计数器赋初是 结点置为根结输出结点数据 否 字符结束? 否 结点的左子树不为0? 是 否 字符为0? 是 将其存为右子树 将其存为左子树 计数器增加 结 束
图3-11译码功能流程图
⑷主函数流程图,如图3-12所示。其中菜单功能流程图如图3-13所示。
16
沈阳工程学院课程设计报告 第三章系统分析与设计
开 始 定义变量 输出功能及其代号 键盘输入执行功能代号 菜单功能 否 输入4? 是 结 束 图3-12 主函数流程图
开 始 否 输入数字为1? 是 输入数字为2? 是 执行编码函数 输入数字为3? 是 执行译码函数 否 执行建立哈夫曼树函数 否 结 束 图3-13 菜单功能流程图
17
沈阳工程学院课程设计报告 第四章 系统功能实现
第四章 系统功能实现
4.1 学生成绩管理系统功能实现
4.1.1 定义主函数
主函数是程序的入口,采用模块化设计,首先声明一些必要的变量,并为单链表头指针分配空间;然后调用CreatLinkList函数创建单链表,输出学生总人数,并且若有记录输入,即单链表不为空,调用DisplayStu函数进行插入操作,并且再次输出更改后的全部学生信息;最后输入要删除的学生的学号,调用DeleStu函数进行删除操作,并输出最后的信息。源代码如下:
int main(int argc,char*argv[]) {
LinkList*head; char num[110]; int flag=0;
int n=0;
head=(LinkList*)malloc(sizeof(LinkList)); head->next=NULL; CreatLinkList(head,&n); printf(\"学生总数为%d\\n\ if(head->next!=NULL) DisplayStu(head);
printf(\"请输入要插入的学生的学号,以0结束\\n\"); scanf(\"%s\ while(1) {
if(strcmp(num,\"0\")==0)break; InsertStu(head,num,&n); printf(\"学生总数为%d\\n\ DisplayStu(head); scanf(\"%s\
}
printf(\"请输入要删除的学生学号,以0结束\\n\"); scanf(\"%s\ while(1) {
if(strcmp(num,\"0\")==0)break; flag=DeleStu(head,num,&n);
18
沈阳工程学院课程设计报告 第四章 系统功能实现
printf(\"学生总数为%d\\n\ DisplayStu(head); scanf(\"%s\ }
return 0;
}
功能实现图如图4-1所示。
图4-1初始化界面
4.1.2 录入功能
按提示输入学生的学号num。在while循环中,如果学生的学号不为0的话,创建新结点s并依次输入学生的各科成绩,该学生各科成绩输入完毕,以尾差法建表,然后输入下一个学生的学号,重复上述过程,直至输入学号为0时结束输入,单链表创建完毕。累加n表示学生总数。源代码如下:
void CreatLinkList(LinkList *head,int *n) /*建立链表*/ {
char num[110];
int scor,scor1,scor2,scor3,scor4; int i=1;
LinkList *p=head; LinkList *s;
printf(\"请输入学生的学号,输入0结束输入:\\n\"); scanf(\"%s\ while(1) {
19
沈阳工程学院课程设计报告 第四章 系统功能实现
if(strcmp(num,\"0\")==0) break;
s=(LinkList*)malloc(sizeof(LinkList)); strcpy(s->num,num);
printf(\"请输入数学成绩:\\n\"); scanf(\"%d\ s->shuxue=scor;
printf(\"请输入英语成绩:\\n\"); scanf(\"%d\ s->yingyu=scor1;
printf(\"请输入语文成绩:\\n\"); scanf(\"%d\ s->yuwen=scor2;
printf(\"请输如物理成绩:\\n\"); scanf(\"%d\ s->wuli=scor3;
printf(\"请输入化学成绩:\\n\"); scanf(\"%d\ s->huaxue=scor4; p->next=s; p=s;
s->next=NULL;
*n=*n+1;
printf(\"请输入学生的学号,输入0结束输入:\\n\"); scanf(\"%s\ } }
其功能实现图如图4-2所示。
图4-2录入功能
20
沈阳工程学院课程设计报告 第四章 系统功能实现
4.1.3查找功能
查找功能是在已有的学生成绩管理系统中按学号查找到学生信息,并将其显示在屏幕上。 通过移动指针找到与输入相同的学号,并将该学号所对应的学生信息输出。 int search(LinkList *head,char num[],int*n) /*查找学生*/ {
LinkList *p=head; LinkList *s; if(p->next==NULL) {
printf(\"学生表中没有任何的学生记录\\n\"); return 0; } else {
while(p!=NULL) {
s=p->next; if(s!=NULL)
{
if(strcmp(s->num,num)= =0) {
printf(\"%s\%d\%d\%d\%d\%d\\n\wuli,s->huaxue);
break; } }
p=p->next; }
printf(\"学生表中没有该学生的记录\\n\"); return 0; } }
4.1.4插入功能
首先录入要插入的学生们各门功课的成绩,暂存在int变量中,然后判断要插入的学号在学生表中是否出现过,若出现过就在原学号上插入该学生的各科成绩,否则就创建一个结
21
沈阳工程学院课程设计报告 第四章 系统功能实现
点,存入该学生信息,插入到单链表的结尾。学生总人数n+1。源代码如下:
void InsertStu(LinkList *head,char num[],int *n) /*插入学生*/
{
LinkList *p; LinkList *s;
int scor,scor1,scor2,scor3,scor4; int flag=0;
printf(\"请输入数学成绩:\\n\"); scanf(\"%d\
printf(\"请输入英语成绩:\\n\"); scanf(\"%d\
printf(\"请输入语文成绩:\\n\"); scanf(\"%d\
printf(\"请输如物理成绩:\\n\"); scanf(\"%d\
printf(\"请输入化学成绩:\\n\"); scanf(\"%d\ p=head;
while(p->next!=NULL) {
if(strcmp(p->next->num,num)==0) {
flag=1; break; }
p=p->next; } if(flag==1) {
p->next->shuxue=scor; p->next->yingyu=scor1; p->next->yuwen=scor2; p->next->wuli=scor3; p->next->huaxue=scor4; } else {
s=(LinkList*)malloc(sizeof(LinkList)); strcpy(s->num,num);
22
沈阳工程学院课程设计报告 第四章 系统功能实现
s->shuxue=scor; s->yingyu=scor1; s->yuwen=scor2; s->wuli=scor3; s->huaxue=scor4; p->next=s; p=s;
s->next=NULL; *n=*n+1; } }
功能实现图如图4-3所示。
图4-3插入功能
4.1.5删除功能
先判断链表是否为空,若为空,显示“没有任何记录”;若不为空,依次比较要删除的学生学号是否与单链表内某一结点的学号信息相同,若没有相同信息,显示“没有任何记录”,否则对该结点进行删除操作,总人数n-1。源代码如下:
int DeleStu(LinkList *head,char num[],int*n) /*删除学生*/
{
LinkList *p=head; LinkList *s; if(p->next==NULL) {
printf(\"学生表中没有任何的学生记录\\n\"); return 0; }
23
沈阳工程学院课程设计报告 第四章 系统功能实现
else {
while(p!=NULL) {
s=p->next; if(s!=NULL) {
if(strcmp(s->num,num)==0) {
p->next=s->next; *n=*n-1; break; } } p=p->next; }
printf(\"学生表中没有该学生的记录\\n\"); return 0; }
}
其功能实现图如图4-4所示。
图4-4 删除功能
4.1.6 显示功能
此函数的功能时浏览学生表中所有学生的信息,源代码如下: void DisplayStu(LinkList*head) /*浏览学生链表*/ {
24
沈阳工程学院课程设计报告 第四章 系统功能实现
LinkList*h=head->next;
printf(\"学号 姓名 数学 语文 英语\\n\"); while(h!=NULL) {
printf(\"%s\%d\%d\%d\%d\%d\\n\h->huaxue);
h=h->next; } }
其功能实现图如图4-5所示。
图4-5 显示功能
4.2 电文的编码和译码功能实现
4.2.1 定义主函数
定义主函数,实现开始的界面输出,并以此调用各个函数,源代码如下: int main (int argc,char*argv[])
{
int n,select,flag=0; /*flag为0时标记第一次选择功能*/ HuffNode ht[2*MAXNUM]; /*定义存放哈夫曼树的数组*/ HuffCode hcd[MAXNUM]; /*定义存放编码的数组*/ while(1) {
printf(\"\请选择您所要实现的功能:(请输入1~4数字)\\n\"); printf(\"\1---建立哈夫曼树\\n\"); printf(\"\2---编码\\n\"); printf(\"\3---译码\\n\");
25
沈阳工程学院课程设计报告 第四章 系统功能实现
printf(\"\4---退出系统\\n\"); scanf(\"%d\
if(select!=1&&select!=4&&flag==0)
{ /*提示建立哈夫曼树或推出*/ printf(\"请先建立哈夫曼树再选择其他功能!\\n\"); continue; } flag=1;
switch(select) /*选择功能*/ { case 1:
n=HuffmanCreate(ht); break; case 2:
Encoding(ht,hcd,n); case 3:
Decoding(ht,hcd,n); break; case 4: exit(0); } } return 0; }
其功能实现图如图4-6所示。
图4-6菜单
4.2.2 定义存储结构
引入头文件和定义Huffman树结构,程序源代码如下:
26
沈阳工程学院课程设计报告 第四章 系统功能实现
#include \"consts.h\" typedef char DataType;
#define MAXNUM 50
Huffman树结点的储存结构定义为:
typedef struct /*哈夫曼树结点的结构*/ {
DataType data; /*数据用字符表示*/ int weight; /*权值*/ int parent; /*双亲*/ int left; /*左孩子*/ int right; /*右孩子*/
}HuffNode;
typedef struct /*哈夫曼编码的存储结构*/ {
DataType cd[MAXNUM]; /*存放编码位串*/ int start; /*编码的起始位置*/ }HuffCode; 4.2.3 构造哈夫曼树
根据Huffman算法:若已知有n个叶节点,则构造的哈夫曼树有2n-1个节点。 首先,将所有结点数据初始化,从n个结点中找出父结点为0,权重最小的结点作为第n+1个结点的左子树,权重第二小的结点作为其右子树,并将两者的权重相加作为其父结点的权重。循环该操作。
源代码如下:
int HuffmanCreate(HuffNode*ht) {
int i,k,n,m1,m2,p1,p2;
printf(\"请输入元素个数:\"); scanf(\"%d\
for(i=1;i<=n;i++) /*输入结点值和信息*/ {
getchar(); /*接收回车*/ printf(\"第%d个元素的=>\\n\结点值:\",i); scanf(\"%c\ printf(\"\权重:\") ; scanf(\"%d\ }
for(i=1;i<=2*n-1;i++) /*对数组初始化*/ ht[i].parent=ht[i].left=ht[i].right=0;
27
沈阳工程学院课程设计报告 第四章 系统功能实现
for(i=n+1;i<=2*n-1;i++) {
m1=m2=32767; /*初始化,令m1、m2为整数最大值*/ p1=p2=1;
for(k=1;k<=i-1;k++) /*从数组ht[1]~ht[i-1]中找出*/ if(ht[k].parent==0) /*parent为0并且权值最小的两个结点*/ if(ht[k].weight p2=p1; /*p1为最小权值的位置* m1=ht[k].weight; /*m1存放最小权值*/ p1=k; } else if(ht[k],weight m2=ht[k].weight; /*m2为次小权值*/ p2=k; /*p2为次小权值的位置*/ } ht[p1].pareant=i; /*i分别赋给下标为p1,p2的数组中*/ ht[p2].pareant=i; ht[i].weight=m1+m2; /*新结点的权值为最小权值和次小权值的和* ht[i].left=p1; /*p1为新结点的左孩子*/ ht[i].right=p2; /*p2为新结点的右孩子*/ } printf(\"哈夫曼树已成功建立!\\n\"); return n; /*返回结点个数*/ } 功能实现图如图4-7所示。 图4-7构造哈夫曼树 28 沈阳工程学院课程设计报告 第四章 系统功能实现 4.2.4 编码 从Huffman树的叶结点ht[i](1≤i≤n)出发,通过双亲parent找到其双亲ht[f],通过ht[f]的left和right域,可知ht[i]是ht[f]的左分支和右分支,若是左分支,生成代码0;若是右分支,生成代码1,代码存放在数组cd[start]中,然后把ht[f]作为出发点,重复上述过程,直到找到树根为止。显然,这样生成的代码代码序列与要求的编码次序相反,为了得到正确的代码,把最先生成的代码存放在数组的第n(虽然各个字符的编码长度不同,但都不会超过n)个位置处,再次生成的代码放在数组的第n-1个位置处,依此类推。用变量start指示编码在数组cd重的起始位置,start初始值为n,生成一个代码后,start的值就减1。源代码如下: void Encoding(HuffNode ht[],HuffCode hcd[],int n) /*哈夫曼编码*/ { HuffCode d; int i,k,f,c; for(i=1;i<=n;i++) /*对所有结点循环*/ { d.start=n+1; /*起始位置*/ c=i; /*从叶结点开始向上*/ f=ht[i].parent; while(f!=0) /*直到树根为止*/ { if(ht[f].left==c) d.cd[--d.start]='0'; /*规定左树为代码0*/ else d.cd[--d.start]='1'; /*规定右树为代码1*/ c=f; /*c指孩子的位置*/ f=ht[f].parent; /*f指双亲的位置*/ } hcd[i]=d; } printf(\"输出哈夫曼编码:\\n\"); for(i=1;i<=n;i++) /*输出哈夫曼编码*/ { printf(\"%c:\ /*先输出结点*/ for(k=hcd[i].start;k<=n;k++) /*在输出其对应的编码*/ printf(\"%c\ printf(\"\\n\"); } } 29 沈阳工程学院课程设计报告 第四章 系统功能实现 功能实现图如图4-8所示。 图4-8 编码 4.2.5 译码 首先输入二进制代码串,存放在数组ch中,以“#”未结束标志。接下来,将代码与编码表比较,如果为0,转向左子树;若为1,转向右子树,直到叶结点结束,此时输出叶结点的数据域,即所对应的字符。继续译码,直到代码结束。程序源代码如下: viod Decoding(HuffNode ht[],HuffCode hcd[],int n) /*哈夫曼译码*/ { int f,m,k; DataType c,ch[200]; /*c接收输入电文,ch存储*/ printf(\"请输入电文(0or1),以#为结束标志:\\n\"); c=getchar(); k=1; while(c!='#') /*单个字符循环输入,以\"#\"结束*/ { ch[k]=c; /*将单个字符依次存入ch字符串中*/ c=getchar(); k=k+1; /*ch数组下标后移*/ } m=k; /*标记数组存储末尾位置*/ f=2*n-1; k=1; /*k记录电文字符个数*/ printf(\"输出哈夫曼译码:\\n\"); while(k 30 沈阳工程学院课程设计报告 第四章 系统功能实现 { if(ch[k]=='0') /*若接收的字符为0,则存为左孩子*/ f=ht[f].left; if(ch[k]=='1') /*若接收的字符为1,则存为右孩子*/ f=ht[f].right; k++; /*ch数组下标后移*/ } printf(\"%c\ f=2*n-1; /*每次都从根结点开始查找*/ } printf(\"\\n\"); } 功能实现图如图4-9所示。 图4-9 译码 31 沈阳工程学院课程设计报告 结论 结论 紧张的两周数据结构课程设计很快过去了,通过这周的学习使我巩固了以前的知识并在此基础上对数据结构的特点和算法有了更深的了解, 数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且已经成为其他理工专业的热门选修课。在计算机的研究和应用中已展现出强大的生命力,它兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性,同时这两周的学习也提高了我适应实际,实践编程的能力. 首先这两周的学习,使我在巩固了原有的理论知识上,培养了我灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力,使我体会到自身知识和能力在实际中的应用和发挥。其次,激发了我创新意识,开发创造的能力和培养沟通能力。另外,让我进一步熟悉了数据结构的设计应用。每一处编码都是在反复的熟悉数据结构的结构特性,及其语法、函数和程序设计思想的过程,对我数据结构的学习和提高很有益处,并且使我明白了程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:第一要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;第二,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的数据结构的基本类型——线性表、栈、队列、串、数组、树和二叉树以及图等,然后确定处理过程——算法,可得最后结论。最后,在这次课程设计过程中,我们深刻的认识到了自己在学习方面的不足之处,我们知道我们还有太多的基本的思想没有真正的理解,当然我们不会灰心,我们会在以后的日子里努力弥补我们的不足。 总之,两个礼拜的课程设计让我们受益匪浅。要学好一门学科,没有刻苦钻研的精神是不行的,只有在不断的尝试中,不断经历失败,然后又不断的尝试才能获得成功。两个多礼拜中,我们有过山穷水尽的困惑;有过柳暗花明的惊喜;有过唇枪舌剑的辩论;有过相互鼓励的安慰。两个礼拜的时间我们经历了很多,也收获了很多。与其说它是体力与脑力的作业,不如说它是合作精神和毅力的考验。经过这次课程设计,我们不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题。 对于我本人来讲这次课程设计的总体表现,我自己还比较满意,每天做到了按时的出勤,上机遵守机房的管理规定,遵循指导老师的安排并能适时地与老师进行沟通,觉得不足的是不能熟练地掌握c语言的设计技巧使编程的结果缺乏效率,不过我相信这只是我的一个开始,我更应该注重的是这次过程,我坚信我会在以后的学习和训练中不断地弥补自己的不足之处,不断的完善自己的编程能力,因为成功需要一点一点积累。 32 沈阳工程学院课程设计报告 致谢 致谢 数据结构课程设计的选题、研究及论文的撰写均是在我们的指导教师姜柳老师和吕海华老师的悉心指导下进行的。设计中的每一个环节无不凝聚着两位老师的心血。老师在数据结构课程设计有很多的实践经验,在我面对问题时对我的悉心指导及其严谨的工作态度锐意创新的精神,使我们受益匪浅,在此特别向老师表示深深的感谢和由衷的敬意。 在我们课程设计完善过程中,我们也遇到了这样或那样的技术问题,但经过自己的不懈努力及查阅大量的资料,最终都得到了基本满意的答案。同时,其他同学也给了我们许多有益的启示,促动和帮助,使我们能够顺利的完成课题。 感谢所有给予我们帮助的老师,他们辛勤耕作,传道授业,不仅使我们开阔了视野,拓宽了思路,增长了学识,而且为我们今后的工作和学习打下了牢固的基础,也使增强我们对计算机的兴趣。是老师给予我们无限的创造力和奋斗力,使我们有无限的信心和希望来完成本次的课程设计内容。 我们还清楚地记得,在我们遇到困难的时候,有各位老师的辛勤指导,而且从他们的身上,也使我们知道自己知识的匮乏,对数据结构这一门课程,自己还存在许多不足和需要完善的地方,通过此次课程设计,也使我们更加敬佩老师的渊博学识,更重要的是他们将自己知道的知识毫不保留地传授给我们,而且还不求回报,我们想说,老师,你们是我们心中最可爱的人。 同时也感谢学校给了我们这次难得的课程设计机会,课程设计的过程让我们看到了自己理论知识上的不足,已掌握的知识也在这次的课程设计中有了质的飞跃,知识能够应用了才是真正掌握了,也希望学校多给我们一些这样的机会。 在最后,再次感谢我们的老师,如果没有老师的耐心指导,就不会有我们的成果。在我们做论文期间,两位老师渊博的学识、严谨求实的科学精神、一丝不苟的治学态度和高尚的品格,深深的感染了我们。程序的每次改动都离不开老师的辛勤工作,从各个方面来说,审查的工作往往比编写任务更复杂。正是老师百忙中不辞劳苦的帮助,才使我们能够顺利完成这篇论文,在这里,对您衷心的表示感谢。 本次课程设计中,老师对我们的指导,我们将永远感激在心,我们相信这是我们人生中宝贵的财富。老师,谢谢您!祝老师在今后的工作中,一帆风顺,事事顺心。 33 沈阳工程学院课程设计报告 参考文献 参考文献 [1]严蔚敏 吴伟民.数据结构(C语言版). 北京:清华大学出版社.2007 [2]谭浩强.C程序设计.北京:清华大学出版社.1999.12 [3]滕国文.数据结构课程设计.北京:清华大学出版社.2010.09 [4]苏仕华 等编著. 数据结构课程设计. 北京:机械工业出版社.2005.05 [5]李春葆.数据结构(C语言版)习题与解析.北京:清华大学出版社.2002..04 [6]佟伟光.杨政.实用数据结构(第二版). 科学出版社.2008.5 [7]严蔚敏.数据结构(C语言版). 清华大学出版社.2006.3 [8]李保春.数据结构习题与解析.清华大学出版. 2001.6 [9]徐孝凯.数据结构课程实验.清华大学出版.2002.7 [10]张乃笑.数据结构与算法.电子工业出版社.2004.10 [11]王卫东.数据结构辅导课.西安电子科技大学出版社.2001.6 [12]陈文博.朱青.数据结构与算法.机械工业出版社.1996.9 [13]赵文静.数据结构辅导.西安交通大学出版社.1999.9 34 因篇幅问题不能全部显示,请点此查看更多更全内容