如何解决计算器程序,可以将计算结果存储在变量中
我编写了这个简单的计算器程序,用户可以在其中将计算结果存储在输入的变量中。我不知道如何更好地解释这一点,因此我将通过一个示例进行演示。如果输入是:
a = 1 + 2
b = 6 - 5
c = 20 * a
d = a / b
exit
然后输出应为:
3
1
60
3
查看程序如何将a = 1 + 2
的值保留为a = 3
。然后,用户可以在其他计算中自由使用a
。例如,20 * a
。从a = 3
开始,20 * a
应该等于60
。
但是,我的程序有问题。如果我输入以下内容:
a = 1 + 2
b = a + 3
c = a + b
d = 20 * a
然后我在第3行和第4行的输出中遇到问题。我得到的输出如下所示:
3
6
55
您可以看到a + b = 55
应该在9
时出现。当我尝试乘以20 * a
时,我什至没有输出。我假设最后一行没有输出,因为它甚至没有在代码中输入乘法。但是不知道55
的来源。
这是我的代码(我知道它很杂乱,但这是因为我已尽一切努力解决了这个问题,但我没有运气):
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <sstream>
#include <string>
using namespace std;
char op='a';
double num1,num2,num3=0;
int sub1,sub2=0;
std::string temp;
int main() {
double var[26];
bool flag = false;
char eq[5];
while (true) {
getline(cin,temp);
if (temp.compare("exit") == 0) {
break;
}
std::stringstream os(temp);
int count = 0;
for(char& c : temp) {
if(c != ' '){
eq[count] = c;
count++;
}
}
/* for(std::string::size_type i = 0; i < temp.size(); ++i){
if(temp[i] != ' '){
eq[count] = temp[i];
count++;
}
}
*/
if(eq[0] >= 97 && eq[0] <= 122){
num1 = eq[2] - 48;
op = eq[3];
num2 = eq[4] - 48;
flag = true;
}
else{
num1 = eq[0] - 48;
op = eq[1];
num2 = eq[2] - 48;
}
switch (op) {
case '+':
if(flag == true){
var[eq[0] - 97] = num1 + num2;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48 - 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48 - 97];
}
cout << num1 + num2 << endl;
break;
case '-':
if(flag == true){
var[eq[0] - 97] = num1 - num2;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48- 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48- 97];
}
cout << num1 - num2 << endl;
break;
case '*':
if(flag == true){
var[eq[0] - 97] = num1 * num2;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48- 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48- 97];
}
cout << num1 * num2 << endl;
break;
case '/':
if(flag == true){
var[eq[0] - 97] = num1 / num2;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48- 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48- 97];
}
cout << num1 / num2 << endl;
break;
case '%':
sub1 = num1;
sub2 = num2;
if(flag == true){
var[eq[0] - 97] = sub1 % sub2;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48- 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48- 97];
}
cout << sub1 % sub2 << endl;
break;
case '^':
if(flag == true){
var[eq[0] - 97] = pow(num1,num2);
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48- 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48- 97];
}
cout << pow(num1,num2) << endl;
break;
}
}
return 0;
}
我认为问题出在for循环中,这就是为什么您看到一个for循环被设置为注释的原因。我尝试用另一个for循环替换它,但是没有运气。由于我尝试了很多事情,但没有任何效果,因此我将不胜感激。我会在这里放一些我尝试过的东西,但是我不想再发表这个帖子。如果您需要更多信息,请告诉我。
解决方法
应该在执行进一步操作之前从var
数组中加载值,因此,在解析该行之后,立即像这样加载它们
if(eq[0] >= 97 && eq[0] <= 122){
num1 = eq[2] - 48;
op = eq[3];
num2 = eq[4] - 48;
flag = true;
}
else{
num1 = eq[0] - 48;
op = eq[1];
num2 = eq[2] - 48;
}
if((int)num1 >= 48 && (int)num1 <= 57){
num1 = var[(int)num1 + 48 - 97];
}
if((int)num2 >= 48 && (int)num2 <= 57){
num2 = var[(int)num2 + 48 - 97];
}
在开关块内部,您可以直接执行操作,例如。对于'+'情况:
case '+':
if(flag == true){
var[eq[0] - 97] = num1 + num2;
}
cout << num1 + num2 << endl;
break;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。