uva 327 Evaluating Simple C Expressions

//难得的1Y,完全水过去,硬生生地把式子搞出来,代码写得很差,但是数据较小而且判断

//较多所以省去不少时间

 

#include <stdio.h>

#include <string.h>

#include <algorithm>

#define MAX 150

using namespace std;

char string[150],temp[150];

struct elemt

{

    char ch;

    int data;

    int flag;

}a[MAX];  //flag=0表示这个元素在运算结束之后不需要变化,1表示运算后加1,-1表示运算后减1,所以同意+flag即可

int cmp(struct elemt a , struct elemt b)

{

    return a.ch<b.ch;

}

int main()

{

    int i,j,len,value;  char ch;

    while(1)

    {

        for(i=j=0;1;i++)

        {

            if( (ch=getchar())==EOF )  return 0;

            if( ch=='\n')  break;

            temp[i]=ch;

            if(ch==' ') continue;

            else        string[j++]=ch;

        }

        temp[i]='\0'; string[j]='\0';

        printf("Expression: %s\n",temp); // printf("%s\n",string);

        

        len=strlen(string);

        for(j=0,i=0; j<len; )

        {

            if(string[j]==' ') {j++; continue;}



            if(string[j]>='a'  && string[j]<='z')

            {

                if(j+2<len)

                {

                    if( string[j+1]=='+' && string[j+2]=='+')

                    {  a[i].ch=string[j]; a[i].data=a[i].ch-'a'+1; a[i].flag=1;  i++; j+=3;  }

                    else if(string[j+1]=='-' && string[j+2]=='-')

                    {  a[i].ch=string[j]; a[i].data=a[i].ch-'a'+1; a[i].flag=-1; i++; j+=3;  }

                    else if( (string[j+1]=='+' || string[j+1]=='-') && (string[j+2]=='+' || string[j+2]=='-') )

                    { a[i].ch=string[j]; a[i].data=a[i].ch-'a'+1; a[i].flag=0; i++; a[i].ch=string[j+1]; 

a[i].data=0; a[i].flag=0; i++; j+=2; }

                    else  // 字母,符号,字母

                    { a[i].ch=string[j];    a[i].data=a[i].ch-'a'+1; a[i].flag=0; i++; a[i].ch=string[j+1]; 

 a[i].data=0; a[i].flag=0; i++;j+=2; }

                }

                else  //倒数第一或者倒数第二个字母;或倒数第一则好帮,若是倒数第2,其实是不可能的,因为当前的是字母

                {a[i].ch=string[j]; a[i].data=a[i].ch-'a'+1; a[i].flag=0; i++; j++;} 

            }

            else  //当前的的是符号

            {

                if(j+2<len)  //后面还有足够的位置

                {

                    if(string[j]=='+' && string[j+1]=='+' && string[j+2]>='a' && string[j+2]<='z')

                    { a[i].ch=string[j+2]; a[i].data=a[i].ch-'a'+1+1; a[i].flag=0; i++; j+=3; }

                    else if(string[j]=='-' && string[j+1]=='-' && string[j+2]>='a' && string[j+2]<='z')

                    { a[i].ch=string[j+2]; a[i].data=a[i].ch-'a'+1-1; a[i].flag=0; i++; j+=3; }

                    else if( (string[j]=='+' || string[j]=='-') && (string[j+1]=='+' || string[j+1]=='-') && 

(string[j+2]=='+' || string[j+2]=='-'))

                    { a[i].ch=string[j]; a[i].data=0; a[i].flag=0; i++; j++; }

                    else if( (string[j]=='+' || string[j]=='-' ) && (string[j+1]=='+' || string[j+1]=='-') && 

string[j+2]>='a' && string[j+2]<='z') 

                    //当前的和后面一位都是符号但是不同

                    {a[i].ch=string[i]; a[i].data=0; a[i].flag=0; i++; j++;}

                    else if( (string[j]=='+' || string[j]=='-' ) && string[j+1]>='a' && string[j+1]<='z')

                    {a[i].ch=string[j]; a[i].data=0; a[i].flag=0; i++;  j++; }

                }

                else  //倒数第1位或者倒数第二位,倒数第一位是不可能的

                {a[i].ch=string[j]; a[i].data=0; a[i].flag=0; i++; j++;}

            }

        }

        len=i;

//        for(len=i,i=0; i<len; i++) printf("%c",a[i].ch);  printf("\n");

//        for(len=i,i=0; i<len; i++) printf("%c  %d  %d\n",a[i].ch , a[i].data , a[i].flag);

        for(value=a[0].data,i=1; i<len; )

        {

            if(a[i].ch=='+') value=value+a[i+1].data;

            else             value=value-a[i+1].data;

            i+=2;

        }

        printf("    value = %d\n",value);

        sort(a , a+len , cmp); 

        for(i=0; i<len; i++) if(a[i].ch>='a' && a[i].ch<='z')  break;

        for(; i<len; i++)

            printf("    %c = %d\n",a[i].ch , a[i].data+a[i].flag);

    }

    return 0;

}

你可能感兴趣的:(express)