用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负号),跪求 5
4个回答
2019-09-21
展开全部
#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
————————————————
版权声明:本文为CSDN博主「形同陌路kk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38130938/article/details/79531846
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个必将难啊,这个得要用数据结构的那个栈,至少还得要要两个,算法还不简单,提高分吧!
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询