📄 kechengsheji.txt
字号:
// NumToNumDlg.cpp : implementation file
//
#include "stdafx.h"
#include "NumToNum.h"
#include "NumToNumDlg.h"
#include "aDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_MY_MESSAGE (WM_USER+100)
#define A 10
#define B 11
#define C 12
#define D 13
#define E 14
#define F 15
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNumToNumDlg dialog
CNumToNumDlg::CNumToNumDlg(CWnd* pParent )
: CDialog(CNumToNumDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNumToNumDlg)
m_c1 = _T("");
m_c2 = _T("");
m_e2 = _T("");
m_e1 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CNumToNumDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNumToNumDlg)
DDX_CBString(pDX, IDC_COMBO1, m_c1);
DDX_CBString(pDX, IDC_COMBO2, m_c2);
DDX_Text(pDX, IDC_EDIT1, m_e2);
DDX_Text(pDX, IDC_EDIT2, m_e1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNumToNumDlg, CDialog)
//{{AFX_MSG_MAP(CNumToNumDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNumToNumDlg message handlers
BOOL CNumToNumDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO1);
m_c1="10";
m_c2="10";
Num=0;
JZ1=0;
JZ2=0;
me1("使用说明:\r\n1.选择好待转换数的进制与要转换数的进制");
me1("\r\n2.输入要转换的数值");
me1("\r\n3.选择你想使用的算法");
me1("\r\n4.去吧,得到你期待已久的数字");
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
}
void CNumToNumDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CNumToNumDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CNumToNumDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
int exp(int a,int b)
{int k=1;
for(int i=0;i<a;i++)
{k=k*b;}
return k;
}
char* abc(int a)
{switch(a)
{
case 0: return "0";
case 1: return "1";
case 2: return "2";
case 3: return "3";
case 4: return "4";
case 5: return "5";
case 6: return "6";
case 7: return "7";
case 8: return "8";
case 9: return "9";
case 10: return "A";
case 11: return "B";
case 12: return "C";
case 13: return "D";
case 14: return "E";
case 15: return "F";
default :return "X";}
}
void CNumToNumDlg::OnOK()
{
if(! GetNum())
{return;}
if(IsDlgButtonChecked(IDC_RADIO2))
Shuxue();
else if(IsDlgButtonChecked(IDC_RADIO1))
Qiongjia();
else if(IsDlgButtonChecked(IDC_RADIO3))
ShuangGui();
else
AfxMessageBox("Error 1");
}
void Start(CNumToNumDlg *p);
CString sg2(int N,int a);
void CNumToNumDlg::Qiongjia()
{
me1("0");
me1("载入算法->穷加法\n\r");
me1("\n\r");
me1("--------------------------------------------------------------------\r\n");
me1("算法说明:该算法又叫笨方法,源自幼儿园小朋友数手指的习惯,是这个\r\n地球上最原始的算法");
x=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Start,this,0,&y);
}
void Start(CNumToNumDlg *p)
{
p->me1("\r\n线程开辟:\r\n");
p->me1("请伸出你的指头!\r\n");
Sleep(1000);
p->me1("预备!\r\n");
p->me1("3!\r\n");
Sleep(1000);
p->me1("2!\r\n");
Sleep(1000);
p->me1("1!\r\n");
Sleep(1000);
p->me1("开始!\r\n");
int N=p->Num;
for(int i=0;i<=p->Num;i++)
{
Sleep(10);
p->me1(sg2(N,p->JZ1)+"- "+sg2(i,p->JZ2)+"+\r\n");
N--;
}
p->me1("\r\n线程终止:得到结果"+sg2(i-1,p->JZ2)+"\r\n");
p->me1("您算出来了吗?");
}
void CNumToNumDlg::Shuxue()
{
CString a,b,c,d;
me1("0");
me1("载入算法->数学算法\n\r");
me1("\n\r");
me1("--------------------------------------------------------------------\r\n");
me1("算法说明:一群小学生用疑惑的眼光看着你...你当然知道这...\r\n");
a.Format("%d",JZ1);
b.Format("%d",JZ2);
me1(a+"进制 转换为 "+b+"进制\r\n\r\n");
me1(m_e1+"=");
int length=m_e1.GetLength()-1;
for(int i=0;i<m_e1.GetLength();i++)
{ c.Empty();
c.Format("%d",exp(length-i,JZ1));
char str[2]={m_e1[i],'\0'};
me1(str);
me1("*"+c);
if(i<m_e1.GetLength()-1)
me1("+");
}
d.Format("%d",Num);
me1("\r\n获得10进制数值="+d);
me1("\r\n反向求出"+b+"进制数值=\r\n");
int Num2=Num;
i=0;
int j=0;
d.Empty();
while(Num2)
{ c.Format("%d",Num2);
i=Num2%JZ2;
me1(c+"/"+b+"....("+abc(i)+")"+ "\r\n");
Num2=Num2/JZ2;
d.Insert(0,abc(i));
}
me1("得出"+b+"进制结果:"+d);
}
void CNumToNumDlg::ShuangGui()
{CString a,b;
a.Format("%d",Num);
me1("0");
me1("载入算法->双重递归\n\r");
me1("\n\r");
me1("--------------------------------------------------------------------\r\n");
me1("算法说明:理论上任何一个循环结构都可以简化为递归,但是\r\n不是所有的递归都可以用循环代替~^.^\r\n逐级调用自身,带入参数(数值,进制) 返回参数(字符类型结果)");
me1("\r\n该算法实质上是数学算法的递归结构\r\n\r\n");
me1("带入参数("+m_e1+","+m_c1+")\r\n"+"递归开始:求得10进制结果"+a+"\r\n");
me1("带入参数("+a+","+m_c2+")\r\n"+"递归开始:\r\n");
me1("求得结果:\r\n");
me1(sg1(Num,JZ2));
}
BOOL CNumToNumDlg::GetNum()
{ UpdateData(true);
Num=0;
JZ1=0;
JZ2=0;
int t=0;
if(m_c1==""||m_c2=="")
{AfxMessageBox(_T("请选择要转换的进制!"));
return false;}
if(m_e1=="")
{AfxMessageBox(_T("请输入要转换的数!"));
return false;}
JZ1=atoi(m_c1);
JZ2=atoi(m_c2);
if(JZ1>16||JZ1<2||JZ2>16||JZ2<2)
{ AfxMessageBox(_T("进制超标!"));
return false;
}
int length=m_e1.GetLength()-1;
for(int i=0;i<m_e1.GetLength();i++)
{
if(m_e1[i]>'F'||(m_e1[i]<'A'&&m_e1[i]>'9')||m_e1[i]<'0'){
AfxMessageBox(_T("数值 "+m_e1+" 超标!"));
return false;}
switch(m_e1[i])
{
case '0': if(JZ1<=0) t=1;break;
case '1': if(JZ1<=1) t=1;break;
case '2': if(JZ1<=2) t=1;break;
case '3': if(JZ1<=3) t=1;break;
case '4': if(JZ1<=4) t=1;break;
case '5': if(JZ1<=5) t=1;break;
case '6': if(JZ1<=6) t=1;break;
case '7': if(JZ1<=7) t=1;break;
case '8': if(JZ1<=8) t=1;break;
case '9': if(JZ1<=9) t=1;break;
case 'A': if(JZ1<=A) t=1;break;
case 'B': if(JZ1<=B) t=1;break;
case 'C': if(JZ1<=C) t=1;break;
case 'D': if(JZ1<=D) t=1;break;
case 'E': if(JZ1<=E) t=1;break;
case 'F': if(JZ1<=F) t=1;break;
default:AfxMessageBox(_T("Error 0"));}
if(t==1)
{AfxMessageBox(_T("数值大于进制!"));
return false;}
switch(m_e1[i])
{
case '0': Num+=0*exp(length-i,JZ1);break;
case '1': Num+=1*exp(length-i,JZ1);break;
case '2': Num+=2*exp(length-i,JZ1);break;
case '3': Num+=3*exp(length-i,JZ1);break;
case '4': Num+=4*exp(length-i,JZ1);break;
case '5': Num+=5*exp(length-i,JZ1);break;
case '6': Num+=6*exp(length-i,JZ1);break;
case '7': Num+=7*exp(length-i,JZ1);break;
case '8': Num+=8*exp(length-i,JZ1);break;
case '9': Num+=9*exp(length-i,JZ1);break;
case 'A': Num+=A*exp(length-i,JZ1);break;
case 'B': Num+=B*exp(length-i,JZ1);break;
case 'C': Num+=C*exp(length-i,JZ1);break;
case 'D': Num+=D*exp(length-i,JZ1);break;
case 'E': Num+=E*exp(length-i,JZ1);break;
case 'F': Num+=F*exp(length-i,JZ1);break;
default:AfxMessageBox(_T("Error 0"));}
}
//CString a;
//a.Format("%d",Num);
//AfxMessageBox(a);
return true;
}
void CNumToNumDlg::me1(const char *str)
{
if(str=="0")
m_e2="";
else
m_e2+=str;
SendMessage(WM_MY_MESSAGE);
}
CString CNumToNumDlg::sg1(int N, int a)
{
CString b;
b.Empty();
if(N/a)
{b=abc(N%a);
b.Insert(0,sg1(N/a,a));
me1("获得字符:"+b+"\r\n");
return b;
}
else
{me1("递归还原:");
me1(abc(N%a));
me1("\r\n");
return abc(N%a);
}
}
CString sg2(int N,int a)
{
CString b;
b.Empty();
if(N/a)
{b=abc(N%a);
b.Insert(0,sg2(N/a,a));
return b;
}
else
return abc(N%a);
}
LRESULT CNumToNumDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{UpdateData(false);
return 0;
}
void CNumToNumDlg::OnButton1()
{CaDlg a;
a.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -