C语言编程,拜托会的可以给点提示,或写下给我看看

表达式计算:

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

例如,输入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个回答  2010-07-25
4/3=1、、、、
第2个回答  2010-07-25
百度上有很多....代码也不少!!自个搜索吧...........
第3个回答  2010-07-26
用正则表达式吧!网上搜索一下

C语言编程,拜托会的可以给点提示,或写下给我看看
} 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"))==N...

有没有C语言大神,给我讲讲这个程序怎么运行?一步步详细分析一下,拜托...
第一行的数字相当于标尺,表示第几个字符位,为方便后续说明 c表示输出一个字符,分别对应输出c1,c2,c3,c4和c5 '\\101'表示八进制101即十进制65对应的ASCII字符,为'A',所以c4='A''\\116'表示八进制116即十进制78对应的ASCII字符,为'N',所以c5='N''\\t'表示水平制表符Tab,当其前面有n个...

求助一个简单的分段函数C语言编程,拜托各位
给你举个例子,希望能帮助到你 y=e^x x<o =10 x=0 =x-2 x>10 求C语言编程程序 include <stdio.h> include <math.h> void main(){ double x;scanf("%f",&x);if(x<0)printf("%f",exp(x));else if(x>0)printf("%f",x-2);else printf("10");} ...

这个C语言程序怎么写??进来看看,拜托啦~
cGrade = cGrade - (nScore - 5);} } \/\/\/提示:'D' == 'E' - 1; 'C' == 'E' - 2 以此类推

c语言编程,完全没有头绪,请求帮助,拜托了,要用c语言,不要用c++,最好有...
从第八个可以看出a和c是满足身高的。所以可以理解为a,c属于第三个。那么c是高个子,细身材,又是黄头发,那么可以得出(1)中未知的那个就是c,再看(4),满足条件的只有C。得出卡洛尔是他梦中情人。我觉得是不是可以用递推或者递归尝试下。当然,这也是我的猜测。我也是刚学的新手。

C语言中的一道复合运算不会 请问一下是怎么求得的,最好详细点...
printf("%d %d\\n",i++,++j); 先取i作为表达式i++的值,然后i再加1,所以表达式i++的值为8,变量i的值为9;取j+1作为表达式++j的值,所以表达式++j和变量j的值均为11。输出结果即为8 11 printf("%d %d\\n",i,j); 上面已有说明,输出结果为9 11 ...

求圆锥体积的c语言程序拜托大神了, 根据我写的程序框图写一下...
float pi=3.14;void main(){ float r,h;printf("请输入半径r:\\n");scanf("%f",&r);if(r<=0){ printf("非法输入");} else { printf("请输入高h:\\n");scanf("%f",&h);if(h<=0){ printf("非法输入");} else { float s=pi*r*r;float v=s*h\/3;printf("体积v=%f\\n"...

用C语言编写:两个整数相加和两个小数相加后相乘,并显示两数相乘的结果...
include<stdio.h> main(){ int a,b;float m,n,sum;printf("请输入两个整数:\\n");scanf("%d,%d",&a,&b);printf("请输入两个小数:\\n");scanf("%f,%f",&m,&n);sum=(a+b)*(m+n);printf("(%d+%d)*(%f+%f)=%f\\n",a,b,m,n,sum);} ...

c语言编程要求从大道小顺序打印三个整数abc拜托各位大神
k++) if (a[j] < a[k]) { int t = a[j]; a[j] = a[k]; a[k] = t; } for (int z = 0;z < n;z++)\/*依次输出*\/ printf("%d ",a[z]); } 利用数组排序来做,如果要给4个、5个更多的排序,只要修改const int n = 3;,把3换成你要的就可以了 记得采纳啊 ...

...请求专业程序员给点意见,讲一下你们的学习历程,我该从那里开始_百度...
3:这是我们已经具备C\/C++的基本功能了 我们 会定义 变量,会写 if 语句,for循环 最重要的的是 我们能够弄懂 C\/C++ 里面的 类 和 指针的概念 等等 4 :学习windows 编程 就是我们常说的Win32编程,windows API 函数 在这个过程中我希望大家能有点英语的底子,我们应该去学习如何使用MSDN来学习...

相似回答
大家正在搜