求达人用C语言编写一个带括号的四则运算

要C语言,不要C++,也不要JAVA。不要太难,本人实力不强,别整得我看不懂……最好有解释。尽量别用数据结构,最好用递归调用来做。下面是原题目:实现带有括号的四则运算。输入是一个带有括号的四则运算表达式,输出是计算得出的正确计算结果。例如:输入:123+213-67*34+345/23*45*(34+34-345+245+567)回车,然后程序计算得出结果为:359183

第1个回答  2013-11-15
#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("match '%s' failed near '%c'.\n", s, *--next);
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));
printf("%g ", num);
PUSH(num);
} else if(*next == '(') {
lbr(); expr(); rbr();
} else {
fail("term");
}
}

void lv1()
{
while(1) {
char c = *next;
if(c == '+' || c == '-') {
++next;
lv2(); printf("%c ", c); ++opt; cal(c);
} else if(*next == '*' || *next == '/') {
lv2();
} else {
break;
}
}
}

void lv2()
{
while(1) {
char c = *next;
if(c == '*' || c == '/') {
++next;
term(); printf("%c ", c); ++opt; cal(c);
} else if(isdigit(*next)) {
term();
} else {
break;
}
}
}

double eval(char* s)
{
next = s;
expr();
if(*next || opt != 0) {
puts("invalid expression.");
exit(0);
}
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()
{
printf("\n%g\n", eval("123+213-67*34+345/23*45*(34+34-345+245+567)"));
return 0;
}

C语言实现带有括号的四则运算
void error(void) \/*报告错误函数*\/ { printf("ERROR!\\n");exit(1);} void match(char expected) \/*检查字符匹配的函数*\/ { if(token[n]==expected)token[++n]=getchar();else error();} double term(void); \/*计算乘除的函数*\/ double factor(void); \/*处理括号和数字的函数*\/ do...

用简单的C语言实现带括号的四则运算
char *f : 运算符数组 double *s: 数值数组 int p: 当前运算符数组位置。返回参数:无 功能:将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。传入值p若为3 则当前符号的数组位置为3.f[3]=f[3+1]...f[len-2]=f[len-1] f[len-1]='\\0';s[i]=s[i...

c语言四则运算带括号且不使用指针
case 81: d[i+1]=d[i]-d[i+1];break;case 90: d[i+1]=d[i]*d[i+1];break;case 91: d[i+1]=d[i]\/d[i+1];break;case 100: d[i+1]=pow(d[i],d[i+1]);break;default :printf("Sorry! Some Error unknow...");break;} for(n=i;i<=I;i++){d[i]=d[i+...

求c语言编写四则运算程序
include <stdio.h> include <stdlib.h> include <ctype.h> char token;\/*global token variable*\/ \/*function prototypes for recursive calls*\/ float exp(void);float term(void);float factor(void);void error(void){ fprintf(stderr,"Error\\n");exit(1);} void match(char expectedToken)...

C语言求解 设计一个四则运算的程序,从键盘输入计算式如:5*6-7+8\/2...
sum = a[0];\/\/sum赋值应该在这里,这样就是从第一个数开始运算 for(i=0;i<c;i++){ printf("%d%c",a[i],b[i]);\/\/sum=a[i];\/\/此处的sum赋值出现了错误,因为是在循环内部,那每次循环的时候都会进行一次赋值而替代了原先的值,这就导致了最后是最后两个数进行运算 switch (b[i])...

四则运算用c语言怎么搞
int b[50]={0},count;char c[50],t;int i=0,j=0;char *d;c[0]='\\0';while(*a!='\\0'||c[j]!='\\0'){ count=0;if(*a<='9'&&*a>='0'){ d=a;while(*d<='9'&&*d>='0'){ d++;count++;} while(count>0){ b[i]+=(int)((*a-'0')*pow(10,count-1)...

如何运用大一C语言基础编写简单带括号的四则运算?
1.从中缀表达式中逐字符读入操作数 2.若操作数为数字,直接输出到后缀表达式队列 3.若操作数为左括号(,将其压栈 4.若操作数为加减乘除运算符,将其与栈顶元素比较:①操作数优先级高于栈顶元素,则将操作数压栈;②操作数优先级等于或低于栈顶元素,先将栈顶元素出栈,然后将操作数压栈。5.若...

C语言怎么实现四则运算
我曾用c编了个计算器,支持四则运算,支持括号改变优先级,你看看吧:include <stdio.h> include <string.h> include <stdlib.h> include <conio.h> define Esc 27 define Tab 9 void needle(char* s,char* carriage,int start)\/\/needle意为“用针缝”{ int size_carriage=(int)strlen(carriage)...

用c语言编写四则运算,急呀!越简单越好
用纯粹的C语言实现,代码如下:include<stdio.h>int main(){ double a,b; scanf("%lf%lf", &a, &b); printf("a+b=%lf, a-b=%lf, a*b=%lf", a+b, a-b, a*b); if(b==0) printf(", error!\\n"); else printf(", a\/b=%lf\\n", a\/b); ...

如何用C语言实现四则运算?
2.写出主函数void main(){},在函数内添加如下代码:\/\/定义变量 int minusNumber=-10; int plusNumber=0; \/\/转换成正数 plusNumber=abs(minusNumber); \/\/输出结果 printf("转换前:%d\\n",minusNumber); printf("转换后:%d\\n",plusNumber);3.点击红叹号调试。程序清单:include "stdafx.h"#...

相似回答