信息科学基础课程设计报告学院班级学号姓名课程设计一、信道容量的迭代算法1.课程设计目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握程序设计语言的数值计算程序和调试技术。2.课程设计要求(1)已知:信源符号个数r、信宿符号个数s、信道转移概率矩阵P;(2)输入:任意的一个信道转移概率矩阵。信源符号个数、信宿符号个数和每一个具体的转移概率在运行时从键盘输入;(3)输出:最佳信源分布*p,信道容量C。3.程序设计代码:#includestdio.h#includemath.h#defineMAX100doubleCalculate_a(intk,doublepa[]);doubleCalculate_C1(doublepa[],doublea[]);doubleCalculate_C2(doublea[]);intr,s;doublepba[MAX][MAX];voidmain(){inti,j;doubleC1,C2,E;doublea[MAX],pa[MAX];E=0.000001;printf(请输入信源符号个数r:\n);scanf(%d,&r);printf(请输入信宿符号个数s:\n);scanf(%d,&s);printf(请输入信源P[ai]:\n);for(i=0;ir;i++)scanf(%lf,&pa[i]);printf(请输入信道转移概率矩阵P[bj][ai]:\n);for(i=0;ir;i++)for(j=0;js;j++)scanf(%lf,&pba[i][j]);do{for(i=0;ir;i++)a[i]=Calculate_a(i,pa);C1=Calculate_C1(pa,a);C2=Calculate_C2(a);if(C2-C1=E){doublesum=0;for(i=0;ir;i++)sum+=pa[i]*a[i];for(i=0;ir;i++)pa[i]=pa[i]*a[i]/sum;}else{printf(最佳信源概率:\n);for(i=0;ir;i++)printf(%lf\n,pa[i]);}}while(C2-C1=E);printf(信道容量为:%lf\n,C1/log(2));}doubleCalculate_a(intk,doublepa[]){inti,j;doubletemp,sum2=0;for(j=0;js;j++){doublesum1=0;for(i=0;ir;i++){sum1+=pa[i]*pba[i][j];}temp=pba[k][j]/sum1;temp=log(temp);sum2+=pba[k][j]*temp;}returnexp(sum2);}doubleCalculate_C1(doublepa[],doublea[]){inti;doublesum=0;for(i=0;ir;i++)sum+=pa[i]*a[i];returnlog(sum);}doubleCalculate_C2(doublea[]){inti;doublemax=a[0];for(i=0;ir;i++)if(maxa[i])max=a[i];returnlog(max);}4.输入、输出结果:例1:请输入信源符号个数r:2请输入信宿符号个数s:3请输入信源P[ai]:0.50.5请输入信道转移概率矩阵P[bj][ai]:0.50.30.20.30.50.2最佳信源概率:0.5000000.500000信道容量为:0.036453Pressanykeytocontinue例2:请输入信源符号个数r:3请输入信宿符号个数s:3请输入信源P[ai]:0.20.30.5请输入信道转移概率矩阵P[bj][ai]:0.50.333333330.166666660.166666660.50.3333333330.333333330.166666660.5最佳信源概率:0.3333300.3333340.333337信道容量为:0.125815Pressanykeytocontinue课程设计二、惟一可译码判决准则1.课程设计目的(1)进一步熟悉惟一可译码判决准则;(2)掌握程序设计语言字符串处理程序和调试技术。2.课程设计要求(1)已知:信源符号个数q、码字集合C;(2)输入:任意的一个码字集合C。码字个数和每一个具体的码字在运行时从键盘输入;(3)输出:判决(是惟一可译码/不是惟一可译码)。3.程序设计代码:#includeiostream.h#includestdlib.h#includestring.hstructstrings{char*string;structstrings*next;};structstringsFstr,*Fh,*FP;//输出当前集合voidoutputstr(strings*str){do{coutstr-stringendl;str=str-next;}while(str);coutendl;}inlineintMIN(inta,intb){returnab?b:a;}inlineintMAX(inta,intb){returnab?a:b;}#definelength_a(strlen(CP))#definelength_b(strlen(tempPtr))//判断一个码是否在一个码集合中,在则返回0,不在返回1intcomparing(strings*st_string,char*code){while(st_string-next){st_string=st_string-next;if(!strcmp(st_string-string,code))return0;}return1;}//判断两个码字是否一个是另一个的前缀,如果是则生成后缀码voidhouzhui(char*CP,char*tempPtr){if(!strcmp(CP,tempPtr)){cout集合C和集合F中有相同码字:endlCPendl不是唯一可译码码组!endl;exit(1);}if(!strncmp(CP,tempPtr,MIN(length_a,length_b))){structstrings*cp_temp;cp_temp=new(structstrings);cp_temp-next=NULL;cp_temp-string=newchar[abs(length_a-length_b)+1];char*longstr;longstr=(length_alength_b?CP:tempPtr);//将长度长的码赋给longstr//取出后缀for(intk=MIN(length_a,length_b);kMAX(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;}}}voidmain(){//功能提示和程序初始化准备cout\t\t唯一可译码的判断!\nendl;structstringsCstr,*Ch,*CP,*tempPtr;Ch=&Cstr;CP=Ch;Fh=&Fstr;FP=Fh;charc[]=C:;Ch-string=newchar[strlen(c)];strcpy(Ch-string,c);Ch-next=NULL;charf[]=F:;Fh-string=newchar[strlen(f)];strcpy(Fh-string,f);Fh-next=NULL;//输入待检测码的个数intCnum;cout输入待检测码的个数:;cinCnum;cout输入待检测码endl;for(inti=0;iCnum;i++){couti+1:;chartempstr[10];cintempstr;CP-next=new(structstrings);CP=CP-next;CP-string=newchar[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);structstrings*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集合中全部元素}}4.输入、输出结果:例1:输入:唯一可译码的判断!输入待检测码的个数:5输入待检测码1:xx2:xz3:y4:zz5:xyzC:xxxzyzzxyzF:是唯一可译码码组!Pressanykeytocontinue例2:输入:唯一可译码的判断!输入待检测码的个数:7输入待检测码1:a2:c3:ad4:abb5:bad6:deb7:bbcdeC:acadabbbaddebbbcdeF:dbbF:dbbebcdeF:dbbebcdedeF:dbbebcdedebF:dbbebcdedebadbcde集合C和集合F中有相同码字:ad不是唯一可译码码组!Pressanykeytocontinue课程设计三、香农编码1.课程设计目的(1)进一步熟悉香农编码算法;(2)掌握程序设计和调试技术中数值的进制转换、数值愈字符串之间的转换等技术。2.课程设计要求(1)输入:信源符号个数q、信源的概率分布P;(2)输出:每一个信源符号对应的香农编码码字。3.程序设计代码:#includeiostream#includemath.h#includestring#includeiomanipusingnamespacestd;voidbubble(double*p,intn)//排序{for(inti=0;in-1;i++){for(intj=i+1;jn;j++){if(p[i]p[j]){doubletemp=p[i];p[i]=p[j];p[j]=temp;}}}}voidleijia(double*p,double*pa,intn)//累加概率{doublesum=0.0;for(inti=0;in;i++){pa[i]=sum;sum+=p[i];}}voidlength(double*p,int*k,intn)//码字的长度{for(inti=0;in;i++){for(intj=0;j20;j++){if(j1-log(p[i])/log(2)&&j=-log(p[i])/log(2))k[i]=j;}doubleI=-log(p[i])/log(2);inttemp=int(I);if(I-temp==0)k[i]=temp;elsek[i]=temp+1;}