mfc计算简单算术表达式

这篇博客探讨了如何在MFC环境下解析并计算包含十六进制数值的复杂算术表达式,提供了相应的代码示例,展示了如何处理括号、运算符优先级和混合整数类型的问题。
摘要由CSDN通过智能技术生成

/*

例如:

CString a="((((1+2+3+4+0X5E+6*7*9*2+0x4b)*2+5+6+7*2*3*4+90+7*8+9*10*11*0x12)))";

如何计算该值?


代码如下:

*/

bool CF(int a,int b,UINT &c);
bool JudgeHex_String(CString b);
int GetUIntFromHexString(CString s,UINT &ui);
UINT StringToUint(CString a);
CString ReplaceHexString(CString sk);
int CalcSub(CString sSub);
int CalcSubKuoHao(CString sSub);
CString ReplaceCString(CString a,int ns,int nl,CString b);
bool IsChengChu(char a);
bool IsJiaJian(char a);
bool IsShuZi(char a);
bool IsHex(char a);
CString AddKuoHaoChengChu(CString sk);
CString AddKuoHaoJiaJian(CString sk);
int Calc2(CString sk);




//求a的b次方,结果保存在c里面
bool CF(int a,int b,UINT &c)
{
c=1;
//非0整数的0次方等于1
if (0==b&&0!=a)
{
c=1;
}
//非0整数的1次方等于自身1
else if (1==b)
{
c=a;
}
else if (2<=b)
{
for (int i=1;i<=b;i++)
{
c=c*a;
}

}
else
{
return -1;
}
return 1;
}
//判断字符串b是否为16进制的字符串(不含开头的0x)
bool JudgeHex_String(CString b)
{
if(b.IsEmpty())return 0;
int nLen=b.GetLength();
int i=0;
while(i<nLen)
{
if (0==IsHex(b.GetAt(i)))
{
return 0;
}
i++;
};
return 1;
}
//16进制字符串转换成10进制数字
int GetUIntFromHexString(CString s,UINT &ui)
{
s.TrimLeft();
s.TrimRight();
ui=0;
if (s.IsEmpty())
{
return -1;
}
if (1!=JudgeHex_String(s))
{
return -2;
}
int nLen=s.GetLength();
UCHAR c1,c2;
unsigned int ul;
for (int i=0;i<nLen;i++)
{
c1=s.GetAt(i);
//c2是第i位(从左向右数)字符对应的10进制数字,例如:f对应10进制的15
if ('0'<=c1&&c1<='9')
{
c2=c1-'0';
}
else if ('a'<=c1&&c1<='f')
{
c2=c1-'a'+0xa;
}
else if ('A'<=c1&&c1<='F')
{
c2=c1-'A'+0xA;
}
else
{
return -3;
}
//16进制字符串"1e2bc4" 1*power(16,5)+14*power(16,4)+2*power(16,3)+11*power(16,2)+12*power(16,1)+4*power(16,0)
CF(16,(nLen-1-i),ul);
ui+=c2*(ul);
}
return 1;

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值