📄 work6dlg.cpp
字号:
// work6Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "work6.h"
#include "work6Dlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CWork6Dlg dialog
CWork6Dlg::CWork6Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CWork6Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CWork6Dlg)
m_Count = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CWork6Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWork6Dlg)
DDX_Text(pDX, IDC_EDIT_COUNT, m_Count);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWork6Dlg, CDialog)
//{{AFX_MSG_MAP(CWork6Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, OnCompute)
ON_EN_CHANGE(IDC_EDIT_COUNT, OnChangeEditCount)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWork6Dlg message handlers
BOOL CWork6Dlg::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 CWork6Dlg::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 CWork6Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
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 CWork6Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CWork6Dlg::GetTheData(CString filename)
{
FILE *fp;
float * temvalue;
char c;
fp=fopen(filename,"r");
if (!fp) MessageBox("dat文件无法打开","灰色预测");
do
{
temvalue=new float;
fscanf(fp,"%f",temvalue);
c=fgetc(fp);
m_Info.Add((CObject *)temvalue);
}while(c!='#');
fclose(fp);
}
float * CWork6Dlg::PutDataToPData()
{
float * p=new float[m_Info.GetSize()];
for (int i=0;i<m_Info.GetSize();i++)
*(p+i)=*((float *)(m_Info.GetAt(i)));
return p;
}
float * CWork6Dlg::Acculate(float *pdata)
{
int count=m_Info.GetSize();
float * presult=NULL;
float sum;
presult=new float[count];
for (int i=0;i<count;i++)
{
if (i==0)
{
*(presult+i)=*(pdata+i);
sum=*(pdata+i);
}
else
{
sum+=*(pdata+i);
*(presult+i)=sum;
}
}
return presult;
}
void CWork6Dlg::InitailJUZHEN(JUZHEN &x,float * p)
{
x.m=m_Info.GetSize()-1;
x.n=2;
x.pval=new float[x.m*x.n];
for (int i=0;i<x.m;i++)
{
for (int j=0;j<x.n;j++)
{
if (j==0) *(x.pval+i*x.n+j)=(*(p+i)+*(p+i+1))*(-0.5);
else *(x.pval+i*x.n+j)=1;
}
}
}
void CWork6Dlg::RevTrans(JUZHEN &pre, JUZHEN &after)
{
after.m=pre.n;
after.n=pre.m;
after.pval=new float[pre.m*pre.n];
for (int i=0;i<after.m;i++)
{
for (int j=0;j<after.n;j++)
{
*(after.pval+i*after.n+j)=*(pre.pval+j*pre.n+i);
}
}
}
JUZHEN CWork6Dlg::MultiAdd(JUZHEN x, JUZHEN y)
{
if (x.n!=y.m) {MessageBox("data error");}
else
{
JUZHEN r;
r.m=x.m;
r.n=y.n;
r.pval=new float[r.m*r.n];
for (int i=0;i<r.m;i++)
{
for (int j=0;j<r.n;j++)
{
float sum=0;
for (int k=0;k<x.n;k++)
sum+=x.pval[i*x.n+k]*y.pval[k*y.n+j];
*(r.pval+i*r.n+j)=sum;
}
}
return r;
}
}
void CWork6Dlg::OnCompute()
{
// TODO: Add your control notification handler code here
m_Info.RemoveAll();
MessageBox("现在开始计算,请取保数据输入正确","灰色预测");
GetTheData("dat.txt");
float * pData0=NULL, * pData1=NULL;
float aPar=0,uPar=0;
pData0=PutDataToPData();
OutData(pData0,m_Info.GetSize(),0);
pData1=Acculate(pData0);
OutData(pData1,m_Info.GetSize(),1);
JUZHEN B,BT,BR;
InitailJUZHEN(B,pData1);
// OutputJUZHEN(B);
RevTrans(B,BT);
// OutputJUZHEN(BT);
JUZHEN R;
R=MultiAdd(BT,B);
// OutputJUZHEN(R);
BR=GetReverJuzhen(R);
// OutputJUZHEN(BR);
JUZHEN YM;
YM.m=m_Info.GetSize()-1;
YM.n=1;
YM.pval=new float[YM.m*YM.n];
for (int i=0;i<YM.m*YM.n;i++)
{
YM.pval[i]=pData0[i+1];
}
// OutputJUZHEN(YM);
JUZHEN RES;
RES=MultiAdd(MultiAdd(BR,BT),YM);
OutputJUZHEN(RES);
aPar=RES.pval[0];
uPar=RES.pval[1];
int totalcount=m_Info.GetSize()+m_Count;
float * rpdata0,* rpdata1;
rpdata1=new float[totalcount];
rpdata0=new float[totalcount];
for (i=0;i<totalcount;i++)
{
if (i==0) rpdata1[i]=pData1[i];
else
{
rpdata1[i]=(pData0[0]-uPar/aPar)*exp(aPar*i*(-1))+uPar/aPar;
}
}
for (i=0;i<totalcount;i++)
{
if (i==0) rpdata0[i]=pData0[i];
else
{
rpdata0[i]=rpdata1[i]-rpdata1[i-1];
}
}
float * ep;
ep=new float[m_Info.GetSize()];
OutData(rpdata1,m_Info.GetSize(),2);
OutData(rpdata0,m_Info.GetSize(),3);
for (i=0;i<m_Info.GetSize();i++)
{
ep[i]=(pData0[i]-rpdata0[i])/pData0[i]*100;
}
OutData(ep,m_Info.GetSize(),4);
OutData(rpdata0,totalcount,5);
MessageBox("计算结束,请查看out.txt文档","灰色预测");
}
void CWork6Dlg::OutputJUZHEN(JUZHEN x)
{
FILE * fp;
CString filename="out.txt";
fp=fopen(filename,"a");
fprintf(fp,"经计算得到a,u分别为:\n");
for (int i=0;i<x.m;i++)
{
for (int j=0;j<x.n;j++)
{
fprintf(fp,"%.5f ",*(x.pval+i*x.n+j));
}
fprintf(fp,"\n");
}
fclose(fp);
}
void CWork6Dlg::OutData(float *pdata,int count,int flag)
{
FILE * fp;
CString filename="out.txt";
fp=fopen(filename,"a");
switch(flag) {
case 0:
fprintf(fp,"原始数列X(0)为:\n");
break;
case 1:
fprintf(fp,"经过一次累加后,数列X(1)为:\n");
break;
case 2:
fprintf(fp,"经计算得X^(1)数列为:\n");
break;
case 3:
fprintf(fp,"经一次累减回归后,X^(0)数列为:\n");
break;
case 4:
fprintf(fp,"其中与实际数据的相对误差为:(单位:%)\n");
break;
case 5:
fprintf(fp,"最终预测数列为:\n");
break;
default:
break;
}
for (int i=0;i<count;i++)
{
fprintf(fp,"%.5f ",*(pdata+i));
}
fprintf(fp,"\n");
fclose(fp);
}
JUZHEN CWork6Dlg::GetReverJuzhen(JUZHEN x)
{
if (x.m!=x.n) MessageBox("不能求逆");
else
{
int m=x.m;
int i,j;
float *b;
b=new float[m*m*2];
for (i=0;i<m*m*2;i++)
{
if (i%(2*m)<m) b[i]=x.pval[(i/(2*m))*m+(i%(2*m))];
else if ((i%(2*m))-m==(i/(2*m))) b[i]=1;
else b[i]=0;
}
float t;
int k;
for (i=0;i<m;i++)
{
t=b[i*2*m+i];
for (j=0;j<2*m;j++)//把第i行按第i列单位化
b[i*2*m+j]/=t;
for (j=0;j<m;j++)
if (j!=i)
{
t=b[j*2*m+i]/b[i*2*m+i];
for (k=0;k<2*m;k++)
b[j*2*m+k]-=b[i*2*m+k]*t;
}
}
JUZHEN res;
res.m=x.m;
res.n=x.n;
res.pval=new float[m*m];
for (i=0;i<m;i++)
for (j=0;j<m;j++)
res.pval[i*m+j]=b[i*2*m+j+m];
return res;
}
}
void CWork6Dlg::OnChangeEditCount()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -