c语言计算器(四则运算包括括号)

#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;
}
发布了12 篇原创文章 · 获赞 12 · 访问量 466

猜你喜欢

转载自blog.csdn.net/weixin_44417475/article/details/100062066