ハフマンコーディングデコーダ
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機能を増やすことを提案した.
構造体定義:
機能:ハフマンツリーハフマン符号化 を確立するキーボード入力文字 ハフマン符号化と文字の変換 を完了ファイルからデータを読み出し、 を保存する.得られたデータをファイルに保存する .
プログラムの機能を直感的に表示
コードの機能を表示し、二級メニューの貫通、友好的なヒント語.
今回のカリキュラム設計をまとめて、出会った問題はどのように解決したのかをまとめます.
機能:
このうち、機能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;
}
}
まとめ:今回のデータ構造は、コードが存在する意味を認識すべきであり、なぜサービスされているのか、利用者が直面する誤りを十分に考え、コードによって強制的に阻止したり、友好的なヒント語を利用者に提示したりすることで、コードの丈夫性を強化することを認識させた.最も基本的な機能を実現した後、コードの実用性を高めることができるかどうかを見なければならない.結局役に立つコードだけが存在する意味がある.最後に、バグはどこにでもあり、何度もデバッグ、修正してこそバグを隠すことができ、一時的に解決できないバグに遭遇したら、まず他の場所を行い、別の方向から持ち込むことができ、解決できるかもしれません.