版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
.z......資料....哈夫曼編碼器實驗報告學(xué)院:計算機(jī)學(xué)院班級:計科0801班**:王宇宏**:04081027(27)一.實驗?zāi)康木毩?xí)樹和哈夫曼樹的有關(guān)操作,和各個算法程序,理解哈夫曼樹的編碼和譯碼二.實驗環(huán)境Microsoftvisualc++三、問題描述利用哈夫曼編碼進(jìn)行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編碼/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼編碼的編碼/譯碼器。四、需求分析(1)初始化;從終端輸入字符集的大小n,以及n個字符和n個權(quán)值建立哈夫曼樹。(2)輸出哈夫曼樹,及各字符對應(yīng)的編碼。(3)編碼:利用建好的哈夫曼樹,對輸入的待發(fā)送電文進(jìn)行編碼。同時輸入原文及編碼串。(4)譯碼:利用建好的哈夫曼樹,對輸入的已接收電文進(jìn)行譯碼。同時輸入編碼串及原文。五、概要設(shè)計*include<iostream.h>*include<iomanip.h>*include<string.h>*include<malloc.h>*include<stdio.h>//typedefintTElemType;constintUINT_MA*=1000;charstr[50];typedefstruct{intweight,K;intparent,lchild,rchild;}HTNode,*HuffmanTree;typedefchar**HuffmanCode;//全局變量HuffmanTreeHT;HuffmanCodeHC;intw[50],i,j,n;charz[50];intflag=0;intnumb=0//求哈夫曼編碼structcou{chardata;intcount;}cou[50];intmin(HuffmanTreet,inti){//函數(shù)voidselect()調(diào)用intj,flag;intk=UINT_MA*;//取k為不小于可能的值,即k為最大的權(quán)值1000for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;returnflag;}//slect函數(shù)voidselect(HuffmanTreet,inti,int&s1,int&s2){//s1為最小的兩個值中序號小的那個intj;s1=min(t,i);s2=min(t,i);if(s1>s2){j=s1;s1=s2;s2=j;}}//算法6.12voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){//w存放n個字符的權(quán)值(均>0),構(gòu)造哈夫曼樹HT,并求出n個字符的哈夫曼編碼HCintm,i,s1,s2,start;//unsignedc,f;intc,f;HuffmanTreep;char*cd;if(n<=1)return;//檢測結(jié)點數(shù)是否可以構(gòu)成樹m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0號單元未用for(p=HT+1,i=1;i<=n;++i,++p,++w){p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p)p->parent=0;for(i=n+1;i<=m;++i)//建哈夫曼樹{//在HT[1~i-1]中選擇parent為0且weight最小的兩個結(jié)點,其序號分別為s1和s2select(HT,i-1,s1,s2);HT[s1].parent=HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}//從葉子到根逆向求每個字符的哈夫曼編碼HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//分配n個字符編碼的頭指針向量([0]不用)cd=(char*)malloc(n*sizeof(char));//分配求編碼的工作空間cd[n-1]='\0';//編碼結(jié)束符for(i=1;i<=n;i++){//逐個字符求哈夫曼編碼start=n-1;//編碼結(jié)束符位置for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//從葉子到根逆向求編碼if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1';HC[i]=(char*)malloc((n-start)*sizeof(char));//為第i個字符編碼分配空間strcpy(HC[i],&cd[start]);//從cd復(fù)制編碼(串)到HC}free(cd);//釋放工作空間}//獲取報文并寫入文件intInputCode(){//cout<<"請輸入你想要編碼的字符"<<endl;FILE*tobetran;if((tobetran=fopen("tobetran.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return0;}cout<<"請輸入你想要編碼的字符"<<endl;gets(str);fputs(str,tobetran);cout<<"獲取報文成功"<<endl;fclose(tobetran);returnstrlen(str);}//初始化哈夫曼鏈表voidInitialization(){inta,k,flag,len;a=0;len=InputCode();for(i=0;i<len;i++){k=0;flag=1;cou[i-a].data=str[i];cou[i-a].count=1;while(i>k){if(str[i]==str[k]){a++;flag=0;}k++;if(flag==0)break;}if(flag){for(j=i+1;j<len;j++){if(str[i]==str[j])++cou[i-a].count;}}}n=len-a;for(i=0;i<n;i++){cout<<cou[i].data<<"";cout<<cou[i].count<<endl;}for(i=0;i<=n;i++){*(z+i)=cou[i].data;*(w+i)=cou[i].count;}HuffmanCoding(HT,HC,w,n);//打印編碼cout<<"字符對應(yīng)的編碼為:"<<endl;for(i=1;i<=n;i++){puts(HC[i]);}//將哈夫曼編碼寫入文件cout<<"下面將哈夫曼編碼寫入文件"<<endl<<""<<endl;FILE*htmTree;charr[]={'','\0'};if((htmTree=fopen("htmTree.t*t","w"))==NULL){cout<<"cannotopenfile"<<endl;return;}fputs(z,htmTree);for(i=0;i<n+1;i++){fprintf(htmTree,"%6d",*(w+i));fputs(r,htmTree);}for(i=1;i<=n;i++){fputs(HC[i],htmTree);fputs(r,htmTree);}fclose(htmTree);cout<<"已將字符與對應(yīng)編碼寫入根目錄下文件htmTree.t*t中"<<endl<<endl;}//編碼函數(shù)voidEncoding(){cout<<"下面對目錄下文件tobetran.t*t中的字符進(jìn)行編碼"<<endl;FILE*tobetran,*codefile;if((tobetran=fopen("tobetran.t*t","rb"))==NULL){cout<<"不能打開文件"<<endl;}if((codefile=fopen("codefile.t*t","wb"))==NULL){cout<<"不能打開文件"<<endl;}char*tran;i=99;tran=(char*)malloc(100*sizeof(char));while(i==99){if(fgets(tran,100,tobetran)==NULL){cout<<"不能打開文件"<<endl;break;}for(i=0;*(tran+i)!='\0';i++){for(j=0;j<=n;j++){if(*(z+j-1)==*(tran+i)){fputs(HC[j],codefile);if(j>n){cout<<"字符錯誤,無法編碼!"<<endl;break;}}}}}cout<<"編碼工作完成"<<endl<<"編碼寫入目錄下的codefile.t*t中"<<endl<<endl;fclose(tobetran);fclose(codefile);free(tran);}//譯碼函數(shù)voidDecoding(){cout<<"下面對根目錄下文件codefile.t*t中的字符進(jìn)行譯碼"<<endl;FILE*codef,*t*tfile;if((t*tfile=fopen("t*tfile.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;}if((codef=fopen("codefile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;}char*work,*work2,i2;inti4=0,i,i3;unsignedlonglength=10000;work=(char*)malloc(length*sizeof(char));fgets(work,length,codef);work2=(char*)malloc(length*sizeof(char));i3=2*n-1;for(i=0;*(work+i-1)!='\0';i++){i2=*(work+i);if(HT[i3].lchild==0){*(work2+i4)=*(z+i3-1);i4++;i3=2*n-1;i--;}elseif(i2=='0')i3=HT[i3].lchild;elseif(i2=='1')i3=HT[i3].rchild;}*(work2+i4)='\0';fputs(work2,t*tfile);cout<<"譯碼完成"<<endl<<"內(nèi)容寫入根目錄下的文件t*tfile.t*t中"<<endl<<endl;free(work);free(work2);fclose(t*tfile);fclose(codef);}//打印編碼的函數(shù)voidCode_printing(){cout<<"下面打印根目錄下文件CodePrin.t*t中編碼字符"<<endl;FILE*CodePrin,*codefile;if((CodePrin=fopen("CodePrin.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return;}if((codefile=fopen("codefile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;return;}char*work3;work3=(char*)malloc(51*sizeof(char));do{if(fgets(work3,51,codefile)==NULL){cout<<"不能讀取文件"<<endl;break;}fputs(work3,CodePrin);puts(work3);}while(strlen(work3)==50);free(work3);cout<<"打印工作結(jié)束"<<endl<<endl;fclose(CodePrin);fclose(codefile);}//打印譯碼函數(shù)voidCode_printing1(){cout<<"下面打印根目錄下文件t*tfile.t*t中譯碼字符"<<endl;FILE*CodePrin1,*t*tfile;if((CodePrin1=fopen("CodePrin1.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return;}if((t*tfile=fopen("t*tfile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;return;}char*work5;work5=(char*)malloc(51*sizeof(char));do{if(fgets(work5,51,t*tfile)==NULL){cout<<"不能讀取文件"<<endl;break;}fputs(work5,CodePrin1);puts(work5);}while(strlen(work5)==50);free(work5);cout<<"打印工作結(jié)束"<<endl<<endl;fclose(CodePrin1);fclose(t*tfile);}//打印哈夫曼樹的函數(shù)voidcoprint(HuffmanTreestart,HuffmanTreeHT){if(start!=HT){FILE*TreePrint;if((TreePrint=fopen("TreePrint.t*t","a"))==NULL){cout<<"創(chuàng)建文件失敗"<<endl;return;}numb++;//該變量為已被聲明為全局變量coprint(HT+start->rchild,HT);cout<<setw(5*numb)<<start->weight<<endl;fprintf(TreePrint,"%d\n",start->weight);coprint(HT+start->lchild,HT);numb--;fclose(TreePrint);}}voidTree_printing(HuffmanTreeHT,intw){HuffmanTreep;p=HT+w;cout<<"下面打印哈夫曼樹"<<endl;coprint(p,HT);cout<<"打印工作結(jié)束"<<endl;}//主函數(shù)voidmain(){charchoice;while(choice!='q'){cout<<"\n******************************"<<endl;cout<<"歡迎使用哈夫曼編碼解碼系統(tǒng)"<<endl;cout<<"******************************"<<endl;cout<<"(1)要初始化哈夫曼鏈表請輸入'i'"<<endl;cout<<"(2)要編碼請輸入'e'"<<endl;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑模板研發(fā)與技術(shù)支持合同4篇
- 臨時工勞動合同范本(2024版)
- 中醫(yī)承師合同模板
- 2025版外貿(mào)鞋子購銷合同模板:品牌設(shè)計合作協(xié)議3篇
- 2025年度汽車維修行業(yè)深度合作框架協(xié)議
- 二零二五年度解除租賃合同及約定租賃物租賃期限變更協(xié)議
- 二零二五年度洗車行業(yè)培訓(xùn)與認(rèn)證協(xié)議
- 2025年度市政基礎(chǔ)設(shè)施竣工驗收合同
- 二零二五年度勞動合同解除員工離職賠償金支付協(xié)議
- 二零二五年度水利工程測繪數(shù)據(jù)保密協(xié)議書
- 2024年中國醫(yī)藥研發(fā)藍(lán)皮書
- 廣東省佛山市 2023-2024學(xué)年五年級(上)期末數(shù)學(xué)試卷
- 臺兒莊介紹課件
- 疥瘡病人的護(hù)理
- 人工智能算法與實踐-第16章 LSTM神經(jīng)網(wǎng)絡(luò)
- 17個崗位安全操作規(guī)程手冊
- 2025年山東省濟(jì)南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運(yùn)維、重保服務(wù))
- 現(xiàn)代科學(xué)技術(shù)概論智慧樹知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 軟件模塊化設(shè)計與開發(fā)標(biāo)準(zhǔn)與規(guī)范
評論
0/150
提交評論