展开全部
我刚刚做完这个课程设计,给你吧
#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;
}
#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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果有偿我就帮你写了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我只学过c
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询