信息论与编码课程设计报告书
信息论与编码教学设计

译码过程
在译码过程中,接收信号序列首先经 过接收缓冲器存储,然后送入判决电 路进行判决得到接收码字序列。接着 ,译码算法根据接收码字序列和生成 矩阵进行译码运算得到估计的信息序 列。最后,通过比较估计的信息序列 与原始信息序列的差异来评估译码算法有维特比算法 (Viterbi Algorithm)和BCJR算法 (Bahl-Cocke-Jelinek-Raviv Algorithm)。其中,维特比算法是 一种基于动态规划的译码算法,适用 于硬判决和软判决两种情况;BCJR 算法是一种基于后验概率的译码算法 ,适用于软判决情况。这些算法在译 码性能和计算复杂度方面各有优缺点 ,需要根据具体应用场景进行选择和 优化。
06
实验设计与实现
线性分组码编程实现
线性分组码基本概念
介绍线性分组码的定义、性质、生成矩阵和校验矩阵等基本概念 。
编程实现步骤
详细阐述线性分组码的编码和解码过程,包括信息位与校验位的 计算、错误检测和纠正等步骤。
示例代码分析
提供一段完整的线性分组码编程实现代码,并对代码进行详细注 释和分析,帮助学生理解实现过程。
循环码构造原理及性能分析
循环码构造原理
循环码是一种特殊的线性分组码,其 码字具有循环移位特性。循环码的生 成多项式与校验多项式是构造循环码 的关键。
循环码性能分析
循环码具有良好的纠错能力和抗干扰 性能,广泛应用于通信和存储领域。 此外,循环码的编码和解码算法相对 成熟,易于实现高速并行处理。
04
码重与码距
衡量线性分组码性能的重要指标,码重表示码字 中非零元素的个数,码距表示不同码字之间的最 小距离。
汉明码构造原理及性能分析
汉明码构造原理
通过在信息序列中插入校验位来构造 汉明码,校验位的取值根据信息位和 校验位的特定关系确定。
2024版信息论与编码教案

应用:算术编码在图像、视频和音频压 缩等领域具有广泛应用,如JPEG 2000、 H.264等标准中采用了算术编码技术。 与霍夫曼编码相比,算术编码具有更高 的压缩比和更好的性能表现。
06
多媒体信息压缩编码
多媒体信息压缩编码的基本概念与原理
压缩编码的必要性
多媒体数据量大,存储和传输成本高,需通过压缩编码降低数据 量。
典型编码方法
03
详细介绍几种典型的编码方法,如香农编码、哈夫曼编码、算
术编码等。
教学目标与要求
掌握信息论与编码的基本理论
通过学习,使学生能够深入理解信息论与编 码的基本概念和原理。
培养编码实践能力
通过案例分析、实验等环节,提高学生的编 码实践能力。
培养创新能力
鼓励学生探索新的编码方法,培养创新思维 和解决问题的能力。
编码分类
包括无损编码和有损编码,前者 可以完全恢复原始信息,后者则 会损失部分信息以换取更高的压 缩比。
霍夫曼编码的原理与应用
• 原理:霍夫曼编码是一种可变长度编码方法,根据信源符 号出现的概率来构造最优编码。它利用概率大的符号用较 短的码字表示,概率小的符号用较长的码字表示,从而实 现平均码长最短。
信息论的基本概念
信息
信息是事物运动状态或存在方式的不确定性的描述。
信息系统
由信源、信道、信宿等组成的传输和处理信息的系统。
信息论
研究信息的传输、处理、存储和检索等过程中的基本 理论和方法。
信息的度量与性质
信息的度量
用概率和统计的方法对信息进行量化,如香农 信息熵、互信息等。
信息的性质
包括普遍性、客观性、可传递性、可共享性、 可压缩性等。
压缩编码的可能性
《信息论与编码技术》实验教案

