⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 piview.cpp

📁 用Visual C++开发的图形化圆周率Pi计算程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -