解析算术表达式字符串

// Expression.cpp : main project file.

// 表达式计算+-*/四则运算,只有整数,没有括号,可以有空格。

 

#include "stdafx.h"

#include <stdlib.h>

#include <stdio.h>

 

class Expression

{

public:

    char * expr;    //表达式字符串

    char * ex;    //正在转换的字符

    char error[100];    //错误信息

 

    double result;    //计算结果

 

    double list[22]; //最多个+-号,*/号不限

 

    //构造函数

    Expression( char * e )

    {

        ex = expr = e;

        *error = 0;

    }

 

    //计算, 如果成功,返回空字符串,结果保存在result中,否则返回错误信息。

    char * Calculat()

    {

        // 第一步:把字符串转换成数字,运算符也转换成数字,存入list[21]

        double a1 = Convert();    // 取第一个数

        int sy;    //运算符

        int i = 0;

        while( (i < 22) && !*error && ((sy=Symbols()) > 0) )    // 如果错误或结尾,停止

        {

            double a2 = Convert();

            if( sy == 3 )        // 乘除法先算出来。

                a1 *= a2;

            else if( sy == 4 )

                a1 /= a2;

            else

            {

                list[i++] = a1;

                list[i++] = sy;

                a1 = a2;

            }

        }

 

        if( i == 22 )    // +/- 号太多

            return "The symbols of +/- more then 10.";

 

        if( *error )    // 其它错误

            return error;

 

        list[i++] = a1;    //存最后一个数

 

        //第二部,计算加减法

        result = list[0];

        for( int j = 1; j < i; j++ )

        {

            if( list[j++] == 1 )

                result += list[j];

            else

                result -= list[j];

        }

 

        return "";

    }

 

    //转换一个数,返回浮点型,便于除法计算。

    double Convert()

    {

        for( ; *ex == ' '; ex++ ); //去掉空格

        char * p = ex;

        for( ; (*ex >= '0') && (*ex <= '9'); ex++ ); //所有数字

        if( p == ex )    //错误

        {

            sprintf( error, "Error at %d", ex - expr );

            return 0;

        }

       

        return atoi( p );

    }

 

    int Symbols()

    {

        for( ; *ex == ' '; ex++ ); //去掉空格

 

        char c = *ex++;

        if( c == '+' )

            return 1;

        else if( c == '-' )

            return 2;

        else if( c == '*' )

            return 3;

        else if( c == '/' )

            return 4;

        else if( c == 0 )    //结尾

            return 0;

        else    // 错误

        {

            sprintf( error, "Error at %d", ex - expr );

            return -1;

        }

    }

};

 

int main()

{

    char buffer[81];    // 保存输入的表达式,最多输入个字符。

    int i = 0, ch;

 

    printf( "/n" );

 

    while(true)

    {

        printf( "Expression: " );

        for (i = 0; (i < 80) && ((ch = getchar()) != EOF)

            && (ch != '/n'); i++)

        {

            buffer[i] = (char) ch;

        }

 

        if( (*buffer == 'q') || (*buffer == 'Q') )

            break;

 

        if( !i )

            printf( "/nPlease enter the expression./n");

        else if( i >= 80 )

        {

            printf( "/nThe expression length more then 80./n");

            for (i = 0; ((ch = getchar()) != EOF) && (ch != '/n'); i++);    //取完多余的字符

        }

        else

        {

            buffer[i] = 0;    //加上结尾符

            Expression exp( buffer );

            char * err = exp.Calculat();

            if( *err )

            {

                printf( err );

                printf( "/n/n" );

            }

            else

            {

                printf( "The result is %g/n/nPress Q and Enter to return./n", exp.result );

            }

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值