信息論課程設(shè)計(jì)(香農(nóng)、費(fèi)諾編碼)(共35頁)_第1頁
信息論課程設(shè)計(jì)(香農(nóng)、費(fèi)諾編碼)(共35頁)_第2頁
信息論課程設(shè)計(jì)(香農(nóng)、費(fèi)諾編碼)(共35頁)_第3頁
信息論課程設(shè)計(jì)(香農(nóng)、費(fèi)諾編碼)(共35頁)_第4頁
信息論課程設(shè)計(jì)(香農(nóng)、費(fèi)諾編碼)(共35頁)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上華 北 科 技 學(xué) 院信息論基礎(chǔ)課程設(shè)計(jì)說明書班級(jí): 計(jì)算B092 姓名: 李 寧 (7) 設(shè)計(jì)題目: 信源編碼軟件 設(shè)計(jì)時(shí)間: 2012.7.4 至 2012.7.8 指導(dǎo)教師: 李 慧 評(píng) 語: _評(píng)閱成績: 評(píng)閱教師: 目 錄專心-專注-專業(yè)設(shè)計(jì)總說明早期的數(shù)據(jù)壓縮起源于人們對(duì)概率的認(rèn)識(shí)。當(dāng)對(duì)文字信息進(jìn)行編碼時(shí),如果為出現(xiàn)概率較高的字母賦予較短的編碼,為出現(xiàn)概率較低的字母賦予較長的編碼,平均編碼長度就能縮短不少。印象中的著名的Morse電碼就是一個(gè)范例。信息論之父C.E.Shannon曾指出,任何信息都存在冗余,冗余大小與信息中每個(gè)符號(hào)的出現(xiàn)概率(不確定性)有關(guān)

2、。他所提出的無失真信源編碼定理奠定了數(shù)據(jù)壓縮的理論基礎(chǔ)。數(shù)據(jù)壓縮的目的就是要消除信息中的冗余,而信息熵及相關(guān)的定理恰恰用數(shù)學(xué)手段精確地描述了信息冗余的程度。 本文主要采用香農(nóng)編碼和費(fèi)諾編碼方法來描述信源的編碼過程。香農(nóng)編碼采用信源符號(hào)與概率由用戶輸入。通過一定的校驗(yàn)代碼確保離散信源的正確性。例如單個(gè)符號(hào)的概率不能大于1,概率和不能大于1,信源概率和不為1時(shí)無法編碼等校驗(yàn)。由于香農(nóng)編碼是將信源概率由大到小排序的,所以,本軟件也實(shí)現(xiàn)了這一點(diǎn),輸入時(shí)不必考慮信源概率順序問題,軟件會(huì)自動(dòng)按概率排序編碼。最后將結(jié)果顯示在MFC列表控件上。用戶可以將最終結(jié)果保存成文件。費(fèi)諾編碼通過輸入字符串來自動(dòng)計(jì)算單個(gè)

3、信源符號(hào)的概率。當(dāng)然,為了方便起見,本軟件對(duì)費(fèi)諾編碼還提供了打開文件完成信源輸入,從而可以更快的輸入字符串。進(jìn)行編碼時(shí)同樣按概率從大到小排序,同樣可以將結(jié)果保存到文件中。本軟件界面友好,方便可靠,用戶可根據(jù)自己的愛好選擇不同的界面風(fēng)格。在首頁加入了好看的Flash,使軟件更為美觀。同樣反映除了本軟件的功能特性。根據(jù)實(shí)驗(yàn)要求和日常壓縮數(shù)據(jù)的習(xí)慣,本軟件最終完成了以下目標(biāo):1、 界面設(shè)計(jì)友好,美觀,數(shù)據(jù)存儲(chǔ)安全,可靠。2、 操作簡便、適用,無冗余操作。3、 編碼效率較高,編碼時(shí)間短。關(guān)鍵詞: 離散信源;香農(nóng)編碼;費(fèi)諾編碼;信源熵 前 言本課程設(shè)計(jì)是在學(xué)習(xí)了信息論與編碼和相關(guān)開發(fā)的軟件課程后,讓學(xué)生

