C++.实现简易的四则运算计算器
Posted 归止于飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++.实现简易的四则运算计算器相关的知识,希望对你有一定的参考价值。
文章目录
C++.简易计算器的实现
1 前言
为了巩固自己的C++知识点,写了一个简易的四则运算计算器。尤其多用到了一些简单的数据结构与STL标准库的模板。
1.1 知识点
- vector、string、map、stack的使用
- 中缀表达式转后缀表达式
- 对后缀表达式的计算
2 实现流程
2.1 简单的流程图
2.2 主要函数
- Despace,去除输入字符串中的空格
- Convert,对表达式进行转换
- Caculate,对后缀表达式进行计算
2.3 其它注意点
- 利用map实现运算符的优先级(这里也可以使用函数与switch语句)
- Convert函数中使用中转字符串,“当下一字符为符号或NULL时,将数字压入vetcor”
为什么使用vector存储后缀表达式?
这里的vector存储的是string元素,如果直接以string输出,每一个元素是char类型,将不适合参与计算。使用string后可以使用函数stoi与to_string进行字符串与整数的转换。
3 代码分析
3.1 头文件head.h
#ifndef HEAD_H_
#define HEAD_H_
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <map>
using namespace std;
//空格的去除
void Despace(string &s);
//中缀表达式转后缀
vector<string> Convert(string &s);
//对后缀表达式进行计算
void Calculate(vector<string> &s);
#endif
3.2 函数实现 head.cpp
#include"head.h"
map<char,int> smap =
'*',3,
'/',3,
'+',2,
'-',2,
'(',1
;//存储运算符优先级
//空格的去除
void Despace(string &s)
int index = 0;
if (!s.empty())
while ((index = s.find(' ', index)) != string::npos)
s.erase(index, 1);
//中缀表达式转后缀,注意返回值为vector
vector<string> Convert(string &s)
vector<string> v;//转换后输出的向量
stack<char> sstack;//中转栈
string nums = "0123456789";
string oper_ = "+-*/()";
string st = ""; //中转字符串
for (int i = 0;i < s.size();i++)
if (nums.find(s[i]) != string::npos)
st = st + s[i];
if (oper_.find(s[i + 1]) != string::npos || s[i + 1] == NULL)
v.push_back(st);
st = "";
else if (s[i] == '(')
sstack.push(s[i]);
else if (s[i] == ')')
char temp = sstack.top();
sstack.pop();
if (temp != '(')
st = "";
st = st + temp;
v.push_back(st);
temp = sstack.top();
sstack.pop();
else
while (sstack.empty() == false && smap[sstack.top()] >= smap[s[i]])
st = "";
st = st + sstack.top();
v.push_back(st);
sstack.pop();
sstack.push(s[i]);
while (sstack.empty() == false)
st = "";
st = st + sstack.top();
sstack.pop();
v.push_back(st);
return v;
//对后缀表达式进行计算
void Calculate(vector<string> &v)
string st;
int x, y, z;
stack<string> sstack;
string oper_ = "+-*/";
for (int i = 0;i < v.size();i++)
if (oper_.find(v[i]) != string::npos)
x = std::stoi(sstack.top());
sstack.pop();
y = std::stoi(sstack.top());
sstack.pop();
if (v[i] == "+")
z = x + y;
st = to_string(z);
sstack.push(st);
else if (v[i] == "-")
z = x - y;
st = to_string(z);
sstack.push(st);
else if (v[i] == "*")
z = x * y;
st = to_string(z);
sstack.push(st);
else if (v[i] == "/")
z = x / y;
st = to_string(z);
sstack.push(st);
else
sstack.push(v[i]);//将string类型的数字压入栈中
st = sstack.top();
cout << st;
3.3 main主函数
#include"head.h"
int main()
string s;
vector<string> v;
cout << "请输入四则运算的值:";
getline(cin, s);
Despace(s);
v = Convert(s);
Calculate(v);
getchar();
return 0;
4 运行截图
5 总结
本次小项目让我更加熟练了数据结构与C++的STL库,但是也发现了我对这些模板的运用不够熟练,以及项目开发经验较少。接下来打算阅读《STL源码剖析》。此外,我将会把计算器完善,使用Qt将界面UI设计好,并扩充计算器功能。
以上是关于C++.实现简易的四则运算计算器的主要内容,如果未能解决你的问题,请参考以下文章
C语言计算器 功能要求: 可以输入0-9数字、小数点、正负数 可以进行加减乘除运算及简单的数学函数运算?