| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 785 人关注过本帖
标题:[求助]谁能帮我解决一下哦,就拜托啦!~
只看楼主 加入收藏
蓝色冰激凌
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-6-13
收藏
 问题点数:0 回复次数:1 
[求助]谁能帮我解决一下哦,就拜托啦!~
表达式求值 [问题描述]在屏幕上输入一个正确的数字表达式,求表达式的值。 [具体要求](1)表达式中包括数学运算符+,-,/,(,)等符号 (2)用栈来存放表达式中的运算符和运算对象 (3)将中缀表达式转换成后缀表达式 (4)最后求出表达式的值 大不了,我把偶的全部家当全给你好了,帮我做一下啦,一下下就好了啊! oad=jpg]UploadFile/2005-6/20056131065870.jpg[/upload]

[此贴子已经被作者于2005-6-13 10:34:13编辑过]



CsHcNESH.jpg (26.49 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 数学 运算符 表达 屏幕 
2005-06-13 10:08
seeker
Rank: 1
等 级:新手上路
帖 子:172
专家分:0
注 册:2005-6-5
收藏
得分:0 

#include <stdio.h> #define LEN 127 char pre_process(char *str); /* 表达式预处理,查找语法错误 */ float str_process(char *str); /* 处理字符串表达式 */ void calculator(float *value); /* 根据处理结果,进行四则运算 */ unsigned short value_cal(unsigned short val, char ch); /* 利用堆栈,处理数与运算符 */ void value_process(float value[], char ch, unsigned short val); /* 计算数 */ void main() { char str[LEN]; /* 存放表达式字符 */ while(1) { printf("\n输入表达式,如 23*(2+8)再按回车:"); scanf("%s", str); if(str[0] =='=') break; switch(pre_process(str)) /* 字符串预处理 */ { case 0 : printf("%s = %f\n", str, str_process(str)); break; case 1 : printf("\n语法错误!"); break; case 2 : printf("\n非法字符!"); break; default : printf("\nAbsencing bracket!"); } } }

char pre_process(char *str) { char flag = 0; /* 表达式预处理状态变量 */ char ch1 = ',', ch; /* 存放当前和之前相邻字符 */ char str_loop = -1; /* 字符串下标变量 */ unsigned char bracket_delta = 0; /* 值为0表示左右括号配对,正数表示左括号多,负数表示左括号少 */ do{ switch(ch = str[++str_loop]) { case '(' : bracket_delta++; /* 左括号个数加1 */ if(ch1 == ')' || ch1 == '0') flag = 1; /* )( 和 )0是非法组合 */ break; case ')' : bracket_delta--; /* 左括号个数减1 */ if(ch1 != ')' && ch1 != '0') flag = 1; /* )) 和 1)才不是非法组合 */ break; case '+' : case '-' : case '*' : case '/' : case 0 : if(ch1 != ')' && ch1 != '0') flag = 1; /* 组合情况同) */ break; default : if(ch >= '0' && ch <= '9') { if(ch1 == ')') flag = 1; /* 只有)0才是非法组合 */ } else flag = 2; /* 出现非法字符 */ } ch1 = (ch >= '0' && ch <= '9') ? '0' : ch; /* 用0表示所有数字 */ }while(!flag && ch); if(bracket_delta) flag = 3; /* 左右括号不配对 */ return flag; }

float str_process(char *str) { char ch; unsigned short val=0; /* 抽取表达式中数值的初值 */ char str_loop = -1; /* 表达式字符串的下标指针 */ float value[LEN]; /* 存放抽取出的表达式单元 */ do{ ch = str[++str_loop]; /* 获取表达式中的某个元素值 */ switch(ch) { case 0 : ch = ','; /* 用,表示结尾0 */ case '(' : case ')' : case '+' : case '-' : case '*' : case '/' : value_process(value, ch, val); /* 处理运算符和待计算数 */ val = 0; /* 待计算数清0 */ break; default : val = value_cal(val, ch); /* 处理待计算数 */ } }while(ch != ','); calculator(value); /* 计算表达式 */ return value[0]; /* 计算结果存于value[0]中 */ }

void calculator(float *value) { char loop = -1, col = -1; while(value[++loop] != -3) /* -3表示计算结束 */ { if(value[loop] > 0) /* 正数是待计算数 */ value[++col] = value[loop]; else { char ch = ')'-(char) value[loop]; /* 负数是运算符 */ col--; switch(ch) { case '+' : value[col] += value[col+1]; /* 前后相邻数进行正确运算 */ break; case '-' : value[col] -= value[col+1]; break; case '*' : value[col] *= value[col+1]; break; default : value[col] /= value[col+1]; } } } }

void value_process(float value[], char ch, unsigned short val) { static char value_loop = -1; /* 存放运算数和运算符的数组下标 */ static char stack[LEN], stack_loop = -1; /* 存放运算符的堆栈,及其栈下标 */ char level[8]={0,0,2,1,0,1,0,2}; /* ( ) * + , - . / 的运算优先级 */ if(val) value[++value_loop] = (float) val; /* 保存待计算数 */ if(ch == ')') { while(stack[stack_loop] != '(') /* 遇到),则运算符始终出栈直至遇到( */ value[++value_loop] = (float) (')'-stack[stack_loop--]); /* 负数表示是运算符 */ --stack_loop; /* 跳过( */ } else { /* ( 直接压入堆栈中 */ if(ch != '(') { /* 根据运算符优先级来决定是否出栈 */ while(stack_loop >= 0 && level[ch-'('] <= level[stack[stack_loop]-'(']) value[++value_loop] = (float) (')'-stack[stack_loop--]); } if(ch != ',') stack[++stack_loop] = ch; /* 将有效运算符压入堆栈之中 */ else { value[++value_loop] = -3; /* 用-3表示结束 */ value_loop = -1; /* 鉴于静态局部变量初值只赋一次,因此须确保value_loop和stack_loop值为-1,否则处理其他表达式时将出错 */ } } }

unsigned short value_cal(unsigned short val, char ch) { val *= 10; /* 12 = 1*10+2 */ val += ch-'0'; return val; }


我相信总有一片天空属于我!http://myseeker. E-Mail:lwqcny@
2005-06-13 21:39
快速回复:[求助]谁能帮我解决一下哦,就拜托啦!~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025461 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved