当前位置: 首页 > news >正文

C++实现简单计算器

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

工具

  • stack
  • map

步骤

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

示例

代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

#include <iostream>

#include <string>

#include <stdio.h>

#include <stack>

#include <map>

#include <math.h>

#include <stdlib.h>

#include <sstream>

usingnamespacestd;

charop[8][8];

map<char,int> m;

voidinit()

{

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] ='=';

}

doubleoperate(doublenum1,charoper,doublenum2)

{

if(oper =='+')

returnnum1 + num2;

if(oper =='-')

returnnum1 - num2;

if(oper =='*')

returnnum1 * num2;

if(oper =='/')

returnnum1 / num2;

}

string trim(string str)

{

index = 0;

if(!str.empty()){

while((index = str.find(' ',index) != string::nops)

str.erase(index,1);

}

returnstr;

}

string change(string str)

{

intstart;

start +="#";

for(inti = 0; i < str.length(); i++){

if(str[i] =='-'){

if(i == 0 || i != 0 && (m[str[i-1]] >= 1 && m[str[i-1]] <= 5

&& str[i+1] >='0'&& str[i+1] <='9'){

str +=" ";

intj = i+1;

start = j;

while(m[str[j]] == 0)

j++;

for(intk = str.length() - 1; k >= j; k--)

str[k] = str[k-3];

str[i] ='(', str[i+1] ='0', str[i+2] ='-';

intl = i+3;

string s = str.substr(start, j - start);

for(intk = 0; k < s.length(); k++)

str[l+k] = s[k];

str[l+s.length()] =')';

}

}

}

str.erase(str.length()-1, 1);

returnstr;

}

booltest(string str)

{

boolifOK =true;

intflag = 0;

stack<char> s;

intstart, e;

str +="#";

for(inti = 0; i < str.length(); i++){

//判断非法字符

if((str[i] <'0'|| str[i] >'9') && m[str[i]] == 0 && str[i] !='.')

returnfalse;

if(str[i] =='#'&& i!= str.length()-1)

returnfalse;

//判断小数点

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);

intpointNum = 0;

if(st[0] =='.')returnfalse;

for(intj = 0; j < st.length(); j++){

if(st[j] =='.') pointNum++;

}

if(pointNum > 1)returnfalse;

}

flag = 0;

}

//判断运算符

if(str[i] =='+'|| str[i] =='-'|| str[i] =='*'|| str[i] =='/'){

if(i == 0)returnfalse;

if((str[i-1] <'0'|| str[i-1] >'9') && str[i-1] !=')')returnfalse;

if((str[i+1] <'0'|| str[i+1] >'9') && str[i+1] !='(')returnfalse;

}

//判断括号

if(str[i] =='(')

s.push(str[i]);

if(str[i] ==')'){

if(s.empty())returnfalse;

charc = s.top();

if(c =='(')

s.pop();

else

returnfalse;

}

}

//判断括号

if(!s.empty())

ifOK =false;

returnifOK;

}

voidcaculate(string str)

{

str +="#";

intflag = 0;

intstart, e;

stack<double> numStack;//操作数栈

stack<char> operStack;//运算符栈

operStack.push('#');

inti = 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));

doublenum;

s >> num;

numStack.push(num);

flag = 0;

}

charc = operStack.top;

if(op[m[c]][m[str[i]]] =='<'){

operStack.push(str[i]);

i++;

}

elseif(op[m[c]][m[str[i]]] =='='){

operStac.pop();

i++;

}

else{

charoper = operStack.top();

operStac.pop();

doublenum2 = numStack.top();

numStack.pop();

doublenum1 = numStack.top();

numStack.pop();

doubleresult = operate(num1, oper, num2);

numStack.push(result);

}

}

}

printf("\t\t\t= %f\n",numStack.top());

}

intmain()

{

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;

}

elseif(s.length() > 0){//判断为空

if(!test(s))//检查格式

printf("\t\t\t格式错误\n");

else

caculate(s);//计算

}

else{

printf("\t\t\t输入不能为空\n");

}

}

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

http://www.jsqmd.com/news/722597/

相关文章:

  • 异或的密件 - Writeup by AI
  • 2026 AI存储行业迎来关键时刻:英伟达“补课”,华为存储“解题”
  • 畅百岁白酒哪家技术强
  • # Linux Shell 编程入门 Day02:条件测试、if 判断、循环与随机数
  • [Al+」数智升级,品牌种草营销新范式
  • 2026年3月评价高的钻攻机供应厂家推荐,多米钻攻一体机/圆管钻孔攻牙机/五轴钻床/数控钻攻一体机,钻攻机厂家哪家强 - 品牌推荐师
  • GKMLT通讯工具箱(WPF MVVM) - 02-Modbus RTU 与 TCP 报文格式、原理与CRC校验
  • 高并发场景下委托内存暴增?C# 13三大优化机制(静态委托缓存、目标弱引用、结构化闭包)全公开(仅限.NET 8.0+)
  • 大数据开发场景下,总结并翻译 Oracle 中常见的错误(补充其他错误码:适合初学者)
  • IG502边缘网关:空压机预测性维护的轻量化方案
  • 如何彻底解决电脑风扇噪音?Fan Control终极指南帮你实现静音与散热的完美平衡
  • 揭秘书匠策AI:论文降重与AIGC防御的“独门秘籍”
  • Figma设计自动化:用rules-figma实现设计规范检查与团队协作提效
  • 2026年正宗新会陈皮排行:3个合规品牌的硬参数对比 - 优质品牌商家
  • 视频数据集安全防护:基于聚类的智能防泄漏方案
  • ARMv9内存管理:PAR_EL1寄存器详解与应用
  • Go 语言从入门到进阶 | 第 22 章:日志与可观测性
  • 收藏必备!小白程序员轻松掌握RAG大模型,让你的AI秒懂公司文档!
  • 仅剩72小时!.NET 9正式版边缘部署黄金窗口期关闭前,必须完成的5项Runtime裁剪与符号剥离操作
  • Unity游戏实时翻译终极指南:XUnity.AutoTranslator深度技术解析
  • Python金融数据获取革命:efinance如何成为量化交易的最佳数据助手
  • 新联合众香港展会圆满落幕,AI融合硬件矩阵获全球瞩目
  • ARM MPAM内存带宽控制机制详解与配置实践
  • 服务器3个设置需配置好!王杨游戏蜘蛛养站系统seo站长要做的!
  • 天辛大师再谈人工智能时代,一人公司真的符合社会学演进规律吗
  • journalctl -xe -u k3s 命令详解
  • 为什么92%的PHP团队低估了PHP 8.9的类型校验强度?——基于Zend Engine v4.9.0源码级行为对比分析
  • TVA在新能源汽车制造与检测中的实践与创新(3)
  • ARM架构Hypervisor调试机制与安全隔离实践
  • .NET 9云原生迁移倒计时:仅剩120天——.NET 6 LTS终止支持前必须完成的5项容器化加固动作