在线等,VC中,高分求解:表达式计算的源程序(含三角函数)

cbc 2005-05-30 12:09:19
高分求解:表达式计算的源程序(含三角函数)
输入:一个字符串(CString类型):sinx-x*x/4;一个实数x(double类型):1.57
输出:计算后的结果:0.38377

求函数
double Compute(CString str,double x)
...全文
202 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mostideal 2005-05-31
  • 打赏
  • 举报
回复
学习。。
nasi00 2005-05-31
  • 打赏
  • 举报
回复
我有可以算表达式的程序,你拿回去改改咯

#include <iostream>
using namespace std;

#include <stack>
#include <string>
#include <cstdlib>

void init(string& s)
{
getline(cin,s);
s+="@";
}

bool is_optr(char c)
{
string optr_list("+-*/()@");
for(int i=0;i<optr_list.size();i++)
if(c==optr_list[i])
return true;
return false;
}

char first(char op1, char op2)
{
string tab[7];
tab[0]=">><<<>>";
tab[1]=">><<<>>";
tab[2]=">>>><>>";
tab[3]=">>>><>>";
tab[4]="<<<<<=E";
tab[5]=">>>>E>>";
tab[6]="<<<<<E=";
string optr_list("+-*/()@");

int op1_loc, op2_loc;

for(op1_loc=0;op1_loc<optr_list.size();op1_loc++)
if(optr_list[op1_loc]==op1)
break;
for(op2_loc=0;op2_loc<optr_list.size();op2_loc++)
if(optr_list[op2_loc]==op2)
break;

return tab[op1_loc][op2_loc];
}

double operate(double x, char op, double y)
{
switch(op) {
case '+':
return x+y;
break;
case '-':
return x-y;
break;
case '*':
return x*y;
break;
case '/':
return x/y;
break;
}
return -1;
}

double calc(string& s)
{
stack<char> optr;
optr.push('@');
stack<double> opnd;

char c=s[0];
s.erase(0,1);

while( c!='@' || optr.top()!='@' ) {
if( !is_optr(c) ) {
string num;

num.insert(num.begin(), c);
int loc=0;
while( !is_optr(s[loc]) )
loc++;

string num2(s,0,loc);
num+=num2;
s.erase(0,loc);

double x=atof(num.c_str());
opnd.push(x);
c=s[0];
s.erase(0,1);
}
else {
switch( first(optr.top(), c) ) {
case '<':
optr.push(c);
c=s[0];
s.erase(0,1);
break;
case '=':
optr.pop();
c=s[0];
s.erase(0,1);
break;
case '>':
char op;
op=optr.top();
optr.pop();

double a,b;
a=opnd.top();
opnd.pop();
b=opnd.top();
opnd.pop();

double res;
res=operate(b,op,a);
opnd.push(res);

break;
}
}
}

return opnd.top();
}

int main()
{
string exp;
double ans;

init(exp);
ans=calc(exp);
cout<<ans<<endl;

return 0;
}
useresu 2005-05-30
  • 打赏
  • 举报
回复
有点难度
觉的最好是换成前缀或后缀表达式,
然后压栈,
不是很懂,

mark!!!
foochow 2005-05-30
  • 打赏
  • 举报
回复
mark!!!
积木 2005-05-30
  • 打赏
  • 举报
回复
如果楼主比较清楚没有函数调用的后缀表达式转换方法,那就很简单了,实际上这个也不难,在处理表达式为后缀表达的时候直接计算sinx就可以了,至于一般的表达式求法,每一本数据结构书上都有,呵呵。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