中易网

求c++编译一个简单的计算程序(四则运算)。

答案:1  悬赏:10  
解决时间 2021-01-09 07:56
求c++编译一个简单的计算程序(四则运算)。
最佳答案
//正解代码很长很复杂,也许对新人来说太难了。
//此程序可以运算+、-、*、/、乘方(^)、求余数(%),也可以出现( )规定优先级。
//按Ctrl+C退出。
#include
#include
#include
#include

typedef enum BinOpr
{
OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_POW, OP_NON
} BinOpr;

static struct { int left, right; } binop_prio[] =
{
{6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, {10,9},
};

#define UNARY_PRIO 8

static BinOpr get_binop(const char **s)
{
switch (**s)
{
case '+': ++*s; return OP_ADD;
case '-': ++*s; return OP_SUB;
case '*': ++*s; return OP_MUL;
case '/': ++*s; return OP_DIV;
case '%': ++*s; return OP_MOD;
case '^': ++*s; return OP_POW;
default: return OP_NON;
}
}

static double doexpr(int op, double a, double b)
{
switch (op)
{
case OP_ADD: return a+b;
case OP_SUB: return a-b;
case OP_MUL: return a*b;
case OP_DIV: return a/b;
case OP_MOD: return a-floor(a/b)*b;
case OP_POW: return pow(a, b);
default: return 0;
}
}

typedef struct ExprContext
{
jmp_buf jbuf;
const char *errmsg, *s;
BinOpr op;
} Expr;

static double error(Expr *e, const char *msg)
{
e->errmsg = msg;
longjmp(e->jbuf, 1);
}

static double expr(Expr *e, int limit)
{
double n;
BinOpr op;
if (*e->s == '-')
{
++e->s;
n = -expr(e, UNARY_PRIO);
}
else if (*e->s == '(')
{
++e->s;
n = expr(e, 0);
if (*e->s++ != ')') error(e, "')' expected");
}
else {
const char *s = e->s;
n = strtod(s, (char**)&e->s);
if (e->s == s) error(e, "'number' expected");
}
op = get_binop(&e->s);
while (op != OP_NON && binop_prio[op].left > limit)
{
n = doexpr(op, n, expr(e, binop_prio[op].right));
op = e->op;
}
e->op = op;
return n;
}

double calc(const char *s, const char **perr)
{
Expr e;
e.s = s;
e.errmsg = NULL;
if (setjmp(e.jbuf) == 0)
{
double n = expr(&e, 0);
if (*e.s != '\n' && *e.s != '\0' && *e.s != '=')
error(&e, "traling chars detected");
return n;
}
if (perr) *perr = e.errmsg;
return 0;
}

int main(void)
{
char buff[BUFSIZ];
while (printf("> "), fgets(buff, BUFSIZ, stdin) != NULL)
{
const char *errmsg = NULL;
double n = calc(buff, &errmsg);
if (errmsg) printf("ERROR: %s\n", errmsg);
else printf("%g\n", n);
}
return 0;
}
//可以把这个程序留下来,等以后再慢慢研究。正解太复杂太复杂了。
//望采纳
------------------------------------------------------------------------------------
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
mpeg是什么格式
高丝洗面奶怎么看生产日期上面是GB409B?
我与春天天有个约会 400字
铝合金的手机有哪些机型?
黄牌坊村地址在哪,我要去那里办事
赞美孙儿语文比赛脱颖而出的诗词
特奥蒂瓦坎有什么值得去的景点
这是怀孕了吗,我女朋友上个月20号来的姨妈,
凉州八景有哪些
绥化上门点滴电话多少?绥化上门静点?绥化上
雁沟村地址有知道的么?有点事想过去
用胶布粘行李箱能过机场安检吗
中公教育的教学体系是什么样的
任泉宣布息影粉丝不舍 任泉为什么退出演艺圈
朵色彩妆小椰子团队
推荐资讯
LnX 在X右趋近于0时的极限为什么是无穷大
一些奶茶店宣称的不加奶精是真的还是假的?还
空调和电视可以插在一个插座上吗?
求个SFC游戏名称
怎样制作假伤口(详细步骤,)
Have you finished it是什么意思
简短的汉字笑话
这电脑还能提速不???
曲靖5月招聘会信息
坦克世界轻坦点灯怎么车到了眼前才看见
彩虹蟒的形态特征
挚爱什么意思
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?