?? piview.cpp
字號:
// PiView.cpp : implementation of the CPiView class
//
#include "stdafx.h"
#include "Pi.h"
#include "PiDoc.h"
#include "PiView.h"
/////////////////////////////////////////////////////////////////////////////
//自定義頭文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "memory.h"
#include "NumSet.h"
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPiView
IMPLEMENT_DYNCREATE(CPiView, CView)
BEGIN_MESSAGE_MAP(CPiView, CView)
//{{AFX_MSG_MAP(CPiView)
ON_COMMAND(ID_CALUCATE, OnCalucate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPiView construction/destruction
CPiView::CPiView()
{
// TODO: add construction code here
/////////////////////////////////////////////////////////////////////////////
//變量初始化
m_Flag=0;
m_Count=0;
/////////////////////////////////////////////////////////////////////////////
}
CPiView::~CPiView()
{
}
BOOL CPiView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CPiView drawing
void CPiView::OnDraw(CDC* pDC)
{
CPiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
char str1[20]="有效位數:";
char str2[20]="迭代次數:";
char str3[20]="使用時間:";
char str4[20];
char str5[20];
char str6[20];
////////////////////////////////////////////////////////////////////////
//顯示等待信息
if(m_Flag==1)
pDC->TextOut(20,20,"正在計算,請稍候...");
////////////////////////////////////////////////////////////////////////
//計算完成,顯示結果
if(m_Flag==2)
{
double time=((double)m_time1)/1000.0;
pDC->TextOut(20,20,"正在計算,請稍候...");
_ltoa(m_Number,str4,10);
_ltoa(m_Count,str5,10);
gcvt(time,10,str6);
strcat(str1,str4);
strcat(str2,str5);
strcat(str3,str6);
strcat(str3,"秒");
if(m_Count!=0)
{
pDC->TextOut(20,40,"計算結束!");
pDC->TextOut(20,60,str1);
pDC->TextOut(20,80,"計算方法:");
pDC->TextOut(85,80,m_Method);
pDC->TextOut(20,100,str2);
pDC->TextOut(20,120,str3);
pDC->TextOut(20,140,"已將計算結果導入\"圓周率π.txt\"文件中");
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CPiView diagnostics
#ifdef _DEBUG
void CPiView::AssertValid() const
{
CView::AssertValid();
}
void CPiView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CPiDoc* CPiView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPiDoc)));
return (CPiDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPiView message handlers
void CPiView::OnCalucate()
{
// TODO: Add your command handler code here
/////////////////////////////////////////////////////////////////////////////
//初始化迭代次數
m_Count=0;
CNumSet NumberSet;
/////////////////////////////////////////////////////////////////////////////
//讀取精度,開始計算
if(NumberSet.DoModal()==IDOK)
{
m_Flag=1;
Invalidate();
//獲得有效位數N
m_Number=NumberSet.m_Number;
//為保證計算準確性,實際結果的位數取為N+10
m_Size=m_Number+10;
//保存所選擇的計算方法
m_Method=NumberSet.m_Method;
/////////////////////////////////////////////////////////////////////////////
//開辟存放空間,用于保存高精度計算結果
m_Result=new char[m_Size];
m_An=new char[m_Size];
AfxMessageBox("初始化完成,按回車開始計算!",MB_OK,NULL);
//讀取計算開始前的時間
m_time1=GetCurrentTime();
/////////////////////////////////////////////////////////////////////////////
//開始計算
if(NumberSet.m_Method==_T("反正切函數級數展開"))
ArcTan();
else if(NumberSet.m_Method==_T("反正弦函數級數展開"))
ArcSin();
else if(NumberSet.m_Method==_T("Marchin公式"))
Marchin();
else if(NumberSet.m_Method==_T("Shanks公式"))
Shanks();
else if(NumberSet.m_Method==_T("Gauss公式"))
Gauss();
////////////////////////////////////////////////////////////////////////////
//計算結束,讀取當前時間,求得計算所用時間
m_time2=GetCurrentTime();
m_time1=m_time2-m_time1;
////////////////////////////////////////////////////////////////////////////
//將計算結果保存為文件
FileSave();
////////////////////////////////////////////////////////////////////////////
//顯示完成消息
m_Flag=2;
Invalidate();
}
}
/////////////////////////////////////////////////////////////////////////////
//反正切函數級數展開求π函數
void CPiView::ArcTan()
{
long Flag=1;
int Up=1,Down=3,Temp,Add;
/////////////////////////////////////////////////////////////////////////////
//設置求和初值
for(int i=0; i<m_Size; i++)
{
m_Result[i]=0;
m_An[i]=0;
}
m_Result[1]=2;
m_An[1]=2;
/////////////////////////////////////////////////////////////////////////////
//計算過程
while(Flag)
{
/////////////////////////////////////////////////////////////////////////////
//待加項m_An乘上新加入項的分母,即m_An*=Up;
Add=0;
for(int i=m_Size-1;i>0;i--)
{
Temp=m_An[i]*Up+Add;
m_An[i]=Temp%10;
Add=Temp/10;
}
/////////////////////////////////////////////////////////////////////////////
//待加項m_An再除去新加入項的分子,即m_An/=Down;
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/Down;
Add=Temp%Down;
}
/////////////////////////////////////////////////////////////////////////////
//將m_An加入結果m_Result中,即m_Result+=m_An;
Flag=0;
for(i=m_Size-1;i>0;i--)
{
Temp=m_Result[i]+m_An[i];
m_Result[i]=Temp%10;
m_Result[i-1]+=Temp/10;
if(m_An[i]!=0)
Flag=1;
}
/////////////////////////////////////////////////////////////////////////////
//一次迭代完成,求下一次迭代的新加入項,并記錄迭代次數;
Up++;
Down+=2;
m_Count++;
}
return;
}
/////////////////////////////////////////////////////////////////////////////
//反正弦函數級數展開求π函數
void CPiView::ArcSin()
{
long Flag=1;
int k=1,Temp,Add;
/////////////////////////////////////////////////////////////////////////////
//設置求和初值
for(int i=0; i<m_Size; i++)
{
m_Result[i]=0;
m_An[i]=0;
}
m_Result[1]=3;
m_An[1]=3;
/////////////////////////////////////////////////////////////////////////////
//計算過程
while(Flag)
{
/////////////////////////////////////////////////////////////////////////////
//待加項m_An乘上新加入項的分母,即m_An*=k;
Add=0;
for(int i=m_Size-1;i>0;i--)
{
Temp=m_An[i]*k+Add;
m_An[i]=Temp%10;
Add=Temp/10;
}
/////////////////////////////////////////////////////////////////////////////
//待加項m_An乘上新加入項的分母,即m_An*=k;
Add=0;
for(i=m_Size-1;i>0;i--)
{
Temp=m_An[i]*k+Add;
m_An[i]=Temp%10;
Add=Temp/10;
}
/////////////////////////////////////////////////////////////////////////////
//待加項m_An再除去新加入項的分子,即m_An/=(k+1);
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/(k+1);
Add=Temp%(k+1);
}
/////////////////////////////////////////////////////////////////////////////
//待加項m_An再除去新加入項的分子,即m_An/=(4*(k+2));
Add=0;
for(i=0;i<m_Size;i++)
{
Temp=m_An[i]+Add*10;
m_An[i]=Temp/(4*(k+2));
Add=Temp%(4*(k+2));
}
/////////////////////////////////////////////////////////////////////////////
//將m_An加入結果m_Result中,即m_Result+=m_An;
Flag=0;
for(i=m_Size-1;i>0;i--)
{
Temp=m_Result[i]+m_An[i];
m_Result[i]=Temp%10;
m_Result[i-1]+=Temp/10;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -