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;
}
posted @ 2012-10-05 22:50  Titanium  阅读(272)  评论(0编辑  收藏  举报