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;
}

 

  • 14
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值