📄 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;
//判断当前的通项是否已经为0
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 + -