计算器进制转换模块(运行效果图参见计算器项目综述)

开发文档截图


该模块实现了2进制到36进制之间的任意转换,可能有人会问为什么是2到32进制之间呢?这个36是怎么来的呢?

这个是因为超出36后字母表示就不那么方便了,0-9加上a-z就是36个啦       当然要表示办法总是有的,比如用大写的英文字母A-Z,但是常用的进制转换(2,8,10,16)也都没有超出36不是?

核心代码如下:

// MyDlg_2.cpp : implementation file
//

#include "stdafx.h"
#include "简化调试.h"
#include "math.h"
#include "string.h"
#include "stack"
#include "简化调试Dlg.h"
#include "MyDlg_1.h"
#include "MyDlg_2.h"
#include "MyDlg_3.h"
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

stack <int> base_change;
/
// CMyDlg_2 dialog


CMyDlg_2::CMyDlg_2(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg_2::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg_2)
	m_str1 = _T("");
	m_str2 = _T("");
	m_base1 = 0;
	m_base2 = 0;
	//}}AFX_DATA_INIT
}


void CMyDlg_2::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg_2)
	DDX_Text(pDX, IDC_EDIT1, m_str1);
	DDX_Text(pDX, IDC_EDIT4, m_str2);
	DDX_Text(pDX, IDC_EDIT2, m_base1);
	DDX_Text(pDX, IDC_EDIT3, m_base2);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyDlg_2, CDialog)
	//{{AFX_MSG_MAP(CMyDlg_2)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_COMMAND(ID_MENUITEM2, OnMenuitem2)
	ON_COMMAND(ID_MENUITEM0, OnMenuitem0)
	ON_COMMAND(ID_MENUITEM1, OnMenuitem1)
	ON_COMMAND(ID_MENUITEM3, OnMenuitem3)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CMyDlg_2 message handlers

void CMyDlg_2::OnButton1() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	m_str2 = "";
	char dig2_str1[50];
	strncpy(dig2_str1,m_str1,sizeof(dig2_str1));
	int sum_base = 0,p = 0;
    if(m_base1>10)
    {
        for(int i=0;i<strlen(dig2_str1);i++)
        {
            if(dig2_str1[i] >= 'a')
                sum_base += (dig2_str1[i]- 'a' + 10) * pow(m_base1,(strlen(dig2_str1)-i-1));
            else
                sum_base += (dig2_str1[i]-'0') * pow(m_base1,(strlen(dig2_str1)-i-1));
        }
        while(sum_base>0)
        {
            base_change.push(sum_base%m_base2);
            sum_base = sum_base / m_base2;
        }
        if(m_base2>10)
        {
            while(!base_change.empty())
            {
                if(base_change.top() >= 10)
                    m_str2 += (base_change.top() -10 + 'a');
                else
                    m_str2 += (base_change.top() + '0');
                base_change.pop();
            }
        }
        else
        {
            while(!base_change.empty())
            {
                m_str2 += (base_change.top() + '0');
                base_change.pop();
            }
        }
		
    }
    else
    {
        for(int i=0;i<strlen(dig2_str1);i++)
        {
            sum_base += (dig2_str1[i]-'0') * pow(m_base1,(strlen(dig2_str1)-i-1));
        }
        while(sum_base>0)
        {
            base_change.push(sum_base%m_base2);
            sum_base = sum_base / m_base2;
        }
        if(m_base2>10)
        {
            while(!base_change.empty())
            {
                if(base_change.top() >= 10)
                    m_str2 += (base_change.top() -10 + 'a');
                else
                    m_str2 += (base_change.top() + '0');
                base_change.pop();
            }
        }
        else
        {
            while(!base_change.empty())
            {
                m_str2 += (base_change.top() + '0');
                base_change.pop();
            }
        }
    }
	UpdateData(FALSE);
}

void CMyDlg_2::OnMenuitem2() 
{
	// TODO: Add your command handler code here
	MessageBox("您已处于进制转换模式!");
}

void CMyDlg_2::OnMenuitem0() 
{
	// TODO: Add your command handler code here
	CMyDlg_2::OnCancel();
	CMyDlg dlg;
	dlg.DoModal();
}

void CMyDlg_2::OnMenuitem1() 
{
	// TODO: Add your command handler code here
	CMyDlg_2::OnCancel();
	CMyDlg_1 dlg;
	dlg.DoModal();
}

void CMyDlg_2::OnMenuitem3() 
{
	// TODO: Add your command handler code here
	CMyDlg_2::OnCancel();
	CMyDlg_3 dlg;
	dlg.DoModal();
}


更多推荐

MFC计算器项目——进制转换模块