uva 327 - Evaluating Simple C Expressions

来源:互联网 发布:20人企业网络解决方案 编辑:程序博客网 时间:2024/04/30 09:43

模拟。这个不知道。。

a,b,……到z 依次为1到26,然后给你一表达式 前置++和前置-- 都先运算, 后置++和后置--都后运算,然后判断表达式的值。和最后各个字母的值

作法比较奇怪。。

先把表达式中的空格和回车全部去掉,弄成一没有间隔的表达式

用一个数组存储各个字母的改变量。最后输出字母再运算。

然后将后置++ 变成 +0。。把 前置++变成+1.。

把后置-- 变成-0。把前置--变成 比如 --a 变成a-1,不过注意这时候如果前面是-号 ,则-1要变成+1;

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=200;char a[MAXN],b[MAXN];bool vis[MAXN];int val[MAXN],temp[MAXN];bool limit(int ok,char a[]){            //判断是否为字母。    if(ok<0) return false;    if(a[ok]<='z' && a[ok]>='a') return true;    else return false;}int main(){    //freopen("in.txt","r",stdin);    while(gets(a)){        memset(b,0,sizeof(b));        memset(vis,false,sizeof(vis));        memset(val,0,sizeof(val));        memset(temp,0,sizeof(temp));        int la=strlen(a),m=0;        for(int i=0;i<la;i++){            if(a[i]==' ') continue;            else b[m++]=a[i];            if(a[i]<='z' && a[i]>='a'){vis[a[i]]=true; val[a[i]]=a[i]-'a'+1;}        }        b[m]='\0';        int lb=strlen(b);        char *p=b;        while(1){            char *t=strstr(p,"++");            if(t==NULL) break;            int ok=t-b;            if(limit(ok-1,b)) {b[ok+1]='0';temp[b[ok-1]]=1;}            if(limit(ok+2,b)){                b[ok]='1';temp[b[ok+2]]=1;                if(ok-1>=0 && b[ok-1]=='-') b[ok+1]='-';                }            p = t;        }        p=b;        while(1){            char *t=strstr(p,"--");            if(t==NULL) break;            int ok=t-b;            if(limit(ok-1,b)) {b[ok+1]='0';temp[b[ok-1]]=-1;}            if(limit(ok+2,b)){                b[ok]='1';temp[b[ok+2]]=-1;                swap(b[ok],b[ok+2]);                if(ok-1>=0 && b[ok-1]=='-') b[ok+1]='+';         //注意这个地方                }            p = t;        }        if(b[0]=='1') b[0]='1'-'0';        else b[0]=val[b[0]];        int value=b[0];        for(int i=1;i<lb;i+=2){            if(b[i]=='+'){                if(b[i+1]=='1') value+=1;                else value+=val[b[i+1]];            }            else{                if(b[i+1]=='1') value-=1;                else value-=val[b[i+1]];            }        }        printf("Expression: %s\n",a);        printf("    value = %d\n",value);        for(char i='a';i<='z';i++) if(vis[i]) printf("    %c = %d\n",i,val[i]+temp[i]);    }    return 0;}


 

0 0
原创粉丝点击