




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)用標(biāo)準(zhǔn)文案數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告題目:利用哈夫曼編碼給文件或者文字加密班級(jí):xxxx學(xué)號(hào):xxxxxxxxxxx姓名:xxx完成時(shí)間:2010年12月19日任課教師:xxx一、 問題描述用哈夫曼編碼,將輸入的文字,或者文件中的文字進(jìn)行編碼,并輸出加密后的文字。主程序main二、 程序總體結(jié)構(gòu)顯示界面告訴用戶程序名稱show()給用戶提供選擇方式chioce1()顯示系統(tǒng)時(shí)間showtime()打開文件進(jìn)行加密openfile()退出程序輸入電文進(jìn)行加密input()統(tǒng)計(jì)輸入(文件中)字母的出現(xiàn)頻率CrW(data,w,count)【fcount(alldata,data,count)】將輸入(文件
2、中)的電文創(chuàng)建成哈夫曼樹CrtHuffmantree(ht,w,n)將輸入(文件中)的電文進(jìn)行哈夫曼編碼CrtHuffmanCode(ht,hc,n)輸出每一個(gè)字母所對(duì)應(yīng)的哈夫曼編碼Printf(hc,n,data,alldata,count)對(duì)輸入(文件中)的文字進(jìn)行哈夫曼加密showall(hc,alldata,count,data,n)1、 數(shù)據(jù)結(jié)構(gòu)此函數(shù)中運(yùn)用到的數(shù)據(jù)結(jié)構(gòu)知識(shí)就是哈夫曼樹的建立以及遍歷,建立主要就是每一次選擇權(quán)值最小的兩個(gè)數(shù)并將其求和,然后用他們的和代替這兩個(gè)數(shù),再進(jìn)行求兩個(gè)最小值,最后構(gòu)成一個(gè)哈夫曼數(shù);遍歷是采用從葉子結(jié)點(diǎn)開始向根節(jié)點(diǎn)確定唯一的路徑。2、 主要函數(shù):(
3、1) void CrtHuffmantree(HuffmanTree &ht,int w,int n),功能是建立一個(gè)哈夫曼樹;(2) void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n),功能是計(jì)算哈夫曼編碼;(3) void dianwen(int count,char alldata),功能是統(tǒng)計(jì)輸入電文的字母種類以及頻率;(4) int fcount(char alldata,char data,int count),功能是統(tǒng)計(jì)打開文件中出現(xiàn)的字母的種類以及頻率;(5) void showtime(),功能是查看系統(tǒng)當(dāng)
4、前的時(shí)間;(6) int search(char ch,char data,int n),查詢電文中的每一個(gè)字母所對(duì)應(yīng)得哈夫曼編碼的下標(biāo);(7) void Printf(HuffmanCode &hc,int n,char data,char alldata,int count),功能是輸出每一個(gè)字母所對(duì)應(yīng)的哈夫曼編碼;(8) void showall(HuffmanCode hc,char alldata,int count,char data,int n),功能是輸出經(jīng)過加密后的密文。三、 源代碼精彩文檔#include<stdio.h>#include<stdl
5、ib.h>#include<time.h>#include<string.h>#define N 27/定義最大葉子結(jié)點(diǎn)個(gè)數(shù)#define M 2*N-1typedef struct/定義哈夫曼結(jié)構(gòu)體int weight;int parent;int LChild;int RChild;HTNode,HuffmanTreeM+1;/0號(hào)單元不用typedef char* HuffmanCodeN+1;/存儲(chǔ)哈夫曼編碼串的頭指針/調(diào)用系統(tǒng)的時(shí)間void showtime()time_t t;tm *tp; t=time(NULL);tp=localtime(&
6、;t); printf("nnttt%d/%d/%dn ",tp-> tm_mon+1,tp-> tm_mday,tp-> tm_year+1900);printf( "nttt %d:%d:%dn ",tp-> tm_hour,tp-> tm_min,tp-> tm_sec); /*計(jì)算電文中各個(gè)英文字母出現(xiàn)的次數(shù)*void dianwen(int count,char alldata)int n,i;printf("");printf("nnntttt請(qǐng)輸入電文:n");ff
7、lush(stdin);for(i=0;i<27;i+)/將數(shù)組計(jì)數(shù)器初始化 counti=0;printf("%c",7);alldata0=getchar();while(alldatacount0!='n')n=(alldatacount0-'a')+1;countn+;count0+;/所有字母的總個(gè)數(shù)alldatacount0=getchar();void CrW(char data,int w,int count)/存儲(chǔ)數(shù)據(jù)以及權(quán)值信息int i,j;j=0;for(i=1;i<=26;i+)if(counti!=0)
8、j+;dataj=char(i-1+'a');wj=counti;w0=j;/用于存儲(chǔ)字母出現(xiàn)的種類個(gè)數(shù)void select(HuffmanTree &ht,int n,int &s1,int &s2)/查找一串?dāng)?shù)字中的兩個(gè)最小值int i,t;s1=0;s2=0;ht0.weight=65535;for(i=1;i<=n;i+)if(hti.weight<hts1.weight&&hti.parent=0)t=s1;s1=i;if(htt.weight<hts2.weight)s2=t;else if(hti.wei
9、ght<hts2.weight&&hti.parent=0)s2=i;else;void CrtHuffmantree(HuffmanTree &ht,int w,int n)/創(chuàng)建哈夫曼樹int i,m;int s1,s2;for(i=1;i<=n;i+)/初始化葉子結(jié)點(diǎn)hti.weight=wi;hti.parent=0;hti.LChild=0;hti.RChild=0;m=2*n-1;for(i=n+1;i<=m;i+)/初始化其他結(jié)點(diǎn)hti.weight=0;hti.parent=0;hti.LChild=0;hti.RChild=0;for
10、(i=n+1;i<=m;i+)select(ht,i-1,s1,s2);hti.weight=hts1.weight+hts2.weight;hts1.parent=i;hts2.parent=i;hti.LChild=s1;hti.RChild=s2;/計(jì)算哈夫曼編碼void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n)int i,start,c,p;char *cd;cd=(char *)malloc(n+1)*sizeof(char);cdn-1='0'for(i=1;i<=n;i+)start=n-1
11、;c=i;p=hti.parent;while(p!=0)-start;if(htp.LChild=c) cdstart='0'else cdstart='1'c=p;p=htp.parent;hci=(char *)malloc(n-start)*sizeof(char);strcpy(hci,&cdstart);free(cd);/查找字母所對(duì)應(yīng)的哈夫曼編碼int search(char ch,char data,int n)int i;for(i=1;i<=n;i+)if(ch=datai)return i;else i+;return 1;
12、/顯示所有文字的哈夫曼編碼void showall(HuffmanCode hc,char alldata,int count,char data,int n)int i,m;system("cls");printf("nn");printf("ttt所有電文經(jīng)過哈夫曼編碼加密之后如下n%c",7);printf("nn");for(i=0;i<count0;i+)m=search(alldatai,data,n);printf("%s",hcm);printf("nnn&quo
13、t;);system("pause");/輸出哈夫曼編碼void Printf(HuffmanCode &hc,int n,char data,char alldata,int count)int i;system("cls");printf("nn各個(gè)字母所對(duì)應(yīng)的哈夫曼編碼nn%c",7);for(i=1;i<=n;i+)printf("t字母%c對(duì)應(yīng)的哈夫曼碼為:",datai);puts(hci);printf("nn各個(gè)字母所對(duì)應(yīng)的哈夫曼編碼nn");printf(&quo
14、t;nn 按任意鍵查看所有文字的加密結(jié)果nn");system("pause");showall(hc,alldata,count,data,n);/查看文字的加密結(jié)果/首界面窗口界面美化工作void show()int i;printf("nnn%c",7);for(i=0;i<30;i+)printf("%c=",2);printf("nnntt歡迎使用哈夫曼編碼加密系統(tǒng)nnn");for(i=0;i<30;i+)printf("%c=",2);printf("
15、;nntt ");system("pause");system("cls");/輸入文字加密void input()char alldata1000;int n,wN;/w用于存儲(chǔ)所出現(xiàn)的字母頻率,w0用于存儲(chǔ)出現(xiàn)字母種類的個(gè)數(shù)int count27;/用于存儲(chǔ)所有字母出現(xiàn)的頻率,count0用于存儲(chǔ)字母的總個(gè)數(shù)char dataN;/用于存儲(chǔ)所出現(xiàn)過的字母HuffmanTree ht;HuffmanCode hc;dianwen(count,alldata);CrW(data,w,count);n=w0;CrtHuffmantree(ht,w
16、,n);CrtHuffmanCode(ht,hc,n);Printf(hc,n,data,alldata,count);/計(jì)算文件中每一個(gè)字母出現(xiàn)的頻率int fcount(char alldata,char data,int count)int i=0,k=0,n,j;HuffmanTree ht;HuffmanCode hc;for(j=0;j<27;j+)countj=0;while(alldatai!='0')n=alldatai-'a'+1;countn+;/統(tǒng)計(jì)每一個(gè)字符出現(xiàn)的頻率datan=char(n-1+'a');coun
17、t0+;/統(tǒng)計(jì)文件中字母的總個(gè)數(shù)i+;for(j=0;j<27;j+)if(countj=0)k+;if(k!=0&&countj!=0)countj-k=countj;countj=0;k+;n=26-k;CrtHuffmantree(ht,count,n);CrtHuffmanCode(ht,hc,n);Printf(hc,n,data,alldata,count);return 0;/打開文件加密void openfile()FILE *fp;char alldata1000;int count27,i=0;char dataN;char stname20;for(
18、i=0;i<21;i+)printf("%c%c",1,2);printf("nnnt 請(qǐng)輸入文件名:%c",7);scanf("%s",&stname);if(fp=fopen(stname,"r")=NULL)printf("文件打開失??!n");exit(0);system("cls");printf("");printf("nntttt文件中的電文如下:nn%c",7);while(!feof(fp)fscanf(
19、fp,"%s",&alldata);printf("%snnn",alldata);printf("");printf("nntt 請(qǐng)按任意鍵查看電文中字母的哈夫曼編碼nnttt ");system("pause");fcount(alldata,data,count);if(fclose(fp)printf("不能關(guān)閉文件!n");exit(0);/提醒用戶的選擇1void chioce1()int n,i;printf("%c",7);for(
20、i=0;i<21;i+)printf("%c%c",1,2);printf("nnt 1、打開本地文件加密nt 2、輸入文字加密nt 0、退出nn");for(i=0;i<21;i+)printf("%c%c",1,2);printf("nnnt請(qǐng)輸入你的選擇:");scanf("%d",&n);while(n!=0&&n!=1&&n!=2)printf("%c",7);printf("nnn");pri
21、ntf(" 你的輸入有誤!請(qǐng)重新輸入!");printf("nnn");printf("nnt請(qǐng)輸入你的選擇:");scanf("%d",&n);system("cls");switch(n)case 1:openfile();break;case 2:input();break;case 0:printf("nnnnttt%c歡迎再次使用!再見nnn",7);return;/main函數(shù)int main()showtime();show();chioce1();re
22、turn 0;四、 測(cè)試及結(jié)果1、 測(cè)試情況這個(gè)程序中的創(chuàng)新之處就在于:(1)調(diào)用系統(tǒng)的時(shí)間;(2)將輸入的英文字母進(jìn)行直接統(tǒng)計(jì),節(jié)省了時(shí)間以及內(nèi)存;(3)復(fù)習(xí)了文件的使用,可以從當(dāng)?shù)匚募写蜷_電文進(jìn)行加密;(4)打開文件后需要統(tǒng)計(jì)所出現(xiàn)的英文字母的種類以及頻率,需要根據(jù)字母所對(duì)應(yīng)的ASCII碼直接存儲(chǔ)到相對(duì)應(yīng)得位置(例如字母s,則它存儲(chǔ)位置的下標(biāo)就應(yīng)該是's'-'a'+1);(5)存儲(chǔ)完打開文件的信息之后,數(shù)組中可能出現(xiàn)0的情況(即電文中不出現(xiàn)某一個(gè)字母),需要在原來的數(shù)組上進(jìn)行調(diào)整,并且要用時(shí)間、空間最小的方法,于是我變新設(shè)一個(gè)變量用于統(tǒng)計(jì)兩個(gè)出現(xiàn)過的字母之間的距離,然后進(jìn)行移位【for(j=0;j<27;j+)if(countj=0)k+;if(k!=0&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC TR 20226:2025 EN Information technology - Artificial intelligence - Environmental sustainability aspects of AI systems
- 江蘇溧陽(yáng)2024~2025學(xué)年高一下冊(cè)期末教學(xué)質(zhì)量調(diào)研數(shù)學(xué)試題學(xué)生卷
- 2024~2025學(xué)年廣西壯族自治區(qū)河池宜州區(qū)八年級(jí)下冊(cè)4月期中考試數(shù)學(xué)試題【帶答案】
- 變革過程中的組織記憶管理考核試卷
- 農(nóng)業(yè)機(jī)械化與信息技術(shù)融合的農(nóng)業(yè)產(chǎn)業(yè)鏈優(yōu)化考核試卷
- 在線絲綢貿(mào)易平臺(tái)發(fā)展現(xiàn)狀考核試卷
- 自我監(jiān)測(cè)考核試卷
- 創(chuàng)業(yè)項(xiàng)目企業(yè)社會(huì)責(zé)任報(bào)告撰寫案例考核試卷
- 需求管理中的多目標(biāo)決策模型考核試卷
- 賽事應(yīng)急物資供應(yīng)鏈管理與保障機(jī)制考核試卷
- 電工廠搬遷方案(3篇)
- 老年人眼科疾病
- 鋼板配送設(shè)計(jì)方案(3篇)
- 中醫(yī)基礎(chǔ)學(xué)課件護(hù)理情志
- 小學(xué)三年級(jí)科學(xué)下冊(cè)教案
- 2025-2030中國(guó)美容美發(fā)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025年中國(guó)不銹鋼蝕刻板數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 免疫檢查點(diǎn)抑制劑相關(guān)肺炎診治和管理專家共識(shí)(2025)要點(diǎn)解讀
- (統(tǒng)編版2025)歷史七年級(jí)下冊(cè)新教材變化及教學(xué)建議
- 文化安全課件
- 蠶桑養(yǎng)殖知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論