zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    12款JavaScript表单插件
    10个强大的Javascript表单验证插件推荐
    memcached服务器搭建
    15 个非常吸引人的 jQuery 弹窗插件
    37个超级棒的 jQuery菜单插件
    nginx添加ssl证书认证
    27个jQuery网页拖放操作的插件
    memcached集群负载均衡
    python基础2
    ADO SQL数据库
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2712630.html
Copyright © 2011-2022 走看看