C语言:任意算术表达式的求值

要程序代码

一看你就是个菜鸟!哥来回答要实现输入任意表达式求值 楼上的的确不错 但是那是数据结构的 对于你们菜鸟来说 学习那还是早了点我来编写一道简单的题目吧:#include<stdio.h>void main(){double a,b,result;//定义两个操作数char opr;//定义算法printf("please input first number:");//输入第一个数scanf("%lf",&a);printf("操作方法:");//输入符号scanf("%c",&opr);printf("please input second number:");//输入第二个数scanf("%lf",&b);if (opr=='+')result=a+b;else if(opr=='-')result=a-b;else if(opr=='/')result=a/b;else if(opr=='*')result=a*b;printf("运算结果是:%lf",result);}好了 OK 给我加分吧!
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-25
表达式末尾加要加#
例如5+6要打5+6#
#include<cstdio>
#include<malloc.h>
#define NULL 0
typedef struct node{
char date;
struct node *next;
}SNode;

SNode *InitStack(){
SNode *top;
top=(SNode *)malloc(sizeof(SNode));
top->next=NULL;
return top;
}
void PushOptr(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;

}
char PopOptr(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
void PushOpnd(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOpnd(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
char GetTop(SNode *top){

return (top->next)->date;
}
int In(char c){
int n;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':n=1;break;
default:n=0;break;
}
return n;
}
char Precede(char x,char y){
int i,j;
int form[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(x){
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(y){
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;
}
if(form[i][j]==1)
return '>';
else
if(form[i][j]==-1)
return '<';
else
return '=';

}
int Operate(char x,char z,char y){
int a=x-'0',b=y-'0';
switch(z){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
char Eval_Exp(){
char a,b,c,r,f,z;
int result;
SNode *top[2];
top[0]=InitStack();
PushOptr(top[0],'#');
top[1]=InitStack();
c=getchar();
while(c!='#'||(GetTop(top[0]))!='#'){
if(!In(c)){
PushOpnd(top[1],c);
c=getchar();
}
else{
r=Precede(GetTop(top[0]),c);
switch(r){
case '<':PushOptr(top[0],c);
c=getchar();
break;
case '=':PopOptr(top[0]);
c=getchar();
break;
case '>':b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}

}
}
return f;
}
void main(){
char result;
result=Eval_Exp();
printf("%d\n",result-'0');

}
第2个回答  2013-09-25
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <setjmp.h>

jmp_buf jmpenv;

double opdstack[100];
char optstack[100];
double* sp1 = opdstack;
char* sp2 = optstack;
#define OPD sp1
#define OPT sp2
#define PUSH( s, n ) (*s++ = n)
#define POP( s ) (*--s)
#define TOP( s ) (*(s-1))
#define V( s ) ((void*)(s))
#define EMPTY( s ) ( V(s) == V(sp1) ? V(s) == V(opdstack) : V(s) == V(optstack) )
#define SIZE( s ) ( (double*)s == sp1 ? (double*)s - opdstack : (char*)s - optstack )

int getpred( char c )
{
char* pred[] = { "0123456789","+-", "*/", "()" };
int i = 0;
for ( i = 0; i < 3; ++i )
if ( strchr( pred[i], c ) != NULL )
break;
return i;
}

void initerror()
{
int r;
switch( r = setjmp( jmpenv ) )
{
case 1: puts( "invalid operator combination." ); break;
case 2: puts( "invalid character." ); break;
case 3: puts( "expression is not valid." ); break;
}
if ( r ) exit( 0 );
}

void docal()
{
double a, b;
char c;
b = POP( OPD );a = POP( OPD );c = POP( OPT );
switch( c )
{
case '+': a += b; break;
case '-': a -= b; break;
case '*': a *= b; break;
case '/': a /= b; break;
default: longjmp( jmpenv, 1 );
}
PUSH( OPD, a );
}

double eval( char* expr )
{
char* fwd = expr;
int n;
double num;
while( *fwd ) {
switch( getpred( *fwd ) )
{
case 0:
sscanf( fwd, "%lf%n", &num, &n );
fwd += n;
PUSH( OPD, num );
if ( *fwd == '(' )
longjmp( jmpenv, 1 );
break;
case 1: case 2:
while( TOP( OPT ) != '(' && SIZE( OPD ) > 1 && getpred( *fwd ) <= getpred( TOP( OPT ) ) )
docal();
PUSH( OPT, *fwd );
++fwd;
break;
case 3:
if ( *fwd == '(' ) {
PUSH( OPT, *fwd );
} else {
while( TOP(OPT) != '(' )
docal();
POP( OPT );
}
++fwd;
break;
default:
longjmp( jmpenv, 2 );
exit( 0 );
break;
}
}
while ( !EMPTY( OPT ) )
docal();
num = POP( OPD );
if( !( EMPTY( OPT ) && EMPTY( OPD ) ) )
longjmp( jmpenv, 3 );
return num;
}

int main()
{
initerror();
char a[100] = "2*12+((1+2)/3)*(3-4/4)";
printf( "example:\n%s=%g\n\n", a, eval( a ) );
printf( "please input a valid expr:\n" );
gets( a );
printf( "%s=%g\n", a, eval( a ) );
}本回答被网友采纳

表达式的求值(c语言)
1.算术表达式就是包含算术运算符(如+ - \/ * %等)的表达式(不是语句,后面没有分号),如:a+b ,a%b,a+b-c*d,3+5等,算术表达式的值就是最后算出的结果,如3+5这个表达式的值就是8 2.赋值表达式,就是含有赋值运算符=的表达式,如a=5,b=3,c='A'等,=左边的a,b,c称为...

C语言计算表达式的值
} exp[t] = '\\0'; \/*表达式结束*\/ } float cal_value(char exp[]){ struct {

算术表达式求值 C语言
\/\/#define MaxLen 100\/\/存储空间 int tran(char str[], char expr[]) \/\/将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)\/\/原来表达式,后缀表达式 { int st[100]; \/\/转化过程使用的过度栈 char ch;int i=0,exindex=0,stindex=-1; \/\/i是str下标,exindex是expr下标,...

C语言,求此算术表达式的求值程序x+a%3*(int)(x+y)%2\/4
main(){ float x=2.5;int a=7;float y=4.7;double z;z=x+a%3*(int)(x+y)%2\/4;printf("z=%10f\\n",z);}

算术表达式求值 急求
include <string.h> define error 0 define ok 1 define overflow -1 define STACK_INIT_SIZE 100 define STACKINCREMENT 10 define OPSETSIZE 7 char OPSET[OPSETSIZE]={'+','-','*','\/','(',')','#'};unsigned char Prior[7][7] = { \/\/ 算符间的优先关系 '...

C语言关于表达式求值
这是我以前做的一个表达式求值的程序,要求和实现的功能是一样的:include<stdio.h> include <string.h> include <conio.h> define PLUS 0 define MINUS 1 define POWER 2 define DIVIDE 3 define LEFTP 4 define RIGHP 5 define STARTEND 6 define DIGIT 7 define POINT 8 define NUM 7 defi...

C语言:!(x+y)+z-1 && y+z\/2 跪求高手解答 不胜感激。 谢谢!!
先算(x+y),再算(x+y)-z,再算(x+y)-z-1。若(x+y)-z-1的结果为非零数,则!(x+y)-z-1的值为0。(x+y)-z-1的值为0,则!(x+y)-z-1的值为1。先算z\/2,再算y+z\/2。若y+z\/2的值为0,那么整个表达式的值为0。若左边(x+y)-z-1的结果为1 ,y+z\/2...

求值: x+a%3*(int)(x+y)%2\/4 其中...
2、(int)(x+y)=7 (x+y=7.3取整为7)3、第一步和第二步的答案相乘=7 4、7%2=1 5、1\/4=0 (运算符"\/"得出的答案取整)6、然后x+0=x=2.5 注: (%为取余运算符,int:Int是将一个数值向下取整为最接近的整数的函数。运算符"\/"得出的答案取整,运算顺序为先乘除后加减)...

c语言表达式求值
e=*(--S.top);return OK;}\/\/Pop char Precede(char t,char c){ switch(c){ case '+':if(t=='+'||t=='-'||t=='*'||t=='\/'||t==')')return '>';else return'<';break;case '-':if(t=='+'||t=='-'||t=='*'||t=='\/'||t==')')return '>';else ...

如何用表达式求值?
首先5>2为真,返回值1(1为真,0为假);然后就是1>7为假,返回0;最后0>8为假,返回0。最后结果为0。或:从左至右:5>2 =1 1>7 =0 0>8 =0

相似回答