卷积码编码与译码方法探讨
卷积码原理
理解卷积码的基本原理和编码过程,包括卷积码 的生成函数和约束长度等概念。
编码实现
通过编程实现卷积码的编码过程,掌握卷积码编 码算法的实现方法。
译码方法
探讨卷积码的译码方法,包括维特比译码算法等 ,并通过仿真实验进行验证。
差错控制编码技术应用实践
应用场景
了解差错控制编码技术在通信、存储等领域的 应用场景和需求。
差错控制编码方法
介绍常用的差错控制编码方法,如奇偶校验码、循 环冗余校验码(CRC)等,并分析其性能特点。
阐述差错控制的基本概念、原理及其在数字 通信系统中的重要性。
差错控制策略设计与实现
通过实验,设计并实现一种基于特定编码方 法的差错控制策略,评估其在数字通信系统 中的性能。
图像压缩编码算法研究及实现
实验内容
设计并实现一个离散信道信息传输系统,通过输入不同的信源符号序列和信道 参数,观察并分析系统性能。
离散信道中的信息传输实验
实验步骤
1
2
1. 确定信源符号集及其概率分布;
3
2. 设计合适的信道编码方案;
离散信道中的信息传输实验
01
3. 在离散信道中实现编码后的信号传输;
02
4. 在接收端进行解码并计算误码率;
详细阐述Turbo码的编码算法、译码算法的具体实现步骤,包括交 织器设计、分量编码器选择、迭代译码算法等。
性能评估方法
介绍Turbo码性能评估的主要指标,如误码率、误帧率等,以及相 应的仿真实验方法和结果分析。
LDPC码编译码算法研究
LDPC码基本原理
介绍LDPC码的定义、分类、编码原理、译码原理等基本概念。
信息论与编码-课程设计报告

目录一:实验原理----------------------------1二:程序源代码--------------------------1三:实验分析-----------------------------6四:实验结论---------------------------7赫夫曼编码一:实验原理哈夫曼编码的具体步骤归纳如下:① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。
② 将n个信源信息符号的n个概率,按概率大小排序。
③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。
④ 将n-1个概率,按大小重新排序。
⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。
⑥ 如此反复重复n-2次,得到只剩两个概率序列。
⑦ 以二进制码元(0.1)赋值,构成哈夫曼码字。
编码结束。
哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大概信息符号分配码字长度短,小概率信息符号分配码字长度长。
C、哈夫曼编码的特点(1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;(2)哈夫曼编码的字长参差不齐,硬件实现不方便;(3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。
二:程序源代码:#define MAXVALUE 10000#define MAXLEAF 30#define MAXNODE 59#define MAXBIT 10#define LENTH 30#include "stdio.h"#include<iostream>typedef struct{float gailv;int flag;int parent;int lchild;int rchild;char ch;int t;}HNodeType;typedef struct{int bit[MAXBIT];int start;}HCodeType;typedef struct{float gailv;char letter;}mytype; /*it's the type of data save in file*/typedef struct filehuff{int count;mytype mydata[MAXLEAF];filehuff(){count=0; };};filehuff filedata;char code[MAXVALUE];HNodeType HuffNode[MAXNODE];void savetofile(){FILE *fp;if((fp=fopen("datafile.txt","wb"))==NULL){printf("打开失败 ....");return;}if(fwrite(&filedata,sizeof(filedata),1,fp)!=1) printf("写入文件失败 ....");fclose(fp);}void openfile(){ FILE *fp;if((fp=fopen("datafile.txt","rb"))==NULL){return;}fread(&filedata,sizeof(filedata),1,fp);}void translate(){char c;int i,j,k=0,m,n=0;printf("请输入你想要译码的二进制序列 ");printf("\n");getchar();scanf("%c",&c);for(i=0;(i<MAXVALUE)&&(c=='1'||c=='0');i++){ code[i]=c;scanf("%c",&c);}printf("对应的信源符号为:");for(j=0;j<=MAXVALUE&&HuffNode[j].parent!=-1;j++) m=j+1;for(j=0,k=m;j<=i;j++){if(code[j]=='0'){n=HuffNode[k].lchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}else{n=HuffNode[k].rchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}}}void Huffman(){HCodeType HuffCode[MAXLEAF],cd;int i,j,m1,m2,x1,x2,c,p,m;if(filedata.count==0){ printf("\n输入信源符号总数 : ");scanf("%d",&m);filedata.count=m;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch='a';}for(i=0;i<m;i++){ printf("请输入 (概率,信源符号):");scanf("%f %c",&HuffNode[i].gailv,&HuffNode[i].ch); filedata.mydata[i].gailv=HuffNode[i].gailv; filedata.mydata[i].letter=HuffNode[i].ch;savetofile();}}else{ m=filedata.count;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch=3;}for(i=0;i<m;i++){ HuffNode[i].gailv=filedata.mydata[i].gailv;HuffNode[i].ch=filedata.mydata[i].letter;}}for(i=0;i<m-1;i++){ m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<m+i;j++){ if(HuffNode[j].gailv<m1&&HuffNode[j].flag==0){ m2=m1;x2=x1;m1=HuffNode[j].gailv;x1=j;}else if(HuffNode[j].gailv<m2&&HuffNode[j].flag==0){ m2=HuffNode[j].gailv;x2=j;}}HuffNode[x1].parent=m+i;HuffNode[x2].parent=m+i;HuffNode[x1].flag=1;HuffNode[x2].flag=1;HuffNode[m+i].gailv=HuffNode[x1].gailv+HuffNode[x2].gailv;HuffNode[m+i].lchild=x1;HuffNode[m+i].rchild=x2;}for(i=0;i<m;i++){ cd.start=m-1;c=i;p=HuffNode[c].parent;while(p!=-1){ if(HuffNode[p].lchild==c)cd.bit[cd.start]=0;else cd.bit[cd.start]=1;cd.start--;c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<m;j++)HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start;}printf("对应的赫夫曼编码如下:");printf("\n信源符号概率编码\n");for(i=0;i<m;i++){printf("%c %f ",HuffNode[i].ch,HuffNode[i].gailv); for(j=HuffCode[i].start+1;j<m;j++)printf("%d",HuffCode[i].bit[j]);printf("\n");}printf("按任意键继续......\n");}main(){char yn;printf("\n");printf("\n");printf(" 信息论与编码实验 \n");openfile();Huffman();for(;;){printf("\n是否想要把序列译码为信源符号 ?: (输入 y or n) "); scanf("%c",&yn);if(yn=='y'||yn=='Y')translate();elsebreak;}return 0;system("pause");}三:实验分析编码实例如下:由图中可以看出,符合基本的赫夫曼编码的原理,概率大的用短码,概率小的用长码。
信息论与编码课程实验报告

福建农林大学计算机与信息学院信息工程类信息论与编码课程实验报告实验项目列表实验名称1:信源建模一、实验目的和要求(1)进一步熟悉信源建模;(2)掌握MATLAB程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。
二、实验内容(1)假设在一个通信过程中主要传递的对象以数字文本的方式呈现。
(2)我们用统计的方式,发现这八个消息分别是由N1,N2,…,N8个符号组成的。
在这些消息是中出现了以下符号(符号1,符号2,…,符号M)每个符号总共现了(次数1,次数2,…,次数M)我们认为,传递对象的信源模型可表示为:X为随机变量(即每次一个字符);取值空间为:(符号1,符号2,…,符号M);其概率分布列为:(次数1/(N1+…+N8),…,次数M/( N1+…+N8))三、实验环境硬件:计算机软件:MATLAB四、实验原理图像和语声是最常用的两类主要信源。
要充分描述一幅活动的立体彩色图像,须用一个四元的随机矢量场X(x,y,z,t),其中x,y,z为空间坐标;t 为时间坐标;而X是六维矢量,即表示左、右眼的亮度、色度和饱和度。
然而通常的黑白电视信号是对平面图像经过线性扫描而形成。
这样,上述四元随机矢量场可简化为一个随机过程X(t)。
图像信源的最主要客观统计特性是信源的幅度概率分布、自相关函数或功率谱。
关于图像信源的幅度概率分布,虽然人们已经作了大量的统计和分析,但尚未得出比较一致的结论。
至于图像的自相关函数,实验证明它大体上遵从负指数型分布。
其指数的衰减速度完全取决于图像类型与图像的细节结构。
实际上,由于信源的信号处理往往是在频域上进行,这时可以通过傅里叶变换将信源的自相关函数转换为功率谱密度。
功率谱密度也可以直接测试。
语声信号一般也可以用一个随机过程X(t)来表示。
语声信源的统计特性主要有语声的幅度概率分布、自相关函数、语声平均功率谱以及语声共振峰频率分布等。
实验结果表明语声的幅度概率分布可用伽玛(γ)分布或拉普拉斯分布来近似。
费诺编码课程设计讲解

吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:费诺编码专业班级学生姓名:学号:指导教师:设计时间:2014.11.24-2014.12.5第1章 概述1.1设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。
1.2设计任务及要求1.理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2.根据费诺编码算法,考虑一个有多种可能符号(各种符号发生的概率不同)的信源,得到费诺编码;3.掌握费诺编码的优缺点;4.能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性,要理解每个函数的具体意义和适用范围,对主要函数的功能和参数做详细说明。
1.3设计内容费诺编码属于概率匹配编码,但不是最佳的编码方法。
在编N 进制码时首先将信源消息符号按其出现的概率依次由小到大排列开来,并将排列好的信源符号按概率值分N 大组,使N 组的概率之和近似相同,并对各组赋予一个N 进制码元0、1……N-1。
之后再针对每一大组内的信源符号做如上的处理,即再分为概率和相同的N 组,赋予N 进制码元。
如此重复,直至每组只剩下一个信源符号为止。
此时每个信源符号所对应的码字即为费诺码。
针对同一信源,费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。
一个有8个符号的信源X ,各个符号出现的概率为:进行费诺编码,并计算平均码长、编码效率、冗余度。
XP (X )X1, X2, X3, X4, X5, X6, X7, X8 0.19, 0.18, 0.17, 0.16, 0.13, 0.10, 0.06, 0.01第2章费诺编码2.1设计原理1.编码与信源编码在学过信息论与编码以后,对这方面内容已有了基础的了解。
信息与编码论课程设计

信息与编码论课程设计一、课程目标知识目标:1. 理解信息与编码的基本概念,掌握不同编码方式的原理及特点;2. 学会运用二进制、十进制等数制进行信息转换,并掌握其相互转换的方法;3. 了解信息安全的基本知识,提高信息保护意识。
技能目标:1. 能够运用所学知识对信息进行编码和解码操作;2. 培养学生的逻辑思维能力和问题解决能力,通过案例分析和课堂讨论,提高学生的信息处理能力;3. 能够运用所学知识对简单的信息安全问题进行识别和防范。
情感态度价值观目标:1. 培养学生对信息科学的兴趣,激发他们探索未知领域的热情;2. 增强学生的团队合作意识,培养他们在合作中互相学习、共同进步的精神;3. 提高学生的信息安全意识,培养他们尊重知识产权、遵守网络道德的观念。
本课程旨在通过系统的理论讲解和丰富的实践操作,帮助学生掌握信息与编码的基本知识,提高他们的信息素养。
针对学生的年龄特点和认知水平,课程设计注重理论与实践相结合,以激发学生的学习兴趣和探究欲望。
在教学过程中,注重培养学生的逻辑思维能力和问题解决能力,为我国信息技术领域培养具有创新精神和实践能力的后备人才。
二、教学内容1. 信息与编码基本概念:信息的定义、编码的原理、不同编码方式的特点;教材章节:第一章 信息与编码概述2. 数制及其转换:二进制、十进制、八进制、十六进制等数制的概念及相互转换方法;教材章节:第二章 数制及其转换3. 编码算法:ASCII编码、Unicode编码、Base64编码等编码算法的原理与应用;教材章节:第三章 编码算法4. 信息安全:加密算法、数字签名、安全协议等基本概念及其应用;教材章节:第四章 信息安全5. 实践操作:开展信息编码与解码、信息安全防护等实验,巩固理论知识;教材章节:第五章 实践操作教学内容安排和进度:第一周:信息与编码基本概念、数制及其转换;第二周:编码算法、信息安全;第三周:实践操作。
教学内容注重科学性和系统性,结合教材章节进行合理组织,旨在帮助学生全面掌握信息与编码的相关知识。
信息论算术编码课程设计

信息论算术编码课程设计一、课程目标知识目标:1. 学生理解信息论中编码的基本概念,掌握算术编码的原理和步骤。
2. 学生能够运用算术编码方法对给定数据进行编码和解码。
3. 学生了解算术编码在信息传输和压缩中的应用。
技能目标:1. 学生掌握算术编码的具体算法,能够运用编程语言实现算术编码过程。
2. 学生具备分析数据特点并选择合适编码方法的能力,提高信息处理的效率。
情感态度价值观目标:1. 学生培养对信息论和编码技术的兴趣,激发学习主动性和创新意识。
2. 学生认识到编码技术在现代通信和计算机领域的重要性,增强对科技进步的敬畏感。
3. 学生通过团队协作解决问题,培养合作精神和沟通能力。
分析课程性质、学生特点和教学要求:本课程为高中信息技术学科,旨在帮助学生掌握信息论中算术编码的知识。
考虑到学生已具备一定的数学基础和编程能力,课程将重点放在算术编码的原理、实现和应用上。
教学要求注重理论与实践相结合,鼓励学生动手实践和团队协作,培养解决问题的能力。
课程目标分解为具体学习成果:1. 学生能够阐述算术编码的原理和步骤。
2. 学生能够运用编程语言实现算术编码,并成功解码。
3. 学生能够分析不同编码方法的优缺点,选择合适的方法进行信息传输和压缩。
4. 学生通过小组合作,共同完成算术编码的实际应用案例,提升团队协作能力。
二、教学内容1. 算术编码基本概念:信息论基础,编码的基本原理,算术编码的定义和特点。
- 教材章节:第三章第二节“编码方法及其应用”2. 算术编码原理与步骤:算术编码的数学模型,编码和解码的详细步骤。
- 教材章节:第三章第三节“算术编码的原理与实现”3. 编程实现算术编码:利用编程语言(如Python)实现算术编码的算法。
- 教材章节:第三章第四节“算术编码的编程实现”4. 算术编码的应用案例分析:分析实际应用中的算术编码案例,如文件压缩、图像传输等。
- 教材章节:第三章第五节“算术编码的应用实例”5. 编码方法比较与选择:比较算术编码与其他编码方法(如哈夫曼编码、LZ77等)的优缺点,讨论不同场景下的编码选择。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码课程设计报告设计题目:判断唯一可译码、香农编码专业班级电信12-03学号7学生琳指导教师成凌飞教师评分2015年3月21日目录一、设计任务与要求 (2)二、设计思路 (2)三、设计流程图 (3)四、程序运行及结果 (4)五、心得体会 (6)参考文献 (7)附录:源程序 (8)一、设计任务与要求通过本次课程设计的练习,使学生进一步巩固信源熵、信源编码的基本原理,掌握具体的编码方法,熟悉编程软件的使用,培养学生自主设计、编程调试的开发能力,同时提高学生的实践创新能力。
1、判断唯一可译码利用尾随后缀法判断任意输入的码是否为唯一可译码,即设计一个程序实现判断输入码组是否为唯一可译码这一功能。
2、香农编码熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
二、设计思路1、判断唯一可译码在我们学习使用了克劳夫特不等式之后,知道唯一可译码必须满足克劳夫特不等式。
但是克劳夫特不等式仅仅是存在性的判定定理,即该定理不能作为判断一种码是否为唯一可译码的依据。
也就是说当码字长度和码符号数满足克劳夫特不等式时,则必可以构造出唯一可译码,否则不能构造出唯一可译码。
因此我们必须找到一种能够判断一种码是否为唯一可译码的方法,尾随后缀法。
尾随后缀法算法描述:设C为码字集合,按以下步骤构造此码的尾随后缀集合F:(1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi 是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;(3)F包含于Fi即为码C的尾随后缀集合;(4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。
在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。
而不是F 中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。
2、香农编码香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。
香农第一定理指出,选择每个码字的长度Ki满足下式:I(xi)≤K﹤I(xi)+1,就可以得到这种码。
这种编码方法就是香农编码。
香农编码法有重要的理论意义。
编码步骤如下:(1)将信源消息符号按其出现的概率大小依次排列:p(x1)≥p(x2)≥···≥p(xn)(2)确定满足下列不等式整数码长Ki:-log2p(xi)≤Ki<-log2p(xi)+1(3)为了编成唯一可译码,计算第i个消息的累加概率;(4)将累加概率Pi变成二进制数;(5)取Pi二进制数的小数点后Ki位即为该消息符号的二进制码字。
三、设计流程图1、判断唯一可译码其框图如下:2、香农编码其框图如下:结束四、程序运行及结果1、判断唯一可译码其运行结果如下图所示:2、香农编码其运行结果如下图所示:五、心得体会这次信息论与编码的程序设计,对于我来说是一个挑战。
课程设计是培养学生综合运用所学知识,发现问题、提出问题、分析问题和解决问题的过程,锻炼学生的逻辑思维能力和实践能力,是对学生实际工作能力的具体训练和考察过程。
在整个课程程序中,我们充分应用和调用各个程序模块,从而部分实现了此次程序设计的所应该有的功能。
就是我在课程设计是比较成功的方面,而在这个过程中,让我感觉收获最大的就是我们都能利用这次课程设计学到很多我们在课本上没有的知识,充分的发挥了我们的主动性,使我们学会了自主学习,和独立解决问题的能力。
这次的程序软件基本上运行成功,可以简单的输入进行压缩,并且运用简单的数字告诉程序的操作者下一步该如何进行,使得程序规模相对较小,即功能还不很全面,应用也不很普遍。
总而言之,这次数据结构课程设计让我们感触很深,使我们每个人都了解到学习不应该只局限于课本,因为课本上告诉我们的只是很有限的一部分,只是理论上的死知识,所涉及的围也是狭窄的。
我们若想在有限的围学习到无限的知识,就要我们自己懂得争取,懂得自学,懂得充分利用身边的任何资源。
在我们的程序中有一部分查找许多该方面的资料,我竭力将所获得的信息变成自己的资源。
我动手上机操作的同时,在了解和看懂的基础上对新学的知识进行改进和创新,但是在我们的程序软件中还有很多的不足,需要加以更新。
通过这次课程设计,我们都意识到了自己动手实践的弱势,特别是在编程方面,于是我们知道了计算机的实践操作是很重要的,只有通过上机编程才能充分的了解自己的不足。
通过这次的课程设计,我们深刻意识到自己在学习中的弱点,同时也找到了克服这些弱点的方法,这是在此活动中得到的一笔很大的财富。
同时也感老师给我们这次机会,发现自身存在的缺点与不足,从而在以后的大学生活中更好的提升和完善自我。
参考文献[1]雪虹.信息论与编码[M]. :清华大学,2009.2[2]理工大学概率论与数理统计教研组.概率论与数理统计[M]. :高等教育,2013.4[3]贾宗璞.C语言程序设计[M].:邮电大学,2010附录:源程序1、判断唯一可译码#include <iostream.h>#include <stdlib.h>#include <string.h>struct strings{char *string;struct strings *next;};struct strings Fstr, *Fh, *FP; //输出当前集合void outputstr(strings *str){do{cout<<str->string<<endl;str = str->next;}while(str);cout<<endl;}inline int MIN(int a, int b){ return a>b?b:a; } inline int MAX(int a, int b){ return a>b?a:b; }#define length_a (strlen(CP))#define length_b (strlen(tempPtr))//判断一个码是否在一个码集合中,在则返回0,不在返回1 int comparing(strings *st_string,char *code){while(st_string->next){st_string=st_string->next;if(!strcmp(st_string->string,code))return 0;}return 1;}//判断两个码字是否一个是另一个的前缀,如果是则生成后缀码void houzhui(char *CP,char *tempPtr){if (!strcmp(CP,tempPtr)){cout<<"集合C和集合F中有相同码字:"<<endl<<CP<<endl<<"不是唯一可译码码组!"<<endl;exit(1);}if (!strncmp(CP, tempPtr, MIN(length_a,length_b))){struct strings *cp_temp;cp_temp=new (struct strings);cp_temp->next=NULL;cp_temp->string=new char[abs(length_a-length_b)+1];char *longstr;longstr=(length_a>length_b ? CP : tempPtr);//将长度长的码赋给longstr//取出后缀for (int k=MIN(length_a,length_b); k<MAX(length_a,length_b); k++)cp_temp->string[k - MIN(length_a,length_b)]=longstr[k];cp_temp->string[abs(length_a-length_b)]=NULL;//判断新生成的后缀码是否已在集合F里,不在则加入F集合if(comparing(Fh,cp_temp->string)){FP->next=cp_temp;FP=FP->next;}}}void main(){//功能提示和程序初始化准备cout<<"\t\t唯一可译码的判断!\n"<<endl;struct strings Cstr,*Ch, *CP,*tempPtr;Ch=&Cstr;CP=Ch;Fh=&Fstr;FP=Fh;char c[]="C :";Ch->string=new char[strlen(c)];strcpy(Ch->string, c);Ch->next=NULL;char f[]="F :";Fh->string=new char[strlen(f)];strcpy(Fh->string, f);Fh->next=NULL;//输入待检测码的个数int Cnum;cout<<"输入待检测码的个数:";cin>>Cnum;cout<<"输入待检测码"<<endl;for(int i=0; i<Cnum; i++){cout<<i+1<<" :";char tempstr[10];cin>>tempstr;CP->next=new (struct strings);CP=CP->next;CP->string=new char[strlen(tempstr)] ;strcpy(CP->string, tempstr);CP->next = NULL;}outputstr(Ch);CP=Ch;while(CP->next->next){CP=CP->next;tempPtr=CP;do{tempPtr=tempPtr->next;houzhui(CP->string,tempPtr->string);}while(tempPtr->next);}outputstr(Fh);struct strings *Fbegin,*Fend;Fend=Fh;while(1){if(Fend == FP){cout<<"是唯一可译码码组!"<<endl;exit(1);}Fbegin=Fend;Fend=FP;CP=Ch;while(CP->next){CP=CP->next;tempPtr=Fbegin;for(;;){tempPtr=tempPtr->next;houzhui(CP->string,tempPtr->string);if(tempPtr == Fend)break;}}outputstr(Fh);//输出F集合中全部元素}}2、香农编码#include<iostream.h>#include<math.h>#include<iomanip.h>#include<stdlib.h>class T{public:T() {}~T();void Create();void Coutpxj();void Coutk();void Coutz();void Print();protected:int n;double *p;double *pxj;int *k;double *mz;};void T::Create(){cout<<"请输入信源符号个数:";cin>>n;p=new double[n];cout<<"请分别输入这"<<n<<"个概率:\n";for(int i=0;i<n;i++)cin>>p[i];pxj=new double[n];k=new int[n];mz=new double[n];double sum=0.0;for(i=0;i<n;i++)if(sum!=1.0)throw 1;else{for(i=0;i<n;i++){int k=i;for(int j=i+1;j<n;j++) if(p[k]<p[j]) k=j;double m=p[i];p[i]=p[k];p[k]=m;}}}T::~T(){delete p;delete pxj;delete k;}void T::Coutpxj(){pxj[0]=0;for(int i=1;i<n;i++){pxj[i]=0;for(int j=0;j<i;j++)pxj[i]+=p[j];}}void T::Coutk(){for(int i=0;i<n;i++){double d=(-1)*(log(p[i])/log(2)); if(d-(int)d>0) k[i]=(int)d+1;else k[i]=(int)d;}}void T::Print(){cout<<"Xi"<<setw(8)<<"P(xi)"<<setw(8)<<"Pa(xj)"<<setw(8)<<"Ki"<<setw(8)<<"码字"<<endl;for(int i=0;i<n;i++){ cout<<"X"<<i+1<<setw(8)<<setprecision(2)<<p[i] <<setw(8)<<setprecision(2)<<pxj[i]<<setw(8)<<k[i]<<" ";mz[i]=pxj[i];for(int j=0;j<k[i];j++){if(2*mz[i]-1>=0){cout<<1;mz[i]=2*mz[i]-1;}else{cout<<0;mz[i]=2*mz[i];}}cout<<endl;}double K=0.0,H=0.0,Y;for(i=0;i<n;i++){K+=(double)p[i]*k[i];H+=(-1)*p[i]*(log10(p[i])/log10(2.0)); }Y=H/K;cout<<"平均码长:"<<K<<endl;cout<<"信源熵:"<<H<<endl;cout<<"编码效率:"<<Y<<endl;}void main(){T t;int e;try{t.Create();t.Coutpxj();t.Coutk();t.Print();}catch(int e){if(e==1) cout<<"输入错误,请重新运行";} }。