21xrx.com
2024-09-20 00:42:43 Friday
登录
文章检索 我的文章 写文章
C++算术表达式求值教程
2023-06-27 11:39:10 深夜i     --     --
C++ 算术表达式 求值 教程

C++是一种高效的编程语言,它可以用于计算、游戏、模拟等各种应用程序。在这些应用程序中,算术表达式求值是一个十分常见的需求。C++提供了一些内置的算术运算符和函数,可以帮助我们对数字进行计算。但是,如果我们需要对复杂的算术表达式进行求值,则需要编写一些程序来实现。

算术表达式指的是由数值、运算符和括号等组成的表达式,例如:

3 + 5 * 2 - (4 / 2)

要对这个算术表达式进行求值,我们需要先了解算术运算符和运算符优先级。C++中的算术运算符有加号、减号、乘号、除号和取模运算符,它们的优先级从高到低依次为:

1.括号

2.乘号、除号和取模运算符

3.加号和减号

在求值时,我们需要先计算括号中的表达式,然后按照运算符的优先级进行计算。在同一优先级的算术运算符中,计算时按照从左到右的顺序进行。因此,上面的算术表达式的求值顺序为:

(4 / 2) = 2

5 * 2 = 10

3 + 10 = 13

13 - 2 = 11

因此,这个算术表达式的值为11。

接下来,我们就来看一看如何使用C++编写算术表达式求值的程序。

算术表达式求值程序设计

算术表达式求值的程序可以分为以下几个步骤:

1.读取算术表达式。

2.将算术表达式转换为逆波兰表达式。

3.计算逆波兰表达式的值。

下面我们将分别介绍这三个步骤的实现方法。

1.读取算术表达式

读取算术表达式可以使用cin语句。例如,读取一个表达式并输出它的值的程序如下:

#include

using namespace std;

int main()

{

  double a, b, c;

  char op1, op2;

  cout << "请按照 a op1 b op2 c 的格式输入算术表达式:" << endl;

  cin >> a >> op1 >> b >> op2 >> c;

  if (op1 == '+')

  {

    if (op2 == '+')

      cout << a + b + c << endl; // a + b + c

    else if (op2 == '-')

      cout << a + b - c << endl; // a + b - c

    else if (op2 == '*')

      cout << a + b * c << endl; // a + b * c

    else if (op2 == '/')

      cout << a + b / c << endl; // a + b / c

    else if (op2 == '%')

      cout << a + int(b) % int(c) << endl; // a + b % c

  }

  else if (op1 == '-')

  {

    if (op2 == '+')

      cout << a - b + c << endl; // a - b + c

    else if (op2 == '-')

      cout << a - b - c << endl; // a - b - c

    else if (op2 == '*')

      cout << a - b * c << endl; // a - b * c

    else if (op2 == '/')

      cout << a - b / c << endl; // a - b / c

    else if (op2 == '%')

      cout << a - int(b) % int(c) << endl; // a - b % c

  }

  else if (op1 == '*')

  {

    if (op2 == '+')

      cout << a * b + c << endl; // a * b + c

    else if (op2 == '-')

      cout << a * b - c << endl; // a * b - c

    else if (op2 == '*')

      cout << a * b * c << endl; // a * b * c

    else if (op2 == '/')

      cout << a * b / c << endl; // a * b / c

    else if (op2 == '%')

      cout << int(a * b) % int(c) << endl; // a * b % c

  }

  else if (op1 == '/')

  {

    if (op2 == '+')

      cout << a / b + c << endl; // a / b + c

    else if (op2 == '-')

      cout << a / b - c << endl; // a / b - c

    else if (op2 == '*')

      cout << a / b * c << endl; // a / b * c

    else if (op2 == '/')

      cout << a / b / c << endl; // a / b / c

    else if (op2 == '%')

      cout << int(a / b) % int(c) << endl; // a / b % c

  }

  else if (op1 == '%')

  {

    if (op2 == '+')

      cout << int(a) % int(b) + c << endl; // a % b + c

    else if (op2 == '-')

      cout << int(a) % int(b) - c << endl; // a % b - c

    else if (op2 == '*')

      cout << int(a) % int(b) * int(c) << endl; // a % b * c

    else if (op2 == '/')

      cout << int(a) % int(b) / int(c) << endl; // a % b / c

    else if (op2 == '%')

      cout << int(a) % int(b) % int(c) << endl; // a % b % c

  }

  return 0;

}

在这个程序中,我们使用了两个char类型的变量op1和op2来保存运算符号。根据这两个运算符号的种类,我们使用if语句计算出表达式的值。

请注意,这个程序只能计算两个运算符的表达式。

2.将算术表达式转换为逆波兰表达式

逆波兰表达式是一种不含括号的算术表达式。它是通过将算术表达式中的操作符放在后面来实现的。例如,2 + 3 * 4可以写成2 3 4 * +的逆波兰表达式。逆波兰表达式的求值比算术表达式的求值更方便,因为它不需要进行括号匹配。

将算术表达式转换为逆波兰表达式的方法有多种。其中一种比较简单的方法是使用栈。具体过程如下:

1.从左到右扫描表达式。

2.如果遇到数字,则将其输出到结果列表中。

