📄 transdlg.cpp
字号:
// TRANSDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TRANS.h"
#include "TRANSDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CTRANSDlg dialog
CTRANSDlg::CTRANSDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTRANSDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTRANSDlg)
m_BehindStr = _T("");
m_Result = 0;
m_MiddleStr = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTRANSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTRANSDlg)
DDX_Text(pDX, IDC_EDIT2, m_BehindStr);
DDX_Text(pDX, IDC_EDIT3, m_Result);
DDX_Text(pDX, IDC_EDIT1, m_MiddleStr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTRANSDlg, CDialog)
//{{AFX_MSG_MAP(CTRANSDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(ID_flash, Onflash)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTRANSDlg message handlers
BOOL CTRANSDlg::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
return TRUE; // return TRUE unless you set the focus to a control
}
void CTRANSDlg::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 CTRANSDlg::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 CTRANSDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTRANSDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
linkstack.InitStack(linkstack.StrStack);//初始化
linkstack.InitStack(Linkstack.StrStack);//初始化
if(IsError())
{
WordAnalyze();
LangAnalyze();
if(IsOper())
Operate();
}
else
{
MessageBox("语法错误!");
Onflash();
}
UpdateData(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
void CTRANSDlg::WordAnalyze()
{
char str[10]={0},Str[2]={0},STR[10]={0};//str记录操作数 Str记录操作符
char oper;
int j=0,k;
int len=m_MiddleStr.GetLength();
STACK Reverse;//栈,便于字符串变量输出
Reverse.InitStack(Reverse.StrStack);
char reverse[1]={0};
if(m_MiddleStr=="")//当输入为空时
{
MessageBox("语法错误!");
Onflash();
}
else
if(Switch(m_MiddleStr.GetAt(0))!=-1&&Switch(m_MiddleStr.GetAt(0))!=4)
{
MessageBox("语法错误!");
Onflash();
}
else{
for(int i=len-1;i>=0;i--)
{
oper=m_MiddleStr.GetAt(i);
int flag=Switch(oper);
if(flag==-1)//当为操作数时
{
reverse[0]=oper;
Reverse.Push(Reverse.StrStack,reverse);
}
else
if(flag==-2||flag==4)//处理括号
{
k=0;
while(Reverse.StrStack->next!=NULL)
{
Reverse.Pop(Reverse.StrStack,reverse);
str[k++]=reverse[0];
}
str[k]=' ';
if(str[0]!=' '&&str[0]!=0)
linkstack.Push(linkstack.StrStack,str);//压栈
for(int i=0;i<10;i++)
if(str[i]!=0)
str[i]=0;
j=0;
Str[0]=oper;
linkstack.Push(linkstack.StrStack,Str);
}
else //当为操作符时
{ k=0;
while(Reverse.StrStack->next!=NULL)
{
Reverse.Pop(Reverse.StrStack,reverse);
str[k++]=reverse[0];
}
str[k]=' ';
if(str[0]!=' '&&str[0]!=0)
linkstack.Push(linkstack.StrStack,str);//压栈
for(int i=0;i<10;i++)//清空str
if(str[i]!=0)
str[i]=0;
j=0;
Str[0]=oper;
linkstack.Push(linkstack.StrStack,Str);//操作符压栈
}
}
k=0;
while(Reverse.StrStack->next!=NULL)//处理剩余字符
{
Reverse.Pop(Reverse.StrStack,reverse);
str[k++]=reverse[0];
}
str[k]=' ';
linkstack.Push(linkstack.StrStack,str);
}
}
/////////////////////////////////////////////////////////////////////////////
int CTRANSDlg::Switch(char oper) //判断优先级
{
switch(oper)
{
//case '#' :return -2;
case '-' :return 0;
case '+' :return 0;
case '*' :return 1;
case '/' :return 1;
case '^' :return 2;
case ')' :return -2;
case '(' :return 4;
default :return -1;
}
}
/////////////////////////////////////////////////////////////////////////////
void CTRANSDlg::LangAnalyze()
{
int flag1,flag2;//记录优先级
STACK Opnd; //操作符栈
Opnd.InitStack(Opnd.StrStack);
char str[10]={0},AllStr[100]={0},Str[1]={0};//str记录操作数 Str记录操作符
char opnd[10]={0};
opnd[0]='#';
Opnd.Push(Opnd.StrStack,opnd);//输入#到栈底
while(linkstack.StrStack->next!=NULL)
{
linkstack.Pop(linkstack.StrStack,str);
if(Switch(str[0])==4)//处理左括号
{
Opnd.Push(Opnd.StrStack,str);
}
else
if( Switch(str[0])==-2)//处理右括号
{
flag1=Switch(str[0]);
Opnd.GetTop(Opnd.StrStack,Str);
flag2=Switch(Str[0]);
while(flag2!=4)//出栈直至左括号
{
Opnd.Pop(Opnd.StrStack,Str);
strcat(AllStr,Str);
Opnd.GetTop(Opnd.StrStack,Str);
flag2=Switch(Str[0]);
}
Opnd.Pop(Opnd.StrStack,Str);
}
else
if(Switch(str[0])==-1)//字符直接输出
{
strcat(AllStr,str);
}
else
{
flag1=Switch(str[0]);
Opnd.GetTop(Opnd.StrStack,Str);
flag2=Switch(Str[0]);
if(flag1>flag2||flag2==4||flag1==2&&flag2==2)//优先级别高的入栈
Opnd.Push(Opnd.StrStack,str);
else
{
while(flag1<=flag2&&flag2!=4)
{
Opnd.Pop(Opnd.StrStack,Str);//优先级别小于等于栈顶,将栈顶输出
strcat(AllStr,Str);
Opnd.GetTop(Opnd.StrStack,Str);
flag2=Switch(Str[0]);
}
Opnd.Push(Opnd.StrStack,str);//优先级别小的入栈
}
}
}
Opnd.Pop(Opnd.StrStack,Str);
while(Str[0]!='#')//将操作符输出
{
strcat(AllStr,Str);
Opnd.Pop(Opnd.StrStack,Str);
}
m_BehindStr.Insert(0,AllStr);//输出结果
}
/////////////////////////////////////////////////////////////////////////////
void CTRANSDlg::Operate()
{
STACK Oper;
Oper.InitStack(Oper.StrStack);
int Len=m_BehindStr.GetLength();
int flag=0,result=0;
char str[10]={0},Str[10];
char sstr[10]={0};
int j=0,f;char x;
for(int i=0;i<Len;i++)
{ f=0;
x=m_BehindStr.GetAt(i);
flag=OperSwitch(x);
if(x!=' '&&flag==-1)
{
f=1;
sstr[j++]=m_BehindStr.GetAt(i);
}
else
{
j=0;
if(sstr[0]!=' '&&f==0&&flag==-1)
{
Oper.Push(Oper.StrStack,sstr);
for(int i=0;i<10;i++)//清空sstr
if(sstr[i]!=0)
sstr[i]=0;
}
flag=OperSwitch(x);
switch(flag)
{
case -1:break;
case 0:
{
Oper.Pop(Oper.StrStack,str);
Oper.Pop(Oper.StrStack,Str);
result=atoi(Str)-atoi(str);//减法
for(int i=0;i<10;i++)//清空str
if(str[i]!='0')
str[i]=0;
itoa(result,str,10);
Oper.Push(Oper.StrStack,str);
break;
}
case 1:
{
Oper.Pop(Oper.StrStack,str);
Oper.Pop(Oper.StrStack,Str);
result=atoi(str)+atoi(Str);//加法
for(int i=0;i<10;i++)//清空str
if(str[i]!='0')
str[i]=0;
itoa(result,str,10);
Oper.Push(Oper.StrStack,str);
break;
}
case 2:
{
Oper.Pop(Oper.StrStack,str);
Oper.Pop(Oper.StrStack,Str);
result=atoi(str)*atoi(Str);//乘法
for(int i=0;i<10;i++)//清空str
if(str[i]!='0')
str[i]=0;
itoa(result,str,10);
Oper.Push(Oper.StrStack,str);
break;
}
case 3:
{
Oper.Pop(Oper.StrStack,str);
Oper.Pop(Oper.StrStack,Str);
result=atoi(Str)/atoi(str);//除法
for(int i=0;i<10;i++)//清空str
if(str[i]!='0')
str[i]=0;
itoa(result,str,10);
Oper.Push(Oper.StrStack,str);
break;
}
case 4:
{
Oper.Pop(Oper.StrStack,str);
Oper.Pop(Oper.StrStack,Str);
result=(int)pow(atoi(Str),atoi(str));//乘方
for(int i=0;i<10;i++)//清空str
if(str[i]!='0')
str[i]=0;
itoa(result,str,10);
Oper.Push(Oper.StrStack,str);
break;
}
}
}
}
m_Result=result;
}
/////////////////////////////////////////////////////////////////////////////
int CTRANSDlg::OperSwitch(char x)
{
switch(x)
{
case '-' :return 0;
case '+' :return 1;
case '*' :return 2;
case '/' :return 3;
case '^' :return 4;
default :return -1;
}
}
/////////////////////////////////////////////////////////////////////////////
void CTRANSDlg::Onflash() //刷新函数
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_MiddleStr="";
m_BehindStr="";
m_Result=0;
UpdateData(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
int CTRANSDlg::IsError()
{
int flag1=0,flag2=0,p=0,t=0;
int left[5],right[5];
int Len=m_MiddleStr.GetLength();
for(int i=0;i<Len;i++)
{
int oper=m_MiddleStr.GetAt(i);
if(oper=='(') left[p++]=1;
else
if(oper==')') right[t++]=1;
}
flag1=0;flag2=0;
for(i=0;i<5;i++)
{
if(left[i]==1)
flag1++;
if(right[i]==1)
flag2++;
}
if(flag1!=flag2)
return 0;
else
return 1;
}
/////////////////////////////////////////////////////////////////////////////
int CTRANSDlg::IsOper()
{
int flag=0;
int Len=m_MiddleStr.GetLength();
for(int i=0;i<Len;i++)
{
int oper=m_MiddleStr.GetAt(i);
if(oper>='a'&&oper<='z'||oper>='A'&&oper<='Z')
flag=1;
}
if(flag==0)
return 1;
else
return 0;
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -