Evaluating Simple C Expressions UVA 327

來源:互聯網
上載者:User

標籤:acm   c   uva   原始碼   演算法   

說說:

這道題的題意就是求例如:a+b--+c++ 的值,其中a=1,b=2...依次類推。最後要求輸出整個運算式的值和每個在運算式中出現過的變數最後的值。思路其實比較簡單,先將整個運算式讀取,然後遍曆,遇到遍曆時停下,並判斷其是否有首碼++或--,並且找到該變數的運算子(如果有的話),接下來判斷是否有尾碼--或++,當然其間的空格是要忽略的。至於那些遍曆是用一個大小為26的數組儲存,沒有出現過則值為0,否則首碼或尾碼--則值為1,++則為2。最後遍曆一下數組,把結果輸出即可。總感覺這次代碼寫得好亂,嘿嘿~

原始碼:

#include <stdio.h>#include <string.h>#define MAX 110+5char 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 = %d\n",result);    for(i=0,c='a';i<26;i++,c++)      if(val[i]!=0){        if(val[i]==1)  printf("    %c = %d\n",c,i+1);else if(val[i]==2)  printf("    %c = %d\n",c,i);else   printf("    %c = %d\n",c,i+2);      }    } return 0;}


Evaluating Simple C Expressions UVA 327

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.