3.如果遇到操作符,则将其压入栈中。

4.如果遇到左括号,将其压入栈中。

5.如果遇到右括号,则依次将栈中的操作符弹出并输出到结果列表中,直到遇到左括号为止。

6.扫描完表达式后,依次将栈中的操作符弹出并输出到结果列表中。

下面是将算术表达式转换为逆波兰表达式的程序:

#include

#include

#include

using namespace std;

bool isOperator(char c)

{

  return (c == '+' || c == '-' || c == '*' || c == '/' || c == '%');

}

int precedence(char op)

{

  if (op == '+' || op == '-')

    return 1;

  if (op == '*' || op == '/' || op == '%')

    return 2;

  return 0;

}

vector postfix(string expr)

{

  stack s;

  vector output;

  for (int i = 0; i < expr.size(); i++)

  {

    if (isdigit(expr[i]))

    {

      string num;

      while (i < expr.size() && (isdigit(expr[i]) || expr[i] == '.'))

      {

        num += expr[i];

        i++;

      }

      i--;

      output.push_back(num);

    }

    else if (isOperator(expr[i]))

    {

      while (!s.empty() && s.top() != '(' && precedence(s.top()) >= precedence(expr[i]))

      {

        string op;

        op += s.top();

        s.pop();

        output.push_back(op);

      }

      s.push(expr[i]);

    }

    else if (expr[i] == '(')

    {

      s.push('(');

    }

    else if (expr[i] == ')')

    {

      while (!s.empty() && s.top() != '(')

      {

        string op;

        op += s.top();

        s.pop();

        output.push_back(op);

      }

      s.pop();

    }

  }

  while (!s.empty())

  {

    string op;

    op += s.top();

    s.pop();

    output.push_back(op);

  }

  return output;

}

int main()

{

  string expr;

  cout << "请输入算术表达式:" << endl;

  getline(cin, expr);

  vector vec = postfix(expr);

  for (int i = 0; i < vec.size(); i++)

  {

    cout << vec[i] << " ";

  }

  cout << endl;

  return 0;

}

这个程序定义了两个辅助函数:isOperator和precedence。isOperator函数用来判断一个字符是不是操作符,它返回一个bool值。precedence函数用来返回一个操作符的优先级,优先级越高的值越大。

函数postfix实现了将算术表达式转换为逆波兰表达式的过程。它首先定义了一个栈s和结果列表output。对于每个字符,如果是数字,就将它输出到结果列表中;如果是操作符,则将它放入栈中;如果是左括号,则将左括号放入栈中;如果是右括号,则将栈中的操作符依次弹出并输出到结果列表中,直到遇到左括号为止。最后,将栈中的操作符依次弹出并输出到结果列表中。

3.计算逆波兰表达式的值

计算逆波兰表达式的值可以使用栈来实现。具体过程如下:

1.从左到右扫描逆波兰表达式。

2.如果遇到数字,则将其压入栈中。

3.如果遇到操作符,则从栈中弹出两个数字进行计算,并将计算结果压入栈中。

4.扫描到表达式末尾后,栈中剩余的数字就是逆波兰表达式的值。

下面是计算逆波兰表达式的值的程序:

#include

#include

#include

using namespace std;

double calculate(vector postfix)

{

  stack s;

  for (int i = 0; i < postfix.size(); i++)

  {

    if (postfix[i] == "+")

    {

      double op2 = s.top();

      s.pop();

      double op1 = s.top();

      s.pop();

      s.push(op1 + op2);

    }

    else if (postfix[i] == "-")

    {

      double op2 = s.top();

      s.pop();

      double op1 = s.top();

      s.pop();

      s.push(op1 - op2);

    }

    else if (postfix[i] == "*")

    {

      double op2 = s.top();

      s.pop();

      double op1 = s.top();

      s.pop();

      s.push(op1 * op2);

    }

    else if (postfix[i] == "/")

    {

      double op2 = s.top();

      s.pop();

      double op1 = s.top();

      s.pop();

      s.push(op1 / op2);

    }

    else if (postfix[i] == "%")

    {

      int op2 = int(s.top());

      s.pop();

      int op1 = int(s.top());

      s.pop();

      s.push(op1 % op2);

    }

    else

    {

      s.push(stod(postfix[i]));

    }

  }

  return s.top();

}

int main()

{

  string expr;

  cout << "请输入算术表达式:" << endl;

  getline(cin, expr);

  vector vec = postfix(expr);

  double result = calculate(vec);

  cout << "结果为:" << result << endl;

  return 0;

}

这个程序定义了一个函数calculate,它接受一个逆波兰表达式列表,并返回表达式的值。函数calculate使用栈s来保存数字,对于每个操作符,它从栈中弹出两个数字进行计算,并将计算结果压入栈中。对于数字,直接将它压入栈中。最终,栈中剩余的数字就是表达式的值。

总结

本文介绍了如何使用C++编写算术表达式求值的程序。这个程序可以通过将算术表达式转换为逆波兰表达式来实现快速求值。使用栈可以帮助我们方便地实现逆波兰表达式的计算。这种求值方法可以应用于各种算术表达式的计算,包括复杂的表达式。如果您想深入了解C++编程,请继续学习。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复