逆波兰式实现四则运算表达式计算器支持括号、十六进制 (五)

2014-11-23 23:40:11 · 作者: · 浏览: 26

int i = 0;
while (fresultStr[i]!='.')
{
i++;
}

if (fresultStr[i+1] == '0')
{
return true;
}
else
{
return false;
}
}
}

void tenToSixteen(char* sixteen,int n)
{
int shang = 0;
int yushu = 0;
int value = 1;
int i = 0;
while(value <= n)
{
value = value*16;
yushu = n % value;
shang = yushu * 16 /value;

if (shang >=0 && shang <=9)
{
sixteen[i] = (char)(shang+48);
}
else
{
sixteen[i] =(char)(shang+87);
}
i++;
}
char str[g_iconstArrayMax] = "0x";
strrev(sixteen);
strcat(str,sixteen);
strcpy(sixteen,str);
}

//判断结果是不是int型
bool isInte(float fresult)
{
char fresultStr[g_iconstArrayMax];

sprintf(fresultStr,"%f",fresult);

if (NULL == fresultStr)
{
return false;
}
else
{
int len = strlen(fresultStr);
int i = 0;
while (fresultStr[i]!='.')
{
i++;
}

if (fresultStr[i+1] == '0')
{
return true;
}
else
{
return false;
}
}
}另外关于输入是否合法的检查,两个函数实现一个进行具体的判断,另一个判断括号是否匹配,同样利用栈操作实现:

[cpp]
bool IsMatch(char* str)
{
//初始化栈
stack s;
//initStack(s);

int len = strlen(str);

char pp[g_iconstArrayMax];
char temp;
int k = 0;

for (int i= 0; i {
switch(str[i])
{
case '(':
s.push(str[i]);
break;
case')':
{
temp = s.pop();
if (temp!='(')
{
return 0;
}
else
{
pp[k] = temp;
k++;
}
break;
}
default:
break;
}
}
pp[k] = '\0';

// 判断栈是否为空
if (s.isEmpty())
{
return true;
}
else
{
return false;
}
}
//检测是否合法
bool isRightInput(char* str)
{
//是否输入字符非法
if (NULL == str)
{
return false;
}
else
{
int len = strlen(str);

for (int i = 0; i {
if (str[i]< '0')
{
if ((str[i] != '+')&&(str[i] != '-')&&(str[i] != '*')
&&(str[i] != '/')&&(str[i] != '.')&&(str[i] != '(')
&&(str[i] != ')'))
{
printf("输入非法字符!\n");
return false;
}
}
else if ( str[i]> '9')
{
if ((str[i] < 'a'))
{
printf("输入非法字符!\n");
return false;
}
else if ((str[i] > 'f')&&(str[i] != 'x'))
{
printf("输入非法字符!\n");
return false;
}
else if(str[i] == 'x')
{
if (str[i-1] != '0')
{
printf("输入十六进制非法,请以0x开头!\n");
return false;
}
}
else
{
if (str[i-1]!='x')
{
printf("输入非法字符!\n");
return false;
}
}
}
}
//检测括号匹配
if (!IsMatch(str))
{