C++实现简易计算器功能

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

介绍

介绍:仅支持自然数间的+ - * /操作,并没有括号。

实现:利用栈实现存储运算数以及运算符。

流程

1、输入:string exp

2、对EXP进行处理:数字入数栈,运算符入字符栈。

1)栈空,字符入栈
 2)栈非空
      栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈
 3)字符入栈

3、对字符栈检测,非空时进行计算

4、输出:结果。

实现

const int MAXSIZE = 100;//栈的最大大小

template<typename T>
class Stack {
private:
    T data[MAXSIZE];
    int top;
public:
    Stack();

    void Push(const T& val);
    T Top()const;
    void Pop();

    void Clear();

    bool IsFull()const;
    bool IsEmpty()const;
};

template<typename T>
Stack<T>::Stack() {
    top = -1;
}

template<typename T>
void Stack<T>::Push(const T& val) {
    if (IsFull()) exit(1);
    //未满
    data[++top] = val;
}

template<typename T>
T Stack<T>::Top()const {
    if (IsEmpty()) exit(1);
    //非空
    return data[top];
}

template<typename T>
void Stack<T>::Pop() {
    if (IsEmpty()) exit(1);
    --top;
}

template<typename T>
void Stack<T>::Clear() {
    top = -1;
}

template<typename T>
bool Stack<T>::IsFull()const {
    return top == MAXSIZE - 1;
}
template<typename T>
bool Stack<T>::IsEmpty()const {
    return top == -1;
}
 
class Calculator {
private:
    Stack<int> num;
    Stack<char> ch;//运算符
    
    bool GetTwoOperands(int& left,int& right);
    void Compute();

    void Deal(const string& exp);
public:
    Calculator() {}
    void Run();
    void Clear();//清空数栈以及字符栈
};

void Calculator::Run() {
    string exp;
    cin >> exp;
    Deal(exp);
    while ( !ch.IsEmpty()) {
        Compute();
    }
    cout << "结果:" << num.Top() << endl;
    Clear();
}

void Calculator::Deal(const string& exp) {
    int i(0), n(exp.length());
    bool last = false;
    while (i < n&&exp[i] != '=') {
        if (exp[i] >= '0'&&exp[i] <= '9') {
            if (last) {
                int x = num.Top() * 10 + (exp[i] - '0');
                num.Pop();
                num.Push(x);
            }
            else {
                num.Push(exp[i] - '0');
                last = true;
            }
        }
        else {
            last = false;
            while (!ch.IsEmpty()) {
                int i1 = f(ch.Top());
                int i2 = f(exp[i]);
                if (i1 >= i2)
                    Compute();
                else
                    break;
            }
            ch.Push(exp[i]);
        }
        ++i;
    }
}

计算:

void Calculator::Compute()  {
    bool b;
    int left, right;
    b = GetTwoOperands(left, right);
    if (!b) {
        cout << "Error\n";
        Clear();
    }
    else {
        char op = ch.Top();
        ch.Pop();
        switch (op) {
        case '+':
            left += right;
            break;
        case '-':
            left -= right;
            break;
        case '*':
            left *= right;
            break;
        case '/':
            if (right == 0) {
                cout << "Error\n";
                Clear();
                return;
            }
            left /= right;
            break;
        }
        num.Push(left);
    }
}

// 将运算符优先级转为整数,便于比较
int f(const char& c) {
    if (c == '+' || c == '-') return 1;
    else return 2;
}

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

(0)

相关推荐

  • C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入两个整数和一个运算符,输出运算结果. Input 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. Output 输出对两个数运算后的结果. Example Input 30 50 * Example Output import j

  • C++实现简单计算器

    本文实例为大家分享了C++实现简单计算器的具体代码,供大家参考,具体内容如下 工具 stack map 步骤 初始化 读取字符串 去空格 负号处理 判断为空 检查格式 计算 示例 代码 #include <iostream> #include <string> #include <stdio.h> #include <stack> #include <map> #include <math.h> #include <stdlib

  • C++实现四则混合运算计算器

    本文实例为大家分享了C++实现四则混合运算的计算器,供大家参考,具体内容如下 计算器是带括号的四则运算实际上利用的是栈后进先出的原则 转换思想: #define _CRT_SECURE_NO_WARNINGS 1 #include"stdio.h" #include"stdlib.h" #include"string.h" #define maxsize 1024 typedef struct { float data[maxsize]; int

  • C++有限状态机实现计算器小程序

    本文介绍利用有限状态机原理开发计算器小程序的过程. 实现的功能 支持整数.小数输入 支持+ - * / 四则运算 CE 清除当前操作数 C 清除所有.回到初始状态 回显操作数和结果 HSM状态图 计算器可以分为七种状态:Start.Operand_1.Negate_1.Operator.Operand_2.Negate_2.Error.其中Start.Operand_1.Operand_1状态又分了几种子状态. 下面简要的介绍下状态状态转换的过程: 启动软件,进入Start状态 当用户点击1-9

  • 简单实现C++复数计算器

    本文实例为大家分享了简单实现C++复数计算器的具体代码,供大家参考,具体内容如下 1.有关计算器的功能  A,实现多个复数(包括实数)的加减乘除,大小比较,   B.实现十进制实数的进制转换,可以转换任意进制 2.有关设计的原理  A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较  对于输入输出,(>>和<<),加减乘除运算进行重载.  输入的重载,实现a+bi形式的复数的输入.  输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的).  加减乘除的重载

  • C++实现分数计算器

    分数计算器项目设计,供大家参考,具体内容如下 一.问题描述及功能要求 1.分数计算器程序的每种功能都可以用菜单选项列出,用户可以根据需要选择相应的菜单项,从而执行不同的子程序以完成相应的功能 2.增加运算符重载功能,使所设计的分数计算器可以进行四则运算&幂运算&逻辑运算.四则运算&幂运算可以用菜单选项列出,用户可以根据需要选择相应的运算. 3.程序具有判断功能,当有非法的输入时(如分母等于零等),能给出提示信息并退出运算 4.可将分数化为十进制小数和带分数 5.设计逻辑功能的函数使

  • C/C++实现日期计算器的示例代码

    问题介绍: 今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了. 代码实现: #include<iostream> #include<Windows.h> #include<assert.h> u

  • c++编写简单的计算器程序

    首先来看下本人的开发环境 系统:win7 电脑:dell 运行环境:vs2015 语言:c++ 简单计算器代码 //四则运算 #include "stdafx.h" #include<iostream> #include<stdio.h> using namespace std; void add() { printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >>

  • 基于C++实现简单日期计算器

    基于C++编写的简单的日期计算器,供大家参考,具体内容如下 以下代码是在VS2013下编译运行的: 下面展示我的测试结果: 标题 代码如下: #include<iostream> using namespace std; #include"vld.h"//这个是检测虚拟内存是否泄露,我在这里安装了vld,所以直接用,包含头文件就好了 class Date { public: //构造函数 Date(int year=2018, int month=8, int day=16

  • Python PyQt5实现的简易计算器功能示例

    本文实例讲述了Python PyQt5实现的简易计算器功能.分享给大家供大家参考,具体如下: 这里剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] import sys from PyQt

  • Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+1)*5.1-3+2**2 import re class SimpleCalc(object): # 表达式检测 def check(self,exp): # 合法字符检测 res = re.findall(r"[^\d\+\-\*/\(\)\.]", exp) print(res) i

  • java实现简易计算器功能

    本文为大家分享了java实现简易计算器功能,具体内容如下 题目: 编写一个模拟计算器的程序.在面板中添加一个文本框(显示按键及运算结果). 10个数字按钮(0~9).4个运算按钮(加.减.乘.除).一个等号按钮.一个清除按钮, 要求将按键和结果显示在文本框中. 代码过程展示: import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.Action

  • C#实现简易计算器功能(附源码)

    本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下 剖析: 1.先设计界面(按钮.文本框(一个显示算式,一个显示结果))布局 2.单击按钮将其对应内容显示在文本框中 3.单击符号(+.-.×.÷.%)时将第一次输入的数储存起来 4.单击等号时将第二次输入的数存储起来并将第一次输入的数与第二次输入的数按照所单击的符号进行运算将结果显示在第一个文本框中 5.单击C时将两个文本框中的内容清空 重点: 1.声明一个bool类型的变量用于实现单击符号再次输入数字时第一次输入的数

  • C语言实现简易计算器功能

    本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器).该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个数的加法运算,可进行计算整数和浮点数: 2:减法运算:主要进行两个数的减法运算,可进行计算整数和浮点数: 3:乘法运算:主要进行两个数的乘法运算,可进行计算整数和浮点数: 4:除法运算:主要进行两个数的除法运算,可进行计算整数和浮点数:增加了报错功能,由于除数不可以为0,当用户输入的除数为0的时候,该项目会出提示红色

  • C#实现简易计算器功能(2)(窗体应用)

    本文实例为大家分享了C#实现简易计算器功能第二部分的具体代码,供大家参考,具体内容如下 初始化,实现四则运算 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Sys

  • C#实现简易计算器功能(1)(窗体应用)

    本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下 实现页面布局和数值初始化 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste

  • python实现简易计算器功能

    本文实例为大家分享了python实现简易计算器功能的具体代码,供大家参考,具体内容如下 一.功能目标 用户输入一个类似  1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))  这样的表达式,假设表达式里面除了包含空格.'+'.'-'.'*'.'/'和括号再无其他特殊符号,然后自己动手写代码解析其中的表达式,实现加减乘除,最后得出的结果与真实的计算机所算的结果必须一致. 二.解题思路 1.为了分开运算符和数

  • C++实现简易计算器功能

    本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下 介绍 介绍:仅支持自然数间的+ - * /操作,并没有括号. 实现:利用栈实现存储运算数以及运算符. 流程 1.输入:string exp 2.对EXP进行处理:数字入数栈,运算符入字符栈. 1)栈空,字符入栈 2)栈非空      栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈 3)字符入栈 3.对字符栈检测,非空时进行计算 4.输出:结果. 实现 const int MAXSIZE

  • Python制作简易计算器功能

    本文实例为大家分享了Python制作简易计算器的具体代码,供大家参考,具体内容如下 简易计算器 简易计算器功能: 实现输入,计算,输出功能: 可以计算基本的加减乘除功能: 处理除法中除数不能为零的设计: 处理输入不能为空的设计: 记录历史计算,显示在右边文本框: 不同于之前的两个项目,这个项目的布局是网格布局,窗口的设计比较像,但是实际的网格布局实现过程中也是碰了许多的坑. 窗口 实现最基本的窗口界面 import tkinter as tk import tkinter.messagebox

随机推荐