编译原理:实现高级表达式计算器(初级)
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//处理空格
void delspace(char *str)
{
char *p1 = str;
char *p2 = str;
while ((*p1 = *(p2++)) != '\0')
{
if (*p1 != ' ')
{
p1++;
}
}
}
int isnum(char ch)//判断是否数字
{
int is = 0;
if (ch >= '0' && ch <= '9')
{
is = 1;
}
return is;
}
//获取括号内的字符串
char *mKH(char *str, int *pindex)//配对括号 取出括号内的内容
{
char *pstr = NULL;
int num = 0;//记录多少括号的对数
int leftindex = *pindex;
do
{
switch (* (str+ (*pindex) ))
{
case '(':
num++;
break;
case ')':
if (0==num)
{
(*pindex)++;
pstr = malloc(sizeof(char)*(*pindex - leftindex));//分配内存大小
strncpy_s(pstr, *pindex - leftindex, str + leftindex, *pindex - leftindex - 1);
return pstr;
}
else
{
num--;//处理右括号
}
break;
}
} while (*( str+(*pindex)++ ) !='\0' );
}
double getnum(char *str, int *pindex)
{
double value = 0.0;
int index = *pindex;
while (*(str+index)=='(')
{
char *psubstr = NULL;
*pindex = ++index;
psubstr = mKH(str, pindex);
double getValue(char *str);
value = getValue(psubstr);
free(psubstr);//释放内存
psubstr == NULL;
return value;
}
while (isnum(*(str + index)))//str[index]
{
value = value * 10 + (str[index] - '0');//字符转整数
index++;//往前移动
}
if (*(str + index) == '.')
{
double xiaoshu = 1.0;
while (isnum(*(str + ++index)))//循环到小数点后面的非数字
{
xiaoshu /= 10;//小数
value += xiaoshu*(*(str + index) - '0');
}
}
*pindex = index;
return value;
}
double getFirtNum(char *str, int *pindex)
{
double value = 0.0;
value = getnum(str, pindex);//获取一个数据
while (1)
{
if (*(str + (*pindex)) == '*')
{
(*pindex)++;
value *= getnum(str, pindex);//计算乘法
}
else if (*(str + (*pindex)) == '/')
{
(*pindex)++;
value /= getnum(str, pindex);//计算乘法
}
else
{
break;
}
}
return value;
}
double getValue(char *str)
{
double value = 0.0;
int index = 0;
value = getFirtNum(str, &index);//获取第一个数据
while (1)
{
char ch = *(str + index);//取出字符
index++;//循环遍历
switch (ch)
{
case '\0':
return value;
case '+':
value += getFirtNum(str, &index);
break;
case '-':
value -= getFirtNum(str, &index);
break;
default:
break;
}
}
}
void main()
{
printf("请输入要计算的表达式:");
char str[1024] = { 0 };
scanf("%[^\n]", str);
delspace(str);
printf("\n计算表达式值 = %f\n", getValue(str));
system("pause");
}测试结果:
版权声明:本文为博主原创文章,欢迎指出代码不良之处,及提出代码优化方案。欢迎指点,黑夜代码,拼命奋斗,努力更新中......