#include<stdio.h>
char token; /*全局变量*/
char token; /*全局变量*/
int main()
{
int low();
int result;
printf("*******************************************/n");
printf("** Welcome to use this simple calculator **/n");
printf("** Please input a multinomial like **/n");
printf("** 16-{2*[3*(5-1)/2+14]+9}/7 **/n");
printf("*******************************************/n");
token=getchar(); /*载入第一个符号*/
result=low(); /*进行计算*/
if(token=='/n')printf("The answer is:%d/n",result);
else
{
printf("Unexpected char!");
exit(1);
}
scanf("%d",result);
return 0;
}
{
int low();
int result;
printf("*******************************************/n");
printf("** Welcome to use this simple calculator **/n");
printf("** Please input a multinomial like **/n");
printf("** 16-{2*[3*(5-1)/2+14]+9}/7 **/n");
printf("*******************************************/n");
token=getchar(); /*载入第一个符号*/
result=low(); /*进行计算*/
if(token=='/n')printf("The answer is:%d/n",result);
else
{
printf("Unexpected char!");
exit(1);
}
scanf("%d",result);
return 0;
}
/*对当前的标志进行匹配*/
void match(char expectedToken)
{
if(token==expectedToken)token=getchar();/*匹配成功,获取下一个标志*/
else
{
printf("cannot match/n");
exit(1);/*匹配不成功,退出程序*/
}
}
void match(char expectedToken)
{
if(token==expectedToken)token=getchar();/*匹配成功,获取下一个标志*/
else
{
printf("cannot match/n");
exit(1);/*匹配不成功,退出程序*/
}
}
/*用于计算表达式中的+、-运算*/
int low()
{
int result=mid();
while(token=='+'||token=='-')
if(token=='+')
{
match('+');
result+=mid();
int low()
{
int result=mid();
while(token=='+'||token=='-')
if(token=='+')
{
match('+');
result+=mid();
}
else if(token=='-')
{
match('-');
result-=mid();
else if(token=='-')
{
match('-');
result-=mid();
}
return result;
}
return result;
}
/*用于计算表达式中的*、/运算*/
int mid()
{
int div;
int result=high();
while(token=='*'||token=='/')
if(token=='*')
{
match('*');
result*=high();
int mid()
{
int div;
int result=high();
while(token=='*'||token=='/')
if(token=='*')
{
match('*');
result*=high();
}
else if(token=='/')
{
match('/');
div=high();
if(div==0) /*需要判断除数是否为0*/
{
printf("cannot is 0");
exit(1);
}
result/=div;
else if(token=='/')
{
match('/');
div=high();
if(div==0) /*需要判断除数是否为0*/
{
printf("cannot is 0");
exit(1);
}
result/=div;
}
return result;
}
return result;
}
/*用于计算表达式中带{}的运算*/
int high()
{
int result=high2();
if(token=='{')
{
match('{');
result=low(); /*递归计算表达式*/
match('}');
}
return result;
}
int high()
{
int result=high2();
if(token=='{')
{
match('{');
result=low(); /*递归计算表达式*/
match('}');
}
return result;
}
/*用于计算表达式中带[]的运算*/
int high2()
{
int result=high3();
if(token=='[')
{
match('[');
result=low(); /*递归计算表达式*/
match(']');
}
return result;
}
int high2()
{
int result=high3();
if(token=='[')
{
match('[');
result=low(); /*递归计算表达式*/
match(']');
}
return result;
}
/*用于计算表达式中带()的运算*/
int high3()
{
int result=mathinput();
if(token=='(')
{
match('(');
result=low(); /*递归计算表达式*/
match(')');
}
return result;
}
int high3()
{
int result=mathinput();
if(token=='(')
{
match('(');
result=low(); /*递归计算表达式*/
match(')');
}
return result;
}
/*获取计算数值*/
int mathinput()
{
int result=0;
if(token>='0'&&token<='9')
{
ungetc(token,stdin); /*将读入的字符退还给输入流,为读取整个数*/
scanf("%d",&result); /*读出数字*/
token=getchar(); /*读出当前的计算标志*/
}
return result;
}
int mathinput()
{
int result=0;
if(token>='0'&&token<='9')
{
ungetc(token,stdin); /*将读入的字符退还给输入流,为读取整个数*/
scanf("%d",&result); /*读出数字*/
token=getchar(); /*读出当前的计算标志*/
}
return result;
}