设计一个模拟计算器的程序,要求能够对包含加、减、乘、除、括号运算符以及SQR和ABS函数的任意整型表达 5

有点复杂... 有点复杂 展开
 我来答
冷灬俊
2011-12-19
知道答主
回答量:1
采纳率:0%
帮助的人:1778
展开全部
你看看 可能有错
#include<iostream>
#include<stack>
#include<cmath>
#include<stdlib.h>
#include<math.h>
#include<string>
using namespace std;
//从a[start]开始到下一个计算符号之间的数字,返回该数字,并将start改成end+1
float find_num(char a[],int n,int& start,int& end)
{
int i,j=0,flag=0;
char num[10]={0};
float a_num;
for(i=start;i<n;i++)
{
if((a[i]<'0'||a[i]>'9')&&a[i]!='.')//a[i]不是数字
{
end=i-1;//end是最后一个数字的下标
start=i-1;//
//if(i==n)
//start=n;
break;
}
else
{
num[j]=a[i];
j++;//此时的num[j]为空
}
}
a_num=atof(num);
return a_num;
}
//Calc计算,
float calc(char a[],int n,int& exception)
{
int i=0,j=0,k=0,end;
float result=0,topnum=0,sign=0;
exception=0;//无异常
stack <float> sta;//第一个(栈顶)是result,第二个是符号,第三个是要与result进行计算的数字
for(i=0;i<n;i++)
{
switch(a[i])
{
case '+':if(sta.size()==1)sta.push(1);break;
case '-':if(sta.size()==1)sta.push(2);break;
case '*':if(sta.size()==1)sta.push(3);break;
case '/':if(sta.size()==1)sta.push(4);break;
case '^':if(sta.size()==1)sta.push(5);break;
default:
if(sta.size()==0)
{
result=find_num(a,n,i,end);
sta.push(result);
}
if(sta.size()==2)
{
topnum=find_num(a,n,i,end);//新数
sign=sta.top();sta.pop();
result=sta.top();sta.pop();
switch((int)sign)
{
case 1:result=result+topnum;sta.push(result);break;
case 2:result=result-topnum;sta.push(result);break;
case 3:result=result*topnum;sta.push(result);break;
case 4:if(topnum==0)
{
exception=1;
return 1.0f;
}
else
{
result=result/topnum;
sta.push(result);
}
break;
case 5:result=pow(result,topnum);sta.push(result);break;
default:break;
}
break;
}
}//switch
}
return result;
}

int main()
{
string st[100];
char str[100];
int i,j,n,tot=0,error[100]={0};
int end=0,start=0,exception=0;
float x[100];
//输入
cin>>tot;
for(i=0;i<tot;i++)
{
cin>>st[i];
n=st[i].length();
for(j=0;j<n;j++)
{
str[j]=st[i][j];
}
x[i]=calc(str,n,exception);
if(exception==1)
{
error[i]=1;
}
}
cout<<endl;
cout<<endl;
//输出
for(i=0;i<tot;i++)
{
if(error[i]==1)
{
cout<<st[i]<<"=error"<<endl;
continue;
}
cout<<st[i]<<"="<<x[i]<<endl;
}

return 0;

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
中国风31
2013-04-10 · 贡献了超过170个回答
知道答主
回答量:170
采纳率:0%
帮助的人:28.1万
展开全部
百度里有计算器
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式