不用后缀表达式进行表达式计算(加、减、乘、除、整除、取余、指数)

#include<iostream.h>
#include<math.h>
#include<stdlib.h>

bool existChar();                       // 检查是否有可用的数据
double getData();                       // 获取一个数据
double jsBds();                         // 计算表达式的值
double js(double,double,char);          // 计算两个数的计算结果

//检测输入流中是否有可用的数据,忽略空格及制表,遇到换行说明已无可用数据。
//有数据返回true,否则返回假
bool existChar()
{
    char c;
    while(true)
    {
        c=cin.peek();                   // 若无数据,则cin.peek()返回-1
        if( c==10 || !(c==' '||c==9) )  // 若取得的是换行(10),也认为无数据
            break;
        cin.get();                      // 把数据读出来忽略掉
    }
    return c!=10;                       // 只要不是换行,就认为有数据
}

// 从流中取一个数据
// 若不能取得数据,则认为是表达式错误
double getData()
{
    int err=1;                          // 默认表达式有错误
    double d;
    if (existChar())                    // 不能取得数据认为有错
    {
        char c=cin.peek();
        if(c=='(')                      // 是(,处理括号
        {
            cin.get();
            return jsBds();
        }
        else
        {
            cin>>d;                     // 获取数据
            err=cin.fail();             // 是否读到数据
        }
    }
    if(err)                             // 读数据错误,结束程序
    {
        cout<<"表达式错误\n";
        exit(1);
    }
    return d;                           // 返回读取的数据
}

// 根据运算符 f 进行计算
double js(double n1,double n2,char f)
{
    if(f=='+') return n1+n2;            // 加
    if(f=='-') return n1-n2;            // 减
    if(f=='*') return n1*n2;            // 乘
    if(f=='/') return n1/n2;            // 除
    if(f=='\\')return int(n1/n2);       // 整除
    if(f=='%') return fmod(n1,n2);      // 余数
    if(f=='^') return pow(n1,n2);       // 指数
    cout<<"表达式错误\n";
    exit(1);
}

// 计算表达式的值
// 计算优先级:
//      1、() + -   ( 小括号 正 负    )
//      2、^        ( 指数            )
//      3、* / \ %  ( 乘 除 整除 取余 )
//      4、+ -      ( 加 减           )
double jsBds()
{
    double n1=0,n2=getData(),n3,n4;     // 保存数据
    char f='+',f2,f3;                   // 保存运算符
    while(true)
    {
        if(!existChar())
            return js(n1,n2,f);         // 就两个数据进行运算
        cin>>f2;                        // 取第2个运算符
        if(f2=='-'||f2=='+'||f2==')')   // 是 +、-、)
        {
            n1=js(n1,n2,f);
            if(f2==')')return n1;       // 是 ) 返回
            f=f2;                       // 看做第1个运算符
            n2=getData();
            continue;
        }
        else if(f2=='^')                // 是 指数计算
        {
            n3=getData();
            n2=js(n2,n3,f2);
            continue;
        }
        n3=getData();                   // 取第三个数据
        while(existChar())
        {
            cin>>f3;                    // 取第3个运算符
            if(f3=='^')                 // 是 指数 运算
            {
                n4=getData();           // 取第四个数据
                n3=js(n3,n4,f3);
                continue;
            }
            cin.putback(f3);
            break;
        }
        n2=js(n2,n3,f2);                // 进行 乘、除、整除、取余 计算
    }
}

void main()
{
    cout<<"请输入表达式:";
    cout<<"  表达式的值= "<<jsBds()<<endl;
}


请输入表达式:5.4 % 2
  表达式的值= 1.4
Press any key to continue

请输入表达式:2*(3+4
  表达式的值= 14
Press any key to continue

请输入表达式:2*(-3*(6.8\2-1
  表达式的值= -12
Press any key to continue

请输入表达式:((1.5+2)*3-4)%2+10
  表达式的值= 10.5
Press any key to continue

请输入表达式:(2.5+3.5)*2^3^4-100
  表达式的值= 24476
Press any key to continue


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值