【数据结构与算法设计(C描述)】北京理工大学实验:简单计算器

实验要求

请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求:

(1)从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。

(2)输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。

例如,输入:4+2*5=                          输出:14

           输入:(4+2)*(2-10)=                输出:-48

1.需求分析

该程序的设计任务是创建一个简单的计算器,能够处理基本的四则运算(加减乘除)以及幂运算(^)。此外,该程序还需要能够处理括号,并且在计算过程中只取整数部分。

2. 概要设计

(1)抽象数据类型的定义

① stack<int>:用于存储操作数的栈

② stack<char>:用于存储运算符的栈

(2)主程序的流程

① main() 函数接收用户输入的表达式,并调用 evaluateExpression() 函数来计算表达式的结果。

② evaluateExpression() 函数对表达式进行解析和计算,并使用两个栈分别存储操作数和运算符,最终得出结果。

(3)程序模块之间的调用关系

main() 调用 evaluateExpression() 函数。

3. 详细设计

evaluateExpression() 函数算法

① 创建两个栈,分别用于存储操作数和运算符。

② 遍历表达式的每个字符:

若是空格,跳过。

若是数字,则解析出完整的数字并压入操作数栈。

若是左括号,则将其压入运算符栈。

若是右括号,则依次计算直到遇到左括号,处理括号内的表达式。

若是运算符,根据优先级进行计算,将结果压入操作数栈。

③ 处理剩余的运算符和操作数直到运算符栈为空。

④ 返回最终的计算结果。

4. 调试分析

在调试过程中,可能会遇到以下问题:

(1)表达式的输入格式问题:程序可能无法正确解析输入的表达式,导致计算错误。解决方法是确保输入的表达式符合程序要求的格式,包括空格的处理和操作数的正确解析。

(2)运算符优先级问题:可能存在运算符优先级处理错误导致计算错误的情况。需要检查优先级判断和运算的逻辑。

5. 测试结果

测试输入1:4+2*5= 输出结果1:14

测试输入2:(4+2)*(2-10)= 输出结果2:-48

图1:测试用例1结果
图2:测试用例2结果

6.完整代码 

#include <iostream>
#include <stack>
#include <cctype> // for isdigit()
#include <cmath> // for pow()

using namespace std;

int precedence(char op) {
    if (op == '^')
        return 3;
    else if (op == '*' || op == '/')
        return 2;
    else if (op == '+' || op == '-')
        return 1;
    else
        return -1;
}

int applyOperation(int a, int b, char op) {
    switch (op) {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/':
            return a / b;
        case '^':
            return pow(a, b);
        default:
            return 0;
    }
}

int evaluateExpression(const string& expression) {
    stack<int> values;
    stack<char> operators;

    for (size_t i = 0; i < expression.length(); ++i) {
        if (expression[i] == ' ') {
            continue;
        } else if (isdigit(expression[i])) {
            int num = 0;
            while (i < expression.length() && isdigit(expression[i])) {
                num = num * 10 + (expression[i] - '0');
                ++i;
            }
            values.push(num);
            --i;
        } else if (expression[i] == '(') {
            operators.push(expression[i]);
        } else if (expression[i] == ')') {
            while (!operators.empty() && operators.top() != '(') {
                int b = values.top();
                values.pop();

                int a = values.top();
                values.pop();

                char op = operators.top();
                operators.pop();

                values.push(applyOperation(a, b, op));
            }
            if (!operators.empty()) {
                operators.pop(); // Pop '('
            }
        } else {
            while (!operators.empty() && precedence(operators.top()) >= precedence(expression[i])) {
                int b = values.top();
                values.pop();

                int a = values.top();
                values.pop();

                char op = operators.top();
                operators.pop();

                values.push(applyOperation(a, b, op));
            }
            operators.push(expression[i]);
        }
    }

    while (!operators.empty()) {
        int b = values.top();
        values.pop();

        int a = values.top();
        values.pop();

        char op = operators.top();
        operators.pop();

        values.push(applyOperation(a, b, op));
    }

    return values.top();
}

int main() {
    string expression;
    cout << "请输入表达式(以=结束): ";
    getline(cin, expression, '=');

    int result = evaluateExpression(expression);
    cout << "输出结果: " << result << endl;

    return 0;
}

***本实验报告属原创,各位可以免费取用,严禁商用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值