热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++实现简单计算器

这篇文章主要为大家详细介绍了C++实现简单计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

工具

  • stack
  • map

步骤

  • 初始化
  • 读取字符串
  • 去空格
  • 负号处理
  • 判断为空
  • 检查格式
  • 计算

示例

代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

char op[8][8];
map m;
void init()
{
 m['+'] = 1, m['-'] = 2, m['*'] = 3, m['/'] = 4, m['('] = 5, m[')'] = 6, m['#'] = 7;
 op[1][1] = '>', op[1][2] = '>', op[1][3] = '<', op[1][4] = '<', op[1][5] = '<', op[1][6] = '>', op[1][7] = '>';
 op[2][1] = '>', op[2][2] = '>', op[2][3] = '<', op[2][4] = '<', op[2][5] = '<', op[2][6] = '>', op[2][7] = '>';
 op[3][1] = '>', op[3][2] = '>', op[3][3] = '>', op[3][4] = '>', op[3][5] = '<', op[3][6] = '>', op[3][7] = '>';
 op[4][1] = '>', op[4][2] = '>', op[4][3] = '>', op[4][4] = '>', op[4][5] = '<', op[4][6] = '>', op[4][7] = '>';
 op[5][1] = '<', op[5][2] = '<', op[5][3] = '<', op[5][4] = '<', op[5][5] = '<', op[5][6] = '=';
 op[6][1] = '>', op[6][2] = '>', op[6][3] = '>', op[6][4] = '>', op[6][6] = '>', op[6][7] = '>';
 op[7][1] = '<', op[7][2] = '<', op[7][3] = '<', op[7][4] = '<', op[7][5] = '<', op[7][7] = '=';
}
double operate(double num1, char oper, double num2)
{ 
 if(oper == '+')
 return num1 + num2;
 if(oper == '-')
 return num1 - num2;
 if(oper == '*')
 return num1 * num2;
 if(oper =='/')
 return num1 / num2;
}
string trim(string str)
{
 index = 0;
 if(!str.empty()){
 while((index = str.find(' ',index) != string::nops)
 str.erase(index,1);
 }
 return str;
}
string change(string str)
{
 int start;
 start += "#";
 for(int i = 0; i = 1 && m[str[i-1]] <= 5
 && str[i+1] >= '0' && str[i+1] <= '9'){
 str += " ";
 int j = i+1;
 start = j;
 while(m[str[j]] == 0)
 j++;
 
 for(int k = str.length() - 1; k >= j; k--)
 str[k] = str[k-3];
 
 str[i] = '(', str[i+1] = '0', str[i+2] = '-';
 
 int l = i+3;
 string s = str.substr(start, j - start);
 for(int k = 0; k  s;
 int start, e;
 str += "#";
 for(int i = 0; i  '9') && m[str[i]] == 0 && str[i] != '.')
 return false;
 if(str[i] == '#' && i!= str.length()-1)
 return false;

 //判断小数点
 if(m[str[i]] == 0){
 if(flag == 0){
 start = i;
 flag = 1;
 }
 }
 if(m[str[i]] != 0){
 if(flag == 1){
 e = i;
 string st = str.substr(start, e - start);
 int pointNum = 0;
 if(st[0] == '.') return false;
 for(int j = 0; j  1) return false;
 
 }
 flag = 0;
 }

 //判断运算符
 if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/'){
 if(i == 0) return false;
 if((str[i-1] <'0' || str[i-1] > '9') && str[i-1] != ')') return false;
 if((str[i+1] <'0' || str[i+1] > '9') && str[i+1] != '(') return false;
 }

 //判断括号
 if(str[i] == '(')
 s.push(str[i]);
 if(str[i] == ')'){
 if(s.empty()) return false;
 char c = s.top();
 if(c == '(')
 s.pop();
 else
 return false;
 }
 }
 //判断括号
 if(!s.empty())
 ifOK = false;
 return ifOK;

}

void caculate(string str)
{
 str += "#";
 int flag = 0;
 int start, e;
 stack numStack;//操作数栈
 stack operStack;//运算符栈
 operStack.push('#');
 int i = 0;

 while(str[i] != '#' || operStack.top() != '#'){
 if(m[str[i]] == 0){
 if(flag == 0){
 start = i;
 flag = 1;
 }
 }
 else{
 if(flag == 1){
 e = i;
 //string 转 double
 stringstream s (str.substr(start, e - start));
 double num;
 s >> num;
 
 numStack.push(num);
 flag = 0;
 }
 char c = operStack.top;
 if(op[m[c]][m[str[i]]] == '<'){
 operStack.push(str[i]);
 i++;
 }
 else if(op[m[c]][m[str[i]]] == '='){
 operStac.pop();
 i++;
 }
 else{
 char oper = operStack.top();
 operStac.pop();
 double num2 = numStack.top();
 numStack.pop();
 double num1 = numStack.top();
 numStack.pop();
 double result = operate(num1, oper, num2);
 numStack.push(result);
 }
 }
 
 }
 printf("\t\t\t= %f\n",numStack.top());
 
}
int main()
{
 init();//初始化
 printf("\n\n\n\t\t\t请输入表达式, 退出请输入end:\n");
 string s;
 getline(cin, s, "\n");//读取字符串
 s = trim(s);//去空格
 s = change(s);//处理负号
 if(s == "end"){
 break;
 }
 else if(s.length() > 0){//判断为空
 if(!test(s))//检查格式
 printf("\t\t\t格式错误\n");
 else
 caculate(s);//计算
 }
 else{
 printf("\t\t\t输入不能为空\n");
 }
}

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


推荐阅读
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文将详细介绍在Windows 7环境下,检查U盘启动盘是否制作成功的多种方法,包括通过BIOS设置和使用模拟启动工具。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
author-avatar
采蘑菇的灵的fans
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有