版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本科課程設(shè)計(jì)(論文)[3]講的是編碼理論中的知識(shí),是我對霍夫曼編碼的具體實(shí)現(xiàn)方法有了深刻的了解,對我實(shí)現(xiàn)具體的算法很大幫助第2章設(shè)計(jì)簡介及設(shè)計(jì)方案論述2.1霍夫曼編碼介紹霍夫曼編碼(HuffmanCoding)是一種熵編碼編碼壓縮方式,霍夫曼編碼是可變字長編碼(VLC)的一種?;舴蚵鼔嚎s是個(gè)無損的壓縮算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬于可變代碼長度算法一族。意思是不同符號(hào)(例如,文本文件中的字符)用一個(gè)特定長度的位序列替代。因此,在文件中出現(xiàn)頻率高的符號(hào),使用短的位序列,而那些很少出現(xiàn)的符號(hào),則用較長的位序列?;舴蚵幋a的碼長是變化的,對于出現(xiàn)頻率高的信息,編碼的長度較短;而對于出現(xiàn)頻率低的信息,編碼長度較長。這樣,處理全部信息的總碼長一定小于實(shí)際信息的符號(hào)長度?;舴蚵幋a是一種根據(jù)字母的使用頻率而設(shè)計(jì)的變長碼,能提高信息的傳輸效率,至今仍有廣泛的應(yīng)用?;舴蚵幋a方法的具體過程是:首先把信源的各個(gè)輸出符號(hào)序列按概率遞降的順序排列起來,求其中概率最小的兩個(gè)序列的概率之和,并把這個(gè)概率之和看做是一個(gè)符號(hào)序列的概率,再與其他序列依概率遞降順序排列(參與求概率之和的這兩個(gè)序列不再出現(xiàn)在新的排列之中)。然后,對參與概率求和的兩個(gè)符號(hào)序列分別賦予二進(jìn)制數(shù)字0和1。繼續(xù)這樣的操作,直到剩下一個(gè)以1為概率的符號(hào)序列。最后,按照與編碼過程相反的順序讀出各個(gè)符號(hào)序列所對應(yīng)的二進(jìn)制數(shù)字組,就可分別得到各該符號(hào)序列的碼字2.2設(shè)計(jì)簡介先是讀取文件,統(tǒng)計(jì)文件中不同字符出現(xiàn)的次數(shù),并存入數(shù)組中,然后將數(shù)組中不同的字符對應(yīng)的ASCII值存入另外數(shù)組中,按照數(shù)組個(gè)ASCII及相應(yīng)出現(xiàn)的頻率的來建立霍夫曼編碼,然后將碼表存入壓縮文件,再將各字符對應(yīng)的霍夫曼編碼寫入壓縮文件中,實(shí)現(xiàn)文件壓縮。詳細(xì)代碼如下:2.3設(shè)計(jì)方案2.3.1壓縮函數(shù)首先讀取文件,統(tǒng)計(jì)字符對應(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; /*將每個(gè)哈夫曼碼值及其對應(yīng)的ASCII碼存放在一維數(shù)組header[i]中,且編碼表中的下標(biāo)和ASCII碼滿足順序存放關(guān)系*/elseheader[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1;//對結(jié)點(diǎn)進(jìn)行初始化 }for(i=0;i<256;i++)//根據(jù)頻率(權(quán)值)大小,對結(jié)點(diǎn)進(jìn)行排序,選擇較小的結(jié)點(diǎn)進(jìn)樹 { 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é)點(diǎn)數(shù)為n個(gè)時(shí),內(nèi)部結(jié)點(diǎn)數(shù)為n-1,整個(gè)哈夫曼樹的需要的結(jié)點(diǎn)數(shù)為2*n-1.m=2*n-1;for(i=n;i<m;i++)//構(gòu)建哈夫曼樹 { min1=999999999;//預(yù)設(shè)的最大權(quán)值,即結(jié)點(diǎn)出現(xiàn)的最大次數(shù)for(j=0;j<i;j++) { if(header[j].parent!=-1)continue; //parent!=-1說明該結(jié)點(diǎn)已存在哈夫曼樹中,跳出循環(huán)重新選擇新結(jié)點(diǎn)*/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é)點(diǎn)層數(shù))確定樹中結(jié)點(diǎn)之間的關(guān)系header[i].lch=pt1;//計(jì)算左分支權(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;//計(jì)算右分支權(quán)值大小header[pt1].parent=i; } for(i=0;i<n;i++)//哈夫曼無重復(fù)前綴編碼 { f=i;header[i].bits[0]=0;//根結(jié)點(diǎn)編碼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); //依次存儲(chǔ)連接“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);//從文件開始位置向前移動(dòng)0字節(jié),即定位到文件開始位置fwrite(&flength,sizeof(int),1,writefile); /*用來將數(shù)據(jù)寫入文件流中,參數(shù)flength指向欲寫入的數(shù)據(jù)地址, 總共寫入的字符數(shù)以參數(shù)size*int來決定,返回實(shí)際寫入的int數(shù)目1*/fseek(writefile,8,SEEK_SET);buf[0]=0;//定義緩沖區(qū),它的二進(jìn)制表示00000000f=0;pt1=8; /*假設(shè)原文件第一個(gè)字符是"A",8位2進(jìn)制為01000001,編碼后為0110識(shí)別編碼第一個(gè)'0', 那么我們就可以將其左移一位,看起來沒什么變化。下一個(gè)是'1',應(yīng)該|1,結(jié)果00000001 同理4位都做完,應(yīng)該是00000110,由于字節(jié)中的8位并沒有全部用完,我們應(yīng)該繼續(xù)讀下一個(gè)字符, 根據(jù)編碼表繼續(xù)拼完剩下的4位,如果字符的編碼不足4位,還要繼續(xù)讀一個(gè)字符, 如果字符編碼超過4位,那么我們將把剩下的位信息拼接到一個(gè)新的字節(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)//對哈夫曼編碼位操作進(jìn)行壓縮存儲(chǔ) { 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)計(jì)壓縮后文件的長度strcpy(buf,buf+8);//一個(gè)字節(jié)一個(gè)字節(jié)拼接j=strlen(buf); } if(f==flength)break; } if(j>0)//對哈夫曼編碼位操作進(jìn)行壓縮存儲(chǔ) { 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)//若存儲(chǔ)的位數(shù)不是8的倍數(shù),則補(bǔ)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++)//字符的有效存儲(chǔ)不超過8位,則對有效位數(shù)左移實(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);//把字符的編碼按原先存儲(chǔ)順序連接fwrite(&c,1,1,writefile); } } cout<<"文件壓縮成功!"<<endl; length2=pt1--; div=((double)length1-(double)length2)/(double)length1;//計(jì)算文件的壓縮率fclose(readfile);fclose(writefile);cout<<"壓縮率為:"<<div*100<<"%"<<endl;return;}2.3.2解壓縮函數(shù)解壓時(shí)也是先把文件整體讀入,通過哈夫曼編碼的長短,依次解碼,從原來的位存儲(chǔ)還原到字節(jié)存儲(chǔ)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);//讀取原文件長度,對文件進(jìn)行定位 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)換為二進(jì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é)點(diǎn)進(jìn)行排序 { 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)//通過哈夫曼編碼的長短,依次解碼,從原來的位存儲(chǔ)還原到字節(jié)存儲(chǔ) { 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)位置補(bǔ)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);/*從壓縮文件中的按位存儲(chǔ)還原到按字節(jié)存儲(chǔ)字符, 字符位置不改變*/ c=header[i].b;fwrite(&c,1,1,writefile);m++;//統(tǒng)計(jì)解壓縮后文件的長度if(m==flength)break;//flength是原文件長度 }fclose(readfile);fclose(writefile);cout<<"文件解壓成功!"<<endl;}第3章程序的測試分析及改進(jìn)3.1測試結(jié)果源文件,壓縮文件,解壓文件,以及實(shí)現(xiàn)壓縮解壓的后臺(tái)過程如下:圖3-11.txt的源文件屬性圖3-2txt文件壓縮后的文件屬性圖3-3txt解壓后的文件屬性圖3-4后臺(tái)操作過程由圖可知此刻的壓縮率為24.8899%圖3-5源圖片圖3-6解壓后的圖片3.2程序的優(yōu)缺點(diǎn)及改進(jìn)方案從測試的結(jié)果可以看出,該設(shè)計(jì)的壓縮和解壓縮基本能夠滿足要求,也基本達(dá)到了設(shè)計(jì)目的。當(dāng)然程序中也有需要改進(jìn)的地方(1)該設(shè)計(jì)對于內(nèi)存較大文件壓縮的速率將會(huì)變得很慢,這是由于設(shè)計(jì)過程只是為了達(dá)到目的,而忽略了壓縮過程中對內(nèi)存的占用,這點(diǎn)需要改進(jìn)。(2)程序沒有較強(qiáng)的通用性,僅僅只是針對霍夫曼編碼而寫的,如果需要擴(kuò)展加上其他的編碼方法,程序又得重新來寫,不能滿足編寫大型程序的需要(3)程序的可讀性不是很強(qiáng),我應(yīng)該在程序中多加一些注釋,便于理解的。第4章總結(jié)該程序設(shè)計(jì),從基本上來說,已經(jīng)符合了的要求,我通過查閱資料認(rèn)真思考,完成了本次課程設(shè)計(jì)。此次課程設(shè)計(jì),是將數(shù)學(xué)問題用計(jì)算機(jī)語言來描述的一次實(shí)例,充分說明了,計(jì)算機(jī)與數(shù)學(xué)的不可分割性,兩者相輔相成,互相促進(jìn)。此次程序中,我主要運(yùn)用數(shù)組和循環(huán)語句來構(gòu)造程序結(jié)構(gòu)模型,起到了比較好的效果。在這次編程過程中,我也遇到了一些麻煩,就是在對命題公式進(jìn)行標(biāo)準(zhǔn)判斷的時(shí)候,對容錯(cuò)的循環(huán)語句是用for,還是用while語句做了哪一個(gè)更好的比較的,最終還是選擇的for循環(huán),由此可見,程序的編寫是需要?jiǎng)幽X筋的,要認(rèn)真分析,用最簡便實(shí)用的方法,編寫合乎規(guī)范的程序,才是我們這些學(xué)習(xí)者的應(yīng)該準(zhǔn)備的。通過本次程序設(shè)計(jì),我也認(rèn)識(shí)了自己還有很多不足,需要進(jìn)一步學(xué)習(xí)的地方,在接下來的學(xué)習(xí)中我會(huì)花更多時(shí)間,來認(rèn)真加深知識(shí)理解與運(yùn)用。致謝通過此次課程設(shè)計(jì),明明白了獨(dú)立思考的重要性,也體會(huì)到了與人交流的重要性。我在完成此次設(shè)計(jì)中,向一些優(yōu)秀同學(xué)請教,在這里感謝他們對我在編程上的一些細(xì)節(jié)性的幫助,使我避免了一些細(xì)小的錯(cuò)誤,通過他們的幫助,我精簡了一些程序語句,使程序變得跟簡潔,具有很強(qiáng)的可讀性。我更應(yīng)該感謝我們的李老師,是她給予我在很多方面的指導(dǎo),讓我的思路更加明細(xì),條理更加清楚,少走了不少彎路,在這里我要對她說說謝謝,感謝她對我的無私教誨,感謝她對我的幫助總之,我要謝謝所有在這次設(shè)計(jì)中給我?guī)椭娜?,因?yàn)樗麄?,我才順利,更加有效地完成設(shè)計(jì)任務(wù)。參考文獻(xiàn)譚浩強(qiáng)C++面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:清華大學(xué)出版社.2007.譚浩強(qiáng)C程序設(shè)計(jì)[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];//定義存儲(chǔ)哈夫曼編碼的數(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; /*將每個(gè)哈夫曼碼值及其對應(yīng)的ASCII碼存放在一維數(shù)組header[i]中,且編碼表中的下標(biāo)和ASCII碼滿足順序存放關(guān)系*/elseheader[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1;//對結(jié)點(diǎn)進(jìn)行初始化 }for(i=0;i<256;i++)//根據(jù)頻率(權(quán)值)大小,對結(jié)點(diǎn)進(jìn)行排序,選擇較小的結(jié)點(diǎn)進(jìn)樹 { 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é)點(diǎn)數(shù)為n個(gè)時(shí),內(nèi)部結(jié)點(diǎn)數(shù)為n-1,整個(gè)哈夫曼樹的需要的結(jié)點(diǎn)數(shù)為2*n-1.m=2*n-1;for(i=n;i<m;i++)//構(gòu)建哈夫曼樹 { min1=999999999;//預(yù)設(shè)的最大權(quán)值,即結(jié)點(diǎn)出現(xiàn)的最大次數(shù)for(j=0;j<i;j++) { if(header[j].parent!=-1)continue; //parent!=-1說明該結(jié)點(diǎn)已存在哈夫曼樹中,跳出循環(huán)重新選擇新結(jié)點(diǎn)*/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é)點(diǎn)層數(shù))確定樹中結(jié)點(diǎn)之間的關(guān)系header[i].lch=pt1;//計(jì)算左分支權(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;//計(jì)算右分支權(quán)值大小header[pt1].parent=i; } for(i=0;i<n;i++)//哈夫曼無重復(fù)前綴編碼 { f=i;header[i].bits[0]=0;//根結(jié)點(diǎn)編碼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); //依次存儲(chǔ)連接“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);//從文件開始位置向前移動(dòng)0字節(jié),即定位到文件開始位置fwrite(&flength,sizeof(int),1,writefile); /*用來將數(shù)據(jù)寫入文件流中,參數(shù)flength指向欲寫入的數(shù)據(jù)地址, 總共寫入的字符數(shù)以參數(shù)size*int來決定,返回實(shí)際寫入的int數(shù)目1*/fseek(writefile,8,SEEK_SET);buf[0]=0;//定義緩沖區(qū),它的二進(jìn)制表示00000000f=0;pt1=8; /*假設(shè)原文件第一個(gè)字符是"A",8位2進(jìn)制為01000001,編碼后為0110識(shí)別編碼第一個(gè)'0', 那么我們就可以將其左移一位,看起來沒什么變化。下一個(gè)是'1',應(yīng)該|1,結(jié)果00000001 同理4位都做完,應(yīng)該是00000110,由于字節(jié)中的8位并沒有全部用完,我們應(yīng)該繼續(xù)讀下一個(gè)字符, 根據(jù)編碼表繼續(xù)拼完剩下的4位,如果字符的編碼不足4位,還要繼續(xù)讀一個(gè)字符, 如果字符編碼超過4位,那么我們將把剩下的位信息拼接到一個(gè)新的字節(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)//對哈夫曼編碼位操作進(jìn)行壓縮存儲(chǔ) { 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)計(jì)壓縮后文件的長度strcpy(buf,buf+8);//一個(gè)字節(jié)一個(gè)字節(jié)拼接j=strlen(buf); } if(f==flength)break; } if(j>0)//對哈夫曼編碼位操作進(jìn)行壓縮存儲(chǔ) { 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)//若存儲(chǔ)的位數(shù)不是8的倍數(shù),則補(bǔ)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++)//字符的有效存儲(chǔ)不超過8位,則對有效位數(shù)左移實(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);//把字符的編碼按原先存儲(chǔ)順序連接fwrite(&c,1,1,writefile); } } cout<<"文件壓縮成功!"<<endl; length2=pt1--; div=((double)length1-(double)length2)/(double)length1;//計(jì)算文件的壓縮率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);//讀取原文件長度,對文件進(jìn)行定位 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)換為二進(jì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é)點(diǎn)進(jìn)行排序 { 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)//通過哈夫曼編碼的長短,依次解碼,從原來的位存儲(chǔ)還原到字節(jié)存儲(chǔ) { 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)位置補(bǔ)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);/*從壓縮文件中的按位存儲(chǔ)還原到按字節(jié)存儲(chǔ)字符, 字符位置不改變*/ c=header[i].b;fwrite(&c,1,1,writefile);m++;//統(tǒng)計(jì)解壓縮后文件的長度if(m==flength)break;//flength是原文件長度 }fclose(readfile);fclose(writefile);cout<<"文件解壓成功!"<<endl;}/*主函數(shù)*/voidmain(){cout<<"霍夫曼解、壓文件系統(tǒng)"<<endl<<endl;cout<<"1.對文件進(jìn)行壓縮"<<endl;cout<<"2.對文件進(jìn)行解壓"<<endl;cout<<"0.退出系統(tǒng)"<<endl<<endl; cout<<"注意:壓縮輸入1,解壓輸入2,退出選擇0"<<endl;while(1){ inta; cout<<"請選擇項(xiàng)目:"; cin>>a;while(a!=0&&a!=1&&a!=2) { cout<<"輸入錯(cuò)誤,請核對后再輸入"<<endl;cout<<"請選擇項(xiàng)目:";cin>>a; }switch(a){case1:compress();break;case2:decompression();break;case0:exit(0);}}system("pause");//任意鍵繼續(xù)system("cls");//清屏}碩士論文是碩士研究生所撰寫的學(xué)術(shù)論文,具有一定的理論深度和更高的學(xué)術(shù)水平,更加強(qiáng)調(diào)作者思想觀點(diǎn)的獨(dú)創(chuàng)性,以及研究成果應(yīng)具備更強(qiáng)的實(shí)用價(jià)值和更高的科學(xué)價(jià)值。碩士論文是碩士研究生所撰寫的學(xué)術(shù)論文。優(yōu)秀的碩士論文能夠反映出作者對所學(xué)習(xí)專業(yè)的理論知識(shí)掌握的程度和水平,能夠幫助作者構(gòu)建起良好的完整的知識(shí)體系,還能夠反映作者獨(dú)立的科研能力和學(xué)術(shù)理論的應(yīng)用水平,對研究的課題的思考和獨(dú)立見解。較之學(xué)士論文,碩士論文應(yīng)當(dāng)具有一定的理論深度和更高的學(xué)術(shù)水平,更加強(qiáng)調(diào)作者思想觀點(diǎn)的獨(dú)創(chuàng)性,以及研究成果應(yīng)具備更強(qiáng)的實(shí)用價(jià)值和更高的科學(xué)價(jià)值。因而撰寫碩士論文將對作者提出更高的要求——數(shù)據(jù)資料翔實(shí)充分、論證分析詳盡縝密、推理演算思路清晰、論文結(jié)構(gòu)規(guī)范清晰、專業(yè)詞匯運(yùn)用準(zhǔn)確。電路與系統(tǒng)學(xué)科研究電路與系統(tǒng)的理論、分析、測試、設(shè)計(jì)和物理實(shí)現(xiàn)。它是信息與通信工程和電子科學(xué)與技術(shù)這兩個(gè)學(xué)科之間的橋梁,又是信號(hào)與信息處理、通信、控制、計(jì)算機(jī)乃至電力、電子等諸方面研究和開發(fā)的理論與技術(shù)基礎(chǔ)。因?yàn)殡娐放c系統(tǒng)學(xué)科的有力支持,才使得利用現(xiàn)代電子科學(xué)技術(shù)和最新元器件實(shí)現(xiàn)復(fù)雜、高性能的各種信息和通信網(wǎng)絡(luò)與系統(tǒng)成為現(xiàn)實(shí)。信息與通訊產(chǎn)業(yè)的高速發(fā)展以及微電子器件集成規(guī)模的迅速增大,使得電子電路與系統(tǒng)走向數(shù)字化、集成化、多維化。電路與系統(tǒng)學(xué)科理論逐步由經(jīng)典向現(xiàn)代過渡,同時(shí)和信息與通訊工程、計(jì)算機(jī)科學(xué)與技術(shù)、生物電子學(xué)等學(xué)科交疊,相互滲透,形成一系列的邊緣、交叉學(xué)科,如新的微處理器設(shè)計(jì)、各種軟、硬件數(shù)字信號(hào)處理系統(tǒng)設(shè)計(jì)、人工神經(jīng)網(wǎng)絡(luò)及其硬件實(shí)現(xiàn)等。廣告提案廣告提案廣告提案的準(zhǔn)備工作創(chuàng)意、表現(xiàn)提案廣告實(shí)施計(jì)劃提案策略提案廣告策劃大師廣告策劃的含義、特點(diǎn)及作用廣告策劃的內(nèi)容和程序廣告策劃的基本原則廣告調(diào)查與分析廣告市場調(diào)查的內(nèi)容廣告市場調(diào)查的步驟廣告市場調(diào)查問卷的構(gòu)成設(shè)計(jì)市場細(xì)分與產(chǎn)品定位市場細(xì)分產(chǎn)品定位廣告戰(zhàn)略策劃廣告預(yù)算策劃廣告創(chuàng)意廣告文案創(chuàng)意第一節(jié)平面廣告創(chuàng)意廣播廣告創(chuàng)意電視廣告創(chuàng)意網(wǎng)絡(luò)廣告創(chuàng)意廣告媒體與渠道策劃廣告推進(jìn)程序策劃廣告實(shí)施策略廣告效果評估廣告策劃文案寫作廣告策劃書的編制技巧可行性研究報(bào)告行業(yè)分析報(bào)告可行性研究可行性報(bào)告項(xiàng)目可行性報(bào)告行業(yè)調(diào)查報(bào)告可行性報(bào)告格式調(diào)查報(bào)告報(bào)告格式辭職報(bào)告述職報(bào)告實(shí)習(xí)報(bào)告社會(huì)實(shí)踐報(bào)告報(bào)告范文申請報(bào)告材料加工碩士論文,主要介紹液態(tài)金屬的成型工藝、金屬焊接成型和材料表面處理工程。具體包括:液態(tài)金屬的工藝性能、砂型鑄造、鑄造工藝設(shè)計(jì)、鑄造工藝CAD/CAE、電弧的特性、焊絲的熔滴過渡、焊縫成形、埋弧焊、氬弧焊、二氧化碳?xì)怏w保護(hù)焊、等離子弧焊、熱噴涂、氣相沉積、激光表面工程技術(shù)等。是碩士研究生所撰寫的學(xué)術(shù)論文,具有一定的理論深度和更高的學(xué)術(shù)水平,更加強(qiáng)調(diào)作者思想觀點(diǎn)的獨(dú)創(chuàng)性,以及研究成果應(yīng)具備更強(qiáng)的實(shí)用價(jià)值和更高的科學(xué)價(jià)值。試卷分析中學(xué)試卷高中試卷高考試卷英語四級試卷成人高考試卷考卷公務(wù)員考試小學(xué)試卷中考試卷高考試卷高考試卷數(shù)學(xué)試卷英語試卷語文試卷醫(yī)學(xué)論文,論文下載中心免費(fèi)論文,畢業(yè)論文,各專業(yè)論文論文聯(lián)盟-論文網(wǎng),論文,論文下載,論文發(fā)表,論文網(wǎng)站,畢業(yè)論文,論文,畢業(yè)論文,論文下載,論文范文-找論文網(wǎng)論文,畢業(yè)論文,論文下載,論文范文-找論文網(wǎng)
論大學(xué)生寫作能力寫作能力是對自己所積累的信息進(jìn)行選擇、提取、加工、改造并將之形成為書面文字的能力。積累是寫作的基礎(chǔ),積累越厚實(shí),寫作就越有基礎(chǔ),文章就能根深葉茂開奇葩。沒有積累,胸?zé)o點(diǎn)墨,怎么也不會(huì)寫出作文來的。寫作能力是每個(gè)大學(xué)生必須具備的能力。從目前高校整體情況上看,大學(xué)生的寫作能力較為欠缺。一、大學(xué)生應(yīng)用文寫作能力的定義那么,大學(xué)生的寫作能力究竟是指什么呢?葉圣陶先生曾經(jīng)說過,“大學(xué)畢業(yè)生不一定能寫小說詩歌,但是一定要寫工作和生活中實(shí)用的文章,而且非寫得既通順又扎實(shí)不可。”對于大學(xué)生的寫作能力應(yīng)包含什么,可能有多種理解,但從葉圣陶先生的談話中,我認(rèn)為:大學(xué)生寫作能力應(yīng)包括應(yīng)用寫作能力和文學(xué)寫作能力,而前者是必須的,后者是“不一定”要具備,能具備則更好。眾所周知,對于大學(xué)生來說,是要寫畢業(yè)論文的,我認(rèn)為寫作論文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六盤水職業(yè)技術(shù)學(xué)院《典型零件的工藝設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 金肯職業(yè)技術(shù)學(xué)院《微機(jī)原理含實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 新蘇教版一年級下冊數(shù)學(xué)第1單元第3課時(shí)《8、7加幾》作業(yè)
- 懷化學(xué)院《影視創(chuàng)作前沿技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖北理工學(xué)院《人力資源管理咨詢與診斷》2023-2024學(xué)年第一學(xué)期期末試卷
- 資陽口腔職業(yè)學(xué)院《測試與傳感器技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)黨員聯(lián)系群眾、服務(wù)群眾制度
- 長沙學(xué)院《材料加工過程多尺度模擬》2023-2024學(xué)年第一學(xué)期期末試卷
- 寒露節(jié)氣策劃講座模板
- 職業(yè)導(dǎo)論-房地產(chǎn)經(jīng)紀(jì)人《職業(yè)導(dǎo)論》名師預(yù)測卷3
- 藝術(shù)品捐贈(zèng)協(xié)議
- 網(wǎng)絡(luò)安全系統(tǒng)運(yùn)維方案
- 2024年標(biāo)準(zhǔn)溝渠回填工程承包協(xié)議版B版
- 2024年專用:物業(yè)安全管理協(xié)議3篇
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級下冊+
- 《政府采購業(yè)務(wù)培訓(xùn)》課件
- 《醫(yī)療器械召回管理辦法》培訓(xùn)2024
- 網(wǎng)絡(luò)安全培訓(xùn)內(nèi)容課件
- 通信線路維護(hù)安全培訓(xùn)
- 專業(yè)微信小程序開發(fā)協(xié)議范例版
- 高職組全國職業(yè)院校技能大賽(嬰幼兒照護(hù)賽項(xiàng))備賽試題庫(含答案)
評論
0/150
提交評論