4、通過實(shí)際的操作來熟悉信源編碼微機(jī)實(shí)現(xiàn),培養(yǎng)學(xué)生能夠獨(dú)立的完成對(duì)相關(guān)課題或者項(xiàng)目的分析能力、設(shè)計(jì)能力和調(diào)試能力。本課程設(shè)計(jì)是銜接在大一時(shí)C課程設(shè)計(jì)之后的,同樣是運(yùn)用MFC程序來設(shè)計(jì),聯(lián)系本學(xué)期所學(xué)內(nèi)容,要求有獨(dú)立的操作界面。由于在以前有過類似的練習(xí),故在這次的課程設(shè)計(jì)相對(duì)以前來說不是太難。在這次的課程設(shè)計(jì)中,著重培養(yǎng)的是學(xué)生的自學(xué)能力,以及獨(dú)立分析互聯(lián)網(wǎng)上和圖書館里的各種資料,來豐富自己的知識(shí)并且提高對(duì)數(shù)學(xué)公式的計(jì)算機(jī)實(shí)現(xiàn)、VC+等軟件的實(shí)際操作能力。通過這次的課程設(shè)計(jì),能夠使學(xué)生對(duì)已經(jīng)學(xué)習(xí)過的信息論與編碼課程的進(jìn)一步的掌握,能夠?qū)χR(shí)進(jìn)行最大程度的消化融匯。因此這次的課程設(shè)計(jì)對(duì)我們有著非常重要

5、的意義。 本課程設(shè)計(jì)中用VC+編寫出基于MFC界面的簡單軟件以實(shí)現(xiàn)壓縮信源的目的。軟件應(yīng)用香農(nóng)編碼的相關(guān)理論,經(jīng)過比較系統(tǒng)合理的編程操作,實(shí)現(xiàn)可視化的窗口以方便用戶使用。通過簡單校驗(yàn)確保信源正確性,保證軟件的可靠性。最終將結(jié)果保存為文檔方便記錄編碼結(jié)果。 通過讓完成具體編碼算法的程序設(shè)計(jì)和調(diào)試工作,達(dá)到提高編程能力和深刻理解編碼理論的目的。培養(yǎng)我們使用計(jì)算機(jī)和查閱參考資料的能力,提高我們的基本設(shè)計(jì)能力。培養(yǎng)了理論聯(lián)系實(shí)際和獨(dú)立思考的能力。并激發(fā)我們的實(shí)際開發(fā)創(chuàng)造的意識(shí)和能力。培養(yǎng)和提高我們的自學(xué)能力以及綜合運(yùn)用所學(xué)理論知識(shí)去分析解決實(shí)際問題的能力。第1章 總體設(shè)計(jì)方案1.1 軟件結(jié)構(gòu)設(shè)計(jì)香農(nóng)編

6、碼幫助費(fèi)諾編碼編碼選擇信源編碼費(fèi)諾編碼香農(nóng)編碼編碼理論菜單皮膚切換圖1.1.1 軟件功能結(jié)構(gòu)圖輸入信源符號(hào)和概率碼長累加概率碼字進(jìn)行編碼檢驗(yàn)信息平均碼長顯示結(jié)果正確錯(cuò)誤信源熵信息率信源符號(hào)概率編碼效率圖1.1.2 香農(nóng)編碼流程圖輸入字符串序列碼長概率碼字進(jìn)行編碼打開文件字符串長度顯示結(jié)果字符個(gè)數(shù)信源熵信源符號(hào)編碼效率直接輸入概率計(jì)算及排序出現(xiàn)次數(shù)平均碼長圖1.1.3 費(fèi)諾編碼流程圖第2章 算法思想及設(shè)計(jì)2.1香農(nóng)編碼2.1.1香農(nóng)編碼思想:設(shè)有離散無記憶信源:1按信源符號(hào)的概率從大到小的順序排列,為方便起見,可令23確定滿足下列不等式的整數(shù),并令為第個(gè)碼字的長度4把用二進(jìn)制表示,用小數(shù)點(diǎn)后的位

