输入一个表达式,输出其结果。表达式由数字+-*/()组成。

例如,输入3*(8.0+(4/3)),输出28。
提示:错误的表达式提示错误。例如:2+*3输出:表达式输入错误。
急需其编程程序

我编了一个,已经通过运行.
把分给我吧,

#include<stdio.h>
#include<stdlib.h>
typedef struct { //定义操作数栈;
float *base;
float *top;
}operand;

typedef struct { //定义操作符栈;
char *base;
char *top;
} operater;

void InitStack1 (operand &S) //初始化操作数栈的函数;
{
S.base=(float *)malloc (100*sizeof(float));
S.top=S.base;
}

void InitStack2 (operater &S) //初始化操作符栈的函数;
{
S.base=(char *)malloc (100*sizeof(char));
S.top=S.base;
}

void Push1(operand &S,float e) //进栈的函数;
{
*(S.top++)=e;
}

void Push2(operater &S,char e) //进栈的函数;
{
*(S.top++)=e;
}

void Pop1 (operand &S,float &t) //出栈的函数;
{
t=*(--S.top);
}

void Pop2 (operater &S,char &t) //出栈的函数;
{
t=*(--S.top);
}
char GetTop2(operater S) //取栈顶函数;
{
return *(S.top-1);
}

float GetTop1(operand S) //取栈顶函数;
{
return *(S.top-1);
}
float Operate(float a,char theta,float b) //将a,b按给定的操作符进行运算的函数;
{
switch (theta)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
}
}

int IsOperand(char c) //判断字符是否为操作数的部分;
{
if((c<='9'&&c>='0')||c=='.')
return 1;
return 0;
}

void ReadData(char str[100][100]) //此函数将运算符优先级表从文件中读入到数组str中;
{
FILE *fp;
int i;
if((fp=fopen("E:\\precede.txt","r"))==NULL) //打开文件;
{
fprintf(stderr,"can't open the file!\n");
exit(-1);
}
for(i=0;i<7;i++)
fscanf(fp,"%s%s%s%s%s%s%s",&str[i][0],&str[i][1],&str[i][2],&str[i][3],&str[i][4],&str[i][5],&str[i][6]);
fclose(fp); //关闭文件;
}

char Precede(char s,char t) //此函数比较2个操作符的优先级,返回大小关系;
{
char st[100][100];
int i,j;
ReadData(st);
switch(s)
{
case '+': i=0;break;
case '-': i=1;break;
case '*': i=2;break;
case '/': i=3;break;
case '(': i=4;break;
case ')': i=5;break;
case '#': i=6;break;
}
switch(t)
{
case '+': j=0;break;
case '-': j=1;break;
case '*': j=2;break;
case '/': j=3;break;
case '(': j=4;break;
case ')': j=5;break;
case '#': j=6;break;
}
return st[i][j];
}

int EvaluateExpression(operand &opnd) //计算表达式的值的函数;
{
char str[100],c,x,theta;
float t=0,a,b;
int i=0,j,k,n=10,flag=1,f=0,p=1; //p用来控制操作数正负;
operater optr;
InitStack1(opnd);
InitStack2(optr);
Push2(optr,'#');
gets(str); //以字符串形式输入表达式;
for(i=1;str[i];i++) //扫描表达式,检查是否有负数;
if(str[i]=='-'&&str[i-1]=='(')
{
j=0;
while (str[j])
j++;
for(;j>=i;j--)
str[j+1]=str[j];
str[i]='0'; //在负数前面插入0,因为-a==0-a;

}
i=0;
if(str[i]=='-') //若第一个字符就是0;
{
p=p*(-1); //p赋为-1;
i++;
}
while(str[i]!='#'||GetTop2(optr)!='#')
{
if(str[i]==' ') { //忽略表达式中的空格;
i++;
continue;
}
if(IsOperand(str[i]))
{
f=1; //f置为1,表示已扫描到过操作数;
if(str[i]=='.') flag=0;
else
{
if(flag==0){
t=t+(float)(str[i]-48)/n; //计算小数部分的值;
n*=10;
}
else t=t*n+str[i]-48; //计算整数部分的值;
}
i++;
}

else
{
if(f==1) //操作数计算完毕,将其入操作数栈;
{
Push1(opnd,t*p);
//将各个参数还原为初始化时的值;
p=1;
t=0;
flag=1;
f=0;
n=10;
}

switch(Precede(GetTop2(optr),str[i]))
{
case '<': //不满足运算的要求,继续入栈;
{
Push2(optr,str[i]);
i++;
break;
}
case '=': //该对操作符中的运算已经完成,释放该操作符;
{ Pop2(optr,x);
i++;
break;
}
case '>': //满足运算的要求,进行运算并且将结果入操作数栈;
{
Pop2(optr,theta);
Pop1(opnd,b);
Pop1(opnd,a);
Push1(opnd,Operate(a,theta,b));
break;
}
case '0': { //错误的输入,输出错误提示;
printf("Grammer Error!\n");
return 0;
}
}
}
}

return 1;
}

