首页 > 代码库 > Evaluating Simple C Expressions UVA 327

Evaluating Simple C Expressions UVA 327

说说:

这道题的题意就是求例如:a+b--+c++ 的值,其中a=1,b=2...依次类推。最后要求输出整个表达式的值和每个在表达式中出现过的变量最后的值。思路其实比较简单,先将整个表达式读取,然后遍历,遇到遍历时停下,并判断其是否有前缀++或--,并且找到该变量的运算符(如果有的话),接下来判断是否有后缀--或++,当然其间的空格是要忽略的。至于那些遍历是用一个大小为26的数组保存,没有出现过则值为0,否则前缀或后缀--则值为1,++则为2。最后遍历一下数组,把结果输出即可。总感觉这次代码写得好乱,嘿嘿~

源代码:

#include <stdio.h>
#include <string.h>
#define MAX 110+5

char express[MAX],sign;//sign为变量的运算符

int prefix(int pos){//是否存在前缀
  char first,i;
  
  while(pos>=0&&express[pos]!='+'&&express[pos]!='-')
     if(express[pos]==' ')
       pos--;
     else{ 
       sign=0;
       return 0;
     }
  if(pos<0){//前面没有+或-
    sign=0;
    return 0;
  }

  first=express[pos];
  
  pos--;

  while(pos>=0&&express[pos]!=first)
    if(express[pos]==' ')
      pos--;
    else{
      sign=first;
      return 0;
    }

  if(pos<0){//不存在前缀
    sign=first;
    return 0;
  }

  pos--;//寻找变量的运算符
  while(pos>=0&&express[pos]!='+'&&express[pos]!='-')
    if(express[pos]==' ')
      pos--;
    else{
      sign=0;
      break;
    }

  if(pos<0)
    sign=0;
  else
    sign=express[pos];

  if(first=='+')//++返回2
    return 2;
  else
    return 1;//--返回1
}

int postfix(int pos){//求后缀的方式与前缀类似
  char first,i;

  while(pos<strlen(express)&&express[pos]!='+'&&express[pos]!='-')
    if(express[pos]==' ')
      pos++;
    else
      return 0;

  if(pos>=strlen(express))
    return 0;

  first=express[pos];

  pos++;

  while(pos<strlen(express)&&express[pos]!=first)
    if(express[pos]==' ')
      pos++;
    else
      return 0;

  if(pos>=strlen(express))
    return 0;
  else if(first=='+')
    return 2;
  else
    return 1;
}
int main(){
  int pos,result,i,r,add;
  char val[26],c;

  //freopen("data","r",stdin);
  while(gets(express)){
    pos=result=0;
    memset(val,0,sizeof(val));

    for(pos=0;pos<strlen(express);pos++)
     if(islower(express[pos])){
       val[express[pos]-'a']=1;
       add=express[pos]-'a'+1;//add为结果要添加的变量值

       if((r=prefix(pos-1))){
         if(r==1){
	  add--;
          val[express[pos]-'a']++;//--
	 }
	 else{
	  add++;
	  val[express[pos]-'a']+=2;//++
	 }
        }
       else if((r=postfix(pos+1))){
         if(r==1)
          val[express[pos]-'a']++;
	 else
	  val[express[pos]-'a']+=2;
       }

      if(sign=='-')
        result-=add;
      else 
        result+=add;
     }

    printf("Expression: %s\n",express);
    printf("    value = http://www.mamicode.com/%d/n",result);>

Evaluating Simple C Expressions UVA 327