用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负号),跪求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负号),跪求相关的知识,希望对你有一定的参考价值。

(支持加减乘除混合运算,支持括号,倒数,正负号),跪求在线等

#include "stdafx.h"#include <iostream>#include <stack>#include <string> using namespace std;stack <double> num;stack <char> op;void dealString(string my) //字符串转数字操作符进栈 double Nownum = 0; for (int i = 0; i<my.length(); i++) if (my[i] >= '0'&&my[i] <= '9') Nownum *= 10; Nownum += my[i] - '0'; else num.push(Nownum); Nownum = 0; op.push(my[i]); ; num.push(Nownum);int inPriority(char a) //操作符优先级判断函数 switch (a) case '*': case '/': return 2; case '+': case '-': return 1; case '(': return 3; case ')': return 4; default: cout << "error" << endl; return -1; double dealNum(double n1, double n2, char op) //数字处理函数 switch (op) case '+': return n2 + n1; case '-': return n2 - n1; case '*': return n2*n1; case '/': return n2 / n1; default: return 0; double cal() double num1, num2, num3 = 0; char op1, op2; num1 = num.top(); num.pop(); num2 = num.top(); num.pop(); op1 = op.top(); op.pop(); while (op.size()>0) if (inPriority(op1) == 4) //判断是否为右括号 num.push(num2); num1 = cal(); if (op.size()>0) num2 = num.top(); num.pop(); op1 = op.top(); op.pop(); if (op.size() == 0) return dealNum(num1, num2, op1); else return num1; break; if (inPriority(op.top()) == 4) op.pop(); num2 = cal(); if (op.size() == 0) return dealNum(num1, num2, op1); if (inPriority(op1) == 3) //判断是否为左括号 return num1; if (inPriority(op.top()) == 3) num.pop(); op.pop(); return dealNum(num1, num2, op1); if (inPriority(op1)>inPriority(op.top())) //判断优先级并计算 num1 = dealNum(num1, num2, op1); num2 = num.top(); num.pop(); op1 = op.top(); op.pop(); else num2 = dealNum(num2, num.top(), op.top()); num.pop(); op.pop(); return dealNum(num1, num2, op1);int main() while (1) //循环输入,结束直接关闭即可 string my; cout << "输入算式: " << endl; getline(cin, my); dealString(my); cout << "结果为: " << cal() << endl << endl;
————————————————
版权声明:本文为CSDN博主「形同陌路kk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38130938/article/details/79531846
参考技术A #include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<iomanip>

using namespace std;

string skipblacks(string str) //忽略空格

string return_str="";
int length=str.length();
for(int i=0;i<length;i++)
if(str[i]!=' ')
return_str+=str[i];
return return_str;


string str_dele(string s,int m) //删除字符串str的第m个字符

int len=s.length();
char temp_str[100];

if(m>len)
cout<<"删除的位置不对!"<<endl;
else

int j = 0;
for(int i = 0;i<s.size();i++)

if(i==m-1)
continue;
else
temp_str[j++]=s[i];


for(int i=0,j=0;j<len-1;)
s[j++]=temp_str[i++];
string sn = "";
for(int i = 0;i<s.size()-1;++i)
sn += s[i];
return sn;


vector<double> renew(vector<double> num,double tmpresult,int i)

vector<double> vnew;
for(int j = 0;j<i;++j)
vnew.push_back(num[j]);
vnew.push_back(tmpresult);
if(i < num.size()-2)
for(int j = i + 2;j<num.size();++j)
vnew.push_back(num[j]);

return vnew;


vector<char> clearchch(vector<char> vch) //去除乘号除号

vector<char> nvch;
for(int i = 0;i<vch.size();++i)
if(vch[i] != '*'&&vch[i] != '/')
nvch.push_back(vch[i]);

return nvch;


int main()

string str;
vector<double> result;//保存结果
while(getline(cin,str))

if(str == "0")
break;
vector<char> vch;
vector<int> vi;
string s = skipblacks(str);//忽略字符串中的空格

for(int i = 0;i<s.size();++i)

if((s[i]=='+')|(s[i]=='-')|(s[i]=='*')|(s[i]=='/'))
vch.push_back(s[i]); //保存运算符哈
else if(s[i]>='0'&&s[i]<='9')
vi.push_back(s[i]-'0'); //保存数字


string ns = s;
vector<double> vpos;//记录运算符号在原字符串中的位置
vector<double> vnum;//记录每个数的位数
for(int i = 0;i<vch.size();++i)

size_t pos = ns.find(vch[i]);
ns = str_dele(ns,pos+1);
vpos.push_back(pos+i+1);


vnum.push_back(vpos[0]-1);
for(int i = 0;i<vpos.size()-1;++i)
vnum.push_back(vpos[i+1]-vpos[i]-1);

double tmpsum = 0;
for(int i = 0;i<vnum.size();++i)
tmpsum += vnum[i];
double tmps = s.size()-vch.size()-tmpsum;
vnum.push_back(tmps);

vector<double> num;//将vi转化为数字
double tmpn = 0;
for(int i = 0;i<=vch.size();++i)

double sum = 0;
tmpn += vnum[i];
for(int j = 0;j<vnum[i];++j)
sum += vi[j+tmpn-vnum[i]]*pow(10,vnum[i]-1-j);
num.push_back(sum);


vector<double> vnew = num;
int ccnt = 0;
for(int i = 0;i<vch.size();++i)

if((vch[i] == '*')|(vch[i] == '/'))

double tmpresult;
if(vch[i] == '*')
tmpresult = num[i]*num[i+1];
else
tmpresult = num[i]/num[i+1];
vnew = renew(vnew,tmpresult,i-ccnt);//更新结果
++ccnt; //统计已经计算过多少个*和/。



vector<char> nvch = clearchch(vch);//去除乘号和除号只剩下加减号
double restmp = vnew[0];
for(int i = 0;i<nvch.size();++i)

if(nvch[i] == '+')
restmp = restmp + vnew[i+1];
else
restmp = restmp - vnew[i+1];

result.push_back(restmp);

for(int i = 0;i<result.size();++i)
cout<<fixed<<setprecision(2)<<result[i]<<endl; //保留两位小数

system("pause");

return 0;
参考技术B 这个必将难啊,这个得要用数据结构的那个栈,至少还得要要两个,算法还不简单,提高分吧! 参考技术C 我也不会

以上是关于用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负号),跪求的主要内容,如果未能解决你的问题,请参考以下文章

html加减乘除混合运算,支持小数,四个输入框、点击计算,可以输出结果。求大神来一个实例啊

用shell做个加减乘除运算

基于MFC的含四则混合运算的计算器

基于c可以随机生成四则运算的小程序

c++链表类模板问题(不要用c语言,用c++)

[C++]利用逆波兰式,简单实现下加减乘除的混合运算