使用用递归下降分析算法的计算器

 下面是使用纯代码做的计算器,输入输出都在控制台,没有制作界面,算法就是递归下降分析算法,直接输入算式即可,如1+1

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

// 定义全局变量,用于指向当前正在解析的字符
char* expr;

// 解析表达式
double parseExpression();

// 解析项
double parseTerm();

// 解析因子
double parseFactor();

// 解析数字
double parseNumber();

// 解析表达式
double parseExpression()
{
    // 解析左边的项
    double left = parseTerm();
    // 如果当前字符是加号或减号,则继续解析
    while (*expr == '+' || *expr == '-')
    {
        // 取出运算符
        char op = *expr++;

        // 解析右边的项
        double right = parseTerm();

        // 根据运算符的类型进行计算
        if (op == '+')
        {
            left += right;
        }
        else
        {
            left -= right;
        }
    }

    // 返回计算结果
    return left;
}
// 解析项
double parseTerm()
{
    // 解析左边的因子
    double left = parseFactor();
    // 如果当前字符是乘号或除号,则继续解析
    while (*expr == '*' || *expr == '/')
    {
        // 取出运算符
        char op = *expr++;

        // 解析右边的因子
        double right = parseFactor();

        // 根据运算符的类型进行计算
        if (op == '*')
        {
            left *= right;

        }
        else
        {
            left /= right;
        }
    }
    // 返回计算结果
    return left;
}

// 解析因子
double parseFactor()
{
    double result;
    // 如果当前字符是左括号,则解析括号内的表达式
    if (*expr == '(')
    {
        // 跳过左括号
        expr++;

        // 解析括号内的表达式
        result = parseExpression();

        // 跳过右括号
        expr++;
    }
    // 如果当前字符是数字,则解析数字
    else if (isdigit(*expr) || *expr == '.')
    {
        result = parseNumber();
    }
    // 如果当前字符是负号,则解析负号后面的因子
    else if (*expr == '-')
    {
        // 跳过负号
        expr++;

        // 解析负号后面的因子
        result = -parseFactor();
    }
    // 如果当前字符是正号,则解析正号后面的因子
    else if (*expr == '+')
    {
        // 跳过正号
        expr++;
        // 解析正号后面的因子
        result = parseFactor();
    }
    // 如果当前字符既不是括号也不是数字,则报错
    else
    {
        cout << "Error: invalid expression" << endl;
        exit(1);
    }

    // 如果当前字符是乘方运算符,则解析乘方运算
    if (*expr == '^')
    {
        // 跳过乘方运算符
        expr++;

        // 解析乘方运算的底数
        result = pow(result, parseFactor());
    }
    // 如果当前字符是开方运算符,则解析开方运算
    else if (*expr == '√')
    {
        // 跳过开方运算符
        expr++;

        // 解析开方运算的底数
        result = sqrt(parseFactor());
    }

    // 返回计算结果
    return result;
}

// 解析数字
double parseNumber()
{
    // 存储解析的结果
    double result = 0.0;
    // 存储小数位的分母
    double divisor = 1.0;

    // 标记数字是否是负数
    bool negative = false;

    // 如果当前字符是负号,则设置标记
    if (*expr == '-')
    {
        negative = true;

        // 跳过负号
        expr++;
    }
    // 如果当前字符是正号,则跳过正号
    else if (*expr == '+')
    {
        expr++;
    }

    // 循环解析数字的每一位
    while (isdigit(*expr))
    {
        // 将当前数字加入到结果中
        result = result * 10 + (*expr++ - '0');
    }
    // 如果当前字符是小数点,则继续解析小数部分
    if (*expr == '.')
    {
        // 跳过小数点
        expr++;
        // 循环解析小数的每一位
        while (isdigit(*expr))
        {
            // 将当前数字加入到结果中
            result = result * 10 + (*expr++ - '0');

            // 将分母乘以 10
            divisor *= 10;
        }
    }

    // 将小数部分除回去
    result /= divisor;

    // 如果数字是负数,则取负
    if (negative)
    {
        result = -result;
    }

    // 返回计算结果
    return result;
}

int main()
{
    // 读入表达式
    char s[100];
    cout << "输入表达式: ";
    cin >> s;
    // 解析表达式
    expr = s;
    double result = parseExpression();
    // 输出结果
    cout << "计算结果: " << result << endl;

    return 0;
}

下面是运行界面

输入要计算的算式然后回车

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

变身缎带

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值