#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* next;
double opd[1000];
int opt;
double *popd = opd;
#define PUSH(n) { *popd++ = n; }
#define POP() (*--popd)
#define TOP() (*(popd-1))
#define EMPTY() (popd == opd)
#define SIZE() (popd - opd)
void fail(char* s)
{
printf("输入有误");
exit(0);
}
#define lbr() { if(*next++ == '(') ; else fail("("); }
#define rbr() { if(*next++ == ')') ; else fail(")"); }
void term();
void lv1();
void lv2();
void cal(char);
void expr()
{
term();
lv1();
}
void term()
{
double num = 0;
if(isdigit(*next))
{
do {
num = num * 10 + (*next - '0');
} while(isdigit(*++next));
PUSH(num);
}
else if(*next == '(')
{
lbr();
expr();
rbr();
}
else
{
fail("term");
}
}
void lv1()
{
char c;
while(1)
{
c = *next;
if(c == '+' || c == '-')
{
++next;
lv2(); ++opt; cal(c);
}
else if(*next == '*' || *next == '/')
{
lv2();
}
else
{
break;
}
}
}
void lv2()
{
char c;
while(1)
{
c = *next;
if(c == '*' || c == '/')
{
++next;
term();
++opt; cal(c);
}
else if(isdigit(*next))
{
term();
}
else
{
break;
}
}
}
double eval(char* s)
{
next = s;
expr();
return TOP();
}
void cal(char c)
{
double lhs, rhs, r;
if(SIZE() > 1) {
rhs = POP();
lhs = POP();
switch(c)
{
case '+': r = lhs + rhs; break;
case '-': r = lhs - rhs; break;
case '*': r = lhs * rhs; break;
case '/': r = lhs / rhs; break;
}
PUSH(r);
--opt;
}
}
int main()
{
char a[100];
printf("请输入表达式:");
gets(a);
printf("=%g\n", eval(a));
system("pause");
return 0;
}
c语言计算器(四则运算包括括号)
猜你喜欢
转载自blog.csdn.net/weixin_44417475/article/details/100062066
今日推荐
周排行