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; }