CALCULO DEL NUMERO PI EN VISUAL C++
Creamos una aplicación MFC.exe con el nombre calculodepi con todos los pasos por defecto del asistente y en el último paso se escoje como tipo de formulario base un formview.
Y introducimos un botón, dos etiquetas Static1, Static2 que asociaremos con el classwizzard a las variables m_pi y m_texto respectivamente, añadimos dos combobox que lo asociamos a la variable m_maximocontador y que el segundo contendrá los valores 10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 que será el número de bucles que deberá hacer el programa para calcular los decimales del número pi (cada potencia de 10 es un decimal del numero pi), añadimos una barra de progreso, y otra etiqueta static3 asociada a la variable m_porciento. El primero contendrá los tres posibles algoritmos para calcuilar el número Pi:
En el fichero calculonumeropi.h se declaran las variables publicas siguientes:
public:
//{{AFX_DATA(CCALCULONUMEROPIView)
enum { IDD = IDD_CALCULONUMEROPI_FORM
};
CProgressCtrl m_progreso;
CString m_maximocontador;
double maximocontador;
double pi;
CString m_pi;
CString m_texto;
CString m_porciento;
Int i_Tipo;
double porciento;
Si utilizamos los asistentes, algunas de ellas estarán declaradas ya (las asociadas a las variables de los controles).
Inicializamos las variables en el fichero calculonumeropi.cpp en el constructor de la clase vista.
CCALCULONUMEROPIView::CCALCULONUMEROPIView()
: CFormView(CCALCULONUMEROPIView::IDD)
{
//{{AFX_DATA_INIT(CCALCULONUMEROPIView)
m_maximocontador
= _T("");
maximocontador=10;
m_pi = _T("");
m_texto =
_T("");
progreso=0;
m_porciento
= _T("");
porciento=0;
i_Tipo=0; //}}AFX_DATA_INIT
// TODO: add
construction code here
}
Inicializamos los controles en la función oninitialUpdate
void CCALCULONUMEROPIView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_maximocontador="100";
UpdateData(false);
CComboBox * combo2 =(CComboBox*) GetDlgItem(IDC_COMBO2);
combo2->SetCurSel(0);
}
Se asocia con el Class Wizard al combo2 la función asociada al Mensaje de windows onselchange
void CCALCULONUMEROPIView::OnSelchangeCombo2()
{
//
TODO: Add your control notification handler code here
CComboBox * combo2 = (CComboBox*)
GetDlgItem(IDC_COMBO2);
i_Tipo= combo2->GetCurSel();
}
y por último escribimos la función asociada al botón que ejecutará el cálculo:
void CCALCULONUMEROPIView::OnButton1()
{
CProgressCtrl*
prog = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
UpdateData(true);
maximocontador = atof(m_maximocontador);
prog->SetRange(0,100);
UpdateData(false);
double tiempototal=0;
m_pi.Format("Comienza el calculo
del numero Pi");
m_texto.Format("Comienza
a contar el reloj, espere un momento");
UpdateData(false);
time_t
comenzar, finalizar;
time(&comenzar);
//BUCLE QUE CALCULA EL NUMERO PI,
GENERA LA SERIE 1 - 1/3 + 1/5 - 1/7 + 1/9 ...
double i;
switch(i_Tipo)
{
case 0:
pi=0;
for (i=0;i<maximocontador;i++)
{
porciento=i/maximocontador*100;
prog->SetPos(porciento);
m_porciento.Format("%1.1f ",porciento);
pi=pi +
1/pow(16,i)*(4/(8*i+1)- 2/(8*i+4) - 1/(8*i+5) - 1/(8*i+6));
UpdateData(false);
}
break;
case 1:
pi=0;
for (i=0;i<maximocontador;i++)
{
porciento=i/maximocontador*100;
prog->SetPos(porciento);
m_porciento.Format("%1.1f ",porciento);
pi=pi + pow(-1,i)*1/(2*i + 1);
UpdateData(false);
}
pi=4*pi;
break;
case 2:
pi=1;
for (i=1;i<maximocontador;i++)
{
porciento=i/maximocontador*100;
prog->SetPos(porciento);
m_porciento.Format("%1.1f ",porciento);
pi=4*pi * pow(i,2)/(4*pow(i,2) - 1);
UpdateData(false);
}
pi=2*pi;
break;
}
time(&finalizar);
tiempototal=difftime(finalizar,comenzar);
m_pi.Format("%3.20f",pi);
m_texto.Format("El tiempo
tardado es %f segundos",tiempototal);
UpdateData(false);
}