?? imitateview.cpp
字號:
// IMITATEView.cpp : implementation of the CIMITATEView class
//
#include "stdafx.h"
#include "IMITATE.h"
#include "InPut.h"
#include "NUMBER.h"
#include "fstream.h"
#include "math.h"
#include "Mnum.h"
#include "IMITATEDoc.h"
#include "IMITATEView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView
IMPLEMENT_DYNCREATE(CIMITATEView, CView)
BEGIN_MESSAGE_MAP(CIMITATEView, CView)
//{{AFX_MSG_MAP(CIMITATEView)
ON_COMMAND(ID_Input, OnInput)
ON_COMMAND(ID_DWrite, OnDWrite)
ON_COMMAND(ID_DRead, OnDRead)
ON_COMMAND(ID_Imitate, OnImitate)
ON_COMMAND(ID_1_Imitate, On1Imitate)
ON_COMMAND(ID_2_Imitate, On2Imitate)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView construction/destruction
CIMITATEView::CIMITATEView()
{
// TODO: add construction code here
NUM=0;
for(int i=0;i<20;i++)
Time[i]=0.0;
}
CIMITATEView::~CIMITATEView()
{
}
BOOL CIMITATEView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView drawing
void CIMITATEView::OnDraw(CDC* pDC)
{
CIMITATEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data her
}
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView printing
BOOL CIMITATEView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CIMITATEView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CIMITATEView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView diagnostics
#ifdef _DEBUG
void CIMITATEView::AssertValid() const
{
CView::AssertValid();
}
void CIMITATEView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CIMITATEDoc* CIMITATEView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIMITATEDoc)));
return (CIMITATEDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CIMITATEView message handlers
void CIMITATEView::OnInput()
{
// TODO: Add your command handler code here
InPut input;
NUMBER num;
if(num.DoModal()==IDOK)
NUM=num.m_Num;
for(int i=0;i<num.m_Num;i++)
{
if(input.DoModal()==IDOK)//調用輸入對話框
{
Time[i]=input.m_Time;//輸入
C[i]=input.m_C;
input.m_Time=0.0;//清0
input.m_C=0.0;//清0
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::OnDWrite()
{
// TODO: Add your command handler code here
CFileDialog dlg(FALSE,"*.txt","*.txt");
CString path;
if(dlg.DoModal()==IDOK)//調用文件保存對話框
{
path=dlg.GetFileName();
}
else
exit(0);
ofstream fout(path);
fout<<NUM<<" ";//保存數據組數
for(int i=0;i<NUM;i++)
{
if(!fout)//出錯
{
MessageBox("文件不存在!");
exit(0);
}
fout<<Time[i]<<" "<<C[i]<<" ";//依次保存時間和濃度
}
fout.close();//文件關閉
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::OnDRead()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"*.txt","*.txt");
CString path;
if(dlg.DoModal()==IDOK)//調用打開對話框
{
path=dlg.GetFileName();
}
else
exit(1);
ifstream fin(path);
if(!fin)//文件不存在
{
MessageBox("文件不存在!");
exit(0);
}
fin>>NUM;//讀出組數
for(int i=0;i<NUM;i++)
fin>>Time[i]>>C[i];//依次讀出時間和濃度
fin.close();//文件關閉
OutPut();//輸出函數
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::Gauss(double sz[][20],int n)
{
int j, t;//t記錄最大下標
double s,c,p; //s交換中間變量
for(int k=0;k<n;k++)
{
p=0;
for(int i=k;i<n+1;i++)
{
if(p<fabs(sz[i][k])) //找最大行
{
p=fabs(sz[i][k]);
t=i;//記錄行標
}
}
if(k!=t) //交換
for( j=k;j<n+2;j++)
{
s=sz[k][j];
sz[k][j]=sz[t][j];
sz[t][j]=s;
}
j=k+1;
while(j<n+1)
{
c=sz[j][k]/sz[k][k];//變換系數
for(i=k;i<n+1;i++)
sz[j][i]=sz[j][i]-c*sz[k][i];
j++;
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::OnImitate()
{
// TODO: Add your command handler code here
if(IsEmpty()==0)
MessageBox("請先讀入數據!");
else{
Mnum nu;
nu.DoModal();//調用次數對話框
Nihe(Time,C,nu.m_mnum);//根據輸入求解方程
CString Result="擬合曲線方程為:\n";
CString str;
str.Format("y=%.6f",X[0]);
Result+=str;
for(int i=1;i<nu.m_mnum+1;i++)//定制輸出
{
str.Format("+(%.4f)t^%d",X[i],i);
Result+=str;
}
MessageBox(Result);
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::Nihe(double t[],double y[],int m)
{
int i,j,k=0;
double sz[N][N+1]={0},S[N]={0},T[N]={0};
for(i=0;i<NUM;i++)
{
for(k=0;k<=2*m;k++)
{
S[k]=S[k]+pow(t[i],k);
T[k]=T[k]+y[i]*(pow(t[i],k));
}
}
for(i=0;i<m+1;i++)//構造系數矩陣
{
for(j=0;j<m+1;j++)
{
sz[i][j]=S[i+j];
}
}
for(i=0;i<m+1;i++)
{
sz[i][m+1]=T[i];
}
Gauss(sz,m+1);
double s=0.0;
X[m]=sz[m][m+1]/sz[m][m]; //先求得最后一個解
for(i=m-1;i>=0;i--)
{
for(j=i+1;j<m+1;j++)
s+=(sz[i][j]*X[j]);
X[i]=(sz[i][m+1]-s)/sz[i][i]; //回代公式求解
s=0;
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::On1Imitate()
{
// TODO: Add your command handler code here
double Cc[20]={0.0};
if(IsEmpty()==0)
MessageBox("請先讀入數據!");
else{
for(int i=0;i<NUM;i++)
{
Cc[i]=1.0/C[i];//濃度求倒數
}
Nihe(Time,Cc,1);//一次擬合
CString Result="擬合曲線方程為:\n";
CString str;
str.Format("1/y=1/%.6f",1/X[0]);
Result+=str;
str.Format("-(%.6f/%.6f)*t",X[1]/X[0],1/X[0],1);
Result+=str;
MessageBox(Result);//輸出
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::On2Imitate()
{
// TODO: Add your command handler code here
double time[20],c[20];
if(IsEmpty()==0)
MessageBox("請先讀入數據!");
else{
for(int i=0;i<NUM;i++)
{
time[i]=1.0/Time[i];//時間求倒數
c[i]=log(C[i]);//濃度取對數
}
Nihe(time,c,1);//一次線形擬合
CString Result="擬合曲線方程為:\n\n";
CString str;
str.Format("y=%.6fe^",exp(X[0]));
Result+=str;
str.Format("((%.6f)/t)",X[1],1);
Result+=str;
MessageBox(Result);//輸出
}
}
/////////////////////////////////////////////////////////////////////////////
void CIMITATEView::OutPut()
{
CDC*pDC=GetDC();
CString str;//用于輸出
pDC->TextOut(10,0,"數據清單如下:");
for(int i=0;i<NUM;i++)
{
str.Empty();
str.Format("時間:%lf 濃度:%lf",Time[i],C[i]);//定制格式
pDC->TextOut(10,(i+1)*20,str);
}
}
/////////////////////////////////////////////////////////////////////////////
int CIMITATEView::IsEmpty()//判空
{
if(Time[0]==0)
return 0;
else
return 1;
}
/////////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -