分类:
项目实践(3)
计算器进制转换模块(运行效果图参见计算器项目综述)
开发文档截图
该模块实现了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();
- }