void main ()
{
operand opnd;
int t;
printf("\n\n This programme is used for expression evaluation\n\n");
printf("Please input an expression end of '#':\n");
t=EvaluateExpression(opnd);
if(t) //无语法错误,输出表达式结果;
printf("The result is: %.3f\n",GetTop1(opnd));
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-09-24
3*(8.0+(4/3))
用错了括号,这个是标点里的括号吧,要用英文的

如下
3*(8.0+(4/3))本回答被提问者采纳

输入一个表达式,输出其结果。表达式由数字+-*\/()组成。
exit(-1);} for(i=0;i<7;i++)fscanf(fp,"%s%s%s",&str[i][0],&str[i][1],&str[i][2],&str[i][3],&str[i][4],&str[i][5],&str[i][6]);fclose(fp); \/\/关闭文件;} char Precede(char s,char t) \/\/此函数比较2个操作符的优先级,返回大小关系;{ char s...

(C++) 输入一个由数字、+、-、*、\/及括号组成的自述表达式,求其值。
define STACK_INIT_SIZE 10 \/* 存储空间初始分配量 *\/ define STACKINCREMENT 2 \/* 存储空间分配增量 *\/ typedef float SElemType_f;typedef char SElemType_ch;typedef int Status;include<iostream.h> include<stdlib.h> \/*free()头文件 *\/ define OK 1 define ERROR 0 typedef struct SqStac...

从终端输入一个由"+ - * \/ ()"及操作数组成的表达式字符串,输出表达式...
double number_value;string string_value;map<string, double> table;int no_of_errors;double error(const string& s){no_of_errors++;cerr<<"error:"<<s<<endl;return 1;

C语言:从键盘输入一个人简单的数学表达式,计算并显示该表达式的值
double result0; \/\/存放运算结果 char current_char;int i = 0;printf("请输入简单表达式!\\n");scanf("%c", ¤t_char);while (current_char >= '0' && current_char <= '9'){\/\/输入第一个变量 var1[i++] = current_char;scanf("%c", ¤t_char);} if ( i > 0...

我是Java初学者,下面的程序:输入一个算式,计算结果(+ - * \/ ^就够...
{ public static void main(String args[]){ int i,p=0;double c = 0;char a0 = 0,b0 = 0;System.out.println("请输入计算表达式: ");String s=(new Scanner(System.in)).next();for(i=0;i<s.length();i++){ if(s.charAt(i)=='+'||s.charAt(i)=='-'||s.charAt(i)...

...运算符 操作数”的四则运算表达式,输出运算结果。
有没有括号的,有的话很烦喔,要用栈来写,没的话一个switch函数和一个循环函数就可以搞定了。用getchar()函数一个个读入所有字符,然后操作数的话用ASCII换成十进制的,switch里面分别就是+-*\/四个运算,然后循环两次4个数读完就printf()出来,思路够清晰了吧,代码自己实践。。。无法实现我再...

JAVA从键盘输入2个数字,输出两个数字的“+、-、*、\/、%”的运算表达式...
public static void main(String[] args) { Scanner scan=new Scanner(System.in);float num1,num2;System.out.print("请输入两个数!\\n第一个数:");num1=scan.nextFloat();System.out.print("第二个数:");num2=scan.nextFloat();System.out.println(num1+"+"+num2+"="+(num1+num2)...

在python下输入运算表达式,输出运算结果。
num=''): 's是以左括号或数字开头的字符串' '返回s首位开始的最长连续数字串和剩余字符串' if not s : return s,num if s[0]=='(': return wipe_brace(s) if is_float(s[0]): return get_Longest_number(s[1:],num+s[0]) return s,numdef get_va...

【c语言】键盘上键入一个算数表达式,计算其算数值,整个算数表达式要作 ...
]){int i,k,t,m,p;char s[50];printf("Please enter an arithmetic expression(only + & -)...\\n");scanf("%49s",s);for(p=m=t=i=0;s[i];i++){sscanf(s+i,"%d%n",&k,&t);p ? m-=k : m+=k;if(s[i+=t]=='+')p=0;else if(s[i]=='-')p=1;...

从键盘输入一个表达式,判断它是否符合下面的语法规则 的c语言程序_百度...
3 循环遍历表达式,分别判断运算符(+-*\/)等的两侧是否为大写字母或()结构代替的数值,其中()结构的判断可以将第二步写成函数,将运算符之前或之后的字符串片段作为输入参数。4 结束 临时想的,可能有漏洞,自己斟酌。有问题还是要自己解决的嘛,靠别人自己是学不到东西的啊 ...

相似回答
大家正在搜