- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++实现简单计算器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了C++实现简单计算器的具体代码,供大家参考,具体内容如下 。
工具 。
步骤 。
示例 。
代码 。
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>
using
namespace
std;
char
op[8][8];
map<
char
,
int
> 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 < 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 +=
" "
;
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.length(); k++)
str[l+k] = s[k];
str[l+s.length()] =
')'
;
}
}
}
str.erase(str.length()-1, 1);
return
str;
}
bool
test(string str)
{
bool
ifOK =
true
;
int
flag = 0;
stack<
char
> s;
int
start, e;
str +=
"#"
;
for
(
int
i = 0; i < str.length(); i++){
//判断非法字符
if
((str[i] <
'0'
|| str[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 < st.length(); j++){
if
(st[j] ==
'.'
) pointNum++;
}
if
(pointNum > 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<
double
> numStack;
//操作数栈
stack<
char
> 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"
);
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/weixin_43673669/article/details/86667243 。
最后此篇关于C++实现简单计算器的文章就讲到这里了,如果你想了解更多关于C++实现简单计算器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我目前正在尝试使用 ParaView Calculator-Filter 将给定的笛卡尔坐标 (x,y,z) 转换为球坐标 (r, theta, phi),其中 theta 是极角,phi 是方位角。
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有这个问题,我想显示如果0/0,输出是:“不能将0除以自身”。如何调整我的代码以便可以显示该输出?如果是这样,我应该使用什么代码才能实现我的目标? 下面是我的代码: #include using
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我第一次尝试 Java。该项目是一个计算器,它需要一个数字、一个运算符(operator)信号(+、-、*、/)和另一个数字来创建方程并给出其最终值,然后询问用户是否要重新启动程序另一个方程或不是
所以我写了这个脚本;它有点像我找到并拼凑起来的计算器的大杂烩。 KeyListener 来自 Java - oracle - .com 网站。顺便说一句,我对此非常陌生,不知道我在做什么。 我正在尝试
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我开始在java中创建一个计算器,我试图循环遍历字符串输入,如果输入中有任何整数,则将它们添加到ArrayList calcOperands中。在 parseInput() 方法中,我使用 charA
我正忙着制作计算器,但不知怎的,整数没有被使用,我不知道为什么。我尝试修复它,但我不知道该怎么做。我使用带有事件的按钮来计算答案,也许有问题。这是我的代码:顺便说一句,我使用 Eclipse
我的主类中有这段代码。我的问题是,GPA 是用总分除以类(class)来计算的。它没有给我完整的号码。 EX,如果总数为 14,类(class)为 4,则为 3.5,我的代码只给我 3.0。有谁知道为
我需要创建一个可以加、减、乘、除、绝对值和舍入的计算器。这是我到目前为止所拥有的 import java.util.Scanner; public class Calculator { pub
我是一名 Java Noob,正在研究 GUI 计算器,但我刚刚来到这里..我已经有了按钮,我需要绑定(bind)这些数字并存储在运算符 ( + - */) 之间的某个位置以显示在我的 JTextAr
这是我的作业。但是,我无法让结果发挥作用。我希望它打印出来为: > 2*7*6 2 * 7 ---- 14 * 6 ---- 84 等等。我希望无论我输入多少个数字,代码都能正常工作
这个问题已经有答案了: What does a "Cannot find symbol" or "Cannot resolve symbol" error mean? (18 个回答) 已关闭 6 年
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
我一直在开发计算器作为自己的学习项目。它工作正常,只是我无法弄清楚如何阻止人们添加应用程序破坏输入,例如 1++-*/4。我尝试了各种方法,例如将当前显示拆分为一个数组,并将其与具有所有运算符的另一个
我是一名优秀的程序员,十分优秀!