社区
C++ 语言
帖子详情
在线等,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)
...全文
249
5
打赏
收藏
在线等,VC中,高分求解:表达式计算的源程序(含三角函数)
高分求解:表达式计算的源程序(含三角函数) 输入:一个字符串(CString类型):sinx-x*x/4;一个实数x(double类型):1.57 输出:计算后的结果:0.38377 求函数 double Compute(CString str,double x)
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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就可以了,至于一般的表达式求法,每一本数据结构书上都有,呵呵。
SAP
VC
实战:用CU01和CS02搞定BOM里的对象相关性(附语法详解)
本文深入解析SAP
VC
中
对象相关性(Object Dependencies)在BOM配置
中
的实战应用,涵盖CU01和CS02操作流程、四种相关性类型详解及语法技巧。通过电脑配置案例演示如何实现智能规则,包括条件显示、自动推荐和验证逻辑,帮助用户高效管理复杂产品配置。
VC
6.0实战指南:从环境配置到多文件项目调试
集成开发环境(IDE)是程序员将源代码转化为可执行程序的核心工具,它通过集成编辑器、编译器、链接器和调试器,简化了软件开发流程。其工作原理是管理源代码文件,调用编译器进行语法检查和词法分析生成目标文件,再通过链接器组合目标文件与库文件,最终生成可执行程序。这一流程对于理解软件构建的本质至关重要,尤其在嵌入式开发和工控领域,掌握经典工具链能有效维护遗留系统。本文聚焦于
VC
6.0这一在特定行业仍有应用的经典IDE,详细解析其环境配置、项目创建、编译链接流程以及多文件项目管理和调试技巧,帮助开发者高效处理历史项目
用
VC
++6.0开发MFC
计算
器:从消息映射到打包发布全解析
Windows桌面开发
中
,消息驱动机制是理解GUI程序运行的核心基础。MFC作为经典框架,将复杂的Win32 API封装为C++类,让开发者能通过对话框和控件快速构建界面。其消息映射表连接了用户操作与代码逻辑,配合对话框数据交换机制,实现了界面与数据的同步。这种模式广泛应用于工具软件、教学演示和业务系统前端。
VC
++6.0作为早期集成开发环境,凭借简洁的工程管理和直观的ClassWizard,成为许多程序员入门Windows应用的起点。以
计算
器为练手项目,不仅能掌握控件布局、状态管理、异常处理等工程实践,还
MFC科学
计算
器实战:从RPN
表达式
解析到对话框消息映射与静态打包
表达式
求值是编程语言和桌面工具
中
的基础技术,通常需要处理运算符优先级、括号和函数调用。逆波兰
表达式
(RPN)通过将
中
缀转换为后缀,把复杂的优先级问题转化为简单的栈操作,成为科学
计算
器核心解析逻辑的经典实现。在Visual Studio环境下,利用MFC对话框框架可快速构建带界面的Windows
计算
器,将RPN解析器嵌入按钮事件与对话框消息映射之
中
。文章从Token拆分、优先级表、
中
缀转后缀、后缀求值逐步展开,结合控件布局、键盘输入和错误捕获,最后讲解静态链接MFC与CRT实现免依赖发布。整个实现过程打通了算
C++与QT科学
计算
器:递归下降
表达式
解析与工程实践
科学
计算
器远比普通四则运算复杂,核心在于
表达式
求值引擎的设计,而非只是按钮交互。在图形界面开发
中
,C++与QT的工程实践常遇到信号槽连接、界面与逻辑分离等问题。采用递归下降解析算法,可以自然地处理运算符优先级、括号嵌套和一元负号,使
计算
引擎具备精确错误定位与可扩展性。结合QT提供的QGridLayout布局、QSaveFile原子写入历史记录以及QFutureWatcher后台
计算
,可构建出响应流畅、数据安全的桌面应用。此类技术广泛用于工程
计算
器、教育软件和嵌入式控制面板等场景。本文以科学
计算
器为实例,系统
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章