您的位置:首页 > 编程语言 > Lua

uva 327 Evaluating Simple C Expressions

2012-10-05 22:50 507 查看
//难得的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: