版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本科課程設(shè)計(論文)[3]講的是編碼理論中的知識,是我對霍夫曼編碼的具體實現(xiàn)方法有了深刻的了解,對我實現(xiàn)具體的算法很大幫助第2章設(shè)計簡介及設(shè)計方案論述2.1霍夫曼編碼介紹霍夫曼編碼(HuffmanCoding)是一種熵編碼編碼壓縮方式,霍夫曼編碼是可變字長編碼(VLC)的一種。霍夫曼壓縮是個無損的壓縮算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬于可變代碼長度算法一族。意思是不同符號(例如,文本文件中的字符)用一個特定長度的位序列替代。因此,在文件中出現(xiàn)頻率高的符號,使用短的位序列,而那些很少出現(xiàn)的符號,則用較長的位序列?;舴蚵幋a的碼長是變化的,對于出現(xiàn)頻率高的信息,編碼的長度較短;而對于出現(xiàn)頻率低的信息,編碼長度較長。這樣,處理全部信息的總碼長一定小于實際信息的符號長度?;舴蚵幋a是一種根據(jù)字母的使用頻率而設(shè)計的變長碼,能提高信息的傳輸效率,至今仍有廣泛的應(yīng)用。霍夫曼編碼方法的具體過程是:首先把信源的各個輸出符號序列按概率遞降的順序排列起來,求其中概率最小的兩個序列的概率之和,并把這個概率之和看做是一個符號序列的概率,再與其他序列依概率遞降順序排列(參與求概率之和的這兩個序列不再出現(xiàn)在新的排列之中)。然后,對參與概率求和的兩個符號序列分別賦予二進制數(shù)字0和1。繼續(xù)這樣的操作,直到剩下一個以1為概率的符號序列。最后,按照與編碼過程相反的順序讀出各個符號序列所對應(yīng)的二進制數(shù)字組,就可分別得到各該符號序列的碼字2.2設(shè)計簡介先是讀取文件,統(tǒng)計文件中不同字符出現(xiàn)的次數(shù),并存入數(shù)組中,然后將數(shù)組中不同的字符對應(yīng)的ASCII值存入另外數(shù)組中,按照數(shù)組個ASCII及相應(yīng)出現(xiàn)的頻率的來建立霍夫曼編碼,然后將碼表存入壓縮文件,再將各字符對應(yīng)的霍夫曼編碼寫入壓縮文件中,實現(xiàn)文件壓縮。詳細代碼如下:2.3設(shè)計方案2.3.1壓縮函數(shù)首先讀取文件,統(tǒng)計字符對應(yīng)ASCII的出現(xiàn)頻率,構(gòu)造霍夫曼樹://壓縮voidcompress(){charfilename[255],outputfile[255],buf[512];unsignedcharc;longi,j,m,n,f,lh=0;longmin1,pt1,flength,length1,length2; doublediv;FILE*readfile,*writefile; cout<<"請輸入要壓縮的文件名:";cin>>filename;readfile=fopen(filename,"rb");if(readfile==NULL) {cout<<"文件打開失?。。?請檢查該文件是否存在,或遇到未知文件"<<endl ; return; } cout<<"輸入壓縮之后的文件名:";cin>>outputfile;writefile=fopen(strcat(outputfile,".hub"),"wb");if(writefile==NULL) { cout<<"文件壓縮失敗!"<<endl;return; } flength=0;while(!feof(readfile)) { fread(&c,1,1,readfile);header[c].count++;//字符重復(fù)出現(xiàn)頻率+1flength++;//字符出現(xiàn)原文件長度+1 }lh=flength; flength--;length1=flength;//原文件長度用作求壓縮率的分母header[c].count--;for(i=0;i<512;i++) { if(header[i].count!=0)header[i].b=(unsignedchar)i; /*將每個哈夫曼碼值及其對應(yīng)的ASCII碼存放在一維數(shù)組header[i]中,且編碼表中的下標和ASCII碼滿足順序存放關(guān)系*/elseheader[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1;//對結(jié)點進行初始化 }for(i=0;i<256;i++)//根據(jù)頻率(權(quán)值)大小,對結(jié)點進行排序,選擇較小的結(jié)點進樹 { for(j=i+1;j<256;j++) { if(header[i].count<header[j].count) { tmp=header[i];header[i]=header[j];header[j]=tmp; } } } for(i=0;i<256;i++) if(header[i].count==0)break;n=i;//外部葉子結(jié)點數(shù)為n個時,內(nèi)部結(jié)點數(shù)為n-1,整個哈夫曼樹的需要的結(jié)點數(shù)為2*n-1.m=2*n-1;for(i=n;i<m;i++)//構(gòu)建哈夫曼樹 { min1=999999999;//預(yù)設(shè)的最大權(quán)值,即結(jié)點出現(xiàn)的最大次數(shù)for(j=0;j<i;j++) { if(header[j].parent!=-1)continue; //parent!=-1說明該結(jié)點已存在哈夫曼樹中,跳出循環(huán)重新選擇新結(jié)點*/if(min1>header[j].count) { pt1=j;min1=header[j].count;continue; } } header[i].count=header[pt1].count;header[pt1].parent=i;//依據(jù)parent域值(結(jié)點層數(shù))確定樹中結(jié)點之間的關(guān)系header[i].lch=pt1;//計算左分支權(quán)值大小min1=999999999;for(j=0;j<i;j++) { if(header[j].parent!=-1)continue;if(min1>header[j].count) { pt1=j;min1=header[j].count;continue; } } header[i].count+=header[pt1].count;header[i].rch=pt1;//計算右分支權(quán)值大小header[pt1].parent=i; } for(i=0;i<n;i++)//哈夫曼無重復(fù)前綴編碼 { f=i;header[i].bits[0]=0;//根結(jié)點編碼0while(header[f].parent!=-1) { j=f;f=header[f].parent;if(header[f].lch==j)//置左分支編碼0 { j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1); //依次存儲連接“0”“1”編碼header[i].bits[0]='0'; } else//置右分支編碼1 { j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1);header[i].bits[0]='1'; } } } fseek(readfile,0,SEEK_SET);//從文件開始位置向前移動0字節(jié),即定位到文件開始位置fwrite(&flength,sizeof(int),1,writefile); /*用來將數(shù)據(jù)寫入文件流中,參數(shù)flength指向欲寫入的數(shù)據(jù)地址, 總共寫入的字符數(shù)以參數(shù)size*int來決定,返回實際寫入的int數(shù)目1*/fseek(writefile,8,SEEK_SET);buf[0]=0;//定義緩沖區(qū),它的二進制表示00000000f=0;pt1=8; /*假設(shè)原文件第一個字符是"A",8位2進制為01000001,編碼后為0110識別編碼第一個'0', 那么我們就可以將其左移一位,看起來沒什么變化。下一個是'1',應(yīng)該|1,結(jié)果00000001 同理4位都做完,應(yīng)該是00000110,由于字節(jié)中的8位并沒有全部用完,我們應(yīng)該繼續(xù)讀下一個字符, 根據(jù)編碼表繼續(xù)拼完剩下的4位,如果字符的編碼不足4位,還要繼續(xù)讀一個字符, 如果字符編碼超過4位,那么我們將把剩下的位信息拼接到一個新的字節(jié)里*/while(!feof(readfile)) { c=fgetc(readfile);f++;for(i=0;i<n;i++) { if(c==header[i].b)break; } strcat(buf,header[i].bits);j=strlen(buf);c=0; while(j>=8)//對哈夫曼編碼位操作進行壓縮存儲 { for(i=0;i<8;i++) { if(buf[i]=='1')c=(c<<1)|1;elsec=c<<1; } fwrite(&c,1,1,writefile);pt1++;//統(tǒng)計壓縮后文件的長度strcpy(buf,buf+8);//一個字節(jié)一個字節(jié)拼接j=strlen(buf); } if(f==flength)break; } if(j>0)//對哈夫曼編碼位操作進行壓縮存儲 { strcat(buf,"00000000");for(i=0;i<8;i++) { if(buf[i]=='1')c=(c<<1)|1;elsec=c<<1; } fwrite(&c,1,1,writefile);pt1++; } fseek(writefile,4,SEEK_SET);fwrite(&pt1,sizeof(long),1,writefile);fseek(writefile,pt1,SEEK_SET);fwrite(&n,sizeof(long),1,writefile);for(i=0;i<n;i++) { fwrite(&(header[i].b),1,1,writefile);c=strlen(header[i].bits);fwrite(&c,1,1,writefile);j=strlen(header[i].bits);if(j%8!=0)//若存儲的位數(shù)不是8的倍數(shù),則補0 { for(f=j%8;f<8;f++)strcat(header[i].bits,"0"); } while(header[i].bits[0]!=0) { c=0;for(j=0;j<8;j++)//字符的有效存儲不超過8位,則對有效位數(shù)左移實現(xiàn)兩字符編碼的連接 { if(header[i].bits[j]=='1')c=(c<<1)|1;//|1不改變原位置上的“0”“1”值elsec=c<<1; } strcpy(header[i].bits,header[i].bits+8);//把字符的編碼按原先存儲順序連接fwrite(&c,1,1,writefile); } } cout<<"文件壓縮成功!"<<endl; length2=pt1--; div=((double)length1-(double)length2)/(double)length1;//計算文件的壓縮率fclose(readfile);fclose(writefile);cout<<"壓縮率為:"<<div*100<<"%"<<endl;return;}2.3.2解壓縮函數(shù)解壓時也是先把文件整體讀入,通過哈夫曼編碼的長短,依次解碼,從原來的位存儲還原到字節(jié)存儲voiddecompression(){ charfilename[255],outputfile[255],buf[255],bx[255];unsignedcharc;longi,j,m,n,f,p,l;longflength; doublelh;FILE*readfile,*writefile; cout<<"請輸入要解壓文件名:"; cin>>filename;readfile=fopen(strcat(filename,".hub"),"rb");if(readfile==NULL) { cout<<"文件打開失?。?!,請檢查該文件是否存在,或遇到未知文件"<<endl; return;}cout<<"輸入解壓后的文件名:";cin>>outputfile;writefile=fopen(outputfile,"wb");if(writefile==NULL) { cout<<"文件解壓失敗!"<<endl;return; } fread(&flength,sizeof(long),1,readfile);//讀取原文件長度,對文件進行定位 lh=flength;fread(&f,sizeof(long),1,readfile);fseek(readfile,f,SEEK_SET);fread(&n,sizeof(long),1,readfile);for(i=0;i<n;i++) { fread(&header[i].b,1,1,readfile);fread(&c,1,1,readfile);p=(long)c;//讀取原文件字符的權(quán)值header[i].count=p;header[i].bits[0]=0;if(p%8>0)m=p/8+1;elsem=p/8;for(j=0;j<m;j++) { fread(&c,1,1,readfile);f=c;itoa(f,buf,2);//將f轉(zhuǎn)換為二進制表示的字符串f=strlen(buf);for(l=8;l>f;l--) { strcat(header[i].bits,"0"); } strcat(header[i].bits,buf); }header[i].bits[p]=0; }for(i=0;i<n;i++)//根據(jù)哈夫曼編碼的長短,對結(jié)點進行排序 { for(j=i+1;j<n;j++) { if(strlen(header[i].bits)>strlen(header[j].bits)) { tmp=header[i];header[i]=header[j];header[j]=tmp; } } }p=strlen(header[n-1].bits);fseek(readfile,8,SEEK_SET);m=0;bx[0]=0;while(1)//通過哈夫曼編碼的長短,依次解碼,從原來的位存儲還原到字節(jié)存儲 { while(strlen(bx)<(unsignedint)p) { fread(&c,1,1,readfile);f=c;itoa(f,buf,2);f=strlen(buf);for(l=8;l>f;l--)//在單字節(jié)內(nèi)對相應(yīng)位置補0 { strcat(bx,"0"); } strcat(bx,buf); } for(i=0;i<n;i++) { if(memcmp(header[i].bits,bx,header[i].count)==0)break; } strcpy(bx,bx+header[i].count);/*從壓縮文件中的按位存儲還原到按字節(jié)存儲字符, 字符位置不改變*/ c=header[i].b;fwrite(&c,1,1,writefile);m++;//統(tǒng)計解壓縮后文件的長度if(m==flength)break;//flength是原文件長度 }fclose(readfile);fclose(writefile);cout<<"文件解壓成功!"<<endl;}第3章程序的測試分析及改進3.1測試結(jié)果源文件,壓縮文件,解壓文件,以及實現(xiàn)壓縮解壓的后臺過程如下:圖3-11.txt的源文件屬性圖3-2txt文件壓縮后的文件屬性圖3-3txt解壓后的文件屬性圖3-4后臺操作過程由圖可知此刻的壓縮率為24.8899%圖3-5源圖片圖3-6解壓后的圖片3.2程序的優(yōu)缺點及改進方案從測試的結(jié)果可以看出,該設(shè)計的壓縮和解壓縮基本能夠滿足要求,也基本達到了設(shè)計目的。當(dāng)然程序中也有需要改進的地方(1)該設(shè)計對于內(nèi)存較大文件壓縮的速率將會變得很慢,這是由于設(shè)計過程只是為了達到目的,而忽略了壓縮過程中對內(nèi)存的占用,這點需要改進。(2)程序沒有較強的通用性,僅僅只是針對霍夫曼編碼而寫的,如果需要擴展加上其他的編碼方法,程序又得重新來寫,不能滿足編寫大型程序的需要(3)程序的可讀性不是很強,我應(yīng)該在程序中多加一些注釋,便于理解的。第4章總結(jié)該程序設(shè)計,從基本上來說,已經(jīng)符合了的要求,我通過查閱資料認真思考,完成了本次課程設(shè)計。此次課程設(shè)計,是將數(shù)學(xué)問題用計算機語言來描述的一次實例,充分說明了,計算機與數(shù)學(xué)的不可分割性,兩者相輔相成,互相促進。此次程序中,我主要運用數(shù)組和循環(huán)語句來構(gòu)造程序結(jié)構(gòu)模型,起到了比較好的效果。在這次編程過程中,我也遇到了一些麻煩,就是在對命題公式進行標準判斷的時候,對容錯的循環(huán)語句是用for,還是用while語句做了哪一個更好的比較的,最終還是選擇的for循環(huán),由此可見,程序的編寫是需要動腦筋的,要認真分析,用最簡便實用的方法,編寫合乎規(guī)范的程序,才是我們這些學(xué)習(xí)者的應(yīng)該準備的。通過本次程序設(shè)計,我也認識了自己還有很多不足,需要進一步學(xué)習(xí)的地方,在接下來的學(xué)習(xí)中我會花更多時間,來認真加深知識理解與運用。致謝通過此次課程設(shè)計,明明白了獨立思考的重要性,也體會到了與人交流的重要性。我在完成此次設(shè)計中,向一些優(yōu)秀同學(xué)請教,在這里感謝他們對我在編程上的一些細節(jié)性的幫助,使我避免了一些細小的錯誤,通過他們的幫助,我精簡了一些程序語句,使程序變得跟簡潔,具有很強的可讀性。我更應(yīng)該感謝我們的李老師,是她給予我在很多方面的指導(dǎo),讓我的思路更加明細,條理更加清楚,少走了不少彎路,在這里我要對她說說謝謝,感謝她對我的無私教誨,感謝她對我的幫助總之,我要謝謝所有在這次設(shè)計中給我?guī)椭娜?,因為他們,我才順利,更加有效地完成設(shè)計任務(wù)。參考文獻譚浩強C++面向?qū)ο蟪绦蛟O(shè)計[M].北京:清華大學(xué)出版社.2007.譚浩強C程序設(shè)計[M].北京:清華大學(xué)出版社.2005.田麗華編碼理論[M].西安:西安電子科技大學(xué)出版社,2007.附錄源代碼:#include<stdio.h>#include<iostream.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<ctime>structhuofuman{unsignedcharb;//記錄字符在數(shù)組中的位置longcount;//字符出現(xiàn)頻率(權(quán)值)longparent,lch,rch;//定義哈夫曼樹指針變量charbits[256];//定義存儲哈夫曼編碼的數(shù)組}header[512],tmp;//壓縮voidcompress(){charfilename[255],outputfile[255],buf[512];unsignedcharc;longi,j,m,n,f,lh=0;longmin1,pt1,flength,length1,length2; doublediv;FILE*readfile,*writefile; cout<<"請輸入要壓縮的文件名:";cin>>filename;readfile=fopen(filename,"rb");if(readfile==NULL) {cout<<"文件打開失?。?!,請檢查該文件是否存在,或遇到未知文件"<<endl ; return; } cout<<"輸入壓縮之后的文件名:";cin>>outputfile;writefile=fopen(strcat(outputfile,".hub"),"wb");if(writefile==NULL) { cout<<"文件壓縮失敗!"<<endl;return; } flength=0;while(!feof(readfile)) { fread(&c,1,1,readfile);header[c].count++;//字符重復(fù)出現(xiàn)頻率+1flength++;//字符出現(xiàn)原文件長度+1 }lh=flength; flength--;length1=flength;//原文件長度用作求壓縮率的分母header[c].count--;for(i=0;i<512;i++) { if(header[i].count!=0)header[i].b=(unsignedchar)i; /*將每個哈夫曼碼值及其對應(yīng)的ASCII碼存放在一維數(shù)組header[i]中,且編碼表中的下標和ASCII碼滿足順序存放關(guān)系*/elseheader[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1;//對結(jié)點進行初始化 }for(i=0;i<256;i++)//根據(jù)頻率(權(quán)值)大小,對結(jié)點進行排序,選擇較小的結(jié)點進樹 { for(j=i+1;j<256;j++) { if(header[i].count<header[j].count) { tmp=header[i];header[i]=header[j];header[j]=tmp; } } } for(i=0;i<256;i++) if(header[i].count==0)break;n=i;//外部葉子結(jié)點數(shù)為n個時,內(nèi)部結(jié)點數(shù)為n-1,整個哈夫曼樹的需要的結(jié)點數(shù)為2*n-1.m=2*n-1;for(i=n;i<m;i++)//構(gòu)建哈夫曼樹 { min1=999999999;//預(yù)設(shè)的最大權(quán)值,即結(jié)點出現(xiàn)的最大次數(shù)for(j=0;j<i;j++) { if(header[j].parent!=-1)continue; //parent!=-1說明該結(jié)點已存在哈夫曼樹中,跳出循環(huán)重新選擇新結(jié)點*/if(min1>header[j].count) { pt1=j;min1=header[j].count;continue; } } header[i].count=header[pt1].count;header[pt1].parent=i;//依據(jù)parent域值(結(jié)點層數(shù))確定樹中結(jié)點之間的關(guān)系header[i].lch=pt1;//計算左分支權(quán)值大小min1=999999999;for(j=0;j<i;j++) { if(header[j].parent!=-1)continue;if(min1>header[j].count) { pt1=j;min1=header[j].count;continue; } } header[i].count+=header[pt1].count;header[i].rch=pt1;//計算右分支權(quán)值大小header[pt1].parent=i; } for(i=0;i<n;i++)//哈夫曼無重復(fù)前綴編碼 { f=i;header[i].bits[0]=0;//根結(jié)點編碼0while(header[f].parent!=-1) { j=f;f=header[f].parent;if(header[f].lch==j)//置左分支編碼0 { j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1); //依次存儲連接“0”“1”編碼header[i].bits[0]='0'; } else//置右分支編碼1 { j=strlen(header[i].bits);memmove(header[i].bits+1,header[i].bits,j+1);header[i].bits[0]='1'; } } } fseek(readfile,0,SEEK_SET);//從文件開始位置向前移動0字節(jié),即定位到文件開始位置fwrite(&flength,sizeof(int),1,writefile); /*用來將數(shù)據(jù)寫入文件流中,參數(shù)flength指向欲寫入的數(shù)據(jù)地址, 總共寫入的字符數(shù)以參數(shù)size*int來決定,返回實際寫入的int數(shù)目1*/fseek(writefile,8,SEEK_SET);buf[0]=0;//定義緩沖區(qū),它的二進制表示00000000f=0;pt1=8; /*假設(shè)原文件第一個字符是"A",8位2進制為01000001,編碼后為0110識別編碼第一個'0', 那么我們就可以將其左移一位,看起來沒什么變化。下一個是'1',應(yīng)該|1,結(jié)果00000001 同理4位都做完,應(yīng)該是00000110,由于字節(jié)中的8位并沒有全部用完,我們應(yīng)該繼續(xù)讀下一個字符, 根據(jù)編碼表繼續(xù)拼完剩下的4位,如果字符的編碼不足4位,還要繼續(xù)讀一個字符, 如果字符編碼超過4位,那么我們將把剩下的位信息拼接到一個新的字節(jié)里*/while(!feof(readfile)) { c=fgetc(readfile);f++;for(i=0;i<n;i++) { if(c==header[i].b)break; } strcat(buf,header[i].bits);j=strlen(buf);c=0; while(j>=8)//對哈夫曼編碼位操作進行壓縮存儲 { for(i=0;i<8;i++) { if(buf[i]=='1')c=(c<<1)|1;elsec=c<<1; } fwrite(&c,1,1,writefile);pt1++;//統(tǒng)計壓縮后文件的長度strcpy(buf,buf+8);//一個字節(jié)一個字節(jié)拼接j=strlen(buf); } if(f==flength)break; } if(j>0)//對哈夫曼編碼位操作進行壓縮存儲 { strcat(buf,"00000000");for(i=0;i<8;i++) { if(buf[i]=='1')c=(c<<1)|1;elsec=c<<1; } fwrite(&c,1,1,writefile);pt1++; } fseek(writefile,4,SEEK_SET);fwrite(&pt1,sizeof(long),1,writefile);fseek(writefile,pt1,SEEK_SET);fwrite(&n,sizeof(long),1,writefile);for(i=0;i<n;i++) { fwrite(&(header[i].b),1,1,writefile);c=strlen(header[i].bits);fwrite(&c,1,1,writefile);j=strlen(header[i].bits);if(j%8!=0)//若存儲的位數(shù)不是8的倍數(shù),則補0 { for(f=j%8;f<8;f++)strcat(header[i].bits,"0"); } while(header[i].bits[0]!=0) { c=0;for(j=0;j<8;j++)//字符的有效存儲不超過8位,則對有效位數(shù)左移實現(xiàn)兩字符編碼的連接 { if(header[i].bits[j]=='1')c=(c<<1)|1;//|1不改變原位置上的“0”“1”值elsec=c<<1; } strcpy(header[i].bits,header[i].bits+8);//把字符的編碼按原先存儲順序連接fwrite(&c,1,1,writefile); } } cout<<"文件壓縮成功!"<<endl; length2=pt1--; div=((double)length1-(double)length2)/(double)length1;//計算文件的壓縮率fclose(readfile);fclose(writefile);cout<<"壓縮率為:"<<div*100<<"%"<<endl;return;}//解壓voiddecompression(){ charfilename[255],outputfile[255],buf[255],bx[255];unsignedcharc;longi,j,m,n,f,p,l;longflength; doublelh;FILE*readfile,*writefile; cout<<"請輸入要解壓文件名:"; cin>>filename;readfile=fopen(strcat(filename,".hub"),"rb");if(readfile==NULL) { cout<<"文件打開失敗??!,請檢查該文件是否存在,或遇到未知文件"<<endl; return;}cout<<"輸入解壓后的文件名:";cin>>outputfile;writefile=fopen(outputfile,"wb");if(writefile==NULL) { cout<<"文件解壓失敗!"<<endl;return; } fread(&flength,sizeof(long),1,readfile);//讀取原文件長度,對文件進行定位 lh=flength;fread(&f,sizeof(long),1,readfile);fseek(readfile,f,SEEK_SET);fread(&n,sizeof(long),1,readfile);for(i=0;i<n;i++) { fread(&header[i].b,1,1,readfile);fread(&c,1,1,readfile);p=(long)c;//讀取原文件字符的權(quán)值header[i].count=p;header[i].bits[0]=0;if(p%8>0)m=p/8+1;elsem=p/8;for(j=0;j<m;j++) { fread(&c,1,1,readfile);f=c;itoa(f,buf,2);//將f轉(zhuǎn)換為二進制表示的字符串f=strlen(buf);for(l=8;l>f;l--) { strcat(header[i].bits,"0"); } strcat(header[i].bits,buf); }header[i].bits[p]=0; }for(i=0;i<n;i++)//根據(jù)哈夫曼編碼的長短,對結(jié)點進行排序 { for(j=i+1;j<n;j++) { if(strlen(header[i].bits)>strlen(header[j].bits)) { tmp=header[i];header[i]=header[j];header[j]=tmp; } } }p=strlen(header[n-1].bits);fseek(readfile,8,SEEK_SET);m=0;bx[0]=0;while(1)//通過哈夫曼編碼的長短,依次解碼,從原來的位存儲還原到字節(jié)存儲 { while(strlen(bx)<(unsignedint)p) { fread(&c,1,1,readfile);f=c;itoa(f,buf,2);f=strlen(buf);for(l=8;l>f;l--)//在單字節(jié)內(nèi)對相應(yīng)位置補0 { strcat(bx,"0"); } strcat(bx,buf); } for(i=0;i<n;i++) { if(memcmp(header[i].bits,bx,header[i].count)==0)break; } strcpy(bx,bx+header[i].count);/*從壓縮文件中的按位存儲還原到按字節(jié)存儲字符, 字符位置不改變*/ c=header[i].b;fwrite(&c,1,1,writefile);m++;//統(tǒng)計解壓縮后文件的長度if(m==flength)break;//flength是原文件長度 }fclose(readfile);fclose(writefile);cout<<"文件解壓成功!"<<endl;}/*主函數(shù)*/voidmain(){cout<<"霍夫曼解、壓文件系統(tǒng)"<<endl<<endl;cout<<"1.對文件進行壓縮"<<endl;cout<<"2.對文件進行解壓"<<endl;cout<<"0.退出系統(tǒng)"<<endl<<endl; cout<<"注意:壓縮輸入1,解壓輸入2,退出選擇0"<<endl;while(1){ inta; cout<<"請選擇項目:"; cin>>a;while(a!=0&&a!=1&&a!=2) { cout<<"輸入錯誤,請核對后再輸入"<<endl;cout<<"請選擇項目:";cin>>a; }switch(a){case1:compress();break;case2:decompression();break;case0:exit(0);}}system("pause");//任意鍵繼續(xù)system("cls");//清屏}碩士論文是碩士研究生所撰寫的學(xué)術(shù)論文,具有一定的理論深度和更高的學(xué)術(shù)水平,更加強調(diào)作者思想觀點的獨創(chuàng)性,以及研究成果應(yīng)具備更強的實用價值和更高的科學(xué)價值。碩士論文是碩士研究生所撰寫的學(xué)術(shù)論文。優(yōu)秀的碩士論文能夠反映出作者對所學(xué)習(xí)專業(yè)的理論知識掌握的程度和水平,能夠幫助作者構(gòu)建起良好的完整的知識體系,還能夠反映作者獨立的科研能力和學(xué)術(shù)理論的應(yīng)用水平,對研究的課題的思考和獨立見解。較之學(xué)士論文,碩士論文應(yīng)當(dāng)具有一定的理論深度和更高的學(xué)術(shù)水平,更加強調(diào)作者思想觀點的獨創(chuàng)性,以及研究成果應(yīng)具備更強的實用價值和更高的科學(xué)價值。因而撰寫碩士論文將對作者提出更高的要求——數(shù)據(jù)資料翔實充分、論證分析詳盡縝密、推理演算思路清晰、論文結(jié)構(gòu)規(guī)范清晰、專業(yè)詞匯運用準確。電路與系統(tǒng)學(xué)科研究電路與系統(tǒng)的理論、分析、測試、設(shè)計和物理實現(xiàn)。它是信息與通信工程和電子科學(xué)與技術(shù)這兩個學(xué)科之間的橋梁,又是信號與信息處理、通信、控制、計算機乃至電力、電子等諸方面研究和開發(fā)的理論與技術(shù)基礎(chǔ)。因為電路與系統(tǒng)學(xué)科的有力支持,才使得利用現(xiàn)代電子科學(xué)技術(shù)和最新元器件實現(xiàn)復(fù)雜、高性能的各種信息和通信網(wǎng)絡(luò)與系統(tǒng)成為現(xiàn)實。信息與通訊產(chǎn)業(yè)的高速發(fā)展以及微電子器件集成規(guī)模的迅速增大,使得電子電路與系統(tǒng)走向數(shù)字化、集成化、多維化。電路與系統(tǒng)學(xué)科理論逐步由經(jīng)典向現(xiàn)代過渡,同時和信息與通訊工程、計算機科學(xué)與技術(shù)、生物電子學(xué)等學(xué)科交疊,相互滲透,形成一系列的邊緣、交叉學(xué)科,如新的微處理器設(shè)計、各種軟、硬件數(shù)字信號處理系統(tǒng)設(shè)計、人工神經(jīng)網(wǎng)絡(luò)及其硬件實現(xiàn)等。廣告提案廣告提案廣告提案的準備工作創(chuàng)意、表現(xiàn)提案廣告實施計劃提案策略提案廣告策劃大師廣告策劃的含義、特點及作用廣告策劃的內(nèi)容和程序廣告策劃的基本原則廣告調(diào)查與分析廣告市場調(diào)查的內(nèi)容廣告市場調(diào)查的步驟廣告市場調(diào)查問卷的構(gòu)成設(shè)計市場細分與產(chǎn)品定位市場細分產(chǎn)品定位廣告戰(zhàn)略策劃廣告預(yù)算策劃廣告創(chuàng)意廣告文案創(chuàng)意第一節(jié)平面廣告創(chuàng)意廣播廣告創(chuàng)意電視廣告創(chuàng)意網(wǎng)絡(luò)廣告創(chuàng)意廣告媒體與渠道策劃廣告推進程序策劃廣告實施策略廣告效果評估廣告策劃文案寫作廣告策劃書的編制技巧可行性研究報告行業(yè)分析報告可行性研究可行性報告項目可行性報告行業(yè)調(diào)查報告可行性報告格式調(diào)查報告報告格式辭職報告述職報告實習(xí)報告社會實踐報告報告范文申請報告材料加工碩士論文,主要介紹液態(tài)金屬的成型工藝、金屬焊接成型和材料表面處理工程。具體包括:液態(tài)金屬的工藝性能、砂型鑄造、鑄造工藝設(shè)計、鑄造工藝CAD/CAE、電弧的特性、焊絲的熔滴過渡、焊縫成形、埋弧焊、氬弧焊、二氧化碳氣體保護焊、等離子弧焊、熱噴涂、氣相沉積、激光表面工程技術(shù)等。是碩士研究生所撰寫的學(xué)術(shù)論文,具有一定的理論深度和更高的學(xué)術(shù)水平,更加強調(diào)作者思想觀點的獨創(chuàng)性,以及研究成果應(yīng)具備更強的實用價值和更高的科學(xué)價值。試卷分析中學(xué)試卷高中試卷高考試卷英語四級試卷成人高考試卷考卷公務(wù)員考試小學(xué)試卷中考試卷高考試卷高考試卷數(shù)學(xué)試卷英語試卷語文試卷醫(yī)學(xué)論文,論文下載中心免費論文,畢業(yè)論文,各專業(yè)論文論文聯(lián)盟-論文網(wǎng),論文,論文下載,論文發(fā)表,論文網(wǎng)站,畢業(yè)論文,論文,畢業(yè)論文,論文下載,論文范文-找論文網(wǎng)論文,畢業(yè)論文,論文下載,論文范文-找論文網(wǎng)
論大學(xué)生寫作能力寫作能力是對自己所積累的信息進行選擇、提取、加工、改造并將之形成為書面文字的能力。積累是寫作的基礎(chǔ),積累越厚實,寫作就越有基礎(chǔ),文章就能根深葉茂開奇葩。沒有積累,胸?zé)o點墨,怎么也不會寫出作文來的。寫作能力是每個大學(xué)生必須具備的能力。從目前高校整體情況上看,大學(xué)生的寫作能力較為欠缺。一、大學(xué)生應(yīng)用文寫作能力的定義那么,大學(xué)生的寫作能力究竟是指什么呢?葉圣陶先生曾經(jīng)說過,“大學(xué)畢業(yè)生不一定能寫小說詩歌,但是一定要寫工作和生活中實用的文章,而且非寫得既通順又扎實不可?!睂τ诖髮W(xué)生的寫作能力應(yīng)包含什么,可能有多種理解,但從葉圣陶先生的談話中,我認為:大學(xué)生寫作能力應(yīng)包括應(yīng)用寫作能力和文學(xué)寫作能力,而前者是必須的,后者是“不一定”要具備,能具備則更好。眾所周知,對于大學(xué)生來說,是要寫畢業(yè)論文的,我認為寫作論文
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年版在線教育平臺合作開發(fā)合同4篇
- 2025年度醫(yī)療衛(wèi)生機構(gòu)專業(yè)技術(shù)人員聘用合同4篇
- 二零二五年度殯葬服務(wù)與社區(qū)養(yǎng)老服務(wù)對接合同3篇
- 2025年度農(nóng)副產(chǎn)品線上線下銷售與物流一體化服務(wù)合同3篇
- 二零二五年度投資收益分成合同
- 2025版高端定制門窗工程承攬合同3篇
- 2025年度企業(yè)會計人員專項聘用合同范本
- 2025年度票據(jù)質(zhì)押資產(chǎn)證券化專項合同4篇
- 二零二五年度戶外木制品加工承包合同2篇
- 2025年度面粉行業(yè)二零二五年度面粉產(chǎn)品追溯體系共建合同3篇
- 江蘇省蘇州市2024-2025學(xué)年高三上學(xué)期1月期末生物試題(有答案)
- 銷售與銷售目標管理制度
- 人教版(2025新版)七年級下冊英語:寒假課內(nèi)預(yù)習(xí)重點知識默寫練習(xí)
- 2024年食品行業(yè)員工勞動合同標準文本
- 2025年第一次工地開工會議主要議程開工大吉模板
- 全屋整裝售后保修合同模板
- 高中生物學(xué)科學(xué)推理能力測試
- GB/T 44423-2024近紅外腦功能康復(fù)評估設(shè)備通用要求
- 2024-2030年中國減肥行業(yè)市場發(fā)展分析及發(fā)展趨勢與投資研究報告
- 運動技能學(xué)習(xí)
- 單側(cè)雙通道內(nèi)鏡下腰椎間盤摘除術(shù)手術(shù)護理配合1
評論
0/150
提交評論