题目: 给定一个基本的算术表达式,请编程计算表达式的值。
举例: 1*2 + 3*4
思路: Expression = "Term + Term" =======> evalTerm( "1*2" ) + evalTerm( "3*4" ) ;
Term = "Factor * Facotr" =======> evalFactor( "1" ) * evalFactor( "2" ); ..............
括号 ( ...... ),看成 ( "......") =======> evalExpression( "......" );
注意: evalExpression 调用 evalTerm ,evalTerm 调用 evalFactor ,在 evalFactor 中遇到括号 再调用 evalExpression
Facotr 以非数字字符(包含小数点) 返回
Term 以 * 、/ 运算字符返回
Expression 以 +、- 运算字符返回
/**
递归渐降语法分析器
recursive-descent parser
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int Invalid = 0;
int pos = 0;
double evalExpression( char *str );
double evalTerm( char *str );
double evalFactor( char *str );
void replaceBlank( char *str );
int main()
{
char str[] = "-1 + -4 / (2+3) ";
replaceBlank( str );
printf( "%s = ", str );
double result = evalExpression( str );
if( Invalid )
printf( "Invalid\n" );
else
printf( "%g\n", result );
return 0;
}
double evalExpression( char *str )
{
double result = evalTerm( str );
if( Invalid )
return 0;
while( str[pos] != '\0' ) {
char op = str[pos];
if( op != '+' && op != '-' ) {
return result;
}
++pos;
double term = evalTerm( str );
if( Invalid )
return 0;
if( op == '+' )
result += term;
else
result -= term;
}
return result;
}
double evalTerm( char *str )
{
double result = evalFactor( str );
if( Invalid )
return 0;
while( str[pos] != '\0' ) {
char op = str[pos];
if( op != '*' && op != '/' )
return result;
++pos;
double term = evalFactor( str );
if( Invalid || term == 0.0 )
return 0;
if( op == '*' )
result *= term;
else
result /= term;
}
return result;
}
double evalFactor( char *str )
{
double result;
int negative = 0;
char buf[20] = { 0 };
int i = 0;
if( str[pos] == '-' ) {
negative = 1;
++pos;
}
if( str[pos] == '(' ) {
++pos;
result = evalExpression( str );
if( str[pos] != ')' ) {
printf( "\n无右括号" );
Invalid = 1;
return 0;
}
++pos;
}
while( isdigit( str[pos] ) || str[pos] == '.' ) {
buf[i] += str[pos];
++pos;
++i;
}
sscanf( buf, "%lf", &result );
if( negative )
result *= -1;
return result;
}
// 去除表达式中的空格
void replaceBlank( char *exp )
{
int i = 0;
while( exp[i] != '\0' ) {
if( exp[i] == ' ' )
strcpy( exp + i, exp + i + 1 );
else
i++;
}
}