免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1095 | 回复: 0
打印 上一主题 下一主题

!急急急!四则运算中的括弧问题!先谢谢了! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-08 11:19 |只看该作者 |倒序浏览
#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]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP