- 论坛徽章:
- 0
|
#define ERRPRT(X,Y) printf( "[%s:%3d] ", __FILE__, __LINE__ ); \
printf( X, Y );
#define PRTALL printf( "[%s:%3d] [%6.3lf %c %6.3lf %c %6.3lf] \n",\
__FILE__, __LINE__,\
value1, sign1, value2, sign2, current_value );
#include "stdio.h"
#include "stdlib.h"
main( )
{
char InStr[ 100 ];
double Value = 0;
scanf( "%s", InStr ); /* (100.01+200.01)*10+(10+15) */
/*ERRPRT( "InputStrt[%s]\n", InStr );*/
Khyd( InStr );
Value = Compute( InStr );
ERRPRT( "result is [%12.2lf]\n", Value );
return 0;
}
Compute( char *buf )
{
int i = 0; /* buf[ i ] */
int j = 0; /* tmp[ j ] */
char sign1 = '+';
char sign2 = '*';
double value1 = 0;
double value2 = 1;
double current_value = 0;
double zero = 0;
char tmp[ 20 ];
memset( tmp, 0, sizeof( tmp ) );
for( i = 0; ; i++ )
{
if( buf[ i ] == ' ' )
continue;
if( ( buf[ i ] >; 47 && buf[ i ] < 58) || buf[ i ] == '.' ) /* 数字 */
{
tmp[ j ] = buf[ i ];
j++;
continue;
}
/*ERRPRT("buf[%s]\n", buf + i )*/
if( j >; 0 )
{
tmp[ j ] = 0;
j = 0;
current_value = atof( tmp );
/*ERRPRT( "%f\n", current_value );*/
}
if( buf[ i ] == 0 )
{
value1 = com( value1, sign1, value2, sign2, current_value );
/*ERRPRT( "%f\n", value1 );*/
break;
}
if( buf[ i ] == '(' )
{
current_value = Compute( buf + i + 1 ); /* 递规 */
/*ERRPRT("递规函数返回[%lf]\n", current_value ) */
}
if( buf[ i ] == ')' )
{
value1 = com( value1, sign1, value2, sign2, current_value );
strcpy( buf, buf + i + 1 ); /* 截掉递规部分的字符串 */
/*ERRPRT( "递规返回[%lf]\n", value1 );*/
return value1 ; /* 递规返回 */
}
if( buf[ i ] == '+'
|| buf[ i ] == '-' )
{
value1 = com( value1, sign1, value2, sign2, current_value );
sign1 = buf[ i ];
value2 = 1; /* 恢复初值 */
sign2 = '*'; /* 恢复初值 */
}
if( buf[ i ] == '*'
|| buf[ i ] == '/' )
{
value2 = com( zero, sign1, value2, sign2, current_value );
sign2 = buf[ i ];
}
if( value2 == -1 || value1 == -1 )
{
return -1;
}
/*PRTALL*/
}
return value1;
}
com( double value1, char sign1, double value2, char sign2, double current_value )
{
double ret = 0;
/*PRTALL*/
/*if( current_value != 0 )*/
switch( sign2 ){
case '*':
value2 *= current_value;
break;
case '/':
if( current_value == 0 )
{
ERRPRT( " 除数不能为零%lf\n", current_value );
return -1;
}
value2 /= current_value;
break;
default:
ERRPRT( "Error sign [%c]\n", sign2 );
}
/*
if( value1 == 0 )
return ret;
*/
switch( sign1 ){
case '+':
ret = value1 + value2;
break;
case '-':
ret = value1 - value2;
break;
default:
ERRPRT( "Error sign [%c]\n", sign2 );
}
/*ERRPRT( "ret [%6.2lf]\n", ret )*/
return ret;
}
Khyd( char InStr[] )
{
int i;
int kk = 0;
for( i = 0; i < strlen( InStr ); i++ )
{
if( InStr == '(' )
{
kk+= 1;
}else if( InStr == ')' )
{
kk-= 1;
}
}
if ( kk != 0 )
{
ERRPRT( "括号不对称[%d]\n", kk );
exit( -1 );
}
return 0;
}
括弧出现的问题:
)(2+1
[comp.c: 25] result is [ 0.00]
)(2+2)(+1
[comp.c: 25] result is [ 0.00]
(2+2)(+1(+2))
[comp.c: 25] result is [ 2.00]
()(2+2)
[comp.c: 25] result is [ 4.00]
(2+2)()
[comp.c: 25] result is [ 0.00]
)+(2+2)+2(
[comp.c: 25] result is [ 0.00]
()+(2+2)+()
[comp.c: 25] result is [ 4.00]
(2)(+)(2)
[comp.c: 25] result is [ 2.00]
(1+2)(*3+1)
[comp.c: 25] result is [ 1.00] |
|