编写程序对表达式求值C语言

yyfyuyefei 2012-08-22 11:22:17
编写程序对表达式求值:
例如
终端上显示的内容:
Enter an expression:1+2.5*3
valus of expression:10.5

表达式中的操作数是浮点数,运算符是+,—,*,\,表达式从左向右求值(所有运算符的优先级都一样)


求代码。
...全文
1158 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010246538 2013-04-10
  • 打赏
  • 举报
回复
#include<stdio.h> typedef struct stack1 { char s[20]; int top; }s1; typedef struct stack2 { int s[20]; int top; }s2; s1 OPTR; s2 OPND; void InitStack1(s1 *st) { st->top=0; } void InitStack2(s2 *st) { st->top=0; } void push1(s1 *st,char c) { st->s[st->top]=c; st->top++; } void push2(s2 *st,int c) { st->s[st->top]=c; st->top++; } char GetTop1(s1 *st) { if(st->top=0) return('w'); else return (st->s[st->top-1]); } int GetTop2(s2 *st) { if(st->top=0) return('w'); else return (st->s[st->top-1]); } int In(char c) { if(c>='0'&&c<='9') return 0; else return 1; } char B[7]={'+','-','*','/','(',')','#'}; char A[7][7]={{'>','>','<','<','<','>','<'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','@'}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<','@','='}}; int search(char c) { int i=0; while(c!=B[i]) { i++; } return (i); } char Precede(char c1,char c2) { int i,j; i=search(c1); j=search(c2); return (A[i][j]); } char pop1(s1 *st) { if(st->top=0) return('w'); else { st->top--; return (st->s[st->top]); } } int pop2(s1 *st) { if(st->top=0) return('w'); else { st->top--; return (st->s[st->top]); } } int operate(int a,char op,int b) { switch(op) { case '+':return (a+b); case '-':return (a-b); case '*':return (a*b); case '/':return (a/b); } } void main() { char c,op; int a,b,x; printf("请输入要进行计算的表达式,并以#结束。\n"); InitStack1(&OPTR); InitStack2(&OPND); push1(&OPTR,'#'); c=getchar(); while(c!='#'||GetTop2(&OPND)!='#') { if(!In(c)) { push2(&OPND,c-'0'); c=getchar(); } else switch(Precede(GetTop1(&OPTR),c)){ case '<': push1(&OPTR,c); c=getchar(); break; case '=': x=pop1(&OPTR); c=getchar(); break; case '>': op=pop1(&OPTR); b=pop2(&OPND); a=pop2(&OPND); push2(&OPND,operate(a,op,b)); break; } } // result=; printf("结果是:%d",GetTop2(&OPND)); } 这是我写的表达式求值的程序,运行的时候没有结果 请求帮助。
yyfyuyefei 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
#include<stdio.h>

main()
{
float a,b,c;
char ch1,ch2;
float fun(float,float,char);

printf("Enter an expression:");
scanf("%f%c%f%c%f",&a,&ch1,&b,&ch2,&c);

fun(a,b,ch1……
[/Quote]九楼简单易懂啊,虽然只能计算出三个数的,但提供了一种思路,很好。
wangyunbo158 2012-08-26
  • 打赏
  • 举报
回复
#include<stdio.h>

main()
{
float a,b,c;
char ch1,ch2;
float fun(float,float,char);

printf("Enter an expression:");
scanf("%f%c%f%c%f",&a,&ch1,&b,&ch2,&c);

fun(a,b,ch1);

printf("valus of expression:%6.1f\n",fun(fun(a,b,ch1),c,ch2));
return 0;

}

float fun(float x,float y,char ch)
{
switch (ch)
{
case '+' :
{
return (x+y);
}break;
case '-' :
{
return (x-y);
}break;
case '*' :
{
return (x*y);
}break;
case '/' :
{
return (x/y);
}break;

}

}
看看行不。。。。。
yyfyuyefei 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
你是不是要做计算器程序啊?呵呵,我以前发过一样的帖子!留个邮箱我发给你!
[/Quote]yuyefei7259672@yahoo.cn,大侠相助,不胜感激。
赵4老师 2012-08-23
  • 打赏
  • 举报
回复
仅供参考
/*---------------------------------------
函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数∧
用法:
如果要求2的32次幂,可以打入2^32<回车>
如果要求30度角的正切可键入tan(Pi/6)<回车>
注意不能打入:tan(30)<Enter>
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)<Enter>
sin 1.23 <Enter>
sin1.23 <Enter>
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter>
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2 实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5)
此外,本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
const char Tab=0x9;
const int DIGIT=1;
const int MAXLEN=16384;
char s[MAXLEN],*endss;
int pcs=15;
double fun(double x,char op[],int *iop) {
while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>
switch (op[*iop-1]) {
case 7: x=sin(x); (*iop)--;break;
case 8: x=cos(x); (*iop)--;break;
case 9: x=tan(x); (*iop)--;break;
case 10: x=sqrt(x); (*iop)--;break;
case 11: x=asin(x); (*iop)--;break;
case 12: x=acos(x); (*iop)--;break;
case 13: x=atan(x); (*iop)--;break;
case 14: x=log10(x);(*iop)--;break;
case 15: x=log(x); (*iop)--;break;
case 16: x=exp(x); (*iop)--;break;
}
return x;
}
double calc(char *expr,char **addr) {
static deep; //递归深度
static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};
double ST[10]={0.0}; //数字栈
char op[10]={'+'}; //运算符栈
char c,*rexp,*pp,*pf;
int ist=1,iop=1,last;
if (!deep) {
pp=pf=expr;
do {
c = *pp++;
if (c!=' '&& c!=Tab)
*pf++ = c;
} while (c!='\0');
}
pp=expr;
if ((c=*pp)=='-'||c=='+') {
op[0] = c;
pp++;
}
last = !DIGIT;
while ((c=*pp)!='\0') {
if (c=='(') {//左圆括弧
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp = *addr;
last = DIGIT;
if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
goto operate ;
}
}
else if (c==')') {//右圆括弧
pp++;
break;
} else if (isalpha(c)) {
if (!strnicmp(pp,"Pi",2)) {
if (last==DIGIT) {
cout<< "π左侧遇)" <<endl;exit(1);
}
ST[ist++]=3.14159265358979323846264338328;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp += 2;
last = DIGIT;
if (!strnicmp(pp,"Pi",2)) {
cout<< "两个π相连" <<endl;exit(2);
}
if (*pp=='(') {
cout<< "π右侧遇(" <<endl;exit(3);
}
} else {
for(int i=0; (pf=fname[i])!=NULL; i++)
if (!strnicmp(pp,pf,strlen(pf)))break;
if (pf!=NULL) {
op[iop++] = 07+i;
pp += strlen(pf);
} else {
cout<< "陌生函数名" <<endl;exit(4);
}
}
} else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {
char cc;
if (last != DIGIT) {
cout<< "运算符粘连" <<endl;exit(5);
}
pp++;
if (c=='+'||c=='-') {
do {
cc = op[--iop];
--ist;
switch (cc) {
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
} while (iop);
op[iop++] = c;
} else if (c=='*'||c=='/') {
operate: cc = op[iop-1];
if (cc=='+'||cc=='-') {
op[iop++] = c;
} else {
--ist;
op[iop-1] = c;
switch (cc) {
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
} else {
cc = op[iop-1];
if (cc=='^') {
cout<< "乘幂符连用" <<endl;exit(6);
}
op[iop++] = c;
}
last = !DIGIT;
} else {
if (last == DIGIT) {
cout<< "两数字粘连" <<endl;exit(7);
}
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if (pp == rexp) {
cout<< "非法字符" <<endl;exit(8);
}
pp = rexp;
last = DIGIT;
if (*pp == '('||isalpha(*pp)) {
op[iop++]='*';
last = !DIGIT;
c = op[--iop];
goto operate ;
}
}
}
*addr=pp;
if (iop>=ist) {
cout<< "表达式有误" <<endl;exit(9);
}
while (iop) {
--ist;
switch (op[--iop]) {
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
return ST[0];
}
int main(int argc,char **argv) {
if (argc<=1) {
if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页
cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;
while (1) {
cout << "请输入表达式:";
gets(s);
if (s[0]==0) break;//
cout << s <<"=";
cout << setprecision(15) << calc(s,&endss) << endl;
}
} else {
strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;
if (argc>=3) {
pcs=atoi(argv[2]);
if (pcs<0||15<pcs) pcs=15;
printf("%.*lf\n",pcs,calc(s,&endss));
} else {
printf("%.15lg\n",calc(s,&endss));
}
}
return 0;
}
icemornings 2012-08-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20111126/22/0326223e-6f51-4718-ad6b-0849ee5b5fac.html
Gloveing 2012-08-22
  • 打赏
  • 举报
回复
表达式从左向右求值(所有运算符的优先级都一样)
===============
这样的话,简单多了以+,—,*,\分隔字符串,剩下的就一个个的switch case语句了
ies_sweet 2012-08-22
  • 打赏
  • 举报
回复
这个问题思路上很简单
如果要代码……
那就比较不简单了
Xomic 2012-08-22
  • 打赏
  • 举报
回复
你是不是要做计算器程序啊?呵呵,我以前发过一样的帖子!留个邮箱我发给你!
图灵狗 2012-08-22
  • 打赏
  • 举报
回复
问题太大,而分数极少。
yyfyuyefei 2012-08-22
  • 打赏
  • 举报
回复
擦,没人会?
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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