主题:求救!!表达式求值的C程序怎么写啊??
月牙上的精灵
[专家分:130] 发布于 2005-06-19 22:57:00
小妹偶才疏学浅,
[em8]
我不会比较符号的优先级,
好心的哥哥姐姐弟弟妹妹大叔阿姨
帮帮我吧![em2]
回复列表 (共12个回复)
沙发
panda07 [专家分:50] 发布于 2005-06-20 23:39:00
优先级 描述 运算符 结合性
1 分隔符 [](). ,;
2 自增自减,逻辑非 ++ -- ! 右到左
3 算术乘除运算 * / % 左到右
4 算术加减运算 + - 左到右
5 移位运算 >> << >>> 左到右
6 大小关系运算 < <= > >= 左到右
7 相等关系运算 == != 左到右
8 按位与运算 & 左到右
9 按位异或运算 ^ 左到右
10 按位或 | 左到右
11 逻辑与运算 && 左到右
12 逻辑或运算 || 左到右
13 三目条件运算 ?: 左到右
14 赋值运算 = 右到左
板凳
liyu355 [专家分:980] 发布于 2005-06-20 23:50:00
恩,我跳啊跳
呵呵.
其实优先机查找下C教材都应该有的
上面也写了
上面也有写的
我只是想提醒句
*p.[5];
和
(*p).[5];
是两个不同的概念.
3 楼
月牙上的精灵 [专家分:130] 发布于 2005-06-20 23:54:00
偶的意思是在程序里怎么比较运算符的优先级啦
哪个我当然知道啊
我只是不会把它写到程序中去
4 楼
liyu355 [专家分:980] 发布于 2005-06-21 17:44:00
没看见那个表吗?
优先级高的当然比优先级低先算啊
比如说
1*2+(3+4)
我们知道他的结果为9是吧~?
因为他是先算括号里的,然后在算*啊
因为()的优先级别比*高啊
在比如
1+2/3*!4&&!0||9
这个呢?
当然,先算!4,然后!0,然后2/3然后2/3的结果* !4的结果.在然后1+2/3!4
在然后就是算&&,最后算||
知道了不?
在不知道就加我QQ我们接着聊
18408994
验证的时候记得告诉我你是谁哦~
5 楼
月牙上的精灵 [专家分:130] 发布于 2005-06-22 18:20:00
偶真的郁闷了
我知道你说的啊
我是说*比+优先级高
你在程序里要怎么说啊
我现在打个比方:
我要把现有的操作符和栈顶元素比较他们的优先级,
那我要怎么说啊
总不能说*>+吧
6 楼
月牙上的精灵 [专家分:130] 发布于 2005-06-24 13:55:00
同志们
做好了哦真是太高兴了[em2]
你们可以参考
#include<fstream.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define N 50
typedef struct //定义结构体 数字栈
{
int top;
double array[N];
}NumStack;
typedef struct //定义结构体 运算符栈
{
int top;
char array[N];
}OpStack;
int Cint(char mychar) //把字符转换为相应的整数的函数
{
return (mychar-48);
}
void PushNum(NumStack *numstack,double num) //数字进栈函数
{
numstack->top++;
numstack->array[numstack->top-1]=num;
}
void PopNum(NumStack *numstack,double *num) //数字出栈函数
{
*num=numstack->array[numstack->top-1];
numstack->top--;
}
void PushOp(OpStack *opstack,char op) //运算符进栈函数
{
opstack->top++;
opstack->array[opstack->top-1]=op;
}
void PopOp(OpStack *opstack,char *op) //运算符出栈函数
{
*op=opstack->array[opstack->top-1];
opstack->top--;
}
double Calc(double a,double b,char c) //进行运算的函数
{
double result;
switch(c){
case '+':
result=a+b;break;
case '-':
result=a-b;break;
case '*':
result=a*b;break;
case '/':
result=a/b;break;
}
return result;
}
char Priority(char y,char x) //判断优先级的函数
{
char priority='<';
switch(x){
case '+':
case '-':
if(y=='(' || y=='#') priority='>';
break;
case '*':
case '/':
if(y=='(' || y=='#'|| y=='+' || y=='-')priority='>';
break;
case '(':
priority='>';
break;
case ')':
if(y=='(')priority='=';
break;
case '#':
if(y=='#')priority='=';
break;
default:
priority='E';
}
return priority;
}
void Process(NumStack *numstack,OpStack *opstack,char x) //处理表达式的主体函数
{
double a,b;
char c;
static double tempnum=0.00000000;
static int len=10;
static int dot=0,flags=0;
if(isdigit(x) || x=='.') //isdigt 来判断X是不是数字 dot=1来处理小数点后面的数
{
if(x=='.')dot=1;
else
{
if(dot==0)
tempnum=tempnum*10+Cint(x); //处理输入的整数部分
else
{
tempnum=tempnum+(double)Cint(x)/len;//加上后面的小数部分
len*=10;
}
}
}
else
{
if(flags==0 && x!='(')
{
PushNum(numstack,tempnum);
tempnum=0.00000000;
len=10;dot=0;
}
switch(Priority(opstack->array[opstack->top-1],x)) //判断操作符的优先级
{
case '>':
PushOp(opstack,x);
flags=0;break;
case '<':
PopOp(opstack,&c); //先把优先级高的操作符出栈
PopNum(numstack,&b); //运算的2个操作数出栈
PopNum(numstack,&a);
PushNum(numstack,Calc(a,b,c)); //calc(a,b,c)运算出来的2个操作数,把结果入栈
flags=1;
Process(numstack,opstack,x);break; //通过递归调用
case '=':
PopOp(opstack,&c);
flags=1;break;
default:
cout<<"Wrong Express!"<<endl;
}
}
}
fstream infile;//表达式要求从文本输入 以"#"结束
void main()
{ //主函数
NumStack numstack;
OpStack opstack;
char s[N];int i=0;
numstack.top=0;
opstack.top=0;
PushOp(&opstack,'#');
cout<<endl;
infile.open("data1.txt",ios::in);
if(!infile)
{
cout<<"data.txt can't open."<<endl;
abort();
}
infile>>s;//从文本输入的表达式
for(i=0;i<strlen(s)&&s[i]!='#';i++)
cout<<s[i];
for(i=0;i<strlen(s);i++)
Process(&numstack,&opstack,s[i]);
cout<<"="<<numstack.array[numstack.top-1]<<endl;
infile.close();
}
7 楼
glfei [专家分:0] 发布于 2006-01-15 19:21:00
在win-tc环境下还是不能运行 是为什么啊 该怎样啊
8 楼
doudoufei405 [专家分:0] 发布于 2006-06-28 21:41:00
兄弟,能不能用C语言写啊?
9 楼
lingdlz [专家分:610] 发布于 2006-06-29 11:43:00
优先级,从来不是我编程中的问题。
10 楼
lingdlz [专家分:610] 发布于 2006-06-29 11:44:00
My girl ,what do you want to say ?
我来回复