首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言实现算术表达式的计算(要求表达式中含有-值,以及三角函数等)!该怎么处理

2012-02-19 
c语言实现算术表达式的计算(要求表达式中含有-值,以及三角函数等)!!!!急c语言实现算术表达式的计算(要求表

c语言实现算术表达式的计算(要求表达式中含有-值,以及三角函数等)!!!!急
c语言实现算术表达式的计算(要求表达式中含有-值,以及三角函数等)
如:表达式=(6-7)*8+sin(30)+(asin(0.5)+log(100))*10
请提供解决方法或源码,万分感谢!绝对给高分!

[解决办法]
几百年前写的 ....

s.l :
%{

%}
%option noyywrap nodefault outfile= "s.inl "

DEC_INT_LIT[0-9]+
EXP_PART[eE][\+-]*{DEC_INT_LIT}
FLT_L1{DEC_INT_LIT}[\.]*
FLT_L2{DEC_INT_LIT}\.{DEC_INT_LIT}
FLT_L3\.{DEC_INT_LIT}
FLT_L4({FLT_L1}|{FLT_L2}|{FLT_L3}){EXP_PART}
FLT_LITERAL{FLT_L1}|{FLT_L2}|{FLT_L3}|{FLT_L4}
NEWLINE\r\n|\r|\n
WS[ \t\v\f\b]+
%%

{FLT_LITERAL}{ yylval._num = atof( yytext ); return NUMBER; }
{NEWLINE}{ return '\n '; }
[\+\-\*\/\(\)\,]{ return yytext[0]; }
{WS}{ }
sqrt{ return FSQRT ; }
pow{ return FPOW ; }
log{ return FLOG ; }
log10{ return FLOG10; }
exp{ return FEXP ; }
sin{ return FSIN ; }
cos{ return FCOS ; }
tan{ return FTAN ; }
.{ ECHO; return ERROR; }
%%


ss.y :

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void yyerror( const char* msg );
int yylex();
#ifndef NDEBUG
#define YYERROR_VERBOSE
#endif
%}

%start EXPRL

%union {
double _num;
};

%tokenERROR
%token <_num> NUMBER
%type <_num> UOP MOP AOP EXPRFUNC
%tokenFSQRT FPOW FLOG FLOG10 FEXP FSIN FCOS FTAN

%%

EXPRL :
EXPR '\n '{printf ( "RESULT == %lg\n " , $1 ) ; YYACCEPT; }
;

FUNC :
FSQRT '( ' EXPR ') '{ $$ = sqrt( $3 ); }
|
FPOW '( ' EXPR ', ' EXPR ') '{ $$ = pow( $3 , $5 ); }
|
FLOG '( ' EXPR ') '{ $$ = log( $3 ); }
|
FLOG10 '( ' EXPR ') '{ $$ = log10( $3 ); }
|
FEXP '( ' EXPR ') '{ $$ = exp( $3 ); }
|
FSIN '( ' EXPR ') '{ $$ = sin( $3 ); }
|
FCOS '( ' EXPR ') '{ $$ = cos( $3 ); }
|
FTAN '( ' EXPR ') '{ $$ = tan( $3 ); }
;

UOP :
NUMBER{ $$ = $1 ; }
|
FUNC{ $$ = $1 ; }
|
'( ' EXPR ') '{ $$ = $2 ; }
|
'+ ' UOP{ $$ = $2 ; }
|
'- ' UOP{ $$ = - $2 ; }
;

MOP :
UOP{ $$ = $1 ; }
|
MOP '* ' UOP{ $$ = $1 * $3 ; }
|
MOP '/ ' UOP{ $$ = $1 / $3 ; }
;

AOP :
MOP{ $$ = $1 ; }
|
AOP '+ ' MOP{ $$ = $1 + $3 ; }
|
AOP '- ' MOP{ $$ = $1 - $3 ; }
;

EXPR :
AOP{ $$ = $1 ; }
;

%%

void yyerror( const char* msg )
{
fprintf( stderr , "error : %s.\n " , msg );
}

int main()
{
printf( "----------------------------------\n " );
while(1) yyparse();
}

#include "s.inl "


bash-2.05b$ flex s.l ; bison -o ss.c ss.y ; gcc -o ss ss.c ; ./ss
----------------------------------
1+sin(5.2)-cos(2.3)-log(3)
RESULT == -0.315791
1*2*log(1.234)-sin(1.234)+pow(2,2.3)
RESULT == 4.40128

热点排行