C++实现计算器功能

 更新时间:2022年02月07日 16:05:46   作者:积木41  
这篇文章主要为大家详细介绍了C++实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现计算器功能的具体代码,供大家参考,具体内容如下

说明:

前面简单尝试过计算器,只能支持加减乘除,这次完善了计算器的功能:
支持带括号的表达式;
支持±*/ (加减乘除)基本运算;
支持^(指数)运算;
支持取负号运算(-num);
支持阶乘!。

输入格式及结果:

括号和基本运算:

指数运算:

取负和混合运算:

阶乘:

代码:

//支持带括号的表达式,支持+-*/、^(指数)、取负、!(阶乘)
#include <iostream>
#include <stack>
#include <math.h>

using namespace std;

double inStack();   //核心函数,将操作符有序的入栈计算, 最后返回结果
void calculate(stack<char>& Ope, stack<double>& Num);  //用来计算加减乘除, 结果放在数字栈顶
void factorial(stack<double>& Num);   //用来计算阶乘
int priority(char ope_);   //用来计算操作符的优先级

int main() {
    double result;   //最后的结果

    cout << "请输入:\n";
    result = inStack();   //将缓冲区的操作符和数字压入栈 

    cout << "结果是:\n" << result;

    return 0;
}

double inStack() {
    stack<char> Ope;
    stack<double> Num;
    char ope_;
    double num_;

    while (1) {
        if (cin.peek() >= '0' && cin.peek() <= '9') {  //判断下一个是否是数字
            cin >> num_;
            Num.push(num_);   //数字直接入栈
        }
        else {
            cin >> ope_;
            if (ope_ == '=') {
                while (!Ope.empty()) calculate(Ope, Num); //如果符号栈不空,就一直计算
                return Num.top();  //如果是等号且符号栈顶为空,就返回数字栈顶元素
            }
            else if (ope_ == '!') factorial(Num);  //如果是!就阶乘
            else if (ope_ == '(' ||Ope.empty()) Ope.push(ope_);    //如果符号是左括号或符号栈为空直接压入
            else if (ope_ == ')') {  //如果是右括号
                while (Ope.top() != '(') calculate(Ope, Num); //一直计算完括号里的
                Ope.pop();  //左括号出栈
            }
            else if (priority(Ope.top()) >= priority(ope_)) {  //如果栈顶符号的优先级大于等于当前
                calculate(Ope, Num);   //计算结果压入数字栈,取出当前栈顶
                Ope.push(ope_);  //压入当前符号
            }
            else Ope.push(ope_);  //否则就压入符号栈
        }
    }
}

void calculate(stack<char>& Ope, stack<double>& Num) {
    double a, b;

    if (Ope.top() == '-') {
        a = Num.top(); Num.pop();
        Ope.pop();   //取出负号
        Num.push(-a);  //压入负值
        if (!Num.empty()) {
            if(Ope.empty() || Ope.top() != '(')
                Ope.push('+');  //如果前面还有数字,就压入+,即变成加负值
        }
    }
    else {
        a = Num.top(); Num.pop();
        b = Num.top(); Num.pop();

        if (Ope.top() == '+') Num.push(b + a);
        else if (Ope.top() == '*') Num.push(b * a);
        else if (Ope.top() == '/') Num.push(b / a);
        else if (Ope.top() == '^') Num.push(pow(b, a));

        Ope.pop();
    }
}

void factorial(stack<double>& Num) {
    int a = static_cast<int>(Num.top());
    int result=1;

    for (int i = 1; i <= a; i++) result *= i;

    Num.push(static_cast<double>(result));
}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++程序代码的五大内存分区方式

    C++程序代码的五大内存分区方式

    这篇文章主要介绍了C++程序代码的五大内存分区方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • C++数据结构哈希表详解

    C++数据结构哈希表详解

    C++标准库中使用的unordered_map底层实现是哈希表,下面这篇文章主要给大家介绍了关于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以参考下
    2022-07-07
  • C语言指针的图文详解

    C语言指针的图文详解

    这篇文章主要为大家介绍了C语言指针,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • CreateCompatibleDC()函数案例详解

    CreateCompatibleDC()函数案例详解

    这篇文章主要介绍了CreateCompatibleDC()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言详解实现猜数字游戏步骤

    C语言详解实现猜数字游戏步骤

    猜数字是兴起于英国的益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。游戏规则为一方出数字,一方猜,今天我们来实现这个游戏案例
    2022-07-07
  • 简单谈谈C++ 头文件系列之(bitset)

    简单谈谈C++ 头文件系列之(bitset)

    我们要使用bitset,首先需要包含头文件bitset。和vector对象不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset的时候,要明确bitset包含了多少位,须在尖括号内给出它的长度值。长度值必须定义为整形字面值常量或是已用常量值初始化的整型的const对象
    2017-02-02
  • Qt无边框窗口拖拽和阴影的实现方法

    Qt无边框窗口拖拽和阴影的实现方法

    这篇文章主要给大家介绍了关于Qt无边框窗口拖拽和阴影的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • c++快速排序详解

    c++快速排序详解

    快速排序总体思想:先找到一个枢轴,让他作为分水岭,通过一趟排序将待排序的记录分割成两部分,前面一部分都比枢轴小,后面一部分枢轴大,然后又分别对这两部分记录继续进行递归的排序,达到整个序列有序的目的
    2017-05-05
  • PTA刷题C语言编程顺序颠倒输出实现

    PTA刷题C语言编程顺序颠倒输出实现

    本篇文章是在刷PTA题目是遇到的一道题,给定一句话,要求将句中所有单词顺序颠倒输出,本文来带你解答,有需要的朋友可以借鉴参考下
    2021-09-09
  • C++特性:迭代器

    C++特性:迭代器

    这篇文章主要介绍了C++特性:迭代器,本文主要通过介绍迭代器,迭代器和指针的区别,容器迭代器的使用等方面,需要的朋友可以参考下
    2021-06-06

最新评论