📄 feiruocodedlg.cpp
字号:
// FeiruoCodeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "FeiruoCode.h"
#include "FeiruoCodeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static Result result[8];
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFeiruoCodeDlg dialog
CFeiruoCodeDlg::CFeiruoCodeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFeiruoCodeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFeiruoCodeDlg)
m_symbol1 = 1;
m_symbol2 = 2;
m_symbol3 = 3;
m_symbol4 = 4;
m_symbol5 = 5;
m_symbol8 = 8;
m_symbol7 = 7;
m_symbol6 = 6;
m_dPXinxiLiang1 = 0.0;
m_dPXinxiLiang2 = 0.0;
m_dPXinxiLiang3 = 0.0;
m_dPXinxiLiang4 = 0.0;
m_dPXinxiLiang5 = 0.0;
m_dPXinxiLiang6 = 0.0;
m_dPXinxiLiang7 = 0.0;
m_dPXinxiLiang8 = 0.0;
m_dProbabilty1 = 0.0;
m_dProbabilty2 = 0.0;
m_dProbabilty3 = 0.0;
m_dProbabilty4 = 0.0;
m_dProbabilty5 = 0.0;
m_dProbabilty6 = 0.0;
m_dProbabilty7 = 0.0;
m_dProbabilty8 = 0.0;
m_strAfterCode = _T("");
m_strBeforeCode = _T("");
m_dFeinuoAvgCodeLen = 0.0;
m_strFeinuoBinaryCode1 = _T("");
m_strFeinuoBinaryCode2 = _T("");
m_strFeinuoBinaryCode3 = _T("");
m_strFeinuoBinaryCode4 = _T("");
m_strFeinuoBinaryCode5 = _T("");
m_strFeinuoBinaryCode6 = _T("");
m_strFeinuoBinaryCode7 = _T("");
m_strFeinuoBinaryCode8 = _T("");
m_dFeinuoCodeEff = 0.0;
m_FeinuoCodeLen1 = 0;
m_FeinuoCodeLen2 = 0;
m_FeinuoCodeLen3 = 0;
m_FeinuoCodeLen4 = 0;
m_FeinuoCodeLen5 = 0;
m_FeinuoCodeLen6 = 0;
m_FeinuoCodeLen7 = 0;
m_FeinuoCodeLen8 = 0;
m_dHafuAvgCodeLen = 0.0;
m_strHafuBinaryCode1 = _T("");
m_strHafuBinaryCode2 = _T("");
m_strHafuBinaryCode3 = _T("");
m_strHafuBinaryCode4 = _T("");
m_strHafuBinaryCode5 = _T("");
m_strHafuBinaryCode6 = _T("");
m_strHafuBinaryCode7 = _T("");
m_strHafuBinaryCode8 = _T("");
m_dHafuCodeEff = 0.0;
m_HafuCodeLen1 = 0;
m_HafuCodeLen2 = 0;
m_HafuCodeLen3 = 0;
m_HafuCodeLen4 = 0;
m_HafuCodeLen5 = 0;
m_HafuCodeLen6 = 0;
m_HafuCodeLen7 = 0;
m_HafuCodeLen8 = 0;
m_dShanooAvgCodeLen = 0.0;
m_strShanooBinaryCode1 = _T("");
m_strShanooBinaryCode2 = _T("");
m_strShanooBinaryCode3 = _T("");
m_strShanooBinaryCode4 = _T("");
m_strShanooBinaryCode5 = _T("");
m_strShanooBinaryCode6 = _T("");
m_strShanooBinaryCode7 = _T("");
m_strShanooBinaryCode8 = _T("");
m_dShanoocodeEff = 0.0;
m_ShanooCodeLen1 = 0;
m_ShanooCodeLen2 = 0;
m_ShanooCodeLen3 = 0;
m_ShanooCodeLen4 = 0;
m_ShanooCodeLen5 = 0;
m_ShanooCodeLen6 = 0;
m_ShanooCodeLen7 = 0;
m_ShanooCodeLen8 = 0;
m_dShanooPSum1 = 0.0;
m_dShanooPSum2 = 0.0;
m_dShanooPSum3 = 0.0;
m_dShanooPSum4 = 0.0;
m_dShanooPSum5 = 0.0;
m_dShanooPSum6 = 0.0;
m_dShanooPSum7 = 0.0;
m_dShanooPSum8 = 0.0;
m_dSorceShang = 0.0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFeiruoCodeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFeiruoCodeDlg)
DDX_Text(pDX, IDC_ESYMBOL1, m_symbol1);
DDX_Text(pDX, IDC_ESYMBOL2, m_symbol2);
DDX_Text(pDX, IDC_ESYMBOL3, m_symbol3);
DDX_Text(pDX, IDC_ESYMBOL4, m_symbol4);
DDX_Text(pDX, IDC_ESYMBOL5, m_symbol5);
DDX_Text(pDX, IDC_ESYMBOL8, m_symbol8);
DDX_Text(pDX, IDC_ESYMBOL7, m_symbol7);
DDX_Text(pDX, IDC_ESYMBOL6, m_symbol6);
DDX_Text(pDX, IDC_EPINXILIANG1, m_dPXinxiLiang1);
DDX_Text(pDX, IDC_EPINXILIANG2, m_dPXinxiLiang2);
DDX_Text(pDX, IDC_EPINXILIANG3, m_dPXinxiLiang3);
DDX_Text(pDX, IDC_EPINXILIANG4, m_dPXinxiLiang4);
DDX_Text(pDX, IDC_EPINXILIANG5, m_dPXinxiLiang5);
DDX_Text(pDX, IDC_EPINXILIANG6, m_dPXinxiLiang6);
DDX_Text(pDX, IDC_EPINXILIANG7, m_dPXinxiLiang7);
DDX_Text(pDX, IDC_EPINXILIANG8, m_dPXinxiLiang8);
DDX_Text(pDX, IDC_EPROBABILTY1, m_dProbabilty1);
DDX_Text(pDX, IDC_EPROBABILTY2, m_dProbabilty2);
DDX_Text(pDX, IDC_EPROBABILTY3, m_dProbabilty3);
DDX_Text(pDX, IDC_EPROBABILTY4, m_dProbabilty4);
DDX_Text(pDX, IDC_EPROBABILTY5, m_dProbabilty5);
DDX_Text(pDX, IDC_EPROBABILTY6, m_dProbabilty6);
DDX_Text(pDX, IDC_EPROBABILTY7, m_dProbabilty7);
DDX_Text(pDX, IDC_EPROBABILTY8, m_dProbabilty8);
DDX_Text(pDX, IDC_EAFTERCODE, m_strAfterCode);
DDX_Text(pDX, IDC_EBEFORECODE, m_strBeforeCode);
DDX_Text(pDX, IDC_EFEINUOAVGCODELGN, m_dFeinuoAvgCodeLen);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE1, m_strFeinuoBinaryCode1);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE2, m_strFeinuoBinaryCode2);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE3, m_strFeinuoBinaryCode3);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE4, m_strFeinuoBinaryCode4);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE5, m_strFeinuoBinaryCode5);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE6, m_strFeinuoBinaryCode6);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE7, m_strFeinuoBinaryCode7);
DDX_Text(pDX, IDC_EFEINUOBINARYCODE8, m_strFeinuoBinaryCode8);
DDX_Text(pDX, IDC_EFEINUOCODEEFFICIENT, m_dFeinuoCodeEff);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH1, m_FeinuoCodeLen1);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH2, m_FeinuoCodeLen2);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH3, m_FeinuoCodeLen3);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH4, m_FeinuoCodeLen4);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH5, m_FeinuoCodeLen5);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH6, m_FeinuoCodeLen6);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH7, m_FeinuoCodeLen7);
DDX_Text(pDX, IDC_EFEINUOCODELENGTH8, m_FeinuoCodeLen8);
DDX_Text(pDX, IDC_EHAFUAVGCODELGN, m_dHafuAvgCodeLen);
DDX_Text(pDX, IDC_EHAFUBINARYCODE1, m_strHafuBinaryCode1);
DDX_Text(pDX, IDC_EHAFUBINARYCODE2, m_strHafuBinaryCode2);
DDX_Text(pDX, IDC_EHAFUBINARYCODE3, m_strHafuBinaryCode3);
DDX_Text(pDX, IDC_EHAFUBINARYCODE4, m_strHafuBinaryCode4);
DDX_Text(pDX, IDC_EHAFUBINARYCODE5, m_strHafuBinaryCode5);
DDX_Text(pDX, IDC_EHAFUBINARYCODE6, m_strHafuBinaryCode6);
DDX_Text(pDX, IDC_EHAFUBINARYCODE7, m_strHafuBinaryCode7);
DDX_Text(pDX, IDC_EHAFUBINARYCODE8, m_strHafuBinaryCode8);
DDX_Text(pDX, IDC_EHAFUCODEEFFICIENT, m_dHafuCodeEff);
DDX_Text(pDX, IDC_EHAFUCODELENGTH1, m_HafuCodeLen1);
DDX_Text(pDX, IDC_EHAFUCODELENGTH2, m_HafuCodeLen2);
DDX_Text(pDX, IDC_EHAFUCODELENGTH3, m_HafuCodeLen3);
DDX_Text(pDX, IDC_EHAFUCODELENGTH4, m_HafuCodeLen4);
DDX_Text(pDX, IDC_EHAFUCODELENGTH5, m_HafuCodeLen5);
DDX_Text(pDX, IDC_EHAFUCODELENGTH6, m_HafuCodeLen6);
DDX_Text(pDX, IDC_EHAFUCODELENGTH7, m_HafuCodeLen7);
DDX_Text(pDX, IDC_EHAFUCODELENGTH8, m_HafuCodeLen8);
DDX_Text(pDX, IDC_ESHANOOAVGCODELGN, m_dShanooAvgCodeLen);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE1, m_strShanooBinaryCode1);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE2, m_strShanooBinaryCode2);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE3, m_strShanooBinaryCode3);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE4, m_strShanooBinaryCode4);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE5, m_strShanooBinaryCode5);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE6, m_strShanooBinaryCode6);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE7, m_strShanooBinaryCode7);
DDX_Text(pDX, IDC_ESHANOOBINARYCODE8, m_strShanooBinaryCode8);
DDX_Text(pDX, IDC_ESHANOOCODEEFFICIENT, m_dShanoocodeEff);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH1, m_ShanooCodeLen1);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH2, m_ShanooCodeLen2);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH3, m_ShanooCodeLen3);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH4, m_ShanooCodeLen4);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH5, m_ShanooCodeLen5);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH6, m_ShanooCodeLen6);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH7, m_ShanooCodeLen7);
DDX_Text(pDX, IDC_ESHANOOCODELENGTH8, m_ShanooCodeLen8);
DDX_Text(pDX, IDC_ESHANOOPSUM1, m_dShanooPSum1);
DDX_Text(pDX, IDC_ESHANOOPSUM2, m_dShanooPSum2);
DDX_Text(pDX, IDC_ESHANOOPSUM3, m_dShanooPSum3);
DDX_Text(pDX, IDC_ESHANOOPSUM4, m_dShanooPSum4);
DDX_Text(pDX, IDC_ESHANOOPSUM5, m_dShanooPSum5);
DDX_Text(pDX, IDC_ESHANOOPSUM6, m_dShanooPSum6);
DDX_Text(pDX, IDC_ESHANOOPSUM7, m_dShanooPSum7);
DDX_Text(pDX, IDC_ESHANOOPSUM8, m_dShanooPSum8);
DDX_Text(pDX, IDC_ESORCESHANG, m_dSorceShang);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFeiruoCodeDlg, CDialog)
//{{AFX_MSG_MAP(CFeiruoCodeDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BAUTODISTUBTE, OnBautodistubte)
ON_BN_CLICKED(IDC_BBEGINCODE, OnBbegincode)
ON_BN_CLICKED(IDC_BHELP, OnBhelp)
ON_BN_CLICKED(IDC_BCLEAR, OnBclear)
ON_BN_CLICKED(IDC_BABOUT, OnBabout)
ON_BN_CLICKED(IDC_BEXIT, OnBexit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFeiruoCodeDlg message handlers
BOOL CFeiruoCodeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item 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())
{
pSysMenu->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 dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CFeiruoCodeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CFeiruoCodeDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CBrush* br=new CBrush(RGB(253,208,253));
if(br)
{
dc.FillRect(&rect,br);
delete br;
}
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFeiruoCodeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//自动分配按钮
void CFeiruoCodeDlg::OnBautodistubte()
{
// TODO: Add your control notification handler code here
OnBclear();
//获取随机数
srand((unsigned)time(NULL));//随机数种子,用来保证每次取得随机数都不同
int i;
int data[100];
for(i=0;i<100;i++)
data[i]=rand()%8+1;
//将所获得的随机数在编辑框中显示出来
char buf[100];
for(i=0;i<100;i++)
{
_itoa(data[i],buf,10);
m_strBeforeCode=m_strBeforeCode+buf;
}
UpdateData(false);
}
//实现费诺编码算法的递归调用
int CFeiruoCodeDlg::feinuocode(int low,int high)
{
int m=low,n=high;
int i;
if(m==n)
return 1;
else if(m+1==n)
{
feinuobinarycode[m]+="0";
feinuobinarycode[n]+="1";
feinuocodelen[m]+=1;
feinuocodelen[n]+=1;
return 1;
}
//将概率分成两组
else
{
double sum0=0,sum1=0,sum2=0;
for(i=m;i<=n;i++)
sum0+=probablity[i];
do
{
sum1+=probablity[m];
sum2=sum1+probablity[m+1];
m++;
}while((fabs(sum1/sum0-0.5))>(fabs(sum2/sum0-0.5)));
for(i=low;i<m;i++)
{
feinuobinarycode[i]+="0";
feinuocodelen[i]+=1;
}
for(i=m;i<=n;i++)
{
feinuobinarycode[i]+="1";
feinuocodelen[i]+=1;
}
}
//递归调用此函数
feinuocode(low,m-1);
feinuocode(m,high);
return 1;
}
//实现哈夫曼编码算法的递归调用
void CFeiruoCodeDlg::HafuCode()
{
class InputArray Array[8];
double temp=0;
double probSum=0;//两个最小概率之和
int i,j,k;
//初始化Array中的值
for(i=0;i<8;i++)
{
Array[i].symbol=(char)symbol[i];
Array[i].probality=probablity[i];
}
Node * p;
for(i=0;i<8;i++)
{
p=(Node *)malloc(sizeof(Node));
Array[i].addr=p;
p->pLeft=NULL;
p->pRight=NULL;
p->symbol=(char)i;
}
int depth=0;//用于记录Hafu编码算法做了几次
Node *pLeft,*pRight;
while(probSum<1)
{
probSum=Array[7-depth].probality+Array[7-depth-1].probality;
pLeft=Array[7-depth].addr;
pRight=Array[7-depth-1].addr;
j=0;
Array[7-depth].probality=Array[7-depth-1].probality=0;
//若所加的概率之和与剩下的每个符号的概率相比较,若小于则继续比较
while(probSum<Array[j].probality)
j++;
//否则的话,就将其下所有的符号概率都向下移一位
if(j<(7-depth-1))
{
for(k=7-depth-2;k>=j;k--)
{
Array[k+1].symbol=Array[k].symbol;
Array[k+1].addr=Array[k].addr;
Array[k+1].probality=Array[k].probality;
}
}
Array[j].symbol=(char)depth;
p=(Node *)malloc(sizeof(Node));
Array[j].addr=p;
Array[j].probality=probSum;
p->pLeft=pLeft;
p->pRight=pRight;
p->symbol=Array[j].symbol;
depth++;
}
p=Array[0].addr;
Traverse(p,-1);
CString strTemp;
for(i=0;i<8;i++)
{
for(j=0;j<=result[i].codelen;j++)
{
strTemp=result[i].binarycode[j];
Hafubinarycode[i]+=strTemp;
}
strTemp="";
Hafucodelen[i]=result[i].codelen+1;
}
}
//遍历二叉树,取得码长及码字
void CFeiruoCodeDlg::Traverse(Node *Tree, int depth)
{
static char binarycode[8];
static int value;
if(Tree->pRight!=NULL)
{
depth++;
binarycode[depth]='0';
Traverse(Tree->pRight,depth);
binarycode[depth]='1';
Traverse(Tree->pLeft,depth);
depth--;
}
else
{
value=Tree->symbol;
result[value].symbol=Tree->symbol;
result[value].codelen=depth;
for(int j=0;j<=depth;j++)
result[value].binarycode[j]=binarycode[j];
}
}
//开始编码按钮操作
void CFeiruoCodeDlg::OnBbegincode()
{
// TODO: Add your control notification handler code here
UpdateData(true);
double sum[8];
int i,j;
for(i=0;i<8;i++)
{
sum[i]=0.0;
symbol[i]=i+1;
}
//计算各个符号出现的次数
for(i=0;i<100;i++)
{
if(m_strBeforeCode.GetAt(i)=='1')
sum[0]++;
if(m_strBeforeCode.GetAt(i)=='2')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -