ハフマンコーディングデコーダ

5908 ワード

タイトルデータ構造課設:ハフマン符号化デコーダ
今回のカリキュラム設計をまとめて、出会った問題はどのように解決したのかをまとめます.
機能:
  • は、重みデータをデータファイルdata.txtに格納する.
  • キーボードは、文字セットサイズn、n文字、およびn個の重み値を入力し、ハフマンツリーを構築します.
  • は、構築されたハフマンツリーを用いてハフマン符号化を生成する.
  • data.txtの重みデータから生成されたハフマン符号化を用いて、ファイルText.txtの文字列符号化をHuffmanCode.txtファイルに保存する.
  • data.txtの重みデータから生成されたハフマン符号化を用いて、ファイルHuffmanCode.txtのハフマン符号化復号生成文字列をText.txtファイルに保存する.
  • は、code.txtファイルにハフマン符号化を出力する.

  • このうち、機能1、2、3、6は基本課程設計に要求される機能であり、コードの実用性を高めるために、指導者は私に4、5機能を増やすことを提案した.
    構造体定義:
    typedef struct { //         
        char data ;
    	double weight;
        int lchild, rchild ,parent; 
    } HTNode , *HuffmanTree;//           
    typedef struct{//           
    	char cd[11];
    	char data;
    	int len;
    }HCNode , *HuffmanCode;
    
    実装コード:
    機能:
  • ハフマンツリーハフマン符号化
  • を確立する
  • キーボード入力文字
  • ハフマン符号化と文字の変換
  • を完了
  • ファイルからデータを読み出し、
  • を保存する.
  • 得られたデータをファイルに保存する
  • .
    #include 
    #include 
    #include 
    #include 
    #include "huff2.h"
    #define MAX_LINE 1024
    //         
    void Select(HuffmanTree &HT,int i,int &s1,int &s2){
    	int k=0;
    	s1=i-1;
    	s2=i;
    	for(int j=i;j>0;j--){
    		if(HT[j].parent==0){
    			if(HT[j].weight
    二次メニューの表示:
    プログラムの機能を直感的に表示
    void menu1(){
    	printf("		|*******************************************************************************|
    "); printf(" |-------------------Huffman -----------------------------------|
    "); printf(" |------------------- 1: --------------------|
    "); printf(" |------------------- 2: ----------|
    "); printf(" |------------------- 3: --------------------------------|
    "); printf(" |------------------- 0: ----------------------------------------------|
    "); printf(" |------------------- :0、1、2 -------------------------|
    "); printf(" |*******************************************************************************|
    "); } void menu2(){ printf(" |*******************************************************************************|
    "); printf(" |-------------------Huffman -----------------------------------|
    "); printf(" |------------------- 1: --------------------------------------------------|
    "); printf(" |------------------- 2: --------------------------------------------------|
    "); printf(" |------------------- 0: ----------------------------------------------|
    "); printf(" |------------------- :0、1、2 -------------------------|
    "); printf(" |*******************************************************************************|
    "); }
    メイン関数の黒窓機能オプションの実装:
    コードの機能を表示し、二級メニューの貫通、友好的なヒント語.
    
    void main()
    {
    	int fun;
    	char data[MAX_LINE]={0};
    	char code[10000]={0};
    	HuffmanTree HT; 
    	HuffmanCode HC;
    	menu1();
    	scanf("%d",&fun);
    	switch(fun){
    		case 1:
    			init1(HT,HC);
    			menu2();
    			scanf("%d",&fun);		
    			while(fun){
    				switch(fun){
    					case 1:
    						printf("   A-Z  (  ):
    "); scanf("%s",data); printf("( , !)"); DataToCode(HC,data); break; case 2: printf(" :
    "); scanf("%s",code); printf("( , , 。)"); CodeToData(HT,code); break; case 0: printf(" !
    "); break; default: printf(" ! !
    "); break; } menu2(); scanf("%d",&fun); } break; case 2: init2(HT,HC); menu2(); scanf("%d",&fun); while(fun){ switch(fun){ case 1: printf(" :
    "); scanf("%s",data); printf("( , !)"); DataToCode(HC,data); break; case 2: printf(" :
    "); scanf("%s",code); printf("( , , 。)"); CodeToData(HT,code); break; case 0: printf(" !
    "); break; default: printf(" ! !
    "); break; } menu2(); scanf("%d",&fun); } break; case 3: init1(HT,HC); menu2(); scanf("%d",&fun); while(fun){ switch(fun){ case 1: ReadTxtT(HC,data); break; case 2: ReadTxtH(HT,code); break; case 0: printf(" !
    "); break; default: printf(" ! !
    "); break; } menu2(); scanf("%d",&fun); } break; case 0: printf(" !
    "); exit(0); default: printf(" ! !
    "); break; } }
    まとめ:今回のデータ構造は、コードが存在する意味を認識すべきであり、なぜサービスされているのか、利用者が直面する誤りを十分に考え、コードによって強制的に阻止したり、友好的なヒント語を利用者に提示したりすることで、コードの丈夫性を強化することを認識させた.最も基本的な機能を実現した後、コードの実用性を高めることができるかどうかを見なければならない.結局役に立つコードだけが存在する意味がある.最後に、バグはどこにでもあり、何度もデバッグ、修正してこそバグを隠すことができ、一時的に解決できないバグに遭遇したら、まず他の場所を行い、別の方向から持ち込むことができ、解決できるかもしれません.