/*
***
**将CString 转化为 char *
*/
char * GetAnsiString( const CString &str)
{
int nSize = 2*str.GetLength();
char *pAnsiString = new char[nSize + 1];
wcstombs(pAnsiString, str, nSize+1);
return pAnsiString;
}
/*
**wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char。**char* strDes 为保存转换后的普通字符串,wchar* 要被转换的宽字符串。转换的最大长度。这里的长度是转换的个数,而不是字节长度。
**mbstowcs() 就是一个相反的过程了
*/
/*
**mbstowcs(..);
*/
/*
**复杂运算的计算器
void CCalculatorDlg::OnBnClickedEq()
{
// TODO: 在此添加控件通知处理程序代码
char str[100];
char * q;
q = GetAnsiString(m_display);
memcpy(str, q, strlen(q)+1);
free(q);
str[strlen(str)+1] = '\0';
str[strlen(str)] = '#';
stack<double> num;
stack<char>sign;
int global=0;
char c,theta;
double a,b;
bool innum=false;
UpdateData(TRUE);
sign.push('#');
c = str[global++];
CString snum;
while(c!='#' || sign.top()!='#')
{
if(is_num(c))//是否为数字或者小数点
{
if(innum == false)
{
innum = true;
snum = "";//置空
}
//每次叠加 直到入栈
snum.AppendFormat(_T("%c"),c);
}
else
{
if(innum == true)
{
innum = false;
//进数栈
double temp;
char * p = GetAnsiString(snum);
temp = atof(p);
free(p);
num.push(temp);
}
switch(Precede(sign.top(),c))
{
case'<':
sign.push(c);//c=str[global++];
break;//操作数栈栈顶元素优先级低
case'=':
sign.pop();//c=str[global++];
break;//脱挂号并接受下一字符
case'>':
theta=sign.top();sign.pop();
b=num.top();num.pop();a=num.top();num.pop();
num.push(Operate(a,theta,b));
break;//退栈并将运算结果入数栈
default:
break;
}
}
c = c!='#'? str[global++] : c;
}
m_display.Format(_T("%f"),num.top());
num.pop();
UpdateData(FALSE);
}
char CCalculatorDlg::Precede(char a, char b)
{
int p=0,q=0;
char m[8]="+-*/()#";
char n[8][8]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<= ",">>>> >>","<<<< ="};
while(m[p]!=a)p++;
while(m[q]!=b)q++;
return(n[p][q]);
}