7、作為的碼字例:有一單符號(hào)離散無記憶信源對(duì)該信源編二進(jìn)制香農(nóng)碼編碼過程 :2.1.2香農(nóng)編碼算法設(shè)計(jì):通過文本框輸入信源符號(hào)及相應(yīng)概率。用冒泡法將信源符號(hào)及概率依概率由大到小排序,計(jì)算其累加概率,用數(shù)學(xué)公式計(jì)算每個(gè)信源符號(hào)的。最后把結(jié)果寫入列表控件中,以可視化方式顯示編碼結(jié)果。2.2費(fèi)諾編碼2.2.1費(fèi)諾編碼思想設(shè)有離散無記憶信源1.按信源符號(hào)的概率從大到小的順序排隊(duì)不妨設(shè)2.將依次排列的信源符號(hào)按概率值分為兩大組,使兩個(gè)組的概率之和近似相同,并對(duì)各組賦予一個(gè)二進(jìn)制碼元“0”和“1”。 3.將每一大組的信源符號(hào)再分為兩組,使劃分后的兩個(gè)組的概率之和近似相同,并對(duì)各組賦予一個(gè)二進(jìn)制符號(hào)“0”和“1

8、”。 4.如此重復(fù),直至每個(gè)組只剩下一個(gè)信源符號(hào)為止。 5.信源符號(hào)所對(duì)應(yīng)的碼字即為費(fèi)諾碼。例:有一單符號(hào)離散無記憶信源對(duì)該信源編二進(jìn)制費(fèi)諾碼2.2.2費(fèi)諾編碼算法設(shè)計(jì)通過輸入字符串或打開相關(guān)文件獲取字符串,用字符串處理方法統(tǒng)計(jì)每個(gè)字符的數(shù)量及運(yùn)算其概率。然后按照每個(gè)字符的概率用冒泡法進(jìn)行排序。然后用遞歸的思想進(jìn)行費(fèi)諾編碼,求得了每個(gè)字符的二進(jìn)制碼字。并且對(duì)編碼后的平均碼長,以及編碼的傳輸效率進(jìn)行了求解。第3章 軟件詳細(xì)設(shè)計(jì)3.1主界面設(shè)計(jì)編碼軟件主界面如圖3.1.1所示,基本功能在菜單中進(jìn)行選擇。用Falsh CS5軟件設(shè)計(jì)一個(gè)簡單的Flash插入到主界面,使界面更美觀而且形象。 圖3.1.

9、1 主界面3.2功能設(shè)計(jì)3.2.1香農(nóng)編碼的實(shí)現(xiàn)香農(nóng)編碼是通過編輯框依次輸入信源符號(hào)和概率的,輸入時(shí)同時(shí)完成校驗(yàn)工作。即單個(gè)信源符號(hào)概率不能大于1,信源概率和不能大于1,概率和不為1時(shí)不能進(jìn)行編碼。正確輸入信源符號(hào)及其概率后便可計(jì)算出該離散信源的碼長、碼字等信息??梢灾v編碼結(jié)果保存為txt文本等文件。圖3.2.1 香農(nóng)編碼界面圖3.2.2保存編碼結(jié)果(1) 添加信源代碼:void CShannonCode:OnAdd() / TODO: Add your control notification handler code hereUpdateData(true); CString tempf1

10、,tempf2;/添加之前、之后列表控件值float sum=0.0, sum2=0.0, tempa1, tempa2;if(m_prob >= 1.0)/單個(gè)信源符號(hào)概率不能大于1MessageBox("概率小于1!","提示");return;for(int i = 0;i < count;i+)/計(jì)算信源概率和 tempf1 = m_list1.GetItemText(i,1);tempa1 = (float)(atof(tempf1);sum = sum +tempa1;if(sum >= 1.0)/如果和大于等于1,則不再添

11、加MessageBox("信源概率和已等于1!無法添加!","提示");return;CString s1,s2;m_list1.InsertItem(r,"");s1.Format("%s",m_single);m_list1.SetItemText(r,0,s1);s2.Format("%.6f",m_prob);m_list1.SetItemText(r,1,s2);r+;count+;for(int j = 0;j < count;j+)/計(jì)算信源概率和 tempf2 = m_li

12、st1.GetItemText(j,1);tempa2 = (float)(atof(tempf2);sum2 = sum2 +tempa2;if(sum2 > 1.0)/如果添加后概率和大于1,則最后添加的信源不做計(jì)算MessageBox("當(dāng)前信源添加后信源概率和大于1!","提示");s1.Format("%s","");m_list1.SetItemText(r-1,0,s1);s2.Format("%s","");m_list1.SetItemText(r-1

13、,1,s2);r-;count-;return;m_single = ""m_prob = 0.0;UpdateData(false); (2) 算法實(shí)現(xiàn)代碼:void CShannonCode:Count() CString singe,temp,s;char binN=""CString singleN;/信源符號(hào)數(shù)組float pN;/信源概率數(shù)組int i,j,c3;float btemp,vtemp;double c1,c2;/讀取輸入的信源符號(hào)和概率for(i = 0; i < count; i+)singlei =m_list1.Ge

14、tItemText(i,0); temp=m_list1.GetItemText(i,1); pi = (float)(atof(temp);/信源符號(hào)和概率按概率大小排序for(i = 1;i < count;i+) for(j = 0;j < count-i;j+)if(pj < pj+1)ExChangeChar(single,j,j+1);ExChangePsingle(p,j,j+1);for(i = 0; i < count; i+)m_list2.InsertItem(i,"");temp.Format(" %s "

15、,singlei);m_list2.SetItemText(i,0,temp);/信源符號(hào)temp.Format("%.6f",pi);m_list2.SetItemText(i,1,temp);/概率/計(jì)算累加概率;for(i = 0; i < count; i+)temp = m_list2.GetItemText(i,1); singi.pa = (float)(atof(temp); sing0.paa = 0;for(i = 0; i < count; i+) singi.paa =singi-1.pa+singi-1.paa; for(i = 0;

16、i < count; i+)s.Format("%.6f",singi.paa); m_list2.SetItemText(i,2,s);/累加概率/計(jì)算碼字長度; for(i = 0;i < count;i+) for(j = 0;j < N;j+)if(j>=-log(singi.pa)/log(2)&&j<1-log(singi.pa)/log(2)singi.k=j;c1 = -log(singi.pa)/log(2);c2 = 1-log(singi.pa)/log(2);c3 = int(c1);if(c3-c1)

17、= 0)singi.k = c3;elsesingi.k = c3+1;for(i = 0; i < count; i+)s.Format("%d",singi.k); m_list2.SetItemText(i,3,s);/碼字長度 /計(jì)算二進(jìn)制數(shù); for(i = 0;i < count;i+)singi.binary0 ='0'singi.binary1 ='.'btemp = singi.paa;for(j=0;j<singi.k;j+)if(btemp*2 >= 1)binj = '1'bte

18、mp = btemp*2-1;elsebinj = '0'btemp = btemp*2;singi.binaryj+2 = binj; singi.binaryj+2 ='0' for(i = 0; i < count; i+)s.Format("%s",singi.binary); m_list2.SetItemText(i,4,s);/二進(jìn)制數(shù)/計(jì)算碼字; for(i = 0;i < count;i+)vtemp = singi.paa;for(j = 0;j < singi.k;j+)if(vtemp*2>=1

19、)singi.codej='1'vtemp=vtemp*2-1;elsesingi.codej='0'vtemp=vtemp*2; singi.codej='0'for(i = 0; i < count; i+)s.Format("%s",singi.code); m_list2.SetItemText(i,5,s);/碼字for(i = 0;i < count ; i+)for(int j = 0;j < 6; j+)Result1 = Result1 + m_list2.GetItemText(i,j)+

20、"t"Result1 = Result1 + "n"void CShannonCode:CodeEfficiency()/計(jì)算并顯示編碼效率CString temp,s;int i;double K,Hx,R,A; for(i = 0; i < count; i+)temp = m_list2.GetItemText(i,1); singi.pa =(float)(atof(temp); K = sing0.pa*sing0.k;Hx = -sing0.pa*log(sing0.pa)/log(2); for(i = 0; i < count

21、; i+)K = K+singi.pa*singi.k;Hx = Hx+(-singi.pa*log(singi.pa)/log(2); R = (K*log(2)/log(2)/1; A = Hx/R; /A代表編碼效率,轉(zhuǎn)化為百分比; s.Format("%.6f",K); m_list3.InsertItem(0,s,0); s.Format("%.6f",Hx); m_list3.SetItemText(0,1,s); s.Format("%.6f",R); m_list3.SetItemText(0,2,s); s.Form

22、at("%.6f",A); m_list3.SetItemText(0,3,s);/顯示結(jié)果void CShannonCode:OnResult() / TODO: Add your control notification handler code herem_list2.DeleteAllItems();/清空已有數(shù)據(jù)m_list3.DeleteAllItems();CString temp;float sum=0.0,temp2;for(int i=0;i<count;i+)/計(jì)算信源概率和 temp=m_list1.GetItemText(i,1);temp2

23、=(float)(atof(temp);sum = sum +temp2;if(sum != 1.0)/信源概率和不為1時(shí)不進(jìn)行編碼MessageBox("信源概率之和不為1!請(qǐng)檢查!","提示");return;Count();/編碼結(jié)果CodeEfficiency();/編碼效率(3) 保存代碼:void CShannonCode:OnBUTTONSave() / TODO: Add your control notification handler code hereUpdateData(true); CFileDialog dlgSave(fal

24、se,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Txt Files(*.txt)|*.txt|Dat Files(*.dat)|*.dat|All Files (*.*)|*.*|",AfxGetMainWnd();/構(gòu)造文件打開對(duì)話框CString strPath; /聲明變量if(dlgSave.DoModal() = IDOK)/判斷是否按下"打開"按鈕strPath=dlgSave.GetPathName();/獲得文件路徑和文件名 if(strPath!="")FILE

25、*pFile=fopen(strPath,"w");if (pFile)fprintf(pFile,"%s",Result1);fclose(pFile);UpdateData(false);3.2.2費(fèi)諾編碼的實(shí)現(xiàn)費(fèi)諾編碼可由用戶打開文本獲取信源序列,也可直接輸入序列。輸入內(nèi)容為空時(shí)會(huì)有提示信息彈出。正確讀到文本域內(nèi)容后點(diǎn)擊編碼按鈕即可用算法實(shí)現(xiàn)各字符概率的計(jì)算并按概率排序,進(jìn)而對(duì)其進(jìn)行編碼。列表框內(nèi)容也可以進(jìn)行保存。圖3.2.3 費(fèi)諾編碼界面圖3.2.4 打開文件讀取文本(1) 主要代碼BOOL CFanoCode:OnInitDialog() CD

26、ialog:OnInitDialog();/ TODO: Add extra initialization here/編碼結(jié)果欄初始化; m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);m_list1.InsertColumn(0,_T("信源符號(hào)"), LVCFMT_CENTER, 60);m_list1.InsertColumn(1,_T("出現(xiàn)次數(shù)"), LVCFMT_CENTE

27、R, 70);m_list1.InsertColumn(2,_T("概率"), LVCFMT_CENTER, 80); m_list1.InsertColumn(3,_T("碼字長度"), LVCFMT_CENTER, 60);m_list1.InsertColumn(4,_T("碼字"), LVCFMT_CENTER, 80); /信源信息級(jí)編碼效率欄初始化; m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTI

28、VATE|LVS_EX_GRIDLINES);m_list2.InsertColumn(0,_T("字符串長度"), LVCFMT_CENTER, 80);m_list2.InsertColumn(1,_T("字符個(gè)數(shù)"), LVCFMT_CENTER, 80);m_list2.InsertColumn(2,_T("平均碼長"), LVCFMT_CENTER, 80);m_list2.InsertColumn(3,_T("信源熵"), LVCFMT_CENTER, 80);m_list2.InsertColumn(

29、4,_T("編碼效率"), LVCFMT_CENTER, 80);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEint Group(CodeType FanoNode,int low,int high) /*一次分組(一分為二)并編碼*/float MinSum=FanoNodelow.data,MaxSum=FanoNodehigh.data;FanoNodelow.bitFanoNode

30、low.length+=1;FanoNodehigh.bitFanoNodehigh.length+=0;while(low+1 < high)if(MinSum > MaxSum)MaxSum+= FanoNode-high.data;FanoNodehigh.bitFanoNodehigh.length+ = 0; /*編碼加0*/elseMinSum+=FanoNode+low.data;FanoNodelow.bitFanoNodelow.length+ = 1; /*編碼加1*/return low; /*返回分組的第一部分的上界*/void FanoEncoding(C

31、odeType FanoNode,int s,int t)/*遞歸進(jìn)行費(fèi)諾編碼*/if(s < t)int pivotloc = Group(FanoNode,s,t);if(s < t-1)FanoEncoding(FanoNode,s,pivotloc);FanoEncoding(FanoNode,pivotloc+1,t);int IsnotIn(char a,char t,int n,int count) /*檢查字符a是否在數(shù)組t中*/for(int k = 0;k < n;k+)if(a = tk)countk+;return 0;return 1;void Ex

32、ChangeFloat(float p,int i,int j) /*交換兩個(gè)數(shù)值*/ float temp;temp = pi;pi = pj;pj = temp;void ExChangeChar(char t,int i,int j) /*交換兩個(gè)字符*/ char temp;temp = ti;ti = tj;tj = temp;void CFanoCode:OnResult() / TODO: Add your control notification handler code hereUpdateData(true); m_list1.DeleteAllItems();m_list

33、2.DeleteAllItems();if(m_text="")MessageBox("字符串內(nèi)容不能為空!請(qǐng)輸入字符串!","提示");return;float pMaxStrLength;/*p每個(gè)字符的概率*/char strMaxStrLength,tMaxStrLength;/*str輸入的字符串,t不重復(fù)的字符串*/char *q = (LPSTR)(LPCTSTR)m_text;/CString to char *strcpy(str,q);int countMaxStrLength=0,m=1;/*count每個(gè)字符的

34、個(gè)數(shù),m為不重復(fù)的字符的個(gè)數(shù)*/int SLength = strlen(str);if(SLength > 200)MessageBox("字符串長度超過200!","提示");return;t0 = str0;count0+;for(int i = 1;i < SLength;i+)/*去除重復(fù)的字符,并計(jì)算個(gè)數(shù)*/if(IsnotIn(stri,t,m,count)tm = stri;countm+;for(int j = 0;j < m;j+)pj=float(countj)/float(SLength);for(i = 1;i

35、 < m;i+) /*冒泡排序*/ for(j = 0;j < m-i;j+)if(pj < pj+1)ExChangeFloat(p,j,j+1);ExChangeChar(t,j,j+1);/*相應(yīng)的計(jì)數(shù)器數(shù)值也交換 */int temp;temp = countj;countj = countj+1;countj+1 = temp;for(i = 0;i < m;i+)/*將值賦給結(jié)構(gòu)體數(shù)組 */FanoNodei.data = pi;FanoNodei.length =0;FanoNodei.Character = ti;FanoEncoding(FanoNod

36、e,0,m-1);for( i=0;i<m;i+)K+=FanoNodei.data*FanoNodei.length; /*求平均碼長*/H+=-FanoNodei.data*log(FanoNodei.data); /*求信源熵H(X)的大小*/R = H/K;CString s1,s2,s3;for(i = 0;i < m;i+)m_list1.InsertItem(i,"");s1.Format(" %ct",FanoNodei.Character);m_list1.SetItemText(i,0,s1);s1.Format(&quo

37、t;%d ",counti);m_list1.SetItemText(i,1,s1);s1.Format("%.6f",FanoNodei.data);m_list1.SetItemText(i,2,s1);s1.Format(" %d ",FanoNodei.length);m_list1.SetItemText(i,3,s1);s3=""for(int j=0;j<FanoNodei.length;j+)s2.Format("%d",FanoNodei.bitj);s3=s3+s2;m_list

38、1.SetItemText(i,4,s3);m_list2.InsertItem(0,"");s2.Format("%d",SLength);m_list2.SetItemText(0,0,s2);s2.Format("%d",m);m_list2.SetItemText(0,1,s2);s2.Format("%.6f",K);m_list2.SetItemText(0,2,s2);s2.Format("%.6f",H);m_list2.SetItemText(0,3,s2);s2.Format

39、("%.6f",R);m_list2.SetItemText(0,4,s2);/遍歷列表,獲取相應(yīng)值,用于保存for(i = 0;i < 5 ; i+)for(j = 0;j < m; j+)Result = Result + m_list1.GetItemText(i,j)+"t"Result = Result + "n"(2) 讀文件代碼:void CFanoCode:OnOpenFile() / TODO: Add your control notification handler code hereUpdateDa

40、ta(true); CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Txt Files(*.txt)|*.txt|Dat Files(*.dat)|*.dat|All Files (*.*)|*.*|",AfxGetMainWnd();/構(gòu)造文件打開對(duì)話框CString strPath; /聲明變量if(dlgOpen.DoModal() = IDOK)/判斷是否按下"打開"按鈕strPath = dlgOpen.GetPathName();/獲得文件路徑m

41、_FilePath.Format("%s",strPath);/顯示文件路徑FILE *pFile = fopen(strPath,"r");/以讀形式打開文件if (pFile)/判斷文件是否被正確打開char pchData1000 = 0;/定義數(shù)據(jù)緩沖區(qū) fread(pchData,sizeof(char),1000,pFile); /讀取數(shù)據(jù)到緩沖區(qū)中fclose(pFile);/關(guān)閉文件m_text.Format("%s",pchData);UpdateData(false);3.2.3有關(guān)文檔的鏈接編碼軟件自然不能缺少對(duì)

42、編碼的理論介紹,這一點(diǎn)可通過網(wǎng)頁形式展現(xiàn)出來。通過單擊觸發(fā)打開制作好的簡單網(wǎng)頁??煞謩e對(duì)每種編碼進(jìn)行簡單介紹。圖3.2.5 編碼理論介紹(1) 主要代碼void CMyDlg:OnMENUITEMSourcecoding() / TODO: Add your command handler code hereShellExecute(NULL, _T("open"),"webSourcecoding.html", NULL,NULL, SW_SHOW);軟件設(shè)計(jì)離不開軟件說明書,本軟件的說明書也是通過網(wǎng)頁完成的,這樣可以保證說明書不被修改,保持原版特性。

43、圖3.2.6軟件說明3.2.4皮膚切換的設(shè)計(jì)以往的軟件制作都以系統(tǒng)默認(rèn)的樣式為主,在不斷的學(xué)習(xí)過程中要走向更專業(yè)化的道路,簡單的皮膚添加可使整個(gè)程序樣式不再單一,更為人性化。圖3.2.7 皮膚切換實(shí)例1圖3.2.8皮膚切換實(shí)例2(1) 皮膚代碼:BOOL CMyApp:InitInstance()AfxEnableControlContainer();SkinStart(_T("skinbelv.urf"),WINDOW_TYPE_VC,"",GTP_LOAD_FILE,NULL,NULL);第4章 軟件測試4.1香農(nóng)編碼的測試4.1.1 軟件運(yùn)行及結(jié)果

44、測試圖4.1.1 香農(nóng)編碼結(jié)果顯示圖4.1.2 香農(nóng)編碼錯(cuò)誤提示圖4.1.3 香農(nóng)編碼結(jié)果保存文件測試時(shí)發(fā)現(xiàn)軟件能夠較好的完成預(yù)期目標(biāo),能夠保證阻止各類錯(cuò)誤信源的輸入,以及能夠正確按照概率排序并計(jì)算正確的碼字。最終還可以正確的保存文件。4.2費(fèi)諾編碼的測試4.2.1 軟件運(yùn)行及結(jié)果測試文本內(nèi)容為空時(shí)無法進(jìn)行編碼,會(huì)有錯(cuò)誤提示。圖4.2.1 空文本無法操作正確打開文件或輸入字符串后,軟件能夠正確完成編碼任務(wù)。結(jié)果如下圖:圖4.2.2 費(fèi)諾編碼結(jié)果顯示圖4.2.3 費(fèi)諾編碼保存結(jié)果4.3測試結(jié)果通過對(duì)各個(gè)模塊功能的測試,最終可以確定本軟件的數(shù)據(jù)計(jì)算正確性及可靠性。各個(gè)附加功能也能夠無誤的實(shí)現(xiàn)。第5

45、章 總結(jié) 通過一周的時(shí)間終于完成了香農(nóng)、費(fèi)諾編碼軟件的設(shè)計(jì)開發(fā),時(shí)間的緊迫導(dǎo)致軟件依然存在不少問題,以費(fèi)諾編碼不能識(shí)別漢子的問題為首。在參考眾多的資料后還是沒能及時(shí)將這個(gè)問題解決,不過時(shí)間短促,短時(shí)間內(nèi)這個(gè)問題也不好解決。在以后的學(xué)習(xí)生活中我會(huì)嘗試著完成這個(gè)BUG。在課程設(shè)計(jì)的過程中困難不時(shí)的出現(xiàn),很多時(shí)候覺得無可入手,想盡辦法也不知道該怎么解決。在這個(gè)過程中我深深感受到編程人員經(jīng)驗(yàn)是多么的寶貴。由于之前已經(jīng)有過幾次關(guān)于MFC的課程設(shè)計(jì),所以在軟件模塊設(shè)計(jì)方面比較容易解決。算法方面,自己嘗試著去做了但總是不如意,由于時(shí)間關(guān)系,還是參考了相關(guān)文檔。在實(shí)踐中感覺到了學(xué)數(shù)學(xué)將數(shù)學(xué)算法轉(zhuǎn)換成計(jì)算機(jī)算法

46、不是一件容易的事。信源編碼軟件的設(shè)計(jì)同樣具有一定的挑戰(zhàn)性,以往的程序大多是在“黑窗口”下完成的,寫一個(gè)算法也是一件比較難的事,但路就是這樣走過來的,沒有今天的一小步就沒有明天的一大步。不斷地設(shè)計(jì),不斷的思索,慢慢的就發(fā)現(xiàn)自己學(xué)會(huì)很多。有些問題自然就邊的簡單了。本次課程設(shè)計(jì)比較有突破性的是引入了皮膚文件,以往的MFC編程都是在系統(tǒng)默認(rèn)的背景下運(yùn)行的,這樣的軟件總感覺不是很舒服。之前學(xué)會(huì)了給對(duì)話框添加背景圖片等一些簡單的美化,但還是感覺不夠好。于是自己花了一段時(shí)間學(xué)習(xí)了一下皮膚美化程序,功夫不負(fù)有心人,這回在這方面感覺小有成就了。不過這也不算什么真真的提高,學(xué)好編程的思想更為重要。當(dāng)然,軟件的開發(fā)

47、離不開好的資料和同學(xué)的交流。在這次課程設(shè)計(jì)中深深感受到了同學(xué)之間交流合作的重要性。交流不但可以發(fā)現(xiàn)新的問題,提高解決問題的效率,而且可以快速的學(xué)習(xí)到新的知識(shí)。最后,感謝同學(xué)在課程設(shè)計(jì)中給予我的幫助。讓我從中感受到了軟件開發(fā)時(shí)團(tuán)隊(duì)的力量以及重要性。參 考 文 獻(xiàn)1 陳運(yùn). 信息論與編碼 M. 北京:電子工業(yè)出版社,2011.2 姚領(lǐng)田.精通MFC程序設(shè)計(jì) M. 北京:人民郵電出版社,2006.附 錄源程序清單1 首頁Flash效果代碼:BOOL CMyDlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu it

48、em to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pS

49、ysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereCRect layoutRect; GetClientRect(&layoutRect);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論