回 帖 发 新 帖 刷新版面

主题:求救!!表达式求值的C程序怎么写啊??

小妹偶才疏学浅,
[em8]
我不会比较符号的优先级,
好心的哥哥姐姐弟弟妹妹大叔阿姨
帮帮我吧![em2]

回复列表 (共12个回复)

沙发

优先级          描述                       运算符              结合性
   1           分隔符                   [](). ,;            
   2       自增自减,逻辑非               ++ -- !              右到左
   3         算术乘除运算                  * / %               左到右
   4         算术加减运算                  +   -               左到右
   5           移位运算                  >> << >>>             左到右
   6         大小关系运算                < <= > >=             左到右
   7         相等关系运算                 ==  !=              左到右
   8          按位与运算                     &                 左到右
   9         按位异或运算                    ^                 左到右
  10            按位或                       |                 左到右
  11          逻辑与运算                     &&                左到右
  12          逻辑或运算                     ||                左到右
  13         三目条件运算                    ?:              左到右
  14           赋值运算                       =                右到左

板凳

恩,我跳啊跳
呵呵.
其实优先机查找下C教材都应该有的
上面也写了
上面也有写的
我只是想提醒句
*p.[5];

(*p).[5];
是两个不同的概念.

3 楼

偶的意思是在程序里怎么比较运算符的优先级啦
哪个我当然知道啊
我只是不会把它写到程序中去

4 楼

没看见那个表吗?
优先级高的当然比优先级低先算啊
比如说
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 楼

偶真的郁闷了
我知道你说的啊
我是说*比+优先级高
你在程序里要怎么说啊
我现在打个比方:
我要把现有的操作符和栈顶元素比较他们的优先级,
那我要怎么说啊
总不能说*>+吧

6 楼

同志们
做好了哦真是太高兴了[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 楼

在win-tc环境下还是不能运行 是为什么啊   该怎样啊

8 楼

兄弟,能不能用C语言写啊?

9 楼

优先级,从来不是我编程中的问题。

10 楼

My girl ,what do you want to say ?

我来回复

您尚未登录,请登录后再回复。点此登录或注册